├── tests ├── __init__.py ├── entity.py ├── test_injection_from_signature.py ├── conftest.py ├── tests.py └── test_deadfixtures_support.py ├── pytest_lazy_fixtures ├── py.typed ├── __init__.py ├── fixture_collector.py ├── lazy_fixture.py ├── plugin.py ├── loader.py ├── normalizer.py ├── utils.py └── lazy_fixture_callable.py ├── .github ├── dependabot.yml └── workflows │ ├── ci-release.yml │ └── ci-test.yml ├── LICENSE ├── .pre-commit-config.yaml ├── pyproject.toml ├── Taskfile.yml ├── .gitignore ├── README.md └── uv.lock /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pytest_lazy_fixtures/py.typed: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pytest_lazy_fixtures/__init__.py: -------------------------------------------------------------------------------- 1 | from .lazy_fixture import lf 2 | from .lazy_fixture_callable import lfc 3 | 4 | __all__ = ("lf", "lfc") 5 | -------------------------------------------------------------------------------- /tests/entity.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass 2 | from typing import NamedTuple 3 | 4 | 5 | @dataclass 6 | class Entity: 7 | value: int 8 | 9 | def sum(self, value: int) -> int: 10 | return self.value + value 11 | 12 | 13 | class DataNamedTuple(NamedTuple): 14 | a: int 15 | b: int 16 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # Keep GitHub Actions up to date with GitHub's Dependabot... 2 | # https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot 3 | # https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem 4 | version: 2 5 | updates: 6 | - package-ecosystem: github-actions 7 | directory: / 8 | groups: 9 | github-actions: 10 | patterns: 11 | - "*" # Group all Actions updates into a single larger pull request 12 | schedule: 13 | interval: weekly 14 | -------------------------------------------------------------------------------- /.github/workflows/ci-release.yml: -------------------------------------------------------------------------------- 1 | name: Publish Python Package 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | permissions: 8 | contents: read 9 | 10 | jobs: 11 | publish-package: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v5 16 | - name: Set up Python 17 | uses: actions/setup-python@v6 18 | - name: Install uv 19 | uses: astral-sh/setup-uv@v7 20 | with: 21 | version: "0.7.13" 22 | - name: Install Task 23 | uses: arduino/setup-task@v2 24 | with: 25 | version: 3.44.0 26 | - name: Build and Publish package 27 | run: | 28 | task \ 29 | PACKAGE_VERSION=${{ github.event.release.tag_name }} \ 30 | PUBLISH_USERNAME=__token__ \ 31 | PUBLISH_PASSWORD=${{ secrets.PYPI_API_TOKEN }} \ 32 | publish 33 | -------------------------------------------------------------------------------- /pytest_lazy_fixtures/fixture_collector.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | import pytest 4 | 5 | from .utils import get_fixturenames_closure_and_arg2fixturedefs 6 | 7 | 8 | def collect_fixtures(config: pytest.Config, items: list[pytest.Item]): 9 | fm = config.pluginmanager.get_plugin("funcmanage") 10 | func_items = [i for i in items if isinstance(i, pytest.Function)] 11 | for item in func_items: 12 | for marker in item.own_markers: 13 | if marker.name != "parametrize": 14 | continue 15 | params = marker.args[1] if len(marker.args) > 1 else marker.kwargs["argvalues"] 16 | arg2fixturedefs = {} 17 | for param in params: 18 | _, _arg2fixturedefs = get_fixturenames_closure_and_arg2fixturedefs(fm, item.parent, param) 19 | arg2fixturedefs.update(_arg2fixturedefs) 20 | item._fixtureinfo.name2fixturedefs.update(arg2fixturedefs) 21 | -------------------------------------------------------------------------------- /pytest_lazy_fixtures/lazy_fixture.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from dataclasses import dataclass 4 | from operator import attrgetter 5 | from typing import TYPE_CHECKING 6 | 7 | if TYPE_CHECKING: 8 | import pytest 9 | 10 | 11 | @dataclass 12 | class LazyFixtureWrapper: 13 | name: str 14 | 15 | @property 16 | def fixture_name(self) -> str: 17 | return self.name.split(".", maxsplit=1)[0] 18 | 19 | def _get_attr(self, fixture) -> str | None: 20 | splitted = self.name.split(".", maxsplit=1) 21 | if len(splitted) == 1: 22 | return fixture 23 | return attrgetter(splitted[1])(fixture) 24 | 25 | def __repr__(self) -> str: 26 | return self.name 27 | 28 | def load_fixture(self, request: pytest.FixtureRequest): 29 | return self._get_attr(request.getfixturevalue(self.fixture_name)) 30 | 31 | def __hash__(self) -> int: 32 | return hash(self.name) 33 | 34 | 35 | def lf(name: str) -> LazyFixtureWrapper: 36 | """lf is a lazy fixture.""" 37 | return LazyFixtureWrapper(name) 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Anton Petrov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | # See https://pre-commit.com for more information 2 | # See https://pre-commit.com/hooks.html for more hooks 3 | repos: 4 | - repo: https://github.com/pre-commit/pre-commit-hooks 5 | rev: v4.0.1 6 | hooks: 7 | - id: trailing-whitespace 8 | - id: end-of-file-fixer 9 | - id: check-yaml 10 | - id: check-added-large-files 11 | args: ["--maxkb=1024"] 12 | - repo: local 13 | hooks: 14 | - id: ruff-lint 15 | name: ruff-lint 16 | entry: task ruff-lint 17 | language: system 18 | pass_filenames: false 19 | types: 20 | - python 21 | - id: ruff-format 22 | name: ruff-format 23 | entry: task ruff-format 24 | language: system 25 | pass_filenames: false 26 | types: 27 | - python 28 | - id: mypy 29 | name: mypy 30 | entry: task mypy 31 | language: system 32 | pass_filenames: false 33 | types: 34 | - python 35 | - id: deptry 36 | name: deptry 37 | entry: task deptry 38 | language: system 39 | pass_filenames: false 40 | types: 41 | - python 42 | -------------------------------------------------------------------------------- /pytest_lazy_fixtures/plugin.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | import pytest 4 | 5 | from .fixture_collector import collect_fixtures 6 | from .lazy_fixture import LazyFixtureWrapper 7 | from .loader import LazyFixtureLoader 8 | from .normalizer import normalize_metafunc_calls 9 | 10 | 11 | @pytest.hookimpl(tryfirst=True) 12 | def pytest_fixture_setup(fixturedef: pytest.FixtureDef, request: pytest.FixtureRequest): # noqa: ARG001 13 | val = getattr(request, "param", None) 14 | if val is not None: 15 | request.param = LazyFixtureLoader(request).load_lazy_fixtures(val) 16 | 17 | 18 | def pytest_make_parametrize_id(config: pytest.Config, val, argname): # noqa: ARG001 19 | if isinstance(val, LazyFixtureWrapper): 20 | return val.name 21 | return None 22 | 23 | 24 | @pytest.hookimpl(hookwrapper=True) 25 | def pytest_generate_tests(metafunc: pytest.Metafunc): 26 | yield 27 | 28 | normalize_metafunc_calls(metafunc) 29 | 30 | 31 | def pytest_collection_modifyitems(session: pytest.Session, config: pytest.Config, items: list[pytest.Item]): # noqa: ARG001 32 | if not getattr(config.option, "deadfixtures", False): 33 | return 34 | collect_fixtures(config, items) 35 | -------------------------------------------------------------------------------- /tests/test_injection_from_signature.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from pytest_lazy_fixtures import lf, lfc 4 | 5 | 6 | @pytest.mark.parametrize("foo", [lfc(lambda one: str(one))]) 7 | def test_inject_from_signature_simple(foo): 8 | assert foo == "1" 9 | 10 | 11 | @pytest.mark.parametrize( 12 | "foo", 13 | [ 14 | lfc(lambda one: str(one), lf("two")), 15 | lfc(lambda one: str(one), one=lf("two")), 16 | ], 17 | ) 18 | def test_inject_from_signature_override(foo): 19 | assert foo == "2" 20 | 21 | 22 | @pytest.mark.parametrize( 23 | "foo", 24 | [ 25 | lfc(lambda one, two: [str(one), str(two)], two=lf("three")), 26 | ], 27 | ) 28 | def test_inject_first_param_implicit_second_explicit(foo): 29 | assert foo == ["1", "3"] 30 | 31 | 32 | @pytest.mark.parametrize( 33 | "foo", 34 | [ 35 | lfc(lambda one, two: [str(one), str(two)], lf("three")), 36 | lfc(lambda one, two: [str(one), str(two)], one=lf("three")), 37 | ], 38 | ) 39 | def test_inject_first_param_explicit_second_implicit(foo): 40 | assert foo == ["3", "2"] 41 | 42 | 43 | @pytest.mark.parametrize("foo", [lfc(lambda one=42: str(one))]) 44 | def test_defaults_prevent_implicit_injection(foo): 45 | assert foo == "42" 46 | -------------------------------------------------------------------------------- /pytest_lazy_fixtures/loader.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from .lazy_fixture import LazyFixtureWrapper 4 | from .lazy_fixture_callable import LazyFixtureCallableWrapper 5 | 6 | 7 | class LazyFixtureLoader: 8 | def __init__(self, request: pytest.FixtureRequest): 9 | self.request = request 10 | self.lazy_fixture_loaded = False 11 | 12 | def load_lazy_fixtures(self, value): 13 | if isinstance(value, LazyFixtureCallableWrapper): 14 | self.lazy_fixture_loaded = True 15 | return value.get_func(self.request)( 16 | *self.load_lazy_fixtures(value.args), 17 | **self.load_lazy_fixtures(value.kwargs), 18 | ) 19 | if isinstance(value, LazyFixtureWrapper): 20 | self.lazy_fixture_loaded = True 21 | return value.load_fixture(self.request) 22 | if type(value) is dict: 23 | new_value = {self.load_lazy_fixtures(key): self.load_lazy_fixtures(val) for key, val in value.items()} 24 | return new_value if self.lazy_fixture_loaded else value 25 | if type(value) in (list, set, tuple): 26 | new_value = type(value)(self.load_lazy_fixtures(val) for val in value) 27 | return new_value if self.lazy_fixture_loaded else value 28 | return value 29 | -------------------------------------------------------------------------------- /tests/conftest.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from pytest_lazy_fixtures import lf 4 | from tests.entity import Entity 5 | 6 | pytest_plugins = ("pytest_lazy_fixtures.plugin", "pytester") 7 | 8 | 9 | @pytest.fixture 10 | def one(): 11 | return 1 12 | 13 | 14 | @pytest.fixture 15 | def two(): 16 | return 2 17 | 18 | 19 | @pytest.fixture 20 | def three(): 21 | return 3 22 | 23 | 24 | @pytest.fixture 25 | def four(one, three): 26 | return one + three 27 | 28 | 29 | @pytest.fixture 30 | def entity(one): 31 | return Entity(one) 32 | 33 | 34 | @pytest.fixture 35 | def entity_format(): 36 | def _entity_format(entity: Entity): 37 | return {"value": entity.value} 38 | 39 | return _entity_format 40 | 41 | 42 | @pytest.fixture 43 | def service1(fixture1): 44 | return 1 45 | 46 | 47 | @pytest.fixture 48 | def service2(fixture1): 49 | return 1 50 | 51 | 52 | @pytest.fixture 53 | def service3(fixture1): 54 | return 1 55 | 56 | 57 | @pytest.fixture 58 | def service4(fixture1): 59 | return 1 60 | 61 | 62 | @pytest.fixture 63 | def service5(fixture1): 64 | return 1 65 | 66 | 67 | @pytest.fixture( 68 | params=[ 69 | lf("service1"), 70 | {"test": lf("service2")}, 71 | [lf("service3")], 72 | (lf("service4"),), 73 | {lf("service5")}, 74 | ], 75 | ) 76 | def fixture2(request): 77 | return None 78 | 79 | 80 | @pytest.fixture 81 | def fixture_a() -> str: 82 | return "a" 83 | 84 | 85 | @pytest.fixture 86 | def fixture_b() -> str: 87 | return "b" 88 | 89 | 90 | @pytest.fixture(params=["Alessio"]) 91 | def username(request): 92 | return request.param 93 | 94 | 95 | @pytest.fixture(params=["a", "b"]) 96 | def fixture1(request): 97 | return request.param 98 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "pytest-lazy-fixtures" 3 | version = "0.0.0" 4 | description = "Allows you to use fixtures in @pytest.mark.parametrize." 5 | authors = [{ name = "Petrov Anton", email = "antonp2@yandex.ru" }] 6 | requires-python = ">=3.8" 7 | readme = "README.md" 8 | license = "MIT" 9 | keywords = ["tests", "pytest", "lazy", "fixture"] 10 | dependencies = ["pytest>=7"] 11 | 12 | [project.urls] 13 | Homepage = "https://github.com/dev-petrov/pytest-lazy-fixtures" 14 | Repository = "https://github.com/dev-petrov/pytest-lazy-fixtures" 15 | 16 | [project.entry-points.pytest11] 17 | pytest_lazyfixture = "pytest_lazy_fixtures.plugin" 18 | 19 | [dependency-groups] 20 | dev = [ 21 | "pre-commit>=3.5.0,<4", 22 | "pytest-cov>=4.1.0,<5", 23 | "ruff>=0.3.0,<0.13", 24 | "mypy>=1.8.0,<2", 25 | "hatchling>=1.27.0", 26 | "deptry>=0.20.0", 27 | "pytest-deadfixtures>=2.2.1", 28 | "pytest-fixture-classes>=1.0.3", 29 | ] 30 | 31 | [tool.uv] 32 | package = true 33 | 34 | [build-system] 35 | requires = ["hatchling"] 36 | build-backend = "hatchling.build" 37 | 38 | [tool.pytest.ini_options] 39 | python_files = ["tests.py", "test_*.py", "*_tests.py"] 40 | 41 | [tool.coverage.run] 42 | source = ["pytest_lazy_fixtures"] 43 | 44 | [tool.coverage.report] 45 | exclude_also = ["if TYPE_CHECKING:"] 46 | 47 | [tool.ruff] 48 | line-length = 120 49 | target-version = "py38" 50 | # Exclude a variety of commonly ignored directories. 51 | extend-exclude = [".git", ".venv"] 52 | 53 | [tool.ruff.lint] 54 | select = ["ALL"] 55 | ignore = ["COM812", "D", "ANN", "SLF001", "TD", "FIX", "ISC001"] 56 | 57 | [tool.ruff.lint.per-file-ignores] 58 | "tests/*" = ["S101", "ARG001", "PLR2004"] 59 | 60 | [tool.ruff.lint.mccabe] 61 | max-complexity = 10 62 | 63 | [[tool.mypy.overrides]] 64 | # Disabled for tests because of dynamic nature of pytest 65 | module = "tests/*" 66 | disable_error_code = ["attr-defined"] 67 | -------------------------------------------------------------------------------- /.github/workflows/ci-test.yml: -------------------------------------------------------------------------------- 1 | # This workflow will install Python dependencies, run tests, and lint with a different versions of Python 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions 3 | 4 | name: CI 5 | 6 | on: 7 | push: 8 | branches: [master] 9 | pull_request: 10 | branches: [master] 11 | 12 | permissions: 13 | contents: read 14 | 15 | jobs: 16 | test: 17 | runs-on: ubuntu-latest 18 | strategy: 19 | matrix: 20 | python-version: 21 | - "3.8" 22 | - "3.9" 23 | - "3.10" 24 | - "3.11" 25 | - "3.12" 26 | - "3.13" 27 | 28 | steps: 29 | - uses: actions/checkout@v5 30 | - name: Set up python ${{ matrix.python-version }} 31 | uses: actions/setup-python@v6 32 | with: 33 | python-version: ${{ matrix.python-version }} 34 | - name: Install uv 35 | uses: astral-sh/setup-uv@v7 36 | with: 37 | version: "0.7.13" 38 | - name: Install Task 39 | uses: arduino/setup-task@v2 40 | with: 41 | version: 3.44.0 42 | - name: Lint with ruff 43 | run: task ruff-lint 44 | - name: Format with ruff 45 | run: task ruff-format 46 | - name: Check type hints mypy 47 | run: task mypy 48 | - name: Check dependencies with deptry 49 | run: task deptry 50 | - name: Test with pytest 51 | run: task test 52 | - name: Upload coverage to Codecov 53 | uses: codecov/codecov-action@v5 54 | with: 55 | token: ${{ secrets.CODECOV_TOKEN }} 56 | env_vars: OS,PYTHON 57 | fail_ci_if_error: true 58 | files: ./cov.xml 59 | flags: unittests 60 | name: codecov-umbrella 61 | verbose: true 62 | -------------------------------------------------------------------------------- /Taskfile.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | 3 | silent: true 4 | 5 | tasks: 6 | run_cmd: 7 | internal: true 8 | deps: 9 | - .venv 10 | vars: 11 | CMD: "{{ .CMD }}" 12 | cmd: bash -c "source .venv/bin/activate && {{ .CMD }}" 13 | 14 | default: 15 | desc: "Run lint and test" 16 | cmds: 17 | - task: lint 18 | - task: test 19 | 20 | lint: 21 | desc: "Run all lint checks" 22 | cmds: 23 | - task: ruff-lint 24 | - task: ruff-format 25 | - task: mypy 26 | - task: deptry 27 | 28 | .venv: 29 | desc: "Create virtual environment" 30 | sources: 31 | - uv.lock 32 | run: once 33 | cmd: uv venv --allow-existing && uv sync --no-install-project 34 | 35 | ruff-lint: 36 | desc: "Lint with ruff" 37 | cmd: 38 | task: run_cmd 39 | vars: 40 | CMD: ruff check --diff . 41 | 42 | ruff-format: 43 | desc: "Format with ruff" 44 | cmd: 45 | task: run_cmd 46 | vars: 47 | CMD: ruff format --check --diff . 48 | 49 | mypy: 50 | desc: "Check type hints mypy" 51 | cmd: 52 | task: run_cmd 53 | vars: 54 | CMD: mypy . 55 | 56 | deptry: 57 | desc: "Check dependencies with deptry" 58 | cmd: 59 | task: run_cmd 60 | vars: 61 | CMD: deptry . 62 | 63 | test: 64 | desc: "Test with pytest" 65 | cmd: 66 | task: run_cmd 67 | vars: 68 | CMD: pytest -vv --cov --cov-report=xml:cov.xml --cov-report=term-missing:skip-covered 69 | 70 | publish: 71 | desc: "Publish python package to PyPi" 72 | requires: 73 | vars: 74 | - PACKAGE_VERSION 75 | - PUBLISH_USERNAME 76 | - PUBLISH_PASSWORD 77 | cmd: 78 | task: run_cmd 79 | vars: 80 | CMD: | 81 | uv version {{ .PACKAGE_VERSION }} \ 82 | && uv build \ 83 | && uv publish \ 84 | --username {{ .PUBLISH_USERNAME }} \ 85 | --password {{ .PUBLISH_PASSWORD }} 86 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore 2 | .idea 3 | 4 | # Byte-compiled / optimized / DLL files 5 | __pycache__/ 6 | *.py[cod] 7 | *$py.class 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | !static/dist/ 29 | 30 | # Installer logs 31 | pip-log.txt 32 | pip-delete-this-directory.txt 33 | 34 | # Unit test / coverage reports 35 | htmlcov/ 36 | .coverage 37 | .coverage.* 38 | .cache 39 | nosetests.xml 40 | coverage.xml 41 | *.cover 42 | *.py,cover 43 | .hypothesis/ 44 | .pytest_cache/ 45 | cover/ 46 | 47 | 48 | # PyBuilder 49 | .pybuilder/ 50 | target/ 51 | 52 | # IPython 53 | profile_default/ 54 | ipython_config.py 55 | 56 | # pyenv 57 | # For a library or package, you might want to ignore these files since the code is 58 | # intended to run in multiple environments; otherwise, check them in: 59 | # .python-version 60 | 61 | # pipenv 62 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 63 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 64 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 65 | # install all needed dependencies. 66 | #Pipfile.lock 67 | 68 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 69 | __pypackages__/ 70 | 71 | 72 | # Environments 73 | .env 74 | .venv 75 | env/ 76 | venv/ 77 | ENV/ 78 | env.bak/ 79 | venv.bak/ 80 | 81 | # mypy 82 | .mypy_cache/ 83 | .dmypy.json 84 | dmypy.json 85 | 86 | # Pyre type checker 87 | .pyre/ 88 | 89 | # pytype static type analyzer 90 | .pytype/ 91 | 92 | # Cython debug symbols 93 | cython_debug/ 94 | 95 | # ruff 96 | .ruff_cache/ 97 | 98 | # VSCode 99 | .vscode 100 | 101 | # Mac files 102 | .DS_Store 103 | cov.xml 104 | .task 105 | -------------------------------------------------------------------------------- /pytest_lazy_fixtures/normalizer.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | import copy 4 | 5 | import pytest 6 | 7 | from .utils import get_fixturenames_closure_and_arg2fixturedefs, uniq 8 | 9 | 10 | def normalize_metafunc_calls(metafunc, used_keys: set[str] | None = None): 11 | newcalls = [] 12 | for callspec in metafunc._calls: 13 | calls = _normalize_call(callspec, metafunc, used_keys) 14 | newcalls.extend(calls) 15 | metafunc._calls = newcalls 16 | 17 | 18 | def _copy_metafunc(metafunc): 19 | copied = copy.copy(metafunc) 20 | copied.fixturenames = copy.copy(metafunc.fixturenames) 21 | copied._calls = [] 22 | copied._arg2fixturedefs = copy.copy(metafunc._arg2fixturedefs) 23 | return copied 24 | 25 | 26 | def _normalize_call(callspec, metafunc, used_keys: set[str] | None): 27 | fm = metafunc.config.pluginmanager.get_plugin("funcmanage") 28 | 29 | used_keys = used_keys or set() 30 | params = callspec.params.copy() if pytest.version_tuple >= (8, 0, 0) else {**callspec.params, **callspec.funcargs} 31 | valtype_keys = params.keys() - used_keys 32 | 33 | for arg in valtype_keys: 34 | value = params[arg] 35 | fixturenames_closure, arg2fixturedefs = get_fixturenames_closure_and_arg2fixturedefs( 36 | fm, metafunc.definition.parent, value 37 | ) 38 | 39 | if fixturenames_closure and arg2fixturedefs: 40 | extra_fixturenames = [fname for fname in uniq(fixturenames_closure) if fname not in params] 41 | 42 | newmetafunc = _copy_metafunc(metafunc) 43 | # Only for deadfixtures call, to not break logic 44 | if getattr(metafunc.config.option, "deadfixtures", False): 45 | newmetafunc.definition._fixtureinfo.name2fixturedefs.update(arg2fixturedefs) 46 | newmetafunc.fixturenames = extra_fixturenames 47 | newmetafunc._arg2fixturedefs.update(arg2fixturedefs) 48 | newmetafunc._calls = [callspec] 49 | fm.pytest_generate_tests(newmetafunc) 50 | normalize_metafunc_calls(newmetafunc, used_keys | {arg}) 51 | return newmetafunc._calls 52 | 53 | used_keys.add(arg) 54 | return [callspec] 55 | -------------------------------------------------------------------------------- /pytest_lazy_fixtures/utils.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from typing import Any, Iterable, Iterator 4 | 5 | import pytest 6 | 7 | from .lazy_fixture import LazyFixtureWrapper 8 | from .lazy_fixture_callable import LazyFixtureCallableWrapper 9 | 10 | 11 | def uniq(values: Iterable[str]) -> Iterator[str]: 12 | seen = set() 13 | for value in values: 14 | if value not in seen: 15 | seen.add(value) 16 | yield value 17 | 18 | 19 | def _getfixtureclosure(fm, parent_node, value_name): 20 | if pytest.version_tuple >= (8, 0, 0): 21 | fixturenames_closure, arg2fixturedefs = fm.getfixtureclosure(parent_node, [value_name], {}) 22 | else: # pragma: no cover 23 | # TODO: add tox 24 | _, fixturenames_closure, arg2fixturedefs = fm.getfixtureclosure([value_name], parent_node) 25 | return fixturenames_closure, arg2fixturedefs 26 | 27 | 28 | def get_fixturenames_closure_and_arg2fixturedefs(fm, parent_node, value) -> tuple[list[str], dict[str, Any]]: 29 | if isinstance(value, LazyFixtureCallableWrapper): 30 | extra_fixturenames_args, arg2fixturedefs_args = get_fixturenames_closure_and_arg2fixturedefs( 31 | fm, 32 | parent_node, 33 | value.args, 34 | ) 35 | extra_fixturenames_kwargs, arg2fixturedefs_kwargs = get_fixturenames_closure_and_arg2fixturedefs( 36 | fm, 37 | parent_node, 38 | value.kwargs, 39 | ) 40 | extra_fixturenames_func, arg2fixturedefs_func = [], {} 41 | if value._func is None: 42 | extra_fixturenames_func, arg2fixturedefs_func = _getfixtureclosure(fm, parent_node, value.fixture_name) 43 | return [*extra_fixturenames_args, *extra_fixturenames_kwargs, *extra_fixturenames_func], { 44 | **arg2fixturedefs_args, 45 | **arg2fixturedefs_kwargs, 46 | **arg2fixturedefs_func, 47 | } 48 | if isinstance(value, LazyFixtureWrapper): 49 | return _getfixtureclosure(fm, parent_node, value.fixture_name) 50 | extra_fixturenames, arg2fixturedefs = [], {} 51 | # we need to check exact type 52 | if type(value) is dict: 53 | value = list(value.values()) + list(value.keys()) 54 | # we need to check exact type 55 | if type(value) in {list, tuple, set}: 56 | for val in value: 57 | ef, arg2f = get_fixturenames_closure_and_arg2fixturedefs(fm, parent_node, val) 58 | extra_fixturenames.extend(ef) 59 | arg2fixturedefs.update(arg2f) 60 | return extra_fixturenames, arg2fixturedefs 61 | -------------------------------------------------------------------------------- /pytest_lazy_fixtures/lazy_fixture_callable.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | import inspect 4 | from inspect import isfunction 5 | from typing import TYPE_CHECKING, Callable 6 | 7 | from .lazy_fixture import LazyFixtureWrapper 8 | 9 | if TYPE_CHECKING: 10 | import pytest 11 | 12 | 13 | def _fill_unbound_params( 14 | func: Callable[..., object], args: tuple[object, ...], kwargs: dict[str, object] 15 | ) -> dict[str, object]: 16 | """Analyze a callable's signature and bind lazy fixtures to unbound parameters. 17 | 18 | This function takes a callable and its provided arguments, examines the callable's 19 | signature, and returns a dictionary that maps any unbound parameter names to their 20 | corresponding lazy fixtures. 21 | 22 | Only parameters that are not already bound through the provided args/kwargs will 23 | get mapped to lazy fixtures. Any parameters that have existing values provided 24 | maintain those values. 25 | """ 26 | 27 | try: 28 | sig = inspect.signature(func) 29 | except (ValueError, TypeError): 30 | # Cowardly refuse to figure out the missing params 31 | return {} 32 | 33 | bound = sig.bind_partial(*args, **kwargs) 34 | 35 | # Apply the defaults arguments, as we don't want to override them. 36 | bound.apply_defaults() 37 | 38 | unbound = [name for name in sig.parameters if name not in bound.arguments] 39 | 40 | return {unbound_param: LazyFixtureWrapper(unbound_param) for unbound_param in unbound} 41 | 42 | 43 | class LazyFixtureCallableWrapper(LazyFixtureWrapper): 44 | _func: Callable | None 45 | args: tuple 46 | kwargs: dict 47 | 48 | def __init__(self, callable_or_name: Callable | str, *args, **kwargs): 49 | self.args = args 50 | self.kwargs = kwargs 51 | 52 | if callable(callable_or_name): 53 | self._func = callable_or_name 54 | self.name = ( 55 | callable_or_name.__name__ if isfunction(callable_or_name) else callable_or_name.__class__.__name__ 56 | ) 57 | # If we have a direct callable, analyze its signature and pre-fill 58 | # any unbound parameters with lf(param_name). 59 | self.kwargs.update(_fill_unbound_params(self._func, self.args, self.kwargs)) 60 | else: 61 | self.name = callable_or_name 62 | self._func = None 63 | 64 | def get_func(self, request: pytest.FixtureRequest) -> Callable: 65 | func = self._func 66 | if func is None: 67 | func = self.load_fixture(request) 68 | if not callable(func): 69 | msg = "Passed fixture is not callable" 70 | raise TypeError(msg) 71 | return func 72 | 73 | 74 | def lfc(name: Callable | str, *args, **kwargs) -> LazyFixtureCallableWrapper: 75 | """lfc is a lazy fixture callable.""" 76 | return LazyFixtureCallableWrapper(name, *args, **kwargs) 77 | -------------------------------------------------------------------------------- /tests/tests.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from operator import attrgetter 4 | 5 | import pytest 6 | from pytest_fixture_classes import fixture_class 7 | 8 | from pytest_lazy_fixtures import lf, lfc 9 | from pytest_lazy_fixtures.lazy_fixture import LazyFixtureWrapper 10 | from pytest_lazy_fixtures.lazy_fixture_callable import LazyFixtureCallableWrapper 11 | from tests.entity import DataNamedTuple, Entity 12 | 13 | 14 | def test_lazy_fixture_repr(): 15 | assert str(LazyFixtureWrapper("fixture")) == "fixture" 16 | 17 | 18 | def test_lazy_fixture_callable_repr(): 19 | assert str(LazyFixtureCallableWrapper("fixture")) == "fixture" 20 | 21 | 22 | @pytest.mark.parametrize( 23 | ("first", "second", "other"), 24 | [ 25 | ( 26 | lf("one"), 27 | lf("two"), 28 | 4, 29 | ), 30 | ], 31 | ) 32 | def test_lazy_fixture(first, second, other): 33 | assert first == 1 34 | assert second == 2 35 | assert other == 4 36 | 37 | 38 | @pytest.mark.parametrize( 39 | ("actual", "expected"), 40 | [ 41 | ( 42 | {"a": [lf("one"), lf("two")]}, 43 | {"a": [1, 2]}, 44 | ), 45 | ( 46 | {"a": {lf("one"), lf("two")}}, 47 | {"a": {1, 2}}, 48 | ), 49 | ( 50 | { 51 | lf("three"), 52 | lf("two"), 53 | lf("three"), 54 | }, 55 | {3, 2}, 56 | ), 57 | ([lf("three"), lf("two")], [3, 2]), 58 | ( 59 | { 60 | "first_level": { 61 | "second_level": ( 62 | lf("one"), 63 | lf("one"), 64 | lf("two"), 65 | ), 66 | "not_lazy_fixture": 1, 67 | }, 68 | }, 69 | {"first_level": {"second_level": (1, 1, 2), "not_lazy_fixture": 1}}, 70 | ), 71 | ], 72 | ) 73 | def test_lazy_fixture_data_types(actual, expected): 74 | assert actual == expected 75 | 76 | 77 | @pytest.mark.parametrize("item", [lf("four")]) 78 | def test_lazy_fixture_with_fixtures(item): 79 | assert item == 4 80 | 81 | 82 | @pytest.mark.parametrize( 83 | ("only_entity", "entity_value"), 84 | [ 85 | ( 86 | lf("entity"), 87 | lf("entity.value"), 88 | ), 89 | ], 90 | ) 91 | def test_lazy_fixture_with_attrs(only_entity, entity_value): 92 | assert isinstance(only_entity, Entity) 93 | assert entity_value == 1 94 | 95 | 96 | @pytest.mark.parametrize( 97 | "message", 98 | [ 99 | lfc( 100 | "There is two lazy fixture args, {} and {}! And one kwarg {field}! And also simple value {simple}".format, 101 | lf("one"), 102 | lf("two"), 103 | field=lf("three"), 104 | simple="value", 105 | ), 106 | ], 107 | ) 108 | def test_lazy_fixture_callable_with_func(message): 109 | assert message == "There is two lazy fixture args, 1 and 2! And one kwarg 3! And also simple value value" 110 | 111 | 112 | @pytest.mark.parametrize( 113 | "value", 114 | [ 115 | lfc( 116 | attrgetter("value"), 117 | lf("entity"), 118 | ), 119 | ], 120 | ) 121 | def test_lazy_fixture_callable_with_class(value, entity): 122 | assert value == entity.value 123 | 124 | 125 | @pytest.mark.parametrize( 126 | "formatted", 127 | [ 128 | lfc( 129 | "entity_format", 130 | lf("entity"), 131 | ), 132 | ], 133 | ) 134 | def test_lazy_fixture_callable_with_lf(formatted, entity): 135 | assert formatted == {"value": entity.value} 136 | 137 | 138 | @pytest.mark.parametrize( 139 | "result", 140 | [ 141 | lfc( 142 | "entity.sum", 143 | lf("two"), 144 | ), 145 | ], 146 | ) 147 | def test_lazy_fixture_callable_with_attr_lf(result): 148 | assert result == 3 149 | 150 | 151 | @pytest.mark.parametrize("foo", [lfc(lambda one=42: str(one), lf("one"))]) 152 | def test_lazy_fixture_callable_defaults_are_ignored(foo): 153 | assert foo == "1" 154 | 155 | 156 | @pytest.mark.parametrize("data", [DataNamedTuple(a=1, b=2)]) 157 | def test(data): 158 | assert data.a == 1 159 | assert data.b == 2 160 | 161 | 162 | def test_foo(fixture2): 163 | pass 164 | 165 | 166 | @pytest.mark.parametrize( 167 | "test_dict", 168 | [ 169 | {lf("fixture_a"): lf("fixture_b")}, 170 | ], 171 | ) 172 | def test_dict_a_b(test_dict): 173 | assert test_dict == {"a": "b"} 174 | 175 | 176 | @pytest.mark.parametrize( 177 | "filters", 178 | [ 179 | { 180 | "users": [ 181 | lfc(lambda v: v.upper(), lf("username")), 182 | lfc(lambda v: v.lower(), lf("username")), 183 | ] 184 | }, 185 | ], 186 | ) 187 | def test_indirect_fixture(filters): 188 | assert filters == {"users": ["ALESSIO", "alessio"]} 189 | 190 | 191 | def test_fixture_not_callable(request): 192 | fixture = lfc("entity") 193 | 194 | with pytest.raises(TypeError, match="Passed fixture is not callable"): 195 | fixture.get_func(request) 196 | 197 | 198 | @pytest.fixture 199 | def value_for_is_test(request): 200 | return request.param 201 | 202 | 203 | expected_dict = {"a": "b"} 204 | 205 | 206 | @pytest.mark.parametrize("value_for_is_test", [expected_dict], indirect=True) 207 | def test_is_dict(value_for_is_test): 208 | assert value_for_is_test is expected_dict 209 | 210 | 211 | expected_list = [1, 2, 3] 212 | 213 | 214 | @pytest.mark.parametrize("value_for_is_test", [expected_list], indirect=True) 215 | def test_is_list(value_for_is_test): 216 | assert value_for_is_test is expected_list 217 | 218 | 219 | expected_tuple = (1, 2, 3) 220 | 221 | 222 | @pytest.mark.parametrize("value_for_is_test", [expected_tuple], indirect=True) 223 | def test_is_tuple(value_for_is_test): 224 | assert value_for_is_test is expected_tuple 225 | 226 | 227 | expected_set = {1, 2, 3} 228 | 229 | 230 | @pytest.mark.parametrize("value_for_is_test", [expected_set], indirect=True) 231 | def test_is_set(value_for_is_test): 232 | assert value_for_is_test is expected_set 233 | 234 | 235 | @pytest.fixture 236 | def data(): 237 | return [] 238 | 239 | 240 | @fixture_class(name="some") 241 | class Fixture: 242 | data: list[str] 243 | 244 | def __call__(self) -> list[str]: 245 | self.data.append("some_value") 246 | return self.data 247 | 248 | 249 | @pytest.mark.parametrize("value", [[lf("some")]]) 250 | @pytest.mark.parametrize("value2", [True, False]) 251 | def test_fixture_classes(value, value2): 252 | assert value[0]() == ["some_value"] 253 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pytest-lazy-fixtures 2 | 3 | [![codecov](https://codecov.io/gh/dev-petrov/pytest-lazy-fixtures/branch/master/graph/badge.svg)](https://codecov.io/gh/dev-petrov/pytest-lazy-fixtures) 4 | [![CI](https://github.com/dev-petrov/pytest-lazy-fixtures/workflows/CI/badge.svg)](https://github.com/dev-petrov/pytest-lazy-fixtures/actions/workflows/ci-test.yml) 5 | [![PyPI version](https://badge.fury.io/py/pytest-lazy-fixtures.svg)](https://pypi.org/project/pytest-lazy-fixtures/) 6 | [![PyPI downloads](https://img.shields.io/pypi/dm/pytest-lazy-fixtures)](https://pypistats.org/packages/pytest-lazy-fixtures) 7 | 8 | Use your fixtures in `@pytest.mark.parametrize`. 9 | 10 | This project was inspired by [pytest-lazy-fixture](https://github.com/TvoroG/pytest-lazy-fixture). 11 | 12 | Improvements that have been made in this project: 13 | 14 | 1. You can use fixtures in any data structures 15 | 2. You can access the attributes of fixtures 16 | 3. You can use functions in fixtures 17 | 4. It is compatible with [pytest-deadfixtures](https://github.com/jllorencetti/pytest-deadfixtures) 18 | 19 | ## Installation 20 | 21 | ```shell 22 | pip install pytest-lazy-fixtures 23 | ``` 24 | 25 | ## Usage 26 | 27 | To use your fixtures inside `@pytest.mark.parametrize` you can use `lf` (`lazy_fixture`). 28 | 29 | ```python 30 | import pytest 31 | from pytest_lazy_fixtures import lf 32 | 33 | @pytest.fixture() 34 | def one(): 35 | return 1 36 | 37 | @pytest.mark.parametrize('arg1,arg2', [('val1', lf('one'))]) 38 | def test_func(arg1, arg2): 39 | assert arg2 == 1 40 | ``` 41 | 42 | `lf` can be used with any data structures. For example, in the following example, `lf` is used in the dictionary: 43 | 44 | ```python 45 | import pytest 46 | from pytest_lazy_fixtures import lf 47 | 48 | @pytest.fixture() 49 | def one(): 50 | return 1 51 | 52 | @pytest.mark.parametrize('arg1,arg2', [('val1', {"value": lf('one')})]) 53 | def test_func(arg1, arg2): 54 | assert arg2 == {"value": 1} 55 | ``` 56 | 57 | You can also specify getting an attribute through a dot: 58 | 59 | ```python 60 | import pytest 61 | from pytest_lazy_fixtures import lf 62 | 63 | class Entity: 64 | def __init__(self, value): 65 | self.value = value 66 | 67 | @pytest.fixture() 68 | def one(): 69 | return Entity(1) 70 | 71 | @pytest.mark.parametrize('arg1,arg2', [('val1', lf('one.value'))]) 72 | def test_func(arg1, arg2): 73 | assert arg2 == 1 74 | ``` 75 | 76 | And there is some useful wrapper called `lfc` (`lazy_fixture_callable`). 77 | It can work with any callable and your fixtures. 78 | 79 | ```python 80 | import pytest 81 | from pytest_lazy_fixtures import lf, lfc 82 | 83 | class Entity: 84 | def __init__(self, value): 85 | self.value = value 86 | 87 | def __str__(self) -> str: 88 | return str(self.value) 89 | 90 | def sum(self, value: int) -> int: 91 | return self.value + value 92 | 93 | @pytest.fixture() 94 | def entity(): 95 | return Entity(1) 96 | 97 | @pytest.fixture() 98 | def two(): 99 | return 2 100 | 101 | @pytest.fixture() 102 | def three(): 103 | return 3 104 | 105 | @pytest.fixture() 106 | def entity_format(): 107 | def _entity_format(entity: Entity): 108 | return {"value": entity.value} 109 | 110 | return _entity_format 111 | 112 | # Recommended: implicit injection from the callable's parameter names 113 | @pytest.mark.parametrize("as_text", [lfc(lambda entity: str(entity))]) 114 | def test_lfc_injection_basic(as_text): 115 | assert as_text == "1" 116 | 117 | # Advanced: manual control over what to inject (explicit values into a callable) 118 | @pytest.mark.parametrize( 119 | "message", 120 | [ 121 | lfc( 122 | "There is two lazy fixture args, {} and {}! And one kwarg {field}! And also simple value {simple}".format, 123 | lf("entity"), 124 | lf("two"), 125 | field=lf("three"), 126 | simple="value", 127 | ), 128 | ], 129 | ) 130 | def test_lazy_fixture_callable_with_func(message): 131 | assert message == "There is two lazy fixture args, 1 and 2! And one kwarg 3! And also simple value value" 132 | 133 | 134 | @pytest.mark.parametrize("formatted", [lfc("entity_format", lf("entity"))]) 135 | def test_lazy_fixture_callable_with_lf(formatted, entity): 136 | assert formatted == {"value": entity.value} 137 | 138 | 139 | @pytest.mark.parametrize("result", [lfc("entity.sum", lf("two"))]) 140 | def test_lazy_fixture_callable_with_attr_lf(result): 141 | assert result == 3 142 | ``` 143 | 144 | ### Injecting fixtures from a callable signature 145 | 146 | `lfc` automatically injects fixtures based on the callable's parameter names. If a parameter name matches a fixture name, that fixture will be resolved and passed into the callable. This implicit injection is the standard, recommended behavior. You can still override any parameter explicitly using `lf`, either positionally or by name. 147 | Default values prevent implicit injection for that parameter. 148 | 149 | Examples: 150 | 151 | ```python 152 | import pytest 153 | from pytest_lazy_fixtures import lf, lfc 154 | 155 | # Some fixtures used in the examples 156 | @pytest.fixture() 157 | def alpha(): 158 | return 10 159 | 160 | @pytest.fixture() 161 | def beta(): 162 | return 20 163 | 164 | @pytest.fixture() 165 | def gamma(): 166 | return 30 167 | 168 | # Simple implicit injection by parameter name 169 | @pytest.mark.parametrize("result", [lfc(lambda alpha: alpha + 1)]) 170 | def test_signature_injection_basic(result): 171 | assert result == 11 172 | 173 | # Override an implicitly matched parameter (positional or keyword) 174 | @pytest.mark.parametrize( 175 | "result", 176 | [ 177 | lfc(lambda alpha: alpha + 1, lf("beta")), # positional override 178 | lfc(lambda alpha: alpha + 1, alpha=lf("beta")), # keyword override 179 | ], 180 | ) 181 | def test_signature_injection_override(result): 182 | assert result == 21 183 | 184 | # Mix implicit and explicit params 185 | @pytest.mark.parametrize( 186 | "pair", 187 | [ 188 | lfc(lambda alpha, beta: (alpha, beta), beta=lf("gamma")), # first implicit, second explicit 189 | lfc(lambda alpha, beta: (alpha, beta), lf("gamma")), # first explicit, second implicit 190 | ], 191 | ) 192 | def test_signature_injection_mixed(pair): 193 | assert pair in [(10, 30), (30, 20)] 194 | 195 | # 4) Defaults prevent implicit injection for that parameter 196 | @pytest.mark.parametrize("val", [lfc(lambda alpha=999: alpha)]) 197 | def test_signature_injection_defaults(val): 198 | assert val == 999 199 | ``` 200 | 201 | Notes: 202 | - Implicit injection only happens for parameters without an explicit value and without a default. 203 | - Explicit arguments passed to `lfc` (positional or keyword) always take precedence over implicit injection. 204 | - The mapping of positional explicit arguments follows the callable's parameter order. 205 | 206 | ## Contributing 207 | 208 | Contributions are very welcome. Tests can be run with `pytest`. 209 | 210 | ## License 211 | 212 | Distributed under the terms of the `MIT` license, `pytest-lazy-fixtures` is free and open source software 213 | 214 | ## Issues 215 | 216 | If you encounter any problems, please file an issue along with a detailed description. 217 | -------------------------------------------------------------------------------- /tests/test_deadfixtures_support.py: -------------------------------------------------------------------------------- 1 | from pytest_deadfixtures import EXIT_CODE_SUCCESS # type: ignore[import-untyped] 2 | 3 | 4 | def test_lazy_fixtures_collected_simple(pytester): 5 | pytester.makepyfile( 6 | """ 7 | import pytest 8 | from pytest_lazy_fixtures import lf 9 | 10 | 11 | @pytest.fixture 12 | def some_fixture(): 13 | return 1 14 | 15 | @pytest.mark.usefixtures() 16 | @pytest.mark.parametrize("value", [lf("some_fixture")]) 17 | def test_simple(value): 18 | assert 1 == value 19 | """ 20 | ) 21 | 22 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 23 | 24 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 25 | 26 | 27 | def test_lazy_fixtures_collected_list(pytester): 28 | pytester.makepyfile( 29 | """ 30 | import pytest 31 | from pytest_lazy_fixtures import lf 32 | 33 | 34 | @pytest.fixture 35 | def some_fixture(): 36 | return 1 37 | 38 | @pytest.mark.parametrize("value", [[lf("some_fixture")]]) 39 | def test_simple(value): 40 | assert 1 == value 41 | """ 42 | ) 43 | 44 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 45 | 46 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 47 | 48 | 49 | def test_lazy_fixtures_collected_dict_simple(pytester): 50 | pytester.makepyfile( 51 | """ 52 | import pytest 53 | from pytest_lazy_fixtures import lf 54 | 55 | 56 | @pytest.fixture 57 | def some_fixture_key(): 58 | return 1 59 | 60 | @pytest.fixture 61 | def some_fixture_value(): 62 | return 1 63 | 64 | @pytest.mark.parametrize("value", [{lf("some_fixture_key"): lf("some_fixture_value")}]) 65 | def test_simple(value): 66 | assert 1 == value 67 | """ 68 | ) 69 | 70 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 71 | 72 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 73 | 74 | 75 | def test_lazy_fixtures_collected_dict_deep(pytester): 76 | pytester.makepyfile( 77 | """ 78 | import pytest 79 | from pytest_lazy_fixtures import lf 80 | 81 | 82 | @pytest.fixture 83 | def some_fixture_key(): 84 | return 1 85 | 86 | @pytest.fixture 87 | def some_fixture_value(): 88 | return 1 89 | 90 | @pytest.mark.parametrize("value", [{lf("some_fixture_key"): [lf("some_fixture_value")]}]) 91 | def test_simple(value): 92 | assert 1 == value 93 | """ 94 | ) 95 | 96 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 97 | 98 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 99 | 100 | 101 | def test_lazy_fixture_callable_collected(pytester): 102 | pytester.makepyfile( 103 | """ 104 | import pytest 105 | from pytest_lazy_fixtures import lfc, lf 106 | 107 | 108 | @pytest.fixture 109 | def some_fixture_func(): 110 | return "{} test".format 111 | 112 | @pytest.fixture 113 | def some_fixture(): 114 | return 1 115 | 116 | @pytest.mark.parametrize("value", [lfc("some_fixture_func", lf("some_fixture"))]) 117 | def test_simple(value): 118 | assert "1 test" == value 119 | """ 120 | ) 121 | 122 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 123 | 124 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 125 | 126 | 127 | def test_lazy_fixtures_collected_argvalues(pytester): 128 | pytester.makepyfile( 129 | """ 130 | import pytest 131 | from pytest_lazy_fixtures import lf 132 | 133 | 134 | @pytest.fixture 135 | def some_fixture(): 136 | return 1 137 | 138 | @pytest.mark.parametrize("value", argvalues=[lf("some_fixture")]) 139 | def test_simple(value): 140 | assert 1 == value 141 | """ 142 | ) 143 | 144 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 145 | 146 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 147 | 148 | 149 | def test_lazy_fixtures_collected_argnames_argvalues(pytester): 150 | pytester.makepyfile( 151 | """ 152 | import pytest 153 | from pytest_lazy_fixtures import lf 154 | 155 | 156 | @pytest.fixture 157 | def some_fixture(): 158 | return 1 159 | 160 | @pytest.mark.parametrize(argnames="value", argvalues=[lf("some_fixture")]) 161 | def test_simple(value): 162 | assert 1 == value 163 | """ 164 | ) 165 | 166 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 167 | 168 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 169 | 170 | 171 | def test_lazy_fixtures_collected_nested(pytester): 172 | pytester.makepyfile( 173 | """ 174 | import pytest 175 | from pytest_lazy_fixtures import lf 176 | 177 | class A: 178 | a: int = 1 179 | 180 | 181 | @pytest.fixture 182 | def some_fixture(): 183 | return A 184 | 185 | @pytest.mark.usefixtures() 186 | @pytest.mark.parametrize("value", [lf("some_fixture.a")]) 187 | def test_simple(value): 188 | assert 1 == value 189 | """ 190 | ) 191 | 192 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 193 | 194 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 195 | 196 | 197 | def test_lazy_fixture_callable_nested_collected(pytester): 198 | pytester.makepyfile( 199 | """ 200 | import pytest 201 | from pytest_lazy_fixtures import lfc, lf 202 | 203 | class A: 204 | def some_method(self, v): ... 205 | 206 | 207 | @pytest.fixture 208 | def some_fixture_func(): 209 | return A() 210 | 211 | @pytest.fixture 212 | def some_fixture(): 213 | return 1 214 | 215 | @pytest.mark.parametrize("value", [lfc("some_fixture_func.some_method", lf("some_fixture"))]) 216 | def test_simple(value): 217 | assert "1 test" == value 218 | """ 219 | ) 220 | 221 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 222 | 223 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 224 | 225 | 226 | def test_lazy_fixtures_collected_parametrized_fixture_simple(pytester): 227 | pytester.makepyfile( 228 | """ 229 | import pytest 230 | from pytest_lazy_fixtures import lf 231 | 232 | @pytest.fixture 233 | def some_parametrized_fixture(): 234 | return 1 235 | 236 | @pytest.fixture(params=[lf("some_parametrized_fixture")]) 237 | def some_fixture(request): 238 | return request.param 239 | 240 | def test_simple(some_fixture): 241 | assert 1 == value 242 | """ 243 | ) 244 | 245 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 246 | 247 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 248 | 249 | 250 | def test_lazy_fixtures_collected_parametrized_fixture_list(pytester): 251 | pytester.makepyfile( 252 | """ 253 | import pytest 254 | from pytest_lazy_fixtures import lf 255 | 256 | 257 | @pytest.fixture 258 | def some_parametrized_fixture(): 259 | return 1 260 | 261 | @pytest.fixture(params=[[lf("some_parametrized_fixture")]]) 262 | def some_fixture(request): 263 | return request.param 264 | 265 | def test_simple(some_fixture): 266 | assert 1 == value 267 | """ 268 | ) 269 | 270 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 271 | 272 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 273 | 274 | 275 | def test_lazy_fixtures_collected_parametrized_fixture_dict_simple(pytester): 276 | pytester.makepyfile( 277 | """ 278 | import pytest 279 | from pytest_lazy_fixtures import lf 280 | 281 | @pytest.fixture 282 | def some_parametrized_fixture_key(): 283 | return 1 284 | 285 | @pytest.fixture 286 | def some_parametrized_fixture_value(): 287 | return 1 288 | 289 | @pytest.fixture(params=[{lf("some_parametrized_fixture_key"): lf("some_parametrized_fixture_value")}]) 290 | def some_fixture(request): 291 | return request.param 292 | 293 | def test_simple(some_fixture): 294 | assert 1 == value 295 | """ 296 | ) 297 | 298 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 299 | 300 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 301 | 302 | 303 | def test_lazy_fixtures_collected_parametrized_fixture_dict_deep(pytester): 304 | pytester.makepyfile( 305 | """ 306 | import pytest 307 | from pytest_lazy_fixtures import lf 308 | 309 | 310 | @pytest.fixture 311 | def some_parametrized_fixture_key(): 312 | return 1 313 | 314 | @pytest.fixture 315 | def some_parametrized_fixture_value(): 316 | return 1 317 | 318 | @pytest.fixture(params=[{lf("some_parametrized_fixture_key"): [lf("some_parametrized_fixture_value")]}]) 319 | def some_fixture(request): 320 | return request.param 321 | 322 | def test_simple(some_fixture): 323 | assert 1 == value 324 | """ 325 | ) 326 | 327 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 328 | 329 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 330 | 331 | 332 | def test_lazy_fixture_callable_parametrized_fixture_collected(pytester): 333 | pytester.makepyfile( 334 | """ 335 | import pytest 336 | from pytest_lazy_fixtures import lfc, lf 337 | 338 | 339 | @pytest.fixture 340 | def some_parametrized_fixture_func(): 341 | return "{} test".format 342 | 343 | @pytest.fixture 344 | def some_fixture_value(): 345 | return 1 346 | 347 | @pytest.fixture(params=[lfc("some_fixture_func", lf("some_fixture")]) 348 | def some_fixture(request): 349 | return request.param 350 | 351 | def test_simple(some_fixture): 352 | assert "1 test" == value 353 | """ 354 | ) 355 | 356 | result = pytester.runpytest("--dead-fixtures", plugins=("pytest_lazy_fixtures.plugin",)) 357 | 358 | assert result.ret == EXIT_CODE_SUCCESS, result.stdout 359 | -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | revision = 2 3 | requires-python = ">=3.8" 4 | resolution-markers = [ 5 | "python_full_version >= '3.10'", 6 | "python_full_version == '3.9.*'", 7 | "python_full_version < '3.9'", 8 | ] 9 | 10 | [[package]] 11 | name = "cfgv" 12 | version = "3.4.0" 13 | source = { registry = "https://pypi.org/simple" } 14 | sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } 15 | wheels = [ 16 | { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, 17 | ] 18 | 19 | [[package]] 20 | name = "click" 21 | version = "8.1.8" 22 | source = { registry = "https://pypi.org/simple" } 23 | resolution-markers = [ 24 | "python_full_version == '3.9.*'", 25 | "python_full_version < '3.9'", 26 | ] 27 | dependencies = [ 28 | { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, 29 | ] 30 | sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } 31 | wheels = [ 32 | { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, 33 | ] 34 | 35 | [[package]] 36 | name = "click" 37 | version = "8.2.1" 38 | source = { registry = "https://pypi.org/simple" } 39 | resolution-markers = [ 40 | "python_full_version >= '3.10'", 41 | ] 42 | dependencies = [ 43 | { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, 44 | ] 45 | sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } 46 | wheels = [ 47 | { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, 48 | ] 49 | 50 | [[package]] 51 | name = "colorama" 52 | version = "0.4.6" 53 | source = { registry = "https://pypi.org/simple" } 54 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } 55 | wheels = [ 56 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, 57 | ] 58 | 59 | [[package]] 60 | name = "coverage" 61 | version = "7.4.3" 62 | source = { registry = "https://pypi.org/simple" } 63 | sdist = { url = "https://files.pythonhosted.org/packages/d2/e2/f2d313169e0ecf1b46295b3ddf28a6818d02c1b047413f38b6325823cb2b/coverage-7.4.3.tar.gz", hash = "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52", size = 783214, upload-time = "2024-02-23T20:59:20.175Z" } 64 | wheels = [ 65 | { url = "https://files.pythonhosted.org/packages/50/5a/d727fcd2e0fc3aba61591b6f0fe1e87865ea9b6275f58f35810d6f85b05b/coverage-7.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6", size = 206761, upload-time = "2024-02-23T20:57:22.914Z" }, 66 | { url = "https://files.pythonhosted.org/packages/a3/36/b5ae380c05f58544a40ff36f87fa1d6e45f5c2f299335586aac140c341ce/coverage-7.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4", size = 207109, upload-time = "2024-02-23T20:57:25.854Z" }, 67 | { url = "https://files.pythonhosted.org/packages/9e/48/5ae1ccf4601500af0ca36eba0a2c1f1796e58fb7495de6da55ed43e13e5f/coverage-7.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524", size = 235023, upload-time = "2024-02-23T20:57:28.379Z" }, 68 | { url = "https://files.pythonhosted.org/packages/51/48/cbce7e8b56486e252864d68c35901d13502c1a9bceb2257f308cb9415cf3/coverage-7.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d", size = 233306, upload-time = "2024-02-23T20:57:30.926Z" }, 69 | { url = "https://files.pythonhosted.org/packages/23/0a/ab5b0f6d6b24f7156624e7697ec7ab49f9d5cdac922da90d9927ae5de1cf/coverage-7.4.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb", size = 234098, upload-time = "2024-02-23T20:57:33.329Z" }, 70 | { url = "https://files.pythonhosted.org/packages/e1/47/ca53ef810b264986aac87ba3aaa269574c8ad883ca772b0c5e945d87ae68/coverage-7.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0", size = 240160, upload-time = "2024-02-23T20:57:35.134Z" }, 71 | { url = "https://files.pythonhosted.org/packages/a5/7b/eb4a04ac91ee6b0402a1c752fc33dfbcddfb19368ebfaf7a9bf0714f55f2/coverage-7.4.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc", size = 238357, upload-time = "2024-02-23T20:57:37.745Z" }, 72 | { url = "https://files.pythonhosted.org/packages/0f/de/406738f5d271f4feda82b1282a21b576373707234f14934ad6207837de79/coverage-7.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2", size = 239541, upload-time = "2024-02-23T20:57:40.111Z" }, 73 | { url = "https://files.pythonhosted.org/packages/93/20/65ca1ea79d2a53d870e765462e539c63630e3a75f5d49e96cc5927e8642c/coverage-7.4.3-cp310-cp310-win32.whl", hash = "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94", size = 208996, upload-time = "2024-02-23T20:57:42.545Z" }, 74 | { url = "https://files.pythonhosted.org/packages/d6/f8/f2ed0bc7e856691a960cec75dcd1a6f19a1f04262cbaf616c370ff10dd7a/coverage-7.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0", size = 209843, upload-time = "2024-02-23T20:57:44.307Z" }, 75 | { url = "https://files.pythonhosted.org/packages/ca/77/f17a5b199e8ca0443ace312f7e07ff3e4e7ba7d7c52847567d6f1edb22a7/coverage-7.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47", size = 206944, upload-time = "2024-02-23T20:57:47.071Z" }, 76 | { url = "https://files.pythonhosted.org/packages/f8/a1/161102d2e26fde2d878d68cc1ed303758dc7b01ee14cc6aa70f5fd1b910d/coverage-7.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113", size = 207214, upload-time = "2024-02-23T20:57:49.914Z" }, 77 | { url = "https://files.pythonhosted.org/packages/a7/af/1510df1132a68ca876013c0417ca46836252e43871d2623b489e4339c980/coverage-7.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe", size = 238669, upload-time = "2024-02-23T20:57:52.391Z" }, 78 | { url = "https://files.pythonhosted.org/packages/ec/2c/dafb1ae6b813225a63d9675222ea69f0ddd22062fc2af7f86eefc4458323/coverage-7.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc", size = 236246, upload-time = "2024-02-23T20:57:54.994Z" }, 79 | { url = "https://files.pythonhosted.org/packages/a9/1a/e2120233177b3e2ea9dcfd49a050748060166c74792b2b1db4a803307da4/coverage-7.4.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3", size = 237949, upload-time = "2024-02-23T20:57:57.516Z" }, 80 | { url = "https://files.pythonhosted.org/packages/0a/8a/8b9fe4465d5770442c64435eb5f1c06e219ddff38599fc1ebaf09dc152ac/coverage-7.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba", size = 247043, upload-time = "2024-02-23T20:57:59.947Z" }, 81 | { url = "https://files.pythonhosted.org/packages/bf/80/28015c502ebcda8d99b58be8a941fd52fc70c464b1491bad3201da49fc1a/coverage-7.4.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079", size = 245425, upload-time = "2024-02-23T20:58:02.201Z" }, 82 | { url = "https://files.pythonhosted.org/packages/bd/f3/5775c7ce6208b2019dbd6d936bd8eebd651a95d90b37df9a480167e89b92/coverage-7.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840", size = 246498, upload-time = "2024-02-23T20:58:03.988Z" }, 83 | { url = "https://files.pythonhosted.org/packages/04/84/3c346c7a014d7b6279f7eb5b73639e20d88f164d26f4c9c27882fad58a3a/coverage-7.4.3-cp311-cp311-win32.whl", hash = "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3", size = 208995, upload-time = "2024-02-23T20:58:05.845Z" }, 84 | { url = "https://files.pythonhosted.org/packages/60/8c/e07c710a160b0c3af4481462dce6ddaed1d9dcf936d0bc107be4e5bbeff1/coverage-7.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e", size = 209932, upload-time = "2024-02-23T20:58:07.814Z" }, 85 | { url = "https://files.pythonhosted.org/packages/11/5c/2cf3e794fa5d1eb443aa8544e2ba3837d75073eaf25a1fda64d232065609/coverage-7.4.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10", size = 207052, upload-time = "2024-02-23T20:58:09.849Z" }, 86 | { url = "https://files.pythonhosted.org/packages/9d/d8/111ec1a65fef57ad2e31445af627d481f660d4a9218ee5c774b45187812a/coverage-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328", size = 207217, upload-time = "2024-02-23T20:58:11.738Z" }, 87 | { url = "https://files.pythonhosted.org/packages/8f/eb/28416f1721a3b7fa28ea499e8a6f867e28146ea2453839c2bca04a001eeb/coverage-7.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30", size = 239554, upload-time = "2024-02-23T20:58:14.378Z" }, 88 | { url = "https://files.pythonhosted.org/packages/31/02/255bc1d1c0c82836faca0479dab142b5ecede2c76dfa6867a247d263bc47/coverage-7.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7", size = 236922, upload-time = "2024-02-23T20:58:17.028Z" }, 89 | { url = "https://files.pythonhosted.org/packages/2f/db/70900f10b85a66f761a3a28950ccd07757d51548b1d10157adc4b9415f15/coverage-7.4.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e", size = 238858, upload-time = "2024-02-23T20:58:19.477Z" }, 90 | { url = "https://files.pythonhosted.org/packages/c5/fc/f6b9d9fe511a5f901b522906ac473692b722159be64a022a52ad106dca46/coverage-7.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003", size = 245796, upload-time = "2024-02-23T20:58:21.319Z" }, 91 | { url = "https://files.pythonhosted.org/packages/c1/0c/525a18fc342db0e720fefada2186af4c24155708a5f7bf09d2f20d2ddefe/coverage-7.4.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d", size = 243704, upload-time = "2024-02-23T20:58:24.001Z" }, 92 | { url = "https://files.pythonhosted.org/packages/c0/0d/088070e995998bd984fbccb4f1e9671d304325a6ad811ae65c014cfd0c84/coverage-7.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a", size = 245436, upload-time = "2024-02-23T20:58:25.853Z" }, 93 | { url = "https://files.pythonhosted.org/packages/f5/c3/af27647339a61c81c5e2ee2971d23a420fcc0a7f0dcdd4f433ad708a1833/coverage-7.4.3-cp312-cp312-win32.whl", hash = "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352", size = 209249, upload-time = "2024-02-23T20:58:28.557Z" }, 94 | { url = "https://files.pythonhosted.org/packages/c9/69/9197c4c7f431b696570c8ab9d5dee668aea3563abfa979d700bbc18e585f/coverage-7.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914", size = 210076, upload-time = "2024-02-23T20:58:30.741Z" }, 95 | { url = "https://files.pythonhosted.org/packages/e2/bc/f54b24b476db0069ac04ff2cdeb28cd890654c8619761bf818726022c76a/coverage-7.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454", size = 206738, upload-time = "2024-02-23T20:58:32.901Z" }, 96 | { url = "https://files.pythonhosted.org/packages/96/71/1c299b12e80d231e04a2bfd695e761fb779af7ab66f8bd3cb15649be82b3/coverage-7.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e", size = 207085, upload-time = "2024-02-23T20:58:35.149Z" }, 97 | { url = "https://files.pythonhosted.org/packages/c7/a7/b00eaa53d904193478eae01625d784b2af8b522a98028f47c831dcc95663/coverage-7.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2", size = 236150, upload-time = "2024-02-23T20:58:37.01Z" }, 98 | { url = "https://files.pythonhosted.org/packages/74/19/e944886a3ef40f78110eb894d716d32aebdcf00248c6f0e7c5f63a000846/coverage-7.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e", size = 233989, upload-time = "2024-02-23T20:58:39.235Z" }, 99 | { url = "https://files.pythonhosted.org/packages/d0/3a/e882caceca2c7d65791a4a759764a1bf803bbbd10caf38ec41d73a45219e/coverage-7.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6", size = 235227, upload-time = "2024-02-23T20:58:42.202Z" }, 100 | { url = "https://files.pythonhosted.org/packages/07/1a/29063d3d95535a4cf270afc52028d2fb0a83cac87b881307c0bfeb8f871a/coverage-7.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c", size = 241101, upload-time = "2024-02-23T20:58:44.63Z" }, 101 | { url = "https://files.pythonhosted.org/packages/f1/a4/9edd06d88f3ab17b36bbf33947618292bbbdbf72d9f3c2c6f0880fca8bba/coverage-7.4.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0", size = 239560, upload-time = "2024-02-23T20:58:47.309Z" }, 102 | { url = "https://files.pythonhosted.org/packages/4c/22/a7c0955a0c9cdfbf9cb0950f78f32a6afc7006e93162ed2cc182fbed1167/coverage-7.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1", size = 240441, upload-time = "2024-02-23T20:58:49.349Z" }, 103 | { url = "https://files.pythonhosted.org/packages/1c/0d/1b06023f0df5b803effa41c3456caa2e81438fc90a2c2c37588254b97b98/coverage-7.4.3-cp38-cp38-win32.whl", hash = "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f", size = 208975, upload-time = "2024-02-23T20:58:51.828Z" }, 104 | { url = "https://files.pythonhosted.org/packages/a9/46/03178c33a9097711c62e4ce70af140e48fa2d0056658504227125be1a57a/coverage-7.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9", size = 209831, upload-time = "2024-02-23T20:58:54.289Z" }, 105 | { url = "https://files.pythonhosted.org/packages/d6/cf/4094ac6410b680c91c5e55a56f25f4b3a878e2fcbf773c1cecfbdbaaec4f/coverage-7.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f", size = 206757, upload-time = "2024-02-23T20:58:56.269Z" }, 106 | { url = "https://files.pythonhosted.org/packages/66/f2/57f5d3c9d2e78c088e4c8dbc933b85fa81c424f23641f10c1aa64052ee4f/coverage-7.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c", size = 207121, upload-time = "2024-02-23T20:58:58.38Z" }, 107 | { url = "https://files.pythonhosted.org/packages/ad/3f/cde6fd2e4cc447bd24e3dc2e79abd2e0fba67ac162996253d3505f8efef4/coverage-7.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e", size = 234623, upload-time = "2024-02-23T20:59:00.669Z" }, 108 | { url = "https://files.pythonhosted.org/packages/3d/37/fa86779a6813e695b48fc696b3d12b4742cde51ecba8ffb55dd7363f9580/coverage-7.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765", size = 232913, upload-time = "2024-02-23T20:59:02.615Z" }, 109 | { url = "https://files.pythonhosted.org/packages/b5/ad/effc12b8f72321cb847c5ba7f4ea7ce3e5c19c641f6418131f8fb0ab2f61/coverage-7.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee", size = 233700, upload-time = "2024-02-23T20:59:04.925Z" }, 110 | { url = "https://files.pythonhosted.org/packages/9b/08/796cb089ce66da0453aed1b4a36be02c6e0e08207dd77d8bfd37cb1c6952/coverage-7.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501", size = 239738, upload-time = "2024-02-23T20:59:07.11Z" }, 111 | { url = "https://files.pythonhosted.org/packages/ab/d4/359f5f195a209ec7598ef3804451b76f5f75c14ce63e9684a0e0eeaa2ed9/coverage-7.4.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f", size = 237939, upload-time = "2024-02-23T20:59:09.049Z" }, 112 | { url = "https://files.pythonhosted.org/packages/a1/94/5d5e02d0f94c6fc57aab0e2dc2b67f8147aa3f76c7ca80550183565d4cf7/coverage-7.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45", size = 239096, upload-time = "2024-02-23T20:59:11.112Z" }, 113 | { url = "https://files.pythonhosted.org/packages/3a/35/8d9c65e40b5c4a4497a21a8c42d7262b998e1abca7ecf96c9ebed5a3fa23/coverage-7.4.3-cp39-cp39-win32.whl", hash = "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9", size = 209012, upload-time = "2024-02-23T20:59:13.108Z" }, 114 | { url = "https://files.pythonhosted.org/packages/20/f1/0c7cc82978de5585e8d5e1e09cc1b0272c2e27d759c755b4541f25f022de/coverage-7.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa", size = 209861, upload-time = "2024-02-23T20:59:15.12Z" }, 115 | { url = "https://files.pythonhosted.org/packages/56/cc/7b355af846b024e845e7beb58d277088c5a27590975f96666229a4d7bb6d/coverage-7.4.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51", size = 199012, upload-time = "2024-02-23T20:59:17.408Z" }, 116 | ] 117 | 118 | [package.optional-dependencies] 119 | toml = [ 120 | { name = "tomli", marker = "python_full_version <= '3.11'" }, 121 | ] 122 | 123 | [[package]] 124 | name = "deptry" 125 | version = "0.20.0" 126 | source = { registry = "https://pypi.org/simple" } 127 | resolution-markers = [ 128 | "python_full_version < '3.9'", 129 | ] 130 | dependencies = [ 131 | { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, 132 | { name = "colorama", marker = "python_full_version < '3.9' and sys_platform == 'win32'" }, 133 | { name = "tomli", marker = "python_full_version < '3.9'" }, 134 | ] 135 | sdist = { url = "https://files.pythonhosted.org/packages/18/9e/7a976d923d3ae18d7dc4ace8e0c83e20a847828196e7f4b13a4bf6b03b50/deptry-0.20.0.tar.gz", hash = "sha256:62e9aaf3aea9e2ca66c85da98a0ba0290b4d3daea4e1d0ad937d447bd3c36402", size = 129936, upload-time = "2024-08-27T12:18:45.743Z" } 136 | wheels = [ 137 | { url = "https://files.pythonhosted.org/packages/1d/da/c94ebc2192a29a6f45acb5b87fdb31d1b84843154572d9b88100b7047eda/deptry-0.20.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:41434d95124851b83cb05524d1a09ad6fea62006beafed2ef90a6b501c1b237f", size = 1624964, upload-time = "2024-08-27T12:18:41.401Z" }, 138 | { url = "https://files.pythonhosted.org/packages/98/8e/08f7b33b384a7981b27de5aa3def41b6fa691aa692904910dc1f5bd1fc02/deptry-0.20.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:b3b4b22d1406147de5d606a24042126cd74d52fdfdb0232b9c5fd0270d601610", size = 1545726, upload-time = "2024-08-27T12:18:37.094Z" }, 139 | { url = "https://files.pythonhosted.org/packages/55/47/8e813609a4ba6c75032bd3468f9edcad31e11906eafd0a1e5a3f3f837fba/deptry-0.20.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:012fb106dbea6ca95196cdcd75ac90c516c8f01292f7934f2e802a7cf025a660", size = 1676818, upload-time = "2024-08-27T12:18:28.629Z" }, 140 | { url = "https://files.pythonhosted.org/packages/b4/70/456d976912c6026252034c0cdb37a3cbad34ac0ce815763466720c63aece/deptry-0.20.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ce3920e2bd6d2b4427ab31ab8efb94bbef897001c2d395782bc30002966d12d", size = 1708051, upload-time = "2024-08-27T12:18:33.019Z" }, 141 | { url = "https://files.pythonhosted.org/packages/ff/66/95e04a84120861b0c0ac980999e6172612509d5ff9a84b41e2f71cc3c3c0/deptry-0.20.0-cp38-abi3-win_amd64.whl", hash = "sha256:0c90ce64e637d0e902bc97c5a020adecfee9e9f09ee0bf4c61554994139bebdb", size = 1493281, upload-time = "2024-08-27T12:18:49.907Z" }, 142 | { url = "https://files.pythonhosted.org/packages/53/c9/9d7d86b5fdc452b522ef16df9e27c8404dc6f231fa865a3af31c1dab7563/deptry-0.20.0-cp38-abi3-win_arm64.whl", hash = "sha256:6886ff44aaf26fd83093f14f844ebc84589d90df9bbad9a1625e8a080e6f1be2", size = 1420087, upload-time = "2024-08-27T12:18:47.809Z" }, 143 | { url = "https://files.pythonhosted.org/packages/2a/06/57ccbad1a66e9a17980f03f6aed9724577a5acd58c761ede76e4b03004a7/deptry-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ace3b39b1d0763f357c79bab003d1b135bea2eb61102be539992621a42d1ac7b", size = 1624520, upload-time = "2024-08-27T12:18:43.434Z" }, 144 | { url = "https://files.pythonhosted.org/packages/d9/00/c8b214f4a0c52b95cabb35197046efc84f9205eeef1d12026e865eeab373/deptry-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d1a00f8c9e6c0829a4a523edd5e526e3df06d2b50e0a99446f09f9723df2efad", size = 1545283, upload-time = "2024-08-27T12:18:39.166Z" }, 145 | { url = "https://files.pythonhosted.org/packages/c6/6f/999f8cdb338cceb48e2d05e9638f988cd25d4971d1882e251691ecd41fa0/deptry-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e233859f150df70ffff76e95f9b7326fc25494b9beb26e776edae20f0f515e7d", size = 1677736, upload-time = "2024-08-27T12:18:31.051Z" }, 146 | { url = "https://files.pythonhosted.org/packages/a0/06/2fffc44168e139619c83de0a2af293c88c08879b93de72b3041a3b4e0eed/deptry-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f92e7e97ef42477717747b190bc6796ab94b35655af126d8c577f7eae0eb3a9", size = 1707537, upload-time = "2024-08-27T12:18:34.917Z" }, 147 | { url = "https://files.pythonhosted.org/packages/fa/a8/f5465abf491f945175d60f4a52f5c1b8bec7d58bfce41a6dc5d5894fc7b3/deptry-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f6cee6005997791bb77155667be055333fb63ae9a24f0f103f25faf1e7affe34", size = 1493191, upload-time = "2024-08-27T12:18:51.711Z" }, 148 | ] 149 | 150 | [[package]] 151 | name = "deptry" 152 | version = "0.23.0" 153 | source = { registry = "https://pypi.org/simple" } 154 | resolution-markers = [ 155 | "python_full_version >= '3.10'", 156 | "python_full_version == '3.9.*'", 157 | ] 158 | dependencies = [ 159 | { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, 160 | { name = "click", version = "8.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, 161 | { name = "colorama", marker = "python_full_version >= '3.9' and sys_platform == 'win32'" }, 162 | { name = "packaging", marker = "python_full_version >= '3.9'" }, 163 | { name = "requirements-parser", marker = "python_full_version >= '3.9'" }, 164 | { name = "tomli", marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, 165 | ] 166 | sdist = { url = "https://files.pythonhosted.org/packages/52/7e/75a1990a7244a3d3c5364353ac76f1173aa568a67793199d09f995b66c29/deptry-0.23.0.tar.gz", hash = "sha256:4915a3590ccf38ad7a9176aee376745aa9de121f50f8da8fb9ccec87fa93e676", size = 200920, upload-time = "2025-01-25T17:01:48.052Z" } 167 | wheels = [ 168 | { url = "https://files.pythonhosted.org/packages/d6/85/a8b77c8a87e7c9e81ce8437d752879b5281fd8a0b8a114c6d393f980aa72/deptry-0.23.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1f2a6817a37d76e8f6b667381b7caf6ea3e6d6c18b5be24d36c625f387c79852", size = 1756706, upload-time = "2025-01-25T17:01:45.511Z" }, 169 | { url = "https://files.pythonhosted.org/packages/53/bf/26c58af1467df6e889c6b969c27dad2c67b8bd625320d9db7d70277a222f/deptry-0.23.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:9601b64cc0aed42687fdd5c912d5f1e90d7f7333fb589b14e35bfdfebae866f3", size = 1657001, upload-time = "2025-01-25T17:01:40.913Z" }, 170 | { url = "https://files.pythonhosted.org/packages/ae/7d/b0bd6a50ec3f87b0a5ed3bff64ac2bd5bd8d3205e570bc5bc3170f26a01f/deptry-0.23.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6172b2205f6e84bcc9df25226693d4deb9576a6f746c2ace828f6d13401d357", size = 1754607, upload-time = "2025-01-25T17:01:23.211Z" }, 171 | { url = "https://files.pythonhosted.org/packages/e6/1b/79b1213bb9b58b0bcc200867cd6d64cd76ec4b9c5cdb76f95c3e6ee7b92e/deptry-0.23.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cfa4b3a46ee8a026eaa38e4b9ba43fe6036a07fe16bf0a663cb611b939f6af8", size = 1831961, upload-time = "2025-01-25T17:01:32.702Z" }, 172 | { url = "https://files.pythonhosted.org/packages/09/d6/607004f20637987d437f420f3dad4d6f1a87a4a83380ab60220397ee8fbe/deptry-0.23.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9d03cc99a61c348df92074a50e0a71b28f264f0edbf686084ca90e6fd44e3abe", size = 1932126, upload-time = "2025-01-25T17:01:28.315Z" }, 173 | { url = "https://files.pythonhosted.org/packages/ff/ff/6fff20bf2632727af55dc3a24a6f5634dcdf34fd785402a55207ba49d9cc/deptry-0.23.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9a46f78098f145100dc582a59af8548b26cdfa16cf0fbd85d2d44645e724cb6a", size = 2004755, upload-time = "2025-01-25T17:01:36.842Z" }, 174 | { url = "https://files.pythonhosted.org/packages/41/30/1b6217bdccf2144d4c3e78f89b2a84db82478b2449599c2d3b4b21a89043/deptry-0.23.0-cp39-abi3-win_amd64.whl", hash = "sha256:d53e803b280791d89a051b6183d9dc40411200e22a8ab7e6c32c6b169822a664", size = 1606944, upload-time = "2025-01-25T17:01:54.326Z" }, 175 | { url = "https://files.pythonhosted.org/packages/28/ab/47398041d11b19aa9db28f28cf076dbe42aba3e16d67d3e7911330e3a304/deptry-0.23.0-cp39-abi3-win_arm64.whl", hash = "sha256:da7678624f4626d839c8c03675452cefc59d6cf57d25c84a9711dae514719279", size = 1518394, upload-time = "2025-01-25T17:01:49.099Z" }, 176 | { url = "https://files.pythonhosted.org/packages/42/d7/23cc3de23b23e90cca281105f58c518a11c9a743b425b4a0b0670d0d784c/deptry-0.23.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:40706dcbed54141f2d23afa70a272171c8c46531cd6f0f9c8ef482c906b3cee2", size = 1755546, upload-time = "2025-01-25T17:01:46.835Z" }, 177 | { url = "https://files.pythonhosted.org/packages/e6/13/bcc3f728bafe0d2465586b5d7e519c56ff093bb8728ad2828fdf07ac1274/deptry-0.23.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:889541844092f18e7b48631852195f36c25c5afd4d7e074b19ba824b430add50", size = 1656307, upload-time = "2025-01-25T17:01:42.516Z" }, 178 | { url = "https://files.pythonhosted.org/packages/2c/1a/d1db8bc3dc4f89172cd0e8285f081c4a43d7489a7bad83572eec823840b6/deptry-0.23.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aff9156228eb16cd81792f920c1623c00cb59091ae572600ba0eac587da33c0c", size = 1753353, upload-time = "2025-01-25T17:01:26.189Z" }, 179 | { url = "https://files.pythonhosted.org/packages/eb/44/3346da11053c92dc6b4bec1b737ebe282e926cf32183ed3662c15bbca431/deptry-0.23.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:583154732cfd438a4a090b7d13d8b2016f1ac2732534f34fb689345768d8538b", size = 1831330, upload-time = "2025-01-25T17:01:34.418Z" }, 180 | { url = "https://files.pythonhosted.org/packages/85/f0/dcf9c31a7d19a54e80914c741319e2fa04e7a9ffd7fb96ee4e17d52bcb3d/deptry-0.23.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:736e7bc557aec6118b2a4d454f0d81f070782faeaa9d8d3c9a15985c9f265372", size = 1931459, upload-time = "2025-01-25T17:01:30.485Z" }, 181 | { url = "https://files.pythonhosted.org/packages/d1/18/95b9776439eac92c98095adb3cbda15588b22b229f9936df30bb10e573ad/deptry-0.23.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:5f7e4b1a5232ed6d352fca7173750610a169377d1951d3e9782947191942a765", size = 2004198, upload-time = "2025-01-25T17:01:38.926Z" }, 182 | { url = "https://files.pythonhosted.org/packages/b2/a9/ea41967d3df7665bab84f1e1e56f7f3a4131ed0a861413a2433bbd9a3c0e/deptry-0.23.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:04afae204654542406318fd3dd6f4a6697579597f37195437daf84a53ee0ebbf", size = 1607152, upload-time = "2025-01-25T17:01:55.714Z" }, 183 | ] 184 | 185 | [[package]] 186 | name = "distlib" 187 | version = "0.3.8" 188 | source = { registry = "https://pypi.org/simple" } 189 | sdist = { url = "https://files.pythonhosted.org/packages/c4/91/e2df406fb4efacdf46871c25cde65d3c6ee5e173b7e5a4547a47bae91920/distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64", size = 609931, upload-time = "2023-12-12T07:14:03.091Z" } 190 | wheels = [ 191 | { url = "https://files.pythonhosted.org/packages/8e/41/9307e4f5f9976bc8b7fea0b66367734e8faf3ec84bc0d412d8cfabbb66cd/distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", size = 468850, upload-time = "2023-12-12T07:13:59.966Z" }, 192 | ] 193 | 194 | [[package]] 195 | name = "exceptiongroup" 196 | version = "1.2.0" 197 | source = { registry = "https://pypi.org/simple" } 198 | sdist = { url = "https://files.pythonhosted.org/packages/8e/1c/beef724eaf5b01bb44b6338c8c3494eff7cab376fab4904cfbbc3585dc79/exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68", size = 26264, upload-time = "2023-11-21T08:42:17.407Z" } 199 | wheels = [ 200 | { url = "https://files.pythonhosted.org/packages/b8/9a/5028fd52db10e600f1c4674441b968cf2ea4959085bfb5b99fb1250e5f68/exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", size = 16210, upload-time = "2023-11-21T08:42:15.525Z" }, 201 | ] 202 | 203 | [[package]] 204 | name = "filelock" 205 | version = "3.13.1" 206 | source = { registry = "https://pypi.org/simple" } 207 | sdist = { url = "https://files.pythonhosted.org/packages/70/70/41905c80dcfe71b22fb06827b8eae65781783d4a14194bce79d16a013263/filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e", size = 14553, upload-time = "2023-10-30T18:29:39.035Z" } 208 | wheels = [ 209 | { url = "https://files.pythonhosted.org/packages/81/54/84d42a0bee35edba99dee7b59a8d4970eccdd44b99fe728ed912106fc781/filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c", size = 11740, upload-time = "2023-10-30T18:29:37.267Z" }, 210 | ] 211 | 212 | [[package]] 213 | name = "hatchling" 214 | version = "1.27.0" 215 | source = { registry = "https://pypi.org/simple" } 216 | dependencies = [ 217 | { name = "packaging" }, 218 | { name = "pathspec" }, 219 | { name = "pluggy" }, 220 | { name = "tomli", marker = "python_full_version < '3.11'" }, 221 | { name = "trove-classifiers" }, 222 | ] 223 | sdist = { url = "https://files.pythonhosted.org/packages/8f/8a/cc1debe3514da292094f1c3a700e4ca25442489731ef7c0814358816bb03/hatchling-1.27.0.tar.gz", hash = "sha256:971c296d9819abb3811112fc52c7a9751c8d381898f36533bb16f9791e941fd6", size = 54983, upload-time = "2024-12-15T17:08:11.894Z" } 224 | wheels = [ 225 | { url = "https://files.pythonhosted.org/packages/08/e7/ae38d7a6dfba0533684e0b2136817d667588ae3ec984c1a4e5df5eb88482/hatchling-1.27.0-py3-none-any.whl", hash = "sha256:d3a2f3567c4f926ea39849cdf924c7e99e6686c9c8e288ae1037c8fa2a5d937b", size = 75794, upload-time = "2024-12-15T17:08:10.364Z" }, 226 | ] 227 | 228 | [[package]] 229 | name = "identify" 230 | version = "2.5.35" 231 | source = { registry = "https://pypi.org/simple" } 232 | sdist = { url = "https://files.pythonhosted.org/packages/c4/ba/680e84c24284eba70aebaaa90d03bd039453419151b0e6f92cd36bf69dd5/identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791", size = 99009, upload-time = "2024-02-18T18:13:07.623Z" } 233 | wheels = [ 234 | { url = "https://files.pythonhosted.org/packages/f7/c8/78c694ee4a51677c68796ba11aa36004cde895b451eb59fa23b26a600de3/identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e", size = 98943, upload-time = "2024-02-18T18:13:05.132Z" }, 235 | ] 236 | 237 | [[package]] 238 | name = "iniconfig" 239 | version = "2.0.0" 240 | source = { registry = "https://pypi.org/simple" } 241 | sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646, upload-time = "2023-01-07T11:08:11.254Z" } 242 | wheels = [ 243 | { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892, upload-time = "2023-01-07T11:08:09.864Z" }, 244 | ] 245 | 246 | [[package]] 247 | name = "mypy" 248 | version = "1.8.0" 249 | source = { registry = "https://pypi.org/simple" } 250 | dependencies = [ 251 | { name = "mypy-extensions" }, 252 | { name = "tomli", marker = "python_full_version < '3.11'" }, 253 | { name = "typing-extensions" }, 254 | ] 255 | sdist = { url = "https://files.pythonhosted.org/packages/16/22/25fac51008f0a4b2186da0dba3039128bd75d3fab8c07acd3ea5894f95cc/mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07", size = 2990299, upload-time = "2023-12-21T16:29:33.134Z" } 256 | wheels = [ 257 | { url = "https://files.pythonhosted.org/packages/6d/6c/c33a5d50776a769be7ed7ca6709003c99aecd43913b9d82914bc72f154d8/mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3", size = 10913063, upload-time = "2023-12-21T16:28:31.974Z" }, 258 | { url = "https://files.pythonhosted.org/packages/08/d1/a9c12c6890c789fd965ade8b37bef1989f649e87c62fde3df658dff394fc/mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4", size = 9956736, upload-time = "2023-12-21T16:29:00.432Z" }, 259 | { url = "https://files.pythonhosted.org/packages/f1/48/e78aa47176bf7c24beb321031043d7c9c99035d816a6eca32d13cc59736f/mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d", size = 12516409, upload-time = "2023-12-21T16:28:38.435Z" }, 260 | { url = "https://files.pythonhosted.org/packages/76/5c/663409829016ca450b68b163cc36c67e0690c546e44923764043b85c175d/mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9", size = 12582018, upload-time = "2023-12-21T16:28:52.824Z" }, 261 | { url = "https://files.pythonhosted.org/packages/35/9a/3179c5efd023b2ecb88a80307581aeb005bdffe24ff53a33b261075f15d5/mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410", size = 9214316, upload-time = "2023-12-21T16:28:34.746Z" }, 262 | { url = "https://files.pythonhosted.org/packages/d6/c4/2ce11ff9ba6c9c9e89df5049ab2325c85e60274194d6816e352926de5684/mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae", size = 10795101, upload-time = "2023-12-21T16:29:27.049Z" }, 263 | { url = "https://files.pythonhosted.org/packages/bb/b7/882110d1345847ce660c51fc83b3b590b9512ec2ea44e6cfd629a7d66146/mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3", size = 9849744, upload-time = "2023-12-21T16:28:28.884Z" }, 264 | { url = "https://files.pythonhosted.org/packages/19/c6/256f253cb3fc6b30b93a9836cf3c816a3ec09f934f7b567f693e5666d14f/mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817", size = 12391778, upload-time = "2023-12-21T16:28:17.728Z" }, 265 | { url = "https://files.pythonhosted.org/packages/66/19/e0c9373258f3e84e1e24af357e5663e6b0058bb5c307287e9d1a473a9687/mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d", size = 12461242, upload-time = "2023-12-21T16:29:07.651Z" }, 266 | { url = "https://files.pythonhosted.org/packages/a9/d7/a7ee8ca5a963b5bf55a6b4bc579df77c887e7fbc0910047b7d0f7750b048/mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835", size = 9205536, upload-time = "2023-12-21T16:28:56.76Z" }, 267 | { url = "https://files.pythonhosted.org/packages/08/24/83d9e62ab2031593e94438fdbfd2c32996f4d818be26d2dc33be6870a3a0/mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd", size = 10849520, upload-time = "2023-12-21T16:29:30.482Z" }, 268 | { url = "https://files.pythonhosted.org/packages/74/e8/30c42199bb5aefb37e02a9bece41f6a62a60a1c427cab8643bc0e7886df1/mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55", size = 9812231, upload-time = "2023-12-21T16:28:06.606Z" }, 269 | { url = "https://files.pythonhosted.org/packages/a6/70/49e9dc3d4ef98c22e09f1d7b0195833ad7eeda19a24fcc42bf1b62c89110/mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218", size = 12422003, upload-time = "2023-12-21T16:28:01.87Z" }, 270 | { url = "https://files.pythonhosted.org/packages/33/14/902484951fa662ee6e044087a50dab4b16b534920dda2eea9380ce2e7b2d/mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3", size = 12497387, upload-time = "2023-12-21T16:29:17.389Z" }, 271 | { url = "https://files.pythonhosted.org/packages/aa/88/c6f214f1beeac9daffa1c3d0a5cbf96ee05617ca3e822c436c83f141ad8f/mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e", size = 9302230, upload-time = "2023-12-21T16:29:14.009Z" }, 272 | { url = "https://files.pythonhosted.org/packages/c4/8f/2042e7e7f19d78ce1ba7fc671700e0ba95d8b8299a86dd2646d2a1f84644/mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6", size = 10847664, upload-time = "2023-12-21T16:29:24.041Z" }, 273 | { url = "https://files.pythonhosted.org/packages/04/8a/1b8c19dd00eb21ad3170762202e4cb82de7c4af0fbd4a4fb7524606858ba/mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66", size = 9909951, upload-time = "2023-12-21T16:29:10.788Z" }, 274 | { url = "https://files.pythonhosted.org/packages/54/46/4681859453851b40e1c135ba589cde1fce915177c8f213e2aaeb57e1f209/mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6", size = 12467138, upload-time = "2023-12-21T16:28:23.77Z" }, 275 | { url = "https://files.pythonhosted.org/packages/cf/e6/ff8f978edb778452748a3228c014b55d6585cccf62f80323eab391d2b811/mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d", size = 12520981, upload-time = "2023-12-21T16:28:41.827Z" }, 276 | { url = "https://files.pythonhosted.org/packages/aa/ba/52b3b8c439284b560697da65cee3e0ff0776beab29f3366f60dd4bcf1a92/mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02", size = 9195641, upload-time = "2023-12-21T16:28:49.318Z" }, 277 | { url = "https://files.pythonhosted.org/packages/77/66/c79c051c1cc01c275e5d71acadf831aeef3099272e78c7d8b0685be0a567/mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8", size = 10909314, upload-time = "2023-12-21T16:29:20.979Z" }, 278 | { url = "https://files.pythonhosted.org/packages/6a/86/e37ae331e2ec831619db70db4e32e9635dc669db940318c297cf248832d8/mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259", size = 9951763, upload-time = "2023-12-21T16:28:09.903Z" }, 279 | { url = "https://files.pythonhosted.org/packages/86/5c/cbf921a0048926c4386410539ff4c3f08448684a92d9c8e73e692f1db154/mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b", size = 12512011, upload-time = "2023-12-21T16:29:04.451Z" }, 280 | { url = "https://files.pythonhosted.org/packages/41/6b/25e22dfc730bf698be85600339edefd5d07efe7436cce765631c170a9c31/mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592", size = 12579006, upload-time = "2023-12-21T16:28:13.877Z" }, 281 | { url = "https://files.pythonhosted.org/packages/21/f5/b2dcd2e10dcc6f4f0670a7a45195071a52a925fefe99268e5e51ce77e5b2/mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a", size = 9210149, upload-time = "2023-12-21T16:28:44.978Z" }, 282 | { url = "https://files.pythonhosted.org/packages/3a/e3/b582bff8e2fc7056a8a00ec06d2ac3509fc9595af9954099ed70e0418ac3/mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d", size = 2553257, upload-time = "2023-12-21T16:28:20.857Z" }, 283 | ] 284 | 285 | [[package]] 286 | name = "mypy-extensions" 287 | version = "1.0.0" 288 | source = { registry = "https://pypi.org/simple" } 289 | sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433, upload-time = "2023-02-04T12:11:27.157Z" } 290 | wheels = [ 291 | { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695, upload-time = "2023-02-04T12:11:25.002Z" }, 292 | ] 293 | 294 | [[package]] 295 | name = "nodeenv" 296 | version = "1.8.0" 297 | source = { registry = "https://pypi.org/simple" } 298 | dependencies = [ 299 | { name = "setuptools" }, 300 | ] 301 | sdist = { url = "https://files.pythonhosted.org/packages/48/92/8e83a37d3f4e73c157f9fcf9fb98ca39bd94701a469dc093b34dca31df65/nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2", size = 36669, upload-time = "2023-05-12T08:10:14.224Z" } 302 | wheels = [ 303 | { url = "https://files.pythonhosted.org/packages/1a/e6/6d2ead760a9ddb35e65740fd5a57e46aadd7b0c49861ab24f94812797a1c/nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec", size = 22136, upload-time = "2023-05-12T08:09:57.672Z" }, 304 | ] 305 | 306 | [[package]] 307 | name = "packaging" 308 | version = "25.0" 309 | source = { registry = "https://pypi.org/simple" } 310 | sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } 311 | wheels = [ 312 | { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, 313 | ] 314 | 315 | [[package]] 316 | name = "pathspec" 317 | version = "0.12.1" 318 | source = { registry = "https://pypi.org/simple" } 319 | sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } 320 | wheels = [ 321 | { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, 322 | ] 323 | 324 | [[package]] 325 | name = "platformdirs" 326 | version = "4.2.0" 327 | source = { registry = "https://pypi.org/simple" } 328 | sdist = { url = "https://files.pythonhosted.org/packages/96/dc/c1d911bf5bb0fdc58cc05010e9f3efe3b67970cef779ba7fbc3183b987a8/platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768", size = 20055, upload-time = "2024-01-31T01:00:36.02Z" } 329 | wheels = [ 330 | { url = "https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", size = 17717, upload-time = "2024-01-31T01:00:34.019Z" }, 331 | ] 332 | 333 | [[package]] 334 | name = "pluggy" 335 | version = "1.5.0" 336 | source = { registry = "https://pypi.org/simple" } 337 | sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } 338 | wheels = [ 339 | { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, 340 | ] 341 | 342 | [[package]] 343 | name = "pre-commit" 344 | version = "3.5.0" 345 | source = { registry = "https://pypi.org/simple" } 346 | dependencies = [ 347 | { name = "cfgv" }, 348 | { name = "identify" }, 349 | { name = "nodeenv" }, 350 | { name = "pyyaml" }, 351 | { name = "virtualenv" }, 352 | ] 353 | sdist = { url = "https://files.pythonhosted.org/packages/04/b3/4ae08d21eb097162f5aad37f4585f8069a86402ed7f5362cc9ae097f9572/pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32", size = 177079, upload-time = "2023-10-13T15:57:48.334Z" } 354 | wheels = [ 355 | { url = "https://files.pythonhosted.org/packages/6c/75/526915fedf462e05eeb1c75ceaf7e3f9cde7b5ce6f62740fe5f7f19a0050/pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660", size = 203698, upload-time = "2023-10-13T15:57:46.378Z" }, 356 | ] 357 | 358 | [[package]] 359 | name = "pytest" 360 | version = "8.3.1" 361 | source = { registry = "https://pypi.org/simple" } 362 | dependencies = [ 363 | { name = "colorama", marker = "sys_platform == 'win32'" }, 364 | { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, 365 | { name = "iniconfig" }, 366 | { name = "packaging" }, 367 | { name = "pluggy" }, 368 | { name = "tomli", marker = "python_full_version < '3.11'" }, 369 | ] 370 | sdist = { url = "https://files.pythonhosted.org/packages/bc/7f/a6f79e033aa8318b6dfe2173fa6409ee75dafccf409d90884bf921433d88/pytest-8.3.1.tar.gz", hash = "sha256:7e8e5c5abd6e93cb1cc151f23e57adc31fcf8cfd2a3ff2da63e23f732de35db6", size = 1438997, upload-time = "2024-07-20T16:25:02.851Z" } 371 | wheels = [ 372 | { url = "https://files.pythonhosted.org/packages/b9/77/ccea391104f576a6e54a54334fc26d29c28aa0ec85714c781fbd2c34ac86/pytest-8.3.1-py3-none-any.whl", hash = "sha256:e9600ccf4f563976e2c99fa02c7624ab938296551f280835ee6516df8bc4ae8c", size = 341628, upload-time = "2024-07-20T16:24:59.674Z" }, 373 | ] 374 | 375 | [[package]] 376 | name = "pytest-cov" 377 | version = "4.1.0" 378 | source = { registry = "https://pypi.org/simple" } 379 | dependencies = [ 380 | { name = "coverage", extra = ["toml"] }, 381 | { name = "pytest" }, 382 | ] 383 | sdist = { url = "https://files.pythonhosted.org/packages/7a/15/da3df99fd551507694a9b01f512a2f6cf1254f33601605843c3775f39460/pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", size = 63245, upload-time = "2023-05-24T18:44:56.845Z" } 384 | wheels = [ 385 | { url = "https://files.pythonhosted.org/packages/a7/4b/8b78d126e275efa2379b1c2e09dc52cf70df16fc3b90613ef82531499d73/pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a", size = 21949, upload-time = "2023-05-24T18:44:54.079Z" }, 386 | ] 387 | 388 | [[package]] 389 | name = "pytest-deadfixtures" 390 | version = "2.2.1" 391 | source = { registry = "https://pypi.org/simple" } 392 | dependencies = [ 393 | { name = "pytest" }, 394 | ] 395 | sdist = { url = "https://files.pythonhosted.org/packages/c5/d5/0472e7dd4c5794cd720f8add3ba59b35e45c1bb7482e04b6d6e60ff4eed0/pytest-deadfixtures-2.2.1.tar.gz", hash = "sha256:ca15938a4e8330993ccec9c6c847383d88b3cd574729530647dc6b492daa9c1e", size = 6616, upload-time = "2020-07-23T11:58:09.465Z" } 396 | wheels = [ 397 | { url = "https://files.pythonhosted.org/packages/4a/c7/d8c3fa6d2de6814c92161fcce984a7d38a63186590a66238e7b749f7fe37/pytest_deadfixtures-2.2.1-py2.py3-none-any.whl", hash = "sha256:db71533f2d9456227084e00a1231e732973e299ccb7c37ab92e95032ab6c083e", size = 5059, upload-time = "2020-07-23T11:58:11.538Z" }, 398 | ] 399 | 400 | [[package]] 401 | name = "pytest-fixture-classes" 402 | version = "1.0.3" 403 | source = { registry = "https://pypi.org/simple" } 404 | dependencies = [ 405 | { name = "pytest" }, 406 | { name = "typing-extensions" }, 407 | ] 408 | sdist = { url = "https://files.pythonhosted.org/packages/64/64/b73a75449af548c3cd4ae3fc04b05aead53444f95ef0fef0c7c77cad3198/pytest_fixture_classes-1.0.3.tar.gz", hash = "sha256:5aee41a63dbd2d6317ce5a5587a9cfc5a0f825589cb0e0c456b1c3c6d8edfa5a", size = 5542, upload-time = "2023-09-02T17:06:17.8Z" } 409 | wheels = [ 410 | { url = "https://files.pythonhosted.org/packages/17/05/8b2e512f68ac726d19ee9d75c2f786fdb9ac62651ac89e114893704e5bbf/pytest_fixture_classes-1.0.3-py3-none-any.whl", hash = "sha256:0b1b3f0d2ccaa6fb620cbd9bf1b228979c5a1590627e6d0961fb73d29629221a", size = 5484, upload-time = "2023-09-02T17:06:15.844Z" }, 411 | ] 412 | 413 | [[package]] 414 | name = "pytest-lazy-fixtures" 415 | version = "0.0.0" 416 | source = { editable = "." } 417 | dependencies = [ 418 | { name = "pytest" }, 419 | ] 420 | 421 | [package.dev-dependencies] 422 | dev = [ 423 | { name = "deptry", version = "0.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, 424 | { name = "deptry", version = "0.23.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, 425 | { name = "hatchling" }, 426 | { name = "mypy" }, 427 | { name = "pre-commit" }, 428 | { name = "pytest-cov" }, 429 | { name = "pytest-deadfixtures" }, 430 | { name = "pytest-fixture-classes" }, 431 | { name = "ruff" }, 432 | ] 433 | 434 | [package.metadata] 435 | requires-dist = [{ name = "pytest", specifier = ">=7" }] 436 | 437 | [package.metadata.requires-dev] 438 | dev = [ 439 | { name = "deptry", specifier = ">=0.20.0" }, 440 | { name = "hatchling", specifier = ">=1.27.0" }, 441 | { name = "mypy", specifier = ">=1.8.0,<2" }, 442 | { name = "pre-commit", specifier = ">=3.5.0,<4" }, 443 | { name = "pytest-cov", specifier = ">=4.1.0,<5" }, 444 | { name = "pytest-deadfixtures", specifier = ">=2.2.1" }, 445 | { name = "pytest-fixture-classes", specifier = ">=1.0.3" }, 446 | { name = "ruff", specifier = ">=0.3.0,<0.13" }, 447 | ] 448 | 449 | [[package]] 450 | name = "pyyaml" 451 | version = "6.0.1" 452 | source = { registry = "https://pypi.org/simple" } 453 | sdist = { url = "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", size = 125201, upload-time = "2023-07-18T00:00:23.308Z" } 454 | wheels = [ 455 | { url = "https://files.pythonhosted.org/packages/96/06/4beb652c0fe16834032e54f0956443d4cc797fe645527acee59e7deaa0a2/PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", size = 189447, upload-time = "2023-07-17T23:57:04.325Z" }, 456 | { url = "https://files.pythonhosted.org/packages/5b/07/10033a403b23405a8fc48975444463d3d10a5c2736b7eb2550b07b367429/PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f", size = 169264, upload-time = "2023-07-17T23:57:07.787Z" }, 457 | { url = "https://files.pythonhosted.org/packages/f1/26/55e4f21db1f72eaef092015d9017c11510e7e6301c62a6cfee91295d13c6/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", size = 677003, upload-time = "2023-07-17T23:57:13.144Z" }, 458 | { url = "https://files.pythonhosted.org/packages/ba/91/090818dfa62e85181f3ae23dd1e8b7ea7f09684864a900cab72d29c57346/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", size = 699070, upload-time = "2023-07-17T23:57:19.402Z" }, 459 | { url = "https://files.pythonhosted.org/packages/29/61/bf33c6c85c55bc45a29eee3195848ff2d518d84735eb0e2d8cb42e0d285e/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", size = 705525, upload-time = "2023-07-17T23:57:25.272Z" }, 460 | { url = "https://files.pythonhosted.org/packages/07/91/45dfd0ef821a7f41d9d0136ea3608bb5b1653e42fd56a7970532cb5c003f/PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", size = 707514, upload-time = "2023-08-28T18:43:20.945Z" }, 461 | { url = "https://files.pythonhosted.org/packages/b6/a0/b6700da5d49e9fed49dc3243d3771b598dad07abb37cc32e524607f96adc/PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", size = 130488, upload-time = "2023-07-17T23:57:28.144Z" }, 462 | { url = "https://files.pythonhosted.org/packages/24/97/9b59b43431f98d01806b288532da38099cc6f2fea0f3d712e21e269c0279/PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", size = 145338, upload-time = "2023-07-17T23:57:31.118Z" }, 463 | { url = "https://files.pythonhosted.org/packages/ec/0d/26fb23e8863e0aeaac0c64e03fd27367ad2ae3f3cccf3798ee98ce160368/PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", size = 187867, upload-time = "2023-07-17T23:57:34.35Z" }, 464 | { url = "https://files.pythonhosted.org/packages/28/09/55f715ddbf95a054b764b547f617e22f1d5e45d83905660e9a088078fe67/PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", size = 167530, upload-time = "2023-07-17T23:57:36.975Z" }, 465 | { url = "https://files.pythonhosted.org/packages/5e/94/7d5ee059dfb92ca9e62f4057dcdec9ac08a9e42679644854dc01177f8145/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", size = 732244, upload-time = "2023-07-17T23:57:43.774Z" }, 466 | { url = "https://files.pythonhosted.org/packages/06/92/e0224aa6ebf9dc54a06a4609da37da40bb08d126f5535d81bff6b417b2ae/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", size = 752871, upload-time = "2023-07-17T23:57:51.921Z" }, 467 | { url = "https://files.pythonhosted.org/packages/7b/5e/efd033ab7199a0b2044dab3b9f7a4f6670e6a52c089de572e928d2873b06/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", size = 757729, upload-time = "2023-07-17T23:57:59.865Z" }, 468 | { url = "https://files.pythonhosted.org/packages/03/5c/c4671451b2f1d76ebe352c0945d4cd13500adb5d05f5a51ee296d80152f7/PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", size = 748528, upload-time = "2023-08-28T18:43:23.207Z" }, 469 | { url = "https://files.pythonhosted.org/packages/73/9c/766e78d1efc0d1fca637a6b62cea1b4510a7fb93617eb805223294fef681/PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", size = 130286, upload-time = "2023-07-17T23:58:02.964Z" }, 470 | { url = "https://files.pythonhosted.org/packages/b3/34/65bb4b2d7908044963ebf614fe0fdb080773fc7030d7e39c8d3eddcd4257/PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", size = 144699, upload-time = "2023-07-17T23:58:05.586Z" }, 471 | { url = "https://files.pythonhosted.org/packages/bc/06/1b305bf6aa704343be85444c9d011f626c763abb40c0edc1cad13bfd7f86/PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", size = 178692, upload-time = "2023-08-28T18:43:24.924Z" }, 472 | { url = "https://files.pythonhosted.org/packages/84/02/404de95ced348b73dd84f70e15a41843d817ff8c1744516bf78358f2ffd2/PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", size = 165622, upload-time = "2023-08-28T18:43:26.54Z" }, 473 | { url = "https://files.pythonhosted.org/packages/c7/4c/4a2908632fc980da6d918b9de9c1d9d7d7e70b2672b1ad5166ed27841ef7/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", size = 696937, upload-time = "2024-01-18T20:40:22.92Z" }, 474 | { url = "https://files.pythonhosted.org/packages/b4/33/720548182ffa8344418126017aa1d4ab4aeec9a2275f04ce3f3573d8ace8/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", size = 724969, upload-time = "2023-08-28T18:43:28.56Z" }, 475 | { url = "https://files.pythonhosted.org/packages/4f/78/77b40157b6cb5f2d3d31a3d9b2efd1ba3505371f76730d267e8b32cf4b7f/PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", size = 712604, upload-time = "2023-08-28T18:43:30.206Z" }, 476 | { url = "https://files.pythonhosted.org/packages/2e/97/3e0e089ee85e840f4b15bfa00e4e63d84a3691ababbfea92d6f820ea6f21/PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", size = 126098, upload-time = "2023-08-28T18:43:31.835Z" }, 477 | { url = "https://files.pythonhosted.org/packages/2b/9f/fbade56564ad486809c27b322d0f7e6a89c01f6b4fe208402e90d4443a99/PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", size = 138675, upload-time = "2023-08-28T18:43:33.613Z" }, 478 | { url = "https://files.pythonhosted.org/packages/7f/5d/2779ea035ba1e533c32ed4a249b4e0448f583ba10830b21a3cddafe11a4e/PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", size = 191734, upload-time = "2023-07-17T23:59:13.869Z" }, 479 | { url = "https://files.pythonhosted.org/packages/e1/a1/27bfac14b90adaaccf8c8289f441e9f76d94795ec1e7a8f134d9f2cb3d0b/PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", size = 723767, upload-time = "2023-07-17T23:59:20.686Z" }, 480 | { url = "https://files.pythonhosted.org/packages/c1/39/47ed4d65beec9ce07267b014be85ed9c204fa373515355d3efa62d19d892/PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", size = 749067, upload-time = "2023-07-17T23:59:28.747Z" }, 481 | { url = "https://files.pythonhosted.org/packages/c8/6b/6600ac24725c7388255b2f5add93f91e58a5d7efaf4af244fdbcc11a541b/PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", size = 736569, upload-time = "2023-07-17T23:59:37.216Z" }, 482 | { url = "https://files.pythonhosted.org/packages/0d/46/62ae77677e532c0af6c81ddd6f3dbc16bdcc1208b077457354442d220bfb/PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", size = 787738, upload-time = "2023-08-28T18:43:35.582Z" }, 483 | { url = "https://files.pythonhosted.org/packages/d6/6a/439d1a6f834b9a9db16332ce16c4a96dd0e3970b65fe08cbecd1711eeb77/PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", size = 139797, upload-time = "2023-07-17T23:59:40.254Z" }, 484 | { url = "https://files.pythonhosted.org/packages/29/0f/9782fa5b10152abf033aec56a601177ead85ee03b57781f2d9fced09eefc/PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", size = 157350, upload-time = "2023-07-17T23:59:42.94Z" }, 485 | { url = "https://files.pythonhosted.org/packages/57/c5/5d09b66b41d549914802f482a2118d925d876dc2a35b2d127694c1345c34/PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", size = 197846, upload-time = "2023-07-17T23:59:46.424Z" }, 486 | { url = "https://files.pythonhosted.org/packages/0e/88/21b2f16cb2123c1e9375f2c93486e35fdc86e63f02e274f0e99c589ef153/PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", size = 174396, upload-time = "2023-07-17T23:59:49.538Z" }, 487 | { url = "https://files.pythonhosted.org/packages/ac/6c/967d91a8edf98d2b2b01d149bd9e51b8f9fb527c98d80ebb60c6b21d60c4/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", size = 731824, upload-time = "2023-07-17T23:59:58.111Z" }, 488 | { url = "https://files.pythonhosted.org/packages/4a/4b/c71ef18ef83c82f99e6da8332910692af78ea32bd1d1d76c9787dfa36aea/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", size = 754777, upload-time = "2023-07-18T00:00:06.716Z" }, 489 | { url = "https://files.pythonhosted.org/packages/7d/39/472f2554a0f1e825bd7c5afc11c817cd7a2f3657460f7159f691fbb37c51/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", size = 738883, upload-time = "2023-07-18T00:00:14.423Z" }, 490 | { url = "https://files.pythonhosted.org/packages/40/da/a175a35cf5583580e90ac3e2a3dbca90e43011593ae62ce63f79d7b28d92/PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", size = 750294, upload-time = "2023-08-28T18:43:37.153Z" }, 491 | { url = "https://files.pythonhosted.org/packages/24/62/7fcc372442ec8ea331da18c24b13710e010c5073ab851ef36bf9dacb283f/PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", size = 136936, upload-time = "2023-07-18T00:00:17.167Z" }, 492 | { url = "https://files.pythonhosted.org/packages/84/4d/82704d1ab9290b03da94e6425f5e87396b999fd7eb8e08f3a92c158402bf/PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", size = 152751, upload-time = "2023-07-18T00:00:19.939Z" }, 493 | ] 494 | 495 | [[package]] 496 | name = "requirements-parser" 497 | version = "0.13.0" 498 | source = { registry = "https://pypi.org/simple" } 499 | dependencies = [ 500 | { name = "packaging", marker = "python_full_version >= '3.9'" }, 501 | ] 502 | sdist = { url = "https://files.pythonhosted.org/packages/95/96/fb6dbfebb524d5601d359a47c78fe7ba1eef90fc4096404aa60c9a906fbb/requirements_parser-0.13.0.tar.gz", hash = "sha256:0843119ca2cb2331de4eb31b10d70462e39ace698fd660a915c247d2301a4418", size = 22630, upload-time = "2025-05-21T13:42:05.464Z" } 503 | wheels = [ 504 | { url = "https://files.pythonhosted.org/packages/bd/60/50fbb6ffb35f733654466f1a90d162bcbea358adc3b0871339254fbc37b2/requirements_parser-0.13.0-py3-none-any.whl", hash = "sha256:2b3173faecf19ec5501971b7222d38f04cb45bb9d87d0ad629ca71e2e62ded14", size = 14782, upload-time = "2025-05-21T13:42:04.007Z" }, 505 | ] 506 | 507 | [[package]] 508 | name = "ruff" 509 | version = "0.12.0" 510 | source = { registry = "https://pypi.org/simple" } 511 | sdist = { url = "https://files.pythonhosted.org/packages/24/90/5255432602c0b196a0da6720f6f76b93eb50baef46d3c9b0025e2f9acbf3/ruff-0.12.0.tar.gz", hash = "sha256:4d047db3662418d4a848a3fdbfaf17488b34b62f527ed6f10cb8afd78135bc5c", size = 4376101, upload-time = "2025-06-17T15:19:26.217Z" } 512 | wheels = [ 513 | { url = "https://files.pythonhosted.org/packages/e6/fd/b46bb20e14b11ff49dbc74c61de352e0dc07fb650189513631f6fb5fc69f/ruff-0.12.0-py3-none-linux_armv6l.whl", hash = "sha256:5652a9ecdb308a1754d96a68827755f28d5dfb416b06f60fd9e13f26191a8848", size = 10311554, upload-time = "2025-06-17T15:18:45.792Z" }, 514 | { url = "https://files.pythonhosted.org/packages/e7/d3/021dde5a988fa3e25d2468d1dadeea0ae89dc4bc67d0140c6e68818a12a1/ruff-0.12.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:05ed0c914fabc602fc1f3b42c53aa219e5736cb030cdd85640c32dbc73da74a6", size = 11118435, upload-time = "2025-06-17T15:18:49.064Z" }, 515 | { url = "https://files.pythonhosted.org/packages/07/a2/01a5acf495265c667686ec418f19fd5c32bcc326d4c79ac28824aecd6a32/ruff-0.12.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:07a7aa9b69ac3fcfda3c507916d5d1bca10821fe3797d46bad10f2c6de1edda0", size = 10466010, upload-time = "2025-06-17T15:18:51.341Z" }, 516 | { url = "https://files.pythonhosted.org/packages/4c/57/7caf31dd947d72e7aa06c60ecb19c135cad871a0a8a251723088132ce801/ruff-0.12.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7731c3eec50af71597243bace7ec6104616ca56dda2b99c89935fe926bdcd48", size = 10661366, upload-time = "2025-06-17T15:18:53.29Z" }, 517 | { url = "https://files.pythonhosted.org/packages/e9/ba/aa393b972a782b4bc9ea121e0e358a18981980856190d7d2b6187f63e03a/ruff-0.12.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:952d0630eae628250ab1c70a7fffb641b03e6b4a2d3f3ec6c1d19b4ab6c6c807", size = 10173492, upload-time = "2025-06-17T15:18:55.262Z" }, 518 | { url = "https://files.pythonhosted.org/packages/d7/50/9349ee777614bc3062fc6b038503a59b2034d09dd259daf8192f56c06720/ruff-0.12.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c021f04ea06966b02614d442e94071781c424ab8e02ec7af2f037b4c1e01cc82", size = 11761739, upload-time = "2025-06-17T15:18:58.906Z" }, 519 | { url = "https://files.pythonhosted.org/packages/04/8f/ad459de67c70ec112e2ba7206841c8f4eb340a03ee6a5cabc159fe558b8e/ruff-0.12.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7d235618283718ee2fe14db07f954f9b2423700919dc688eacf3f8797a11315c", size = 12537098, upload-time = "2025-06-17T15:19:01.316Z" }, 520 | { url = "https://files.pythonhosted.org/packages/ed/50/15ad9c80ebd3c4819f5bd8883e57329f538704ed57bac680d95cb6627527/ruff-0.12.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0758038f81beec8cc52ca22de9685b8ae7f7cc18c013ec2050012862cc9165", size = 12154122, upload-time = "2025-06-17T15:19:03.727Z" }, 521 | { url = "https://files.pythonhosted.org/packages/76/e6/79b91e41bc8cc3e78ee95c87093c6cacfa275c786e53c9b11b9358026b3d/ruff-0.12.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:139b3d28027987b78fc8d6cfb61165447bdf3740e650b7c480744873688808c2", size = 11363374, upload-time = "2025-06-17T15:19:05.875Z" }, 522 | { url = "https://files.pythonhosted.org/packages/db/c3/82b292ff8a561850934549aa9dc39e2c4e783ab3c21debe55a495ddf7827/ruff-0.12.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68853e8517b17bba004152aebd9dd77d5213e503a5f2789395b25f26acac0da4", size = 11587647, upload-time = "2025-06-17T15:19:08.246Z" }, 523 | { url = "https://files.pythonhosted.org/packages/2b/42/d5760d742669f285909de1bbf50289baccb647b53e99b8a3b4f7ce1b2001/ruff-0.12.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3a9512af224b9ac4757f7010843771da6b2b0935a9e5e76bb407caa901a1a514", size = 10527284, upload-time = "2025-06-17T15:19:10.37Z" }, 524 | { url = "https://files.pythonhosted.org/packages/19/f6/fcee9935f25a8a8bba4adbae62495c39ef281256693962c2159e8b284c5f/ruff-0.12.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b08df3d96db798e5beb488d4df03011874aff919a97dcc2dd8539bb2be5d6a88", size = 10158609, upload-time = "2025-06-17T15:19:12.286Z" }, 525 | { url = "https://files.pythonhosted.org/packages/37/fb/057febf0eea07b9384787bfe197e8b3384aa05faa0d6bd844b94ceb29945/ruff-0.12.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6a315992297a7435a66259073681bb0d8647a826b7a6de45c6934b2ca3a9ed51", size = 11141462, upload-time = "2025-06-17T15:19:15.195Z" }, 526 | { url = "https://files.pythonhosted.org/packages/10/7c/1be8571011585914b9d23c95b15d07eec2d2303e94a03df58294bc9274d4/ruff-0.12.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1e55e44e770e061f55a7dbc6e9aed47feea07731d809a3710feda2262d2d4d8a", size = 11641616, upload-time = "2025-06-17T15:19:17.6Z" }, 527 | { url = "https://files.pythonhosted.org/packages/6a/ef/b960ab4818f90ff59e571d03c3f992828d4683561095e80f9ef31f3d58b7/ruff-0.12.0-py3-none-win32.whl", hash = "sha256:7162a4c816f8d1555eb195c46ae0bd819834d2a3f18f98cc63819a7b46f474fb", size = 10525289, upload-time = "2025-06-17T15:19:19.688Z" }, 528 | { url = "https://files.pythonhosted.org/packages/34/93/8b16034d493ef958a500f17cda3496c63a537ce9d5a6479feec9558f1695/ruff-0.12.0-py3-none-win_amd64.whl", hash = "sha256:d00b7a157b8fb6d3827b49d3324da34a1e3f93492c1f97b08e222ad7e9b291e0", size = 11598311, upload-time = "2025-06-17T15:19:21.785Z" }, 529 | { url = "https://files.pythonhosted.org/packages/d0/33/4d3e79e4a84533d6cd526bfb42c020a23256ae5e4265d858bd1287831f7d/ruff-0.12.0-py3-none-win_arm64.whl", hash = "sha256:8cd24580405ad8c1cc64d61725bca091d6b6da7eb3d36f72cc605467069d7e8b", size = 10724946, upload-time = "2025-06-17T15:19:23.952Z" }, 530 | ] 531 | 532 | [[package]] 533 | name = "setuptools" 534 | version = "69.1.1" 535 | source = { registry = "https://pypi.org/simple" } 536 | sdist = { url = "https://files.pythonhosted.org/packages/c8/1f/e026746e5885a83e1af99002ae63650b7c577af5c424d4c27edcf729ab44/setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8", size = 2219821, upload-time = "2024-02-23T11:26:40.16Z" } 537 | wheels = [ 538 | { url = "https://files.pythonhosted.org/packages/c0/7a/3da654f49c95d0cc6e9549a855b5818e66a917e852ec608e77550c8dc08b/setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56", size = 819326, upload-time = "2024-02-23T11:26:34.624Z" }, 539 | ] 540 | 541 | [[package]] 542 | name = "tomli" 543 | version = "2.0.1" 544 | source = { registry = "https://pypi.org/simple" } 545 | sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164, upload-time = "2022-02-08T10:54:04.006Z" } 546 | wheels = [ 547 | { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757, upload-time = "2022-02-08T10:54:02.017Z" }, 548 | ] 549 | 550 | [[package]] 551 | name = "trove-classifiers" 552 | version = "2025.5.9.12" 553 | source = { registry = "https://pypi.org/simple" } 554 | sdist = { url = "https://files.pythonhosted.org/packages/38/04/1cd43f72c241fedcf0d9a18d0783953ee301eac9e5d9db1df0f0f089d9af/trove_classifiers-2025.5.9.12.tar.gz", hash = "sha256:7ca7c8a7a76e2cd314468c677c69d12cc2357711fcab4a60f87994c1589e5cb5", size = 16940, upload-time = "2025-05-09T12:04:48.829Z" } 555 | wheels = [ 556 | { url = "https://files.pythonhosted.org/packages/92/ef/c6deb083748be3bcad6f471b6ae983950c161890bf5ae1b2af80cc56c530/trove_classifiers-2025.5.9.12-py3-none-any.whl", hash = "sha256:e381c05537adac78881c8fa345fd0e9970159f4e4a04fcc42cfd3129cca640ce", size = 14119, upload-time = "2025-05-09T12:04:46.38Z" }, 557 | ] 558 | 559 | [[package]] 560 | name = "typing-extensions" 561 | version = "4.10.0" 562 | source = { registry = "https://pypi.org/simple" } 563 | sdist = { url = "https://files.pythonhosted.org/packages/16/3a/0d26ce356c7465a19c9ea8814b960f8a36c3b0d07c323176620b7b483e44/typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb", size = 77558, upload-time = "2024-02-25T22:12:49.693Z" } 564 | wheels = [ 565 | { url = "https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", size = 33926, upload-time = "2024-02-25T22:12:47.72Z" }, 566 | ] 567 | 568 | [[package]] 569 | name = "virtualenv" 570 | version = "20.25.1" 571 | source = { registry = "https://pypi.org/simple" } 572 | dependencies = [ 573 | { name = "distlib" }, 574 | { name = "filelock" }, 575 | { name = "platformdirs" }, 576 | ] 577 | sdist = { url = "https://files.pythonhosted.org/packages/93/4f/a7737e177ab67c454d7e60d48a5927f16cd05623e9dd888f78183545d250/virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197", size = 7152341, upload-time = "2024-02-22T01:45:34.754Z" } 578 | wheels = [ 579 | { url = "https://files.pythonhosted.org/packages/16/65/0d0bdfdac31e2db8c6d6c18fe1e00236f0dea279f9846f94a9aafa49cfc9/virtualenv-20.25.1-py3-none-any.whl", hash = "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a", size = 3779425, upload-time = "2024-02-22T01:45:30.943Z" }, 580 | ] 581 | --------------------------------------------------------------------------------