From f236cad26f5aea3e25824973b19fe5c3519e1e60 Mon Sep 17 00:00:00 2001 From: Fernando Macedo Date: Wed, 17 Apr 2024 11:04:47 -0300 Subject: [PATCH] Update deps - using ruff instead of black (#426) * deps: Update * fmt: Applying ruff format instead of black. Updating deps. * fmt: Applying ruff format instead of black on CI. * deps: Upd deps for read the docs --- .github/workflows/python-package.yml | 17 +- .gitignore | 1 + .pre-commit-config.yaml | 10 +- .readthedocs.yaml | 13 +- docs/diagram.md | 2 +- docs/images/order_control_machine_initial.png | Bin 19542 -> 19466 bytes .../order_control_machine_processing.png | Bin 23414 -> 26212 bytes docs/images/readme_trafficlightmachine.png | Bin 12696 -> 12761 bytes docs/images/test_state_machine_internal.png | Bin 9241 -> 9287 bytes docs/requirements.txt | 4 - poetry.lock | 1557 +++++++++-------- pyproject.toml | 79 +- statemachine/callbacks.py | 12 +- statemachine/dispatcher.py | 4 +- statemachine/factory.py | 12 +- statemachine/mixins.py | 4 +- statemachine/signature.py | 4 +- statemachine/state.py | 24 +- statemachine/statemachine.py | 16 +- statemachine/transition.py | 9 +- tests/conftest.py | 15 +- tests/examples/all_actions_machine.py | 2 +- tests/examples/enum_campaign_machine.py | 1 + tests/examples/guess_the_number_machine.py | 2 +- tests/examples/order_control_machine.py | 1 + .../order_control_rich_model_machine.py | 1 + tests/examples/persistent_model_machine.py | 6 +- tests/examples/traffic_light_machine.py | 3 + tests/test_callbacks.py | 9 +- tests/test_dispatcher.py | 4 +- tests/test_events.py | 1 + tests/test_mock_compatibility.py | 3 +- tests/test_multiple_destinations.py | 31 +- tests/test_profiling.py | 2 +- tests/test_registry.py | 10 +- tests/test_rtc.py | 20 +- tests/test_signature.py | 1 - tests/test_state.py | 1 - tests/test_state_callbacks.py | 21 +- tests/test_statemachine.py | 22 +- tests/test_transitions.py | 19 +- 41 files changed, 988 insertions(+), 955 deletions(-) delete mode 100644 docs/requirements.txt diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 8d5eb61..cd4e9a4 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -15,7 +15,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] + python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v3 @@ -46,18 +46,11 @@ jobs: # run ruff #---------------------------------------------- - name: Linter with ruff - if: matrix.python-version == 3.11 + if: matrix.python-version == 3.12 run: | source .venv/bin/activate - ruff . - #---------------------------------------------- - # run black - #---------------------------------------------- - - name: Linter with black - if: matrix.python-version == 3.11 - run: | - source .venv/bin/activate - black . --check --diff + ruff check . + ruff format --check . #---------------------------------------------- # run pytest #---------------------------------------------- @@ -71,7 +64,7 @@ jobs: #---------------------------------------------- - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 - if: matrix.python-version == 3.11 + if: matrix.python-version == 3.12 with: token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos directory: . diff --git a/.gitignore b/.gitignore index 9b2e038..22eb649 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,4 @@ target/ # Sphinx-galery docs/auto_examples/sg_execution_times.* docs/auto_examples/*.pickle +docs/sg_execution_times.rst diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3f1d3ea..9d5f683 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,13 +9,13 @@ repos: exclude: docs/auto_examples - repo: https://github.com/charliermarsh/ruff-pre-commit # Ruff version. - rev: 'v0.0.257' + rev: v0.3.7 hooks: + # Run the linter. - id: ruff -- repo: https://github.com/psf/black - rev: 22.10.0 - hooks: - - id: black + args: [ --fix ] + # Run the formatter. + - id: ruff-format - repo: local hooks: diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 974d814..c29464a 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -7,26 +7,23 @@ version: 2 # Set the version of Python and other tools you might need build: - os: ubuntu-20.04 + os: ubuntu-22.04 tools: - python: "3.11" + python: "3.12" apt_packages: - graphviz jobs: post_create_environment: # Install poetry # https://python-poetry.org/docs/#installing-manually - - pip install poetry + - python -m pip install poetry # Tell poetry to not use a virtual environment - poetry config virtualenvs.create false + post_install: # Install dependencies with 'docs' dependency group # https://python-poetry.org/docs/managing-dependencies/#dependency-groups - - poetry install --extras diagrams --with docs + - VIRTUAL_ENV=$READTHEDOCS_VIRTUALENV_PATH poetry install --extras diagrams --with docs # Build documentation in the docs/ directory with Sphinx sphinx: configuration: docs/conf.py - -python: - install: - - requirements: docs/requirements.txt diff --git a/docs/diagram.md b/docs/diagram.md index 1b5070b..2238bf4 100644 --- a/docs/diagram.md +++ b/docs/diagram.md @@ -87,7 +87,7 @@ A handy shortcut to have the graph representation: ```py >>> machine._graph() -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�-Xp#b#btFRoT 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 BUhDt> literal 19542 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%0A$Qx4X~uc?uArj!^z^`Ob5qFfSqQ_2g6fH& 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 diff --git a/docs/images/readme_trafficlightmachine.png b/docs/images/readme_trafficlightmachine.png index 6a17931b95887d191a0286b8c70434a9bb1e066e..f52ea2cc9433e18ea5a10cd5715c7865062050aa 100644 GIT binary patch literal 12761 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 Qs|6zWP*J8t$|&G}0RE$nt^fc4 diff --git a/docs/images/test_state_machine_internal.png b/docs/images/test_state_machine_internal.png index d9180b52715af56c94bf8054dd8a137b3ef32fd3..77806cdbc0cffbd3a717a94ebfea4efbd8c1ecb1 100644 GIT binary patch literal 9287 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 dP7NN&rB=g#BILuXft5iJDKRBo- literal 9241 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 I#310m0EiQNGynhq diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 4e86d0b..0000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Temp file while readthedocs dont enable USE_SPHINX_LATEST on this project -# https://github.com/readthedocs/readthedocs.org/issues/7858#issuecomment-764886373 -Sphinx==4.5.0 -sphinx-rtd-theme==1.1.1 diff --git a/poetry.lock b/poetry.lock index d9a138e..311426b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,208 +2,189 @@ [[package]] name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" +version = "0.7.16" +description = "A light, configurable Sphinx theme" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] -name = "attrs" -version = "23.1.0" -description = "Classes Without Boilerplate" +name = "anyio" +version = "4.3.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, ] [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] -name = "babel" -version = "2.13.0" -description = "Internationalization utilities" +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.13.0-py3-none-any.whl", hash = "sha256:fbfcae1575ff78e26c7449136f1abbefc3c13ce542eeb13d43d50d8b047216ec"}, - {file = "Babel-2.13.0.tar.gz", hash = "sha256:04c3e2d28d2b7681644508f836be388ae49e0cfe91465095340395b60d00f210"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] -[package.dependencies] -pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} - [package.extras] -dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] -name = "black" -version = "22.12.0" -description = "The uncompromising code formatter." +name = "babel" +version = "2.14.0" +description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} - [package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "certifi" -version = "2023.7.22" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] name = "cfgv" -version = "3.3.1" +version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8" files = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, ] [[package]] name = "charset-normalizer" -version = "3.3.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, - {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] @@ -219,7 +200,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" @@ -234,71 +214,63 @@ files = [ [[package]] name = "coverage" -version = "7.2.7" +version = "7.4.4" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.7" -files = [ - {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, - {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, - {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, - {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, - {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, - {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, - {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, - {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, - {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, - {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, - {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, - {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, - {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, - {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, - {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, - {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, - {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, - {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, +python-versions = ">=3.8" +files = [ + {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, + {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, + {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, + {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, + {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, + {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, + {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, + {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, + {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, + {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, + {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, + {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, + {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, ] [package.dependencies] @@ -309,35 +281,35 @@ toml = ["tomli"] [[package]] name = "distlib" -version = "0.3.7" +version = "0.3.8" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, - {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, ] [[package]] name = "docutils" -version = "0.17.1" +version = "0.20.1" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, ] [[package]] name = "exceptiongroup" -version = "1.1.3" +version = "1.2.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, ] [package.extras] @@ -360,18 +332,19 @@ pyrepl = ">=0.8.2" [[package]] name = "filelock" -version = "3.12.2" +version = "3.13.4" description = "A platform independent file lock." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, - {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, + {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, + {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] [[package]] name = "gprof2dot" @@ -384,15 +357,26 @@ files = [ {file = "gprof2dot-2022.7.29.tar.gz", hash = "sha256:45b4d298bd36608fccf9511c3fd88a773f7a1abc04d6cd39445b11ba43133ec5"}, ] +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + [[package]] name = "identify" -version = "2.5.24" +version = "2.5.35" description = "File identification library for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, - {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, + {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"}, + {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"}, ] [package.extras] @@ -400,13 +384,13 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.4" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] @@ -422,23 +406,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.7.0" +version = "7.1.0" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, - {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -453,13 +436,13 @@ files = [ [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -468,35 +451,19 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] -[[package]] -name = "livereload" -version = "2.6.3" -description = "Python LiveReload is an awesome tool for web developers" -optional = false -python-versions = "*" -files = [ - {file = "livereload-2.6.3-py2.py3-none-any.whl", hash = "sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4"}, - {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, -] - -[package.dependencies] -six = "*" -tornado = {version = "*", markers = "python_version > \"2.7\""} - [[package]] name = "markdown-it-py" -version = "2.2.0" +version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, - {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, ] [package.dependencies] mdurl = ">=0.1,<1.0" -typing_extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark"] @@ -505,95 +472,95 @@ compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0 linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] -rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "mdit-py-plugins" -version = "0.3.5" +version = "0.4.0" description = "Collection of plugins for markdown-it-py" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mdit-py-plugins-0.3.5.tar.gz", hash = "sha256:eee0adc7195e5827e17e02d2a258a2ba159944a0748f59c5099a4a27f78fcf6a"}, - {file = "mdit_py_plugins-0.3.5-py3-none-any.whl", hash = "sha256:ca9a0714ea59a24b2b044a1831f48d817dd0c817e84339f20e7889f392d77c4e"}, + {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, + {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, ] [package.dependencies] -markdown-it-py = ">=1.0.0,<3.0.0" +markdown-it-py = ">=1.0.0,<4.0.0" [package.extras] code-style = ["pre-commit"] -rtd = ["attrs", "myst-parser (>=0.16.1,<0.17.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +rtd = ["myst-parser", "sphinx-book-theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] @@ -609,53 +576,49 @@ files = [ [[package]] name = "mypy" -version = "0.991" +version = "1.9.0" description = "Optional static typing for Python" optional = false -python-versions = ">=3.7" -files = [ - {file = "mypy-0.991-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7d17e0a9707d0772f4a7b878f04b4fd11f6f5bcb9b3813975a9b13c9332153ab"}, - {file = "mypy-0.991-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0714258640194d75677e86c786e80ccf294972cc76885d3ebbb560f11db0003d"}, - {file = "mypy-0.991-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c8f3be99e8a8bd403caa8c03be619544bc2c77a7093685dcf308c6b109426c6"}, - {file = "mypy-0.991-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9ec663ed6c8f15f4ae9d3c04c989b744436c16d26580eaa760ae9dd5d662eb"}, - {file = "mypy-0.991-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4307270436fd7694b41f913eb09210faff27ea4979ecbcd849e57d2da2f65305"}, - {file = "mypy-0.991-cp310-cp310-win_amd64.whl", hash = "sha256:901c2c269c616e6cb0998b33d4adbb4a6af0ac4ce5cd078afd7bc95830e62c1c"}, - {file = "mypy-0.991-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d13674f3fb73805ba0c45eb6c0c3053d218aa1f7abead6e446d474529aafc372"}, - {file = "mypy-0.991-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c8cd4fb70e8584ca1ed5805cbc7c017a3d1a29fb450621089ffed3e99d1857f"}, - {file = "mypy-0.991-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:209ee89fbb0deed518605edddd234af80506aec932ad28d73c08f1400ef80a33"}, - {file = "mypy-0.991-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37bd02ebf9d10e05b00d71302d2c2e6ca333e6c2a8584a98c00e038db8121f05"}, - {file = "mypy-0.991-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:26efb2fcc6b67e4d5a55561f39176821d2adf88f2745ddc72751b7890f3194ad"}, - {file = "mypy-0.991-cp311-cp311-win_amd64.whl", hash = "sha256:3a700330b567114b673cf8ee7388e949f843b356a73b5ab22dd7cff4742a5297"}, - {file = "mypy-0.991-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1f7d1a520373e2272b10796c3ff721ea1a0712288cafaa95931e66aa15798813"}, - {file = "mypy-0.991-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:641411733b127c3e0dab94c45af15fea99e4468f99ac88b39efb1ad677da5711"}, - {file = "mypy-0.991-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3d80e36b7d7a9259b740be6d8d906221789b0d836201af4234093cae89ced0cd"}, - {file = "mypy-0.991-cp37-cp37m-win_amd64.whl", hash = "sha256:e62ebaad93be3ad1a828a11e90f0e76f15449371ffeecca4a0a0b9adc99abcef"}, - {file = "mypy-0.991-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b86ce2c1866a748c0f6faca5232059f881cda6dda2a893b9a8373353cfe3715a"}, - {file = "mypy-0.991-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac6e503823143464538efda0e8e356d871557ef60ccd38f8824a4257acc18d93"}, - {file = "mypy-0.991-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cca5adf694af539aeaa6ac633a7afe9bbd760df9d31be55ab780b77ab5ae8bf"}, - {file = "mypy-0.991-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12c56bf73cdab116df96e4ff39610b92a348cc99a1307e1da3c3768bbb5b135"}, - {file = "mypy-0.991-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:652b651d42f155033a1967739788c436491b577b6a44e4c39fb340d0ee7f0d70"}, - {file = "mypy-0.991-cp38-cp38-win_amd64.whl", hash = "sha256:4175593dc25d9da12f7de8de873a33f9b2b8bdb4e827a7cae952e5b1a342e243"}, - {file = "mypy-0.991-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:98e781cd35c0acf33eb0295e8b9c55cdbef64fcb35f6d3aa2186f289bed6e80d"}, - {file = "mypy-0.991-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6d7464bac72a85cb3491c7e92b5b62f3dcccb8af26826257760a552a5e244aa5"}, - {file = "mypy-0.991-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c9166b3f81a10cdf9b49f2d594b21b31adadb3d5e9db9b834866c3258b695be3"}, - {file = "mypy-0.991-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8472f736a5bfb159a5e36740847808f6f5b659960115ff29c7cecec1741c648"}, - {file = "mypy-0.991-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e80e758243b97b618cdf22004beb09e8a2de1af481382e4d84bc52152d1c476"}, - {file = "mypy-0.991-cp39-cp39-win_amd64.whl", hash = "sha256:74e259b5c19f70d35fcc1ad3d56499065c601dfe94ff67ae48b85596b9ec1461"}, - {file = "mypy-0.991-py3-none-any.whl", hash = "sha256:de32edc9b0a7e67c2775e574cb061a537660e51210fbf6006b0b36ea695ae9bb"}, - {file = "mypy-0.991.tar.gz", hash = "sha256:3c0165ba8f354a6d9881809ef29f1a9318a236a6d81c690094c5df32107bde06"}, +python-versions = ">=3.8" +files = [ + {file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"}, + {file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"}, + {file = "mypy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c87c15aed320de9b438ae7b00c1ac91cd393c1b854c2ce538e2a72d55df150"}, + {file = "mypy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48533cdd345c3c2e5ef48ba3b0d3880b257b423e7995dada04248725c6f77374"}, + {file = "mypy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:4d3dbd346cfec7cb98e6cbb6e0f3c23618af826316188d587d1c1bc34f0ede03"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:653265f9a2784db65bfca694d1edd23093ce49740b2244cde583aeb134c008f3"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a3c007ff3ee90f69cf0a15cbcdf0995749569b86b6d2f327af01fd1b8aee9dc"}, + {file = "mypy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2418488264eb41f69cc64a69a745fad4a8f86649af4b1041a4c64ee61fc61129"}, + {file = "mypy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68edad3dc7d70f2f17ae4c6c1b9471a56138ca22722487eebacfd1eb5321d612"}, + {file = "mypy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:85ca5fcc24f0b4aeedc1d02f93707bccc04733f21d41c88334c5482219b1ccb3"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aceb1db093b04db5cd390821464504111b8ec3e351eb85afd1433490163d60cd"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0235391f1c6f6ce487b23b9dbd1327b4ec33bb93934aa986efe8a9563d9349e6"}, + {file = "mypy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d5ddc13421ba3e2e082a6c2d74c2ddb3979c39b582dacd53dd5d9431237185"}, + {file = "mypy-1.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:190da1ee69b427d7efa8aa0d5e5ccd67a4fb04038c380237a0d96829cb157913"}, + {file = "mypy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe28657de3bfec596bbeef01cb219833ad9d38dd5393fc649f4b366840baefe6"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e54396d70be04b34f31d2edf3362c1edd023246c82f1730bbf8768c28db5361b"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5e6061f44f2313b94f920e91b204ec600982961e07a17e0f6cd83371cb23f5c2"}, + {file = "mypy-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a10926e5473c5fc3da8abb04119a1f5811a236dc3a38d92015cb1e6ba4cb9e"}, + {file = "mypy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b685154e22e4e9199fc95f298661deea28aaede5ae16ccc8cbb1045e716b3e04"}, + {file = "mypy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d741d3fc7c4da608764073089e5f58ef6352bedc223ff58f2f038c2c4698a89"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:587ce887f75dd9700252a3abbc9c97bbe165a4a630597845c61279cf32dfbf02"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f88566144752999351725ac623471661c9d1cd8caa0134ff98cceeea181789f4"}, + {file = "mypy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61758fabd58ce4b0720ae1e2fea5cfd4431591d6d590b197775329264f86311d"}, + {file = "mypy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e49499be624dead83927e70c756970a0bc8240e9f769389cdf5714b0784ca6bf"}, + {file = "mypy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:571741dc4194b4f82d344b15e8837e8c5fcc462d66d076748142327626a1b6e9"}, + {file = "mypy-1.9.0-py3-none-any.whl", hash = "sha256:a260627a570559181a9ea5de61ac6297aa5af202f06fd7ab093ce74e7181e43e"}, + {file = "mypy-1.9.0.tar.gz", hash = "sha256:3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"}, ] [package.dependencies] -mypy-extensions = ">=0.4.3" +mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} -typing-extensions = ">=3.10" +typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] -python2 = ["typed-ast (>=1.4.0,<2)"] +mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] @@ -671,29 +634,29 @@ files = [ [[package]] name = "myst-parser" -version = "0.18.1" -description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." +version = "2.0.0" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "myst-parser-0.18.1.tar.gz", hash = "sha256:79317f4bb2c13053dd6e64f9da1ba1da6cd9c40c8a430c447a7b146a594c246d"}, - {file = "myst_parser-0.18.1-py3-none-any.whl", hash = "sha256:61b275b85d9f58aa327f370913ae1bec26ebad372cc99f3ab85c8ec3ee8d9fb8"}, + {file = "myst_parser-2.0.0-py3-none-any.whl", hash = "sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14"}, + {file = "myst_parser-2.0.0.tar.gz", hash = "sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead"}, ] [package.dependencies] -docutils = ">=0.15,<0.20" +docutils = ">=0.16,<0.21" jinja2 = "*" -markdown-it-py = ">=1.0.0,<3.0.0" -mdit-py-plugins = ">=0.3.1,<0.4.0" +markdown-it-py = ">=3.0,<4.0" +mdit-py-plugins = ">=0.4,<1.0" pyyaml = "*" -sphinx = ">=4,<6" -typing-extensions = "*" +sphinx = ">=6,<8" [package.extras] -code-style = ["pre-commit (>=2.12,<3.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -rtd = ["ipython", "sphinx-book-theme", "sphinx-design", "sphinxcontrib.mermaid (>=0.7.1,<0.8.0)", "sphinxext-opengraph (>=0.6.3,<0.7.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] -testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=6,<7)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx (<5.2)", "sphinx-pytest"] +code-style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=2.0,<3.0)"] +rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.8.2,<0.9.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] [[package]] name = "nodeenv" @@ -711,24 +674,13 @@ setuptools = "*" [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, -] - -[[package]] -name = "pathspec" -version = "0.11.2" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -753,134 +705,134 @@ testing = ["funcsigs", "pytest"] [[package]] name = "pillow" -version = "9.5.0" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false -python-versions = ">=3.7" -files = [ - {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, - {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, +python-versions = ">=3.8" +files = [ + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "3.11.0" +version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, - {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} - [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] [[package]] name = "pluggy" -version = "1.2.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "2.21.0" +version = "3.7.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, - {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, + {file = "pre_commit-3.7.0-py2.py3-none-any.whl", hash = "sha256:5eae9e10c2b5ac51577c3452ec0a490455c45a0533f7960f993a0d01e59decab"}, + {file = "pre_commit-3.7.0.tar.gz", hash = "sha256:e209d61b8acdcf742404408531f0c37d49d2c734fd7cff2d6076083d191cb060"}, ] [package.dependencies] cfgv = ">=2.0.0" identify = ">=1.0.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" @@ -898,41 +850,47 @@ files = [ [[package]] name = "pydot" -version = "1.4.2" +version = "2.0.0" description = "Python interface to Graphviz's Dot" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7" files = [ - {file = "pydot-1.4.2-py2.py3-none-any.whl", hash = "sha256:66c98190c65b8d2e2382a441b4c0edfdb4f4c025ef9cb9874de478fb0793a451"}, - {file = "pydot-1.4.2.tar.gz", hash = "sha256:248081a39bcb56784deb018977e428605c1c758f10897a339fce1dd728ff007d"}, + {file = "pydot-2.0.0-py3-none-any.whl", hash = "sha256:408a47913ea7bd5d2d34b274144880c1310c4aee901f353cf21fe2e526a4ea28"}, + {file = "pydot-2.0.0.tar.gz", hash = "sha256:60246af215123fa062f21cd791be67dda23a6f280df09f68919e637a1e4f3235"}, ] [package.dependencies] -pyparsing = ">=2.1.4" +pyparsing = ">=3" + +[package.extras] +dev = ["black", "chardet"] +release = ["zest.releaser[recommended]"] +tests = ["black", "chardet", "tox"] [[package]] name = "pygments" -version = "2.16.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, - {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyparsing" -version = "3.1.1" +version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] @@ -960,26 +918,25 @@ files = [ [[package]] name = "pytest" -version = "7.4.2" +version = "8.1.1" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, + {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, + {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.4,<2.0" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-benchmark" @@ -1003,13 +960,13 @@ histogram = ["pygal", "pygaljs"] [[package]] name = "pytest-cov" -version = "4.1.0" +version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, - {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, ] [package.dependencies] @@ -1017,21 +974,21 @@ coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pytest-mock" -version = "3.11.1" +version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-mock-3.11.1.tar.gz", hash = "sha256:7f6b125602ac6d743e523ae0bfa71e1a697a2f5534064528c6ff84c2f7c2fc7f"}, - {file = "pytest_mock-3.11.1-py3-none-any.whl", hash = "sha256:21c279fff83d70763b05f8874cc9cfb3fcacd6d354247a976f9529d19f9acf39"}, + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, ] [package.dependencies] -pytest = ">=5.0" +pytest = ">=6.2.5" [package.extras] dev = ["pre-commit", "pytest-asyncio", "tox"] @@ -1057,13 +1014,13 @@ tests = ["pytest-virtualenv"] [[package]] name = "pytest-sugar" -version = "0.9.7" +version = "1.0.0" description = "pytest-sugar is a plugin for pytest that changes the default look and feel of pytest (e.g. progressbar, show tests that fail instantly)." optional = false python-versions = "*" files = [ - {file = "pytest-sugar-0.9.7.tar.gz", hash = "sha256:f1e74c1abfa55f7241cf7088032b6e378566f16b938f3f08905e2cf4494edd46"}, - {file = "pytest_sugar-0.9.7-py2.py3-none-any.whl", hash = "sha256:8cb5a4e5f8bbcd834622b0235db9e50432f4cbd71fef55b467fe44e43701e062"}, + {file = "pytest-sugar-1.0.0.tar.gz", hash = "sha256:6422e83258f5b0c04ce7c632176c7732cab5fdb909cb39cca5c9139f81276c0a"}, + {file = "pytest_sugar-1.0.0-py3-none-any.whl", hash = "sha256:70ebcd8fc5795dc457ff8b69d266a4e2e8a74ae0c3edc749381c64b5246c8dfd"}, ] [package.dependencies] @@ -1074,17 +1031,6 @@ termcolor = ">=2.1.0" [package.extras] dev = ["black", "flake8", "pre-commit"] -[[package]] -name = "pytz" -version = "2023.3.post1" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, -] - [[package]] name = "pyyaml" version = "6.0.1" @@ -1167,45 +1113,45 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "ruff" -version = "0.0.257" -description = "An extremely fast Python linter, written in Rust." +version = "0.3.7" +description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.0.257-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:7280640690c1d0046b20e0eb924319a89d8e22925d7d232180ce31196e7478f8"}, - {file = "ruff-0.0.257-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:4582b73da61ab410ffda35b2987a6eacb33f18263e1c91810f0b9779ec4f41a9"}, - {file = "ruff-0.0.257-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5acae9878f1136893e266348acdb9d30dfae23c296d3012043816432a5abdd51"}, - {file = "ruff-0.0.257-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d9f0912d045eee15e8e02e335c16d7a7f9fb6821aa5eb1628eeb5bbfa3d88908"}, - {file = "ruff-0.0.257-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a9542c34ee5298b31be6c6ba304f14b672dcf104846ee65adb2466d3e325870"}, - {file = "ruff-0.0.257-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3464f1ad4cea6c4b9325da13ae306bd22bf15d226e18d19c52db191b1f4355ac"}, - {file = "ruff-0.0.257-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a54bfd559e558ee0df2a2f3756423fe6a9de7307bc290d807c3cdf351cb4c24"}, - {file = "ruff-0.0.257-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3438fd38446e1a0915316f4085405c9feca20fe00a4b614995ab7034dbfaa7ff"}, - {file = "ruff-0.0.257-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:358cc2b547bd6451dcf2427b22a9c29a2d9c34e66576c693a6381c5f2ed3011d"}, - {file = "ruff-0.0.257-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:783390f1e94a168c79d7004426dae3e4ae2999cc85f7d00fdd86c62262b71854"}, - {file = "ruff-0.0.257-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:aaa3b5b6929c63a854b6bcea7a229453b455ab26337100b2905fae4523ca5667"}, - {file = "ruff-0.0.257-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4ecd7a84db4816df2dcd0f11c5365a9a2cf4fa70a19b3ac161b7b0bfa592959d"}, - {file = "ruff-0.0.257-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3db8d77d5651a2c0d307102d717627a025d4488d406f54c2764b21cfbe11d822"}, - {file = "ruff-0.0.257-py3-none-win32.whl", hash = "sha256:d2c8755fa4f6c5e5ec032ad341ca3beeecd16786e12c3f26e6b0cc40418ae998"}, - {file = "ruff-0.0.257-py3-none-win_amd64.whl", hash = "sha256:3cec07d6fecb1ebbc45ea8eeb1047b929caa2f7dfb8dd4b0e1869ff789326da5"}, - {file = "ruff-0.0.257-py3-none-win_arm64.whl", hash = "sha256:352f1bdb9b433b3b389aee512ffb0b82226ae1e25b3d92e4eaf0e7be6b1b6f6a"}, - {file = "ruff-0.0.257.tar.gz", hash = "sha256:fedfd06a37ddc17449203c3e38fc83fb68de7f20b5daa0ee4e60d3599b38bab0"}, + {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0e8377cccb2f07abd25e84fc5b2cbe48eeb0fea9f1719cad7caedb061d70e5ce"}, + {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:15a4d1cc1e64e556fa0d67bfd388fed416b7f3b26d5d1c3e7d192c897e39ba4b"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d28bdf3d7dc71dd46929fafeec98ba89b7c3550c3f0978e36389b5631b793663"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:379b67d4f49774ba679593b232dcd90d9e10f04d96e3c8ce4a28037ae473f7bb"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c060aea8ad5ef21cdfbbe05475ab5104ce7827b639a78dd55383a6e9895b7c51"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ebf8f615dde968272d70502c083ebf963b6781aacd3079081e03b32adfe4d58a"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48098bd8f5c38897b03604f5428901b65e3c97d40b3952e38637b5404b739a2"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8a4fda219bf9024692b1bc68c9cff4b80507879ada8769dc7e985755d662ea"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c44e0149f1d8b48c4d5c33d88c677a4aa22fd09b1683d6a7ff55b816b5d074f"}, + {file = "ruff-0.3.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3050ec0af72b709a62ecc2aca941b9cd479a7bf2b36cc4562f0033d688e44fa1"}, + {file = "ruff-0.3.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a29cc38e4c1ab00da18a3f6777f8b50099d73326981bb7d182e54a9a21bb4ff7"}, + {file = "ruff-0.3.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b15cc59c19edca917f51b1956637db47e200b0fc5e6e1878233d3a938384b0b"}, + {file = "ruff-0.3.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e491045781b1e38b72c91247cf4634f040f8d0cb3e6d3d64d38dcf43616650b4"}, + {file = "ruff-0.3.7-py3-none-win32.whl", hash = "sha256:bc931de87593d64fad3a22e201e55ad76271f1d5bfc44e1a1887edd0903c7d9f"}, + {file = "ruff-0.3.7-py3-none-win_amd64.whl", hash = "sha256:5ef0e501e1e39f35e03c2acb1d1238c595b8bb36cf7a170e7c1df1b73da00e74"}, + {file = "ruff-0.3.7-py3-none-win_arm64.whl", hash = "sha256:789e144f6dc7019d1f92a812891c645274ed08af6037d11fc65fcbc183b7d59f"}, + {file = "ruff-0.3.7.tar.gz", hash = "sha256:d5c1aebee5162c2226784800ae031f660c350e7a3402c4d1f8ea4e97e232e3ba"}, ] [[package]] name = "setuptools" -version = "68.0.0" +version = "69.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, - {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -1218,6 +1164,17 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + [[package]] name = "snowballstemmer" version = "2.2.0" @@ -1231,135 +1188,163 @@ files = [ [[package]] name = "sphinx" -version = "4.5.0" +version = "7.2.6" description = "Python documentation generator" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, + {file = "sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560"}, + {file = "sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5"}, ] [package.dependencies] alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.21" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.14" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" +sphinxcontrib-serializinghtml = ">=1.1.9" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "types-requests", "types-typed-ast"] -test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] +test = ["cython (>=3.0)", "filelock", "html5lib", "pytest (>=4.6)", "setuptools (>=67.0)"] [[package]] name = "sphinx-autobuild" -version = "2021.3.14" -description = "Rebuild Sphinx documentation on changes, with live-reload in the browser." +version = "2024.4.16" +description = "Rebuild Sphinx documentation on changes, with hot reloading in the browser." optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "sphinx-autobuild-2021.3.14.tar.gz", hash = "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05"}, - {file = "sphinx_autobuild-2021.3.14-py3-none-any.whl", hash = "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac"}, + {file = "sphinx_autobuild-2024.4.16-py3-none-any.whl", hash = "sha256:f2522779d30fcbf0253e09714f274ce8c608cb6ebcd67922b1c54de59faba702"}, + {file = "sphinx_autobuild-2024.4.16.tar.gz", hash = "sha256:1c0ed37a1970eed197f9c5a66d65759e7c4e4cba7b5a5d77940752bf1a59f2c7"}, ] [package.dependencies] colorama = "*" -livereload = "*" sphinx = "*" +starlette = ">=0.35" +uvicorn = ">=0.25" +watchfiles = ">=0.20" +websockets = ">=11" [package.extras] -test = ["pytest", "pytest-cov"] +test = ["pytest (>=6)"] [[package]] name = "sphinx-gallery" -version = "0.11.1" -description = "A Sphinx extension that builds an HTML version of any Python script and puts it into an examples gallery." +version = "0.15.0" +description = "A `Sphinx `_ extension that builds an HTML gallery of examples from any set of Python scripts." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "sphinx-gallery-0.11.1.tar.gz", hash = "sha256:56ccb29a0c2c4767d2a66617ba6ea7893e3a3885b6d972c62783a3b45b583ea5"}, - {file = "sphinx_gallery-0.11.1-py3-none-any.whl", hash = "sha256:b165cb366a5768a0f36e60e5bc6828fbf55fd1831e71645310167375223aa25c"}, + {file = "sphinx-gallery-0.15.0.tar.gz", hash = "sha256:7217fe98f8c4cce248db798c48f34183e4cdb277d2381e188182f92a14ec26b7"}, + {file = "sphinx_gallery-0.15.0-py3-none-any.whl", hash = "sha256:d66d38d901f6b65b6e3ee6c2584e37476b035d9e52907b1593a3f312946ae724"}, ] [package.dependencies] -sphinx = ">=3" +pillow = "*" +sphinx = ">=4" + +[package.extras] +jupyterlite = ["jupyterlite-sphinx"] +recommender = ["numpy"] +show-api-usage = ["graphviz"] +show-memory = ["memory-profiler"] [[package]] name = "sphinx-rtd-theme" -version = "1.1.1" +version = "2.0.0" description = "Read the Docs theme for Sphinx" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = ">=3.6" files = [ - {file = "sphinx_rtd_theme-1.1.1-py2.py3-none-any.whl", hash = "sha256:31faa07d3e97c8955637fc3f1423a5ab2c44b74b8cc558a51498c202ce5cbda7"}, - {file = "sphinx_rtd_theme-1.1.1.tar.gz", hash = "sha256:6146c845f1e1947b3c3dd4432c28998a1693ccc742b4f9ad7c63129f0757c103"}, + {file = "sphinx_rtd_theme-2.0.0-py2.py3-none-any.whl", hash = "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586"}, + {file = "sphinx_rtd_theme-2.0.0.tar.gz", hash = "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b"}, ] [package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6,<6" +docutils = "<0.21" +sphinx = ">=5,<8" +sphinxcontrib-jquery = ">=4,<5" [package.extras] dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +version = "1.0.8" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, + {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +version = "1.0.6" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, + {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.0" +version = "2.0.5" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, + {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] +[[package]] +name = "sphinxcontrib-jquery" +version = "4.1" +description = "Extension to include jQuery on newer Sphinx releases" +optional = false +python-versions = ">=2.7" +files = [ + {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, + {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, +] + +[package.dependencies] +Sphinx = ">=1.8" + [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" @@ -1376,43 +1361,63 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +version = "1.0.7" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, + {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +version = "1.1.10" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, + {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] +[[package]] +name = "starlette" +version = "0.37.2" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + [[package]] name = "termcolor" -version = "2.3.0" +version = "2.4.0" description = "ANSI color formatting for output in terminal" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, - {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, + {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, + {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, ] [package.extras] @@ -1429,125 +1434,241 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -[[package]] -name = "tornado" -version = "6.2" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -optional = false -python-versions = ">= 3.7" -files = [ - {file = "tornado-6.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72"}, - {file = "tornado-6.2-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_i686.whl", hash = "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca"}, - {file = "tornado-6.2-cp37-abi3-win32.whl", hash = "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23"}, - {file = "tornado-6.2-cp37-abi3-win_amd64.whl", hash = "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b"}, - {file = "tornado-6.2.tar.gz", hash = "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13"}, -] - -[[package]] -name = "typed-ast" -version = "1.5.5" -description = "a fork of Python 2 and 3 ast modules with type comment support" -optional = false -python-versions = ">=3.6" -files = [ - {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, - {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, - {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, - {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, - {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, - {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, - {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, - {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, - {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, - {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, - {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, - {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, - {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, - {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, - {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, - {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, - {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, - {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, - {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, - {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, - {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, - {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, - {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, - {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, - {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, - {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, - {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, - {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, - {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, - {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, - {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, - {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, - {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, - {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, - {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, - {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, - {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, - {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, - {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, - {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, - {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, -] - [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.11.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] name = "urllib3" -version = "2.0.7" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, - {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "uvicorn" +version = "0.29.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, + {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + [[package]] name = "virtualenv" -version = "20.24.5" +version = "20.25.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"}, - {file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"}, + {file = "virtualenv-20.25.1-py3-none-any.whl", hash = "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a"}, + {file = "virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" -importlib-metadata = {version = ">=6.6", markers = "python_version < \"3.8\""} -platformdirs = ">=3.9.1,<4" +platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +[[package]] +name = "watchfiles" +version = "0.21.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa"}, + {file = "watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c"}, + {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9"}, + {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9"}, + {file = "watchfiles-0.21.0-cp310-none-win32.whl", hash = "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293"}, + {file = "watchfiles-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235"}, + {file = "watchfiles-0.21.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7"}, + {file = "watchfiles-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7"}, + {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0"}, + {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365"}, + {file = "watchfiles-0.21.0-cp311-none-win32.whl", hash = "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400"}, + {file = "watchfiles-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe"}, + {file = "watchfiles-0.21.0-cp311-none-win_arm64.whl", hash = "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078"}, + {file = "watchfiles-0.21.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a"}, + {file = "watchfiles-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c"}, + {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235"}, + {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7"}, + {file = "watchfiles-0.21.0-cp312-none-win32.whl", hash = "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3"}, + {file = "watchfiles-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094"}, + {file = "watchfiles-0.21.0-cp312-none-win_arm64.whl", hash = "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6"}, + {file = "watchfiles-0.21.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99"}, + {file = "watchfiles-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562"}, + {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19"}, + {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0"}, + {file = "watchfiles-0.21.0-cp38-none-win32.whl", hash = "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214"}, + {file = "watchfiles-0.21.0-cp38-none-win_amd64.whl", hash = "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca"}, + {file = "watchfiles-0.21.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e"}, + {file = "watchfiles-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28"}, + {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6"}, + {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49"}, + {file = "watchfiles-0.21.0-cp39-none-win32.whl", hash = "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94"}, + {file = "watchfiles-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097"}, + {file = "watchfiles-0.21.0.tar.gz", hash = "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "websockets" +version = "12.0" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + [[package]] name = "wmctrl" version = "0.5" @@ -1567,23 +1688,23 @@ test = ["pytest"] [[package]] name = "zipp" -version = "3.15.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] diagrams = [] [metadata] lock-version = "2.0" -python-versions = ">=3.7, <3.13" -content-hash = "6e801ad1dfdd7a3473d537bdf9061873889027a1ab2731fe4f96e2bafe13912e" +python-versions = ">=3.9, <3.13" +content-hash = "f6b53e6151114fec68c3e469fc5934e98b54e1a5a73b484fd60ef963c1c34cb4" diff --git a/pyproject.toml b/pyproject.toml index 3ea6499..9ab6aee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,29 +34,28 @@ classifiers = [ diagrams = ["pydot"] [tool.poetry.dependencies] -python = ">=3.7, <3.13" +python = ">=3.9, <3.13" [tool.poetry.group.dev.dependencies] -pytest = "^7.2.0" -pytest-cov = "^4.0.0" -pytest-sugar = "^0.9.6" -pydot = "^1.4.2" -ruff = "^0.0.257" -pre-commit = "^2.21.0" -mypy = "^0.991" -black = "^22.12.0" +pytest = "^8.1.1" +pytest-cov = "^5.0.0" +pytest-sugar = "^1.0.0" +pydot = "^2.0.0" +ruff = "^0.3.7" +pre-commit = "^3.7.0" +mypy = "^1.9.0" pdbpp = "^0.10.3" pytest-mock = "^3.10.0" pytest-profiling = "^1.7.0" pytest-benchmark = "^4.0.0" [tool.poetry.group.docs.dependencies] -Sphinx = "4.5.0" -sphinx-rtd-theme = "1.1.1" -myst-parser = "^0.18.1" -sphinx-gallery = "^0.11.1" -pillow = "^9.4.0" -sphinx-autobuild = "^2021.3.14" +Sphinx = "7.2.6" +sphinx-rtd-theme = "2.0.0" +myst-parser = "^2.0.0" +sphinx-gallery = "^0.15.0" +pillow = "^10.3.0" +sphinx-autobuild = "^2024.4.16" [build-system] requires = ["poetry-core"] @@ -91,24 +90,8 @@ max-line-length = 99 [tool.ruff] src = ["statemachine"] -# Enable Pyflakes and pycodestyle rules. -select = [ - "E", # pycodestyle errors - "W", # pycodestyle warnings - "F", # pyflakes - "I", # isort - "UP", # pyupgrade - "C", # flake8-comprehensions - "B", # flake8-bugbear - "PT", # flake8-pytest-style -] -ignore = [ - "UP006", # `use-pep585-annotation` Requires Python3.9+ - "UP035", # `use-pep585-annotation` Requires Python3.9+ - "UP038", # `use-pep585-annotation` Requires Python3.9+ -] - line-length = 99 +target-version = "py312" # Exclude a variety of commonly ignored directories. exclude = [ @@ -131,19 +114,41 @@ exclude = [ "venv", ] +[tool.ruff.lint] + +# Enable Pyflakes and pycodestyle rules. +select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # pyflakes + "I", # isort + "UP", # pyupgrade + "C", # flake8-comprehensions + "B", # flake8-bugbear + "PT", # flake8-pytest-style +] +ignore = [ + "UP006", # `use-pep585-annotation` Requires Python3.9+ + "UP035", # `use-pep585-annotation` Requires Python3.9+ + "UP038", # `use-pep585-annotation` Requires Python3.9+ +] + # Allow unused variables when underscore-prefixed. dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" -# Assume Python 3.11. -target-version = "py311" +[tool.ruff.lint.per-file-ignores] +# Ignore `E402` (import violations) in all `__init__.py` files, and in `path/to/file.py`. +"__init__.py" = ["E402"] +"path/to/file.py" = ["E402"] +"tests/examples/**.py" = ["B018"] -[tool.ruff.mccabe] +[tool.ruff.lint.mccabe] max-complexity = 6 -[tool.ruff.isort] +[tool.ruff.lint.isort] force-single-line = true -[tool.ruff.pydocstyle] +[tool.ruff.lint.pydocstyle] # Use Google-style docstrings. convention = "google" diff --git a/statemachine/callbacks.py b/statemachine/callbacks.py index 6b7330b..20d9126 100644 --- a/statemachine/callbacks.py +++ b/statemachine/callbacks.py @@ -85,9 +85,7 @@ def build(self, resolver) -> "CallbackWrapper | None": if not self.suppress_errors: raise AttrNotFound( - _("Did not found name '{}' from model or statemachine").format( - self.func - ) + _("Did not found name '{}' from model or statemachine").format(self.func) ) return None @@ -226,9 +224,7 @@ def add(self, items: CallbackMetaList, resolver: Callable): def call(self, *args, **kwargs): return [ - callback(*args, **kwargs) - for callback in self - if callback.condition(*args, **kwargs) + callback(*args, **kwargs) for callback in self if callback.condition(*args, **kwargs) ] def all(self, *args, **kwargs): @@ -237,9 +233,7 @@ def all(self, *args, **kwargs): class CallbacksRegistry: def __init__(self) -> None: - self._registry: Dict[CallbackMetaList, CallbacksExecutor] = defaultdict( - CallbacksExecutor - ) + self._registry: Dict[CallbackMetaList, CallbacksExecutor] = defaultdict(CallbacksExecutor) def register(self, callbacks: CallbackMetaList, resolver): executor_list = self[callbacks] diff --git a/statemachine/dispatcher.py b/statemachine/dispatcher.py index a5b8785..1fed97b 100644 --- a/statemachine/dispatcher.py +++ b/statemachine/dispatcher.py @@ -101,9 +101,7 @@ def search_callable(attr, *configs) -> WrapSearchResult: func = config.getattr(attr) if func is not None: if not callable(func): - return AttributeCallableSearchResult( - attr, config.obj, config.resolver_id - ) + return AttributeCallableSearchResult(attr, config.obj, config.resolver_id) if getattr(func, "_is_sm_event", False): return EventSearchResult(attr, func, config.resolver_id) diff --git a/statemachine/factory.py b/statemachine/factory.py index 009c741..8535444 100644 --- a/statemachine/factory.py +++ b/statemachine/factory.py @@ -54,8 +54,7 @@ def __init__( if TYPE_CHECKING: """Makes mypy happy with dynamic created attributes""" - def __getattr__(self, attribute: str) -> Any: - ... + def __getattr__(self, attribute: str) -> Any: ... def _check(cls): has_states = bool(cls.states) @@ -96,9 +95,9 @@ def _check_final_states(cls): if final_state_with_invalid_transitions: raise InvalidDefinition( - _( - "Cannot declare transitions from final state. Invalid state(s): {}" - ).format([s.id for s in final_state_with_invalid_transitions]) + _("Cannot declare transitions from final state. Invalid state(s): {}").format( + [s.id for s in final_state_with_invalid_transitions] + ) ) def _check_trap_states(cls): @@ -131,8 +130,7 @@ def _states_without_path_to_final_states(cls): return [ state for state in cls.states - if not state.final - and not any(s.final for s in visit_connected_states(state)) + if not state.final and not any(s.final for s in visit_connected_states(state)) ] def _disconnected_states(cls, starting_state): diff --git a/statemachine/mixins.py b/statemachine/mixins.py index d365999..8d1b26d 100644 --- a/statemachine/mixins.py +++ b/statemachine/mixins.py @@ -20,9 +20,7 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if not self.state_machine_name: raise ValueError( - _("{!r} is not a valid state machine name.").format( - self.state_machine_name - ) + _("{!r} is not a valid state machine name.").format(self.state_machine_name) ) machine_cls = registry.get_machine_cls(self.state_machine_name) setattr( diff --git a/statemachine/signature.py b/statemachine/signature.py index 9afa06b..60f5aeb 100644 --- a/statemachine/signature.py +++ b/statemachine/signature.py @@ -22,7 +22,6 @@ def _make_key(method): def signature_cache(user_function): - cache = {} cache_get = cache.get @@ -113,8 +112,7 @@ def bind_expected(self, *args: Any, **kwargs: Any) -> BoundArguments: # noqa: C parameters_ex = (param,) break elif ( - param.kind == Parameter.VAR_KEYWORD - or param.default is not Parameter.empty + param.kind == Parameter.VAR_KEYWORD or param.default is not Parameter.empty ): # That's fine too - we have a default value for this # parameter. So, lets start parsing `kwargs`, starting diff --git a/statemachine/state.py b/statemachine/state.py index ad6073d..b43f8d2 100644 --- a/statemachine/state.py +++ b/statemachine/state.py @@ -111,9 +111,7 @@ def __init__( self.exit = CallbackMetaList().add(exit) def __eq__(self, other): - return ( - isinstance(other, State) and self.name == other.name and self.id == other.id - ) + return isinstance(other, State) and self.name == other.name and self.id == other.id def __hash__(self): return hash(repr(self)) @@ -124,13 +122,9 @@ def _setup(self, register): return self def _add_observer(self, registry): - self.enter.add( - "on_enter_state", registry=registry, prepend=True, suppress_errors=True - ) + self.enter.add("on_enter_state", registry=registry, prepend=True, suppress_errors=True) self.enter.add(f"on_enter_{self.id}", registry=registry, suppress_errors=True) - self.exit.add( - "on_exit_state", registry=registry, prepend=True, suppress_errors=True - ) + self.exit.add("on_exit_state", registry=registry, prepend=True, suppress_errors=True) self.exit.add(f"on_exit_{self.id}", registry=registry, suppress_errors=True) def __repr__(self): @@ -146,14 +140,10 @@ def __get__(self, machine, owner): def __set__(self, instance, value): raise StateMachineError( - _("State overriding is not allowed. Trying to add '{}' to {}").format( - value, self.id - ) + _("State overriding is not allowed. Trying to add '{}' to {}").format(value, self.id) ) - def for_instance( - self, machine: "StateMachine", cache: Dict["State", "State"] - ) -> "State": + def for_instance(self, machine: "StateMachine", cache: Dict["State", "State"]) -> "State": if self not in cache: cache[self] = InstanceState(self, machine) @@ -171,9 +161,7 @@ def _set_id(self, id: str): self.name = self._id.replace("_", " ").capitalize() def _to_(self, *states: "State", **kwargs): - transitions = TransitionList( - Transition(self, state, **kwargs) for state in states - ) + transitions = TransitionList(Transition(self, state, **kwargs) for state in states) self.transitions.add_transitions(transitions) return transitions diff --git a/statemachine/statemachine.py b/statemachine/statemachine.py index 9b25501..d0ccfae 100644 --- a/statemachine/statemachine.py +++ b/statemachine/statemachine.py @@ -78,9 +78,7 @@ def __init__( if self._abstract: raise InvalidDefinition(_("There are no states or transitions.")) - initial_transition = Transition( - None, self._get_initial_state(), event="__initial__" - ) + initial_transition = Transition(None, self._get_initial_state(), event="__initial__") self._setup(initial_transition) self._activate_initial_state(initial_transition) @@ -91,8 +89,7 @@ def __init_subclass__(cls, strict_states: bool = False): if TYPE_CHECKING: """Makes mypy happy with dynamic created attributes""" - def __getattr__(self, attribute: str) -> Any: - ... + def __getattr__(self, attribute: str) -> Any: ... def __repr__(self): current_state_id = self.current_state.id if self.current_state_value else None @@ -102,9 +99,7 @@ def __repr__(self): ) def _get_initial_state(self): - current_state_value = ( - self.start_value if self.start_value else self.initial_state.value - ) + current_state_value = self.start_value if self.start_value else self.initial_state.value try: return self.states_map[current_state_value] except KeyError as err: @@ -252,10 +247,7 @@ def events(self): @property def allowed_events(self): """List of the current allowed events.""" - return [ - getattr(self, event) - for event in self.current_state.transitions.unique_events - ] + return [getattr(self, event) for event in self.current_state.transitions.unique_events] def _process(self, trigger): """Process event triggers. diff --git a/statemachine/transition.py b/statemachine/transition.py index 1eebb36..491dab1 100644 --- a/statemachine/transition.py +++ b/statemachine/transition.py @@ -48,7 +48,6 @@ def __init__( before=None, after=None, ): - self.source = source self.target = target self.internal = internal @@ -62,9 +61,7 @@ def __init__( self.on = CallbackMetaList().add(on) self.after = CallbackMetaList().add(after) self.cond = ( - CallbackMetaList(factory=BoolCallbackMeta) - .add(cond) - .add(unless, expected_value=False) + CallbackMetaList(factory=BoolCallbackMeta).add(cond).add(unless, expected_value=False) ) def __repr__(self): @@ -84,9 +81,7 @@ def _add_observer(self, registry): before = self.before.add on = self.on.add after = self.after.add - before( - "before_transition", registry=registry, suppress_errors=True, prepend=True - ) + before("before_transition", registry=registry, suppress_errors=True, prepend=True) on("on_transition", registry=registry, suppress_errors=True, prepend=True) for event in self._events: diff --git a/tests/conftest.py b/tests/conftest.py index f3413df..63e4687 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -4,7 +4,7 @@ import pytest # We support Python 3.8+ positional only syntax -if sys.version_info[:2] < (3, 8): +if sys.version_info[:2] < (3, 8): # noqa: UP036 collect_ignore_glob = ["*_positional_only.py"] @@ -21,6 +21,7 @@ def campaign_machine(): class CampaignMachine(StateMachine): "A workflow machine" + draft = State(initial=True) producing = State("Being produced") closed = State(final=True) @@ -40,6 +41,7 @@ def campaign_machine_with_validator(): class CampaignMachine(StateMachine): "A workflow machine" + draft = State(initial=True) producing = State("Being produced") closed = State(final=True) @@ -63,6 +65,7 @@ def campaign_machine_with_final_state(): class CampaignMachine(StateMachine): "A workflow machine" + draft = State(initial=True) producing = State("Being produced") closed = State(final=True) @@ -82,6 +85,7 @@ def campaign_machine_with_values(): class CampaignMachineWithKeys(StateMachine): "A workflow machine" + draft = State(initial=True, value=1) producing = State("Being produced", value=2) closed = State(value=3, final=True) @@ -138,17 +142,13 @@ def reverse_traffic_light_machine(): class ReverseTrafficLightMachine(StateMachine): "A traffic light machine" + green = State(initial=True) yellow = State() red = State() stop = red.from_(yellow, green, red) - cycle = ( - green.from_(red) - | yellow.from_(green) - | red.from_(yellow) - | red.from_.itself() - ) + cycle = green.from_(red) | yellow.from_(green) | red.from_(yellow) | red.from_.itself() return ReverseTrafficLightMachine @@ -160,6 +160,7 @@ def approval_machine(current_time): # noqa: C901 class ApprovalMachine(StateMachine): "A workflow machine" + requested = State(initial=True) accepted = State() rejected = State() diff --git a/tests/examples/all_actions_machine.py b/tests/examples/all_actions_machine.py index f5760d1..cf89cfa 100644 --- a/tests/examples/all_actions_machine.py +++ b/tests/examples/all_actions_machine.py @@ -5,6 +5,7 @@ A StateMachine that exercises all possible :ref:`Actions` and :ref:`Guards`. """ + from unittest import mock from statemachine import State @@ -12,7 +13,6 @@ class AllActionsMachine(StateMachine): - initial = State(initial=True) final = State(final=True) diff --git a/tests/examples/enum_campaign_machine.py b/tests/examples/enum_campaign_machine.py index c88f10d..3ff76a5 100644 --- a/tests/examples/enum_campaign_machine.py +++ b/tests/examples/enum_campaign_machine.py @@ -6,6 +6,7 @@ ``States`` definition. """ + from enum import Enum from statemachine import StateMachine diff --git a/tests/examples/guess_the_number_machine.py b/tests/examples/guess_the_number_machine.py index df6c970..7f5e852 100644 --- a/tests/examples/guess_the_number_machine.py +++ b/tests/examples/guess_the_number_machine.py @@ -7,6 +7,7 @@ Well leave the machine imagine a number and also play the game. Why not? """ + import random from statemachine import State @@ -14,7 +15,6 @@ class GuessTheNumberMachine(StateMachine): - start = State(initial=True) low = State() high = State() diff --git a/tests/examples/order_control_machine.py b/tests/examples/order_control_machine.py index c9b192b..162e4a8 100644 --- a/tests/examples/order_control_machine.py +++ b/tests/examples/order_control_machine.py @@ -5,6 +5,7 @@ An StateMachine that demonstrates :ref:`Guards` being used to control the state flow. """ + from statemachine import State from statemachine import StateMachine diff --git a/tests/examples/order_control_rich_model_machine.py b/tests/examples/order_control_rich_model_machine.py index f5899cc..8b7c2d5 100644 --- a/tests/examples/order_control_rich_model_machine.py +++ b/tests/examples/order_control_rich_model_machine.py @@ -5,6 +5,7 @@ An StateMachine that demonstrates :ref:`Actions` being used on a rich model. """ + from statemachine import State from statemachine import StateMachine from statemachine.exceptions import AttrNotFound diff --git a/tests/examples/persistent_model_machine.py b/tests/examples/persistent_model_machine.py index ddf86f2..c382333 100644 --- a/tests/examples/persistent_model_machine.py +++ b/tests/examples/persistent_model_machine.py @@ -71,12 +71,10 @@ def state(self, value): self._write_state(value) @abstractmethod - def _read_state(self): - ... + def _read_state(self): ... @abstractmethod - def _write_state(self, value): - ... + def _write_state(self, value): ... # %% diff --git a/tests/examples/traffic_light_machine.py b/tests/examples/traffic_light_machine.py index d554ea1..8d93584 100644 --- a/tests/examples/traffic_light_machine.py +++ b/tests/examples/traffic_light_machine.py @@ -21,12 +21,14 @@ between states. """ + from statemachine import State from statemachine import StateMachine class TrafficLightMachine(StateMachine): "A traffic light machine" + green = State(initial=True) yellow = State() red = State() @@ -63,6 +65,7 @@ def on_exit_red(self): class TrafficLightIsolatedTransitions(StateMachine): "A traffic light machine" + green = State(initial=True) yellow = State() red = State() diff --git a/tests/test_callbacks.py b/tests/test_callbacks.py index 39b4cf4..ab2ecea 100644 --- a/tests/test_callbacks.py +++ b/tests/test_callbacks.py @@ -22,9 +22,7 @@ def __init__(self): ["life_meaning", "name", "a_method"], ) self.registry = CallbacksRegistry() - self.executor = self.registry.register( - self.callbacks, resolver=resolver_factory(self) - ) + self.executor = self.registry.register(self.callbacks, resolver=resolver_factory(self)) @property def life_meaning(self): @@ -115,9 +113,7 @@ def test_raise_error_if_didnt_found_attr(self, suppress_errors): register = registry.build_register_function_for_resolver(resolver_factory(self)) if suppress_errors: - callbacks.add( - "this_does_no_exist", registry=register, suppress_errors=suppress_errors - ) + callbacks.add("this_does_no_exist", registry=register, suppress_errors=suppress_errors) else: with pytest.raises(InvalidDefinition): callbacks.add( @@ -185,7 +181,6 @@ def race_uppercase(race): def test_decorate_unbounded_machine_methods(self): class MiniHeroJourneyMachine(StateMachine, strict_states=False): - ordinary_world = State(initial=True) call_to_adventure = State() refusal_of_call = State() diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 87843ad..912a97c 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -65,9 +65,7 @@ def test_retrieve_a_callable_from_a_property_name(self, args, kwargs): assert method(*args, **kwargs) == "Frodo" - def test_retrieve_callable_from_a_property_name_that_should_keep_reference( - self, args, kwargs - ): + def test_retrieve_callable_from_a_property_name_that_should_keep_reference(self, args, kwargs): model = Person("Frodo", "Bolseiro") method = search_callable("first_name", ObjectConfig.from_obj(model)).wrap() diff --git a/tests/test_events.py b/tests/test_events.py index 8ff0fd7..19a6396 100644 --- a/tests/test_events.py +++ b/tests/test_events.py @@ -5,6 +5,7 @@ def test_assign_events_on_transitions(): class TrafficLightMachine(StateMachine): "A traffic light machine" + green = State(initial=True) yellow = State() red = State() diff --git a/tests/test_mock_compatibility.py b/tests/test_mock_compatibility.py index abefd0d..ac5273f 100644 --- a/tests/test_mock_compatibility.py +++ b/tests/test_mock_compatibility.py @@ -4,8 +4,7 @@ def test_minimal(mocker): class Observer: - def on_enter_state(self, event, model, source, target, state): - ... + def on_enter_state(self, event, model, source, target, state): ... obs = Observer() on_enter_state = mocker.spy(obs, "on_enter_state") diff --git a/tests/test_multiple_destinations.py b/tests/test_multiple_destinations.py index 0f7d2ce..0ae60f6 100644 --- a/tests/test_multiple_destinations.py +++ b/tests/test_multiple_destinations.py @@ -51,6 +51,7 @@ def test_transition_should_choose_final_state_on_multiple_possibilities( def test_transition_to_first_that_executes_if_multiple_targets(): class ApprovalMachine(StateMachine): "A workflow" + requested = State(initial=True) accepted = State(final=True) rejected = State(final=True) @@ -69,6 +70,7 @@ def never_will_pass(event_data): class ApprovalMachine(StateMachine): "A workflow" + requested = State(initial=True) accepted = State(final=True) rejected = State(final=True) @@ -96,13 +98,12 @@ def this_also_never_will_pass(self, event_data): def test_check_invalid_reference_to_conditions(): class ApprovalMachine(StateMachine): "A workflow" + requested = State(initial=True) accepted = State(final=True) rejected = State(final=True) - validate = requested.to(accepted, cond="not_found_condition") | requested.to( - rejected - ) + validate = requested.to(accepted, cond="not_found_condition") | requested.to(rejected) with pytest.raises(exceptions.InvalidDefinition): ApprovalMachine() @@ -111,15 +112,14 @@ class ApprovalMachine(StateMachine): def test_should_change_to_returned_state_on_multiple_target_with_combined_transitions(): class ApprovalMachine(StateMachine): "A workflow" + requested = State(initial=True) accepted = State() rejected = State() completed = State(final=True) validate = ( - requested.to(accepted, cond="is_ok") - | requested.to(rejected) - | accepted.to(completed) + requested.to(accepted, cond="is_ok") | requested.to(rejected) | accepted.to(completed) ) retry = rejected.to(requested) @@ -153,15 +153,11 @@ def on_validate(self): # then assert machine.completed.is_active - with pytest.raises( - exceptions.TransitionNotAllowed, match="Can't validate when in Completed." - ): + with pytest.raises(exceptions.TransitionNotAllowed, match="Can't validate when in Completed."): assert machine.validate() -def test_transition_on_execute_should_be_called_with_run_syntax( - approval_machine, current_time -): +def test_transition_on_execute_should_be_called_with_run_syntax(approval_machine, current_time): # given model = Request() machine = approval_machine(model) @@ -178,6 +174,7 @@ def test_transition_on_execute_should_be_called_with_run_syntax( def test_multiple_values_returned_with_multiple_targets(): class ApprovalMachine(StateMachine): "A workflow" + requested = State(initial=True) accepted = State(final=True) denied = State(final=True) @@ -201,19 +198,13 @@ def validate(self): (True, "failed"), ], ) -def test_multiple_targets_using_or_starting_from_same_origin( - payment_failed, expected_state -): +def test_multiple_targets_using_or_starting_from_same_origin(payment_failed, expected_state): class InvoiceStateMachine(StateMachine): unpaid = State(initial=True) paid = State(final=True) failed = State() - pay = ( - unpaid.to(paid, unless="payment_success") - | failed.to(paid) - | unpaid.to(failed) - ) + pay = unpaid.to(paid, unless="payment_success") | failed.to(paid) | unpaid.to(failed) def payment_success(self, event_data): return payment_failed diff --git a/tests/test_profiling.py b/tests/test_profiling.py index 8439526..9da99e3 100644 --- a/tests/test_profiling.py +++ b/tests/test_profiling.py @@ -42,7 +42,7 @@ def after_receive_payment(self): def exercise_order(): order = Order() - order.state_machine.waiting_for_payment.is_active + assert order.state_machine.waiting_for_payment.is_active def test_setup_performance(benchmark): diff --git a/tests/test_registry.py b/tests/test_registry.py index a572d74..cf0de25 100644 --- a/tests/test_registry.py +++ b/tests/test_registry.py @@ -10,6 +10,7 @@ def test_should_register_a_state_machine(caplog): class CampaignMachine(StateMachine): "A workflow machine" + draft = State(initial=True) producing = State() @@ -17,10 +18,7 @@ class CampaignMachine(StateMachine): produce = draft.to(producing) assert "CampaignMachine" in registry._REGISTRY - assert ( - registry.get_machine_cls("tests.test_registry.CampaignMachine") - == CampaignMachine - ) + assert registry.get_machine_cls("tests.test_registry.CampaignMachine") == CampaignMachine with pytest.warns(DeprecationWarning): assert registry.get_machine_cls("CampaignMachine") == CampaignMachine @@ -45,9 +43,7 @@ def django_autodiscover_modules(): sys.modules["django"] = django sys.modules["django.utils.module_loading"] = module_loading - with mock.patch( - "statemachine.registry.autodiscover_modules", new=auto_discover_modules - ): + with mock.patch("statemachine.registry.autodiscover_modules", new=auto_discover_modules): yield auto_discover_modules del sys.modules["django"] diff --git a/tests/test_rtc.py b/tests/test_rtc.py index d65bdb1..ab01f19 100644 --- a/tests/test_rtc.py +++ b/tests/test_rtc.py @@ -39,9 +39,7 @@ def on_enter_state(self, state: State, source: State, value: int = 0): ) def on_exit_state(self, state: State, source: State, value: int = 0): - return self.spy( - "on_exit_state", state=state.id, source=source.id, value=value - ) + return self.spy("on_exit_state", state=state.id, source=source.id, value=value) return ChainedSM @@ -82,9 +80,7 @@ def on_transition(self, event: str, source: State, target: State): return event def after_transition(self, event: str, source: State, target: State): - self.spy( - "after_transition", event=event, source=source.id, target=target.id - ) + self.spy("after_transition", event=event, source=source.id, target=target.id) return ChainedSM @@ -143,9 +139,7 @@ def test_should_allow_chaining_transitions_using_actions( ( True, [ - mock.call( - "on_enter_state", event="__initial__", state="s1", source="" - ), + mock.call("on_enter_state", event="__initial__", state="s1", source=""), mock.call("on_exit_state", event="t1", state="s1", target="s2"), mock.call("on_transition", event="t1", source="s1", target="s2"), mock.call("on_enter_state", event="t1", state="s2", source="s1"), @@ -153,15 +147,11 @@ def test_should_allow_chaining_transitions_using_actions( mock.call("on_exit_state", event="t2a", state="s2", target="s2"), mock.call("on_transition", event="t2a", source="s2", target="s2"), mock.call("on_enter_state", event="t2a", state="s2", source="s2"), - mock.call( - "after_transition", event="t2a", source="s2", target="s2" - ), + mock.call("after_transition", event="t2a", source="s2", target="s2"), mock.call("on_exit_state", event="t2b", state="s2", target="s3"), mock.call("on_transition", event="t2b", source="s2", target="s3"), mock.call("on_enter_state", event="t2b", state="s3", source="s2"), - mock.call( - "after_transition", event="t2b", source="s2", target="s3" - ), + mock.call("after_transition", event="t2b", source="s2", target="s3"), mock.call("on_exit_state", event="t3", state="s3", target="s4"), mock.call("on_transition", event="t3", source="s3", target="s4"), mock.call("on_enter_state", event="t3", state="s4", source="s3"), diff --git a/tests/test_signature.py b/tests/test_signature.py index 175d2e2..aec4ff5 100644 --- a/tests/test_signature.py +++ b/tests/test_signature.py @@ -147,7 +147,6 @@ class TestSignatureAdapter: ], ) def test_wrap_fn_single_positional_parameter(self, func, args, kwargs, expected): - wrapped_func = SignatureAdapter.wrap(func) assert wrapped_func.__name__ == func.__name__ diff --git a/tests/test_state.py b/tests/test_state.py index fc08ba0..ba6ff46 100644 --- a/tests/test_state.py +++ b/tests/test_state.py @@ -19,7 +19,6 @@ class SM(StateMachine): class TestState: def test_name_derived_from_id(self, sm_class): - assert sm_class.pending.name == "Pending" assert sm_class.waiting_approval.name == "Waiting approval" assert sm_class.approved.name == "Approved" diff --git a/tests/test_state_callbacks.py b/tests/test_state_callbacks.py index 79e7618..cb6fb55 100644 --- a/tests/test_state_callbacks.py +++ b/tests/test_state_callbacks.py @@ -15,6 +15,7 @@ def traffic_light_machine(event_mock): # noqa: C901 class TrafficLightMachineStateEvents(StateMachine): "A traffic light machine" + green = State(initial=True) yellow = State() red = State() @@ -49,9 +50,7 @@ def on_exit_red(self): class TestStateCallbacks: - def test_should_call_on_enter_generic_state( - self, event_mock, traffic_light_machine - ): + def test_should_call_on_enter_generic_state(self, event_mock, traffic_light_machine): machine = traffic_light_machine() machine.cycle() assert event_mock.on_enter_state.call_args_list == [ @@ -64,23 +63,17 @@ def test_should_call_on_exit_generic_state(self, event_mock, traffic_light_machi machine.cycle() event_mock.on_exit_state.assert_called_once_with(machine.green) - def test_should_call_on_enter_of_specific_state( - self, event_mock, traffic_light_machine - ): + def test_should_call_on_enter_of_specific_state(self, event_mock, traffic_light_machine): machine = traffic_light_machine() machine.cycle() event_mock.on_enter_yellow.assert_called_once_with(machine) - def test_should_call_on_exit_of_specific_state( - self, event_mock, traffic_light_machine - ): + def test_should_call_on_exit_of_specific_state(self, event_mock, traffic_light_machine): machine = traffic_light_machine() machine.cycle() event_mock.on_exit_green.assert_called_once_with(machine) - def test_should_be_on_the_previous_state_when_exiting( - self, event_mock, traffic_light_machine - ): + def test_should_be_on_the_previous_state_when_exiting(self, event_mock, traffic_light_machine): machine = traffic_light_machine() def assert_is_green_from_state(s): @@ -94,9 +87,7 @@ def assert_is_green(m): machine.cycle() - def test_should_be_on_the_next_state_when_entering( - self, event_mock, traffic_light_machine - ): + def test_should_be_on_the_next_state_when_entering(self, event_mock, traffic_light_machine): machine = traffic_light_machine() def assert_is_yellow_from_state(s): diff --git a/tests/test_statemachine.py b/tests/test_statemachine.py index b1765dc..5661c35 100644 --- a/tests/test_statemachine.py +++ b/tests/test_statemachine.py @@ -39,6 +39,7 @@ def test_machine_should_only_allow_only_one_initial_state(): class CampaignMachine(StateMachine): "A workflow machine" + draft = State(initial=True) producing = State() closed = State( @@ -53,6 +54,7 @@ class CampaignMachine(StateMachine): def test_machine_should_activate_initial_state(): class CampaignMachine(StateMachine): "A workflow machine" + producing = State() closed = State(final=True) draft = State(initial=True) @@ -72,6 +74,7 @@ def test_machine_should_not_allow_transitions_from_final_state(): class CampaignMachine(StateMachine): "A workflow machine" + draft = State(initial=True) producing = State() closed = State(final=True) @@ -145,7 +148,6 @@ def test_should_change_state_with_multiple_machine_instances(campaign_machine): def test_call_to_transition_that_is_not_in_the_current_state_should_raise_exception( campaign_machine, current_state, transition ): - model = MyModel(state=current_state) machine = campaign_machine(model) @@ -156,7 +158,6 @@ def test_call_to_transition_that_is_not_in_the_current_state_should_raise_except def test_machine_should_list_allowed_events_in_the_current_state(campaign_machine): - model = MyModel() machine = campaign_machine(model) @@ -175,7 +176,6 @@ def test_machine_should_list_allowed_events_in_the_current_state(campaign_machin def test_machine_should_run_a_transition_by_his_key(campaign_machine): - model = MyModel() machine = campaign_machine(model) @@ -305,9 +305,7 @@ def test_state_machine_with_a_start_value(request, model, machine_name, start_va (MyModel(), "campaign_machine_with_values", 99), ], ) -def test_state_machine_with_a_invalid_start_value( - request, model, machine_name, start_value -): +def test_state_machine_with_a_invalid_start_value(request, model, machine_name, start_value): machine_cls = request.getfixturevalue(machine_name) with pytest.raises(exceptions.InvalidStateValue): machine_cls(model, start_value=start_value) @@ -316,6 +314,7 @@ def test_state_machine_with_a_invalid_start_value( def test_should_not_create_instance_of_abstract_machine(): class EmptyMachine(StateMachine): "An empty machine" + pass with pytest.raises(exceptions.InvalidDefinition): @@ -331,16 +330,15 @@ class OnlyTransitionMachine(StateMachine): def test_should_not_create_instance_of_machine_without_transitions(): - with pytest.raises(exceptions.InvalidDefinition): class NoTransitionsMachine(StateMachine): "A machine without transitions" + initial = State(initial=True) def test_should_not_create_disconnected_machine(): - expected = ( r"There are unreachable states. The statemachine graph should have a single component. " r"Disconnected states: \['blue'\]" @@ -349,6 +347,7 @@ def test_should_not_create_disconnected_machine(): class BrokenTrafficLightMachine(StateMachine): "A broken traffic light machine" + green = State(initial=True) yellow = State() blue = State() # This state is unreachable @@ -365,6 +364,7 @@ def test_should_not_create_big_disconnected_machine(): class BrokenTrafficLightMachine(StateMachine): "A broken traffic light machine" + green = State(initial=True) yellow = State() magenta = State() # This state is unreachable @@ -401,12 +401,8 @@ def test_final_states(campaign_machine_with_final_state): def test_should_not_override_states_properties(campaign_machine): - machine = campaign_machine() with pytest.raises(exceptions.StateMachineError) as e: machine.draft = "something else" - assert ( - "State overriding is not allowed. Trying to add 'something else' to draft" - in str(e) - ) + assert "State overriding is not allowed. Trying to add 'something else' to draft" in str(e) diff --git a/tests/test_transitions.py b/tests/test_transitions.py index 1373840..156f742 100644 --- a/tests/test_transitions.py +++ b/tests/test_transitions.py @@ -40,9 +40,7 @@ def test_transition_as_decorator_should_call_method_before_activating_state( ): machine = traffic_light_machine() assert machine.current_state == machine.green - assert ( - machine.cycle(1, 2, number=3, text="x") == "Running cycle from green to yellow" - ) + assert machine.cycle(1, 2, number=3, text="x") == "Running cycle from green to yellow" assert machine.current_state == machine.yellow @@ -76,6 +74,7 @@ def transition_callback_machine(request): class ApprovalMachine(StateMachine): "A workflow" + requested = State(initial=True) accepted = State(final=True) @@ -89,6 +88,7 @@ def on_validate(self): class ApprovalMachine(StateMachine): "A workflow" + requested = State(initial=True) accepted = State(final=True) @@ -113,6 +113,7 @@ def test_statemachine_transition_callback(transition_callback_machine): def test_can_run_combined_transitions(): class CampaignMachine(StateMachine): "A workflow machine" + draft = State(initial=True) producing = State() closed = State() @@ -128,7 +129,6 @@ class CampaignMachine(StateMachine): def test_can_detect_stuck_states(): - with pytest.raises( InvalidDefinition, match="All non-final states should have at least one outgoing transition.", @@ -136,6 +136,7 @@ def test_can_detect_stuck_states(): class CampaignMachine(StateMachine, strict_states=True): "A workflow machine" + draft = State(initial=True) producing = State() paused = State() @@ -147,7 +148,6 @@ class CampaignMachine(StateMachine, strict_states=True): def test_can_detect_unreachable_final_states(): - with pytest.raises( InvalidDefinition, match="All non-final states should have at least one path to a final state.", @@ -155,6 +155,7 @@ def test_can_detect_unreachable_final_states(): class CampaignMachine(StateMachine, strict_states=True): "A workflow machine" + draft = State(initial=True) producing = State() paused = State() @@ -168,6 +169,7 @@ class CampaignMachine(StateMachine, strict_states=True): def test_transitions_to_the_same_estate_as_itself(): class CampaignMachine(StateMachine): "A workflow machine" + draft = State(initial=True) producing = State() closed = State() @@ -212,6 +214,7 @@ def test_should_transition_with_a_dict_as_return(): class ApprovalMachine(StateMachine): "A workflow" + requested = State(initial=True) accepted = State(final=True) rejected = State(final=True) @@ -239,7 +242,6 @@ class TestInternalTransition: def test_should_not_execute_state_actions_on_internal_transitions( self, internal, expected_calls ): - calls = [] class TestStateMachine(StateMachine): @@ -259,7 +261,6 @@ def on_enter_initial(self): assert calls == expected_calls def test_should_not_allow_internal_transitions_from_distinct_states(self): - with pytest.raises( InvalidDefinition, match="Internal transitions should be self-transitions." ): @@ -278,9 +279,7 @@ def test_send_unknown_event(self, classic_traffic_light_machine): sm.send("unknow_event") assert sm.green.is_active - def test_send_not_valid_for_the_current_state_event( - self, classic_traffic_light_machine - ): + def test_send_not_valid_for_the_current_state_event(self, classic_traffic_light_machine): sm = classic_traffic_light_machine(allow_event_without_transition=True) assert sm.green.is_active sm.stop()