diff --git a/CLAUDE.md b/CLAUDE.md index b348edc8..5966a23d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,8 +17,8 @@ subspecifications that the Lean Ethereum protocol relies on. ### Running Tests ```bash -# Sync all dependencies and install packages -uv sync --all-extras +# Install and sync project and dev dependencies +uv sync # Run all tests uv run pytest @@ -42,10 +42,10 @@ uv run ruff check --fix src tests uv run mypy src tests # Run all quality checks (lint, typecheck, spellcheck) -uv run tox -e all-checks +uvx tox -e all-checks # Run everything (all checks + tests + docs) -uv run tox +uvx tox ``` ### Common Tasks @@ -81,18 +81,18 @@ uv run tox ## Common Commands Reference -| Task | Command | -|----------------------------------------|-------------------------------------| -| Install dependencies | `uv sync --all-extras` | -| Run tests | `uv run pytest` | -| Format code | `uv run ruff format src tests` | -| Lint code | `uv run ruff check src tests` | -| Fix lint errors | `uv run ruff check --fix src tests` | -| Type check | `uv run mypy src tests` | -| Build docs | `uv run mkdocs build` | -| Serve docs | `uv run mkdocs serve` | -| Run all quality checks (no tests/docs) | `uv run tox -e all-checks` | -| Run everything (checks + tests + docs) | `uv run tox` | +| Task | Command | +|-----------------------------------------------|----------------------------------| +| Install and sync project and dev dependencies | `uv sync` | +| Run tests | `uv run pytest` | +| Format code | `uv run ruff format src tests` | +| Lint code | `uv run ruff check src tests` | +| Fix lint errors | `uv run ruff check --fix src tests` | +| Type check | `uv run mypy src tests` | +| Build docs | `uv run mkdocs build` | +| Serve docs | `uv run mkdocs serve` | +| Run all quality checks (no tests/docs) | `uvx tox -e all-checks` | +| Run everything (checks + tests + docs) | `uvx tox` | ## Important Notes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 89bbbd43..d04d50d2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,9 +3,9 @@ ## Quick Start 1. Fork and clone the repository -2. Install dependencies: `uv sync --all-extras` +2. Install dependencies: `uv sync` 3. Make your changes -4. Run checks: `uv run tox -e all-checks` +4. Run checks: `uvx tox -e all-checks` 5. Run tests: `uv run pytest` 6. Submit a pull request @@ -22,7 +22,7 @@ - **Type hints**: Required for all functions and methods - **Docstrings**: Use Google style for public APIs - **Line length**: 79 characters (enforced by ruff) -- **Formatting**: Run `uv run tox -e fix` to auto-format +- **Formatting**: Run `uvx tox -e fix` to auto-format ## Adding New Subspecifications diff --git a/README.md b/README.md index 0d35dacf..51f50b35 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,8 @@ uv python install 3.12 git clone https://github.com/leanEthereum/leanSpec leanSpec cd leanSpec -# Install dependencies -uv sync --all-extras +# Install and sync project and dev dependencies, using `uv.lock` versions +uv sync # Run tests to verify setup uv run pytest @@ -61,11 +61,8 @@ uv run pytest ### Workspace Commands ```bash -# Install package and required dependencies or re-sync workspace +# Install package and dev dependencies or re-sync workspace uv sync - -# Install package along with all dependencies, including optional / extras -uv sync --all-extras ``` ## Development Workflow @@ -104,30 +101,17 @@ uv run mypy src tests ### Using Tox for Comprehensive Checks -After running `uv sync --all-extras`, you can use tox with `uv run`: - -```bash -# Run all quality checks (lint, typecheck, spellcheck) -uv run tox -e all-checks - -# Run all tox environments (all checks + tests + docs) -uv run tox - -# Run specific environment -uv run tox -e lint -``` - -**Alternative: Using uvx (no setup required)** - -If you haven't run `uv sync --all-extras` or want to use tox in isolation, -you can use `uvx`, which: - -* Creates a temporary environment just for tox +You can use `tox` with `uvx`, which: +* Creates a temporary environment just for `tox` * Doesn't require `uv sync` first -* Uses tox-uv for faster dependency installation +* Uses `tox-uv` for faster dependency installation ```bash +# Run specific environment, like "all quality checks" (lint, typecheck, spellcheck) uvx tox -e all-checks + +# Run all tox environments (all checks + tests + docs) +uvx tox ``` ### Documentation @@ -186,33 +170,24 @@ def test_withdrawal_amount_above_uint64_max(): - **uv**: Fast Python package manager - like npm/yarn but for Python - **ruff**: Linter and formatter - **mypy**: Type checker that works with Pydantic models -- **tox**: Automation tool for running tests across multiple environments +- **tox**: Automation tool for running tests across multiple environments (used via `uvx`) - **mkdocs**: Documentation generator - write docs in Markdown, serve them locally ## Common Commands Reference -| Task | Command | -|----------------------------------------|-------------------------------------| -| Install dependencies | `uv sync --all-extras` | -| Run tests | `uv run pytest` | -| Format code | `uv run ruff format src tests` | -| Lint code | `uv run ruff check src tests` | -| Fix lint errors | `uv run ruff check --fix src tests` | -| Type check | `uv run mypy src tests` | -| Build docs | `uv run mkdocs build` | -| Serve docs | `uv run mkdocs serve` | -| Run all quality checks (no tests/docs) | `uv run tox -e all-checks` | -| Run everything (checks + tests + docs) | `uv run tox` | -| Run specific tox environment | `uv run tox -e lint` | - -If you have not run `uv sync --all-extras` or want to use `tox` in isolation, -you can use `uvx`: - -| Task | Command | -|-----------------------------------------|---------------------------------------| -| Run all quality checks (no tests/docs) | `uvx tox -e all-checks` | -| Run everything (checks + tests + docs) | `uvx tox` | -| Run specific tox environment | `uvx tox -e lint` | +| Task | Command | +|-----------------------------------------------|------------------------------------| +| Install and sync project and dev dependencies | `uv sync` | +| Run tests | `uv run pytest` | +| Format code | `uv run ruff format src tests` | +| Lint code | `uv run ruff check src tests` | +| Fix lint errors | `uv run ruff check --fix src tests` | +| Type check | `uv run mypy src tests` | +| Build docs | `uv run mkdocs build` | +| Serve docs | `uv run mkdocs serve` | +| Run all quality checks (no tests/docs) | `uvx tox -e all-checks` | +| Run everything (checks + tests + docs) | `uvx tox` | +| Run specific tox environment | `uvx tox -e lint` | ## Contributing diff --git a/pyproject.toml b/pyproject.toml index 700abe6a..34a19d10 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,26 +31,6 @@ dependencies = ["pydantic>=2.12.0,<3", "typing-extensions>=4.4"] [project.license] file = "LICENSE" -[project.optional-dependencies] -test = ["pytest>=8.3.3,<9", "pytest-cov>=6.0.0,<7", "pytest-xdist>=3.6.1,<4", "hypothesis>=6.138.14"] -lint = ["ruff>=0.11.8,<1"] -typecheck = ["mypy>=1.15.0,<1.16"] -docs = [ - "mkdocs>=1.6.1,<2", - "mkdocs-material>=9.5.45,<10", - "mkdocstrings[python]>=0.27.0,<1", - "codespell>=2.4.1,<3", - "pyspelling>=2.8.2,<3", -] -dev = ["lean-spec[test,lint,typecheck,docs]", "tox>=4.23.0,<5", "tox-uv>=1.29.0"] -mdformat = [ - "mdformat-gfm-alerts==2.0.0", - "mdformat-gfm==0.4.1", - "mdformat-ruff==0.1.3", - "mdformat-toc==0.3.0", - "mdformat==0.7.22", -] - [project.urls] Homepage = "https://github.com/leanEthereum/lean-spec" Source = "https://github.com/leanEthereum/lean-spec" @@ -122,9 +102,30 @@ wrap = 80 [dependency-groups] dev = [ + # debugging / convenience "ipython>=8.31.0,<9", "ipdb>=0.13", "tomli-w>=1.0.0", + # packaging "build>=1.2.0,<2", "twine>=5.1.0,<6", + # test dependencies + "pytest>=8.3.3,<9", + "pytest-cov>=6.0.0,<7", + "pytest-xdist>=3.6.1,<4", + "hypothesis>=6.138.14", + # docs + "mkdocs>=1.6.1,<2", + "mkdocs-material>=9.5.45,<10", + "mkdocstrings[python]>=0.27.0,<1", + "pyspelling>=2.8.2,<3", + "mdformat-gfm-alerts==2.0.0", + "mdformat-gfm==0.4.1", + "mdformat-ruff==0.1.3", + "mdformat-toc==0.3.0", + "mdformat==0.7.22", + # dev + "ruff>=0.11.8,<1", + "mypy>=1.15.0,<1.16", + "codespell>=2.4.1,<3", ] diff --git a/tox.ini b/tox.ini index 7dbd7779..085d6f6b 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,7 @@ [tox] min_version = 4.0 requires = + tox >=4.23.0,<5 tox-uv >=1.29 env_list = all-checks @@ -12,15 +13,10 @@ runner = uv-venv-lock-runner [testenv] basepython = python3.14 uv_python = >=3.12 +dependency_groups = dev [testenv:all-checks] description = Run all quality checks (lint, typecheck, spellcheck, mdformat) -extras = - lint - typecheck - test - docs - mdformat commands = {[testenv:lint]commands} {[testenv:typecheck]commands} @@ -29,52 +25,41 @@ commands = [testenv:lint] description = Lint and code formatting checks (ruff) -extras = lint commands = ruff check --no-fix --show-fixes src tests ruff format --check src tests [testenv:fix] description = Auto-fix linting and formatting issues (ruff) -extras = lint commands = ruff check --fix src tests ruff format src tests [testenv:typecheck] description = Run type checking (mypy) -extras = - typecheck - test commands = mypy src tests [testenv:spellcheck] description = Run spell checking (codespell) -extras = docs commands = codespell src tests docs README.md CLAUDE.md --skip="*.lock,*.svg,.git,__pycache__,.mypy_cache,.pytest_cache" --ignore-words=.codespell-ignore-words.txt [testenv:mdformat] description = Check markdown formatting for docs (mdformat) -extras = mdformat commands = mdformat docs/ [testenv:pytest] description = Run tests (pytest) -extras = test # parallelize with `auto` but keep max processes reasonable for CI commands = pytest {posargs} tests -n auto --maxprocesses=10 --durations=10 --dist=worksteal [testenv:pytest-cov] description = Run tests with coverage (pytest) -extras = test commands = pytest --cov --cov-report=html --cov-report=term {posargs} [testenv:docs] description = Serve documentation locally (mkdocs) -extras = docs commands = mkdocs serve {posargs} [testenv:docs-build] description = Build documentation (mkdocs) -extras = docs commands = mkdocs build {posargs} diff --git a/uv.lock b/uv.lock index 5f0d71a9..3e0ac560 100644 --- a/uv.lock +++ b/uv.lock @@ -88,15 +88,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl", hash = "sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4", size = 23382, upload-time = "2025-08-01T21:27:07.844Z" }, ] -[[package]] -name = "cachetools" -version = "6.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/7e/b975b5814bd36faf009faebe22c1072a1fa1168db34d285ef0ba071ad78c/cachetools-6.2.1.tar.gz", hash = "sha256:3f391e4bd8f8bf0931169baf7456cc822705f4e2a31f840d218f445b9a854201", size = 31325, upload-time = "2025-10-12T14:55:30.139Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/96/c5/1e741d26306c42e2bf6ab740b2202872727e0f606033c9dd713f8b93f5a8/cachetools-6.2.1-py3-none-any.whl", hash = "sha256:09868944b6dde876dfd44e1d47e18484541eaf12f26f29b7af91b26cc892d701", size = 11280, upload-time = "2025-10-12T14:55:28.382Z" }, -] - [[package]] name = "certifi" version = "2025.10.5" @@ -143,15 +134,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, ] -[[package]] -name = "chardet" -version = "5.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618, upload-time = "2023-08-01T19:23:02.662Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload-time = "2023-08-01T19:23:00.661Z" }, -] - [[package]] name = "charset-normalizer" version = "3.4.4" @@ -366,15 +348,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] -[[package]] -name = "distlib" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, -] - [[package]] name = "docutils" version = "0.22.2" @@ -402,15 +375,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, ] -[[package]] -name = "filelock" -version = "3.20.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" }, -] - [[package]] name = "ghp-import" version = "2.1.0" @@ -616,10 +580,18 @@ dependencies = [ { name = "typing-extensions" }, ] -[package.optional-dependencies] +[package.dev-dependencies] dev = [ + { name = "build" }, { name = "codespell" }, { name = "hypothesis" }, + { name = "ipdb" }, + { name = "ipython" }, + { name = "mdformat" }, + { name = "mdformat-gfm" }, + { name = "mdformat-gfm-alerts" }, + { name = "mdformat-ruff" }, + { name = "mdformat-toc" }, { name = "mkdocs" }, { name = "mkdocs-material" }, { name = "mkdocstrings", extra = ["python"] }, @@ -629,76 +601,37 @@ dev = [ { name = "pytest-cov" }, { name = "pytest-xdist" }, { name = "ruff" }, - { name = "tox" }, - { name = "tox-uv" }, -] -docs = [ - { name = "codespell" }, - { name = "mkdocs" }, - { name = "mkdocs-material" }, - { name = "mkdocstrings", extra = ["python"] }, - { name = "pyspelling" }, -] -lint = [ - { name = "ruff" }, -] -mdformat = [ - { name = "mdformat" }, - { name = "mdformat-gfm" }, - { name = "mdformat-gfm-alerts" }, - { name = "mdformat-ruff" }, - { name = "mdformat-toc" }, -] -test = [ - { name = "hypothesis" }, - { name = "pytest" }, - { name = "pytest-cov" }, - { name = "pytest-xdist" }, -] -typecheck = [ - { name = "mypy" }, -] - -[package.dev-dependencies] -dev = [ - { name = "build" }, - { name = "ipdb" }, - { name = "ipython" }, { name = "tomli-w" }, { name = "twine" }, ] [package.metadata] requires-dist = [ - { name = "codespell", marker = "extra == 'docs'", specifier = ">=2.4.1,<3" }, - { name = "hypothesis", marker = "extra == 'test'", specifier = ">=6.138.14" }, - { name = "lean-spec", extras = ["test", "lint", "typecheck", "docs"], marker = "extra == 'dev'" }, - { name = "mdformat", marker = "extra == 'mdformat'", specifier = "==0.7.22" }, - { name = "mdformat-gfm", marker = "extra == 'mdformat'", specifier = "==0.4.1" }, - { name = "mdformat-gfm-alerts", marker = "extra == 'mdformat'", specifier = "==2.0.0" }, - { name = "mdformat-ruff", marker = "extra == 'mdformat'", specifier = "==0.1.3" }, - { name = "mdformat-toc", marker = "extra == 'mdformat'", specifier = "==0.3.0" }, - { name = "mkdocs", marker = "extra == 'docs'", specifier = ">=1.6.1,<2" }, - { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.5.45,<10" }, - { name = "mkdocstrings", extras = ["python"], marker = "extra == 'docs'", specifier = ">=0.27.0,<1" }, - { name = "mypy", marker = "extra == 'typecheck'", specifier = ">=1.15.0,<1.16" }, { name = "pydantic", specifier = ">=2.12.0,<3" }, - { name = "pyspelling", marker = "extra == 'docs'", specifier = ">=2.8.2,<3" }, - { name = "pytest", marker = "extra == 'test'", specifier = ">=8.3.3,<9" }, - { name = "pytest-cov", marker = "extra == 'test'", specifier = ">=6.0.0,<7" }, - { name = "pytest-xdist", marker = "extra == 'test'", specifier = ">=3.6.1,<4" }, - { name = "ruff", marker = "extra == 'lint'", specifier = ">=0.11.8,<1" }, - { name = "tox", marker = "extra == 'dev'", specifier = ">=4.23.0,<5" }, - { name = "tox-uv", marker = "extra == 'dev'", specifier = ">=1.29.0" }, { name = "typing-extensions", specifier = ">=4.4" }, ] -provides-extras = ["test", "lint", "typecheck", "docs", "dev", "mdformat"] [package.metadata.requires-dev] dev = [ { name = "build", specifier = ">=1.2.0,<2" }, + { name = "codespell", specifier = ">=2.4.1,<3" }, + { name = "hypothesis", specifier = ">=6.138.14" }, { name = "ipdb", specifier = ">=0.13" }, { name = "ipython", specifier = ">=8.31.0,<9" }, + { name = "mdformat", specifier = "==0.7.22" }, + { name = "mdformat-gfm", specifier = "==0.4.1" }, + { name = "mdformat-gfm-alerts", specifier = "==2.0.0" }, + { name = "mdformat-ruff", specifier = "==0.1.3" }, + { name = "mdformat-toc", specifier = "==0.3.0" }, + { name = "mkdocs", specifier = ">=1.6.1,<2" }, + { name = "mkdocs-material", specifier = ">=9.5.45,<10" }, + { name = "mkdocstrings", extras = ["python"], specifier = ">=0.27.0,<1" }, + { name = "mypy", specifier = ">=1.15.0,<1.16" }, + { name = "pyspelling", specifier = ">=2.8.2,<3" }, + { name = "pytest", specifier = ">=8.3.3,<9" }, + { name = "pytest-cov", specifier = ">=6.0.0,<7" }, + { name = "pytest-xdist", specifier = ">=3.6.1,<4" }, + { name = "ruff", specifier = ">=0.11.8,<1" }, { name = "tomli-w", specifier = ">=1.0.0" }, { name = "twine", specifier = ">=5.1.0,<6" }, ] @@ -1399,18 +1332,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload-time = "2025-07-28T16:19:31.401Z" }, ] -[[package]] -name = "pyproject-api" -version = "1.10.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/45/7b/c0e1333b61d41c69e59e5366e727b18c4992688caf0de1be10b3e5265f6b/pyproject_api-1.10.0.tar.gz", hash = "sha256:40c6f2d82eebdc4afee61c773ed208c04c19db4c4a60d97f8d7be3ebc0bbb330", size = 22785, upload-time = "2025-10-09T19:12:27.21Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl", hash = "sha256:8757c41a79c0f4ab71b99abed52b97ecf66bd20b04fa59da43b5840bac105a09", size = 13218, upload-time = "2025-10-09T19:12:24.428Z" }, -] - [[package]] name = "pyproject-hooks" version = "1.2.0" @@ -1712,40 +1633,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675, upload-time = "2025-01-15T12:07:22.074Z" }, ] -[[package]] -name = "tox" -version = "4.31.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cachetools" }, - { name = "chardet" }, - { name = "colorama" }, - { name = "filelock" }, - { name = "packaging" }, - { name = "platformdirs" }, - { name = "pluggy" }, - { name = "pyproject-api" }, - { name = "virtualenv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/be/b9/1750ebb6e8e2d198a17822b7b851dea33e61dcc9c25f55a3e3636f67389a/tox-4.31.0.tar.gz", hash = "sha256:266381ffef35615ec0d40ae4969a9e43b506017597c0413d6545a603cc8c7561", size = 203294, upload-time = "2025-10-09T18:53:53.619Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/84/1691aae773dccff72c866ad19af7adb12d4fb8b439c8bfb36ffc429c8c27/tox-4.31.0-py3-none-any.whl", hash = "sha256:328f392e6567e46cb0f9b625679456744dde940287dd1b39117627dc4b21d5da", size = 175917, upload-time = "2025-10-09T18:53:51.494Z" }, -] - -[[package]] -name = "tox-uv" -version = "1.29.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, - { name = "tox" }, - { name = "uv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4f/90/06752775b8cfadba8856190f5beae9f552547e0f287e0246677972107375/tox_uv-1.29.0.tar.gz", hash = "sha256:30fa9e6ad507df49d3c6a2f88894256bcf90f18e240a00764da6ecab1db24895", size = 23427, upload-time = "2025-10-09T20:40:27.384Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/17/221d62937c4130b044bb437caac4181e7e13d5536bbede65264db1f0ac9f/tox_uv-1.29.0-py3-none-any.whl", hash = "sha256:b1d251286edeeb4bc4af1e24c8acfdd9404700143c2199ccdbb4ea195f7de6cc", size = 17254, upload-time = "2025-10-09T20:40:25.885Z" }, -] - [[package]] name = "traitlets" version = "5.14.3" @@ -1805,46 +1692,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] -[[package]] -name = "uv" -version = "0.9.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6e/6a/fab7dd47e7344705158cc3fcbe70b4814175902159574c3abb081ebaba88/uv-0.9.5.tar.gz", hash = "sha256:d8835d2c034421ac2235fb658bb4f669a301a0f1eb00a8430148dd8461b65641", size = 3700444, upload-time = "2025-10-21T16:48:26.847Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/4a/4db051b9e41e6c67d0b7a56c68e2457e9bbe947463a656873e7d02a974f3/uv-0.9.5-py3-none-linux_armv6l.whl", hash = "sha256:f8eb34ebebac4b45334ce7082cca99293b71fb32b164651f1727c8a640e5b387", size = 20667903, upload-time = "2025-10-21T16:47:41.841Z" }, - { url = "https://files.pythonhosted.org/packages/4e/6c/3508d67f80aac0ddb5806680a6735ff6cb5a14e9b697e5ae145b01050880/uv-0.9.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:922cd784cce36bbdc7754b590d28c276698c85791c18cd4c6a7e917db4480440", size = 19680481, upload-time = "2025-10-21T16:47:45.825Z" }, - { url = "https://files.pythonhosted.org/packages/b2/26/bd6438cf6d84a6b0b608bcbe9f353d8e424f8fe3b1b73a768984a76bf80b/uv-0.9.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8603bb902e578463c50c3ddd4ee376ba4172ccdf4979787f8948747d1bb0e18b", size = 18309280, upload-time = "2025-10-21T16:47:47.919Z" }, - { url = "https://files.pythonhosted.org/packages/48/8a/a990d9a39094d4d47bd11edff17573247f3791c33a19626e92c995498e68/uv-0.9.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:48a3542835d37882ff57d1ff91b757085525d98756712fa61cf9941d3dda8ebf", size = 20030908, upload-time = "2025-10-21T16:47:50.532Z" }, - { url = "https://files.pythonhosted.org/packages/24/7a/63a5dd8e1b7ff69d9920a36c018c54c6247e48477d252770d979e30c97bd/uv-0.9.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:21452ece590ddb90e869a478ca4c2ba70be180ec0d6716985ee727b9394c8aa5", size = 20236853, upload-time = "2025-10-21T16:47:53.108Z" }, - { url = "https://files.pythonhosted.org/packages/bc/cd/511e0d96b10a88fb382515f33fcacb8613fea6e50ae767827ad8056f6c38/uv-0.9.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb31c9896dc2c88f6a9f1d693be2409fe2fc2e3d90827956e4341c2b2171289", size = 21161956, upload-time = "2025-10-21T16:47:55.337Z" }, - { url = "https://files.pythonhosted.org/packages/0b/bd/3255b9649f491ff7ae3450919450325ad125c8af6530d24aa22932f83aa0/uv-0.9.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:02db727beb94a2137508cee5a785c3465d150954ca9abdff2d8157c76dea163e", size = 22646501, upload-time = "2025-10-21T16:47:57.917Z" }, - { url = "https://files.pythonhosted.org/packages/b6/6e/f2d172ea3aa078aa2ba1c391f674b2d322e5d1a8b695e2bdd941ea22f6c3/uv-0.9.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c465f2e342cab908849b8ce83e14fd4cf75f5bed55802d0acf1399f9d02f92d9", size = 22285962, upload-time = "2025-10-21T16:48:00.516Z" }, - { url = "https://files.pythonhosted.org/packages/71/ad/f22e2b094c82178cee674337340f2e1a3dfcdaabc75e393e1f499f997c15/uv-0.9.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:133e2614e1ff3b34c2606595d8ae55710473ebb7516bfa5708afc00315730cd1", size = 21374721, upload-time = "2025-10-21T16:48:02.957Z" }, - { url = "https://files.pythonhosted.org/packages/9b/83/a0bdf4abf86ede79b427778fe27e2b4a022c98a7a8ea1745dcd6c6561f17/uv-0.9.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6507bbbcd788553ec4ad5a96fa19364dc0f58b023e31d79868773559a83ec181", size = 21332544, upload-time = "2025-10-21T16:48:05.75Z" }, - { url = "https://files.pythonhosted.org/packages/da/93/f61862a5cb34d3fd021352f4a46993950ba2b301f0fd0694a56c7a56b20b/uv-0.9.5-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:6a046c2e833169bf26f461286aab58a2ba8d48ed2220bfcf119dcfaf87163116", size = 20157103, upload-time = "2025-10-21T16:48:08.018Z" }, - { url = "https://files.pythonhosted.org/packages/04/9c/2788b82454dd485a5b3691cc6f465583e9ce8d4c45bac11461ff38165fd5/uv-0.9.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9fc13b4b943d19adac52d7dcd2159e96ab2e837ac49a79e20714ed25f1f1b7f9", size = 21263882, upload-time = "2025-10-21T16:48:10.222Z" }, - { url = "https://files.pythonhosted.org/packages/c6/eb/73dd04b7e9c1df76fc6b263140917ba5d7d6d0d28c6913090f3e94e53220/uv-0.9.5-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:5bb4996329ba47e7e775baba4a47e85092aa491d708a66e63b564e9b306bfb7e", size = 20210317, upload-time = "2025-10-21T16:48:12.606Z" }, - { url = "https://files.pythonhosted.org/packages/bb/45/3f5e0954a727f037e75036ddef2361a16f23f2a4a2bc98c272bb64c273f1/uv-0.9.5-py3-none-musllinux_1_1_i686.whl", hash = "sha256:6452eb6257e37e1ebd97430b5f5e10419da2c3ca35b4086540ec4163b4b2f25c", size = 20614233, upload-time = "2025-10-21T16:48:14.937Z" }, - { url = "https://files.pythonhosted.org/packages/eb/fd/d1317e982a8b004339ca372fbf4d1807be5d765420970bde17bbd621cbf9/uv-0.9.5-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:3a4ecbfdcbd3dae4190428874762c791e05d2c97ff2872bf6c0a30ed5c4ea9ca", size = 21526600, upload-time = "2025-10-21T16:48:17.396Z" }, - { url = "https://files.pythonhosted.org/packages/9c/39/6b288c4e348c4113d4925c714606f7d1e0a7bfcb7f1ad001a28dbcf62f30/uv-0.9.5-py3-none-win32.whl", hash = "sha256:0316493044035098666d6e99c14bd61b352555d9717d57269f4ce531855330fa", size = 19469211, upload-time = "2025-10-21T16:48:19.668Z" }, - { url = "https://files.pythonhosted.org/packages/af/14/0f07d0b2e561548b4e3006208480a5fce8cdaae5247d85efbfb56e8e596b/uv-0.9.5-py3-none-win_amd64.whl", hash = "sha256:48a12390421f91af8a8993cf15c38297c0bb121936046286e287975b2fbf1789", size = 21404719, upload-time = "2025-10-21T16:48:22.145Z" }, - { url = "https://files.pythonhosted.org/packages/c7/33/14244c0641c2340653ae934e5c82750543fcddbcd260bdc2353a33b6148f/uv-0.9.5-py3-none-win_arm64.whl", hash = "sha256:c966e3a4fe4de3b0a6279d0a835c79f9cddbb3693f52d140910cbbed177c5742", size = 19911407, upload-time = "2025-10-21T16:48:24.974Z" }, -] - -[[package]] -name = "virtualenv" -version = "20.35.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "distlib" }, - { name = "filelock" }, - { name = "platformdirs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a4/d5/b0ccd381d55c8f45d46f77df6ae59fbc23d19e901e2d523395598e5f4c93/virtualenv-20.35.3.tar.gz", hash = "sha256:4f1a845d131133bdff10590489610c98c168ff99dc75d6c96853801f7f67af44", size = 6002907, upload-time = "2025-10-10T21:23:33.178Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/73/d9a94da0e9d470a543c1b9d3ccbceb0f59455983088e727b8a1824ed90fb/virtualenv-20.35.3-py3-none-any.whl", hash = "sha256:63d106565078d8c8d0b206d48080f938a8b25361e19432d2c9db40d2899c810a", size = 5981061, upload-time = "2025-10-10T21:23:30.433Z" }, -] - [[package]] name = "watchdog" version = "6.0.0"