Skip to main content

Dynamic fixture creation for your tests

Project description

python-fixturify-project

Build status Python Version Dependencies Status

Code style: black Security: bandit Pre-commit Semantic Versions License Coverage Report

Dynamic fixture creation for your tests

A Python port of node-fixturify-project

Installation

pip install -U python-fixturify-project

or install with Poetry

poetry add python-fixturify-project --dev

Usage

python-fixturify-project is a Python package that provides a way to create dynamic fixtures for your tests. Fixtures are real directories and files, written to a temporary directory.

from python_fixturify_project import Project

dir_json = {
    "valid_file.txt": "some text",
    "nested_dir": {
        "valid_empty_file.txt": "",
        "another_nested_empty_dir": {},
        "another_nested_dir": {
            "last_nested_empty_dir": {},
            "final_text_file.txt": "some text",
        },
    },
}

# create a new project with the given directory structure
project = Project(files=dir_json)
# add new files to the project, merging with the existing directory structure
p.write({
    "new_file.txt": "some text"
})

# read the actual contents on disc
actual_dir_json = p.read()

Ignore Files

By default, the read() function will ignore all hidden files and directories in your Project file structure. This can be overridden by using the ignore_patterns constructor argument, which takes a list of glob pattern strings. Any patterns provided to the ignore_patterns argument will be used in an exclusive manner. For example:

files = {
    ".git": {
        "a_nested_dir": {}
    },
    ".github": {
        "ignore_me": {},
        "do_not_ignore_me": {
            "a_file": "some text"
        }
    },
    "ignore_me": "some text",
    "do_not_ignore_me": "some text",
}

# Default ignore_patterns is ["**/.git", "**/.git/**"]
project = Project(ignore_patterns=["**/.git", "**/.git/**", "**/ignore_me"])

project.write(files)

assert project.read() == {
    '.github': {
        'do_not_ignore_me': {
            'a_file': 'some text',
        },
    },
    'do_not_ignore_me': 'some text',
}

Recommended Usage Patterns

python-fixutrify-project becomes even more useful when combining it with tools like pytest and something like syrupy, which uses jest-like snapshots for testing. The example below combines python-fixturify-project with pytest's fixtures, and syrupy to create a snapshot test.

First, we define a fixture to setup and teardown our Project instance:

# conftest.py
import pytest

from python_fixturify_project import Project


@pytest.fixture
def project():
    project = Project()

    yield project

    project.dispose()

This fixture uses pytest's yield fixture pattern, which allows us to run some code after the test has completed. In this case, we use the dispose() method to remove the temporary directory created by python-fixturify-project.

from python_fixturify_project import Project


def test_mutating_project(project, snapshot):
    project.write({
        "a_file.txt": "some text",
        "a_dir": {
            "another_file.txt": "some text",
        },
        "path": {
            "to": {
                "a_file.py": "# some python code",
            },
        },
    })

    mutate_files_for_some_reason(p.base_dir)

    # ensure mutations were as expected
    assert project.files == snapshot

Or you can use the project.get method to get the path to a file in the project.

from python_fixturify_project import Project

def test_mutating_project(snapshot):
    project.write({
        "a_file.txt": "some text",
        "a_dir": {
            "another_file.txt": "some text",
        },
        "path": {
            "to": {
                "a_file.py": "# some python code",
            },
        },
    })

    mutate_files_for_some_reason(p.base_dir)

    # ensure mutations were as  for single file
    assert project.get('path/to/a_file.py') == snapshot(name='path/to/a_file.py')

Skip Dispose (for debugging)

If you want to skip the dispose() call, you can set the FIXTURIFY_SKIP_DISPOSE environment variable to 1.

FIXTURIFY_SKIP_DISPOSE=1 pytest

This can be useful if you want to inspect the contents of the temporary directory after the test has completed.

🛡 License

License

This project is licensed under the terms of the MIT license. See LICENSE for more details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python_fixturify_project-1.0.0.tar.gz (8.7 kB view details)

Uploaded Source

Built Distribution

python_fixturify_project-1.0.0-py3-none-any.whl (7.8 kB view details)

Uploaded Python 3

File details

Details for the file python_fixturify_project-1.0.0.tar.gz.

File metadata

  • Download URL: python_fixturify_project-1.0.0.tar.gz
  • Upload date:
  • Size: 8.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.3.1 CPython/3.11.0 Darwin/22.2.0

File hashes

Hashes for python_fixturify_project-1.0.0.tar.gz
Algorithm Hash digest
SHA256 9898a4316957e269ba7666f221bf248b0b096a24f4b2d23a4ba4dd2f7d181406
MD5 f6967b94752435bbf8d0b375d2928865
BLAKE2b-256 3df73cbe8027728d43e3f3dd952eab9b5c24160fc648a2df02dbb68589542148

See more details on using hashes here.

File details

Details for the file python_fixturify_project-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for python_fixturify_project-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 204475d118c3ebe970f996b058224f471f2af6947915ba89b253298d4e0bcc9f
MD5 deca26b4b96d80e9ef01b14a0cbdaf1a
BLAKE2b-256 571c9b7bc1c968d73de9c4ab69af847c348b19d38b90e4d350e1408e85dd70b2

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page