From 73552639ab0dcd923c0497fd00730edebe12ab65 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Thu, 19 Sep 2024 11:38:48 -0400 Subject: [PATCH 1/9] feat: use ruff for linting. --- .gitignore | 2 - .vscode/extensions.json | 10 +- .vscode/launch.json | 133 ++++ .vscode/launch.recommended.json | 133 ---- .vscode/settings.json | 35 + .vscode/settings.recommended.json | 40 -- pyproject.toml | 28 +- tox.ini | 15 +- uv.lock | 1055 ++++++++++++++--------------- 9 files changed, 681 insertions(+), 770 deletions(-) create mode 100644 .vscode/launch.json delete mode 100644 .vscode/launch.recommended.json create mode 100644 .vscode/settings.json delete mode 100644 .vscode/settings.recommended.json diff --git a/.gitignore b/.gitignore index 938093da30..455be363fb 100644 --- a/.gitignore +++ b/.gitignore @@ -49,8 +49,6 @@ pip-delete-this-directory.txt .coverage # misc -.vscode/settings.json -.vscode/launch.json *.code-workspace verify_kzg_proof diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 55edb2c0f0..4bcb2db306 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -4,10 +4,8 @@ // List of extensions which should be recommended for users of this workspace. "recommendations": [ "ms-python.python", - "ms-python.isort", - "ms-python.flake8", + "charliermarsh.ruff", "ms-python.mypy-type-checker", - "ms-python.black-formatter", "esbenp.prettier-vscode", "njpwerner.autodocstring", // https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring "streetsidesoftware.code-spell-checker", @@ -17,5 +15,9 @@ "DavidAnson.vscode-markdownlint", // https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint ], // List of extensions recommended by VS Code that should not be recommended for users of this workspace. - "unwantedRecommendations": [] + "unwantedRecommendations": [ + "ms-python.black-formatter", + "ms-python.isort", + "ms-python.flake8", + ] } diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..a529c491ed --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,133 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + // If the VS Code "Run and Debug" button, respecively launch selector are not visible, see this answer: + // https://stackoverflow.com/a/74245823 + // + "version": "0.2.0", + "configurations": [ + { + "name": "Launch fill --until choose fork", + "type": "debugpy", + "request": "launch", + "module": "pytest", + "args": [ + "-c", + "pytest.ini", + "--until", + "${input:fork}", + "--evm-bin", + "${input:evmBinary}", + "-v" + ], + "cwd": "${workspaceFolder}" + }, + { + "name": "Launch fill -k choose test path", + "type": "debugpy", + "request": "launch", + "module": "pytest", + "args": [ + "-c", + "pytest.ini", + "--until", + "Cancun", + "--evm-bin", + "${input:evmBinary}", + "-v", + "-k", + "${input:testPathOrId}" + ], + "cwd": "${workspaceFolder}" + }, + { + "name": "Launch fill --until Cancun", + "type": "debugpy", + "request": "launch", + "module": "pytest", + "args": [ + "-c", + "pytest.ini", + "--until", + "Cancun", + "--evm-bin", + "${input:evmBinary}", + "-v" + ], + "cwd": "${workspaceFolder}" + }, + { + "name": "Launch fill --until Prague", + "type": "debugpy", + "request": "launch", + "module": "pytest", + "args": [ + "-c", + "pytest.ini", + "--until", + "Prague", + "--evm-bin", + "${input:evmBinary}", + "-v" + ], + "cwd": "${workspaceFolder}" + } + ], + "inputs": [ + { + "type": "pickString", + "id": "evmBinary", + "description": "Which evm binary to you want to run?", + "options": [ + { + "label": "First evm binary in PATH", + "value": "evm" + }, + { + "label": "Geth, mario's repo", + "value": "~/code/github/marioevz/go-ethereum/build/bin/evm" + }, + { + "label": "Geth, danceratopz's repo", + "value": "~/code/github/danceratopz/go-ethereum/build/bin/evm" + }, + { + "label": "evmone", + "value": "~/code/github/ethereum/evmone/build/bin/evmone-t8n" + }, + { + "label": "besu", + "value": "~/code/github/danceratopz/besu/ethereum/evmtool/build/install/evmtool/bin/evm" + } + ], + "default": "evm" + }, + { + "type": "pickString", + "id": "fork", + "description": "Which fork do you want to use?", + "options": [ + "Frontier", + "Homestead", + "Byzantium", + "Constantinople", + "ConstantinopleFix", + "Istanbul", + "Berlin", + "London", + "Paris", + "Shanghai", + "Cancun", + "Prague" + ], + "default": "Cancun" + }, + { + "type": "promptString", + "id": "testPathOrId", + "description": "Enter a test path string or id to provide to pytest -k", + "default": "test_" + } + ] +} diff --git a/.vscode/launch.recommended.json b/.vscode/launch.recommended.json deleted file mode 100644 index a27bbcb24b..0000000000 --- a/.vscode/launch.recommended.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - // If the VS Code "Run and Debug" button, respecively launch selector are not visible, see this answer: - // https://stackoverflow.com/a/74245823 - // - "version": "0.2.0", - "configurations": [ - { - "name": "Launch fill --until choose fork", - "type": "python", - "request": "launch", - "module": "pytest", - "args": [ - "-c", - "pytest.ini", - "--until", - "${input:fork}", - "--evm-bin", - "${input:evmBinary}", - "-v" - ], - "cwd": "${workspaceFolder}" - }, - { - "name": "Launch fill -k choose test path", - "type": "python", - "request": "launch", - "module": "pytest", - "args": [ - "-c", - "pytest.ini", - "--until", - "Cancun", - "--evm-bin", - "${input:evmBinary}", - "-v", - "-k", - "${input:testPathOrId}" - ], - "cwd": "${workspaceFolder}" - }, - { - "name": "Launch fill --until Cancun", - "type": "python", - "request": "launch", - "module": "pytest", - "args": [ - "-c", - "pytest.ini", - "--until", - "Cancun", - "--evm-bin", - "${input:evmBinary}", - "-v" - ], - "cwd": "${workspaceFolder}" - }, - { - "name": "Launch fill --until Prague", - "type": "python", - "request": "launch", - "module": "pytest", - "args": [ - "-c", - "pytest.ini", - "--until", - "Prague", - "--evm-bin", - "${input:evmBinary}", - "-v" - ], - "cwd": "${workspaceFolder}" - } - ], - "inputs": [ - { - "type": "pickString", - "id": "evmBinary", - "description": "Which evm binary to you want to run?", - "options": [ - { - "label": "First evm binary in PATH", - "value": "evm", - }, - { - "label": "Geth, mario's repo", - "value": "~/code/github/marioevz/go-ethereum/build/bin/evm", - }, - { - "label": "Geth, danceratopz's repo", - "value": "~/code/github/danceratopz/go-ethereum/build/bin/evm", - }, - { - "label": "evmone", - "value": "~/code/github/ethereum/evmone/build/bin/evmone-t8n", - }, - { - "label": "besu", - "value": "~/code/github/danceratopz/besu/ethereum/evmtool/build/install/evmtool/bin/evm", - } - ], - "default": "evm" - }, - { - "type": "pickString", - "id": "fork", - "description": "Which fork do you want to use?", - "options": [ - "Frontier", - "Homestead", - "Byzantium", - "Constantinople", - "ConstantinopleFix", - "Istanbul", - "Berlin", - "London", - "Paris", - "Shanghai", - "Cancun", - "Prague", - ], - "default": "Cancun" - }, - { - "type": "promptString", - "id": "testPathOrId", - "description": "Enter a test path string or id to provide to pytest -k", - "default": "test_" - } - ] -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..0892df47b0 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,35 @@ +{ + "cSpell.customDictionaries": { + "project-words": { + "name": "project-words", + "path": "${workspaceRoot}/whitelist.txt", + "description": "Words used in this project", + "addWords": true + }, + "custom": true, + "internal-terms": false + }, + "[python]": { + "editor.rulers": [ + 100 + ], + "editor.formatOnSave": true, + "editor.defaultFormatter": "charliermarsh.ruff", + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + } + }, + "python.analysis.autoFormatStrings": true, + "python.testing.promptToConfigure": false, + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "python.testing.pytestArgs": [ + "-c", + "pytest.ini" + ], + "ruff.lint.args": [ + "--line-length", + "99", + "--fix" + ] +} \ No newline at end of file diff --git a/.vscode/settings.recommended.json b/.vscode/settings.recommended.json deleted file mode 100644 index 930c67df78..0000000000 --- a/.vscode/settings.recommended.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "cSpell.customDictionaries": { - "project-words": { - "name": "project-words", - "path": "${workspaceRoot}/whitelist.txt", - "description": "Words used in this project", - "addWords": true - }, - "custom": true, // Enable the `custom` dictionary - "internal-terms": false // Disable the `internal-terms` dictionary - }, - "[python]": { - "editor.rulers": [100], - "editor.formatOnSave": true, - "editor.defaultFormatter": "ms-python.black-formatter", - "editor.codeActionsOnSave": { - "source.organizeImports": true - } - }, - "python.analysis.autoFormatStrings": true, - "python.testing.promptToConfigure": false, - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true, - "python.testing.pytestArgs": [ - // To discover tests for an upcoming fork, use the `--until` argument as following. - // "--until=Prague", - // Hopefully vscode-python will support multiple test framework environments sooon, see - // https://github.com/microsoft/vscode-python/issues/12075 - // For now, to toggle between running "framework tests" and "filling tests" comment/ - // uncomment the relevant line below. - "-c", - // "pytest-framework.ini", - "pytest.ini" - // "-vv" - ], - "black-formatter.args": [ - "--line-length", - "99" - ] -} diff --git a/pyproject.toml b/pyproject.toml index e16f3e4e2e..10b684b48e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,19 +53,12 @@ Repository = "https://github.com/ethereum/execution-spec-tests" Issues = "https://github.com/ethereum/execution-spec-tests/issues" Changelog = "https://ethereum.github.io/execution-spec-tests/main/CHANGELOG/" - [project.optional-dependencies] test = ["pytest-cov>=4.1.0,<5"] lint = [ - "isort>=5.8,<6", + "ruff>=0.0.285", "mypy==0.991; implementation_name == 'cpython'", - "types-requests", - "black==22.3.0; implementation_name == 'cpython'", - "flake8-spellcheck>=0.24,<0.25", - "flake8-docstrings>=1.6,<2", - "flake8>=6.1.0,<7", - "pep8-naming==0.13.3", - "fname8>=0.0.3", + "types-requests" ] docs = [ "cairosvg>=2.7.0,<3", @@ -87,7 +80,6 @@ docs = [ fill = "cli.pytest_commands.fill:fill" phil = "cli.pytest_commands.fill:phil" execute = "cli.pytest_commands.execute:execute" -tf = "cli.pytest_commands.fill:tf" checkfixtures = "cli.check_fixtures:check_fixtures" consume = "cli.pytest_commands.consume:consume" genindex = "cli.gen_index:generate_fixtures_index_cli" @@ -107,15 +99,15 @@ exclude = ["*tests*"] [tool.setuptools.package-data] ethereum_test_forks = ["forks/contracts/*.bin"] -[tool.isort] -profile = "black" -multi_line_output = 3 -line_length = 99 - -[tool.black] +[tool.ruff] line-length = 99 -target-version = ["py310"] + +[tool.ruff.lint] +select = ["E", "F", "B", "W", "I", "A", "N", "D", "C"] +fixable = ["I", "B", "E", "F", "W", "D", "C"] +ignore = ["D205", "D203", "D212", "D415", "C901"] + [tool.mypy] mypy_path = ["src", "$MYPY_CONFIG_FILE_DIR/stubs"] -plugins = ["pydantic.mypy"] +plugins = ["pydantic.mypy"] \ No newline at end of file diff --git a/tox.ini b/tox.ini index 2260cb68bb..c45ec689c2 100644 --- a/tox.ini +++ b/tox.ini @@ -25,10 +25,7 @@ src = src commands_pre = solc-select use 0.8.24 --always-install commands = - fname8 {[testenv:framework]src} - isort {[testenv:framework]src} --check --diff - black {[testenv:framework]src} --check --diff - flake8 {[testenv:framework]src} + ruff check {[testenv:framework]src} --fix --show-fixes mypy {[testenv:framework]src} pytest -c ./pytest-framework.ini -n auto -m "not run_in_serial" pytest -c ./pytest-framework.ini -m run_in_serial @@ -46,10 +43,7 @@ extras = lint commands = - fname8 tests - isort tests --check --diff - black tests --check --diff - flake8 tests + ruff check tests --fix --show-fixes mypy tests [testenv:tests] @@ -97,10 +91,7 @@ setenv = src = docs/gen_test_case_reference.py commands = - fname8 {[testenv:docs]src} - isort {[testenv:docs]src} --check --diff - black {[testenv:docs]src} --check --diff - flake8 {[testenv:docs]src} + ruff check {[testenv:docs]src} --fix --show-fixes mypy {[testenv:docs]src} python -c "import src.cli.tox_helpers; src.cli.tox_helpers.pyspelling()" python -c "import src.cli.tox_helpers; src.cli.tox_helpers.markdownlint()" diff --git a/uv.lock b/uv.lock index 5ea4ef75fb..aa3db9cfcc 100644 --- a/uv.lock +++ b/uv.lock @@ -53,43 +53,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5", size = 32764 }, ] -[[package]] -name = "black" -version = "22.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "mypy-extensions" }, - { name = "pathspec" }, - { name = "platformdirs" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ee/1f/b29c7371958ab41a800f8718f5d285bf4333b8d0b5a5a8650234463ee644/black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79", size = 554277 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/1b/3ba8128f0b6e86d87343a1275e17baeeeee1a89e02d2a0d275f472be3310/black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09", size = 2392131 }, - { url = "https://files.pythonhosted.org/packages/31/1a/0233cdbfbcfbc0864d815cf28ca40cdb65acf3601f3bf943d6d04e867858/black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb", size = 1339315 }, - { url = "https://files.pythonhosted.org/packages/4f/98/8f775455f99a8e4b16d8d26efdc8292f99b1c0ebfe04357d800ff379c0ae/black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a", size = 1212888 }, - { url = "https://files.pythonhosted.org/packages/93/98/6f7c2f7f81d87b5771febcee933ba58640fca29a767262763bc353074f63/black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968", size = 1474258 }, - { url = "https://files.pythonhosted.org/packages/5f/10/613ddfc646a1f51f24ad9173e4969025210fe9034a69718f08297ecb9b76/black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d", size = 1137867 }, - { url = "https://files.pythonhosted.org/packages/2e/ef/a38a2189959246543e60859fb65bd3143129f6d18dfc7bcdd79217f81ca2/black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72", size = 153859 }, -] - [[package]] name = "bracex" -version = "2.5" +version = "2.5.post1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ac/f1/ac657fd234f4ee61da9d90f2bae7d6078074de2f97cb911743faa8d10a91/bracex-2.5.tar.gz", hash = "sha256:0725da5045e8d37ea9592ab3614d8b561e22c3c5fde3964699be672e072ab611", size = 26622 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/6c/57418c4404cd22fe6275b8301ca2b46a8cdaa8157938017a9ae0b3edf363/bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6", size = 26641 } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/4f/54d324c35221c027ca77e9aae418f525003bd0cc2613eea162a1246b5a92/bracex-2.5-py3-none-any.whl", hash = "sha256:d2fcf4b606a82ac325471affe1706dd9bbaa3536c91ef86a31f6b766f3dad1d0", size = 11509 }, + { url = "https://files.pythonhosted.org/packages/4b/02/8db98cdc1a58e0abd6716d5e63244658e6e63513c65f469f34b6f1053fd0/bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6", size = 11558 }, ] [[package]] name = "cached-property" -version = "1.5.2" +version = "2.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/61/2c/d21c1c23c2895c091fa7a91a54b6872098fea913526932d21902088a7c41/cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130", size = 12244 } +sdist = { url = "https://files.pythonhosted.org/packages/76/4b/3d870836119dbe9a5e3c9a61af8cc1a8b69d75aea564572e385882d5aefb/cached_property-2.0.1.tar.gz", hash = "sha256:484d617105e3ee0e4f1f58725e72a8ef9e93deee462222dbd51cd91230897641", size = 10574 } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/19/f2090f7dad41e225c7f2326e4cfe6fff49e57dedb5b53636c9551f86b069/cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0", size = 7573 }, + { url = "https://files.pythonhosted.org/packages/11/0e/7d8225aab3bc1a0f5811f8e1b557aa034ac04bdf641925b30d3caf586b28/cached_property-2.0.1-py3-none-any.whl", hash = "sha256:f617d70ab1100b7bcf6e42228f9ddcb78c676ffa167278d9f730d1c2fba69ccb", size = 7428 }, ] [[package]] @@ -122,122 +101,137 @@ wheels = [ [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c2/02/a95f2b11e207f68bc64d7aae9666fed2e2b3f307748d5123dffb72a1bbea/certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", size = 164065 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90", size = 162960 }, + { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, ] [[package]] name = "cffi" -version = "1.17.0" +version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1e/bf/82c351342972702867359cfeba5693927efe0a8dd568165490144f554b18/cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76", size = 516073 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/2a/9071bf1e20bf9f695643b6c3e0f838f340b95ee29de0d1bb7968772409be/cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb", size = 181841 }, - { url = "https://files.pythonhosted.org/packages/4b/42/60116f10466d692b64aef32ac40fd79b11344ab6ef889ff8e3d047f2fcb2/cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a", size = 178242 }, - { url = "https://files.pythonhosted.org/packages/26/8e/a53f844454595c6e9215e56cda123db3427f8592f2c7b5ef1be782f620d6/cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42", size = 425676 }, - { url = "https://files.pythonhosted.org/packages/60/ac/6402563fb40b64c7ccbea87836d9c9498b374629af3449f3d8ff34df187d/cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d", size = 447842 }, - { url = "https://files.pythonhosted.org/packages/b2/e7/e2ffdb8de59f48f17b196813e9c717fbed2364e39b10bdb3836504e89486/cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2", size = 455224 }, - { url = "https://files.pythonhosted.org/packages/59/55/3e8968e92fe35c1c368959a070a1276c10cae29cdad0fd0daa36c69e237e/cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab", size = 436341 }, - { url = "https://files.pythonhosted.org/packages/7f/df/700aaf009dfbfa04acb1ed487586c03c788c6a312f0361ad5f298c5f5a7d/cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b", size = 445861 }, - { url = "https://files.pythonhosted.org/packages/5a/70/637f070aae533ea11ab77708a820f3935c0edb4fbcef9393b788e6f426a5/cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206", size = 460982 }, - { url = "https://files.pythonhosted.org/packages/f7/1a/7d4740fa1ccc4fcc888963fc3165d69ef1a2c8d42c8911c946703ff5d4a5/cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa", size = 438434 }, - { url = "https://files.pythonhosted.org/packages/d0/d9/c48cc38aaf6f53a8b5d2dbf6fe788410fcbab33b15a69c56c01d2b08f6a2/cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f", size = 461219 }, - { url = "https://files.pythonhosted.org/packages/26/ec/b6a7f660a7f27bd2bb53fe99a2ccafa279088395ec8639b25b8950985b2d/cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc", size = 171406 }, - { url = "https://files.pythonhosted.org/packages/08/42/8c00824787e6f5ec55194f5cd30c4ba4b9d9d5bb0d4d0007b1bb948d4ad4/cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2", size = 180809 }, - { url = "https://files.pythonhosted.org/packages/53/cc/9298fb6235522e00e47d78d6aa7f395332ef4e5f6fe124f9a03aa60600f7/cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720", size = 181912 }, - { url = "https://files.pythonhosted.org/packages/e7/79/dc5334fbe60635d0846c56597a8d2af078a543ff22bc48d36551a0de62c2/cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9", size = 178297 }, - { url = "https://files.pythonhosted.org/packages/39/d7/ef1b6b16b51ccbabaced90ff0d821c6c23567fc4b2e4a445aea25d3ceb92/cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb", size = 444909 }, - { url = "https://files.pythonhosted.org/packages/29/b8/6e3c61885537d985c78ef7dd779b68109ba256263d74a2f615c40f44548d/cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424", size = 468854 }, - { url = "https://files.pythonhosted.org/packages/0b/49/adad1228e19b931e523c2731e6984717d5f9e33a2f9971794ab42815b29b/cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d", size = 476890 }, - { url = "https://files.pythonhosted.org/packages/76/54/c00f075c3e7fd14d9011713bcdb5b4f105ad044c5ad948db7b1a0a7e4e78/cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8", size = 459374 }, - { url = "https://files.pythonhosted.org/packages/f3/b9/f163bb3fa4fbc636ee1f2a6a4598c096cdef279823ddfaa5734e556dd206/cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6", size = 466891 }, - { url = "https://files.pythonhosted.org/packages/31/52/72bbc95f6d06ff2e88a6fa13786be4043e542cb24748e1351aba864cb0a7/cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91", size = 477658 }, - { url = "https://files.pythonhosted.org/packages/67/20/d694811457eeae0c7663fa1a7ca201ce495533b646c1180d4ac25684c69c/cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8", size = 453890 }, - { url = "https://files.pythonhosted.org/packages/dc/79/40cbf5739eb4f694833db5a27ce7f63e30a9b25b4a836c4f25fb7272aacc/cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb", size = 478254 }, - { url = "https://files.pythonhosted.org/packages/e9/eb/2c384c385cca5cae67ca10ac4ef685277680b8c552b99aedecf4ea23ff7e/cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9", size = 171285 }, - { url = "https://files.pythonhosted.org/packages/ca/42/74cb1e0f1b79cb64672f3cb46245b506239c1297a20c0d9c3aeb3929cb0c/cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0", size = 180842 }, - { url = "https://files.pythonhosted.org/packages/1a/1f/7862231350cc959a3138889d2c8d33da7042b22e923457dfd4cd487d772a/cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc", size = 182826 }, - { url = "https://files.pythonhosted.org/packages/8b/8c/26119bf8b79e05a1c39812064e1ee7981e1f8a5372205ba5698ea4dd958d/cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59", size = 178494 }, - { url = "https://files.pythonhosted.org/packages/61/94/4882c47d3ad396d91f0eda6ef16d45be3d752a332663b7361933039ed66a/cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb", size = 454459 }, - { url = "https://files.pythonhosted.org/packages/0f/7c/a6beb119ad515058c5ee1829742d96b25b2b9204ff920746f6e13bf574eb/cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195", size = 478502 }, - { url = "https://files.pythonhosted.org/packages/61/8a/2575cd01a90e1eca96a30aec4b1ac101a6fae06c49d490ac2704fa9bc8ba/cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e", size = 485381 }, - { url = "https://files.pythonhosted.org/packages/cd/66/85899f5a9f152db49646e0c77427173e1b77a1046de0191ab3b0b9a5e6e3/cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828", size = 470907 }, - { url = "https://files.pythonhosted.org/packages/00/13/150924609bf377140abe6e934ce0a57f3fc48f1fd956ec1f578ce97a4624/cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150", size = 479074 }, - { url = "https://files.pythonhosted.org/packages/17/fd/7d73d7110155c036303b0a6462c56250e9bc2f4119d7591d27417329b4d1/cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a", size = 484225 }, - { url = "https://files.pythonhosted.org/packages/fc/83/8353e5c9b01bb46332dac3dfb18e6c597a04ceb085c19c814c2f78a8c0d0/cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885", size = 488388 }, - { url = "https://files.pythonhosted.org/packages/73/0c/f9d5ca9a095b1fc88ef77d1f8b85d11151c374144e4606da33874e17b65b/cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492", size = 172096 }, - { url = "https://files.pythonhosted.org/packages/72/21/8c5d285fe20a6e31d29325f1287bb0e55f7d93630a5a44cafdafb5922495/cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2", size = 181478 }, - { url = "https://files.pythonhosted.org/packages/17/8f/581f2f3c3464d5f7cf87c2f7a5ba9acc6976253e02d73804240964243ec2/cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118", size = 182638 }, - { url = "https://files.pythonhosted.org/packages/8d/1c/c9afa66684b7039f48018eb11b229b659dfb32b7a16b88251bac106dd1ff/cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7", size = 178453 }, - { url = "https://files.pythonhosted.org/packages/cc/b6/1a134d479d3a5a1ff2fabbee551d1d3f1dd70f453e081b5f70d604aae4c0/cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377", size = 454441 }, - { url = "https://files.pythonhosted.org/packages/b1/b4/e1569475d63aad8042b0935dbf62ae2a54d1e9142424e2b0e924d2d4a529/cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb", size = 478543 }, - { url = "https://files.pythonhosted.org/packages/d2/40/a9ad03fbd64309dec5bb70bc803a9a6772602de0ee164d7b9a6ca5a89249/cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555", size = 485463 }, - { url = "https://files.pythonhosted.org/packages/a6/1a/f10be60e006dd9242a24bcc2b1cd55c34c578380100f742d8c610f7a5d26/cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204", size = 470854 }, - { url = "https://files.pythonhosted.org/packages/cc/b3/c035ed21aa3d39432bd749fe331ee90e4bc83ea2dbed1f71c4bc26c41084/cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f", size = 479096 }, - { url = "https://files.pythonhosted.org/packages/00/cb/6f7edde01131de9382c89430b8e253b8c8754d66b63a62059663ceafeab2/cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0", size = 484013 }, - { url = "https://files.pythonhosted.org/packages/b9/83/8e4e8c211ea940210d293e951bf06b1bfb90f2eeee590e9778e99b4a8676/cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4", size = 488119 }, - { url = "https://files.pythonhosted.org/packages/5e/52/3f7cfbc4f444cb4f73ff17b28690d12436dde665f67d68f1e1687908ab6c/cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a", size = 172122 }, - { url = "https://files.pythonhosted.org/packages/94/19/cf5baa07ee0f0e55eab7382459fbddaba0fdb0ba45973dd92556ae0d02db/cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7", size = 181504 }, +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, ] [[package]] name = "charset-normalizer" -version = "3.3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", size = 104809 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/61/095a0aa1a84d1481998b534177c8566fdc50bb1233ea9a0478cd3cc075bd/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", size = 194219 }, - { url = "https://files.pythonhosted.org/packages/cc/94/f7cf5e5134175de79ad2059edf2adce18e0685ebdb9227ff0139975d0e93/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", size = 122521 }, - { url = "https://files.pythonhosted.org/packages/46/6a/d5c26c41c49b546860cc1acabdddf48b0b3fb2685f4f5617ac59261b44ae/charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", size = 120383 }, - { url = "https://files.pythonhosted.org/packages/b8/60/e2f67915a51be59d4539ed189eb0a2b0d292bf79270410746becb32bc2c3/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", size = 138223 }, - { url = "https://files.pythonhosted.org/packages/05/8c/eb854996d5fef5e4f33ad56927ad053d04dc820e4a3d39023f35cad72617/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", size = 148101 }, - { url = "https://files.pythonhosted.org/packages/f6/93/bb6cbeec3bf9da9b2eba458c15966658d1daa8b982c642f81c93ad9b40e1/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", size = 140699 }, - { url = "https://files.pythonhosted.org/packages/da/f1/3702ba2a7470666a62fd81c58a4c40be00670e5006a67f4d626e57f013ae/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", size = 142065 }, - { url = "https://files.pythonhosted.org/packages/3f/ba/3f5e7be00b215fa10e13d64b1f6237eb6ebea66676a41b2bcdd09fe74323/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", size = 144505 }, - { url = "https://files.pythonhosted.org/packages/33/c3/3b96a435c5109dd5b6adc8a59ba1d678b302a97938f032e3770cc84cd354/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", size = 139425 }, - { url = "https://files.pythonhosted.org/packages/43/05/3bf613e719efe68fb3a77f9c536a389f35b95d75424b96b426a47a45ef1d/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", size = 145287 }, - { url = "https://files.pythonhosted.org/packages/58/78/a0bc646900994df12e07b4ae5c713f2b3e5998f58b9d3720cce2aa45652f/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", size = 149929 }, - { url = "https://files.pythonhosted.org/packages/eb/5c/97d97248af4920bc68687d9c3b3c0f47c910e21a8ff80af4565a576bd2f0/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", size = 141605 }, - { url = "https://files.pythonhosted.org/packages/a8/31/47d018ef89f95b8aded95c589a77c072c55e94b50a41aa99c0a2008a45a4/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", size = 142646 }, - { url = "https://files.pythonhosted.org/packages/ae/d5/4fecf1d58bedb1340a50f165ba1c7ddc0400252d6832ff619c4568b36cc0/charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", size = 92846 }, - { url = "https://files.pythonhosted.org/packages/a2/a0/4af29e22cb5942488cf45630cbdd7cefd908768e69bdd90280842e4e8529/charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", size = 100343 }, - { url = "https://files.pythonhosted.org/packages/68/77/02839016f6fbbf808e8b38601df6e0e66c17bbab76dff4613f7511413597/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", size = 191647 }, - { url = "https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", size = 121434 }, - { url = "https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", size = 118979 }, - { url = "https://files.pythonhosted.org/packages/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", size = 136582 }, - { url = "https://files.pythonhosted.org/packages/74/f1/0d9fe69ac441467b737ba7f48c68241487df2f4522dd7246d9426e7c690e/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", size = 146645 }, - { url = "https://files.pythonhosted.org/packages/05/31/e1f51c76db7be1d4aef220d29fbfa5dbb4a99165d9833dcbf166753b6dc0/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", size = 139398 }, - { url = "https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", size = 140273 }, - { url = "https://files.pythonhosted.org/packages/07/07/7e554f2bbce3295e191f7e653ff15d55309a9ca40d0362fcdab36f01063c/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", size = 142577 }, - { url = "https://files.pythonhosted.org/packages/d8/b5/eb705c313100defa57da79277d9207dc8d8e45931035862fa64b625bfead/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", size = 137747 }, - { url = "https://files.pythonhosted.org/packages/19/28/573147271fd041d351b438a5665be8223f1dd92f273713cb882ddafe214c/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", size = 143375 }, - { url = "https://files.pythonhosted.org/packages/cf/7c/f3b682fa053cc21373c9a839e6beba7705857075686a05c72e0f8c4980ca/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", size = 148474 }, - { url = "https://files.pythonhosted.org/packages/1e/49/7ab74d4ac537ece3bc3334ee08645e231f39f7d6df6347b29a74b0537103/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", size = 140232 }, - { url = "https://files.pythonhosted.org/packages/2d/dc/9dacba68c9ac0ae781d40e1a0c0058e26302ea0660e574ddf6797a0347f7/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", size = 140859 }, - { url = "https://files.pythonhosted.org/packages/6c/c2/4a583f800c0708dd22096298e49f887b49d9746d0e78bfc1d7e29816614c/charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", size = 92509 }, - { url = "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", size = 99870 }, - { url = "https://files.pythonhosted.org/packages/d1/b2/fcedc8255ec42afee97f9e6f0145c734bbe104aac28300214593eb326f1d/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", size = 192892 }, - { url = "https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", size = 122213 }, - { url = "https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", size = 119404 }, - { url = "https://files.pythonhosted.org/packages/99/b0/9c365f6d79a9f0f3c379ddb40a256a67aa69c59609608fe7feb6235896e1/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", size = 137275 }, - { url = "https://files.pythonhosted.org/packages/91/33/749df346e93d7a30cdcb90cbfdd41a06026317bfbfb62cd68307c1a3c543/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", size = 147518 }, - { url = "https://files.pythonhosted.org/packages/72/1a/641d5c9f59e6af4c7b53da463d07600a695b9824e20849cb6eea8a627761/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", size = 140182 }, - { url = "https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", size = 141869 }, - { url = "https://files.pythonhosted.org/packages/df/3e/a06b18788ca2eb6695c9b22325b6fde7dde0f1d1838b1792a0076f58fe9d/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", size = 144042 }, - { url = "https://files.pythonhosted.org/packages/45/59/3d27019d3b447a88fe7e7d004a1e04be220227760264cc41b405e863891b/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", size = 138275 }, - { url = "https://files.pythonhosted.org/packages/7b/ef/5eb105530b4da8ae37d506ccfa25057961b7b63d581def6f99165ea89c7e/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", size = 144819 }, - { url = "https://files.pythonhosted.org/packages/a2/51/e5023f937d7f307c948ed3e5c29c4b7a3e42ed2ee0b8cdf8f3a706089bf0/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", size = 149415 }, - { url = "https://files.pythonhosted.org/packages/24/9d/2e3ef673dfd5be0154b20363c5cdcc5606f35666544381bee15af3778239/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", size = 141212 }, - { url = "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", size = 142167 }, - { url = "https://files.pythonhosted.org/packages/ed/3a/a448bf035dce5da359daf9ae8a16b8a39623cc395a2ffb1620aa1bce62b0/charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", size = 93041 }, - { url = "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", size = 100397 }, - { url = "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", size = 48543 }, +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/8b/825cc84cf13a28bfbcba7c416ec22bf85a9584971be15b21dd8300c65b7f/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", size = 196363 }, + { url = "https://files.pythonhosted.org/packages/23/81/d7eef6a99e42c77f444fdd7bc894b0ceca6c3a95c51239e74a722039521c/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", size = 125639 }, + { url = "https://files.pythonhosted.org/packages/21/67/b4564d81f48042f520c948abac7079356e94b30cb8ffb22e747532cf469d/charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", size = 120451 }, + { url = "https://files.pythonhosted.org/packages/c2/72/12a7f0943dd71fb5b4e7b55c41327ac0a1663046a868ee4d0d8e9c369b85/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", size = 140041 }, + { url = "https://files.pythonhosted.org/packages/67/56/fa28c2c3e31217c4c52158537a2cf5d98a6c1e89d31faf476c89391cd16b/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", size = 150333 }, + { url = "https://files.pythonhosted.org/packages/f9/d2/466a9be1f32d89eb1554cf84073a5ed9262047acee1ab39cbaefc19635d2/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", size = 142921 }, + { url = "https://files.pythonhosted.org/packages/f8/01/344ec40cf5d85c1da3c1f57566c59e0c9b56bcc5566c08804a95a6cc8257/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", size = 144785 }, + { url = "https://files.pythonhosted.org/packages/73/8b/2102692cb6d7e9f03b9a33a710e0164cadfce312872e3efc7cfe22ed26b4/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", size = 146631 }, + { url = "https://files.pythonhosted.org/packages/d8/96/cc2c1b5d994119ce9f088a9a0c3ebd489d360a2eb058e2c8049f27092847/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", size = 140867 }, + { url = "https://files.pythonhosted.org/packages/c9/27/cde291783715b8ec30a61c810d0120411844bc4c23b50189b81188b273db/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", size = 149273 }, + { url = "https://files.pythonhosted.org/packages/3a/a4/8633b0fc1a2d1834d5393dafecce4a1cc56727bfd82b4dc18fc92f0d3cc3/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", size = 152437 }, + { url = "https://files.pythonhosted.org/packages/64/ea/69af161062166b5975ccbb0961fd2384853190c70786f288684490913bf5/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", size = 150087 }, + { url = "https://files.pythonhosted.org/packages/3b/fd/e60a9d9fd967f4ad5a92810138192f825d77b4fa2a557990fd575a47695b/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", size = 145142 }, + { url = "https://files.pythonhosted.org/packages/6d/02/8cb0988a1e49ac9ce2eed1e07b77ff118f2923e9ebd0ede41ba85f2dcb04/charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", size = 94701 }, + { url = "https://files.pythonhosted.org/packages/d6/20/f1d4670a8a723c46be695dff449d86d6092916f9e99c53051954ee33a1bc/charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", size = 102191 }, + { url = "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", size = 193339 }, + { url = "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", size = 124366 }, + { url = "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", size = 118874 }, + { url = "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", size = 138243 }, + { url = "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", size = 148676 }, + { url = "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", size = 141289 }, + { url = "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", size = 142585 }, + { url = "https://files.pythonhosted.org/packages/3b/a0/a68980ab8a1f45a36d9745d35049c1af57d27255eff8c907e3add84cf68f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", size = 144408 }, + { url = "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", size = 139076 }, + { url = "https://files.pythonhosted.org/packages/fb/9d/9c13753a5a6e0db4a0a6edb1cef7aee39859177b64e1a1e748a6e3ba62c2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", size = 146874 }, + { url = "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", size = 150871 }, + { url = "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", size = 148546 }, + { url = "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", size = 143048 }, + { url = "https://files.pythonhosted.org/packages/01/f8/38842422988b795220eb8038745d27a675ce066e2ada79516c118f291f07/charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", size = 94389 }, + { url = "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", size = 101752 }, + { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 }, + { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 }, + { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 }, + { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 }, + { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 }, + { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 }, + { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 }, + { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 }, + { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 }, + { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 }, + { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 }, + { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 }, + { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 }, + { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 }, + { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, + { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, + { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, + { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, + { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, + { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, + { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, + { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, + { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, + { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, + { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, + { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, + { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, + { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, ] [[package]] @@ -317,61 +311,61 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/61/eb7ce5ed62bacf21beca4937a90fe32545c91a3c8a42a30c6616d48fc70d/coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", size = 206690 }, - { url = "https://files.pythonhosted.org/packages/7d/73/041928e434442bd3afde5584bdc3f932fb4562b1597629f537387cec6f3d/coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", size = 207127 }, - { url = "https://files.pythonhosted.org/packages/c7/c8/6ca52b5147828e45ad0242388477fdb90df2c6cbb9a441701a12b3c71bc8/coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", size = 235654 }, - { url = "https://files.pythonhosted.org/packages/d5/da/9ac2b62557f4340270942011d6efeab9833648380109e897d48ab7c1035d/coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc", size = 233598 }, - { url = "https://files.pythonhosted.org/packages/53/23/9e2c114d0178abc42b6d8d5281f651a8e6519abfa0ef460a00a91f80879d/coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", size = 234732 }, - { url = "https://files.pythonhosted.org/packages/0f/7e/a0230756fb133343a52716e8b855045f13342b70e48e8ad41d8a0d60ab98/coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", size = 233816 }, - { url = "https://files.pythonhosted.org/packages/28/7c/3753c8b40d232b1e5eeaed798c875537cf3cb183fb5041017c1fdb7ec14e/coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", size = 232325 }, - { url = "https://files.pythonhosted.org/packages/57/e3/818a2b2af5b7573b4b82cf3e9f137ab158c90ea750a8f053716a32f20f06/coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", size = 233418 }, - { url = "https://files.pythonhosted.org/packages/c8/fb/4532b0b0cefb3f06d201648715e03b0feb822907edab3935112b61b885e2/coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", size = 209343 }, - { url = "https://files.pythonhosted.org/packages/5a/25/af337cc7421eca1c187cc9c315f0a755d48e755d2853715bfe8c418a45fa/coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", size = 210136 }, - { url = "https://files.pythonhosted.org/packages/ad/5f/67af7d60d7e8ce61a4e2ddcd1bd5fb787180c8d0ae0fbd073f903b3dd95d/coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", size = 206796 }, - { url = "https://files.pythonhosted.org/packages/e1/0e/e52332389e057daa2e03be1fbfef25bb4d626b37d12ed42ae6281d0a274c/coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", size = 207244 }, - { url = "https://files.pythonhosted.org/packages/aa/cd/766b45fb6e090f20f8927d9c7cb34237d41c73a939358bc881883fd3a40d/coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", size = 239279 }, - { url = "https://files.pythonhosted.org/packages/70/6c/a9ccd6fe50ddaf13442a1e2dd519ca805cbe0f1fcd377fba6d8339b98ccb/coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", size = 236859 }, - { url = "https://files.pythonhosted.org/packages/14/6f/8351b465febb4dbc1ca9929505202db909c5a635c6fdf33e089bbc3d7d85/coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", size = 238549 }, - { url = "https://files.pythonhosted.org/packages/68/3c/289b81fa18ad72138e6d78c4c11a82b5378a312c0e467e2f6b495c260907/coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", size = 237477 }, - { url = "https://files.pythonhosted.org/packages/ed/1c/aa1efa6459d822bd72c4abc0b9418cf268de3f60eeccd65dc4988553bd8d/coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", size = 236134 }, - { url = "https://files.pythonhosted.org/packages/fb/c8/521c698f2d2796565fe9c789c2ee1ccdae610b3aa20b9b2ef980cc253640/coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", size = 236910 }, - { url = "https://files.pythonhosted.org/packages/7d/30/033e663399ff17dca90d793ee8a2ea2890e7fdf085da58d82468b4220bf7/coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", size = 209348 }, - { url = "https://files.pythonhosted.org/packages/20/05/0d1ccbb52727ccdadaa3ff37e4d2dc1cd4d47f0c3df9eb58d9ec8508ca88/coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", size = 210230 }, - { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983 }, - { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221 }, - { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342 }, - { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371 }, - { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455 }, - { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924 }, - { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252 }, - { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897 }, - { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606 }, - { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373 }, - { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007 }, - { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269 }, - { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886 }, - { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037 }, - { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038 }, - { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690 }, - { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765 }, - { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611 }, - { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671 }, - { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368 }, - { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758 }, - { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035 }, - { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839 }, - { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569 }, - { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927 }, - { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401 }, - { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301 }, - { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598 }, - { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307 }, - { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453 }, - { url = "https://files.pythonhosted.org/packages/a5/2b/0354ed096bca64dc8e32a7cbcae28b34cb5ad0b1fe2125d6d99583313ac0/coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", size = 198926 }, +version = "7.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/12/3669b6382792783e92046730ad3327f53b2726f0603f4c311c4da4824222/coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", size = 798716 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/93/4ad92f71e28ece5c0326e5f4a6630aa4928a8846654a65cfff69b49b95b9/coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07", size = 206713 }, + { url = "https://files.pythonhosted.org/packages/01/ae/747a580b1eda3f2e431d87de48f0604bd7bc92e52a1a95185a4aa585bc47/coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0", size = 207149 }, + { url = "https://files.pythonhosted.org/packages/07/1a/1f573f8a6145f6d4c9130bbc120e0024daf1b24cf2a78d7393fa6eb6aba7/coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72", size = 235584 }, + { url = "https://files.pythonhosted.org/packages/40/42/c8523f2e4db34aa9389caee0d3688b6ada7a84fcc782e943a868a7f302bd/coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51", size = 233486 }, + { url = "https://files.pythonhosted.org/packages/8d/95/565c310fffa16ede1a042e9ea1ca3962af0d8eb5543bc72df6b91dc0c3d5/coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491", size = 234649 }, + { url = "https://files.pythonhosted.org/packages/d5/81/3b550674d98968ec29c92e3e8650682be6c8b1fa7581a059e7e12e74c431/coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b", size = 233744 }, + { url = "https://files.pythonhosted.org/packages/0d/70/d66c7f51b3e33aabc5ea9f9624c1c9d9655472962270eb5e7b0d32707224/coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea", size = 232204 }, + { url = "https://files.pythonhosted.org/packages/23/2d/2b3a2dbed7a5f40693404c8a09e779d7c1a5fbed089d3e7224c002129ec8/coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a", size = 233335 }, + { url = "https://files.pythonhosted.org/packages/5a/4f/92d1d2ad720d698a4e71c176eacf531bfb8e0721d5ad560556f2c484a513/coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa", size = 209435 }, + { url = "https://files.pythonhosted.org/packages/c7/b9/cdf158e7991e2287bcf9082670928badb73d310047facac203ff8dcd5ff3/coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172", size = 210243 }, + { url = "https://files.pythonhosted.org/packages/87/31/9c0cf84f0dfcbe4215b7eb95c31777cdc0483c13390e69584c8150c85175/coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b", size = 206819 }, + { url = "https://files.pythonhosted.org/packages/53/ed/a38401079ad320ad6e054a01ec2b61d270511aeb3c201c80e99c841229d5/coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25", size = 207263 }, + { url = "https://files.pythonhosted.org/packages/20/e7/c3ad33b179ab4213f0d70da25a9c214d52464efa11caeab438592eb1d837/coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546", size = 239205 }, + { url = "https://files.pythonhosted.org/packages/36/91/fc02e8d8e694f557752120487fd982f654ba1421bbaa5560debf96ddceda/coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b", size = 236612 }, + { url = "https://files.pythonhosted.org/packages/cc/57/cb08f0eda0389a9a8aaa4fc1f9fec7ac361c3e2d68efd5890d7042c18aa3/coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e", size = 238479 }, + { url = "https://files.pythonhosted.org/packages/d5/c9/2c7681a9b3ca6e6f43d489c2e6653a53278ed857fd6e7010490c307b0a47/coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718", size = 237405 }, + { url = "https://files.pythonhosted.org/packages/b5/4e/ebfc6944b96317df8b537ae875d2e57c27b84eb98820bc0a1055f358f056/coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db", size = 236038 }, + { url = "https://files.pythonhosted.org/packages/13/f2/3a0bf1841a97c0654905e2ef531170f02c89fad2555879db8fe41a097871/coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522", size = 236812 }, + { url = "https://files.pythonhosted.org/packages/b9/9c/66bf59226b52ce6ed9541b02d33e80a6e816a832558fbdc1111a7bd3abd4/coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf", size = 209400 }, + { url = "https://files.pythonhosted.org/packages/2a/a0/b0790934c04dfc8d658d4a62acb8f7ca0efdf3818456fcad757b11c6479d/coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19", size = 210243 }, + { url = "https://files.pythonhosted.org/packages/7d/e7/9291de916d084f41adddfd4b82246e68d61d6a75747f075f7e64628998d2/coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", size = 207013 }, + { url = "https://files.pythonhosted.org/packages/27/03/932c2c5717a7fa80cd43c6a07d3177076d97b79f12f40f882f9916db0063/coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", size = 207251 }, + { url = "https://files.pythonhosted.org/packages/d5/3f/0af47dcb9327f65a45455fbca846fe96eb57c153af46c4754a3ba678938a/coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", size = 240268 }, + { url = "https://files.pythonhosted.org/packages/8a/3c/37a9d81bbd4b23bc7d46ca820e16174c613579c66342faa390a271d2e18b/coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", size = 237298 }, + { url = "https://files.pythonhosted.org/packages/c0/70/6b0627e5bd68204ee580126ed3513140b2298995c1233bd67404b4e44d0e/coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", size = 239367 }, + { url = "https://files.pythonhosted.org/packages/3c/eb/634d7dfab24ac3b790bebaf9da0f4a5352cbc125ce6a9d5c6cf4c6cae3c7/coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", size = 238853 }, + { url = "https://files.pythonhosted.org/packages/d9/0d/8e3ed00f1266ef7472a4e33458f42e39492e01a64281084fb3043553d3f1/coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", size = 237160 }, + { url = "https://files.pythonhosted.org/packages/ce/9c/4337f468ef0ab7a2e0887a9c9da0e58e2eada6fc6cbee637a4acd5dfd8a9/coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", size = 238824 }, + { url = "https://files.pythonhosted.org/packages/5e/09/3e94912b8dd37251377bb02727a33a67ee96b84bbbe092f132b401ca5dd9/coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", size = 209639 }, + { url = "https://files.pythonhosted.org/packages/01/69/d4f3a4101171f32bc5b3caec8ff94c2c60f700107a6aaef7244b2c166793/coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", size = 210428 }, + { url = "https://files.pythonhosted.org/packages/c2/4d/2dede4f7cb5a70fb0bb40a57627fddf1dbdc6b9c1db81f7c4dcdcb19e2f4/coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", size = 207039 }, + { url = "https://files.pythonhosted.org/packages/3f/f9/d86368ae8c79e28f1fb458ebc76ae9ff3e8bd8069adc24e8f2fed03c58b7/coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", size = 207298 }, + { url = "https://files.pythonhosted.org/packages/64/c5/b4cc3c3f64622c58fbfd4d8b9a7a8ce9d355f172f91fcabbba1f026852f6/coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", size = 239813 }, + { url = "https://files.pythonhosted.org/packages/8a/86/14c42e60b70a79b26099e4d289ccdfefbc68624d096f4481163085aa614c/coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", size = 236959 }, + { url = "https://files.pythonhosted.org/packages/7f/f8/4436a643631a2fbab4b44d54f515028f6099bfb1cd95b13cfbf701e7f2f2/coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", size = 238950 }, + { url = "https://files.pythonhosted.org/packages/49/50/1571810ddd01f99a0a8be464a4ac8b147f322cd1e8e296a1528984fc560b/coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", size = 238610 }, + { url = "https://files.pythonhosted.org/packages/f3/8c/6312d241fe7cbd1f0cade34a62fea6f333d1a261255d76b9a87074d8703c/coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", size = 236697 }, + { url = "https://files.pythonhosted.org/packages/ce/5f/fef33dfd05d87ee9030f614c857deb6df6556b8f6a1c51bbbb41e24ee5ac/coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", size = 238541 }, + { url = "https://files.pythonhosted.org/packages/a9/64/6a984b6e92e1ea1353b7ffa08e27f707a5e29b044622445859200f541e8c/coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", size = 209707 }, + { url = "https://files.pythonhosted.org/packages/5c/60/ce5a9e942e9543783b3db5d942e0578b391c25cdd5e7f342d854ea83d6b7/coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", size = 210439 }, + { url = "https://files.pythonhosted.org/packages/78/53/6719677e92c308207e7f10561a1b16ab8b5c00e9328efc9af7cfd6fb703e/coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", size = 207784 }, + { url = "https://files.pythonhosted.org/packages/fa/dd/7054928930671fcb39ae6a83bb71d9ab5f0afb733172543ced4b09a115ca/coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", size = 208058 }, + { url = "https://files.pythonhosted.org/packages/b5/7d/fd656ddc2b38301927b9eb3aae3fe827e7aa82e691923ed43721fd9423c9/coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", size = 250772 }, + { url = "https://files.pythonhosted.org/packages/90/d0/eb9a3cc2100b83064bb086f18aedde3afffd7de6ead28f69736c00b7f302/coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", size = 246490 }, + { url = "https://files.pythonhosted.org/packages/45/44/3f64f38f6faab8a0cfd2c6bc6eb4c6daead246b97cf5f8fc23bf3788f841/coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", size = 248848 }, + { url = "https://files.pythonhosted.org/packages/5d/11/4c465a5f98656821e499f4b4619929bd5a34639c466021740ecdca42aa30/coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", size = 248340 }, + { url = "https://files.pythonhosted.org/packages/f1/96/ebecda2d016cce9da812f404f720ca5df83c6b29f65dc80d2000d0078741/coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", size = 246229 }, + { url = "https://files.pythonhosted.org/packages/16/d9/3d820c00066ae55d69e6d0eae11d6149a5ca7546de469ba9d597f01bf2d7/coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", size = 247510 }, + { url = "https://files.pythonhosted.org/packages/8f/c3/4fa1eb412bb288ff6bfcc163c11700ff06e02c5fad8513817186e460ed43/coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", size = 210353 }, + { url = "https://files.pythonhosted.org/packages/7e/77/03fc2979d1538884d921c2013075917fc927f41cd8526909852fe4494112/coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", size = 211502 }, + { url = "https://files.pythonhosted.org/packages/cc/56/e1d75e8981a2a92c2a777e67c26efa96c66da59d645423146eb9ff3a851b/coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e", size = 198954 }, ] [package.optional-dependencies] @@ -394,60 +388,60 @@ wheels = [ [[package]] name = "cytoolz" -version = "0.12.3" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "toolz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/d8/8df71050b214686591241a1826d2e6934b5c295c5bc57f643e4ed697f1eb/cytoolz-0.12.3.tar.gz", hash = "sha256:4503dc59f4ced53a54643272c61dc305d1dbbfbd7d6bdf296948de9f34c3a282", size = 625899 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/11/ebc8b85c77cc2247c169af808901a80e5d29429b3c9b0d114d4048ad2a5a/cytoolz-0.12.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bbe58e26c84b163beba0fbeacf6b065feabc8f75c6d3fe305550d33f24a2d346", size = 413462 }, - { url = "https://files.pythonhosted.org/packages/19/22/57f20a9f135a08a6fc9848744c324c4facca2b1370a1ae4e8333e274c707/cytoolz-0.12.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c51b66ada9bfdb88cf711bf350fcc46f82b83a4683cf2413e633c31a64df6201", size = 396040 }, - { url = "https://files.pythonhosted.org/packages/12/30/337a18b1182888bf5d59357095a83f537a88e2db32ee0381166a83deddda/cytoolz-0.12.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e70d9c615e5c9dc10d279d1e32e846085fe1fd6f08d623ddd059a92861f4e3dd", size = 1933264 }, - { url = "https://files.pythonhosted.org/packages/93/a3/c244bfacd046316cd0a4cffd2e245a8dd9b685168497c3b7c776bdb72c59/cytoolz-0.12.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a83f4532707963ae1a5108e51fdfe1278cc8724e3301fee48b9e73e1316de64f", size = 2014114 }, - { url = "https://files.pythonhosted.org/packages/a6/40/51bdfe7fd1cad802eabebb7bb742e694227db25c4806eebf4358229e3220/cytoolz-0.12.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d028044524ee2e815f36210a793c414551b689d4f4eda28f8bbb0883ad78bf5f", size = 1999458 }, - { url = "https://files.pythonhosted.org/packages/f7/0b/5973e0ceab96349f9cabb3b20ecc3a717a19e355f68d354dfa538bebb226/cytoolz-0.12.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c2875bcd1397d0627a09a4f9172fa513185ad302c63758efc15b8eb33cc2a98", size = 1956106 }, - { url = "https://files.pythonhosted.org/packages/d3/01/bb850ad1467f0d1dc5a21a05e3df6ad308a19d095f07583c4e65a85e2ba8/cytoolz-0.12.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:131ff4820e5d64a25d7ad3c3556f2d8aa65c66b3f021b03f8a8e98e4180dd808", size = 1861974 }, - { url = "https://files.pythonhosted.org/packages/c9/97/207e544a2c9c3d8735102403982a319c252c337e9cf792c2753c22cff1b6/cytoolz-0.12.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:04afa90d9d9d18394c40d9bed48c51433d08b57c042e0e50c8c0f9799735dcbd", size = 1937926 }, - { url = "https://files.pythonhosted.org/packages/76/1e/6cc756537caef16cd491de1550c1f25140528785e28263326bd3243a19ed/cytoolz-0.12.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:dc1ca9c610425f9854323669a671fc163300b873731584e258975adf50931164", size = 1859141 }, - { url = "https://files.pythonhosted.org/packages/20/43/30819bbc4348cabb44d800ab0d0efb29a9d21db8f75060fd1199d5300953/cytoolz-0.12.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bfa3f8e01bc423a933f2e1c510cbb0632c6787865b5242857cc955cae220d1bf", size = 2013731 }, - { url = "https://files.pythonhosted.org/packages/bd/ab/cacabf2d0dfea006575fea900131eb491370ee1664783f80cb131f577001/cytoolz-0.12.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:f702e295dddef5f8af4a456db93f114539b8dc2a7a9bc4de7c7e41d169aa6ec3", size = 2015075 }, - { url = "https://files.pythonhosted.org/packages/79/6f/98eeee4f735bff536654625e0c38e50c4b01c13fbd9c744d3284dbccc54d/cytoolz-0.12.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0fbad1fb9bb47e827d00e01992a099b0ba79facf5e5aa453be066033232ac4b5", size = 1953391 }, - { url = "https://files.pythonhosted.org/packages/6a/81/80bcbc750e3c8f72d07f1e61c25597fdb23fec3c3d52542f220bff87372c/cytoolz-0.12.3-cp310-cp310-win32.whl", hash = "sha256:8587c3c3dbe78af90c5025288766ac10dc2240c1e76eb0a93a4e244c265ccefd", size = 320881 }, - { url = "https://files.pythonhosted.org/packages/45/9e/cce296c6da9404ce210c79700b85d9ba582a6e908ee88ec707efec09bcd9/cytoolz-0.12.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e45803d9e75ef90a2f859ef8f7f77614730f4a8ce1b9244375734567299d239", size = 362216 }, - { url = "https://files.pythonhosted.org/packages/98/8a/618a70326d4a52998a6bbb11ca019979891a51b85cbbfce8f9762eec5d2c/cytoolz-0.12.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3ac4f2fb38bbc67ff1875b7d2f0f162a247f43bd28eb7c9d15e6175a982e558d", size = 416356 }, - { url = "https://files.pythonhosted.org/packages/bb/17/542f708b9116aa8d8c9c5551500bfa6ab1bddd3edc11457070599a97c197/cytoolz-0.12.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0cf1e1e96dd86829a0539baf514a9c8473a58fbb415f92401a68e8e52a34ecd5", size = 398412 }, - { url = "https://files.pythonhosted.org/packages/d6/9c/52a0460f2b59009da63794cfe11ad002d55fc88fced6ccc85f7ae10a3259/cytoolz-0.12.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08a438701c6141dd34eaf92e9e9a1f66e23a22f7840ef8a371eba274477de85d", size = 2090389 }, - { url = "https://files.pythonhosted.org/packages/c7/6d/284d4a1f88b1e63b8a1c80162244ca5d4e0b31647c4f56186f3385fd0d0e/cytoolz-0.12.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6b6f11b0d7ed91be53166aeef2a23a799e636625675bb30818f47f41ad31821", size = 2187333 }, - { url = "https://files.pythonhosted.org/packages/3e/44/44efcf2acf824aefab5f3fdb97235d360c216c2425db391a8dee687f1774/cytoolz-0.12.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7fde09384d23048a7b4ac889063761e44b89a0b64015393e2d1d21d5c1f534a", size = 2173106 }, - { url = "https://files.pythonhosted.org/packages/6f/74/7c2d5af25d51f481e9be771bda2cf5496631cd0fba876d2cc0086caa732d/cytoolz-0.12.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d3bfe45173cc8e6c76206be3a916d8bfd2214fb2965563e288088012f1dabfc", size = 2098805 }, - { url = "https://files.pythonhosted.org/packages/e0/e5/9995bf66caee139459ab70d8b5820c37718d5f7e7380481adb85ef522e4d/cytoolz-0.12.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27513a5d5b6624372d63313574381d3217a66e7a2626b056c695179623a5cb1a", size = 1995956 }, - { url = "https://files.pythonhosted.org/packages/93/73/eee7a7f455d4691f1915b35d1713ba69c6851f940c6f8fffdd2efcbe4411/cytoolz-0.12.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d294e5e81ff094fe920fd545052ff30838ea49f9e91227a55ecd9f3ca19774a0", size = 2074891 }, - { url = "https://files.pythonhosted.org/packages/a3/c7/6f0c60bbb911ee3f33b243a695e2fc944285a1865bbb1dfefee1b7c35d62/cytoolz-0.12.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:727b01a2004ddb513496507a695e19b5c0cfebcdfcc68349d3efd92a1c297bf4", size = 1980228 }, - { url = "https://files.pythonhosted.org/packages/58/7c/d7524626b415d410208fd2774ff2824fab4dcbe4a496d53bdba85a1407df/cytoolz-0.12.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:fe1e1779a39dbe83f13886d2b4b02f8c4b10755e3c8d9a89b630395f49f4f406", size = 2147616 }, - { url = "https://files.pythonhosted.org/packages/a5/7b/9bdf8615e61958386f5c7108d857312214837ae3eacf3589873499d2f0aa/cytoolz-0.12.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:de74ef266e2679c3bf8b5fc20cee4fc0271ba13ae0d9097b1491c7a9bcadb389", size = 2148775 }, - { url = "https://files.pythonhosted.org/packages/45/91/b92ab0e29bf7cfaacfedc85391a0d0365a6ac74363f2532ba307a760db14/cytoolz-0.12.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e04d22049233394e0b08193aca9737200b4a2afa28659d957327aa780ddddf2", size = 2079810 }, - { url = "https://files.pythonhosted.org/packages/2f/33/8204d65871fa639d1d3ae788e3afc187f610126f53f2324d4aa37caf0630/cytoolz-0.12.3-cp311-cp311-win32.whl", hash = "sha256:20d36430d8ac809186736fda735ee7d595b6242bdb35f69b598ef809ebfa5605", size = 320212 }, - { url = "https://files.pythonhosted.org/packages/ab/e3/7ce2efaf243c9ee75fc730cd018981788b56e7ad3767f24e7a9cd14831ac/cytoolz-0.12.3-cp311-cp311-win_amd64.whl", hash = "sha256:780c06110f383344d537f48d9010d79fa4f75070d214fc47f389357dd4f010b6", size = 363570 }, - { url = "https://files.pythonhosted.org/packages/7f/57/b0feabefdff4707d0b96bf75e2298ecb209ba22c2e3fd15e5230dd68441a/cytoolz-0.12.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:86923d823bd19ce35805953b018d436f6b862edd6a7c8b747a13d52b39ed5716", size = 419825 }, - { url = "https://files.pythonhosted.org/packages/54/82/795aa9f91ee81818732b435755559857a76e16b7e435e1de434b47ce72b9/cytoolz-0.12.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3e61acfd029bfb81c2c596249b508dfd2b4f72e31b7b53b62e5fb0507dd7293", size = 401673 }, - { url = "https://files.pythonhosted.org/packages/23/f3/298f32b2e374f4f716ca74a9e46b64ee1df9f160de262391f7f9bc53ecca/cytoolz-0.12.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd728f4e6051af6af234651df49319da1d813f47894d4c3c8ab7455e01703a37", size = 2096352 }, - { url = "https://files.pythonhosted.org/packages/39/44/49929b33bd0cdccc98b281e4ca11f0836b2963c6fdec8ebb7891807ed908/cytoolz-0.12.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe8c6267caa7ec67bcc37e360f0d8a26bc3bdce510b15b97f2f2e0143bdd3673", size = 2161581 }, - { url = "https://files.pythonhosted.org/packages/e9/77/980a8bc123490dd7112e1e068da989932b7612504355ddd25593880c3156/cytoolz-0.12.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99462abd8323c52204a2a0ce62454ce8fa0f4e94b9af397945c12830de73f27e", size = 2178057 }, - { url = "https://files.pythonhosted.org/packages/23/d9/2f7a4db7f92eab4b567e56cc2fc147fed1ef35f7968e44cefcbbfb366980/cytoolz-0.12.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da125221b1fa25c690fcd030a54344cecec80074df018d906fc6a99f46c1e3a6", size = 2130881 }, - { url = "https://files.pythonhosted.org/packages/85/bf/1147229198a8fc3f2090d01263234d47b5b7f8c52c20090b1cceda0929cd/cytoolz-0.12.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c18e351956f70db9e2d04ff02f28e9a41839250d3f936a4c8a1eabd1c3094d2", size = 1979975 }, - { url = "https://files.pythonhosted.org/packages/5b/53/b730e9f428e74971f934bf73f0868099d325ffbf0c080a201bb16b6ab508/cytoolz-0.12.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:921e6d2440ac758c4945c587b1d1d9b781b72737ac0c0ca5d5e02ca1db8bded2", size = 2086861 }, - { url = "https://files.pythonhosted.org/packages/24/24/df510850c1c57ad69a23a2700083cfd285faf27d16e61f0e503eec122473/cytoolz-0.12.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1651a9bd591a8326329ce1d6336f3129161a36d7061a4d5ea9e5377e033364cf", size = 1973211 }, - { url = "https://files.pythonhosted.org/packages/b6/ad/a6e27924a6c8048b4f1ffbd8b9b0b871642bd94d3e457aa42a629c1f667b/cytoolz-0.12.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8893223b87c2782bd59f9c4bd5c7bf733edd8728b523c93efb91d7468b486528", size = 2133017 }, - { url = "https://files.pythonhosted.org/packages/26/a3/f9dfb406232d0a100994a86c123259cd2ab023aa8ae325b0d9926f80091f/cytoolz-0.12.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:e4d2961644153c5ae186db964aa9f6109da81b12df0f1d3494b4e5cf2c332ee2", size = 2156771 }, - { url = "https://files.pythonhosted.org/packages/fb/bf/ce2c6f6175a29c830904b23faee557de8c167255dbb2bb84e04d7cf5605a/cytoolz-0.12.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:71b6eb97f6695f7ba8ce69c49b707a351c5f46fd97f5aeb5f6f2fb0d6e72b887", size = 2121104 }, - { url = "https://files.pythonhosted.org/packages/bf/97/95a5fb2b5db9b1ea8856741a2a94741a71cb5640112403029beb7b3ef1df/cytoolz-0.12.3-cp312-cp312-win32.whl", hash = "sha256:cee3de65584e915053412cd178729ff510ad5f8f585c21c5890e91028283518f", size = 320537 }, - { url = "https://files.pythonhosted.org/packages/0a/11/3e69585342ce4e6b7f2f6139c8aa235dab5a4fe5c76a051fe01696618bd0/cytoolz-0.12.3-cp312-cp312-win_amd64.whl", hash = "sha256:9eef0d23035fa4dcfa21e570961e86c375153a7ee605cdd11a8b088c24f707f6", size = 363238 }, - { url = "https://files.pythonhosted.org/packages/00/8c/c58e2f14a88132722988ee0951b01ee6cc4880302384f064902d6e8fb048/cytoolz-0.12.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:55f9bd1ae6c2a27eda5abe2a0b65a83029d2385c5a1da7b8ef47af5905d7e905", size = 353101 }, - { url = "https://files.pythonhosted.org/packages/35/99/6ef817203004c7055370fa1ab3bb0dfc6b7ebd0b4942099ce86007614001/cytoolz-0.12.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2d271393c378282727f1231d40391ae93b93ddc0997448acc21dd0cb6a1e56d", size = 385225 }, - { url = "https://files.pythonhosted.org/packages/a2/25/64e5907b15bd16f0f38e825762540ee3293b513f2eb4b9bb51b7f78d5457/cytoolz-0.12.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee98968d6a66ee83a8ceabf31182189ab5d8598998c8ce69b6d5843daeb2db60", size = 405888 }, - { url = "https://files.pythonhosted.org/packages/17/c0/0e19ab05222cf2370d580e5500409c26266f89e853fa18b2b12c530f3957/cytoolz-0.12.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01cfb8518828c1189200c02a5010ea404407fb18fd5589e29c126e84bbeadd36", size = 396781 }, - { url = "https://files.pythonhosted.org/packages/5e/39/bee67e2b541ca3478a982c68d7d23b718fa7f2947bdfc0eecdba9c4e0882/cytoolz-0.12.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:456395d7aec01db32bf9e6db191d667347c78d8d48e77234521fa1078f60dabb", size = 340712 }, +sdist = { url = "https://files.pythonhosted.org/packages/e2/4c/ca9b05bdfa28ddbb4a5365c27021a1d4be61db7d8f6b4e5d4e76aa4ba3b7/cytoolz-1.0.0.tar.gz", hash = "sha256:eb453b30182152f9917a5189b7d99046b6ce90cdf8aeb0feff4b2683e600defd", size = 626708 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/77/2afed35b93fdc38c4565ae79aca6b6149d0ea2fc4eeeca9b0adf9da04b9e/cytoolz-1.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ecf5a887acb8f079ab1b81612b1c889bcbe6611aa7804fd2df46ed310aa5a345", size = 403505 }, + { url = "https://files.pythonhosted.org/packages/a8/dc/6b5af6932b656213883557dcc6b1f843ec302dc02fec4b75bf1356b938f9/cytoolz-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0ef30c1e091d4d59d14d8108a16d50bd227be5d52a47da891da5019ac2f8e4", size = 383918 }, + { url = "https://files.pythonhosted.org/packages/2e/8c/d42dc240cda418b8241541c240c4696cf99475141c4d58fbe89b8c39bac1/cytoolz-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7df2dfd679f0517a96ced1cdd22f5c6c6aeeed28d928a82a02bf4c3fd6fd7ac4", size = 1934558 }, + { url = "https://files.pythonhosted.org/packages/ff/74/af7863cc407ebf535aec9adf0cb72bbac2f036ec2550726d4d8ab00eb41c/cytoolz-1.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c51452c938e610f57551aa96e34924169c9100c0448bac88c2fb395cbd3538c", size = 2015123 }, + { url = "https://files.pythonhosted.org/packages/01/98/83a0d9051e56e0b26a290439bd15b696c431c91d1dca384370cf9b23f04a/cytoolz-1.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6433f03910c5e5345d82d6299457c26bf33821224ebb837c6b09d9cdbc414a6c", size = 2000496 }, + { url = "https://files.pythonhosted.org/packages/d1/2d/ea68ba5d9c07f5d6cdb8ef85ec92f1a573deaad998807d035d2ef71aeb00/cytoolz-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:389ec328bb535f09e71dfe658bf0041f17194ca4cedaacd39bafe7893497a819", size = 1957529 }, + { url = "https://files.pythonhosted.org/packages/7d/f3/e5b6b7128412bcb8d58c5cbd5a785befdc2c633502653937be41a54b2037/cytoolz-1.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c64658e1209517ce4b54c1c9269a508b289d8d55fc742760e4b8579eacf09a33", size = 1863322 }, + { url = "https://files.pythonhosted.org/packages/ee/ff/534c227de78e9c45c6e764b46830640f73390b7fe5dd39556cd4de4fd3b8/cytoolz-1.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f6039a9bd5bb988762458b9ca82b39e60ca5e5baae2ba93913990dcc5d19fa88", size = 1849933 }, + { url = "https://files.pythonhosted.org/packages/ef/a9/7a51c084ceba8809f18aacb0bae86caf02aa5d5ebe5d5465819228a690d0/cytoolz-1.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85c9c8c4465ed1b2c8d67003809aec9627b129cb531d2f6cf0bbfe39952e7e4d", size = 1852341 }, + { url = "https://files.pythonhosted.org/packages/ae/01/9b00fa8956c6b76ffd72fc896b2ba4e06165d7f90e03cf4ff253a4282d01/cytoolz-1.0.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:49375aad431d76650f94877afb92f09f58b6ff9055079ef4f2cd55313f5a1b39", size = 1989871 }, + { url = "https://files.pythonhosted.org/packages/30/5a/3857a60ce3083d083fffcac13938ae045d22ee0a55f88b83a22443132e5d/cytoolz-1.0.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:4c45106171c824a61e755355520b646cb35a1987b34bbf5789443823ee137f63", size = 1994484 }, + { url = "https://files.pythonhosted.org/packages/6c/3d/8585a635ebeba67f234f7779926519fda732399dd875b7cdff2cb2a3bff7/cytoolz-1.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3b319a7f0fed5db07d189db4046162ebc183c108df3562a65ba6ebe862d1f634", size = 1896072 }, + { url = "https://files.pythonhosted.org/packages/4c/3f/9f208381c12d2c8437ea09eef56f12c6f44af74ef5bc7546ca4fb099979e/cytoolz-1.0.0-cp310-cp310-win32.whl", hash = "sha256:9770e1b09748ad0d751853d994991e2592a9f8c464a87014365f80dac2e83faa", size = 322319 }, + { url = "https://files.pythonhosted.org/packages/d7/95/cbc120ba4f70f874481f6ec650d26c265db1645fb5285a81e589d5831073/cytoolz-1.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:20194dd02954c00c1f0755e636be75a20781f91a4ac9270c7f747e82d3c7f5a5", size = 363803 }, + { url = "https://files.pythonhosted.org/packages/bc/99/b489081777ad02c9bba294c757583416d0bdbd9403017145aba68145c16f/cytoolz-1.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dffc22fd2c91be64dbdbc462d0786f8e8ac9a275cfa1869a1084d1867d4f67e0", size = 406148 }, + { url = "https://files.pythonhosted.org/packages/b2/d3/a4d58bf89924dbca34e8dbb643b26935e08c16b4a2ee255d43a8b7489939/cytoolz-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a99e7e29274e293f4ffe20e07f76c2ac753a78f1b40c1828dfc54b2981b2f6c4", size = 384956 }, + { url = "https://files.pythonhosted.org/packages/81/d4/4d09e6571ef3b143f668c590a7a00c97ff24e6df6901f457ea7c782cd2ba/cytoolz-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c507a3e0a45c41d66b43f96797290d75d1e7a8549aa03a4a6b8854fdf3f7b8d8", size = 2091688 }, + { url = "https://files.pythonhosted.org/packages/8d/7b/68c89bed2e0490e9b946574c3bc79711179f35b1dc5eb31046c535f1bed2/cytoolz-1.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:643a593ec272ef7429099e1182a22f64ec2696c00d295d2a5be390db1b7ff176", size = 2188448 }, + { url = "https://files.pythonhosted.org/packages/56/a3/4e536fc7b72fd7495e19180463e8160a4fe1d50ab59a5854fc596621d5c3/cytoolz-1.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ce38e2e42cbae30446190c59b92a8a9029e1806fd79eaf88f48b0fe33003893", size = 2174196 }, + { url = "https://files.pythonhosted.org/packages/5a/7f/0451778af9e22755a95ef4400ee7fc6e41387521ab0f17699593cb07169a/cytoolz-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810a6a168b8c5ecb412fbae3dd6f7ed6c6253a63caf4174ee9794ebd29b2224f", size = 2099823 }, + { url = "https://files.pythonhosted.org/packages/58/b7/8ffdef1ac8f74b0cc650b9d4a74d93d911a7e20fcf7cc0abac0f4bce225f/cytoolz-1.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ce8a2a85c0741c1b19b16e6782c4a5abc54c3caecda66793447112ab2fa9884", size = 1996733 }, + { url = "https://files.pythonhosted.org/packages/1c/ab/9c694c883f3038d167b797cc55c64c2bdb64146428000cea15f235f30a0f/cytoolz-1.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ea4ac72e6b830861035c4c7999af8e55813f57c6d1913a3d93cc4a6babc27bf7", size = 2013725 }, + { url = "https://files.pythonhosted.org/packages/6c/df/859faaee91c795dc969c79cd38159031f373828d44b0b18999feb7d9a44d/cytoolz-1.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a09cdfb21dfb38aa04df43e7546a41f673377eb5485da88ceb784e327ec7603b", size = 1994851 }, + { url = "https://files.pythonhosted.org/packages/34/2a/26ac5a34e859c5ba32351f5a74492f4ed12e7a7e75b6afccf11c4100aa70/cytoolz-1.0.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:658dd85deb375ff7af990a674e5c9058cef1c9d1f5dc89bc87b77be499348144", size = 2155343 }, + { url = "https://files.pythonhosted.org/packages/3d/41/f687d2e40407b29bfcce36a7d456dad368283ea543aa39da53bcc119974e/cytoolz-1.0.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9715d1ff5576919d10b68f17241375f6a1eec8961c25b78a83e6ef1487053f39", size = 2163507 }, + { url = "https://files.pythonhosted.org/packages/39/7c/70d529f909d97ea214d59923c19e3d05a3768fe8e2066542b72550a31ca4/cytoolz-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f370a1f1f1afc5c1c8cc5edc1cfe0ba444263a0772af7ce094be8e734f41769d", size = 2054428 }, + { url = "https://files.pythonhosted.org/packages/5a/4a/7bb2eafe4077f6d9867547ca74ca4b75bc8a081e32a47e186e5c067f6cab/cytoolz-1.0.0-cp311-cp311-win32.whl", hash = "sha256:dbb2ec1177dca700f3db2127e572da20de280c214fc587b2a11c717fc421af56", size = 322300 }, + { url = "https://files.pythonhosted.org/packages/5a/ed/a1c955444343224ab1317a41f6575bc640055eb2495e8f9175f8f28bd776/cytoolz-1.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:0983eee73df86e54bb4a79fcc4996aa8b8368fdbf43897f02f9c3bf39c4dc4fb", size = 365539 }, + { url = "https://files.pythonhosted.org/packages/28/2e/a8b71f74ee75f33164bfbc6324ddd1e8d0f425255b1c930141516f51d539/cytoolz-1.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:10e3986066dc379e30e225b230754d9f5996aa8d84c2accc69c473c21d261e46", size = 414110 }, + { url = "https://files.pythonhosted.org/packages/c6/0a/999af6bb896375b0c687e292a3dcd4edb338a2764bbac40c0ce11eb21c64/cytoolz-1.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:16576f1bb143ee2cb9f719fcc4b845879fb121f9075c7c5e8a5ff4854bd02fc6", size = 390900 }, + { url = "https://files.pythonhosted.org/packages/30/04/02f0ee5339f8c6ef785f06caee85e17e8e0b406e7e553c8fd99a55ff8390/cytoolz-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3faa25a1840b984315e8b3ae517312375f4273ffc9a2f035f548b7f916884f37", size = 2090729 }, + { url = "https://files.pythonhosted.org/packages/04/de/296ded5f81ada90ae4db8c06cc34b142cf6c51fabb4c3c78583abba91c36/cytoolz-1.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:781fce70a277b20fd95dc66811d1a97bb07b611ceea9bda8b7dd3c6a4b05d59a", size = 2155926 }, + { url = "https://files.pythonhosted.org/packages/cc/ce/d5782bdd3d2fd16d87e83e70e14fcfa65ba67ba21cf7e1007505baef7d79/cytoolz-1.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a562c25338eb24d419d1e80a7ae12133844ce6fdeb4ab54459daf250088a1b2", size = 2171893 }, + { url = "https://files.pythonhosted.org/packages/d0/02/22a8c74ff13f8a08e8cacd0a0aa34da3a6e3637cf477e376efc61f7567e5/cytoolz-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f29d8330aaf070304f7cd5cb7e73e198753624eb0aec278557cccd460c699b5b", size = 2125265 }, + { url = "https://files.pythonhosted.org/packages/50/d1/a3f2e2ced1fa7e2b5607d05ed4de9951491004a4804e96f78778d11bebd4/cytoolz-1.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98a96c54aa55ed9c7cdb23c2f0df39a7b4ee518ac54888480b5bdb5ef69c7ef0", size = 1973962 }, + { url = "https://files.pythonhosted.org/packages/3e/10/174d9585e1011824e2e6e79380f8b1c6e49070c35a278d823d996d1c11e6/cytoolz-1.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:287d6d7f475882c2ddcbedf8da9a9b37d85b77690779a2d1cdceb5ae3998d52e", size = 2021691 }, + { url = "https://files.pythonhosted.org/packages/84/aa/bebdca3ae140698d3d4fe75ffd4c87a15ee999cee6b994e0831e5a24cdd7/cytoolz-1.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:05a871688df749b982839239fcd3f8ec3b3b4853775d575ff9cd335fa7c75035", size = 2010169 }, + { url = "https://files.pythonhosted.org/packages/2e/9f/8d5940c953534a4d2ae4419bb4fdc1eb5559345fed1f4838708073d7e6b4/cytoolz-1.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:28bb88e1e2f7d6d4b8e0890b06d292c568984d717de3e8381f2ca1dd12af6470", size = 2154314 }, + { url = "https://files.pythonhosted.org/packages/84/bf/a5414601c95afde30a0c038c5d6273c188f1da8ff25a057bd0c683679e5c/cytoolz-1.0.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:576a4f1fc73d8836b10458b583f915849da6e4f7914f4ecb623ad95c2508cad5", size = 2188368 }, + { url = "https://files.pythonhosted.org/packages/67/fe/990ea30d56b9b6602f3bf4af77a1bfd9233e6ffb761b11b8864619fed508/cytoolz-1.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:509ed3799c47e4ada14f63e41e8f540ac6e2dab97d5d7298934e6abb9d3830ec", size = 2077906 }, + { url = "https://files.pythonhosted.org/packages/ab/95/94b936501e1e23460732631e5d7c6efc4f6c09df21a594dfca9bf30b9411/cytoolz-1.0.0-cp312-cp312-win32.whl", hash = "sha256:9ce25f02b910630f6dc2540dd1e26c9326027ddde6c59f8cab07c56acc70714c", size = 322445 }, + { url = "https://files.pythonhosted.org/packages/be/04/a49b73591b132be5a28c0670229629a3c002cfac59582a1d38b16bdc6fed/cytoolz-1.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:7e53cfcce87e05b7f0ae2fb2b3e5820048cd0bb7b701e92bd8f75c9fbb7c9ae9", size = 364595 }, + { url = "https://files.pythonhosted.org/packages/16/7c/8b9fc006925b08579ae35293ad7d14fea4ee94edf1efaaa17e1bdde85b9a/cytoolz-1.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e672712d5dc3094afc6fb346dd4e9c18c1f3c69608ddb8cf3b9f8428f9c26a5c", size = 345694 }, + { url = "https://files.pythonhosted.org/packages/76/d1/159cc7c0c86d6fb8177be437dd6112d90c7f40ef0ceda2102472242b0ccf/cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86fb208bfb7420e1d0d20065d661310e4a8a6884851d4044f47d37ed4cd7410e", size = 385691 }, + { url = "https://files.pythonhosted.org/packages/43/99/21361970f2d7cce241f116d84e8f5c21f1440414be96d0c8cad7832d35cb/cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dbe5fe3b835859fc559eb59bf2775b5a108f7f2cfab0966f3202859d787d8fd", size = 406251 }, + { url = "https://files.pythonhosted.org/packages/d8/98/bc3d6eadb495de0d48c4d738e5ee6f011d8adbf6a3fcc1f7c17d05bc49d3/cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cace092dfda174eed09ed871793beb5b65633963bcda5b1632c73a5aceea1ce", size = 397203 }, + { url = "https://files.pythonhosted.org/packages/91/b1/df1ed78f08abe8781376bd197532e6e4b38bb3595dd82f6a2b8751407a52/cytoolz-1.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f7a9d816af3be9725c70efe0a6e4352a45d3877751b395014b8eb2f79d7d8d9d", size = 343504 }, ] [[package]] @@ -470,19 +464,19 @@ wheels = [ [[package]] name = "eth-typing" -version = "3.5.2" +version = "5.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c8/52/f5d10803345dd06f9301b4871e8ebb39971a4238b60c61f84ffc83379611/eth-typing-3.5.2.tar.gz", hash = "sha256:22bf051ddfaa35ff827c30090de167e5c5b8cc6d343f7f35c9b1c7553f6ab64d", size = 16850 } +sdist = { url = "https://files.pythonhosted.org/packages/33/32/d5a1bdf872f92a7c3361396b684aeba7abaabb341bd22a80029abcd1f68e/eth_typing-5.0.1.tar.gz", hash = "sha256:83debf88c9df286db43bb7374974681ebcc9f048fac81be2548dbc549a3203c0", size = 22716 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/36/50c5d5f070b7e4318dc906f8bf642719418ffef741db94f85ab6447563e1/eth_typing-3.5.2-py3-none-any.whl", hash = "sha256:1842e628fb1ffa929b94f89a9d33caafbeb9978dc96abb6036a12bc91f1c624b", size = 14481 }, + { url = "https://files.pythonhosted.org/packages/1a/ef/a66ff9b83df51b83c1af468fc7b5e4a3855d9e3c01e2365ecfe1c5e84077/eth_typing-5.0.1-py3-none-any.whl", hash = "sha256:f30d1af16aac598f216748a952eeb64fbcb6e73efa691d2de31148138afe96de", size = 20085 }, ] [[package]] name = "eth-utils" -version = "2.3.1" +version = "5.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cytoolz", marker = "implementation_name == 'cpython'" }, @@ -490,15 +484,15 @@ dependencies = [ { name = "eth-typing" }, { name = "toolz", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7c/17/8a43def3267f25df94fc0d3ef66a76b00aee7bab35b1d2ff41400eedec1a/eth-utils-2.3.1.tar.gz", hash = "sha256:56a969b0536d4969dcb27e580521de35abf2dbed8b1bf072b5c80770c4324e27", size = 74831 } +sdist = { url = "https://files.pythonhosted.org/packages/cc/b2/d5180e5dd01c5f5c9178274c7e27c67579c67554045370d3b8e60b562ea8/eth_utils-5.1.0.tar.gz", hash = "sha256:84c6314b9cf1fcd526107464bbf487e3f87097a2e753360d5ed319f7d42e3f20", size = 120325 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/89/251f118fae703d5504bbe63b72124ef346a8a65c5ee0a106b5b7930c397f/eth_utils-2.3.1-py3-none-any.whl", hash = "sha256:614eedc5ffcaf4e6708ca39e23b12bd69526a312068c1170c773bd1307d13972", size = 77778 }, + { url = "https://files.pythonhosted.org/packages/7c/19/e8d3e0e53dea8fb3054892e536cd1e02ebf492eeb4c42901763c2ae67f44/eth_utils-5.1.0-py3-none-any.whl", hash = "sha256:a99f1f01b51206620904c5af47fac65abc143aebd0a76bdec860381c5a3230f8", size = 100513 }, ] [[package]] name = "ethereum" version = "0.1.0" -source = { git = "https://github.com/ethereum/execution-specs#9b95554a88d2a8485f8180254d0f6a493a593fda" } +source = { git = "https://github.com/ethereum/execution-specs#776e44bf89601bf20d36df0cbd426dc12a319845" } dependencies = [ { name = "coincurve" }, { name = "ethereum-types" }, @@ -560,14 +554,8 @@ docs = [ { name = "pyspelling" }, ] lint = [ - { name = "black", marker = "implementation_name == 'cpython'" }, - { name = "flake8" }, - { name = "flake8-docstrings" }, - { name = "flake8-spellcheck" }, - { name = "fname8" }, - { name = "isort" }, { name = "mypy", marker = "implementation_name == 'cpython'" }, - { name = "pep8-naming" }, + { name = "ruff" }, { name = "types-requests" }, ] test = [ @@ -577,7 +565,6 @@ test = [ [package.metadata] requires-dist = [ { name = "bidict", specifier = ">=0.23,<1" }, - { name = "black", marker = "implementation_name == 'cpython' and extra == 'lint'", specifier = "==22.3.0" }, { name = "cairosvg", marker = "extra == 'docs'", specifier = ">=2.7.0,<3" }, { name = "click", specifier = ">=8.1.0,<9" }, { name = "coincurve", specifier = ">=20.0.0,<21" }, @@ -586,13 +573,8 @@ requires-dist = [ { name = "ethereum-spec-evm-resolver", git = "https://github.com/petertdavies/ethereum-spec-evm-resolver" }, { name = "ethereum-types", specifier = ">=0.2.1,<0.3" }, { name = "filelock", specifier = ">=3.15.1,<4" }, - { name = "flake8", marker = "extra == 'lint'", specifier = ">=6.1.0,<7" }, - { name = "flake8-docstrings", marker = "extra == 'lint'", specifier = ">=1.6,<2" }, - { name = "flake8-spellcheck", marker = "extra == 'lint'", specifier = ">=0.24,<0.25" }, - { name = "fname8", marker = "extra == 'lint'", specifier = ">=0.0.3" }, { name = "gitpython", specifier = ">=3.1.31,<4" }, { name = "hive-py", git = "https://github.com/marioevz/hive.py" }, - { name = "isort", marker = "extra == 'lint'", specifier = ">=5.8,<6" }, { name = "mike", marker = "extra == 'docs'", specifier = ">=1.1.2,<2" }, { name = "mkdocs", marker = "extra == 'docs'", specifier = ">=1.4.3,<2" }, { name = "mkdocs-gen-files", marker = "extra == 'docs'", specifier = ">=0.5.0,<1" }, @@ -604,7 +586,6 @@ requires-dist = [ { name = "mkdocstrings", marker = "extra == 'docs'", specifier = ">=0.21.2,<1" }, { name = "mkdocstrings-python", marker = "extra == 'docs'", specifier = ">=1.0.0,<2" }, { name = "mypy", marker = "implementation_name == 'cpython' and extra == 'lint'", specifier = "==0.991" }, - { name = "pep8-naming", marker = "extra == 'lint'", specifier = "==0.13.3" }, { name = "pillow", marker = "extra == 'docs'", specifier = ">=10.0.1,<11" }, { name = "pydantic", specifier = ">=2.8.0,<2.9" }, { name = "pyjwt", specifier = ">=2.3.0,<3" }, @@ -620,6 +601,7 @@ requires-dist = [ { name = "requests", specifier = ">=2.31.0,<3" }, { name = "requests-unixsocket2", specifier = ">=0.4.0" }, { name = "rich", specifier = ">=13.7.0,<14" }, + { name = "ruff", marker = "extra == 'lint'", specifier = ">=0.0.285" }, { name = "semver", specifier = ">=3.0.1,<4" }, { name = "setuptools" }, { name = "solc-select", specifier = ">=1.0.4,<2" }, @@ -648,14 +630,14 @@ dependencies = [ [[package]] name = "ethereum-types" -version = "0.2.1" +version = "0.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/07/a8/053c5fcc8581fe599a87b86431a50b7df5b84a88242a6ba33ab1138a2a34/ethereum_types-0.2.1.tar.gz", hash = "sha256:2b53c5f08aff52004d7a49cdb09e70163482b55a41e274a95a8d27d194c5d146", size = 14935 } +sdist = { url = "https://files.pythonhosted.org/packages/f5/05/d3caee665a164fa769dc964b4f9c9359d22be10af52e6edf9c929a010ac8/ethereum_types-0.2.2.tar.gz", hash = "sha256:d12abed80f7ef348a8cbe9ce8ab0919578e6f3e7b086ac912311d9ddd5ec18a9", size = 15075 } wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/76/3bbd13a9637287388f23c0c4094c81adf2d1467e314f8974ea0c61d2fc94/ethereum_types-0.2.1-py3-none-any.whl", hash = "sha256:6f6c51b239c231c6e33c10451b8fffb2fc168c6a7f0975cac3893d7e38e9c3e9", size = 10288 }, + { url = "https://files.pythonhosted.org/packages/24/ed/9257994b7bb65808e148802dbd4f78bb61081eb254e409e1ebe3302b1ebf/ethereum_types-0.2.2-py3-none-any.whl", hash = "sha256:668e5c06d7cde1cf44b7dd76da46d3bff6fde148b072ee36f6c92667436f9ccd", size = 10351 }, ] [[package]] @@ -678,58 +660,13 @@ wheels = [ [[package]] name = "filelock" -version = "3.15.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/08/dd/49e06f09b6645156550fb9aee9cc1e59aba7efbc972d665a1bd6ae0435d4/filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", size = 18007 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/f0/48285f0262fe47103a4a45972ed2f9b93e4c80b8fd609fa98da78b2a5706/filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7", size = 16159 }, -] - -[[package]] -name = "flake8" -version = "6.1.0" +version = "3.16.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mccabe" }, - { name = "pycodestyle" }, - { name = "pyflakes" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cf/f8/bbe24f43695c0c480181e39ce910c2650c794831886ec46ddd7c40520e6a/flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23", size = 48767 } +sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/24/bbf7175ffc47cb3d3e1eb523ddb23272968359dfcf2e1294707a2bf12fc4/flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5", size = 58260 }, + { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, ] -[[package]] -name = "flake8-docstrings" -version = "1.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "flake8" }, - { name = "pydocstyle" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/93/24/f839e3a06e18f4643ccb81370909a497297909f15106e6af2fecdef46894/flake8_docstrings-1.7.0.tar.gz", hash = "sha256:4c8cc748dc16e6869728699e5d0d685da9a10b0ea718e090b1ba088e67a941af", size = 5995 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/7d/76a278fa43250441ed9300c344f889c7fb1817080c8fb8996b840bf421c2/flake8_docstrings-1.7.0-py2.py3-none-any.whl", hash = "sha256:51f2344026da083fc084166a9353f5082b01f72901df422f74b4d953ae88ac75", size = 4994 }, -] - -[[package]] -name = "flake8-spellcheck" -version = "0.24.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "flake8" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ec/c8/c8e69da7ebe8953361de95814fe6e39ddb95bec02bd550c87b7a9d987f43/flake8-spellcheck-0.24.0.tar.gz", hash = "sha256:833c92222158b5dea74f858ccfb9f980b7c865fbd89cabc18447dadb07ec62e6", size = 337782 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/f7/860c3a53ece4848b78c9869906a39f3b1a918b2690ca997dd0425d29f629/flake8_spellcheck-0.24.0-py2.py3-none-any.whl", hash = "sha256:33d1727e4edb2b0cda3a78dee467d7bde53ff5a2a90056bc7d1764e0b060f331", size = 332403 }, -] - -[[package]] -name = "fname8" -version = "0.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5f/45/7a301ca31e67f44cf0a0e4bb683f8177b65b82f64246b60793b8776226d9/fname8-0.0.3.tar.gz", hash = "sha256:eeb7b8e117b60946eac41f334329c5d0edea52e7930d4fce9cd09e8cf8cf2eeb", size = 2765 } - [[package]] name = "ghp-import" version = "2.1.0" @@ -768,23 +705,23 @@ wheels = [ [[package]] name = "griffe" -version = "1.2.0" +version = "1.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/79/cbe9be5ac67bfd87c48b5b2d2fa170bf8c33b38d8661d9d1849f038ab1f9/griffe-1.2.0.tar.gz", hash = "sha256:1c9f6ef7455930f3f9b0c4145a961c90385d1e2cbc496f7796fbff560ec60d31", size = 381349 } +sdist = { url = "https://files.pythonhosted.org/packages/d4/c9/8167810358ca129839156dc002526e7398b5fad4a9d7b6e88b875e802d0d/griffe-1.5.1.tar.gz", hash = "sha256:72964f93e08c553257706d6cd2c42d1c172213feb48b2be386f243380b405d4b", size = 384113 } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/0b/5caa5617b63535fe1e0abc23af92bd1e6df4bd3d5b72bfe2c675d4770235/griffe-1.2.0-py3-none-any.whl", hash = "sha256:a8b2fcb1ecdc5a412e646b0b4375eb20a5d2eac3a11dd8c10c56967a4097663c", size = 126930 }, + { url = "https://files.pythonhosted.org/packages/ab/00/e693a155da0a2a72fd2df75b8fe338146cae59d590ad6f56800adde90cb5/griffe-1.5.1-py3-none-any.whl", hash = "sha256:ad6a7980f8c424c9102160aafa3bcdf799df0e75f7829d75af9ee5aef656f860", size = 127132 }, ] [[package]] name = "hexbytes" -version = "1.2.1" +version = "0.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4e/51/06836a542b773bfc60ab871fa08d4a7963e7df6754ca57169e2654287cc1/hexbytes-1.2.1.tar.gz", hash = "sha256:515f00dddf31053db4d0d7636dd16061c1d896c3109b8e751005db4ca46bcca7", size = 7722 } +sdist = { url = "https://files.pythonhosted.org/packages/c1/94/fbfd526e8964652eec6a7b74ae18d1426e225ab602553858531ec6567d05/hexbytes-0.3.1.tar.gz", hash = "sha256:a3fe35c6831ee8fafd048c4c086b986075fc14fd46258fa24ecb8d65745f9a9d", size = 6188 } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/c6/20f25ea73e4ceffb3eb4e38347f2992cb25e5ff6eb644d52e753a7a72f57/hexbytes-1.2.1-py3-none-any.whl", hash = "sha256:e64890b203a31f4a23ef11470ecfcca565beaee9198df623047df322b757471a", size = 5160 }, + { url = "https://files.pythonhosted.org/packages/0b/9e/fdfe374c28d448a58563e7e43f569f8cf8cf600db092efac2e8ac2f86782/hexbytes-0.3.1-py3-none-any.whl", hash = "sha256:383595ad75026cf00abd570f44b368c6cdac0c6becfae5c39ff88829877f8a59", size = 5944 }, ] [[package]] @@ -810,11 +747,11 @@ wheels = [ [[package]] name = "idna" -version = "3.8" +version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/ac/e349c5e6d4543326c6883ee9491e3921e0d07b55fdf3cce184b40d63e72a/idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603", size = 189467 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", size = 66894 }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] [[package]] @@ -826,15 +763,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, ] -[[package]] -name = "isort" -version = "5.13.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/f9/c1eb8635a24e87ade2efce21e3ce8cd6b8630bb685ddc9cdaca1349b2eb5/isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109", size = 175303 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6", size = 92310 }, -] - [[package]] name = "jinja2" version = "3.1.4" @@ -952,49 +880,60 @@ wheels = [ [[package]] name = "markupsafe" -version = "2.1.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", size = 19384 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/54/ad5eb37bf9d51800010a74e4665425831a9db4e7c4e0fde4352e391e808e/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", size = 18206 }, - { url = "https://files.pythonhosted.org/packages/6a/4a/a4d49415e600bacae038c67f9fecc1d5433b9d3c71a4de6f33537b89654c/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", size = 14079 }, - { url = "https://files.pythonhosted.org/packages/0a/7b/85681ae3c33c385b10ac0f8dd025c30af83c78cec1c37a6aa3b55e67f5ec/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", size = 26620 }, - { url = "https://files.pythonhosted.org/packages/7c/52/2b1b570f6b8b803cef5ac28fdf78c0da318916c7d2fe9402a84d591b394c/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", size = 25818 }, - { url = "https://files.pythonhosted.org/packages/29/fe/a36ba8c7ca55621620b2d7c585313efd10729e63ef81e4e61f52330da781/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", size = 25493 }, - { url = "https://files.pythonhosted.org/packages/60/ae/9c60231cdfda003434e8bd27282b1f4e197ad5a710c14bee8bea8a9ca4f0/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", size = 30630 }, - { url = "https://files.pythonhosted.org/packages/65/dc/1510be4d179869f5dafe071aecb3f1f41b45d37c02329dfba01ff59e5ac5/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", size = 29745 }, - { url = "https://files.pythonhosted.org/packages/30/39/8d845dd7d0b0613d86e0ef89549bfb5f61ed781f59af45fc96496e897f3a/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", size = 30021 }, - { url = "https://files.pythonhosted.org/packages/c7/5c/356a6f62e4f3c5fbf2602b4771376af22a3b16efa74eb8716fb4e328e01e/MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", size = 16659 }, - { url = "https://files.pythonhosted.org/packages/69/48/acbf292615c65f0604a0c6fc402ce6d8c991276e16c80c46a8f758fbd30c/MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", size = 17213 }, - { url = "https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", size = 18219 }, - { url = "https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", size = 14098 }, - { url = "https://files.pythonhosted.org/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", size = 29014 }, - { url = "https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", size = 28220 }, - { url = "https://files.pythonhosted.org/packages/0c/40/2e73e7d532d030b1e41180807a80d564eda53babaf04d65e15c1cf897e40/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", size = 27756 }, - { url = "https://files.pythonhosted.org/packages/18/46/5dca760547e8c59c5311b332f70605d24c99d1303dd9a6e1fc3ed0d73561/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", size = 33988 }, - { url = "https://files.pythonhosted.org/packages/6d/c5/27febe918ac36397919cd4a67d5579cbbfa8da027fa1238af6285bb368ea/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", size = 32718 }, - { url = "https://files.pythonhosted.org/packages/f8/81/56e567126a2c2bc2684d6391332e357589a96a76cb9f8e5052d85cb0ead8/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", size = 33317 }, - { url = "https://files.pythonhosted.org/packages/00/0b/23f4b2470accb53285c613a3ab9ec19dc944eaf53592cb6d9e2af8aa24cc/MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", size = 16670 }, - { url = "https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", size = 17224 }, - { url = "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", size = 18215 }, - { url = "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", size = 14069 }, - { url = "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", size = 29452 }, - { url = "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", size = 28462 }, - { url = "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", size = 27869 }, - { url = "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", size = 33906 }, - { url = "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", size = 32296 }, - { url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", size = 33038 }, - { url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", size = 16572 }, - { url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", size = 17127 }, -] - -[[package]] -name = "mccabe" -version = "0.7.0" +version = "3.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350 }, +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 }, + { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 }, + { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 }, + { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 }, + { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 }, + { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 }, + { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 }, + { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 }, + { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 }, + { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 }, + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, ] [[package]] @@ -1032,7 +971,7 @@ wheels = [ [[package]] name = "mkdocs" -version = "1.6.0" +version = "1.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1049,23 +988,23 @@ dependencies = [ { name = "pyyaml-env-tag" }, { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cc/6b/26b33cc8ad54e8bc0345cddc061c2c5c23e364de0ecd97969df23f95a673/mkdocs-1.6.0.tar.gz", hash = "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512", size = 3888392 } +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/c0/930dcf5a3e96b9c8e7ad15502603fc61d495479699e2d2c381e3d37294d1/mkdocs-1.6.0-py3-none-any.whl", hash = "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7", size = 3862264 }, + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451 }, ] [[package]] name = "mkdocs-autorefs" -version = "1.1.0" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "markupsafe" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/24/7d09b72b470d5dd33ed0c6722c7038ece494ab7dc5e72adbfeaf945276f6/mkdocs_autorefs-1.1.0.tar.gz", hash = "sha256:f2fd43b11f66284bd014f9b542a05c8ecbfaad4e0d7b30b68584788217b6c656", size = 36989 } +sdist = { url = "https://files.pythonhosted.org/packages/fb/ae/0f1154c614d6a8b8a36fff084e5b82af3a15f7d2060cf0dcdb1c53297a71/mkdocs_autorefs-1.2.0.tar.gz", hash = "sha256:a86b93abff653521bda71cf3fc5596342b7a23982093915cb74273f67522190f", size = 40262 } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/84/8e4dd669766f864482d2edcc44c7f07f4f91d73414c9a3e33b230a59f2cf/mkdocs_autorefs-1.1.0-py3-none-any.whl", hash = "sha256:492ac42f50214e81565e968f8cb0df9aba9d981542b9e7121b8f8ae9407fe6eb", size = 14417 }, + { url = "https://files.pythonhosted.org/packages/71/26/4d39d52ea2219604053a4d05b98e90d6a335511cc01806436ec4886b1028/mkdocs_autorefs-1.2.0-py3-none-any.whl", hash = "sha256:d588754ae89bd0ced0c70c06f58566a4ee43471eeeee5202427da7de9ef85a2f", size = 16522 }, ] [[package]] @@ -1096,14 +1035,14 @@ wheels = [ [[package]] name = "mkdocs-git-authors-plugin" -version = "0.9.0" +version = "0.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/03/99e18d62964d268eb9a866f42c9d53b43cde903a7fb436da85e396945a02/mkdocs_git_authors_plugin-0.9.0.tar.gz", hash = "sha256:6161f63b87064481a48d9ad01c23e43c3e758930c3a9cc167fe482909ceb9eac", size = 20268 } +sdist = { url = "https://files.pythonhosted.org/packages/6e/24/8ff9e44bed38348cc30e1031662f2d285a46f851381c933b8f573a6931ae/mkdocs_git_authors_plugin-0.9.1.tar.gz", hash = "sha256:60b291603479c765c3ca49fc4bda88a58989d9703c5e396fa1e81ae7de8a2836", size = 21402 } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/ad/a6e0ce34a1d9abe35844cdc3a64028d3df7bfe24b143021f7fcaa26adfdd/mkdocs_git_authors_plugin-0.9.0-py3-none-any.whl", hash = "sha256:380730a05eeb947a7e84be05fdb1c5ae2a7bc70fd9f6eda941f187c87ae37052", size = 19204 }, + { url = "https://files.pythonhosted.org/packages/a1/09/5e3cec4bca1c058badcb7c5214371650a1ac055ade7274f4f3a27100db51/mkdocs_git_authors_plugin-0.9.1-py3-none-any.whl", hash = "sha256:b719fdab2199dc1633c4f69296ac66ec4adb6365ddd998409aefc87b1d2790ac", size = 20321 }, ] [[package]] @@ -1129,7 +1068,7 @@ wheels = [ [[package]] name = "mkdocs-material" -version = "9.5.33" +version = "9.5.42" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, @@ -1144,9 +1083,9 @@ dependencies = [ { name = "regex" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/73/d5/f393412423f92dde7a4d7b9b74f294c5f8589679132739bd3cd333099641/mkdocs_material-9.5.33.tar.gz", hash = "sha256:d23a8b5e3243c9b2f29cdfe83051104a8024b767312dc8fde05ebe91ad55d89d", size = 4107690 } +sdist = { url = "https://files.pythonhosted.org/packages/f9/33/b3343ed975fbbd6798b8d8a7c4f1bf8489cc321fc8fd426eba3d87b0242e/mkdocs_material-9.5.42.tar.gz", hash = "sha256:92779b5e9b5934540c574c11647131d217dc540dce72b05feeda088c8eb1b8f2", size = 3963891 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/b1/1cebba96a01fa25299e9055bcd4c169f813f5cb73449194554a24bdda542/mkdocs_material-9.5.33-py3-none-any.whl", hash = "sha256:dbc79cf0fdc6e2c366aa987de8b0c9d4e2bb9f156e7466786ba2fd0f9bf7ffca", size = 8823286 }, + { url = "https://files.pythonhosted.org/packages/55/55/ad3e6a60ac1e8e76025543c49c1f24ecd80fb38e8a57000403bf2f0a4293/mkdocs_material-9.5.42-py3-none-any.whl", hash = "sha256:452a7c5d21284b373f36b981a2cbebfff59263feebeede1bc28652e9c5bbe316", size = 8672619 }, ] [[package]] @@ -1160,7 +1099,7 @@ wheels = [ [[package]] name = "mkdocstrings" -version = "0.25.2" +version = "0.26.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1172,22 +1111,23 @@ dependencies = [ { name = "platformdirs" }, { name = "pymdown-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/24/a6/d544fae9749b19e23fb590f6344f9eae3a312323065070b4874236bb0e04/mkdocstrings-0.25.2.tar.gz", hash = "sha256:5cf57ad7f61e8be3111a2458b4e49c2029c9cb35525393b179f9c916ca8042dc", size = 91796 } +sdist = { url = "https://files.pythonhosted.org/packages/c0/76/0475d10d27f3384df3a6ddfdf4a4fdfef83766f77cd4e327d905dc956c15/mkdocstrings-0.26.2.tar.gz", hash = "sha256:34a8b50f1e6cfd29546c6c09fbe02154adfb0b361bb758834bf56aa284ba876e", size = 92512 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/86/ee2aef075cc9a62a4f087c3c3f4e3e8a8318afe05a92f8f8415f1bf1af64/mkdocstrings-0.25.2-py3-none-any.whl", hash = "sha256:9e2cda5e2e12db8bb98d21e3410f3f27f8faab685a24b03b06ba7daa5b92abfc", size = 29289 }, + { url = "https://files.pythonhosted.org/packages/80/b6/4ee320d7c313da3774eff225875eb278f7e6bb26a9cd8e680b8dbc38fdea/mkdocstrings-0.26.2-py3-none-any.whl", hash = "sha256:1248f3228464f3b8d1a15bd91249ce1701fe3104ac517a5f167a0e01ca850ba5", size = 29716 }, ] [[package]] name = "mkdocstrings-python" -version = "1.10.8" +version = "1.12.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "griffe" }, + { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6b/ae/21b26c1fd62c8dd51ecefc8e848c14ca8f0dfdfeb903deeb20e86fb28ad1/mkdocstrings_python-1.10.8.tar.gz", hash = "sha256:5856a59cbebbb8deb133224a540de1ff60bded25e54d8beacc375bb133d39016", size = 161724 } +sdist = { url = "https://files.pythonhosted.org/packages/23/ec/cb6debe2db77f1ef42b25b21d93b5021474de3037cd82385e586aee72545/mkdocstrings_python-1.12.2.tar.gz", hash = "sha256:7a1760941c0b52a2cd87b960a9e21112ffe52e7df9d0b9583d04d47ed2e186f3", size = 168207 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/81/cda8afc58c7be82f0a7a9b54939e86f54eaad32a5b232afd6893ce3f00cb/mkdocstrings_python-1.10.8-py3-none-any.whl", hash = "sha256:bb12e76c8b071686617f824029cb1dfe0e9afe89f27fb3ad9a27f95f054dcd89", size = 108333 }, + { url = "https://files.pythonhosted.org/packages/5b/c1/ac524e1026d9580cbc654b5d19f5843c8b364a66d30f956372cd09fd2f92/mkdocstrings_python-1.12.2-py3-none-any.whl", hash = "sha256:7f7d40d6db3cb1f5d19dbcd80e3efe4d0ba32b073272c0c0de9de2e604eda62a", size = 111759 }, ] [[package]] @@ -1252,18 +1192,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, ] -[[package]] -name = "pep8-naming" -version = "0.13.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "flake8" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5b/c0/0db8b2867395a9a137e86af8bdf5a566e41d9c6453e509cd3042419ae29e/pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971", size = 16129 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/48/9533518e0394fb858ac2b4b55fe18f24aa33c87c943f691336ec842d9728/pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80", size = 8490 }, -] - [[package]] name = "pillow" version = "10.4.0" @@ -1325,11 +1253,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/52/0763d1d976d5c262df53ddda8d8d4719eedf9594d046f117c25a27261a19/platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3", size = 20916 } +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", size = 18146 }, + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, ] [[package]] @@ -1351,15 +1279,6 @@ dependencies = [ { name = "eth-utils" }, ] -[[package]] -name = "pycodestyle" -version = "2.11.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/34/8f/fa09ae2acc737b9507b5734a9aec9a2b35fa73409982f57db1b42f8c3c65/pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", size = 38974 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/90/a998c550d0ddd07e38605bb5c455d00fcc177a800ff9cc3dafdcb3dd7b56/pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67", size = 31132 }, -] - [[package]] name = "pycparser" version = "2.22" @@ -1371,23 +1290,26 @@ wheels = [ [[package]] name = "pycryptodome" -version = "3.15.0" +version = "3.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/e4/a8e8056a59c39f8c9ddd11d3bc3e1a67493abe746df727e531f66ecede9e/pycryptodome-3.15.0.tar.gz", hash = "sha256:9135dddad504592bcc18b0d2d95ce86c3a5ea87ec6447ef25cfedea12d6018b8", size = 4547210 } +sdist = { url = "https://files.pythonhosted.org/packages/13/52/13b9db4a913eee948152a079fe58d035bd3d1a519584155da8e786f767e6/pycryptodome-3.21.0.tar.gz", hash = "sha256:f7787e0d469bdae763b876174cf2e6c0f7be79808af26b1da96f1a64bcf47297", size = 4818071 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/dc/e5bb825eb7348773b77ace0d977f549af851c1d8300f1ba60119e88ba715/pycryptodome-3.15.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9ee40e2168f1348ae476676a2e938ca80a2f57b14a249d8fe0d3cdf803e5a676", size = 1558258 }, - { url = "https://files.pythonhosted.org/packages/2e/6f/27fbd8f3fd8b48feba2b4226f7f8d23af7755c54957fccc3fe6f44b764cf/pycryptodome-3.15.0-cp35-abi3-manylinux1_i686.whl", hash = "sha256:4c3ccad74eeb7b001f3538643c4225eac398c77d617ebb3e57571a897943c667", size = 2469207 }, - { url = "https://files.pythonhosted.org/packages/b1/54/ad3e2e07a5a7ceb926971398f7e3a0eeee85b6e1d3e658df8f71a4497daa/pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:1b22bcd9ec55e9c74927f6b1f69843cb256fb5a465088ce62837f793d9ffea88", size = 2303310 }, - { url = "https://files.pythonhosted.org/packages/c5/b4/526dd68f6c8ff6b785d7a08da7a6bba5646cced508454f1d1ab948e6b737/pycryptodome-3.15.0-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:57f565acd2f0cf6fb3e1ba553d0cb1f33405ec1f9c5ded9b9a0a5320f2c0bd3d", size = 2469209 }, - { url = "https://files.pythonhosted.org/packages/7d/be/e3e56f7f92bebf506aec486eb71d91952d2e9faf5e10872a89931db4120f/pycryptodome-3.15.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:4b52cb18b0ad46087caeb37a15e08040f3b4c2d444d58371b6f5d786d95534c2", size = 2303313 }, - { url = "https://files.pythonhosted.org/packages/35/5b/ba592bfd0d3bad9450645b751c132cf1028dc111ae699fd8e70808414941/pycryptodome-3.15.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:092a26e78b73f2530b8bd6b3898e7453ab2f36e42fd85097d705d6aba2ec3e5e", size = 1589891 }, - { url = "https://files.pythonhosted.org/packages/02/fa/f83072580377dcdf4d2ff3c7d25d225790302a86cfd1e9eb2c2832740135/pycryptodome-3.15.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:50ca7e587b8e541eb6c192acf92449d95377d1f88908c0a32ac5ac2703ebe28b", size = 2032482 }, - { url = "https://files.pythonhosted.org/packages/55/60/28d873c1efe46cf62494a0393fe34e4757821123fb1af9c45be3b2eeba8a/pycryptodome-3.15.0-cp35-abi3-win32.whl", hash = "sha256:e244ab85c422260de91cda6379e8e986405b4f13dc97d2876497178707f87fc1", size = 1877649 }, - { url = "https://files.pythonhosted.org/packages/00/07/5a262e3213a9358e2f7caf9080aa8a984f44bf4aee84592dfb965dd34355/pycryptodome-3.15.0-cp35-abi3-win_amd64.whl", hash = "sha256:c77126899c4b9c9827ddf50565e93955cb3996813c18900c16b2ea0474e130e9", size = 1941787 }, - { url = "https://files.pythonhosted.org/packages/bb/7a/0e51d1dc253d0571106009b94762b8ab5a7c905079c354247b721ae1f198/pycryptodome-3.15.0-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:9eaadc058106344a566dc51d3d3a758ab07f8edde013712bc8d22032a86b264f", size = 1536248 }, - { url = "https://files.pythonhosted.org/packages/9b/e8/628f92b38ee4475d7b316d04c2913d397cdcc3f3a873bdbea10a438ba9fe/pycryptodome-3.15.0-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:ff287bcba9fbeb4f1cccc1f2e90a08d691480735a611ee83c80a7d74ad72b9d9", size = 1613313 }, - { url = "https://files.pythonhosted.org/packages/b1/6c/4ee93e2e863e95caffc5a356b867e86f5596f4e38cddb43848412dd69176/pycryptodome-3.15.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:60b4faae330c3624cc5a546ba9cfd7b8273995a15de94ee4538130d74953ec2e", size = 1613316 }, - { url = "https://files.pythonhosted.org/packages/c8/03/1f745c158299000664a6fb5c0b28d5359837b05b4ba1f5a37645da5cad4d/pycryptodome-3.15.0-pp27-pypy_73-win32.whl", hash = "sha256:a8f06611e691c2ce45ca09bbf983e2ff2f8f4f87313609d80c125aff9fad6e7f", size = 1681598 }, + { url = "https://files.pythonhosted.org/packages/a7/88/5e83de10450027c96c79dc65ac45e9d0d7a7fef334f39d3789a191f33602/pycryptodome-3.21.0-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2480ec2c72438430da9f601ebc12c518c093c13111a5c1644c82cdfc2e50b1e4", size = 2495937 }, + { url = "https://files.pythonhosted.org/packages/66/e1/8f28cd8cf7f7563319819d1e172879ccce2333781ae38da61c28fe22d6ff/pycryptodome-3.21.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:de18954104667f565e2fbb4783b56667f30fb49c4d79b346f52a29cb198d5b6b", size = 1634629 }, + { url = "https://files.pythonhosted.org/packages/6a/c1/f75a1aaff0c20c11df8dc8e2bf8057e7f73296af7dfd8cbb40077d1c930d/pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de4b7263a33947ff440412339cb72b28a5a4c769b5c1ca19e33dd6cd1dcec6e", size = 2168708 }, + { url = "https://files.pythonhosted.org/packages/ea/66/6f2b7ddb457b19f73b82053ecc83ba768680609d56dd457dbc7e902c41aa/pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0714206d467fc911042d01ea3a1847c847bc10884cf674c82e12915cfe1649f8", size = 2254555 }, + { url = "https://files.pythonhosted.org/packages/2c/2b/152c330732a887a86cbf591ed69bd1b489439b5464806adb270f169ec139/pycryptodome-3.21.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d85c1b613121ed3dbaa5a97369b3b757909531a959d229406a75b912dd51dd1", size = 2294143 }, + { url = "https://files.pythonhosted.org/packages/55/92/517c5c498c2980c1b6d6b9965dffbe31f3cd7f20f40d00ec4069559c5902/pycryptodome-3.21.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8898a66425a57bcf15e25fc19c12490b87bd939800f39a03ea2de2aea5e3611a", size = 2160509 }, + { url = "https://files.pythonhosted.org/packages/39/1f/c74288f54d80a20a78da87df1818c6464ac1041d10988bb7d982c4153fbc/pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_i686.whl", hash = "sha256:932c905b71a56474bff8a9c014030bc3c882cee696b448af920399f730a650c2", size = 2329480 }, + { url = "https://files.pythonhosted.org/packages/39/1b/d0b013bf7d1af7cf0a6a4fce13f5fe5813ab225313755367b36e714a63f8/pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:18caa8cfbc676eaaf28613637a89980ad2fd96e00c564135bf90bc3f0b34dd93", size = 2254397 }, + { url = "https://files.pythonhosted.org/packages/14/71/4cbd3870d3e926c34706f705d6793159ac49d9a213e3ababcdade5864663/pycryptodome-3.21.0-cp36-abi3-win32.whl", hash = "sha256:280b67d20e33bb63171d55b1067f61fbd932e0b1ad976b3a184303a3dad22764", size = 1775641 }, + { url = "https://files.pythonhosted.org/packages/43/1d/81d59d228381576b92ecede5cd7239762c14001a828bdba30d64896e9778/pycryptodome-3.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:b7aa25fc0baa5b1d95b7633af4f5f1838467f1815442b22487426f94e0d66c53", size = 1812863 }, + { url = "https://files.pythonhosted.org/packages/25/b3/09ff7072e6d96c9939c24cf51d3c389d7c345bf675420355c22402f71b68/pycryptodome-3.21.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2cb635b67011bc147c257e61ce864879ffe6d03342dc74b6045059dfbdedafca", size = 1691593 }, + { url = "https://files.pythonhosted.org/packages/a8/91/38e43628148f68ba9b68dedbc323cf409e537fd11264031961fd7c744034/pycryptodome-3.21.0-pp27-pypy_73-win32.whl", hash = "sha256:4c26a2f0dc15f81ea3afa3b0c87b87e501f235d332b7f27e2225ecb80c0b1cdd", size = 1765997 }, + { url = "https://files.pythonhosted.org/packages/08/16/ae464d4ac338c1dd41f89c41f9488e54f7d2a3acf93bb920bb193b99f8e3/pycryptodome-3.21.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d5ebe0763c982f069d3877832254f64974139f4f9655058452603ff559c482e8", size = 1615855 }, + { url = "https://files.pythonhosted.org/packages/1e/8c/b0cee957eee1950ce7655006b26a8894cee1dc4b8747ae913684352786eb/pycryptodome-3.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ee86cbde706be13f2dec5a42b52b1c1d1cbb90c8e405c68d0755134735c8dc6", size = 1650018 }, + { url = "https://files.pythonhosted.org/packages/93/4d/d7138068089b99f6b0368622e60f97a577c936d75f533552a82613060c58/pycryptodome-3.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fd54003ec3ce4e0f16c484a10bc5d8b9bd77fa662a12b85779a2d2d85d67ee0", size = 1687977 }, + { url = "https://files.pythonhosted.org/packages/96/02/90ae1ac9f28be4df0ed88c127bf4acc1b102b40053e172759d4d1c54d937/pycryptodome-3.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5dfafca172933506773482b0e18f0cd766fd3920bd03ec85a283df90d8a17bc6", size = 1788273 }, ] [[package]] @@ -1471,27 +1393,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/93/06d44e08277b3b818b75bd5f25e879d7693e4b7dd3505fde89916fcc9ca2/pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6", size = 1914966 }, ] -[[package]] -name = "pydocstyle" -version = "6.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "snowballstemmer" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/d5385ca59fd065e3c6a5fe19f9bc9d5ea7f2509fa8c9c22fb6b2031dd953/pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1", size = 36796 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/36/ea/99ddefac41971acad68f14114f38261c1f27dac0b3ec529824ebc739bdaa/pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019", size = 38038 }, -] - -[[package]] -name = "pyflakes" -version = "3.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8b/fb/7251eaec19a055ec6aafb3d1395db7622348130d1b9b763f78567b2aab32/pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc", size = 63636 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/e9/1e1fd7fae559bfd07704991e9a59dd1349b72423c904256c073ce88a9940/pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", size = 62616 }, -] - [[package]] name = "pygments" version = "2.18.0" @@ -1512,15 +1413,15 @@ wheels = [ [[package]] name = "pymdown-extensions" -version = "10.9" +version = "10.12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/d3/fb86beeaa4416f73a28a5e8d440976b7cada2b2d7b5e715b2bd849d4de32/pymdown_extensions-10.9.tar.gz", hash = "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753", size = 812128 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/0b/32f05854cfd432e9286bb41a870e0d1a926b72df5f5cdb6dec962b2e369e/pymdown_extensions-10.12.tar.gz", hash = "sha256:b0ee1e0b2bef1071a47891ab17003bfe5bf824a398e13f49f8ed653b699369a7", size = 840790 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/41/18b5dc5e97ec3ff1c2f51d372e570a9fbe231f1124dcc36dbc6b47f93058/pymdown_extensions-10.9-py3-none-any.whl", hash = "sha256:d323f7e90d83c86113ee78f3fe62fc9dee5f56b54d912660703ea1816fed5626", size = 250954 }, + { url = "https://files.pythonhosted.org/packages/53/32/95a164ddf533bd676cbbe878e36e89b4ade3efde8dd61d0148c90cbbe57e/pymdown_extensions-10.12-py3-none-any.whl", hash = "sha256:49f81412242d3527b8b4967b990df395c89563043bc51a3d2d7d500e52123b77", size = 263448 }, ] [[package]] @@ -1704,56 +1605,71 @@ wheels = [ [[package]] name = "regex" -version = "2024.7.24" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/51/64256d0dc72816a4fe3779449627c69ec8fee5a5625fd60ba048f53b3478/regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506", size = 393485 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/97/283bd32777e6c30a9bede976cd72ba4b9aa144dc0f0f462bd37fa1a86e01/regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce", size = 470812 }, - { url = "https://files.pythonhosted.org/packages/e4/80/80bc4d7329d04ba519ebcaf26ae21d9e30d33934c458691177c623ceff70/regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024", size = 282129 }, - { url = "https://files.pythonhosted.org/packages/e5/8a/cddcb7942d05ad9a427ad97ab29f1a62c0607ab72bdb2f3a26fc5b07ac0f/regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd", size = 278909 }, - { url = "https://files.pythonhosted.org/packages/a6/d4/93b4011cb83f9a66e0fa398b4d3c6d564d94b686dace676c66502b13dae9/regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53", size = 777687 }, - { url = "https://files.pythonhosted.org/packages/d0/11/d0a12e1cecc1d35bbcbeb99e2ddcb8c1b152b1b58e2ff55f50c3d762b09e/regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca", size = 818982 }, - { url = "https://files.pythonhosted.org/packages/ae/41/01a073765d75427e24710af035d8f0a773b5cedf23f61b63e7ef2ce960d6/regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59", size = 804015 }, - { url = "https://files.pythonhosted.org/packages/3e/66/04b63f31580026c8b819aed7f171149177d10cfab27477ea8800a2268d50/regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41", size = 776517 }, - { url = "https://files.pythonhosted.org/packages/be/49/0c08a7a232e4e26e17afeedf13f331224d9377dde4876ed6e21e4a584a5d/regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5", size = 766860 }, - { url = "https://files.pythonhosted.org/packages/24/44/35769388845cdd7be97e1232a59446b738054b61bc9c92a3b0bacfaf7bb1/regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46", size = 692181 }, - { url = "https://files.pythonhosted.org/packages/50/be/4e09d5bc8de176153f209c95ca4e64b9def1748d693694a95dd4401ee7be/regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f", size = 762956 }, - { url = "https://files.pythonhosted.org/packages/90/63/b37152f25fe348aa31806bafa91df607d096e8f477fed9a5cf3de339dd5f/regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7", size = 771978 }, - { url = "https://files.pythonhosted.org/packages/ab/ac/38186431f7c1874e3f790669be933accf1090ee53aba0ab1a811ef38f07e/regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe", size = 840800 }, - { url = "https://files.pythonhosted.org/packages/e8/23/91b04dbf51a2c0ddf5b1e055e9e05ed091ebcf46f2b0e6e3d2fff121f903/regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce", size = 838991 }, - { url = "https://files.pythonhosted.org/packages/36/fd/822110cc14b99bdd7d8c61487bc774f454120cd3d7492935bf13f3399716/regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa", size = 767539 }, - { url = "https://files.pythonhosted.org/packages/82/54/e24a8adfca74f9a421cd47657c51413919e7755e729608de6f4c5556e002/regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66", size = 257712 }, - { url = "https://files.pythonhosted.org/packages/fb/cc/6485c2fc72d0de9b55392246b80921639f1be62bed1e33e982940306b5ba/regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e", size = 269661 }, - { url = "https://files.pythonhosted.org/packages/cb/ec/261f8434a47685d61e59a4ef3d9ce7902af521219f3ebd2194c7adb171a6/regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281", size = 470810 }, - { url = "https://files.pythonhosted.org/packages/f0/47/f33b1cac88841f95fff862476a9e875d9a10dae6912a675c6f13c128e5d9/regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b", size = 282126 }, - { url = "https://files.pythonhosted.org/packages/fc/1b/256ca4e2d5041c0aa2f1dc222f04412b796346ab9ce2aa5147405a9457b4/regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a", size = 278920 }, - { url = "https://files.pythonhosted.org/packages/91/03/4603ec057c0bafd2f6f50b0bdda4b12a0ff81022decf1de007b485c356a6/regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73", size = 785420 }, - { url = "https://files.pythonhosted.org/packages/75/f8/13b111fab93e6273e26de2926345e5ecf6ddad1e44c4d419d7b0924f9c52/regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2", size = 828164 }, - { url = "https://files.pythonhosted.org/packages/4a/80/bc3b9d31bd47ff578758af929af0ac1d6169b247e26fa6e87764007f3d93/regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e", size = 812621 }, - { url = "https://files.pythonhosted.org/packages/8b/77/92d4a14530900d46dddc57b728eea65d723cc9fcfd07b96c2c141dabba84/regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51", size = 786609 }, - { url = "https://files.pythonhosted.org/packages/35/58/06695fd8afad4c8ed0a53ec5e222156398b9fe5afd58887ab94ea68e4d16/regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364", size = 775290 }, - { url = "https://files.pythonhosted.org/packages/1b/0f/50b97ee1fc6965744b9e943b5c0f3740792ab54792df73d984510964ef29/regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee", size = 772849 }, - { url = "https://files.pythonhosted.org/packages/8f/64/565ff6cf241586ab7ae76bb4138c4d29bc1d1780973b457c2db30b21809a/regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c", size = 778428 }, - { url = "https://files.pythonhosted.org/packages/e5/fe/4ceabf4382e44e1e096ac46fd5e3bca490738b24157116a48270fd542e88/regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce", size = 849436 }, - { url = "https://files.pythonhosted.org/packages/68/23/1868e40d6b594843fd1a3498ffe75d58674edfc90d95e18dd87865b93bf2/regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1", size = 849484 }, - { url = "https://files.pythonhosted.org/packages/f3/52/bff76de2f6e2bc05edce3abeb7e98e6309aa022fc06071100a0216fbeb50/regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e", size = 776712 }, - { url = "https://files.pythonhosted.org/packages/f2/72/70ade7b0b5fe5c6df38fdfa2a5a8273e3ea6a10b772aa671b7e889e78bae/regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c", size = 257716 }, - { url = "https://files.pythonhosted.org/packages/04/4d/80e04f4e27ab0cbc9096e2d10696da6d9c26a39b60db52670fd57614fea5/regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52", size = 269662 }, - { url = "https://files.pythonhosted.org/packages/0f/26/f505782f386ac0399a9237571833f187414882ab6902e2e71a1ecb506835/regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86", size = 471748 }, - { url = "https://files.pythonhosted.org/packages/bb/1d/ea9a21beeb433dbfca31ab82867d69cb67ff8674af9fab6ebd55fa9d3387/regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad", size = 282841 }, - { url = "https://files.pythonhosted.org/packages/9b/f2/c6182095baf0a10169c34e87133a8e73b2e816a80035669b1278e927685e/regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9", size = 279114 }, - { url = "https://files.pythonhosted.org/packages/72/58/b5161bf890b6ca575a25685f19a4a3e3b6f4a072238814f8658123177d84/regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289", size = 789749 }, - { url = "https://files.pythonhosted.org/packages/09/fb/5381b19b62f3a3494266be462f6a015a869cf4bfd8e14d6e7db67e2c8069/regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9", size = 831666 }, - { url = "https://files.pythonhosted.org/packages/3d/6d/2a21c85f970f9be79357d12cf4b97f4fc6bf3bf6b843c39dabbc4e5f1181/regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c", size = 817544 }, - { url = "https://files.pythonhosted.org/packages/f9/ae/5f23e64f6cf170614237c654f3501a912dfb8549143d4b91d1cd13dba319/regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440", size = 790854 }, - { url = "https://files.pythonhosted.org/packages/29/0a/d04baad1bbc49cdfb4aef90c4fc875a60aaf96d35a1616f1dfe8149716bc/regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610", size = 779242 }, - { url = "https://files.pythonhosted.org/packages/3a/27/b242a962f650c3213da4596d70e24c7c1c46e3aa0f79f2a81164291085f8/regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5", size = 776932 }, - { url = "https://files.pythonhosted.org/packages/9c/ae/de659bdfff80ad2c0b577a43dd89dbc43870a4fc4bbf604e452196758e83/regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799", size = 784521 }, - { url = "https://files.pythonhosted.org/packages/d4/ac/eb6a796da0bdefbf09644a7868309423b18d344cf49963a9d36c13502d46/regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05", size = 854548 }, - { url = "https://files.pythonhosted.org/packages/56/77/fde8d825dec69e70256e0925af6c81eea9acf0a634d3d80f619d8dcd6888/regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94", size = 853345 }, - { url = "https://files.pythonhosted.org/packages/ff/04/2b79ad0bb9bc05ab4386caa2c19aa047a66afcbdfc2640618ffc729841e4/regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38", size = 781414 }, - { url = "https://files.pythonhosted.org/packages/bf/71/d0af58199283ada7d25b20e416f5b155f50aad99b0e791c0966ff5a1cd00/regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc", size = 258125 }, - { url = "https://files.pythonhosted.org/packages/95/b3/10e875c45c60b010b66fc109b899c6fc4f05d485fe1d54abff98ce791124/regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908", size = 269162 }, +version = "2024.9.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/38/148df33b4dbca3bd069b963acab5e0fa1a9dbd6820f8c322d0dd6faeff96/regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd", size = 399403 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/12/497bd6599ce8a239ade68678132296aec5ee25ebea45fc8ba91aa60fceec/regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408", size = 482488 }, + { url = "https://files.pythonhosted.org/packages/c1/24/595ddb9bec2a9b151cdaf9565b0c9f3da9f0cb1dca6c158bc5175332ddf8/regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d", size = 287443 }, + { url = "https://files.pythonhosted.org/packages/69/a8/b2fb45d9715b1469383a0da7968f8cacc2f83e9fbbcd6b8713752dd980a6/regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5", size = 284561 }, + { url = "https://files.pythonhosted.org/packages/88/87/1ce4a5357216b19b7055e7d3b0efc75a6e426133bf1e7d094321df514257/regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c", size = 783177 }, + { url = "https://files.pythonhosted.org/packages/3c/65/b9f002ab32f7b68e7d1dcabb67926f3f47325b8dbc22cc50b6a043e1d07c/regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8", size = 823193 }, + { url = "https://files.pythonhosted.org/packages/22/91/8339dd3abce101204d246e31bc26cdd7ec07c9f91598472459a3a902aa41/regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35", size = 809950 }, + { url = "https://files.pythonhosted.org/packages/cb/19/556638aa11c2ec9968a1da998f07f27ec0abb9bf3c647d7c7985ca0b8eea/regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71", size = 782661 }, + { url = "https://files.pythonhosted.org/packages/d1/e9/7a5bc4c6ef8d9cd2bdd83a667888fc35320da96a4cc4da5fa084330f53db/regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8", size = 772348 }, + { url = "https://files.pythonhosted.org/packages/f1/0b/29f2105bfac3ed08e704914c38e93b07c784a6655f8a015297ee7173e95b/regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a", size = 697460 }, + { url = "https://files.pythonhosted.org/packages/71/3a/52ff61054d15a4722605f5872ad03962b319a04c1ebaebe570b8b9b7dde1/regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d", size = 769151 }, + { url = "https://files.pythonhosted.org/packages/97/07/37e460ab5ca84be8e1e197c3b526c5c86993dcc9e13cbc805c35fc2463c1/regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137", size = 777478 }, + { url = "https://files.pythonhosted.org/packages/65/7b/953075723dd5ab00780043ac2f9de667306ff9e2a85332975e9f19279174/regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6", size = 845373 }, + { url = "https://files.pythonhosted.org/packages/40/b8/3e9484c6230b8b6e8f816ab7c9a080e631124991a4ae2c27a81631777db0/regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca", size = 845369 }, + { url = "https://files.pythonhosted.org/packages/b7/99/38434984d912edbd2e1969d116257e869578f67461bd7462b894c45ed874/regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a", size = 773935 }, + { url = "https://files.pythonhosted.org/packages/ab/67/43174d2b46fa947b7b9dfe56b6c8a8a76d44223f35b1d64645a732fd1d6f/regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0", size = 261624 }, + { url = "https://files.pythonhosted.org/packages/c4/2a/4f9c47d9395b6aff24874c761d8d620c0232f97c43ef3cf668c8b355e7a7/regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623", size = 274020 }, + { url = "https://files.pythonhosted.org/packages/86/a1/d526b7b6095a0019aa360948c143aacfeb029919c898701ce7763bbe4c15/regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df", size = 482483 }, + { url = "https://files.pythonhosted.org/packages/32/d9/bfdd153179867c275719e381e1e8e84a97bd186740456a0dcb3e7125c205/regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268", size = 287442 }, + { url = "https://files.pythonhosted.org/packages/33/c4/60f3370735135e3a8d673ddcdb2507a8560d0e759e1398d366e43d000253/regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad", size = 284561 }, + { url = "https://files.pythonhosted.org/packages/b1/51/91a5ebdff17f9ec4973cb0aa9d37635efec1c6868654bbc25d1543aca4ec/regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679", size = 791779 }, + { url = "https://files.pythonhosted.org/packages/07/4a/022c5e6f0891a90cd7eb3d664d6c58ce2aba48bff107b00013f3d6167069/regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4", size = 832605 }, + { url = "https://files.pythonhosted.org/packages/ac/1c/3793990c8c83ca04e018151ddda83b83ecc41d89964f0f17749f027fc44d/regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664", size = 818556 }, + { url = "https://files.pythonhosted.org/packages/e9/5c/8b385afbfacb853730682c57be56225f9fe275c5bf02ac1fc88edbff316d/regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50", size = 792808 }, + { url = "https://files.pythonhosted.org/packages/9b/8b/a4723a838b53c771e9240951adde6af58c829fb6a6a28f554e8131f53839/regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199", size = 781115 }, + { url = "https://files.pythonhosted.org/packages/83/5f/031a04b6017033d65b261259c09043c06f4ef2d4eac841d0649d76d69541/regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4", size = 778155 }, + { url = "https://files.pythonhosted.org/packages/fd/cd/4660756070b03ce4a66663a43f6c6e7ebc2266cc6b4c586c167917185eb4/regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd", size = 784614 }, + { url = "https://files.pythonhosted.org/packages/93/8d/65b9bea7df120a7be8337c415b6d256ba786cbc9107cebba3bf8ff09da99/regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f", size = 853744 }, + { url = "https://files.pythonhosted.org/packages/96/a7/fba1eae75eb53a704475baf11bd44b3e6ccb95b316955027eb7748f24ef8/regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96", size = 855890 }, + { url = "https://files.pythonhosted.org/packages/45/14/d864b2db80a1a3358534392373e8a281d95b28c29c87d8548aed58813910/regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1", size = 781887 }, + { url = "https://files.pythonhosted.org/packages/4d/a9/bfb29b3de3eb11dc9b412603437023b8e6c02fb4e11311863d9bf62c403a/regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9", size = 261644 }, + { url = "https://files.pythonhosted.org/packages/c7/ab/1ad2511cf6a208fde57fafe49829cab8ca018128ab0d0b48973d8218634a/regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf", size = 274033 }, + { url = "https://files.pythonhosted.org/packages/6e/92/407531450762bed778eedbde04407f68cbd75d13cee96c6f8d6903d9c6c1/regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7", size = 483590 }, + { url = "https://files.pythonhosted.org/packages/8e/a2/048acbc5ae1f615adc6cba36cc45734e679b5f1e4e58c3c77f0ed611d4e2/regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231", size = 288175 }, + { url = "https://files.pythonhosted.org/packages/8a/ea/909d8620329ab710dfaf7b4adee41242ab7c9b95ea8d838e9bfe76244259/regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d", size = 284749 }, + { url = "https://files.pythonhosted.org/packages/ca/fa/521eb683b916389b4975337873e66954e0f6d8f91bd5774164a57b503185/regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64", size = 795181 }, + { url = "https://files.pythonhosted.org/packages/28/db/63047feddc3280cc242f9c74f7aeddc6ee662b1835f00046f57d5630c827/regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42", size = 835842 }, + { url = "https://files.pythonhosted.org/packages/e3/94/86adc259ff8ec26edf35fcca7e334566c1805c7493b192cb09679f9c3dee/regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766", size = 823533 }, + { url = "https://files.pythonhosted.org/packages/29/52/84662b6636061277cb857f658518aa7db6672bc6d1a3f503ccd5aefc581e/regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a", size = 797037 }, + { url = "https://files.pythonhosted.org/packages/c3/2a/cd4675dd987e4a7505f0364a958bc41f3b84942de9efaad0ef9a2646681c/regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9", size = 784106 }, + { url = "https://files.pythonhosted.org/packages/6f/75/3ea7ec29de0bbf42f21f812f48781d41e627d57a634f3f23947c9a46e303/regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d", size = 782468 }, + { url = "https://files.pythonhosted.org/packages/d3/67/15519d69b52c252b270e679cb578e22e0c02b8dd4e361f2b04efcc7f2335/regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822", size = 790324 }, + { url = "https://files.pythonhosted.org/packages/9c/71/eff77d3fe7ba08ab0672920059ec30d63fa7e41aa0fb61c562726e9bd721/regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0", size = 860214 }, + { url = "https://files.pythonhosted.org/packages/81/11/e1bdf84a72372e56f1ea4b833dd583b822a23138a616ace7ab57a0e11556/regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a", size = 859420 }, + { url = "https://files.pythonhosted.org/packages/ea/75/9753e9dcebfa7c3645563ef5c8a58f3a47e799c872165f37c55737dadd3e/regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a", size = 787333 }, + { url = "https://files.pythonhosted.org/packages/bc/4e/ba1cbca93141f7416624b3ae63573e785d4bc1834c8be44a8f0747919eca/regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776", size = 262058 }, + { url = "https://files.pythonhosted.org/packages/6e/16/efc5f194778bf43e5888209e5cec4b258005d37c613b67ae137df3b89c53/regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009", size = 273526 }, + { url = "https://files.pythonhosted.org/packages/93/0a/d1c6b9af1ff1e36832fe38d74d5c5bab913f2bdcbbd6bc0e7f3ce8b2f577/regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784", size = 483376 }, + { url = "https://files.pythonhosted.org/packages/a4/42/5910a050c105d7f750a72dcb49c30220c3ae4e2654e54aaaa0e9bc0584cb/regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36", size = 288112 }, + { url = "https://files.pythonhosted.org/packages/8d/56/0c262aff0e9224fa7ffce47b5458d373f4d3e3ff84e99b5ff0cb15e0b5b2/regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92", size = 284608 }, + { url = "https://files.pythonhosted.org/packages/b9/54/9fe8f9aec5007bbbbce28ba3d2e3eaca425f95387b7d1e84f0d137d25237/regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86", size = 795337 }, + { url = "https://files.pythonhosted.org/packages/b2/e7/6b2f642c3cded271c4f16cc4daa7231be544d30fe2b168e0223724b49a61/regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85", size = 835848 }, + { url = "https://files.pythonhosted.org/packages/cd/9e/187363bdf5d8c0e4662117b92aa32bf52f8f09620ae93abc7537d96d3311/regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963", size = 823503 }, + { url = "https://files.pythonhosted.org/packages/f8/10/601303b8ee93589f879664b0cfd3127949ff32b17f9b6c490fb201106c4d/regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6", size = 797049 }, + { url = "https://files.pythonhosted.org/packages/ef/1c/ea200f61ce9f341763f2717ab4daebe4422d83e9fd4ac5e33435fd3a148d/regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802", size = 784144 }, + { url = "https://files.pythonhosted.org/packages/d8/5c/d2429be49ef3292def7688401d3deb11702c13dcaecdc71d2b407421275b/regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29", size = 782483 }, + { url = "https://files.pythonhosted.org/packages/12/d9/cbc30f2ff7164f3b26a7760f87c54bf8b2faed286f60efd80350a51c5b99/regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8", size = 790320 }, + { url = "https://files.pythonhosted.org/packages/19/1d/43ed03a236313639da5a45e61bc553c8d41e925bcf29b0f8ecff0c2c3f25/regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84", size = 860435 }, + { url = "https://files.pythonhosted.org/packages/34/4f/5d04da61c7c56e785058a46349f7285ae3ebc0726c6ea7c5c70600a52233/regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554", size = 859571 }, + { url = "https://files.pythonhosted.org/packages/12/7f/8398c8155a3c70703a8e91c29532558186558e1aea44144b382faa2a6f7a/regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8", size = 787398 }, + { url = "https://files.pythonhosted.org/packages/58/3a/f5903977647a9a7e46d5535e9e96c194304aeeca7501240509bde2f9e17f/regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8", size = 262035 }, + { url = "https://files.pythonhosted.org/packages/ff/80/51ba3a4b7482f6011095b3a036e07374f64de180b7d870b704ed22509002/regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f", size = 273510 }, ] [[package]] @@ -1786,27 +1702,53 @@ wheels = [ [[package]] name = "rich" -version = "13.8.0" +version = "13.9.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/60/5959113cae0ce512cf246a6871c623117330105a0d5f59b4e26138f2c9cc/rich-13.8.0.tar.gz", hash = "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4", size = 222072 } +sdist = { url = "https://files.pythonhosted.org/packages/d9/e9/cf9ef5245d835065e6673781dbd4b8911d352fb770d56cf0879cf11b7ee1/rich-13.9.3.tar.gz", hash = "sha256:bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e", size = 222889 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/d9/c2a126eeae791e90ea099d05cb0515feea3688474b978343f3cdcfe04523/rich-13.8.0-py3-none-any.whl", hash = "sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc", size = 241597 }, + { url = "https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl", hash = "sha256:9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283", size = 242157 }, ] [[package]] name = "rlp" -version = "3.0.0" +version = "4.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "eth-utils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/63/8b5205a7f9e2792137676c2d29bd6bc9cbecca95015a55ed54d6dd02f3f6/rlp-3.0.0.tar.gz", hash = "sha256:63b0465d2948cd9f01de449d7adfb92d207c1aef3982f20310f8009be4a507e8", size = 40017 } +sdist = { url = "https://files.pythonhosted.org/packages/0f/49/bcd4d3f9210ed78749eab04d236eeb98f98fbcc16977f308ee4637c1bad8/rlp-4.0.1.tar.gz", hash = "sha256:bcefb11013dfadf8902642337923bd0c786dc8a27cb4c21da6e154e52869ecb1", size = 33710 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/03/3ae09a1c43657d17530dd98de6e381cc66ac514daa67000ccf99afc808fc/rlp-4.0.1-py3-none-any.whl", hash = "sha256:ff6846c3c27b97ee0492373aa074a7c3046aadd973320f4fffa7ac45564b0258", size = 20639 }, +] + +[[package]] +name = "ruff" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/21/5c6e05e0fd3fbb41be4fb92edbc9a04de70baf60adb61435ce0c6b8c3d55/ruff-0.7.1.tar.gz", hash = "sha256:9d8a41d4aa2dad1575adb98a82870cf5db5f76b2938cf2206c22c940034a36f4", size = 3181670 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/24/03e9b6f0c61e92ed27b1e16a5393034ae07b98c307e3b0e6be3e03183ba8/rlp-3.0.0-py2.py3-none-any.whl", hash = "sha256:d2a963225b3f26795c5b52310e0871df9824af56823d739511583ef459895a7d", size = 20154 }, + { url = "https://files.pythonhosted.org/packages/65/45/8a20a9920175c9c4892b2420f80ff3cf14949cf3067118e212f9acd9c908/ruff-0.7.1-py3-none-linux_armv6l.whl", hash = "sha256:cb1bc5ed9403daa7da05475d615739cc0212e861b7306f314379d958592aaa89", size = 10389268 }, + { url = "https://files.pythonhosted.org/packages/1b/d3/2f8382db2cf4f9488e938602e33e36287f9d26cb283aa31f11c31297ce79/ruff-0.7.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:27c1c52a8d199a257ff1e5582d078eab7145129aa02721815ca8fa4f9612dc35", size = 10188348 }, + { url = "https://files.pythonhosted.org/packages/a2/31/7d14e2a88da351200f844b7be889a0845d9e797162cf76b136d21b832a23/ruff-0.7.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:588a34e1ef2ea55b4ddfec26bbe76bc866e92523d8c6cdec5e8aceefeff02d99", size = 9841448 }, + { url = "https://files.pythonhosted.org/packages/db/99/738cafdc768eceeca0bd26c6f03e213aa91203d2278e1d95b1c31c4ece41/ruff-0.7.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94fc32f9cdf72dc75c451e5f072758b118ab8100727168a3df58502b43a599ca", size = 10674864 }, + { url = "https://files.pythonhosted.org/packages/fe/12/bcf2836b50eab53c65008383e7d55201e490d75167c474f14a16e1af47d2/ruff-0.7.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:985818742b833bffa543a84d1cc11b5e6871de1b4e0ac3060a59a2bae3969250", size = 10192105 }, + { url = "https://files.pythonhosted.org/packages/2b/71/261d5d668bf98b6c44e89bfb5dfa4cb8cb6c8b490a201a3d8030e136ea4f/ruff-0.7.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32f1e8a192e261366c702c5fb2ece9f68d26625f198a25c408861c16dc2dea9c", size = 11194144 }, + { url = "https://files.pythonhosted.org/packages/90/1f/0926d18a3b566fa6e7b3b36093088e4ffef6b6ba4ea85a462d9a93f7e35c/ruff-0.7.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:699085bf05819588551b11751eff33e9ca58b1b86a6843e1b082a7de40da1565", size = 11917066 }, + { url = "https://files.pythonhosted.org/packages/cd/a8/9fac41f128b6a44ab4409c1493430b4ee4b11521e8aeeca19bfe1ce851f9/ruff-0.7.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:344cc2b0814047dc8c3a8ff2cd1f3d808bb23c6658db830d25147339d9bf9ea7", size = 11458821 }, + { url = "https://files.pythonhosted.org/packages/25/cd/59644168f086ab13fe4e02943b9489a0aa710171f66b178e179df5383554/ruff-0.7.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4316bbf69d5a859cc937890c7ac7a6551252b6a01b1d2c97e8fc96e45a7c8b4a", size = 12700379 }, + { url = "https://files.pythonhosted.org/packages/fb/30/3bac63619eb97174661829c07fc46b2055a053dee72da29d7c304c1cd2c0/ruff-0.7.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79d3af9dca4c56043e738a4d6dd1e9444b6d6c10598ac52d146e331eb155a8ad", size = 11019813 }, + { url = "https://files.pythonhosted.org/packages/4b/af/f567b885b5cb3bcdbcca3458ebf210cc8c9c7a9f61c332d3c2a050c3b21e/ruff-0.7.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c5c121b46abde94a505175524e51891f829414e093cd8326d6e741ecfc0a9112", size = 10662146 }, + { url = "https://files.pythonhosted.org/packages/bc/ad/eb930d3ad117a9f2f7261969c21559ebd82bb13b6e8001c7caed0d44be5f/ruff-0.7.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8422104078324ea250886954e48f1373a8fe7de59283d747c3a7eca050b4e378", size = 10256911 }, + { url = "https://files.pythonhosted.org/packages/20/d5/af292ce70a016fcec792105ca67f768b403dd480a11888bc1f418fed0dd5/ruff-0.7.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:56aad830af8a9db644e80098fe4984a948e2b6fc2e73891538f43bbe478461b8", size = 10767488 }, + { url = "https://files.pythonhosted.org/packages/24/85/cc04a3bd027f433bebd2a097e63b3167653c079f7f13d8f9a1178e693412/ruff-0.7.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:658304f02f68d3a83c998ad8bf91f9b4f53e93e5412b8f2388359d55869727fd", size = 11093368 }, + { url = "https://files.pythonhosted.org/packages/0b/fb/c39cbf32d1f3e318674b8622f989417231794926b573f76dd4d0ca49f0f1/ruff-0.7.1-py3-none-win32.whl", hash = "sha256:b517a2011333eb7ce2d402652ecaa0ac1a30c114fbbd55c6b8ee466a7f600ee9", size = 8594180 }, + { url = "https://files.pythonhosted.org/packages/5a/71/ec8cdea34ecb90c830ca60d54ac7b509a7b5eab50fae27e001d4470fe813/ruff-0.7.1-py3-none-win_amd64.whl", hash = "sha256:f38c41fcde1728736b4eb2b18850f6d1e3eedd9678c914dede554a70d5241307", size = 9419751 }, + { url = "https://files.pythonhosted.org/packages/79/7b/884553415e9f0a9bf358ed52fb68b934e67ef6c5a62397ace924a1afdf9a/ruff-0.7.1-py3-none-win_arm64.whl", hash = "sha256:19aa200ec824c0f36d0c9114c8ec0087082021732979a359d6f3c390a6ff2a37", size = 8717402 }, ] [[package]] @@ -1820,11 +1762,11 @@ wheels = [ [[package]] name = "setuptools" -version = "74.0.0" +version = "75.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/21/8fd457d5a979109603e0e460c73177c3a9b6b7abcd136d0146156da95895/setuptools-74.0.0.tar.gz", hash = "sha256:a85e96b8be2b906f3e3e789adec6a9323abf79758ecfa3065bd740d81158b11e", size = 1389536 } +sdist = { url = "https://files.pythonhosted.org/packages/ed/22/a438e0caa4576f8c383fa4d35f1cc01655a46c75be358960d815bfbb12bd/setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686", size = 1351577 } wheels = [ - { url = "https://files.pythonhosted.org/packages/df/b5/168cec9a10bf93b60b8f9af7f4e61d526e31e1aad8b9be0e30837746d700/setuptools-74.0.0-py3-none-any.whl", hash = "sha256:0274581a0037b638b9fc1c6883cc71c0210865aaa76073f7882376b641b84e8f", size = 1301729 }, + { url = "https://files.pythonhosted.org/packages/90/12/282ee9bce8b58130cb762fbc9beabd531549952cac11fc56add11dcb7ea0/setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd", size = 1251070 }, ] [[package]] @@ -1845,15 +1787,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/a5/10f97f73544edcdef54409f1d839f6049a0d79df68adbc1ceb24d1aaca42/smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da", size = 24282 }, ] -[[package]] -name = "snowballstemmer" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002 }, -] - [[package]] name = "solc-select" version = "1.0.4" @@ -1896,37 +1829,37 @@ wheels = [ [[package]] name = "tinycss2" -version = "1.3.0" +version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/44/6f/38d2335a2b70b9982d112bb177e3dbe169746423e33f718bf5e9c7b3ddd3/tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d", size = 67360 } +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7", size = 22532 }, + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 }, ] [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164 } +sdist = { url = "https://files.pythonhosted.org/packages/35/b9/de2a5c0144d7d75a57ff355c0c24054f965b2dc3036456ae03a51ea6264b/tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed", size = 16096 } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757 }, + { url = "https://files.pythonhosted.org/packages/cf/db/ce8eda256fa131af12e0a76d481711abe4681b6923c27efb9a255c9e4594/tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38", size = 13237 }, ] [[package]] name = "toolz" -version = "0.12.1" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3e/bf/5e12db234df984f6df3c7f12f1428aa680ba4e101f63f4b8b3f9e8d2e617/toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d", size = 66550 } +sdist = { url = "https://files.pythonhosted.org/packages/8a/0b/d80dfa675bf592f636d1ea0b835eab4ec8df6e9415d8cfd766df54456123/toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02", size = 66790 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/8a/d82202c9f89eab30f9fc05380daae87d617e2ad11571ab23d7c13a29bb54/toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", size = 56121 }, + { url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236", size = 56383 }, ] [[package]] name = "trie" -version = "2.0.2" +version = "2.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "eth-hash" }, @@ -1935,9 +1868,9 @@ dependencies = [ { name = "rlp" }, { name = "sortedcontainers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/3c/8a90615f39890c503d569f6973e983973a68d07ffa90190757210a95fecc/trie-2.0.2.tar.gz", hash = "sha256:8bfc6b82979b7caa6f020a89c9142c7522f017788240487d1c941b0ad82e7132", size = 39304 } +sdist = { url = "https://files.pythonhosted.org/packages/b2/47/83942c68e04d1a9a6548be8a2a5b1dd5a55241456c5355aa6b1f717e99d9/trie-2.2.0.tar.gz", hash = "sha256:117a6f0844eb60f2f68ed45e621886690dacd16343394c1adfb3ff44231725bc", size = 72129 } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/a6/2f2ee141c4fbf517a823aa17446a4368d030e3ce629568d08e7c01da6210/trie-2.0.2-py3-none-any.whl", hash = "sha256:edef6b392f49f80be31c167236c6569aa07d7926138d5fe23d327d65d62b7201", size = 38583 }, + { url = "https://files.pythonhosted.org/packages/dd/36/5a7045acbbc64470c64ef74c882b6ca37c865953f8246775bd09ee63f8dc/trie-2.2.0-py3-none-any.whl", hash = "sha256:b6ad00305722b271cd05c9475e741c92a61f0ca53e6cc4fa9a5591e37eac34ca", size = 39214 }, ] [[package]] @@ -1963,11 +1896,11 @@ wheels = [ [[package]] name = "types-setuptools" -version = "73.0.0.20240822" +version = "75.2.0.20241025" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/a8/5b26af1117daf328f3420fce5ad36f9331a2bbc689862923789402eb83d6/types-setuptools-73.0.0.20240822.tar.gz", hash = "sha256:3a060681098eb3fbc2fea0a86f7f6af6aa1ca71906039d88d891ea2cecdd4dbf", size = 42177 } +sdist = { url = "https://files.pythonhosted.org/packages/01/d7/cc9303a91d1137f11c5376ff4693f017126108f6c379a84ff4ea1b25e2ff/types-setuptools-75.2.0.20241025.tar.gz", hash = "sha256:2949913a518d5285ce00a3b7d88961c80a6e72ffb8f3da0a3f5650ea533bd45e", size = 43477 } wheels = [ - { url = "https://files.pythonhosted.org/packages/57/76/ec2cf632452154ecceaed2075707ca09719238e8ba53b3027f47ba78b90c/types_setuptools-73.0.0.20240822-py3-none-any.whl", hash = "sha256:b9eba9b68546031317a0fa506d4973641d987d74f79e7dd8369ad4f7a93dea17", size = 67135 }, + { url = "https://files.pythonhosted.org/packages/79/49/0f49dbe0b558dd0dd70ba18b7d6d6d31b57c4d2a38c0208edba239d8bfc5/types_setuptools-75.2.0.20241025-py3-none-any.whl", hash = "sha256:6721ac0f1a620321e2ccd87a9a747c4a383dc381f78d894ce37f2455b45fcf1c", size = 67424 }, ] [[package]] @@ -2008,46 +1941,46 @@ wheels = [ [[package]] name = "watchdog" -version = "5.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/b5/9943b585553bbda2a2795fb0db1d26267e8728f64cb15205dc640a5ecde0/watchdog-5.0.0.tar.gz", hash = "sha256:990aedb9e2f336b45a70aed9c014450e7c4a70fd99c5f5b1834d57e1453a177e", size = 127192 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/c2/9addcac649bc57d1b4d5af0d67109b1d41728f06e2d8ed207cda0f2f4ef2/watchdog-5.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bf3216ec994eabb2212df9861f19056ca0d4cd3516d56cb95801933876519bfe", size = 96112 }, - { url = "https://files.pythonhosted.org/packages/b3/f3/c8daf10cf15d83cb0f35ac2494a95ed419eeceb08fcdffca2681bd720420/watchdog-5.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb59ad83a1700304fc1ac7bc53ae9e5cbe9d60a52ed9bba8e2e2d782a201bb2b", size = 88112 }, - { url = "https://files.pythonhosted.org/packages/40/80/58a2a3fa64048279f250ea1058482da01c5611f90f82ea8f9f8e2295cfee/watchdog-5.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1228cb097e855d1798b550be8f0e9f0cfbac4384f9a3e91f66d250d03e11294e", size = 88742 }, - { url = "https://files.pythonhosted.org/packages/a7/9e/116fe5428214ba8e1139a083e819e8b1231d73d7b600aba9cc7df5338eaa/watchdog-5.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3c177085c3d210d1c73cb4569442bdaef706ebebc423bd7aed9e90fc12b2e553", size = 96112 }, - { url = "https://files.pythonhosted.org/packages/75/94/f43c15bf03de8ce9f29cb82422c0f35f05a4770afbc7f36ca9d55e8d7023/watchdog-5.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01ab36cddc836a0f202c66267daaef92ba5c17c7d6436deff0587bb61234c5c9", size = 88118 }, - { url = "https://files.pythonhosted.org/packages/f3/fd/0f1b0c75db0057475956a68e6896808bfaa6a494e02b88c786da9a86a461/watchdog-5.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0834c21efa3e767849b09e667274604c7cdfe30b49eb95d794565c53f4db3c1e", size = 88745 }, - { url = "https://files.pythonhosted.org/packages/b7/a6/78a205c13e72c3262dc6b5c7deab86a77b2a24dc4e376cd686d383883b7d/watchdog-5.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1e26f570dd7f5178656affb24d6f0e22ce66c8daf88d4061a27bfb9ac866b40d", size = 96207 }, - { url = "https://files.pythonhosted.org/packages/1d/54/c7bff808050273fc7d1fbe2fa649931c90e558816187d6c28086bd31c5ae/watchdog-5.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d146331e6b206baa9f6dd40f72b5783ad2302c240df68e7fce196d30588ccf7b", size = 88161 }, - { url = "https://files.pythonhosted.org/packages/8b/23/92382a9cbd3d9fbc35fa3693eb2932d54d8085af0a10a0af8c1959681c98/watchdog-5.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6c96b1706430839872a3e33b9370ee3f7a0079f6b828129d88498ad1f96a0f45", size = 88777 }, - { url = "https://files.pythonhosted.org/packages/96/06/eadb771e73854c2a1fdbd795aefdb6dcdf0aa9e922f98a7e8e72f4f79469/watchdog-5.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:663b096368ed7831ac42259919fdb9e0a1f0a8994d972675dfbcca0225e74de1", size = 96200 }, - { url = "https://files.pythonhosted.org/packages/fc/c5/8356ef0f6b991087aaa0abd303f7f8325bab448a7b3a9cd4a1963a18f124/watchdog-5.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:685931412978d00a91a193d9018fc9e394e565e8e7a0c275512a80e59c6e85f8", size = 88174 }, - { url = "https://files.pythonhosted.org/packages/76/98/25eb610688e465514846eb7fd051b48aac648ec345ad6bd6460a1b0d884a/watchdog-5.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:109daafc5b0f2a98d1fa9475ff9737eb3559d57b18129a36495e20c71de0b44f", size = 88776 }, - { url = "https://files.pythonhosted.org/packages/d5/17/fc54320492875082d7beee4e332112d83e6b5e6ae849fec82314f13f0ecd/watchdog-5.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:bc16d448a74a929b896ed9578c25756b2125400b19b3258be8d9a681c7ae8e71", size = 87630 }, - { url = "https://files.pythonhosted.org/packages/42/78/9d0b5df46d54e5c43a8859edb1b2af9410a08d691150181431e52d46c07a/watchdog-5.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7e6b0e9b8a9dc3865d65888b5f5222da4ba9c4e09eab13cff5e305e7b7e7248f", size = 88107 }, - { url = "https://files.pythonhosted.org/packages/48/8a/1e1e36a02a25d0242d0c57fbabcee2296532fe7d0d4e84f7b02fade7872b/watchdog-5.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d76efab5248aafbf8a2c2a63cd7b9545e6b346ad1397af8b862a3bb3140787d8", size = 78803 }, - { url = "https://files.pythonhosted.org/packages/44/25/238a16222369595f144a58d9d5ea3de2f76a0b4c8f4bab80e806174f6a0e/watchdog-5.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:ff4e957c45c446de34c513eadce01d0b65da7eee47c01dce472dd136124552c9", size = 78800 }, - { url = "https://files.pythonhosted.org/packages/4c/28/474243e7b4794c1a3fb7eb8c8b15f486ffdfbc9711055540522a09476975/watchdog-5.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:16c1aa3377bb1f82c5e24277fcbf4e2cac3c4ce46aaaf7212d53caa9076eb7b7", size = 78798 }, - { url = "https://files.pythonhosted.org/packages/36/c0/7dec9f91e684851a5f14edec1bebfe9bed6e6b45bad21396456543c4ba7f/watchdog-5.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:22fcad6168fc43cf0e709bd854be5b8edbb0b260f0a6f28f1ea9baa53c6907f7", size = 78800 }, - { url = "https://files.pythonhosted.org/packages/7b/a9/a0ae3c4e8581741a58a6652bebee255328b786d993db38b8d66660b2b830/watchdog-5.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:0120b2fa65732797ffa65fa8ee5540c288aa861d91447df298626d6385a24658", size = 78802 }, - { url = "https://files.pythonhosted.org/packages/d7/86/51fd182579692c41c1813d9269d349843adeb700adaf6a18d9da0681bcfb/watchdog-5.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2aa59fab7ff75281778c649557275ca3085eccbdf825a0e2a5ca3810e977afe5", size = 78801 }, - { url = "https://files.pythonhosted.org/packages/70/76/062a1e150a2ecbeee87bc1c794e95889eb7122c847666cb3351201386105/watchdog-5.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:78db0fe0336958fc0e1269545c980b6f33d04d184ba191b2800a8b71d3e971a9", size = 78801 }, - { url = "https://files.pythonhosted.org/packages/dd/80/8e4360dcd907e7fb0c718811abecbf11ecf75f2fe92c77a6cfc6ff63158c/watchdog-5.0.0-py3-none-win32.whl", hash = "sha256:d1acef802916083f2ad7988efc7decf07e46e266916c0a09d8fb9d387288ea12", size = 78790 }, - { url = "https://files.pythonhosted.org/packages/bd/94/1344f73df316dd199b50258d2afad05e1843ff87a2dde969640b3bf6c795/watchdog-5.0.0-py3-none-win_amd64.whl", hash = "sha256:3c2d50fdb86aa6df3973313272f5a17eb26eab29ff5a0bf54b6d34597b4dc4e4", size = 78793 }, - { url = "https://files.pythonhosted.org/packages/80/05/4128ae5cdf270bdd80ece30d02c72c0a67433e04c44a3a62e91dce7cfaf6/watchdog-5.0.0-py3-none-win_ia64.whl", hash = "sha256:1d17ec7e022c34fa7ddc72aa41bf28c9d1207ffb193df18ba4f6fde453725b3c", size = 78791 }, +version = "5.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/48/a86139aaeab2db0a2482676f64798d8ac4d2dbb457523f50ab37bf02ce2c/watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176", size = 129556 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/2b/dd2081aab6fc9e785c2eee7146d3c6de58e607f4e70049d715cd170cbf77/watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea", size = 96652 }, + { url = "https://files.pythonhosted.org/packages/9e/4f/f643c0a720d16ef7316aea06a79b96e229e59df4e0d83bec5e12713c1f29/watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb", size = 88651 }, + { url = "https://files.pythonhosted.org/packages/2b/72/acb22067d1f18161914c9b1087c703d63638131a9fde78090da290663407/watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b", size = 89289 }, + { url = "https://files.pythonhosted.org/packages/70/34/946f08602f8b8e6af45bc725e4a8013975a34883ab5570bd0d827a4c9829/watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818", size = 96650 }, + { url = "https://files.pythonhosted.org/packages/96/2b/b84e35d49e8b0bad77e5d086fc1e2c6c833bbfe74d53144cfe8b26117eff/watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490", size = 88653 }, + { url = "https://files.pythonhosted.org/packages/d5/3f/41b5d77c10f450b79921c17b7d0b416616048867bfe63acaa072a619a0cb/watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e", size = 89286 }, + { url = "https://files.pythonhosted.org/packages/1c/9b/8b206a928c188fdeb7b12e1c795199534cd44bdef223b8470129016009dd/watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8", size = 96739 }, + { url = "https://files.pythonhosted.org/packages/e1/26/129ca9cd0f8016672f37000010c2fedc0b86816e894ebdc0af9bb04a6439/watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926", size = 88708 }, + { url = "https://files.pythonhosted.org/packages/8f/b3/5e10ec32f0c429cdb55b1369066d6e83faf9985b3a53a4e37bb5c5e29aa0/watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e", size = 89309 }, + { url = "https://files.pythonhosted.org/packages/54/c4/49af4ab00bcfb688e9962eace2edda07a2cf89b9699ea536da48e8585cff/watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7", size = 96740 }, + { url = "https://files.pythonhosted.org/packages/96/a4/b24de77cc9ae424c1687c9d4fb15aa560d7d7b28ba559aca72f781d0202b/watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906", size = 88711 }, + { url = "https://files.pythonhosted.org/packages/a4/71/3f2e9fe8403386b99d788868955b3a790f7a09721501a7e1eb58f514ffaa/watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1", size = 89319 }, + { url = "https://files.pythonhosted.org/packages/a2/d6/1d1ca81c75d903eca3fdb7061d93845485b58a5ba182d146843b88fc51c2/watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7", size = 88172 }, + { url = "https://files.pythonhosted.org/packages/47/bb/d5e0abcfd6d729029a24766682e062526db8b59e9ae0c94aff509e0fd2b9/watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8", size = 88644 }, + { url = "https://files.pythonhosted.org/packages/60/33/7cb71c9df9a77b6927ee5f48d25e1de5562ce0fa7e0c56dcf2b0472e64a2/watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91", size = 79335 }, + { url = "https://files.pythonhosted.org/packages/f6/91/320bc1496cf951a3cf93a7ffd18a581f0792c304be963d943e0e608c2919/watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c", size = 79334 }, + { url = "https://files.pythonhosted.org/packages/8b/2c/567c5e042ed667d3544c43d48a65cf853450a2d2a9089d9523a65f195e94/watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c", size = 79333 }, + { url = "https://files.pythonhosted.org/packages/c3/f0/64059fe162ef3274662e67bbdea6c45b3cd53e846d5bd1365fcdc3dc1d15/watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221", size = 79334 }, + { url = "https://files.pythonhosted.org/packages/f6/d9/19b7d02965be2801e2d0f6f4bde23e4ae172620071b65430fa0c2f8441ac/watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05", size = 79333 }, + { url = "https://files.pythonhosted.org/packages/cb/a1/5393ac6d0b095d3a44946b09258e9b5f22cb2fb67bcfa419dd868478826c/watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97", size = 79332 }, + { url = "https://files.pythonhosted.org/packages/a0/58/edec25190b6403caf4426dd418234f2358a106634b7d6aa4aec6939b104f/watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7", size = 79334 }, + { url = "https://files.pythonhosted.org/packages/97/69/cfb2d17ba8aabc73be2e2d03c8c319b1f32053a02c4b571852983aa24ff2/watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49", size = 79320 }, + { url = "https://files.pythonhosted.org/packages/91/b4/2b5b59358dadfa2c8676322f955b6c22cde4937602f40490e2f7403e548e/watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9", size = 79325 }, + { url = "https://files.pythonhosted.org/packages/38/b8/0aa69337651b3005f161f7f494e59188a1d8d94171666900d26d29d10f69/watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45", size = 79324 }, ] [[package]] name = "wcmatch" -version = "9.0" +version = "10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bracex" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/90/a29d5b359c128c48e32a2dc161464d6aab822df82d3bf1c1286231eda3c2/wcmatch-9.0.tar.gz", hash = "sha256:567d66b11ad74384954c8af86f607857c3bdf93682349ad32066231abd556c92", size = 113625 } +sdist = { url = "https://files.pythonhosted.org/packages/41/ab/b3a52228538ccb983653c446c1656eddf1d5303b9cb8b9aef6a91299f862/wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a", size = 115578 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/da/0633223f30f5db6e52236567e09c28e37ff455b3dfbe0843029206e609e6/wcmatch-9.0-py3-none-any.whl", hash = "sha256:af25922e2b6dbd1550fa37a4c8de7dd558d6c1bb330c641de9b907b9776cb3c4", size = 39139 }, + { url = "https://files.pythonhosted.org/packages/ab/df/4ee467ab39cc1de4b852c212c1ed3becfec2e486a51ac1ce0091f85f38d7/wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a", size = 39347 }, ] [[package]] From 1d46a07acfc25e4effa1c2e356b863ce948b9ee5 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Tue, 29 Oct 2024 19:45:50 +0700 Subject: [PATCH 2/9] chore: overhaul `.vscode` files. --- .gitignore | 2 + .vscode/extensions.json | 40 +++++++++---------- .../{launch.json => launch.recommended.json} | 12 +++--- .vscode/settings.json | 26 +++++------- .vscode/settings.local.recommended.json | 9 +++++ 5 files changed, 46 insertions(+), 43 deletions(-) rename .vscode/{launch.json => launch.recommended.json} (91%) create mode 100644 .vscode/settings.local.recommended.json diff --git a/.gitignore b/.gitignore index 455be363fb..685f4af2af 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,8 @@ pip-delete-this-directory.txt # misc *.code-workspace verify_kzg_proof +.vscode/launch.recommended.json +.vscode/settings.local.recommended.json # docs .cache diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 4bcb2db306..b3f0b1f22e 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,23 +1,21 @@ { - // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. - // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp - // List of extensions which should be recommended for users of this workspace. - "recommendations": [ - "ms-python.python", - "charliermarsh.ruff", - "ms-python.mypy-type-checker", - "esbenp.prettier-vscode", - "njpwerner.autodocstring", // https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring - "streetsidesoftware.code-spell-checker", - "tamasfe.even-better-toml", - "bierner.markdown-mermaid", // https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid - "bpruitt-goddard.mermaid-markdown-syntax-highlighting", // https://marketplace.visualstudio.com/items?itemName=bpruitt-goddard.mermaid-markdown-syntax-highlighting - "DavidAnson.vscode-markdownlint", // https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint - ], - // List of extensions recommended by VS Code that should not be recommended for users of this workspace. - "unwantedRecommendations": [ - "ms-python.black-formatter", - "ms-python.isort", - "ms-python.flake8", - ] + // List of extensions that MUST be used for users of the repo. + "recommendations": [ + "ms-python.python", + "ms-python.mypy-type-checker", + "charliermarsh.ruff", + "esbenp.prettier-vscode", + "njpwerner.autodocstring", + "streetsidesoftware.code-spell-checker", + "tamasfe.even-better-toml", + "bierner.markdown-mermaid", + "bpruitt-goddard.mermaid-markdown-syntax-highlighting", + "DavidAnson.vscode-markdownlint" + ], + // List of extensions that MUST NOT be used for users of the repo. + "unwantedRecommendations": [ + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.isort" + ] } diff --git a/.vscode/launch.json b/.vscode/launch.recommended.json similarity index 91% rename from .vscode/launch.json rename to .vscode/launch.recommended.json index a529c491ed..4ca34ae3aa 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.recommended.json @@ -1,10 +1,10 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - // If the VS Code "Run and Debug" button, respecively launch selector are not visible, see this answer: - // https://stackoverflow.com/a/74245823 - // + "_comment": [ + "Main configuration for VS Code debugging", + "Use IntelliSense to learn about possible attributes.", + "If the VS Code 'Run and Debug' button or launch selector", + "is not visible, see: https://stackoverflow.com/a/74245823" + ], "version": "0.2.0", "configurations": [ { diff --git a/.vscode/settings.json b/.vscode/settings.json index 0892df47b0..1a021436e6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,6 @@ { + // Static settings that users MUST adhere to when + // developing with the EEST repo. "cSpell.customDictionaries": { "project-words": { "name": "project-words", @@ -9,10 +11,11 @@ "custom": true, "internal-terms": false }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, "[python]": { - "editor.rulers": [ - 100 - ], + "editor.rulers": [100], "editor.formatOnSave": true, "editor.defaultFormatter": "charliermarsh.ruff", "editor.codeActionsOnSave": { @@ -20,16 +23,7 @@ } }, "python.analysis.autoFormatStrings": true, - "python.testing.promptToConfigure": false, - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true, - "python.testing.pytestArgs": [ - "-c", - "pytest.ini" - ], - "ruff.lint.args": [ - "--line-length", - "99", - "--fix" - ] -} \ No newline at end of file + "ruff.enable": true, + "ruff.lint.args": ["--line-length", "99", "--fix"], + "extensions.ignoreRecommendations": false +} diff --git a/.vscode/settings.local.recommended.json b/.vscode/settings.local.recommended.json new file mode 100644 index 0000000000..3b39decdff --- /dev/null +++ b/.vscode/settings.local.recommended.json @@ -0,0 +1,9 @@ +{ + "_comment": [ + "Dynamic python testing settings for the vscode testing extension." + ], + "python.testing.promptToConfigure": false, + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "python.testing.pytestArgs": ["-c", "pytest.ini"] +} From 870186fb74fe2a7167d60a4be6dd73b7a3b53b25 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Wed, 30 Oct 2024 15:26:04 +0700 Subject: [PATCH 3/9] chore(ruff): changes to `src/cli`. --- src/cli/__init__.py | 4 +- src/cli/check_fixtures.py | 8 +--- src/cli/eofwrap.py | 41 ++++++++-------- src/cli/evm_bytes.py | 46 +++++++++--------- src/cli/gen_index.py | 30 +++++------- src/cli/gentest/__init__.py | 4 +- src/cli/gentest/cli.py | 8 ++-- src/cli/gentest/request_manager.py | 28 +++-------- src/cli/gentest/test_providers.py | 12 ++--- src/cli/hasher.py | 38 +++++---------- src/cli/order_fixtures.py | 7 +-- src/cli/pytest_commands/common.py | 6 +-- src/cli/pytest_commands/consume.py | 58 ++++++++--------------- src/cli/pytest_commands/execute.py | 40 +++++++++------- src/cli/pytest_commands/fill.py | 38 ++++++++------- src/cli/tests/__init__.py | 4 +- src/cli/tests/test_eofwrap.py | 9 ++-- src/cli/tests/test_evm_bytes.py | 12 ++--- src/cli/tests/test_order_fixtures.py | 24 +++------- src/cli/tests/test_pytest_fill_command.py | 56 ++++++---------------- src/cli/tox_helpers.py | 8 ++-- whitelist.txt | 1 + 22 files changed, 197 insertions(+), 285 deletions(-) diff --git a/src/cli/__init__.py b/src/cli/__init__.py index 0aa9db064d..1ce903f43e 100644 --- a/src/cli/__init__.py +++ b/src/cli/__init__.py @@ -1,3 +1 @@ -""" -Ethereum execution spec tests command-line tools. -""" +"""Ethereum execution spec tests command-line tools.""" diff --git a/src/cli/check_fixtures.py b/src/cli/check_fixtures.py index ef7e39f5dc..f626b163f8 100644 --- a/src/cli/check_fixtures.py +++ b/src/cli/check_fixtures.py @@ -25,7 +25,6 @@ def count_json_files_exclude_index(start_path: Path) -> int: def check_json(json_file_path: Path): """ Check all fixtures in the specified json file: - 1. Load the json file into a pydantic model. This checks there are no Validation errors when loading fixtures into EEST models. 2. Serialize the loaded pydantic model to "json" (actually python data @@ -33,7 +32,7 @@ def check_json(json_file_path: Path): 3. Load the serialized data back into a pydantic model (to get an updated hash) from step 2. 4. Compare hashes: - a. Compare the newly calculated hashes from step 2. and 3.and + a. Compare the newly calculated hashes from step 2. and 3. and b. If present, compare info["hash"] with the calculated hash from step 2. """ fixtures = Fixtures.from_file(json_file_path, fixture_format=None) @@ -84,9 +83,7 @@ def check_json(json_file_path: Path): help="Stop and raise any exceptions encountered while checking fixtures.", ) def check_fixtures(input_dir: str, quiet_mode: bool, stop_on_error: bool): - """ - Perform some checks on the fixtures contained in the specified directory. - """ + """Perform some checks on the fixtures contained in the specified directory.""" input_path = Path(input_dir) success = True file_count = 0 @@ -104,7 +101,6 @@ def check_fixtures(input_dir: str, quiet_mode: bool, stop_on_error: bool): expand=True, disable=quiet_mode, ) as progress: - task_id = progress.add_task("Checking fixtures", total=file_count, filename="...") for json_file_path in input_path.rglob("*.json"): if json_file_path.name == "index.json": diff --git a/src/cli/eofwrap.py b/src/cli/eofwrap.py index e7a8269cd9..8aeefb20ff 100644 --- a/src/cli/eofwrap.py +++ b/src/cli/eofwrap.py @@ -1,6 +1,6 @@ """ -Generate a JSON blockchain test from an existing JSON blockchain test by wrapping its prestate code -in EOF wherever possible. +Generate a JSON blockchain test from an existing JSON blockchain test by wrapping its pre-state +code in EOF wherever possible. Example Usage: @@ -41,9 +41,10 @@ @click.argument("input", type=click.Path(exists=True, dir_okay=True, file_okay=True)) @click.argument("output_dir", type=click.Path(dir_okay=True, file_okay=False)) @click.option("--traces", is_flag=True, type=bool) -def eof_wrap(input: str, output_dir: str, traces: bool): +def eof_wrap(input_path: str, output_dir: str, traces: bool): """ - Wraps JSON blockchain test file(s) found at `input` path and outputs them to the `output_dir`. + Wrap JSON blockchain test file(s) found at `input_path` and + outputs them to the `output_dir`. """ eof_wrapper = EofWrapper() @@ -53,18 +54,18 @@ def eof_wrap(input: str, output_dir: str, traces: bool): print(f"Error: {EvmOneTransitionTool.default_binary} must be in the PATH.") sys.exit(1) except Exception as e: - raise Exception(f"Unexpected exception: {e}.") + raise Exception(f"Unexpected exception: {e}") from e - if os.path.isfile(input): - file = os.path.basename(input) + if os.path.isfile(input_path): + file = os.path.basename(input_path) out_file = "eof_wrapped_" + file out_path = os.path.join(output_dir, out_file) - eof_wrapper.wrap_file(input, out_path, traces) + eof_wrapper.wrap_file(input_path, out_path, traces) else: - for subdir, dirs, files in os.walk(input): + for subdir, _, files in os.walk(input_path): for file in files: - rel_dir = Path(subdir).relative_to(input) + rel_dir = Path(subdir).relative_to(input_path) out_file = "eof_wrapped_" + file out_path = os.path.join(output_dir, rel_dir, out_file) in_path = os.path.join(subdir, file) @@ -77,9 +78,7 @@ def eof_wrap(input: str, output_dir: str, traces: bool): class EofWrapper: - """ - EOF wrapping of blockchain tests with some simple metrics tracking. - """ + """EOF wrapping of blockchain tests with some simple metrics tracking.""" # JSON files had at least one fixture generated successfully with EOF FILES_GENERATED = "files_generated" @@ -105,6 +104,7 @@ class EofWrapper: GENERATION_ERRORS = "generation_errors" def __init__(self): + """Initialize the EofWrapper with metrics tracking and a unique EOF set.""" self.metrics = { self.FILES_GENERATED: 0, self.FILES_SKIPPED: 0, @@ -155,7 +155,7 @@ def __init__(self): def wrap_file(self, in_path: str, out_path: str, traces: bool): """ - Wraps code from a blockchain test JSON file from `in_path` into EOF containers, + Wrap code from a blockchain test JSON file from `in_path` into EOF containers, wherever possible. If not possible - skips and tracks that in metrics. Possible means at least one account's code can be wrapped in a valid EOF container and the assertions on post state are satisfied. @@ -170,7 +170,7 @@ def wrap_file(self, in_path: str, out_path: str, traces: bool): out_fixtures = BaseFixturesRootModel({}) fixture: BlockchainFixture - for id, fixture in fixtures.items(): + for fixture_id, fixture in fixtures.items(): fixture_eof_codes = [] wrapped_at_least_one_account = False @@ -205,7 +205,7 @@ def wrap_file(self, in_path: str, out_path: str, traces: bool): try: out_fixture = self._wrap_fixture(fixture, traces) - out_fixtures[id] = out_fixture + out_fixtures[fixture_id] = out_fixture self.metrics[self.FIXTURES_GENERATED] += 1 self.unique_eof.update(fixture_eof_codes) self.metrics[self.UNIQUE_ACCOUNTS_WRAPPED] = len(self.unique_eof) @@ -224,11 +224,10 @@ def wrap_file(self, in_path: str, out_path: str, traces: bool): self.metrics[self.FILES_GENERATED] += 1 def _short_exception_msg(self, e: Exception): - THRESHOLD = 30 - + threshold = 30 short = str(e) - if len(short) > THRESHOLD: - short = short[:THRESHOLD] + "..." + if len(short) > threshold: + short = short[:threshold] + "..." return short def _wrap_fixture(self, fixture: BlockchainFixture, traces: bool): @@ -314,7 +313,7 @@ def _validate_eof(self, container: Container, metrics: bool = True) -> bool: @no_type_check def wrap_code(account_code: Bytes) -> Container: """ - Wraps `account_code` into a simplest EOF container, applying some simple heuristics in + Wrap `account_code` into a simplest EOF container, applying some simple heuristics in order to obtain a valid code section termination. """ assert len(account_code) > 0 diff --git a/src/cli/evm_bytes.py b/src/cli/evm_bytes.py index e53feca376..b9e1d3cbfe 100644 --- a/src/cli/evm_bytes.py +++ b/src/cli/evm_bytes.py @@ -1,6 +1,4 @@ -""" -Define an entry point wrapper for pytest. -""" +"""Define an entry point wrapper for pytest.""" from dataclasses import dataclass, field from typing import List @@ -59,13 +57,12 @@ def format_assembly(self) -> str: @property def terminating(self) -> bool: - """Whether the opcode is terminating or not""" + """Whether the opcode is terminating or not.""" return self.opcode.terminating if self.opcode else False @property def bytecode(self) -> Bytecode: """Opcode as bytecode with its operands if any.""" - # opcode.opcode[*opcode.operands] crashes `black` formatter and doesn't work. if self.opcode: return self.opcode.__getitem__(*self.operands) if self.operands else self.opcode else: @@ -152,7 +149,11 @@ def process_evm_bytes_string(evm_bytes_hex_string: str, assembly: bool = False) ) -@click.group(context_settings=dict(help_option_names=["-h", "--help"])) +@click.group( + context_settings={ + "help_option_names": ["-h", "--help"], + } +) def cli(): """ Convert the given EVM bytes to EEST's python opcodes or assembly string. @@ -193,15 +194,15 @@ def hex_string(hex_string: str, assembly: bool): ``` Output: + ```text + push1 0x42 + push1 0x00 + mstore + push1 0x20 + push1 0x00 + return + ``` - ```text - push1 0x42 - push1 0x00 - mstore - push1 0x20 - push1 0x00 - return - ``` """ # noqa: E501 processed_output = process_evm_bytes_string(hex_string, assembly=assembly) click.echo(processed_output) @@ -226,14 +227,15 @@ def binary_file(binary_file_path, assembly: bool): Output: - ```text - caller - push20 0xfffffffffffffffffffffffffffffffffffffffe - eq - push1 0x90 - jumpi - ... - ``` + ```text + caller + push20 0xfffffffffffffffffffffffffffffffffffffffe + eq + push1 0x90 + jumpi + ... + ``` + """ # noqa: E501 processed_output = format_opcodes( process_evm_bytes(binary_file_path.read()), assembly=assembly diff --git a/src/cli/gen_index.py b/src/cli/gen_index.py index 9552294842..ca68107354 100644 --- a/src/cli/gen_index.py +++ b/src/cli/gen_index.py @@ -1,6 +1,4 @@ -""" -Generate an index file of all the json fixtures in the specified directory. -""" +"""Generate an index file of all the json fixtures in the specified directory.""" import datetime import json @@ -27,16 +25,14 @@ from .hasher import HashableItem # TODO: remove when these tests are ported or fixed within ethereum/tests. -fixtures_to_skip = set( - [ - # These fixtures have invalid fields that we can't load into our pydantic models (bigint). - "BlockchainTests/GeneralStateTests/stTransactionTest/ValueOverflowParis.json", - "BlockchainTests/InvalidBlocks/bc4895-withdrawals/withdrawalsAmountBounds.json", - "BlockchainTests/InvalidBlocks/bc4895-withdrawals/withdrawalsIndexBounds.json", - "BlockchainTests/InvalidBlocks/bc4895-withdrawals/withdrawalsValidatorIndexBounds.json", - "BlockchainTests/InvalidBlocks/bc4895-withdrawals/withdrawalsAddressBounds.json", - ] -) +fixtures_to_skip = { + # These fixtures have invalid fields that we can't load into our pydantic models (bigint). + "BlockchainTests/GeneralStateTests/stTransactionTest/ValueOverflowParis.json", + "BlockchainTests/InvalidBlocks/bc4895-withdrawals/withdrawalsAmountBounds.json", + "BlockchainTests/InvalidBlocks/bc4895-withdrawals/withdrawalsIndexBounds.json", + "BlockchainTests/InvalidBlocks/bc4895-withdrawals/withdrawalsValidatorIndexBounds.json", + "BlockchainTests/InvalidBlocks/bc4895-withdrawals/withdrawalsAddressBounds.json", +} def count_json_files_exclude_index(start_path: Path) -> int: @@ -49,9 +45,7 @@ def count_json_files_exclude_index(start_path: Path) -> int: def infer_fixture_format_from_path(file: Path) -> FixtureFormat | None: - """ - Attempt to infer the fixture format from the file path. - """ + """Attempt to infer the fixture format from the file path.""" for fixture_type in FIXTURE_FORMATS.values(): if fixture_type.output_base_dir_name() in file.parts: return fixture_type @@ -104,9 +98,7 @@ def infer_fixture_format_from_path(file: Path) -> FixtureFormat | None: def generate_fixtures_index_cli( input_dir: str, quiet_mode: bool, force_flag: bool, disable_infer_format: bool ): - """ - The CLI wrapper to an index of all the fixtures in the specified directory. - """ + """CLI wrapper to an index of all the fixtures in the specified directory.""" generate_fixtures_index( Path(input_dir), quiet_mode=quiet_mode, diff --git a/src/cli/gentest/__init__.py b/src/cli/gentest/__init__.py index 40b6a4112b..16ccd68d10 100644 --- a/src/cli/gentest/__init__.py +++ b/src/cli/gentest/__init__.py @@ -32,4 +32,6 @@ 1. Only legacy transaction types (type 0) are currently supported. """ -from .cli import generate # noqa: 401 +from .cli import generate + +__all__ = ["generate"] diff --git a/src/cli/gentest/cli.py b/src/cli/gentest/cli.py index 14926299aa..bb92b46673 100644 --- a/src/cli/gentest/cli.py +++ b/src/cli/gentest/cli.py @@ -1,8 +1,9 @@ """ CLI interface for generating blockchain test scripts. -It extracts a specified transaction and its required state from a blockchain network -using the transaction hash and generates a Python test script based on that information. +It extracts a specified transaction and its required state from a +blockchain network using the transaction hash and generates a Python +test script based on that information. """ from sys import stderr @@ -25,7 +26,8 @@ @click.argument("output_file", type=click.File("w", lazy=True)) def generate(transaction_hash: str, output_file: TextIO): """ - Extracts a transaction and required state from a network to make a blockchain test out of it. + Extract a transaction and required state from a network to make a + blockchain test out of it. TRANSACTION_HASH is the hash of the transaction to be used. diff --git a/src/cli/gentest/request_manager.py b/src/cli/gentest/request_manager.py index 28774e62bc..aad203fe4a 100644 --- a/src/cli/gentest/request_manager.py +++ b/src/cli/gentest/request_manager.py @@ -21,22 +21,16 @@ class RPCRequest: - """ - Interface for the RPC interaction with remote node - """ + """Interface for the RPC interaction with remote node.""" class RemoteTransaction(Transaction): - """ - Model that represents a transaction. - """ + """Model that represents a transaction.""" block_number: HexNumber tx_hash: Hash class RemoteBlock(BaseModel): - """ - Model that represents a block. - """ + """Model that represents a block.""" coinbase: str difficulty: str @@ -48,9 +42,7 @@ class RemoteBlock(BaseModel): headers: dict[str, str] def __init__(self): - """ - Initialize the RequestManager with specific client config. - """ + """Initialize the RequestManager with specific client config.""" node_config = EnvConfig().remote_nodes[0] self.node_url = node_config.node_url headers = node_config.rpc_headers @@ -58,9 +50,7 @@ def __init__(self): self.debug_rpc = DebugRPC(node_config.node_url, extra_headers=headers) def eth_get_transaction_by_hash(self, transaction_hash: Hash) -> RemoteTransaction: - """ - Get transaction data. - """ + """Get transaction data.""" res = self.rpc.get_transaction_by_hash(transaction_hash) block_number = res.block_number assert block_number is not None, "Transaction does not seem to be included in any block" @@ -87,9 +77,7 @@ def eth_get_transaction_by_hash(self, transaction_hash: Hash) -> RemoteTransacti ) def eth_get_block_by_number(self, block_number: BlockNumberType) -> RemoteBlock: - """ - Get block by number - """ + """Get block by number.""" res = self.rpc.get_block_by_number(block_number) return RPCRequest.RemoteBlock( @@ -101,9 +89,7 @@ def eth_get_block_by_number(self, block_number: BlockNumberType) -> RemoteBlock: ) def debug_trace_call(self, transaction: RemoteTransaction) -> Dict[Address, Account]: - """ - Get pre-state required for transaction - """ + """Get pre-state required for transaction.""" assert transaction.sender is not None assert transaction.to is not None diff --git a/src/cli/gentest/test_providers.py b/src/cli/gentest/test_providers.py index 0779632e45..fc77946f60 100644 --- a/src/cli/gentest/test_providers.py +++ b/src/cli/gentest/test_providers.py @@ -1,5 +1,5 @@ """ -This module contains various providers which generates context required to create test scripts. +Contains various providers which generates context required to create test scripts. Classes: - BlockchainTestProvider: The BlockchainTestProvider class takes information about a block, @@ -9,6 +9,7 @@ Example: provider = BlockchainTestProvider(block=block, transaction=transaction, state=state) context = provider.get_context() + """ from typing import Any, Dict @@ -21,9 +22,7 @@ class BlockchainTestProvider(BaseModel): - """ - Provides context required to generate a `blockchain_test` using pytest. - """ + """Provides context required to generate a `blockchain_test` using pytest.""" block: RPCRequest.RemoteBlock transaction: RPCRequest.RemoteTransaction @@ -70,9 +69,7 @@ def _get_pre_state_items(self) -> str: # TODO: Output should be dict. Formatting should happen in the template. def _get_transaction_items(self) -> str: - """ - Print legacy transaction in .py - """ + """Print legacy transaction in .py.""" pad = " " tr_str = "" quoted_fields_array = ["data", "to"] @@ -108,6 +105,7 @@ def get_context(self) -> Dict[str, Any]: Returns: Dict[str, Any]: A dictionary containing module docstring, test name, test docstring, environment kwargs, pre-state items, and transaction items. + """ return { "environment_kwargs": self._get_environment_kwargs(), diff --git a/src/cli/hasher.py b/src/cli/hasher.py index 06d309868c..bd5caaeca5 100644 --- a/src/cli/hasher.py +++ b/src/cli/hasher.py @@ -1,6 +1,4 @@ -""" -Simple CLI tool to hash a directory of JSON fixtures. -""" +"""Simple CLI tool to hash a directory of JSON fixtures.""" import hashlib import json @@ -13,9 +11,7 @@ class HashableItemType(IntEnum): - """ - Represents the type of a hashable item. - """ + """Represents the type of a hashable item.""" FOLDER = 0 FILE = auto() @@ -24,9 +20,7 @@ class HashableItemType(IntEnum): @dataclass(kw_only=True) class HashableItem: - """ - Represents an item that can be hashed containing other items that can be hashed as well. - """ + """Represents an item that can be hashed containing other items that can be hashed as well.""" type: HashableItemType parents: List[str] = field(default_factory=list) @@ -34,9 +28,7 @@ class HashableItem: items: Optional[Dict[str, "HashableItem"]] = None def hash(self) -> bytes: - """ - Return the hash of the item. - """ + """Return the hash of the item.""" if self.root is not None: return self.root if self.items is None: @@ -50,9 +42,7 @@ def hash(self) -> bytes: def print( self, *, name: str, level: int = 0, print_type: Optional[HashableItemType] = None ) -> None: - """ - Print the hash of the item and sub-items. - """ + """Print the hash of the item and sub-items.""" next_level = level print_name = name if level == 0 and self.parents: @@ -68,9 +58,7 @@ def print( @classmethod def from_json_file(cls, *, file_path: Path, parents: List[str]) -> "HashableItem": - """ - Create a hashable item from a JSON file. - """ + """Create a hashable item from a JSON file.""" items = {} with file_path.open("r") as f: data = json.load(f) @@ -97,10 +85,12 @@ def from_json_file(cls, *, file_path: Path, parents: List[str]) -> "HashableItem return cls(type=HashableItemType.FILE, items=items, parents=parents) @classmethod - def from_folder(cls, *, folder_path: Path, parents: List[str] = []) -> "HashableItem": - """ - Create a hashable item from a folder. - """ + def from_folder( + cls, *, folder_path: Path, parents: Optional[List[str]] = None + ) -> "HashableItem": + """Create a hashable item from a folder.""" + if parents is None: + parents = [] items = {} for file_path in sorted(folder_path.iterdir()): if ".meta" in file_path.parts: @@ -124,9 +114,7 @@ def from_folder(cls, *, folder_path: Path, parents: List[str] = []) -> "Hashable @click.option("--tests", "-t", is_flag=True, help="Print hash of tests") @click.option("--root", "-r", is_flag=True, help="Only print hash of root folder") def main(folder_path_str: str, files: bool, tests: bool, root: bool) -> None: - """ - Hash folders of JSON fixtures and print their hashes. - """ + """Hash folders of JSON fixtures and print their hashes.""" folder_path: Path = Path(folder_path_str) item = HashableItem.from_folder(folder_path=folder_path) diff --git a/src/cli/order_fixtures.py b/src/cli/order_fixtures.py index 2204a19245..caa08dce93 100644 --- a/src/cli/order_fixtures.py +++ b/src/cli/order_fixtures.py @@ -37,6 +37,7 @@ def recursive_sort(item: Union[Dict[str, Any], List[Any]]) -> Union[Dict[str, An Returns: The sorted item. + """ if isinstance(item, dict): return dict(sorted((k, recursive_sort(v)) for k, v in item.items())) @@ -64,6 +65,7 @@ def order_fixture(input_path: Path, output_path: Path) -> None: Returns: None. + """ with input_path.open("r") as f: data = json.load(f) @@ -86,6 +88,7 @@ def process_directory(input_dir: Path, output_dir: Path): Returns: None. + """ if not output_dir.exists(): output_dir.mkdir(parents=True) @@ -114,9 +117,7 @@ def process_directory(input_dir: Path, output_dir: Path): help="The output directory", ) def order_fixtures(input_dir, output_dir): - """ - Order json fixture by key recursively from the input directory. - """ + """Order json fixture by key recursively from the input directory.""" input_dir = Path(input_dir) output_dir = Path(output_dir) process_directory(input_dir, output_dir) diff --git a/src/cli/pytest_commands/common.py b/src/cli/pytest_commands/common.py index 114d658021..69959c0ea7 100644 --- a/src/cli/pytest_commands/common.py +++ b/src/cli/pytest_commands/common.py @@ -1,6 +1,4 @@ -""" -Common functions for CLI pytest-based entry points. -""" +"""Common functions for CLI pytest-based entry points.""" from typing import Any, Callable, Dict, List @@ -65,7 +63,7 @@ def common_click_options(func: Callable[..., Any]) -> Decorator: def handle_help_flags(pytest_args: List[str], pytest_type: str) -> List[str]: """ - Modifies the help arguments passed to the click CLI command before forwarding to + Modify help arguments passed to the click CLI command before forwarding to the pytest command. This is to make `--help` more useful because `pytest --help` is extremely diff --git a/src/cli/pytest_commands/consume.py b/src/cli/pytest_commands/consume.py index 532a7ff6e8..841e144a70 100644 --- a/src/cli/pytest_commands/consume.py +++ b/src/cli/pytest_commands/consume.py @@ -1,6 +1,4 @@ -""" -CLI entry point for the `consume` pytest-based command. -""" +"""CLI entry point for the `consume` pytest-based command.""" import os import sys @@ -15,9 +13,7 @@ def handle_hive_env_flags(args: List[str]) -> List[str]: - """ - Convert hive environment variables into pytest flags. - """ + """Convert hive environment variables into pytest flags.""" env_var_mappings = { # TODO: Align `--sim.limit` regex with pytest -k. "HIVE_TEST_PATTERN": ["-k"], @@ -28,16 +24,14 @@ def handle_hive_env_flags(args: List[str]) -> List[str]: if value is not None: args.extend(pytest_flag + [value]) if os.getenv("HIVE_RANDOM_SEED") is not None: - warnings.warn("HIVE_RANDOM_SEED is not yet supported.") + warnings.warn("HIVE_RANDOM_SEED is not yet supported.", stacklevel=2) if os.getenv("HIVE_LOGLEVEL") is not None: - warnings.warn("HIVE_LOG_LEVEL is not yet supported.") + warnings.warn("HIVE_LOG_LEVEL is not yet supported.", stacklevel=2) return args def handle_consume_command_flags(consume_args: List[str], is_hive: bool) -> List[str]: - """ - Handle all consume CLI flag pre-processing. - """ + """Handle all consume CLI flag pre-processing.""" args = list(handle_help_flags(consume_args, pytest_type="consume")) args += ["-c", "pytest-consume.ini"] if is_hive: @@ -50,9 +44,7 @@ def handle_consume_command_flags(consume_args: List[str], is_hive: bool) -> List def get_command_paths(command_name: str, is_hive: bool) -> List[Path]: - """ - Determine the command paths based on the command name and hive flag. - """ + """Determine the command paths based on the command name and hive flag.""" base_path = Path("src/pytest_plugins/consume") if command_name == "hive": commands = ["rlp", "engine"] @@ -67,9 +59,7 @@ def get_command_paths(command_name: str, is_hive: bool) -> List[Path]: def consume_command(is_hive: bool = False) -> Callable[[Callable[..., Any]], click.Command]: - """ - Decorator to generate a consume sub-command. - """ + """Generate a consume sub-command.""" def create_command( func: Callable[..., Any], @@ -78,14 +68,14 @@ def create_command( command_paths: List[Path], is_hive: bool, ) -> click.Command: - """ - Create the command function to be decorated. - """ + """Create the command function to be decorated.""" @consume.command( name=command_name, help=command_help, - context_settings=dict(ignore_unknown_options=True), + context_settings={ + "ignore_unknown_options": True, + }, ) @common_click_options def command(pytest_args: List[str], **kwargs) -> None: @@ -104,41 +94,35 @@ def decorator(func: Callable[..., Any]) -> click.Command: return decorator -@click.group(context_settings=dict(help_option_names=["-h", "--help"])) +@click.group( + context_settings={ + "help_option_names": ["-h", "--help"], + } +) def consume() -> None: - """ - Consume command to aid client consumption of test fixtures. - """ + """Consume command to aid client consumption of test fixtures.""" pass @consume_command(is_hive=False) def direct() -> None: - """ - Clients consume directly via the `blocktest` interface. - """ + """Clients consume directly via the `blocktest` interface.""" pass @consume_command(is_hive=True) def rlp() -> None: - """ - Clients consume RLP-encoded blocks on startup. - """ + """Client consumes RLP-encoded blocks on startup.""" pass @consume_command(is_hive=True) def engine() -> None: - """ - Clients consume via the Engine API. - """ + """Client consumes via the Engine API.""" pass @consume_command(is_hive=True) def hive() -> None: - """ - Clients consume via all available hive methods (rlp, engine). - """ + """Client consumes via all available hive methods (rlp, engine).""" pass diff --git a/src/cli/pytest_commands/execute.py b/src/cli/pytest_commands/execute.py index a949577baa..d9750b7f88 100644 --- a/src/cli/pytest_commands/execute.py +++ b/src/cli/pytest_commands/execute.py @@ -1,6 +1,4 @@ -""" -CLI entry point for the `execute` pytest-based command. -""" +"""CLI entry point for the `execute` pytest-based command.""" import sys from typing import Tuple @@ -11,15 +9,21 @@ from .common import common_click_options, handle_help_flags -@click.group(context_settings=dict(help_option_names=["-h", "--help"])) +@click.group( + context_settings={ + "help_option_names": ["-h", "--help"], + } +) def execute() -> None: - """ - Execute command to run tests in hive or live networks. - """ + """Execute command to run tests in hive or live networks.""" pass -@execute.command(context_settings=dict(ignore_unknown_options=True)) +@execute.command( + context_settings={ + "ignore_unknown_options": True, + } +) @common_click_options def hive( pytest_args: Tuple[str, ...], @@ -37,15 +41,17 @@ def hive( sys.exit(result) -@execute.command(context_settings=dict(ignore_unknown_options=True)) +@execute.command( + context_settings={ + "ignore_unknown_options": True, + } +) @common_click_options def remote( pytest_args: Tuple[str, ...], **kwargs, ) -> None: - """ - Execute tests using a remote RPC endpoint. - """ + """Execute tests using a remote RPC endpoint.""" pytest_type = "execute" args = handle_help_flags(list(pytest_args), pytest_type=pytest_type) ini_file = "pytest-execute.ini" @@ -54,15 +60,17 @@ def remote( sys.exit(result) -@execute.command(context_settings=dict(ignore_unknown_options=True)) +@execute.command( + context_settings={ + "ignore_unknown_options": True, + } +) @common_click_options def recover( pytest_args: Tuple[str, ...], **kwargs, ) -> None: - """ - Recover funds from a failed test execution using a remote RPC endpoint. - """ + """Recover funds from a failed test execution using a remote RPC endpoint.""" pytest_type = "execute-recover" args = handle_help_flags(list(pytest_args), pytest_type=pytest_type) ini_file = "pytest-execute-recover.ini" diff --git a/src/cli/pytest_commands/fill.py b/src/cli/pytest_commands/fill.py index b6ce5d8053..8646abfeb0 100644 --- a/src/cli/pytest_commands/fill.py +++ b/src/cli/pytest_commands/fill.py @@ -1,6 +1,4 @@ -""" -CLI entry point for the `fill` pytest-based command. -""" +"""CLI entry point for the `fill` pytest-based command.""" import sys from typing import List @@ -11,11 +9,13 @@ from .common import common_click_options, handle_help_flags -@click.command(context_settings=dict(ignore_unknown_options=True)) +@click.command( + context_settings={ + "ignore_unknown_options": True, + } +) def tf() -> None: - """ - The `tf` command, deprecated as of 2023-06. - """ + """`tf` command, deprecated as of 2023-06.""" print( "The `tf` command-line tool has been superseded by `fill`. Try:\n\n" "fill --help\n\n" @@ -45,20 +45,20 @@ def handle_stdout_flags(args: List[str]) -> List[str]: def handle_fill_command_flags(fill_args: List[str]) -> List[str]: - """ - Handles all fill CLI flag pre-processing. - """ + """Handle all fill CLI flag pre-processing.""" args = handle_help_flags(fill_args, pytest_type="fill") args = handle_stdout_flags(args) return args -@click.command(context_settings=dict(ignore_unknown_options=True)) +@click.command( + context_settings={ + "ignore_unknown_options": True, + } +) @common_click_options def fill(pytest_args: List[str], **kwargs) -> None: - """ - Entry point for the fill command. - """ + """Entry point for the fill command.""" result = pytest.main( handle_fill_command_flags( ["--index", *pytest_args], @@ -67,12 +67,14 @@ def fill(pytest_args: List[str], **kwargs) -> None: sys.exit(result) -@click.command(context_settings=dict(ignore_unknown_options=True)) +@click.command( + context_settings={ + "ignore_unknown_options": True, + } +) @common_click_options def phil(pytest_args: List[str], **kwargs) -> None: - """ - A friendly alias for the fill command. - """ + """Friendly alias for the fill command.""" args = handle_fill_command_flags( ["--index", *pytest_args], ) diff --git a/src/cli/tests/__init__.py b/src/cli/tests/__init__.py index 44fa22680b..e498c14abb 100644 --- a/src/cli/tests/__init__.py +++ b/src/cli/tests/__init__.py @@ -1,3 +1 @@ -""" -Tests for scripts and apps in `cli` . -""" +"""Tests for scripts and apps in `cli` .""" diff --git a/src/cli/tests/test_eofwrap.py b/src/cli/tests/test_eofwrap.py index 2f554ef8a2..80ed8d8ffb 100644 --- a/src/cli/tests/test_eofwrap.py +++ b/src/cli/tests/test_eofwrap.py @@ -1,6 +1,5 @@ -""" -Tests for the eofwrap module and click CLI. -""" +"""Tests for the eofwrap module and click CLI.""" + import pytest from ethereum_test_base_types.conversions import to_hex @@ -47,7 +46,5 @@ ids=lambda param: to_hex(param), ) def test_wrap_code(code, result): - """ - Tests for the EOF wrapping logic and heuristics - """ + """Tests for the EOF wrapping logic and heuristics.""" assert wrap_code(bytes(code)) == result diff --git a/src/cli/tests/test_evm_bytes.py b/src/cli/tests/test_evm_bytes.py index 8d172ddcc7..64bebd4182 100644 --- a/src/cli/tests/test_evm_bytes.py +++ b/src/cli/tests/test_evm_bytes.py @@ -1,6 +1,4 @@ -""" -Test suite for `cli.evm_bytes` module. -""" +"""Test suite for `cli.evm_bytes` module.""" import pytest @@ -47,7 +45,7 @@ ], ) def test_evm_bytes(evm_bytes: str, python_opcodes: str): - """Test evm_bytes using the basic and complex vectors""" + """Test evm_bytes using the basic and complex vectors.""" assert process_evm_bytes_string(evm_bytes) == python_opcodes @@ -60,7 +58,7 @@ def test_evm_bytes(evm_bytes: str, python_opcodes: str): ids=lambda op: op._name_, ) def test_individual_opcodes(opcode: Op): - """Test each opcode individually""" + """Test each opcode individually.""" data_portion = b"" if opcode.data_portion_length > 0: expected_output = f"Op.{opcode._name_}[0x0]" @@ -76,13 +74,13 @@ def test_individual_opcodes(opcode: Op): def test_invalid_opcode(): - """Invalid hex string""" + """Invalid hex string.""" with pytest.raises(ValueError): process_evm_bytes_string("0xZZ") def test_unknown_opcode(): - """Opcode not defined in Op""" + """Opcode not defined in Op.""" with pytest.raises(ValueError): process_evm_bytes_string("0x0F") process_evm_bytes_string("0x0F") diff --git a/src/cli/tests/test_order_fixtures.py b/src/cli/tests/test_order_fixtures.py index f68fe7513b..2bd2d7f64d 100644 --- a/src/cli/tests/test_order_fixtures.py +++ b/src/cli/tests/test_order_fixtures.py @@ -1,6 +1,4 @@ -""" -Tests for the order_fixtures module and click CLI. -""" +"""Tests for the order_fixtures module and click CLI.""" import json from pathlib import Path @@ -21,17 +19,13 @@ def create_temp_json_file(directory, name, content): # noqa: D103 @pytest.fixture def input_output_dirs(): - """ - Create temporary input and output directories - """ + """Create temporary input and output directories.""" with TemporaryDirectory() as input_dir, TemporaryDirectory() as output_dir: yield Path(input_dir), Path(output_dir) def test_order_fixture(input_output_dirs): - """ - Test sorting a single JSON fixture. - """ + """Test sorting a single JSON fixture.""" input_dir, output_dir = input_output_dirs create_temp_json_file(input_dir, "test.json", {"z": 0, "a": [3, 2, 1]}) expected_output = {"a": [1, 2, 3], "z": 0} @@ -48,9 +42,7 @@ def test_order_fixture(input_output_dirs): def test_cli_invocation(input_output_dirs): - """ - Test the CLI interface. - """ + """Test the CLI interface.""" runner = CliRunner() input_dir, output_dir = input_output_dirs create_temp_json_file(input_dir, "test.json", {"c": 2, "b": [4, 3, 5]}) @@ -64,9 +56,7 @@ def test_cli_invocation(input_output_dirs): def test_input_is_file_instead_of_directory(): - """ - Test the CLI interface when the input path is a file, not a directory. - """ + """Test the CLI interface when the input path is a file, not a directory.""" runner = CliRunner() with TemporaryDirectory() as temp_dir: temp_file = Path(temp_dir) / "temp_file.txt" @@ -79,9 +69,7 @@ def test_input_is_file_instead_of_directory(): def test_input_directory_does_not_exist(): - """ - Test the CLI interface when the input directory does not exist. - """ + """Test the CLI interface when the input directory does not exist.""" runner = CliRunner() with TemporaryDirectory() as temp_dir: non_existent_dir = Path(temp_dir) / "nonexistent" diff --git a/src/cli/tests/test_pytest_fill_command.py b/src/cli/tests/test_pytest_fill_command.py index 0e920f718f..e1293fa9ed 100644 --- a/src/cli/tests/test_pytest_fill_command.py +++ b/src/cli/tests/test_pytest_fill_command.py @@ -1,6 +1,4 @@ -""" -Tests for pytest commands (e.g., fill) click CLI. -""" +"""Tests for pytest commands (e.g., fill) click CLI.""" from pathlib import Path from tempfile import TemporaryDirectory @@ -16,14 +14,12 @@ @pytest.fixture def runner(): - """Provides a Click CliRunner for invoking command-line interfaces.""" + """Provide a Click CliRunner for invoking command-line interfaces.""" return CliRunner() def test_fill_help(runner): - """ - Test the `--help` option of the `fill` command. - """ + """Test the `--help` option of the `fill` command.""" result = runner.invoke(fill, ["--help"]) assert result.exit_code == pytest.ExitCode.OK assert "[--evm-bin EVM_BIN]" in result.output @@ -34,9 +30,7 @@ def test_fill_help(runner): def test_fill_pytest_help(runner): - """ - Test the `--pytest-help` option of the `fill` command. - """ + """Test the `--pytest-help` option of the `fill` command.""" result = runner.invoke(fill, ["--pytest-help"]) assert result.exit_code == pytest.ExitCode.OK assert "[options] [file_or_dir] [file_or_dir] [...]" in result.output @@ -44,18 +38,14 @@ def test_fill_pytest_help(runner): def test_fill_with_invalid_option(runner): - """ - Test invoking `fill` with an invalid option. - """ + """Test invoking `fill` with an invalid option.""" result = runner.invoke(fill, ["--invalid-option"]) assert result.exit_code != 0 assert "unrecognized arguments" in result.output def test_tf_deprecation(runner): - """ - Test the deprecation message of the `tf` command. - """ + """Test the deprecation message of the `tf` command.""" from ..pytest_commands.fill import tf result = runner.invoke(tf, []) @@ -65,14 +55,12 @@ def test_tf_deprecation(runner): @pytest.mark.run_in_serial class TestHtmlReportFlags: - """ - Test html report generation and output options. - """ + """Test html report generation and output options.""" @pytest.fixture def fill_args(self): """ - Provides default arguments for the `fill` command when testing html report + Provide default arguments for the `fill` command when testing html report generation. Specifies a single existing example test case for faster fill execution, @@ -82,9 +70,7 @@ def fill_args(self): @pytest.fixture() def default_html_report_file_path(self): - """ - The default file path for fill's pytest html report. - """ + """File path for fill's pytest html report.""" return pytest_plugins.filler.filler.default_html_report_file_path() @pytest.fixture(scope="function") @@ -118,9 +104,7 @@ def test_fill_default_output_options( fill_args, default_html_report_file_path, ): - """ - Test default pytest html behavior: Neither `--html` or `--output` is specified. - """ + """Test default pytest html behavior: Neither `--html` or `--output` is specified.""" default_html_path = temp_dir / default_html_report_file_path result = runner.invoke(fill, fill_args) assert result.exit_code == pytest.ExitCode.OK @@ -133,9 +117,7 @@ def test_fill_no_html_option( fill_args, default_html_report_file_path, ): - """ - Test pytest html report is disabled with the `--no-html` flag. - """ + """Test pytest html report is disabled with the `--no-html` flag.""" default_html_path = temp_dir / default_html_report_file_path fill_args += ["--no-html"] result = runner.invoke(fill, fill_args) @@ -148,9 +130,7 @@ def test_fill_html_option( temp_dir, fill_args, ): - """ - Tests pytest html report generation with only the `--html` flag. - """ + """Tests pytest html report generation with only the `--html` flag.""" non_default_html_path = temp_dir / "non_default_output_dir" / "report.html" fill_args += ["--html", str(non_default_html_path)] result = runner.invoke(fill, fill_args) @@ -164,9 +144,7 @@ def test_fill_output_option( fill_args, default_html_report_file_path, ): - """ - Tests pytest html report generation with only the `--output` flag. - """ + """Tests pytest html report generation with only the `--output` flag.""" output_dir = temp_dir / "non_default_output_dir" non_default_html_path = output_dir / default_html_report_file_path fill_args += ["--output", str(output_dir)] @@ -181,9 +159,7 @@ def test_fill_html_and_output_options( temp_dir, fill_args, ): - """ - Tests pytest html report generation with both `--output` and `--html` flags. - """ + """Tests pytest html report generation with both `--output` and `--html` flags.""" output_dir = temp_dir / "non_default_output_dir_fixtures" html_path = temp_dir / "non_default_output_dir_html" / "non_default.html" fill_args += ["--output", str(output_dir), "--html", str(html_path)] @@ -194,9 +170,7 @@ def test_fill_html_and_output_options( def test_phil_default_output_options(runner): - """ - A simple sanity test for phil. - """ + """A simple sanity test for phil.""" fill_args = ["-k", "test_dup and state_test-DUP16 and LEGACY", "--fork", "Frontier"] result = runner.invoke(phil, fill_args) assert result.exit_code == pytest.ExitCode.OK diff --git a/src/cli/tox_helpers.py b/src/cli/tox_helpers.py index 18f87f3f24..fd67e77d66 100644 --- a/src/cli/tox_helpers.py +++ b/src/cli/tox_helpers.py @@ -16,10 +16,10 @@ @click.command( - context_settings=dict( - ignore_unknown_options=True, - allow_extra_args=True, - ) + context_settings={ + "ignore_unknown_options": True, + "allow_extra_args": True, + } ) @click.argument("args", nargs=-1, type=click.UNPROCESSED) def markdownlint(args): diff --git a/whitelist.txt b/whitelist.txt index 7eaa4fa2f2..5d20e56abd 100644 --- a/whitelist.txt +++ b/whitelist.txt @@ -27,6 +27,7 @@ basename bb besu bidict +pyspecs big0 big1 bigint From 4d969533d08e5b7a5e85150673c488fa0f08ee26 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Wed, 30 Oct 2024 15:36:16 +0700 Subject: [PATCH 4/9] chore(noqa|todo): changes to `src/cli`. --- src/cli/evm_bytes.py | 16 +++++++++++----- .../templates/blockchain_test/transaction.py.j2 | 2 +- src/cli/pytest_commands/consume.py | 1 - src/cli/pytest_commands/fill.py | 2 +- src/cli/tests/test_order_fixtures.py | 3 ++- src/cli/tests/test_pytest_fill_command.py | 3 ++- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/cli/evm_bytes.py b/src/cli/evm_bytes.py index b9e1d3cbfe..5ae799a324 100644 --- a/src/cli/evm_bytes.py +++ b/src/cli/evm_bytes.py @@ -69,7 +69,8 @@ def bytecode(self) -> Bytecode: return Bytecode() -def process_evm_bytes(evm_bytes: bytes) -> List[OpcodeWithOperands]: # noqa: D103 +def process_evm_bytes(evm_bytes: bytes) -> List[OpcodeWithOperands]: + """Parse a sequence of EVM bytes into a list of opcodes with their operands.""" evm_bytes = bytearray(evm_bytes) opcodes: List[OpcodeWithOperands] = [] @@ -114,7 +115,11 @@ def process_evm_bytes(evm_bytes: bytes) -> List[OpcodeWithOperands]: # noqa: D1 return opcodes -def format_opcodes(opcodes: List[OpcodeWithOperands], assembly: bool = False) -> str: # noqa: D103 +def format_opcodes(opcodes: List[OpcodeWithOperands], assembly: bool = False) -> str: + """ + Format a list of opcodes into a string, optionally as assembly + with empty lines for readability. + """ if assembly: opcodes_with_empty_lines: List[OpcodeWithOperands] = [] for i, op_with_operands in enumerate(opcodes): @@ -203,7 +208,7 @@ def hex_string(hex_string: str, assembly: bool): return ``` - """ # noqa: E501 + """ processed_output = process_evm_bytes_string(hex_string, assembly=assembly) click.echo(processed_output) @@ -222,7 +227,8 @@ def binary_file(binary_file_path, assembly: bool): Example: Convert the Withdrawal Request contract to assembly ```bash - uv run evm_bytes binary-file ./src/ethereum_test_forks/forks/contracts/withdrawal_request.bin --assembly + uv run evm_bytes \ + binary-file ./src/ethereum_test_forks/forks/contracts/withdrawal_request.bin --assembly ``` Output: @@ -236,7 +242,7 @@ def binary_file(binary_file_path, assembly: bool): ... ``` - """ # noqa: E501 + """ processed_output = format_opcodes( process_evm_bytes(binary_file_path.read()), assembly=assembly ) diff --git a/src/cli/gentest/templates/blockchain_test/transaction.py.j2 b/src/cli/gentest/templates/blockchain_test/transaction.py.j2 index 93836949a7..1c9bd4bb6c 100644 --- a/src/cli/gentest/templates/blockchain_test/transaction.py.j2 +++ b/src/cli/gentest/templates/blockchain_test/transaction.py.j2 @@ -22,7 +22,7 @@ def env(): # noqa: D103 @pytest.mark.valid_from("Paris") -def test_transaction_{{ tx_hash }}( # noqa: SC200, E501 +def test_transaction_{{ tx_hash }}( env: Environment, blockchain_test: BlockchainTestFiller, ): diff --git a/src/cli/pytest_commands/consume.py b/src/cli/pytest_commands/consume.py index 841e144a70..0916fabf32 100644 --- a/src/cli/pytest_commands/consume.py +++ b/src/cli/pytest_commands/consume.py @@ -15,7 +15,6 @@ def handle_hive_env_flags(args: List[str]) -> List[str]: """Convert hive environment variables into pytest flags.""" env_var_mappings = { - # TODO: Align `--sim.limit` regex with pytest -k. "HIVE_TEST_PATTERN": ["-k"], "HIVE_PARALLELISM": ["-n"], } diff --git a/src/cli/pytest_commands/fill.py b/src/cli/pytest_commands/fill.py index 8646abfeb0..9f355da2fa 100644 --- a/src/cli/pytest_commands/fill.py +++ b/src/cli/pytest_commands/fill.py @@ -20,7 +20,7 @@ def tf() -> None: "The `tf` command-line tool has been superseded by `fill`. Try:\n\n" "fill --help\n\n" "or see the online docs:\n" - "https://ethereum.github.io/execution-spec-tests/getting_started/executing_tests_command_line/" # noqa: E501 + "https://ethereum.github.io/execution-spec-tests/getting_started/executing_tests_command_line/" ) sys.exit(1) diff --git a/src/cli/tests/test_order_fixtures.py b/src/cli/tests/test_order_fixtures.py index 2bd2d7f64d..27a88ceef7 100644 --- a/src/cli/tests/test_order_fixtures.py +++ b/src/cli/tests/test_order_fixtures.py @@ -10,7 +10,8 @@ from ..order_fixtures import order_fixtures, process_directory -def create_temp_json_file(directory, name, content): # noqa: D103 +def create_temp_json_file(directory, name, content): + """Create a temporary JSON file with specified content.""" file_path = directory / name with file_path.open("w") as f: json.dump(content, f) diff --git a/src/cli/tests/test_pytest_fill_command.py b/src/cli/tests/test_pytest_fill_command.py index e1293fa9ed..3f633332fe 100644 --- a/src/cli/tests/test_pytest_fill_command.py +++ b/src/cli/tests/test_pytest_fill_command.py @@ -74,7 +74,8 @@ def default_html_report_file_path(self): return pytest_plugins.filler.filler.default_html_report_file_path() @pytest.fixture(scope="function") - def temp_dir(self) -> Generator[Path, None, None]: # noqa: D102 + def temp_dir(self) -> Generator[Path, None, None]: + """Provide a temporary directory as a pytest fixture.""" temp_dir = TemporaryDirectory() yield Path(temp_dir.name) temp_dir.cleanup() From 96058aa8fe828468dc9dc8c9d6a0d95c780127e6 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Wed, 30 Oct 2024 15:39:30 +0700 Subject: [PATCH 5/9] chore(tf): remove `tf` from the repo. --- src/cli/pytest_commands/fill.py | 16 ---------------- src/cli/tests/test_pytest_fill_command.py | 9 --------- whitelist.txt | 2 -- 3 files changed, 27 deletions(-) diff --git a/src/cli/pytest_commands/fill.py b/src/cli/pytest_commands/fill.py index 9f355da2fa..3cf69e01af 100644 --- a/src/cli/pytest_commands/fill.py +++ b/src/cli/pytest_commands/fill.py @@ -9,22 +9,6 @@ from .common import common_click_options, handle_help_flags -@click.command( - context_settings={ - "ignore_unknown_options": True, - } -) -def tf() -> None: - """`tf` command, deprecated as of 2023-06.""" - print( - "The `tf` command-line tool has been superseded by `fill`. Try:\n\n" - "fill --help\n\n" - "or see the online docs:\n" - "https://ethereum.github.io/execution-spec-tests/getting_started/executing_tests_command_line/" - ) - sys.exit(1) - - def handle_stdout_flags(args: List[str]) -> List[str]: """ If the user has requested to write to stdout, add pytest arguments in order diff --git a/src/cli/tests/test_pytest_fill_command.py b/src/cli/tests/test_pytest_fill_command.py index 3f633332fe..d165c7a8a8 100644 --- a/src/cli/tests/test_pytest_fill_command.py +++ b/src/cli/tests/test_pytest_fill_command.py @@ -44,15 +44,6 @@ def test_fill_with_invalid_option(runner): assert "unrecognized arguments" in result.output -def test_tf_deprecation(runner): - """Test the deprecation message of the `tf` command.""" - from ..pytest_commands.fill import tf - - result = runner.invoke(tf, []) - assert result.exit_code == 1 - assert "The `tf` command-line tool has been superseded by `fill`" in result.output - - @pytest.mark.run_in_serial class TestHtmlReportFlags: """Test html report generation and output options.""" diff --git a/whitelist.txt b/whitelist.txt index 5d20e56abd..7d53b42ebb 100644 --- a/whitelist.txt +++ b/whitelist.txt @@ -416,7 +416,6 @@ TestContractCreationGasUsage TestMultipleWithdrawalsSameAddress testrun textwrap -tf ThreeHrSleep time15k timestamp @@ -548,7 +547,6 @@ subcommand subcontainer substring substrings -tf teardown tempdir testdir From ba01354b2d31f3bb8d776fd44ffc84b39a338702 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Wed, 30 Oct 2024 15:59:12 +0700 Subject: [PATCH 6/9] chore(ruff|noqa): changes to `src/config`. --- src/config/__init__.py | 10 ++++++---- src/config/app.py | 4 +--- src/config/docs.py | 4 +--- src/config/env.py | 11 ++++++++--- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/config/__init__.py b/src/config/__init__.py index 5a3b0febfd..42ae2eacbb 100644 --- a/src/config/__init__.py +++ b/src/config/__init__.py @@ -1,5 +1,5 @@ """ -This module initializes the config package. +Initializes the config package. The config package is responsible for loading and managing application-wide environment configurations, making them accessible throughout the application. @@ -7,6 +7,8 @@ # This import is done to facilitate cleaner imports in the project # `from config import AppConfig` instead of `from config.app import AppConfig` -from .app import AppConfig # noqa: 401 -from .docs import DocsConfig # noqa: 401 -from .env import EnvConfig # noqa: 401 +from .app import AppConfig +from .docs import DocsConfig +from .env import EnvConfig + +__all__ = ["AppConfig", "DocsConfig", "EnvConfig"] diff --git a/src/config/app.py b/src/config/app.py index c8bd8591bd..72c031da75 100644 --- a/src/config/app.py +++ b/src/config/app.py @@ -9,9 +9,7 @@ class AppConfig(BaseModel): - """ - A class for accessing documentation-related configurations. - """ + """A class for accessing documentation-related configurations.""" version: str = "3.0.0" """The version of the application framework.""" diff --git a/src/config/docs.py b/src/config/docs.py index d1896f3684..f70f4b87ab 100644 --- a/src/config/docs.py +++ b/src/config/docs.py @@ -9,9 +9,7 @@ class DocsConfig(BaseModel): - """ - A class for accessing documentation-related configurations. - """ + """A class for accessing documentation-related configurations.""" TARGET_FORK: str = "Prague" """The target fork for the documentation.""" diff --git a/src/config/env.py b/src/config/env.py index b1d1331afb..d4d24ba7fe 100644 --- a/src/config/env.py +++ b/src/config/env.py @@ -36,6 +36,7 @@ class RemoteNode(BaseModel): - name (str): The name of the remote node. - node_url (HttpUrl): The URL for the remote node, validated as a proper URL. - rpc_headers (Dict[str, str]): A dictionary of optional RPC headers, defaults to empty dict. + """ name: str = "mainnet_archive" @@ -49,19 +50,22 @@ class Config(BaseModel): Attributes: - remote_nodes (List[RemoteNode]): A list of remote node configurations. + """ remote_nodes: List[RemoteNode] = [RemoteNode()] class EnvConfig(Config): - """Loads and validates environment configuration from `env.yaml`. + """ + Loads and validates environment configuration from `env.yaml`. This is a wrapper class for the Config model. It reads a config file from disk into a Config model and then exposes it. """ def __init__(self): + """Init for the EnvConfig class.""" if not ENV_PATH.exists(): raise FileNotFoundError( f"The configuration file '{ENV_PATH}' does not exist. " @@ -74,15 +78,16 @@ def __init__(self): # Validate and parse with Pydantic super().__init__(**config_data) except ValidationError as e: - raise ValueError(f"Invalid configuration: {e}") + raise ValueError(f"Invalid configuration: {e}") from e def create_default_config(): """ - Creates a default configuration file `env.yaml` from the Jinja2 template. + Create a default configuration file `env.yaml` from the Jinja2 template. Raises: IOError: If there is an error writing to the `env.yaml` file. + """ # Check if the config file already exists if ENV_PATH.exists(): From 5e61b48845327b5240e68f362d82f1117f8b0909 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Wed, 30 Oct 2024 16:28:59 +0700 Subject: [PATCH 7/9] chore(ruff): changes to `src/ethereum_clis`. --- src/cli/eofwrap.py | 4 +- src/ethereum_clis/__init__.py | 10 ++- src/ethereum_clis/clis/__init__.py | 4 +- src/ethereum_clis/clis/besu.py | 34 ++++----- src/ethereum_clis/clis/ethereumjs.py | 15 ++-- src/ethereum_clis/clis/evmone.py | 15 ++-- src/ethereum_clis/clis/execution_specs.py | 20 +++--- src/ethereum_clis/clis/geth.py | 39 +++++----- src/ethereum_clis/clis/nimbus.py | 25 +++---- src/ethereum_clis/ethereum_cli.py | 41 ++++------- src/ethereum_clis/file_utils.py | 12 +--- src/ethereum_clis/tests/test_evaluate.py | 8 ++- .../tests/test_transition_tool.py | 18 ++--- src/ethereum_clis/transition_tool.py | 71 ++++++------------- src/ethereum_clis/types.py | 32 +++------ 15 files changed, 123 insertions(+), 225 deletions(-) diff --git a/src/cli/eofwrap.py b/src/cli/eofwrap.py index 8aeefb20ff..8dd75a3884 100644 --- a/src/cli/eofwrap.py +++ b/src/cli/eofwrap.py @@ -20,7 +20,7 @@ import click from cli.evm_bytes import OpcodeWithOperands, process_evm_bytes -from ethereum_clis import CLINotFoundInPath +from ethereum_clis import CLINotFoundInPathError from ethereum_clis.clis.evmone import EvmOneTransitionTool from ethereum_test_base_types.base_types import Bytes from ethereum_test_base_types.conversions import to_hex @@ -50,7 +50,7 @@ def eof_wrap(input_path: str, output_dir: str, traces: bool): try: EvmOneTransitionTool() - except CLINotFoundInPath: + except CLINotFoundInPathError: print(f"Error: {EvmOneTransitionTool.default_binary} must be in the PATH.") sys.exit(1) except Exception as e: diff --git a/src/ethereum_clis/__init__.py b/src/ethereum_clis/__init__.py index 1e2acd4368..a8d3c0ef65 100644 --- a/src/ethereum_clis/__init__.py +++ b/src/ethereum_clis/__init__.py @@ -1,6 +1,4 @@ -""" -Library of Python wrappers for the different implementations of transition tools. -""" +"""Library of Python wrappers for the different implementations of transition tools.""" from .clis.besu import BesuTransitionTool from .clis.ethereumjs import EthereumJSTransitionTool @@ -8,7 +6,7 @@ from .clis.execution_specs import ExecutionSpecsTransitionTool from .clis.geth import GethTransitionTool from .clis.nimbus import NimbusTransitionTool -from .ethereum_cli import CLINotFoundInPath, UnknownCLI +from .ethereum_cli import CLINotFoundInPathError, UnknownCLIError from .transition_tool import TransitionTool from .types import Result, TransitionToolOutput @@ -25,6 +23,6 @@ "Result", "TransitionTool", "TransitionToolOutput", - "CLINotFoundInPath", - "UnknownCLI", + "CLINotFoundInPathError", + "UnknownCLIError", ) diff --git a/src/ethereum_clis/clis/__init__.py b/src/ethereum_clis/clis/__init__.py index b93d2547b1..73b0c6b452 100644 --- a/src/ethereum_clis/clis/__init__.py +++ b/src/ethereum_clis/clis/__init__.py @@ -1,3 +1 @@ -""" -Package containing concrete implementations of Ethereum CL interfaces. -""" +"""Package containing concrete implementations of Ethereum CL interfaces.""" diff --git a/src/ethereum_clis/clis/besu.py b/src/ethereum_clis/clis/besu.py index 708d5b949f..20718626f5 100644 --- a/src/ethereum_clis/clis/besu.py +++ b/src/ethereum_clis/clis/besu.py @@ -1,6 +1,4 @@ -""" -Hyperledger Besu Transition tool frontend. -""" +"""Hyperledger Besu Transition tool frontend.""" import json import os @@ -28,9 +26,7 @@ class BesuTransitionTool(TransitionTool): - """ - Besu EvmTool Transition tool frontend wrapper class. - """ + """Besu EvmTool Transition tool frontend wrapper class.""" default_binary = Path("evm") detect_binary_pattern = compile(r"^Hyperledger Besu evm .*$") @@ -47,20 +43,24 @@ def __init__( binary: Optional[Path] = None, trace: bool = False, ): + """Initialize the BesuTransitionTool class.""" super().__init__(exception_mapper=BesuExceptionMapper(), binary=binary, trace=trace) args = [str(self.binary), "t8n", "--help"] try: result = subprocess.run(args, capture_output=True, text=True) except subprocess.CalledProcessError as e: - raise Exception("evm process unexpectedly returned a non-zero status code: " f"{e}.") + raise Exception( + "evm process unexpectedly returned a non-zero status code: " f"{e}." + ) from e except Exception as e: - raise Exception(f"Unexpected exception calling evm tool: {e}.") + raise Exception(f"Unexpected exception calling evm tool: {e}.") from e self.help_string = result.stdout self.besu_trace_dir = tempfile.TemporaryDirectory() if self.trace else None def start_server(self): """ - Starts the t8n-server process, extracts the port, and leaves it running for future re-use. + Start the t8n-server process, extract the port, and leave it running + for future re-use. """ args = [ str(self.binary), @@ -89,9 +89,7 @@ def start_server(self): break def shutdown(self): - """ - Stops the t8n-server process if it was started - """ + """Stop the t8n-server process if it was started.""" if self.process: self.process.kill() if self.besu_trace_dir: @@ -109,9 +107,7 @@ def evaluate( eips: Optional[List[int]] = None, debug_output_path: str = "", ) -> TransitionToolOutput: - """ - Executes `evm t8n` with the specified arguments. - """ + """Execute `evm t8n` with the specified arguments.""" if not self.process: self.start_server() @@ -203,16 +199,12 @@ def evaluate( return output def is_fork_supported(self, fork: Fork) -> bool: - """ - Returns True if the fork is supported by the tool - """ + """Return True if the fork is supported by the tool.""" return fork.transition_tool_name() in self.help_string class BesuExceptionMapper(ExceptionMapper): - """ - Translate between EEST exceptions and error strings returned by nimbus. - """ + """Translate between EEST exceptions and error strings returned by Besu.""" @property def _mapping_data(self): diff --git a/src/ethereum_clis/clis/ethereumjs.py b/src/ethereum_clis/clis/ethereumjs.py index cb461e7c16..f5b4d99d7f 100644 --- a/src/ethereum_clis/clis/ethereumjs.py +++ b/src/ethereum_clis/clis/ethereumjs.py @@ -1,6 +1,4 @@ -""" -EthereumJS Transition tool interface. -""" +"""EthereumJS Transition tool interface.""" from pathlib import Path from re import compile @@ -18,9 +16,7 @@ class EthereumJSTransitionTool(TransitionTool): - """ - EthereumJS Transition tool interface wrapper class. - """ + """EthereumJS Transition tool interface wrapper class.""" default_binary = Path("ethereumjs-t8ntool.sh") detect_binary_pattern = compile(r"^ethereumjs t8n\b") @@ -37,20 +33,19 @@ def __init__( binary: Optional[Path] = None, trace: bool = False, ): + """Initialize the EthereumJS Transition tool interface.""" super().__init__(exception_mapper=EthereumJSExceptionMapper(), binary=binary, trace=trace) def is_fork_supported(self, fork: Fork) -> bool: """ - Returns True if the fork is supported by the tool. + Return True if the fork is supported by the tool. Currently, EthereumJS-t8n provides no way to determine supported forks. """ return True class EthereumJSExceptionMapper(ExceptionMapper): - """ - Translate between EEST exceptions and error strings returned by ethereum-js. - """ + """Translate between EEST exceptions and error strings returned by EthereumJS.""" @property def _mapping_data(self): diff --git a/src/ethereum_clis/clis/evmone.py b/src/ethereum_clis/clis/evmone.py index 542eac83de..f48908543c 100644 --- a/src/ethereum_clis/clis/evmone.py +++ b/src/ethereum_clis/clis/evmone.py @@ -1,6 +1,4 @@ -""" -Evmone Transition tool interface. -""" +"""Evmone Transition tool interface.""" from pathlib import Path from re import compile @@ -18,9 +16,7 @@ class EvmOneTransitionTool(TransitionTool): - """ - Evmone `evmone-t8n` Transition tool interface wrapper class. - """ + """Evmone `evmone-t8n` Transition tool interface wrapper class.""" default_binary = Path("evmone-t8n") detect_binary_pattern = compile(r"^evmone-t8n\b") @@ -36,20 +32,19 @@ def __init__( binary: Optional[Path] = None, trace: bool = False, ): + """Initialize the Evmone Transition tool interface.""" super().__init__(exception_mapper=EvmoneExceptionMapper(), binary=binary, trace=trace) def is_fork_supported(self, fork: Fork) -> bool: """ - Returns True if the fork is supported by the tool. + Return True if the fork is supported by the tool. Currently, evmone-t8n provides no way to determine supported forks. """ return True class EvmoneExceptionMapper(ExceptionMapper): - """ - Translate between EEST exceptions and error strings returned by evmone. - """ + """Translate between EEST exceptions and error strings returned by Evmone.""" @property def _mapping_data(self): diff --git a/src/ethereum_clis/clis/execution_specs.py b/src/ethereum_clis/clis/execution_specs.py index 85ff426d64..5f60d8a601 100644 --- a/src/ethereum_clis/clis/execution_specs.py +++ b/src/ethereum_clis/clis/execution_specs.py @@ -52,6 +52,7 @@ def __init__( binary: Optional[Path] = None, trace: bool = False, ): + """Initialize the Ethereum Specs EVM Resolver Transition Tool interface.""" super().__init__( exception_mapper=ExecutionSpecsExceptionMapper(), binary=binary, trace=trace ) @@ -62,14 +63,17 @@ def __init__( raise Exception( "ethereum-spec-evm-resolver process unexpectedly returned a non-zero status code: " f"{e}." - ) + ) from e except Exception as e: - raise Exception(f"Unexpected exception calling ethereum-spec-evm-resolver: {e}.") + raise Exception( + f"Unexpected exception calling ethereum-spec-evm-resolver: {e}." + ) from e self.help_string = result.stdout def start_server(self): """ - Starts the t8n-server process, extracts the port, and leaves it running for future re-use. + Start the t8n-server process, extract the port, and leave it running + for future re-use. """ self.server_dir = TemporaryDirectory() self.server_file_path = Path(self.server_dir.name) / "t8n.sock" @@ -92,9 +96,7 @@ def start_server(self): time.sleep(0) # yield to other processes def shutdown(self): - """ - Stops the t8n-server process if it was started. - """ + """Stop the t8n-server process if it was started.""" if self.process: self.process.terminate() if self.server_dir: @@ -103,7 +105,7 @@ def shutdown(self): def is_fork_supported(self, fork: Fork) -> bool: """ - Returns True if the fork is supported by the tool. + Return True if the fork is supported by the tool. If the fork is a transition fork, we want to check the fork it transitions to. @@ -113,9 +115,7 @@ def is_fork_supported(self, fork: Fork) -> bool: class ExecutionSpecsExceptionMapper(ExceptionMapper): - """ - Translate between EEST exceptions and error strings returned by execution specs t8n. - """ + """Translate between EEST exceptions and error strings returned by ExecutionSpecs.""" @property def _mapping_data(self): diff --git a/src/ethereum_clis/clis/geth.py b/src/ethereum_clis/clis/geth.py index 993690affa..3f42dc0afd 100644 --- a/src/ethereum_clis/clis/geth.py +++ b/src/ethereum_clis/clis/geth.py @@ -1,6 +1,4 @@ -""" -Go-ethereum Transition tool interface. -""" +"""Go-ethereum Transition tool interface.""" import json import shutil @@ -23,9 +21,7 @@ class GethTransitionTool(TransitionTool): - """ - Go-ethereum `evm` Transition tool interface wrapper class. - """ + """Go-ethereum `evm` Transition tool interface wrapper class.""" default_binary = Path("evm") detect_binary_pattern = compile(r"^evm(.exe)? version\b") @@ -43,44 +39,45 @@ def __init__( binary: Optional[Path] = None, trace: bool = False, ): + """Initialize the Go-ethereum Transition tool interface.""" super().__init__(exception_mapper=GethExceptionMapper(), binary=binary, trace=trace) args = [str(self.binary), str(self.t8n_subcommand), "--help"] try: result = subprocess.run(args, capture_output=True, text=True) except subprocess.CalledProcessError as e: - raise Exception("evm process unexpectedly returned a non-zero status code: " f"{e}.") + raise Exception( + "evm process unexpectedly returned a non-zero status code: " f"{e}." + ) from e except Exception as e: - raise Exception(f"Unexpected exception calling evm tool: {e}.") + raise Exception(f"Unexpected exception calling evm tool: {e}.") from e self.help_string = result.stdout def is_fork_supported(self, fork: Fork) -> bool: """ - Returns True if the fork is supported by the tool. + Return True if the fork is supported by the tool. If the fork is a transition fork, we want to check the fork it transitions to. """ return fork.transition_tool_name() in self.help_string def get_blocktest_help(self) -> str: - """ - Return the help string for the blocktest subcommand. - """ + """Return the help string for the blocktest subcommand.""" args = [str(self.binary), "blocktest", "--help"] try: result = subprocess.run(args, capture_output=True, text=True) except subprocess.CalledProcessError as e: - raise Exception("evm process unexpectedly returned a non-zero status code: " f"{e}.") + raise Exception( + "evm process unexpectedly returned a non-zero status code: " f"{e}." + ) from e except Exception as e: - raise Exception(f"Unexpected exception calling evm tool: {e}.") + raise Exception(f"Unexpected exception calling evm tool: {e}.") from e return result.stdout def is_verifiable( self, fixture_format: FixtureFormat, ) -> bool: - """ - Returns whether the fixture format is verifiable by this Geth's evm tool. - """ + """Return whether the fixture format is verifiable by this Geth's evm tool.""" return fixture_format in {StateFixture, BlockchainFixture} def verify_fixture( @@ -90,9 +87,7 @@ def verify_fixture( fixture_name: Optional[str] = None, debug_output_path: Optional[Path] = None, ): - """ - Executes `evm [state|block]test` to verify the fixture at `fixture_path`. - """ + """Execute `evm [state|block]test` to verify the fixture at `fixture_path`.""" command: list[str] = [str(self.binary)] if debug_output_path: @@ -156,9 +151,7 @@ def verify_fixture( class GethExceptionMapper(ExceptionMapper): - """ - Translate between EEST exceptions and error strings returned by geth. - """ + """Translate between EEST exceptions and error strings returned by Geth.""" @property def _mapping_data(self): diff --git a/src/ethereum_clis/clis/nimbus.py b/src/ethereum_clis/clis/nimbus.py index aae58d9523..1593e37f29 100644 --- a/src/ethereum_clis/clis/nimbus.py +++ b/src/ethereum_clis/clis/nimbus.py @@ -1,6 +1,4 @@ -""" -Go-ethereum Transition tool interface. -""" +"""Nimbus Transition tool interface.""" import re import subprocess @@ -20,9 +18,7 @@ class NimbusTransitionTool(TransitionTool): - """ - Nimbus `evm` Transition tool interface wrapper class. - """ + """Nimbus `evm` Transition tool interface wrapper class.""" default_binary = Path("t8n") detect_binary_pattern = compile(r"^Nimbus-t8n\b") @@ -38,20 +34,21 @@ def __init__( binary: Optional[Path] = None, trace: bool = False, ): + """Initialize the Nimbus Transition tool interface.""" super().__init__(exception_mapper=NimbusExceptionMapper(), binary=binary, trace=trace) args = [str(self.binary), "--help"] try: result = subprocess.run(args, capture_output=True, text=True) except subprocess.CalledProcessError as e: - raise Exception("evm process unexpectedly returned a non-zero status code: " f"{e}.") + raise Exception( + "evm process unexpectedly returned a non-zero status code: " f"{e}." + ) from e except Exception as e: - raise Exception(f"Unexpected exception calling evm tool: {e}.") + raise Exception(f"Unexpected exception calling evm tool: {e}.") from e self.help_string = result.stdout def version(self) -> str: - """ - Gets `evm` binary version. - """ + """Get `evm` binary version.""" if self.cached_version is None: self.cached_version = re.sub(r"\x1b\[0m", "", super().version()).strip() @@ -59,7 +56,7 @@ def version(self) -> str: def is_fork_supported(self, fork: Fork) -> bool: """ - Returns True if the fork is supported by the tool. + Return True if the fork is supported by the tool. If the fork is a transition fork, we want to check the fork it transitions to. """ @@ -67,9 +64,7 @@ def is_fork_supported(self, fork: Fork) -> bool: class NimbusExceptionMapper(ExceptionMapper): - """ - Translate between EEST exceptions and error strings returned by nimbus. - """ + """Translate between EEST exceptions and error strings returned by Nimbus.""" @property def _mapping_data(self): diff --git a/src/ethereum_clis/ethereum_cli.py b/src/ethereum_clis/ethereum_cli.py index 350761bd37..a79ca65070 100644 --- a/src/ethereum_clis/ethereum_cli.py +++ b/src/ethereum_clis/ethereum_cli.py @@ -1,6 +1,4 @@ -""" -Abstract base class to help create Python interfaces to Ethereum CLIs. -""" +"""Abstract base class to help create Python interfaces to Ethereum CLIs.""" import os import shutil @@ -12,16 +10,17 @@ from typing import Any, List, Optional, Type -class UnknownCLI(Exception): - """Exception raised if an unknown CLI is encountered""" +class UnknownCLIError(Exception): + """Exception raised if an unknown CLI is encountered.""" pass -class CLINotFoundInPath(Exception): - """Exception raised if the specified CLI binary is not found in the path""" +class CLINotFoundInPathError(Exception): + """Exception raised if the specified CLI binary is not found in the path.""" def __init__(self, message="The CLI binary was not found in the path", binary=None): + """Initialize the exception.""" if binary: message = f"{message} ({binary})" super().__init__(message) @@ -47,9 +46,7 @@ class EthereumCLI(ABC): @abstractmethod def __init__(self, *, binary: Optional[Path] = None, trace: bool = False): - """ - Abstract initialization method that all subclasses must implement. - """ + """Abstract initialization method that all subclasses must implement.""" if binary is None: binary = self.default_binary else: @@ -59,28 +56,24 @@ def __init__(self, *, binary: Optional[Path] = None, trace: bool = False): binary = resolved_path binary = shutil.which(binary) # type: ignore if not binary: - raise CLINotFoundInPath(binary=binary) + raise CLINotFoundInPathError(binary=binary) self.binary = Path(binary) self.trace = trace @classmethod def register_tool(cls, tool_subclass: Type[Any]): - """ - Registers a given subclass as tool option. - """ + """Register a given subclass as tool option.""" cls.registered_tools.append(tool_subclass) # raise NotImplementedError @classmethod def set_default_tool(cls, tool_subclass: Type[Any]): - """ - Registers the default tool subclass. - """ + """Register the default tool subclass.""" cls.default_tool = tool_subclass @classmethod def from_binary_path(cls, *, binary_path: Optional[Path], **kwargs) -> Any: """ - Instantiates the appropriate CLI subclass derived from the CLI's `binary_path`. + Instantiate the appropriate CLI subclass derived from the CLI's `binary_path`. This method will attempt to detect the CLI version and instantiate the appropriate subclass based on the version output by running hte CLI with the version flag. @@ -96,7 +89,7 @@ def from_binary_path(cls, *, binary_path: Optional[Path], **kwargs) -> Any: binary = shutil.which(binary_path) # type: ignore if not binary: - raise CLINotFoundInPath(binary=binary) + raise CLINotFoundInPathError(binary=binary) binary = Path(binary) @@ -126,21 +119,17 @@ def from_binary_path(cls, *, binary_path: Optional[Path], **kwargs) -> Any: if subclass.detect_binary(binary_output): return subclass(binary=binary, **kwargs) - raise UnknownCLI(f"Unknown CLI: {binary_path}") + raise UnknownCLIError(f"Unknown CLI: {binary_path}") @classmethod def detect_binary(cls, binary_output: str) -> bool: - """ - Returns True if a CLI's `binary_output` matches the class's expected output. - """ + """Return True if a CLI's `binary_output` matches the class's expected output.""" assert cls.detect_binary_pattern is not None return cls.detect_binary_pattern.match(binary_output) is not None def version(self) -> str: - """ - Returns the name and version of the CLI as reported by the CLI's version flag. - """ + """Return the name and version of the CLI as reported by the CLI's version flag.""" if self.cached_version is None: result = subprocess.run( [str(self.binary), self.version_flag], diff --git a/src/ethereum_clis/file_utils.py b/src/ethereum_clis/file_utils.py index d7f6c903a6..14619d812f 100644 --- a/src/ethereum_clis/file_utils.py +++ b/src/ethereum_clis/file_utils.py @@ -1,6 +1,4 @@ -""" -Methods to work with the filesystem and json -""" +"""Methods to work with the filesystem and json.""" import os import stat @@ -11,17 +9,13 @@ def write_json_file(data: Dict[str, Any], file_path: str) -> None: - """ - Write a JSON file to the given path. - """ + """Write a JSON file to the given path.""" with open(file_path, "w") as f: dump(data, f, ensure_ascii=False, indent=4) def dump_files_to_directory(output_path: str, files: Dict[str, Any]) -> None: - """ - Dump the files to the given directory. - """ + """Dump the files to the given directory.""" os.makedirs(output_path, exist_ok=True) for file_rel_path_flags, file_contents in files.items(): file_rel_path, flags = ( diff --git a/src/ethereum_clis/tests/test_evaluate.py b/src/ethereum_clis/tests/test_evaluate.py index b1affe73f6..07414773ab 100644 --- a/src/ethereum_clis/tests/test_evaluate.py +++ b/src/ethereum_clis/tests/test_evaluate.py @@ -89,14 +89,16 @@ def test_calc_state_root( # noqa: D103 fork: Fork, alloc: Dict, base_fee: int | None, - hash: bytes, + expected_hash: bytes, ) -> None: + """Test calculation of the state root against expected hash.""" + class TestEnv: base_fee: int | None env = TestEnv() env.base_fee = base_fee - assert Alloc(alloc).state_root().startswith(hash) + assert Alloc(alloc).state_root().startswith(expected_hash) @pytest.mark.parametrize("evm_tool", [ExecutionSpecsTransitionTool]) @@ -182,7 +184,7 @@ def test_evm_t8n( # noqa: D103 del expected.get("result")["receipts"][i]["logsBloom"] t8n_result = to_json(t8n_output.result) - for i, rejected in enumerate(expected.get("result")["rejected"]): + for i, _ in enumerate(expected.get("result")["rejected"]): del expected.get("result")["rejected"][i]["error"] del t8n_result["rejected"][i]["error"] diff --git a/src/ethereum_clis/tests/test_transition_tool.py b/src/ethereum_clis/tests/test_transition_tool.py index d4d0f92f84..40884de027 100644 --- a/src/ethereum_clis/tests/test_transition_tool.py +++ b/src/ethereum_clis/tests/test_transition_tool.py @@ -1,6 +1,4 @@ -""" -Test the transition tool and subclasses. -""" +"""Test the transition tool and subclasses.""" import shutil import subprocess @@ -10,7 +8,7 @@ import pytest from ethereum_clis import ( - CLINotFoundInPath, + CLINotFoundInPathError, EvmOneTransitionTool, ExecutionSpecsTransitionTool, GethTransitionTool, @@ -20,9 +18,7 @@ def test_default_tool(): - """ - Tests that the default t8n tool is set. - """ + """Tests that the default t8n tool is set.""" assert TransitionTool.default_tool is ExecutionSpecsTransitionTool @@ -62,9 +58,7 @@ def test_from_binary( read_result: str, expected_class: Type[TransitionTool], ): - """ - Test that `from_binary` instantiates the correct subclass. - """ + """Test that `from_binary` instantiates the correct subclass.""" class MockCompletedProcess: def __init__(self, stdout): @@ -86,8 +80,8 @@ def mock_run(args, **kwargs): def test_unknown_binary_path(): """ - Test that `from_binary_path` raises `UnknownCLI` for unknown + Test that `from_binary_path` raises `UnknownCLIError` for unknown binary paths. """ - with pytest.raises(CLINotFoundInPath): + with pytest.raises(CLINotFoundInPathError): TransitionTool.from_binary_path(binary_path=Path("unknown_binary_path")) diff --git a/src/ethereum_clis/transition_tool.py b/src/ethereum_clis/transition_tool.py index fbe8c186e5..7656c09e84 100644 --- a/src/ethereum_clis/transition_tool.py +++ b/src/ethereum_clis/transition_tool.py @@ -1,6 +1,4 @@ -""" -Transition tool abstract class. -""" +"""Transition tool abstract class.""" import json import os @@ -56,56 +54,43 @@ def __init__( binary: Optional[Path] = None, trace: bool = False, ): - """ - Abstract initialization method that all subclasses must implement. - """ + """Abstract initialization method that all subclasses must implement.""" self.exception_mapper = exception_mapper super().__init__(binary=binary) self.trace = trace def __init_subclass__(cls): - """ - Registers all subclasses of TransitionTool as possible tools. - """ + """Register all subclasses of TransitionTool as possible tools.""" TransitionTool.register_tool(cls) @abstractmethod def is_fork_supported(self, fork: Fork) -> bool: - """ - Returns True if the fork is supported by the tool - """ + """Return True if the fork is supported by the tool.""" pass def start_server(self): """ - Starts the t8n-server process, extracts the port, and leaves it running for future re-use. + Start the t8n-server process, extract the port, and leave it running + for future re-use. """ pass def shutdown(self): - """ - Perform any cleanup tasks related to the tested tool. - """ + """Perform any cleanup tasks related to the tested tool.""" pass def reset_traces(self): - """ - Resets the internal trace storage for a new test to begin - """ + """Reset the internal trace storage for a new test to begin.""" self.traces = None def append_traces(self, new_traces: List[List[Dict]]): - """ - Appends a list of traces of a state transition to the current list - """ + """Append a list of traces of a state transition to the current list.""" if self.traces is None: self.traces = [] self.traces.append(new_traces) def get_traces(self) -> List[List[List[Dict]]] | None: - """ - Returns the accumulated traces - """ + """Return the accumulated traces.""" return self.traces def collect_traces( @@ -114,9 +99,7 @@ def collect_traces( temp_dir: tempfile.TemporaryDirectory, debug_output_path: str = "", ) -> None: - """ - Collect the traces from the t8n tool output and store them in the traces list. - """ + """Collect the traces from the t8n tool output and store them in the traces list.""" traces: List[List[Dict]] = [] for i, r in enumerate(receipts): trace_file_name = f"trace-{i}-{r.transaction_hash}.jsonl" @@ -134,9 +117,7 @@ def collect_traces( @dataclass class TransitionToolData: - """ - Transition tool files and data to pass between methods - """ + """Transition tool files and data to pass between methods.""" alloc: Alloc txs: List[Transaction] @@ -146,9 +127,7 @@ class TransitionToolData: reward: int = field(default=0) def to_input(self) -> TransitionToolInput: - """ - Convert the data to a TransactionToolInput object - """ + """Convert the data to a TransactionToolInput object.""" return TransitionToolInput( alloc=self.alloc, txs=self.txs, @@ -161,9 +140,7 @@ def _evaluate_filesystem( t8n_data: TransitionToolData, debug_output_path: str = "", ) -> TransitionToolOutput: - """ - Executes a transition tool using the filesystem for its inputs and outputs. - """ + """Execute a transition tool using the filesystem for its inputs and outputs.""" temp_dir = tempfile.TemporaryDirectory() os.mkdir(os.path.join(temp_dir.name, "input")) os.mkdir(os.path.join(temp_dir.name, "output")) @@ -274,9 +251,7 @@ def _evaluate_server( t8n_data: TransitionToolData, debug_output_path: str = "", ) -> TransitionToolOutput: - """ - Executes the transition tool sending inputs and outputs via a server. - """ + """Execute the transition tool sending inputs and outputs via a server.""" input_contents = t8n_data.to_input() input_json = input_contents.model_dump(mode="json", **model_dump_config) post_data = { @@ -340,9 +315,7 @@ def _evaluate_stream( t8n_data: TransitionToolData, debug_output_path: str = "", ) -> TransitionToolOutput: - """ - Executes a transition tool using stdin and stdout for its inputs and outputs. - """ + """Execute a transition tool using stdin and stdout for its inputs and outputs.""" temp_dir = tempfile.TemporaryDirectory() args = self.construct_args_stream(t8n_data, temp_dir) @@ -381,9 +354,7 @@ def _evaluate_stream( def construct_args_stream( self, t8n_data: TransitionToolData, temp_dir: tempfile.TemporaryDirectory ) -> List[str]: - """ - Construct arguments for t8n interaction via streams - """ + """Construct arguments for t8n interaction via streams.""" command: list[str] = [str(self.binary)] if self.t8n_subcommand: command.append(self.t8n_subcommand) @@ -413,9 +384,7 @@ def dump_debug_stream( args: List[str], result: subprocess.CompletedProcess, ): - """ - Export debug files if requested when interacting with t8n via streams - """ + """Export debug files if requested when interacting with t8n via streams.""" if not debug_output_path: return @@ -461,7 +430,7 @@ def evaluate( debug_output_path: str = "", ) -> TransitionToolOutput: """ - Executes the relevant evaluate method as required by the `t8n` tool. + Execute the relevant evaluate method as required by the `t8n` tool. If a client's `t8n` tool varies from the default behavior, this method can be overridden. @@ -505,7 +474,7 @@ def verify_fixture( debug_output_path: Optional[Path] = None, ): """ - Executes `evm [state|block]test` to verify the fixture at `fixture_path`. + Execute `evm [state|block]test` to verify the fixture at `fixture_path`. Currently only implemented by geth's evm. """ diff --git a/src/ethereum_clis/types.py b/src/ethereum_clis/types.py index 51263b1f39..46e62322f8 100644 --- a/src/ethereum_clis/types.py +++ b/src/ethereum_clis/types.py @@ -1,6 +1,4 @@ -""" -Types used in the transition tool interactions. -""" +"""Types used in the transition tool interactions.""" from typing import List @@ -11,9 +9,7 @@ class TransactionLog(CamelModel): - """ - Transaction log - """ + """Transaction log.""" address: Address topics: List[Hash] @@ -27,9 +23,7 @@ class TransactionLog(CamelModel): class SetCodeDelegation(CamelModel): - """ - Set code delegation - """ + """Set code delegation.""" from_address: Address = Field(..., alias="from") nonce: HexNumber @@ -37,9 +31,7 @@ class SetCodeDelegation(CamelModel): class TransactionReceipt(CamelModel): - """ - Transaction receipt - """ + """Transaction receipt.""" transaction_hash: Hash gas_used: HexNumber @@ -58,18 +50,14 @@ class TransactionReceipt(CamelModel): class RejectedTransaction(CamelModel): - """ - Rejected transaction - """ + """Rejected transaction.""" index: HexNumber error: str class Result(CamelModel): - """ - Result of a t8n - """ + """Result of a transition tool output.""" state_root: Hash ommers_hash: Hash | None = Field(None, validation_alias="sha3Uncles") @@ -92,9 +80,7 @@ class Result(CamelModel): class TransitionToolInput(CamelModel): - """ - Transition tool input - """ + """Transition tool input.""" alloc: Alloc txs: List[Transaction] @@ -102,9 +88,7 @@ class TransitionToolInput(CamelModel): class TransitionToolOutput(CamelModel): - """ - Transition tool output - """ + """Transition tool output.""" alloc: Alloc result: Result From 79ee9e144695707d90ef90336a58433f97e24b05 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Wed, 30 Oct 2024 17:32:06 +0700 Subject: [PATCH 8/9] chore(noqa): changes to `src/ethereum_clis`. --- src/ethereum_clis/clis/besu.py | 7 ++++-- ...st_evaluate.py => test_execution_specs.py} | 25 +++++++++++-------- 2 files changed, 20 insertions(+), 12 deletions(-) rename src/ethereum_clis/tests/{test_evaluate.py => test_execution_specs.py} (90%) diff --git a/src/ethereum_clis/clis/besu.py b/src/ethereum_clis/clis/besu.py index 20718626f5..1610941e65 100644 --- a/src/ethereum_clis/clis/besu.py +++ b/src/ethereum_clis/clis/besu.py @@ -145,7 +145,7 @@ def evaluate( PORT=${{1:-3000}} curl http://localhost:${{PORT}}/ -X POST -H "Content-Type: application/json" \\ --data '{indented_post_data_string}' - """ # noqa: E221 + """ ) dump_files_to_directory( debug_output_path, @@ -231,7 +231,10 @@ def _mapping_data(self): ), ExceptionMessage( TransactionException.TYPE_3_TX_PRE_FORK, - "Transaction type BLOB is invalid, accepted transaction types are [EIP1559, ACCESS_LIST, FRONTIER]", # noqa: E501 + ( + "Transaction type BLOB is invalid, accepted transaction types are " + "[EIP1559, ACCESS_LIST, FRONTIER]" + ), ), ExceptionMessage( TransactionException.TYPE_3_TX_INVALID_BLOB_VERSIONED_HASH, diff --git a/src/ethereum_clis/tests/test_evaluate.py b/src/ethereum_clis/tests/test_execution_specs.py similarity index 90% rename from src/ethereum_clis/tests/test_evaluate.py rename to src/ethereum_clis/tests/test_execution_specs.py index 07414773ab..c05f9eff81 100644 --- a/src/ethereum_clis/tests/test_evaluate.py +++ b/src/ethereum_clis/tests/test_execution_specs.py @@ -1,4 +1,6 @@ -import json # noqa: D100 +"""Additional tests for the EELS t8n tool.""" + +import json import os import sysconfig from pathlib import Path @@ -10,7 +12,7 @@ from ethereum_clis import ExecutionSpecsTransitionTool, TransitionTool from ethereum_test_base_types import to_json -from ethereum_test_forks import Berlin, Fork, Istanbul, London +from ethereum_test_forks import Berlin, Istanbul, London from ethereum_test_types import Alloc, Environment, Transaction FIXTURES_ROOT = Path(os.path.join("src", "ethereum_clis", "tests", "fixtures")) @@ -84,9 +86,7 @@ def monkeypatch_path_for_entry_points(monkeypatch): ), ], ) -def test_calc_state_root( # noqa: D103 - t8n: TransitionTool, - fork: Fork, +def test_calc_state_root( alloc: Dict, base_fee: int | None, expected_hash: bytes, @@ -103,7 +103,8 @@ class TestEnv: @pytest.mark.parametrize("evm_tool", [ExecutionSpecsTransitionTool]) @pytest.mark.parametrize("binary_arg", ["no_binary_arg", "path_type", "str_type"]) -def test_evm_tool_binary_arg(evm_tool, binary_arg): # noqa: D103 +def test_evm_tool_binary_arg(evm_tool, binary_arg): + """Test the `evm_tool` binary argument.""" if binary_arg == "no_binary_arg": evm_tool().version() return @@ -124,21 +125,24 @@ def test_evm_tool_binary_arg(evm_tool, binary_arg): # noqa: D103 @pytest.fixture -def alloc(test_dir: str) -> Alloc: # noqa: D103 +def alloc(test_dir: str) -> Alloc: + """Fixture for the `alloc.json` file.""" alloc_path = Path(FIXTURES_ROOT, test_dir, "alloc.json") with open(alloc_path, "r") as f: return Alloc.model_validate_json(f.read()) @pytest.fixture -def txs(test_dir: str) -> List[Transaction]: # noqa: D103 +def txs(test_dir: str) -> List[Transaction]: + """Fixture for the `txs.json` file.""" txs_path = Path(FIXTURES_ROOT, test_dir, "txs.json") with open(txs_path, "r") as f: return transaction_type_adapter.validate_json(f.read()) @pytest.fixture -def env(test_dir: str) -> Environment: # noqa: D103 +def env(test_dir: str) -> Environment: + """Fixture for the `env.json` file.""" env_path = Path(FIXTURES_ROOT, test_dir, "env.json") with open(env_path, "r") as f: return Environment.model_validate_json(f.read()) @@ -146,13 +150,14 @@ def env(test_dir: str) -> Environment: # noqa: D103 @pytest.mark.parametrize("t8n", [ExecutionSpecsTransitionTool()]) @pytest.mark.parametrize("test_dir", os.listdir(path=FIXTURES_ROOT)) -def test_evm_t8n( # noqa: D103 +def test_evm_t8n( t8n: TransitionTool, alloc: Alloc, txs: List[Transaction], env: Environment, test_dir: str, ) -> None: + """Test the `evaluate` method of the `ExecutionSpecsTransitionTool` class.""" expected_path = Path(FIXTURES_ROOT, test_dir, "exp.json") with open(expected_path, "r") as exp: From 9f3e7365bc2a879c5c55228dfc1cc33157efd542 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Wed, 30 Oct 2024 18:09:52 +0700 Subject: [PATCH 9/9] chore(ruff): changes to `src/ethereum_test_base_types`. --- src/ethereum_test_base_types/__init__.py | 4 +- src/ethereum_test_base_types/base_types.py | 231 ++++++------------ .../composite_types.py | 146 +++++------ src/ethereum_test_base_types/constants.py | 5 +- src/ethereum_test_base_types/conversions.py | 128 +++++----- src/ethereum_test_base_types/json.py | 20 +- src/ethereum_test_base_types/pydantic.py | 13 +- .../reference_spec/__init__.py | 5 +- .../reference_spec/git_reference_spec.py | 45 ++-- .../reference_spec/reference_spec.py | 48 +--- .../tests/__init__.py | 4 +- .../tests/test_base_types.py | 12 +- .../tests/test_reference_spec.py | 14 +- src/ethereum_test_specs/tests/test_expect.py | 56 ++--- .../tests/test_post_alloc.py | 6 +- whitelist.txt | 6 + 16 files changed, 281 insertions(+), 462 deletions(-) diff --git a/src/ethereum_test_base_types/__init__.py b/src/ethereum_test_base_types/__init__.py index 8dc5e80395..3a0d8139f9 100644 --- a/src/ethereum_test_base_types/__init__.py +++ b/src/ethereum_test_base_types/__init__.py @@ -1,6 +1,4 @@ -""" -Common definitions and types. -""" +"""Common definitions and types.""" from .base_types import ( Address, diff --git a/src/ethereum_test_base_types/base_types.py b/src/ethereum_test_base_types/base_types.py index 813fef9adc..0f1f099d47 100644 --- a/src/ethereum_test_base_types/base_types.py +++ b/src/ethereum_test_base_types/base_types.py @@ -1,6 +1,4 @@ -""" -Basic type primitives used to define other types. -""" +"""Basic type primitives used to define other types.""" from hashlib import sha256 from typing import Any, ClassVar, SupportsBytes, Type, TypeVar @@ -27,16 +25,15 @@ class ToStringSchema: """ - Type converter to add a simple pydantic schema that correctly parses and serializes the type. + Type converter to add a simple pydantic schema that correctly + parses and serializes the type. """ @staticmethod def __get_pydantic_core_schema__( source_type: Any, handler: GetCoreSchemaHandler ) -> PlainValidatorFunctionSchema: - """ - Calls the class constructor without info and appends the serialization schema. - """ + """Call the class constructor without info and appends the serialization schema.""" return no_info_plain_validator_function( source_type, serialization=to_string_ser_schema(), @@ -44,47 +41,33 @@ def __get_pydantic_core_schema__( class Number(int, ToStringSchema): - """ - Class that helps represent numbers in tests. - """ + """Class that helps represent numbers in tests.""" - def __new__(cls, input: NumberConvertible | N): - """ - Creates a new Number object. - """ - return super(Number, cls).__new__(cls, to_number(input)) + def __new__(cls, input_number: NumberConvertible | N): + """Create a new Number object.""" + return super(Number, cls).__new__(cls, to_number(input_number)) def __str__(self) -> str: - """ - Returns the string representation of the number. - """ + """Return the string representation of the number.""" return str(int(self)) def hex(self) -> str: - """ - Returns the hexadecimal representation of the number. - """ + """Return the hexadecimal representation of the number.""" return hex(self) @classmethod - def or_none(cls: Type[N], input: N | NumberConvertible | None) -> N | None: - """ - Converts the input to a Number while accepting None. - """ - if input is None: - return input - return cls(input) + def or_none(cls: Type[N], input_number: N | NumberConvertible | None) -> N | None: + """Convert the input to a Number while accepting None.""" + if input_number is None: + return input_number + return cls(input_number) class Wei(Number): - """ - Class that helps represent wei that can be parsed from strings - """ + """Class that helps represent wei that can be parsed from strings.""" - def __new__(cls, input: NumberConvertible | N): - """ - Creates a new Number object. - """ + def __new__(cls, input_number: NumberConvertible | N): + """Create a new Number object.""" if isinstance(input, str): words = input.split() multiplier = 1 @@ -100,13 +83,11 @@ def __new__(cls, input: NumberConvertible | N): else: value = float(value_str) return super(Number, cls).__new__(cls, value * multiplier) - return super(Number, cls).__new__(cls, to_number(input)) + return super(Number, cls).__new__(cls, to_number(input_number)) @staticmethod def _get_multiplier(unit: str) -> int: - """ - Returns the multiplier for the given unit of wei, handling synonyms. - """ + """Return the multiplier for the given unit of wei, handling synonyms.""" match unit: case "wei": return 1 @@ -127,26 +108,18 @@ def _get_multiplier(unit: str) -> int: class HexNumber(Number): - """ - Class that helps represent an hexadecimal numbers in tests. - """ + """Class that helps represent an hexadecimal numbers in tests.""" def __str__(self) -> str: - """ - Returns the string representation of the number. - """ + """Return the string representation of the number.""" return self.hex() class ZeroPaddedHexNumber(HexNumber): - """ - Class that helps represent zero padded hexadecimal numbers in tests. - """ + """Class that helps represent zero padded hexadecimal numbers in tests.""" def hex(self) -> str: - """ - Returns the hexadecimal representation of the number. - """ + """Return the hexadecimal representation of the number.""" if self == 0: return "0x00" hex_str = hex(self)[2:] @@ -159,56 +132,40 @@ def hex(self) -> str: class Bytes(bytes, ToStringSchema): - """ - Class that helps represent bytes of variable length in tests. - """ + """Class that helps represent bytes of variable length in tests.""" - def __new__(cls, input: BytesConvertible = b""): - """ - Creates a new Bytes object. - """ - if type(input) is cls: - return input - return super(Bytes, cls).__new__(cls, to_bytes(input)) + def __new__(cls, input_bytes: BytesConvertible = b""): + """Create a new Bytes object.""" + if type(input_bytes) is cls: + return input_bytes + return super(Bytes, cls).__new__(cls, to_bytes(input_bytes)) def __hash__(self) -> int: - """ - Returns the hash of the bytes. - """ + """Return the hash of the bytes.""" return super(Bytes, self).__hash__() def __str__(self) -> str: - """ - Returns the hexadecimal representation of the bytes. - """ + """Return the hexadecimal representation of the bytes.""" return self.hex() def hex(self, *args, **kwargs) -> str: - """ - Returns the hexadecimal representation of the bytes. - """ + """Return the hexadecimal representation of the bytes.""" return "0x" + super().hex(*args, **kwargs) @classmethod - def or_none(cls, input: "Bytes | BytesConvertible | None") -> "Bytes | None": - """ - Converts the input to a Bytes while accepting None. - """ - if input is None: - return input - return cls(input) + def or_none(cls, input_bytes: "Bytes | BytesConvertible | None") -> "Bytes | None": + """Convert the input to a Bytes while accepting None.""" + if input_bytes is None: + return input_bytes + return cls(input_bytes) def keccak256(self) -> "Hash": - """ - Return the keccak256 hash of the opcode byte representation. - """ + """Return the keccak256 hash of the opcode byte representation.""" k = keccak.new(digest_bits=256) return Hash(k.update(bytes(self)).digest()) def sha256(self) -> "Hash": - """ - Return the sha256 hash of the opcode byte representation. - """ + """Return the sha256 hash of the opcode byte representation.""" return Hash(sha256(self).digest()) @@ -228,9 +185,7 @@ class FixedSizeHexNumber(int, ToStringSchema): max_value: ClassVar[int] def __class_getitem__(cls, length: int) -> Type["FixedSizeHexNumber"]: - """ - Creates a new FixedSizeHexNumber class with the given length. - """ + """Create a new FixedSizeHexNumber class with the given length.""" class Sized(cls): # type: ignore byte_length = length @@ -238,11 +193,9 @@ class Sized(cls): # type: ignore return Sized - def __new__(cls, input: NumberConvertible | N): - """ - Creates a new Number object. - """ - i = to_number(input) + def __new__(cls, input_number: NumberConvertible | N): + """Create a new Number object.""" + i = to_number(input_number) if i > cls.max_value: raise ValueError(f"Value {i} is too large for {cls.byte_length} bytes") if i < 0: @@ -252,15 +205,11 @@ def __new__(cls, input: NumberConvertible | N): return super(FixedSizeHexNumber, cls).__new__(cls, i) def __str__(self) -> str: - """ - Returns the string representation of the number. - """ + """Return the string representation of the number.""" return self.hex() def hex(self) -> str: - """ - Returns the hexadecimal representation of the number. - """ + """Return the hexadecimal representation of the number.""" if self == 0: return "0x00" hex_str = hex(self)[2:] @@ -270,9 +219,7 @@ def hex(self) -> str: class HashInt(FixedSizeHexNumber[32]): # type: ignore - """ - Class that helps represent hashes in tests. - """ + """Class that helps represent hashes in tests.""" pass @@ -281,17 +228,13 @@ class HashInt(FixedSizeHexNumber[32]): # type: ignore class FixedSizeBytes(Bytes): - """ - Class that helps represent bytes of fixed length in tests. - """ + """Class that helps represent bytes of fixed length in tests.""" byte_length: ClassVar[int] _sized_: ClassVar[Type["FixedSizeBytes"]] def __class_getitem__(cls, length: int) -> Type["FixedSizeBytes"]: - """ - Creates a new FixedSizeBytes class with the given length. - """ + """Create a new FixedSizeBytes class with the given length.""" class Sized(cls): # type: ignore byte_length = length @@ -299,33 +242,27 @@ class Sized(cls): # type: ignore Sized._sized_ = Sized return Sized - def __new__(cls, input: FixedSizeBytesConvertible | T): - """ - Creates a new FixedSizeBytes object. - """ - if type(input) is cls: - return input - return super(FixedSizeBytes, cls).__new__(cls, to_fixed_size_bytes(input, cls.byte_length)) + def __new__(cls, input_bytes: FixedSizeBytesConvertible | T): + """Create a new FixedSizeBytes object.""" + if type(input_bytes) is cls: + return input_bytes + return super(FixedSizeBytes, cls).__new__( + cls, to_fixed_size_bytes(input_bytes, cls.byte_length) + ) def __hash__(self) -> int: - """ - Returns the hash of the bytes. - """ + """Return the hash of the bytes.""" return super(FixedSizeBytes, self).__hash__() @classmethod - def or_none(cls: Type[T], input: T | FixedSizeBytesConvertible | None) -> T | None: - """ - Converts the input to a Fixed Size Bytes while accepting None. - """ - if input is None: - return input - return cls(input) + def or_none(cls: Type[T], input_bytes: T | FixedSizeBytesConvertible | None) -> T | None: + """Convert the input to a Fixed Size Bytes while accepting None.""" + if input_bytes is None: + return input_bytes + return cls(input_bytes) def __eq__(self, other: object) -> bool: - """ - Compares two FixedSizeBytes objects to be equal. - """ + """Compare two FixedSizeBytes objects to be equal.""" if other is None: return False if not isinstance(other, FixedSizeBytes): @@ -339,66 +276,52 @@ def __eq__(self, other: object) -> bool: return super().__eq__(other) def __ne__(self, other: object) -> bool: - """ - Compares two FixedSizeBytes objects to be not equal. - """ + """Compare two FixedSizeBytes objects to be not equal.""" return not self.__eq__(other) class Address(FixedSizeBytes[20]): # type: ignore - """ - Class that helps represent Ethereum addresses in tests. - """ + """Class that helps represent Ethereum addresses in tests.""" label: str | None = None - def __new__(cls, input: "FixedSizeBytesConvertible | Address", *, label: str | None = None): - """ - Creates a new Address object with an optional label. - """ - instance = super(Address, cls).__new__(cls, input) - if isinstance(input, Address) and label is None: - instance.label = input.label + def __new__( + cls, input_bytes: "FixedSizeBytesConvertible | Address", *, label: str | None = None + ): + """Create a new Address object with an optional label.""" + instance = super(Address, cls).__new__(cls, input_bytes) + if isinstance(input_bytes, Address) and label is None: + instance.label = input_bytes.label else: instance.label = label return instance class Hash(FixedSizeBytes[32]): # type: ignore - """ - Class that helps represent hashes in tests. - """ + """Class that helps represent hashes in tests.""" pass class Bloom(FixedSizeBytes[256]): # type: ignore - """ - Class that helps represent blooms in tests. - """ + """Class that helps represent blooms in tests.""" pass class HeaderNonce(FixedSizeBytes[8]): # type: ignore - """ - Class that helps represent the header nonce in tests. - """ + """Class that helps represent the header nonce in tests.""" pass class BLSPublicKey(FixedSizeBytes[48]): # type: ignore - """ - Class that helps represent BLS public keys in tests. - """ + """Class that helps represent BLS public keys in tests.""" pass class BLSSignature(FixedSizeBytes[96]): # type: ignore - """ - Class that helps represent BLS signatures in tests. - """ + """Class that helps represent BLS signatures in tests.""" pass diff --git a/src/ethereum_test_base_types/composite_types.py b/src/ethereum_test_base_types/composite_types.py index 7627c5b107..b9d8b863a5 100644 --- a/src/ethereum_test_base_types/composite_types.py +++ b/src/ethereum_test_base_types/composite_types.py @@ -1,6 +1,5 @@ -""" -Base composite types for Ethereum test cases. -""" +"""Base composite types for Ethereum test cases.""" + from dataclasses import dataclass from typing import Any, ClassVar, Dict, SupportsBytes, Type, TypeAlias @@ -17,9 +16,7 @@ class Storage(RootModel[Dict[StorageKeyValueType, StorageKeyValueType]]): - """ - Definition of a storage in pre or post state of a test - """ + """Definition of a storage in pre or post state of a test.""" root: Dict[StorageKeyValueType, StorageKeyValueType] = Field(default_factory=dict) @@ -33,23 +30,22 @@ class Storage(RootModel[Dict[StorageKeyValueType, StorageKeyValueType]]): """ @dataclass(kw_only=True) - class InvalidType(Exception): - """ - Invalid type used when describing test's expected storage key or value. - """ + class InvalidTypeError(Exception): + """Invalid type used when describing test's expected storage key or value.""" key_or_value: Any def __init__(self, key_or_value: Any, *args): + """Initialize the exception with the invalid type.""" super().__init__(args) self.key_or_value = key_or_value def __str__(self): - """Print exception string""" + """Print exception string.""" return f"invalid type for key/value: {self.key_or_value}" @dataclass(kw_only=True) - class InvalidValue(Exception): + class InvalidValueError(Exception): """ Invalid value used when describing test's expected storage key or value. @@ -58,31 +54,31 @@ class InvalidValue(Exception): key_or_value: Any def __init__(self, key_or_value: Any, *args): + """Initialize the exception with the invalid value.""" super().__init__(args) self.key_or_value = key_or_value def __str__(self): - """Print exception string""" + """Print exception string.""" return f"invalid value for key/value: {self.key_or_value}" @dataclass(kw_only=True) - class MissingKey(Exception): - """ - Test expected to find a storage key set but key was missing. - """ + class MissingKeyError(Exception): + """Test expected to find a storage key set but key was missing.""" key: int def __init__(self, key: int, *args): + """Initialize the exception with the missing key.""" super().__init__(args) self.key = key def __str__(self): - """Print exception string""" + """Print exception string.""" return "key {0} not found in storage".format(Hash(self.key)) @dataclass(kw_only=True) - class KeyValueMismatch(Exception): + class KeyValueMismatchError(Exception): """ Test expected a certain value in a storage key but value found was different. @@ -94,6 +90,7 @@ class KeyValueMismatch(Exception): got: int def __init__(self, address: Address, key: int, want: int, got: int, *args): + """Initialize the exception with the address, key, wanted and got values.""" super().__init__(args) self.address = address self.key = key @@ -101,7 +98,7 @@ def __init__(self, address: Address, key: int, want: int, got: int, *args): self.got = got def __str__(self): - """Print exception string""" + """Print exception string.""" label_str = "" if self.address.label is not None: label_str = f" ({self.address.label})" @@ -113,13 +110,13 @@ def __str__(self): ) def __contains__(self, key: StorageKeyValueTypeConvertible | StorageKeyValueType) -> bool: - """Checks for an item in the storage""" + """Check for an item in the storage.""" return StorageKeyValueTypeAdapter.validate_python(key) in self.root def __getitem__( self, key: StorageKeyValueTypeConvertible | StorageKeyValueType ) -> StorageKeyValueType: - """Returns an item from the storage""" + """Return an item from the storage.""" return self.root[StorageKeyValueTypeAdapter.validate_python(key)] def __setitem__( @@ -127,65 +124,57 @@ def __setitem__( key: StorageKeyValueTypeConvertible | StorageKeyValueType, value: StorageKeyValueTypeConvertible | StorageKeyValueType, ): # noqa: SC200 - """Sets an item in the storage""" - self.root[ - StorageKeyValueTypeAdapter.validate_python(key) - ] = StorageKeyValueTypeAdapter.validate_python(value) + """Set an item in the storage.""" + self.root[StorageKeyValueTypeAdapter.validate_python(key)] = ( + StorageKeyValueTypeAdapter.validate_python(value) + ) def __delitem__(self, key: StorageKeyValueTypeConvertible | StorageKeyValueType): - """Deletes an item from the storage""" + """Delete an item from the storage.""" del self.root[StorageKeyValueTypeAdapter.validate_python(key)] def __iter__(self): - """Returns an iterator over the storage""" + """Return an iterator over the storage.""" return iter(self.root) def __eq__(self, other) -> bool: - """ - Returns True if both storages are equal. - """ + """Return True if both storages are equal.""" if not isinstance(other, Storage): return False return self.root == other.root def __ne__(self, other) -> bool: - """ - Returns True if both storages are not equal. - """ + """Return True if both storages are not equal.""" if not isinstance(other, Storage): return False return self.root != other.root def __bool__(self) -> bool: - """Returns True if the storage is not empty""" + """Return True if the storage is not empty.""" return any(v for v in self.root.values()) def __add__(self, other: "Storage") -> "Storage": - """ - Returns a new storage that is the sum of two storages. - """ + """Return a new storage that is the sum of two storages.""" return Storage({**self.root, **other.root}) def keys(self) -> set[StorageKeyValueType]: - """Returns the keys of the storage""" + """Return the keys of the storage.""" return set(self.root.keys()) def set_next_slot(self, slot: int) -> "Storage": - """ - Sets the next slot to be used by `store_next`. - """ + """Set the next slot to be used by `store_next`.""" self._current_slot = slot return self def items(self): - """Returns the items of the storage""" + """Return the items of the storage.""" return self.root.items() def store_next( self, value: StorageKeyValueTypeConvertible | StorageKeyValueType | bool ) -> StorageKeyValueType: """ - Stores a value in the storage and returns the key where the value is stored. + Store a value in the storage and returns the key where the value is stored. Increments the key counter so the next time this function is called, the next key is used. @@ -196,14 +185,12 @@ def store_next( return slot def peek_slot(self) -> int: - """ - Peeks the next slot that will be used by `store_next`. - """ + """Peek the next slot that will be used by `store_next`.""" return self._current_slot def contains(self, other: "Storage") -> bool: """ - Returns True if self contains all keys with equal value as + Return True if self contains all keys with equal value as contained by second storage. Used for comparison with test expected post state and alloc returned by the transition tool. @@ -227,22 +214,20 @@ def must_contain(self, address: Address, other: "Storage"): if key not in self: # storage[key]==0 is equal to missing storage if other[key] != 0: - raise Storage.MissingKey(key=key) + raise Storage.MissingKeyError(key=key) elif self[key] != other[key]: - raise Storage.KeyValueMismatch( + raise Storage.KeyValueMismatchError( address=address, key=key, want=self[key], got=other[key] ) def must_be_equal(self, address: Address, other: "Storage | None"): - """ - Succeeds only if "self" is equal to "other" storage. - """ + """Succeed only if "self" is equal to "other" storage.""" # Test keys contained in both storage objects if other is None: other = Storage({}) for key in self.keys() & other.keys(): if self[key] != other[key]: - raise Storage.KeyValueMismatch( + raise Storage.KeyValueMismatchError( address=address, key=key, want=self[key], got=other[key] ) @@ -250,23 +235,25 @@ def must_be_equal(self, address: Address, other: "Storage | None"): for key in self.keys() ^ other.keys(): if key in self: if self[key] != 0: - raise Storage.KeyValueMismatch(address=address, key=key, want=self[key], got=0) + raise Storage.KeyValueMismatchError( + address=address, key=key, want=self[key], got=0 + ) elif other[key] != 0: - raise Storage.KeyValueMismatch(address=address, key=key, want=0, got=other[key]) + raise Storage.KeyValueMismatchError( + address=address, key=key, want=0, got=other[key] + ) def canary(self) -> "Storage": """ - Returns a canary storage filled with non-zero values where the current storage expects + Return a canary storage filled with non-zero values where the current storage expects zero values, to guarantee that the test overwrites the storage. """ return Storage({key: HashInt(0xBA5E) for key in self.keys() if self[key] == 0}) class Account(CamelModel): - """ - State associated with an address. - """ + """State associated with an address.""" nonce: ZeroPaddedHexNumber = ZeroPaddedHexNumber(0) """ @@ -294,7 +281,7 @@ class Account(CamelModel): """ @dataclass(kw_only=True) - class NonceMismatch(Exception): + class NonceMismatchError(Exception): """ Test expected a certain nonce value for an account but a different value was found. @@ -305,13 +292,14 @@ class NonceMismatch(Exception): got: int | None def __init__(self, address: Address, want: int | None, got: int | None, *args): + """Initialize the exception with the address, wanted and got values.""" super().__init__(args) self.address = address self.want = want self.got = got def __str__(self): - """Print exception string""" + """Print exception string.""" label_str = "" if self.address.label is not None: label_str = f" ({self.address.label})" @@ -321,7 +309,7 @@ def __str__(self): ) @dataclass(kw_only=True) - class BalanceMismatch(Exception): + class BalanceMismatchError(Exception): """ Test expected a certain balance for an account but a different value was found. @@ -332,13 +320,14 @@ class BalanceMismatch(Exception): got: int | None def __init__(self, address: Address, want: int | None, got: int | None, *args): + """Initialize the exception with the address, wanted and got values.""" super().__init__(args) self.address = address self.want = want self.got = got def __str__(self): - """Print exception string""" + """Print exception string.""" label_str = "" if self.address.label is not None: label_str = f" ({self.address.label})" @@ -348,7 +337,7 @@ def __str__(self): ) @dataclass(kw_only=True) - class CodeMismatch(Exception): + class CodeMismatchError(Exception): """ Test expected a certain bytecode for an account but a different one was found. @@ -359,13 +348,14 @@ class CodeMismatch(Exception): got: bytes | None def __init__(self, address: Address, want: bytes | None, got: bytes | None, *args): + """Initialize the exception with the address, wanted and got values.""" super().__init__(args) self.address = address self.want = want self.got = got def __str__(self): - """Print exception string""" + """Print exception string.""" label_str = "" if self.address.label is not None: label_str = f" ({self.address.label})" @@ -376,12 +366,12 @@ def __str__(self): def check_alloc(self: "Account", address: Address, account: "Account"): """ - Checks the returned alloc against an expected account in post state. + Check the returned alloc against an expected account in post state. Raises exception on failure. """ if "nonce" in self.model_fields_set: if self.nonce != account.nonce: - raise Account.NonceMismatch( + raise Account.NonceMismatchError( address=address, want=self.nonce, got=account.nonce, @@ -389,7 +379,7 @@ def check_alloc(self: "Account", address: Address, account: "Account"): if "balance" in self.model_fields_set: if self.balance != account.balance: - raise Account.BalanceMismatch( + raise Account.BalanceMismatchError( address=address, want=self.balance, got=account.balance, @@ -397,7 +387,7 @@ def check_alloc(self: "Account", address: Address, account: "Account"): if "code" in self.model_fields_set: if self.code != account.code: - raise Account.CodeMismatch( + raise Account.CodeMismatchError( address=address, want=self.code, got=account.code, @@ -407,25 +397,19 @@ def check_alloc(self: "Account", address: Address, account: "Account"): self.storage.must_be_equal(address=address, other=account.storage) def __bool__(self: "Account") -> bool: - """ - Returns True on a non-empty account. - """ + """Return True on a non-empty account.""" return any((self.nonce, self.balance, self.code, self.storage)) @classmethod def with_code(cls: Type, code: BytesConvertible) -> "Account": - """ - Create account with provided `code` and nonce of `1`. - """ + """Create account with provided `code` and nonce of `1`.""" return Account(nonce=HexNumber(1), code=Bytes(code)) @classmethod def merge( cls: Type, account_1: "Dict | Account | None", account_2: "Dict | Account | None" ) -> "Account": - """ - Create a merged account from two sources. - """ + """Create a merged account from two sources.""" def to_kwargs_dict(account: "Dict | Account | None") -> Dict: if account is None: @@ -443,8 +427,6 @@ def to_kwargs_dict(account: "Dict | Account | None") -> Dict: class Alloc(RootModel[Dict[Address, Account | None]]): - """ - Allocation of accounts in the state, pre and post test execution. - """ + """Allocation of accounts in the state, pre and post test execution.""" root: Dict[Address, Account | None] = Field(default_factory=dict, validate_default=True) diff --git a/src/ethereum_test_base_types/constants.py b/src/ethereum_test_base_types/constants.py index cb0f60b80e..c40176502e 100644 --- a/src/ethereum_test_base_types/constants.py +++ b/src/ethereum_test_base_types/constants.py @@ -1,7 +1,4 @@ -""" -Common values used in Ethereum tests. -""" - +"""Common values used in Ethereum tests.""" from .base_types import Address diff --git a/src/ethereum_test_base_types/conversions.py b/src/ethereum_test_base_types/conversions.py index 33deb09c3b..ede06d1e71 100644 --- a/src/ethereum_test_base_types/conversions.py +++ b/src/ethereum_test_base_types/conversions.py @@ -1,6 +1,5 @@ -""" -Common conversion methods. -""" +"""Common conversion methods.""" + from re import sub from typing import Any, List, Optional, SupportsBytes, TypeAlias @@ -9,85 +8,74 @@ NumberConvertible: TypeAlias = str | bytes | SupportsBytes | int -def int_or_none(input: Any, default: Optional[int] = None) -> int | None: - """ - Converts a value to int or returns a default (None). - """ - if input is None: +def int_or_none(input_value: Any, default: Optional[int] = None) -> int | None: + """Convert a value to int or returns a default (None).""" + if input_value is None: return default - if isinstance(input, int): - return input - return int(input, 0) + if isinstance(input_value, int): + return input_value + return int(input_value, 0) -def str_or_none(input: Any, default: Optional[str] = None) -> str | None: - """ - Converts a value to string or returns a default (None). - """ - if input is None: +def str_or_none(input_value: Any, default: Optional[str] = None) -> str | None: + """Convert a value to string or returns a default (None).""" + if input_value is None: return default - if isinstance(input, str): - return input - return str(input) + if isinstance(input_value, str): + return input_value + return str(input_value) -def to_bytes(input: BytesConvertible) -> bytes: - """ - Converts multiple types into bytes. - """ - if input is None: +def to_bytes(input_bytes: BytesConvertible) -> bytes: + """Convert multiple types into bytes.""" + if input_bytes is None: raise Exception("Cannot convert `None` input to bytes") - if isinstance(input, SupportsBytes) or isinstance(input, bytes) or isinstance(input, list): - return bytes(input) - - if isinstance(input, str): - # We can have a hex representation of bytes with spaces for - # readability - input = sub(r"\s+", "", input) - if input.startswith("0x"): - input = input[2:] - if len(input) % 2 == 1: - input = "0" + input - return bytes.fromhex(input) + if ( + isinstance(input_bytes, SupportsBytes) + or isinstance(input_bytes, bytes) + or isinstance(input_bytes, list) + ): + return bytes(input_bytes) + + if isinstance(input_bytes, str): + # We can have a hex representation of bytes with spaces for readability + input_bytes = sub(r"\s+", "", input_bytes) + if input_bytes.startswith("0x"): + input_bytes = input_bytes[2:] + if len(input_bytes) % 2 == 1: + input_bytes = "0" + input_bytes + return bytes.fromhex(input_bytes) raise Exception("invalid type for `bytes`") -def to_fixed_size_bytes(input: FixedSizeBytesConvertible, size: int) -> bytes: - """ - Converts multiple types into fixed-size bytes. - """ - if isinstance(input, int): - return int.to_bytes(input, length=size, byteorder="big", signed=input < 0) - input = to_bytes(input) - if len(input) > size: - raise Exception(f"input is too large for fixed size bytes: {len(input)} > {size}") - return bytes(input).rjust(size, b"\x00") - - -def to_hex(input: BytesConvertible) -> str: - """ - Converts multiple types into a bytes hex string. - """ - return "0x" + to_bytes(input).hex() - - -def to_number(input: NumberConvertible) -> int: - """ - Converts multiple types into a number. - """ - if isinstance(input, int): - return input - if isinstance(input, str): - return int(input, 0) - if isinstance(input, bytes) or isinstance(input, SupportsBytes): - return int.from_bytes(input, byteorder="big") +def to_fixed_size_bytes(input_bytes: FixedSizeBytesConvertible, size: int) -> bytes: + """Convert multiple types into fixed-size bytes.""" + if isinstance(input_bytes, int): + return int.to_bytes(input_bytes, length=size, byteorder="big", signed=input_bytes < 0) + input_bytes = to_bytes(input_bytes) + if len(input_bytes) > size: + raise Exception(f"input is too large for fixed size bytes: {len(input_bytes)} > {size}") + return bytes(input_bytes).rjust(size, b"\x00") + + +def to_hex(input_bytes: BytesConvertible) -> str: + """Convert multiple types into a bytes hex string.""" + return "0x" + to_bytes(input_bytes).hex() + + +def to_number(input_number: NumberConvertible) -> int: + """Convert multiple types into a number.""" + if isinstance(input_number, int): + return input_number + if isinstance(input_number, str): + return int(input_number, 0) + if isinstance(input_number, bytes) or isinstance(input_number, SupportsBytes): + return int.from_bytes(input_number, byteorder="big") raise Exception("invalid type for `number`") -def to_fixed_size_hex(input: FixedSizeBytesConvertible, size: int) -> str: - """ - Converts multiple types into a bytes hex string. - """ - return "0x" + to_fixed_size_bytes(input, size).hex() +def to_fixed_size_hex(input_bytes: FixedSizeBytesConvertible, size: int) -> str: + """Convert multiple types into a bytes hex string.""" + return "0x" + to_fixed_size_bytes(input_bytes, size).hex() diff --git a/src/ethereum_test_base_types/json.py b/src/ethereum_test_base_types/json.py index 9b63d89502..177d2cb547 100644 --- a/src/ethereum_test_base_types/json.py +++ b/src/ethereum_test_base_types/json.py @@ -1,6 +1,4 @@ -""" -JSON encoding and decoding for Ethereum types. -""" +"""JSON encoding and decoding for Ethereum types.""" from typing import Any, AnyStr, List @@ -8,14 +6,12 @@ def to_json( - input: BaseModel | RootModel | AnyStr | List[BaseModel | RootModel | AnyStr], + input_model: BaseModel | RootModel | AnyStr | List[BaseModel | RootModel | AnyStr], ) -> Any: - """ - Converts a model to its json data representation. - """ - if isinstance(input, list): - return [to_json(item) for item in input] - elif isinstance(input, (BaseModel, RootModel)): - return input.model_dump(mode="json", by_alias=True, exclude_none=True) + """Convert a model to its json data representation.""" + if isinstance(input_model, list): + return [to_json(item) for item in input_model] + elif isinstance(input_model, (BaseModel, RootModel)): + return input_model.model_dump(mode="json", by_alias=True, exclude_none=True) else: - return str(input) + return str(input_model) diff --git a/src/ethereum_test_base_types/pydantic.py b/src/ethereum_test_base_types/pydantic.py index 6ef2c2b0a4..8ff6badfa7 100644 --- a/src/ethereum_test_base_types/pydantic.py +++ b/src/ethereum_test_base_types/pydantic.py @@ -1,6 +1,5 @@ -""" -Base pydantic classes used to define the models for Ethereum tests. -""" +"""Base pydantic classes used to define the models for Ethereum tests.""" + from typing import TypeVar from pydantic import BaseModel, ConfigDict @@ -10,14 +9,10 @@ class CopyValidateModel(BaseModel): - """ - Base model for Ethereum tests. - """ + """Base model for Ethereum tests.""" def copy(self: Model, **kwargs) -> Model: - """ - Creates a copy of the model with the updated fields that are validated. - """ + """Create a copy of the model with the updated fields that are validated.""" return self.__class__(**(self.model_dump(exclude_unset=True) | kwargs)) diff --git a/src/ethereum_test_base_types/reference_spec/__init__.py b/src/ethereum_test_base_types/reference_spec/__init__.py index f3afdc5054..5f2aef41dc 100644 --- a/src/ethereum_test_base_types/reference_spec/__init__.py +++ b/src/ethereum_test_base_types/reference_spec/__init__.py @@ -1,6 +1,5 @@ -""" -Reference Spec Classes -""" +"""Reference Spec Classes.""" + from typing import Sequence, Type from .git_reference_spec import GitReferenceSpec diff --git a/src/ethereum_test_base_types/reference_spec/git_reference_spec.py b/src/ethereum_test_base_types/reference_spec/git_reference_spec.py index 374c864af8..45ec4eb6e0 100644 --- a/src/ethereum_test_base_types/reference_spec/git_reference_spec.py +++ b/src/ethereum_test_base_types/reference_spec/git_reference_spec.py @@ -1,6 +1,4 @@ -""" -Reference Specification file located in a github repository. -""" +"""Reference Specification file located in a github repository.""" import base64 import json @@ -10,7 +8,7 @@ import requests -from .reference_spec import NoLatestKnownVersion, ParseModuleError, ReferenceSpec +from .reference_spec import NoLatestKnownVersionError, ParseModuleError, ReferenceSpec def _decode_base64_content(encoded_data: str) -> str: @@ -19,9 +17,7 @@ def _decode_base64_content(encoded_data: str) -> str: @dataclass(kw_only=True) class GitReferenceSpec(ReferenceSpec): - """ - Git Reference Specification Description Class - """ + """Git Reference Specification Description Class.""" SpecPath: str RepositoryOwner: str = "ethereum" @@ -31,24 +27,18 @@ class GitReferenceSpec(ReferenceSpec): _latest_spec: Dict | None = None def name(self) -> str: - """ - Returns the name of the spec. - """ + """Return the name of the spec.""" return ( f"https://github.com/{self.RepositoryOwner}/" + f"{self.RepositoryName}/blob/{self.BranchName}/{self.SpecPath}" ) def known_version(self) -> str: - """ - Returns the latest known version in the reference. - """ + """Return the latest known version in the reference.""" return self.SpecVersion def api_url(self) -> str: - """ - The URL used to retrieve the version via the Github API. - """ + """URL used to retrieve the version via the Github API.""" return ( f"https://api.github.com/repos/{self.RepositoryOwner}/" f"{self.RepositoryName}/contents/{self.SpecPath}" @@ -69,7 +59,8 @@ def _get_latest_spec(self) -> Dict | None: if response.status_code != 200: warnings.warn( f"Unable to get latest version, status code: {response.status_code} - " - f"text: {response.text}" + f"text: {response.text}", + stacklevel=2, ) return None content = json.loads(response.content) @@ -79,12 +70,12 @@ def _get_latest_spec(self) -> Dict | None: def is_outdated(self) -> bool: """ - Checks whether the reference specification has been updated since the + Check whether the reference specification has been updated since the test was last updated, by comparing the latest known `sha` value of the file in the repository. """ if self.SpecVersion == "": - raise NoLatestKnownVersion + raise NoLatestKnownVersionError # Fetch the latest spec latest = self._get_latest_spec() if latest is None: @@ -92,9 +83,7 @@ def is_outdated(self) -> bool: return latest["sha"].strip() != self.SpecVersion.strip() def latest_version(self) -> str: - """ - Returns the sha digest of the latest version of the spec. - """ + """Return the sha digest of the latest version of the spec.""" latest = self._get_latest_spec() if latest is None or "sha" not in latest: return "" @@ -102,14 +91,14 @@ def latest_version(self) -> str: def has_known_version(self) -> bool: """ - Returns true if the reference spec object is hard-coded with a latest + Return true if the reference spec object is hard-coded with a latest known version. """ return self.SpecVersion != "" def write_info(self, info: Dict[str, str]): """ - Writes info about the reference specification used into the output + Write info about the reference specification used into the output fixture. """ info["reference-spec"] = self.name() @@ -117,16 +106,12 @@ def write_info(self, info: Dict[str, str]): @staticmethod def parseable_from_module(module_dict: Dict[str, Any]) -> bool: - """ - Checks whether the module contains a git reference spec. - """ + """Check whether the module contains a git reference spec.""" return "REFERENCE_SPEC_GIT_PATH" in module_dict @staticmethod def parse_from_module(module_dict: Dict[str, Any]) -> "ReferenceSpec": - """ - Parses the module's dict into a reference spec. - """ + """Parse the module's dict into a reference spec.""" if "REFERENCE_SPEC_GIT_PATH" not in module_dict: raise ParseModuleError diff --git a/src/ethereum_test_base_types/reference_spec/reference_spec.py b/src/ethereum_test_base_types/reference_spec/reference_spec.py index 2eaa800d5a..10e86a4ce1 100644 --- a/src/ethereum_test_base_types/reference_spec/reference_spec.py +++ b/src/ethereum_test_base_types/reference_spec/reference_spec.py @@ -3,16 +3,15 @@ Ethereum tests. """ - from abc import abstractmethod from typing import Any, Dict # Exceptions -class NoLatestKnownVersion(Exception): +class NoLatestKnownVersionError(Exception): """ Exception used to signal that the reference specification does not have a - latest known version + latest known version. """ pass @@ -21,82 +20,61 @@ class NoLatestKnownVersion(Exception): class ParseModuleError(Exception): """ Exception used to signal that module's reference spec could not be parsed - using the given class + using the given class. """ pass class ReferenceSpec: - """ - Reference Specification Description Abstract Class. - """ + """Reference Specification Description Abstract Class.""" @abstractmethod def name(self) -> str: - """ - Returns the name of the spec. - """ + """Return the name of the spec.""" pass @abstractmethod def has_known_version(self) -> bool: - """ - Returns true if the reference spec object is hard-coded with a latest - known version. - """ + """Return true if the reference spec object is hard-coded with a latest known version.""" pass @abstractmethod def known_version(self) -> str: - """ - Returns the latest known version in the reference. - """ + """Return the latest known version in the reference.""" pass @abstractmethod def api_url(self) -> str: - """ - Returns the URL required to poll the version from an API, if needed. - """ + """Return the URL required to poll the version from an API, if needed.""" pass @abstractmethod def latest_version(self) -> str: - """ - Returns a digest that points to the latest version of the spec. - """ + """Return a digest that points to the latest version of the spec.""" pass @abstractmethod def is_outdated(self) -> bool: """ - Checks whether the reference specification has been updated since the + Check whether the reference specification has been updated since the test was last updated. """ pass @abstractmethod def write_info(self, info: Dict[str, str]): - """ - Writes info about the reference specification used into the output - fixture. - """ + """Write info about the reference specification used into the output fixture.""" pass @staticmethod @abstractmethod def parseable_from_module(module_dict: Dict[str, Any]) -> bool: - """ - Checks whether the module's dict contains required reference spec - information. - """ + """Check whether the module's dict contains required reference spec information.""" pass @staticmethod @abstractmethod def parse_from_module(module_dict: Dict[str, Any]) -> "ReferenceSpec": - """ - Parses the module's dict into a reference spec. - """ + """Parse the module's dict into a reference spec.""" pass diff --git a/src/ethereum_test_base_types/tests/__init__.py b/src/ethereum_test_base_types/tests/__init__.py index c6162e8e0b..bf65815303 100644 --- a/src/ethereum_test_base_types/tests/__init__.py +++ b/src/ethereum_test_base_types/tests/__init__.py @@ -1,3 +1 @@ -""" -Tests for the ethereum_test_base_types package. -""" +"""Tests for the ethereum_test_base_types package.""" diff --git a/src/ethereum_test_base_types/tests/test_base_types.py b/src/ethereum_test_base_types/tests/test_base_types.py index 4bc8413e16..0b71494da8 100644 --- a/src/ethereum_test_base_types/tests/test_base_types.py +++ b/src/ethereum_test_base_types/tests/test_base_types.py @@ -1,6 +1,4 @@ -""" -Test suite for `ethereum_test` module base types. -""" +"""Test suite for `ethereum_test` module base types.""" from typing import Any @@ -43,9 +41,7 @@ ], ) def test_comparisons(a: Any, b: Any, equal: bool): - """ - Test the comparison methods of the base types. - """ + """Test the comparison methods of the base types.""" if equal: assert a == b assert not a != b @@ -87,7 +83,5 @@ def test_comparisons(a: Any, b: Any, equal: bool): ], ) def test_wei_parsing(s: str, expected: int): - """ - Test the parsing of wei values. - """ + """Test the parsing of wei values.""" assert Wei(s) == expected diff --git a/src/ethereum_test_base_types/tests/test_reference_spec.py b/src/ethereum_test_base_types/tests/test_reference_spec.py index 14d04b49ba..403e007ee8 100644 --- a/src/ethereum_test_base_types/tests/test_reference_spec.py +++ b/src/ethereum_test_base_types/tests/test_reference_spec.py @@ -1,8 +1,4 @@ -""" -Test suite for `ethereum_test_base_types.reference_spec` module. -""" - -# import pytest +"""Test suite for `ethereum_test_base_types.reference_spec` module.""" import re @@ -10,7 +6,7 @@ import requests from ..reference_spec.git_reference_spec import GitReferenceSpec -from ..reference_spec.reference_spec import NoLatestKnownVersion +from ..reference_spec.reference_spec import NoLatestKnownVersionError # the content field from https://api.github.com/repos/ethereum/EIPs/contents/EIPS/eip-100.md # as of 2023-08-29 @@ -64,9 +60,7 @@ def test_git_reference_spec(monkeypatch): - """ - Test Git reference spec. - """ + """Test Git reference spec.""" def mock_get(self): class Response: @@ -89,7 +83,7 @@ class Response: assert latest_spec is not None assert "sha" in latest_spec assert re.match(r"^[0-9a-f]{40}$", latest_spec["sha"]) - with pytest.raises(NoLatestKnownVersion): + with pytest.raises(NoLatestKnownVersionError): # `is_outdated` method raises here because known version is unset ref_spec.is_outdated() ref_spec.SpecVersion = "0000000000000000000000000000000000000000" diff --git a/src/ethereum_test_specs/tests/test_expect.py b/src/ethereum_test_specs/tests/test_expect.py index c9a574cd93..d5cdca0e50 100644 --- a/src/ethereum_test_specs/tests/test_expect.py +++ b/src/ethereum_test_specs/tests/test_expect.py @@ -1,6 +1,4 @@ -""" -Test fixture post state (expect section) during state fixture generation. -""" +"""Test fixture post state (expect section) during state fixture generation.""" from typing import Any, Mapping, Type @@ -19,25 +17,19 @@ @pytest.fixture def tx() -> Transaction: - """ - The transaction: Set from the test's indirectly parametrized `tx` parameter. - """ + """Fixture set from the test's indirectly parametrized `tx` parameter.""" return Transaction(secret_key=TestPrivateKey) @pytest.fixture def pre(request) -> Alloc: - """ - The pre state: Set from the test's indirectly parametrized `pre` parameter. - """ + """Fixture set from the test's indirectly parametrized `pre` parameter.""" return Alloc(request.param | {TestAddress: Account(balance=(10**18))}) @pytest.fixture def post(request) -> Alloc: # noqa: D103 - """ - The post state: Set from the test's indirectly parametrized `post` parameter. - """ + """Fixture set from the test's indirectly parametrized `post` parameter.""" return Alloc(request.param) @@ -71,58 +63,54 @@ def t8n() -> ExecutionSpecsTransitionTool: # noqa: D103 ( # mismatch_1: 1:1 vs 1:2 {ADDRESS_UNDER_TEST: Account(storage={"0x01": "0x01"}, nonce=1)}, {ADDRESS_UNDER_TEST: Account(storage={"0x01": "0x02"})}, - Storage.KeyValueMismatch(address=ADDRESS_UNDER_TEST, key=1, want=2, got=1), + Storage.KeyValueMismatchError(address=ADDRESS_UNDER_TEST, key=1, want=2, got=1), ), ( # mismatch_2: 1:1 vs 2:1 {ADDRESS_UNDER_TEST: Account(storage={"0x01": "0x01"}, nonce=1)}, {ADDRESS_UNDER_TEST: Account(storage={"0x02": "0x01"})}, - Storage.KeyValueMismatch(address=ADDRESS_UNDER_TEST, key=1, want=0, got=1), + Storage.KeyValueMismatchError(address=ADDRESS_UNDER_TEST, key=1, want=0, got=1), ), ( # mismatch_2_a: 1:1 vs 0:0 {ADDRESS_UNDER_TEST: Account(storage={"0x01": "0x01"}, nonce=1)}, {ADDRESS_UNDER_TEST: Account(storage={"0x00": "0x00"})}, - Storage.KeyValueMismatch(address=ADDRESS_UNDER_TEST, key=1, want=0, got=1), + Storage.KeyValueMismatchError(address=ADDRESS_UNDER_TEST, key=1, want=0, got=1), ), ( # mismatch_2_b: 1:1 vs empty {ADDRESS_UNDER_TEST: Account(storage={"0x01": "0x01"}, nonce=1)}, {ADDRESS_UNDER_TEST: Account(storage={})}, - Storage.KeyValueMismatch(address=ADDRESS_UNDER_TEST, key=1, want=0, got=1), + Storage.KeyValueMismatchError(address=ADDRESS_UNDER_TEST, key=1, want=0, got=1), ), ( # mismatch_3: 0:0 vs 1:2 {ADDRESS_UNDER_TEST: Account(storage={"0x00": "0x00"}, nonce=1)}, {ADDRESS_UNDER_TEST: Account(storage={"0x01": "0x02"})}, - Storage.KeyValueMismatch(address=ADDRESS_UNDER_TEST, key=1, want=2, got=0), + Storage.KeyValueMismatchError(address=ADDRESS_UNDER_TEST, key=1, want=2, got=0), ), ( # mismatch_3_a: empty vs 1:2 {ADDRESS_UNDER_TEST: Account(storage={}, nonce=1)}, {ADDRESS_UNDER_TEST: Account(storage={"0x01": "0x02"})}, - Storage.KeyValueMismatch(address=ADDRESS_UNDER_TEST, key=1, want=2, got=0), + Storage.KeyValueMismatchError(address=ADDRESS_UNDER_TEST, key=1, want=2, got=0), ), ( # mismatch_4: 0:3, 1:2 vs 1:2 {ADDRESS_UNDER_TEST: Account(storage={"0x00": "0x03", "0x01": "0x02"}, nonce=1)}, {ADDRESS_UNDER_TEST: Account(storage={"0x01": "0x02"})}, - Storage.KeyValueMismatch(address=ADDRESS_UNDER_TEST, key=0, want=0, got=3), + Storage.KeyValueMismatchError(address=ADDRESS_UNDER_TEST, key=0, want=0, got=3), ), ( # mismatch_5: 1:2, 2:3 vs 1:2 {ADDRESS_UNDER_TEST: Account(storage={"0x01": "0x02", "0x02": "0x03"}, nonce=1)}, {ADDRESS_UNDER_TEST: Account(storage={"0x01": "0x02"})}, - Storage.KeyValueMismatch(address=ADDRESS_UNDER_TEST, key=2, want=0, got=3), + Storage.KeyValueMismatchError(address=ADDRESS_UNDER_TEST, key=2, want=0, got=3), ), ( # mismatch_6: 1:2 vs 1:2, 2:3 {ADDRESS_UNDER_TEST: Account(storage={"0x01": "0x02"}, nonce=1)}, {ADDRESS_UNDER_TEST: Account(storage={"0x01": "0x02", "0x02": "0x03"})}, - Storage.KeyValueMismatch(address=ADDRESS_UNDER_TEST, key=2, want=3, got=0), + Storage.KeyValueMismatchError(address=ADDRESS_UNDER_TEST, key=2, want=3, got=0), ), ], indirect=["pre", "post"], ) -def test_post_storage_value_mismatch( - pre: Alloc, post: Alloc, expected_exception, state_test, t8n, fork -): - """ - Test post state `Account.storage` exceptions during state test fixture generation. - """ - with pytest.raises(Storage.KeyValueMismatch) as e_info: +def test_post_storage_value_mismatch(expected_exception, state_test, t8n, fork): + """Test post state `Account.storage` exceptions during state test fixture generation.""" + with pytest.raises(Storage.KeyValueMismatchError) as e_info: state_test.generate(request=None, t8n=t8n, fork=fork, fixture_format=StateFixture) assert e_info.value == expected_exception @@ -152,9 +140,9 @@ def test_post_nonce_value_mismatch(pre: Alloc, post: Alloc, state_test, t8n, for if "nonce" not in post_account.model_fields_set: # no exception state_test.generate(request=None, t8n=t8n, fork=fork, fixture_format=StateFixture) return - with pytest.raises(Account.NonceMismatch) as e_info: + with pytest.raises(Account.NonceMismatchError) as e_info: state_test.generate(request=None, t8n=t8n, fork=fork, fixture_format=StateFixture) - assert e_info.value == Account.NonceMismatch( + assert e_info.value == Account.NonceMismatchError( address=ADDRESS_UNDER_TEST, want=post_nonce, got=pre_nonce ) @@ -184,9 +172,9 @@ def test_post_code_value_mismatch(pre: Alloc, post: Alloc, state_test, t8n, fork if "code" not in post_account.model_fields_set: # no exception state_test.generate(request=None, t8n=t8n, fork=fork, fixture_format=StateFixture) return - with pytest.raises(Account.CodeMismatch) as e_info: + with pytest.raises(Account.CodeMismatchError) as e_info: state_test.generate(request=None, t8n=t8n, fork=fork, fixture_format=StateFixture) - assert e_info.value == Account.CodeMismatch( + assert e_info.value == Account.CodeMismatchError( address=ADDRESS_UNDER_TEST, want=post_code, got=pre_code ) @@ -216,9 +204,9 @@ def test_post_balance_value_mismatch(pre: Alloc, post: Alloc, state_test, t8n, f if "balance" not in post_account.model_fields_set: # no exception state_test.generate(request=None, t8n=t8n, fork=fork, fixture_format=StateFixture) return - with pytest.raises(Account.BalanceMismatch) as e_info: + with pytest.raises(Account.BalanceMismatchError) as e_info: state_test.generate(request=None, t8n=t8n, fork=fork, fixture_format=StateFixture) - assert e_info.value == Account.BalanceMismatch( + assert e_info.value == Account.BalanceMismatchError( address=ADDRESS_UNDER_TEST, want=post_balance, got=pre_balance ) diff --git a/src/ethereum_test_types/tests/test_post_alloc.py b/src/ethereum_test_types/tests/test_post_alloc.py index 2145c67ff7..cdc8fd3c72 100644 --- a/src/ethereum_test_types/tests/test_post_alloc.py +++ b/src/ethereum_test_types/tests/test_post_alloc.py @@ -98,7 +98,7 @@ def alloc(request: pytest.FixtureRequest) -> Alloc: "storage": {0: 1}, } }, - Account.NonceMismatch, + Account.NonceMismatchError, ), ], indirect=["post", "alloc"], @@ -106,9 +106,7 @@ def alloc(request: pytest.FixtureRequest) -> Alloc: def test_verify_post_alloc( post: Alloc, alloc: Alloc, expected_exception_type: Type[Exception] | None ): - """ - Test `verify_post_alloc` method of `Alloc`. - """ + """Test `verify_post_alloc` method of `Alloc`.""" if expected_exception_type is None: post.verify_post_alloc(alloc) else: diff --git a/whitelist.txt b/whitelist.txt index 7d53b42ebb..f40a65ef8b 100644 --- a/whitelist.txt +++ b/whitelist.txt @@ -1,3 +1,9 @@ +femtoether +Picoether +microether +milliether +milli +nanoether 0xaa AccessListType Account1