From f341e41a41c0570b421cccaeb948091e6dcfd184 Mon Sep 17 00:00:00 2001 From: Tomas Mikuska Date: Tue, 17 Mar 2026 15:32:22 +0100 Subject: [PATCH] SIMPLE-7211 - Add node clone image API call * Expose all operational data in sync call * Allow passing arbitrary PyATS parameters in run command * Configuration cleanup * Add missing attributes to join_existing_lab method * Fix type annotations for convergence wait time * Remove unnecessary trailing slashes Add support for starting index when connecting nodes (#126) SIMPLE-7357 - Advanced group permissions SIMPLE-7357 - Advanced group permissions update * Fix deprecated endpoints and remove missed trailing slashes SIMPLE-6003 - Improve node __repr__ readability * Switch all __repr__ to f-strings and shorten to useful info * Simplify node constructor for manual use Add params to connection function (#134) * Add ability to update multiple lab properties SIMPLE-7411 - Support tar file upload for Docker SIMPLE-7407 - Diagnostics in client (#138) SIMPLE-7496 - Deprecate get_diagnostics with no args (#139) * Remove unused group permissions * Rename modules to singular * Fix docstring indentation and content * Raise LabNotFound only on 404 Not Found SIMPLE-7569 - API changes for RBAC (#141) SIMPLE-7622 - Fix GET NodeDefinition API call (#145) SIMPLE-7461 - Consolidate exceptions (#144) SIMPLE-7433 - Show all running nodes in compute hosts sysadmin (#146) * Fix image definition download with YAML response * Workaround for previous CML releases SIMPLE-7745 - Allow .tar.gz image file extension (#147) SIMPLE-7783 - Use test_data_dir fixture, allow Path for image upload (#148) SIMPLE-6967 - Add pubkey for user create/update and testbed key_path setting (#151) SIMPLE-7758 - Add client type identifier (#149) * Fix CVE-2024-47081 SIMPLE-7993 - Deprecate original module names (#156) * Fix CVE-2025-50181, CVE-2025-50182 SIMPLE-8002 - Exclude unneeded files (#161) SIMPLE-8052 - Fix None fields (#162) SIMPLE-7778 - Update Poetry to version 2 (#163) * Update CML version to 2.10 * Rework mechanism to check incompatible versions SIMPLE-7926 - Fix PCL operational data storage (#157) SIMPLE-7927 - Fix system management controller property compute load * Fix invalid external connector references Fix PCL node configuration confusion with Main and default (#166) SIMPLE-8078 - PCL support for lab repositories (#165) Make client version check optional, rearrange attribute setting in init (#169) CMLDEV-95 - Remove deprecated structures (#170) CMLDEV-377 - Support for clearing discovered addresses (#167) CMLDEV-587 - Extend link conditioning parameters (#174) * Allow unsetting link conditioning properties CMLDEV-617 - Drop support for Python 3.9 (#175) * Add support for Python 3.14 CMLDEV-655 - Refactor opt-in to enum (#178) * Add telemetry support CMLDEV-12 - Add serial console switching for pyATS connections (#177) CMLDEV-376 - Fix pyATS relogin after node stop and start (#176) CMLDEV-23 - Clean pyATS loggers (#179) CMLDEV-531 - Implement lab_autostart support (#172) CMLDEV-537 - Implement node-staging feature (#173) CMLDEV-702 - Fix pyATS console switching (#184) * Default pyATS terminal server SSH options disable agents and identities * Improve disconnect detection and reconnect CMLDEV-575 - PCAP support (#186) CMLDEV-727 - JWT authentication (#182) CMLDEV-777 - Refactor configuration handling * Reduce complexity of _get_configuration * Move config methods to ClientConfig * Resolve pyATS inconsistencies CMLDEV-727 - Revert old authentication for previous CML releases (#189) CMLDEV-786 - Switch to using link ID as capture key (#188) * Remove the never-released capture key method CMLDEV-428 - Make pyATS configurable per node image definition (#190) CMLDEV-690 - Add pyATS enable password configurable per node Move deprecation warning for configuration via input (#191) CMLDEV-689 - Implement RADIUS auth (#192) CMLDEV-489 - Add timeout property to LDAP auth and fix password setter * Fix opt_in coercion for UserManagement payloads * Fix documentation and deprecation warning correctness * Update cryptography to fix vulnerabilities * Deprecate USER_LIST diagnostics CMLDEV-910 - Raise APIError when JWT is incorrect and credentials not provided (#194) Fix bugs and apply improvements across client library (#197) * Fix PyatsException inheritance and ControllerNotFound instantiation * Fix sync_states staleness handling and _import_link parameter order * Refactor Annotation validation, Version comparisons, and get_lab_list * Optimize Node.next_available_interface with direct slicing Store users locally to improve performance when querying labs/nodes (#199) * Consolidate duplicated annotation properties --- .github/workflows/main.yml | 6 +- .pre-commit-config.yaml | 8 +- conftest.py | 2 +- docs/source/conf.py | 4 +- examples/licensing.py | 2 +- examples/link_conditioning.py | 2 +- examples/sample.py | 2 +- poetry.lock | 4037 ++++++++--------- pyproject.toml | 27 +- pytest.ini | 7 - tests/conftest.py | 52 +- tests/requirements.txt | 977 +--- tests/test_auth_management.py | 358 ++ tests/test_autostart.py | 167 + tests/test_client_library.py | 465 +- tests/test_client_library_labs.py | 147 +- tests/test_configuration.py | 273 +- tests/test_definitions.py | 2 +- tests/test_image_upload.py | 29 +- tests/test_node_staging.py | 281 ++ tests/test_pcap.py | 167 + tests/test_pyats.py | 176 + tests/test_system_lab_repositories.py | 410 ++ virl2_client/__init__.py | 2 +- virl2_client/event_handling.py | 5 +- virl2_client/event_listening.py | 4 +- virl2_client/exceptions.py | 15 +- virl2_client/models/__init__.py | 5 +- virl2_client/models/annotation.py | 276 +- virl2_client/models/auth_management.py | 85 +- virl2_client/models/authentication.py | 25 +- virl2_client/models/cl_pyats.py | 192 +- virl2_client/models/configuration.py | 145 - virl2_client/models/group.py | 5 +- virl2_client/models/groups.py | 2 +- virl2_client/models/interface.py | 108 +- virl2_client/models/lab.py | 352 +- virl2_client/models/lab_repository.py | 280 ++ virl2_client/models/licensing.py | 76 +- virl2_client/models/link.py | 172 +- virl2_client/models/node.py | 194 +- virl2_client/models/node_image_definition.py | 27 +- virl2_client/models/node_image_definitions.py | 2 +- virl2_client/models/resource_pool.py | 4 +- virl2_client/models/resource_pools.py | 2 +- virl2_client/models/smart_annotation.py | 4 +- virl2_client/models/system.py | 45 +- virl2_client/models/user.py | 80 +- virl2_client/models/users.py | 2 +- virl2_client/utils.py | 9 +- virl2_client/virl2_client.py | 410 +- 51 files changed, 5951 insertions(+), 4178 deletions(-) create mode 100644 tests/test_auth_management.py create mode 100644 tests/test_autostart.py create mode 100644 tests/test_node_staging.py create mode 100644 tests/test_pcap.py create mode 100644 tests/test_pyats.py create mode 100644 tests/test_system_lab_repositories.py delete mode 100644 virl2_client/models/configuration.py create mode 100644 virl2_client/models/lab_repository.py diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 81dfd554..59f9f03c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -19,12 +19,11 @@ jobs: strategy: matrix: python-version: - - "3.8" - - "3.9" - "3.10" - "3.11" - "3.12" - "3.13" + - "3.14" steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} @@ -32,18 +31,15 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Install dependencies - if: matrix.python-version != '3.8' run: | python -m pip install --upgrade pip pip install -r tests/requirements.txt - name: Lint with flake8 - if: matrix.python-version != '3.8' run: | # stop the build if there are Python syntax errors or undefined names flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest - if: matrix.python-version != '3.8' run: | pytest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 93601ca4..771dfe53 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,24 +4,24 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-added-large-files - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.9.7 + rev: v0.14.8 hooks: - id: ruff args: [ --fix ] - id: ruff-format - repo: https://github.com/PyCQA/isort - rev: 6.0.0 + rev: 7.0.0 hooks: - id: isort args: [--profile, black] - repo: https://github.com/psf/black - rev: 25.1.0 + rev: 25.11.0 hooks: - id: black language_version: python3 diff --git a/conftest.py b/conftest.py index d43dde27..ff330a41 100644 --- a/conftest.py +++ b/conftest.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # diff --git a/docs/source/conf.py b/docs/source/conf.py index 1a99b02a..eb1adeda 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Configuration file for the Sphinx documentation builder. @@ -26,7 +26,7 @@ # -- Project information ----------------------------------------------------- project = "virl2_client" -copyright = "Copyright (c) 2019-2025, Cisco Systems, Inc." +copyright = "Copyright (c) 2019-2026, Cisco Systems, Inc." author = "VIRL2 team " # The short X.Y version diff --git a/examples/licensing.py b/examples/licensing.py index 72ec93b7..9def54a5 100644 --- a/examples/licensing.py +++ b/examples/licensing.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform diff --git a/examples/link_conditioning.py b/examples/link_conditioning.py index ad796bb8..e956ec39 100644 --- a/examples/link_conditioning.py +++ b/examples/link_conditioning.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform diff --git a/examples/sample.py b/examples/sample.py index 895afbaa..dae457ea 100644 --- a/examples/sample.py +++ b/examples/sample.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform diff --git a/poetry.lock b/poetry.lock index 9162c9f4..7876ddc0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,16 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "aiofiles" -version = "24.1.0" +version = "25.1.0" description = "File support for asyncio." optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ - {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"}, - {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"}, + {file = "aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695"}, + {file = "aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2"}, ] [[package]] @@ -17,6 +19,8 @@ version = "2.6.1" description = "Happy Eyeballs for asyncio" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"events\"" files = [ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, @@ -24,97 +28,138 @@ files = [ [[package]] name = "aiohttp" -version = "3.11.18" +version = "3.13.3" description = "Async http client/server framework (asyncio)" optional = true python-versions = ">=3.9" -files = [ - {file = "aiohttp-3.11.18-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96264854fedbea933a9ca4b7e0c745728f01380691687b7365d18d9e977179c4"}, - {file = "aiohttp-3.11.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9602044ff047043430452bc3a2089743fa85da829e6fc9ee0025351d66c332b6"}, - {file = "aiohttp-3.11.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5691dc38750fcb96a33ceef89642f139aa315c8a193bbd42a0c33476fd4a1609"}, - {file = "aiohttp-3.11.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554c918ec43f8480b47a5ca758e10e793bd7410b83701676a4782672d670da55"}, - {file = "aiohttp-3.11.18-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a4076a2b3ba5b004b8cffca6afe18a3b2c5c9ef679b4d1e9859cf76295f8d4f"}, - {file = "aiohttp-3.11.18-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:767a97e6900edd11c762be96d82d13a1d7c4fc4b329f054e88b57cdc21fded94"}, - {file = "aiohttp-3.11.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0ddc9337a0fb0e727785ad4f41163cc314376e82b31846d3835673786420ef1"}, - {file = "aiohttp-3.11.18-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f414f37b244f2a97e79b98d48c5ff0789a0b4b4609b17d64fa81771ad780e415"}, - {file = "aiohttp-3.11.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fdb239f47328581e2ec7744ab5911f97afb10752332a6dd3d98e14e429e1a9e7"}, - {file = "aiohttp-3.11.18-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f2c50bad73ed629cc326cc0f75aed8ecfb013f88c5af116f33df556ed47143eb"}, - {file = "aiohttp-3.11.18-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a8d8f20c39d3fa84d1c28cdb97f3111387e48209e224408e75f29c6f8e0861d"}, - {file = "aiohttp-3.11.18-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:106032eaf9e62fd6bc6578c8b9e6dc4f5ed9a5c1c7fb2231010a1b4304393421"}, - {file = "aiohttp-3.11.18-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b491e42183e8fcc9901d8dcd8ae644ff785590f1727f76ca86e731c61bfe6643"}, - {file = "aiohttp-3.11.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad8c745ff9460a16b710e58e06a9dec11ebc0d8f4dd82091cefb579844d69868"}, - {file = "aiohttp-3.11.18-cp310-cp310-win32.whl", hash = "sha256:8e57da93e24303a883146510a434f0faf2f1e7e659f3041abc4e3fb3f6702a9f"}, - {file = "aiohttp-3.11.18-cp310-cp310-win_amd64.whl", hash = "sha256:cc93a4121d87d9f12739fc8fab0a95f78444e571ed63e40bfc78cd5abe700ac9"}, - {file = "aiohttp-3.11.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9"}, - {file = "aiohttp-3.11.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b"}, - {file = "aiohttp-3.11.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66"}, - {file = "aiohttp-3.11.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756"}, - {file = "aiohttp-3.11.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717"}, - {file = "aiohttp-3.11.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4"}, - {file = "aiohttp-3.11.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f"}, - {file = "aiohttp-3.11.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361"}, - {file = "aiohttp-3.11.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1"}, - {file = "aiohttp-3.11.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421"}, - {file = "aiohttp-3.11.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e"}, - {file = "aiohttp-3.11.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d"}, - {file = "aiohttp-3.11.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f"}, - {file = "aiohttp-3.11.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd"}, - {file = "aiohttp-3.11.18-cp311-cp311-win32.whl", hash = "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d"}, - {file = "aiohttp-3.11.18-cp311-cp311-win_amd64.whl", hash = "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6"}, - {file = "aiohttp-3.11.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2"}, - {file = "aiohttp-3.11.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508"}, - {file = "aiohttp-3.11.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e"}, - {file = "aiohttp-3.11.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f"}, - {file = "aiohttp-3.11.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f"}, - {file = "aiohttp-3.11.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec"}, - {file = "aiohttp-3.11.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6"}, - {file = "aiohttp-3.11.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009"}, - {file = "aiohttp-3.11.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4"}, - {file = "aiohttp-3.11.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9"}, - {file = "aiohttp-3.11.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb"}, - {file = "aiohttp-3.11.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda"}, - {file = "aiohttp-3.11.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1"}, - {file = "aiohttp-3.11.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea"}, - {file = "aiohttp-3.11.18-cp312-cp312-win32.whl", hash = "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8"}, - {file = "aiohttp-3.11.18-cp312-cp312-win_amd64.whl", hash = "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8"}, - {file = "aiohttp-3.11.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811"}, - {file = "aiohttp-3.11.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804"}, - {file = "aiohttp-3.11.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd"}, - {file = "aiohttp-3.11.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c"}, - {file = "aiohttp-3.11.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118"}, - {file = "aiohttp-3.11.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1"}, - {file = "aiohttp-3.11.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000"}, - {file = "aiohttp-3.11.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137"}, - {file = "aiohttp-3.11.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93"}, - {file = "aiohttp-3.11.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3"}, - {file = "aiohttp-3.11.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8"}, - {file = "aiohttp-3.11.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2"}, - {file = "aiohttp-3.11.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261"}, - {file = "aiohttp-3.11.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7"}, - {file = "aiohttp-3.11.18-cp313-cp313-win32.whl", hash = "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78"}, - {file = "aiohttp-3.11.18-cp313-cp313-win_amd64.whl", hash = "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01"}, - {file = "aiohttp-3.11.18-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:469ac32375d9a716da49817cd26f1916ec787fc82b151c1c832f58420e6d3533"}, - {file = "aiohttp-3.11.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3cec21dd68924179258ae14af9f5418c1ebdbba60b98c667815891293902e5e0"}, - {file = "aiohttp-3.11.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b426495fb9140e75719b3ae70a5e8dd3a79def0ae3c6c27e012fc59f16544a4a"}, - {file = "aiohttp-3.11.18-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad2f41203e2808616292db5d7170cccf0c9f9c982d02544443c7eb0296e8b0c7"}, - {file = "aiohttp-3.11.18-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bc0ae0a5e9939e423e065a3e5b00b24b8379f1db46046d7ab71753dfc7dd0e1"}, - {file = "aiohttp-3.11.18-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe7cdd3f7d1df43200e1c80f1aed86bb36033bf65e3c7cf46a2b97a253ef8798"}, - {file = "aiohttp-3.11.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5199be2a2f01ffdfa8c3a6f5981205242986b9e63eb8ae03fd18f736e4840721"}, - {file = "aiohttp-3.11.18-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ccec9e72660b10f8e283e91aa0295975c7bd85c204011d9f5eb69310555cf30"}, - {file = "aiohttp-3.11.18-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1596ebf17e42e293cbacc7a24c3e0dc0f8f755b40aff0402cb74c1ff6baec1d3"}, - {file = "aiohttp-3.11.18-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:eab7b040a8a873020113ba814b7db7fa935235e4cbaf8f3da17671baa1024863"}, - {file = "aiohttp-3.11.18-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:5d61df4a05476ff891cff0030329fee4088d40e4dc9b013fac01bc3c745542c2"}, - {file = "aiohttp-3.11.18-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:46533e6792e1410f9801d09fd40cbbff3f3518d1b501d6c3c5b218f427f6ff08"}, - {file = "aiohttp-3.11.18-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c1b90407ced992331dd6d4f1355819ea1c274cc1ee4d5b7046c6761f9ec11829"}, - {file = "aiohttp-3.11.18-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a2fd04ae4971b914e54fe459dd7edbbd3f2ba875d69e057d5e3c8e8cac094935"}, - {file = "aiohttp-3.11.18-cp39-cp39-win32.whl", hash = "sha256:b2f317d1678002eee6fe85670039fb34a757972284614638f82b903a03feacdc"}, - {file = "aiohttp-3.11.18-cp39-cp39-win_amd64.whl", hash = "sha256:5e7007b8d1d09bce37b54111f593d173691c530b80f27c6493b928dabed9e6ef"}, - {file = "aiohttp-3.11.18.tar.gz", hash = "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a"}, +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"events\"" +files = [ + {file = "aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7"}, + {file = "aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821"}, + {file = "aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11"}, + {file = "aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd"}, + {file = "aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c"}, + {file = "aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b"}, + {file = "aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64"}, + {file = "aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29"}, + {file = "aiohttp-3.13.3-cp311-cp311-win32.whl", hash = "sha256:a2212ad43c0833a873d0fb3c63fa1bacedd4cf6af2fee62bf4b739ceec3ab239"}, + {file = "aiohttp-3.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f"}, + {file = "aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c"}, + {file = "aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168"}, + {file = "aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a"}, + {file = "aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046"}, + {file = "aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57"}, + {file = "aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c"}, + {file = "aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9"}, + {file = "aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591"}, + {file = "aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf"}, + {file = "aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e"}, + {file = "aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808"}, + {file = "aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415"}, + {file = "aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43"}, + {file = "aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1"}, + {file = "aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984"}, + {file = "aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c"}, + {file = "aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592"}, + {file = "aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa"}, + {file = "aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767"}, + {file = "aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344"}, + {file = "aiohttp-3.13.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31a83ea4aead760dfcb6962efb1d861db48c34379f2ff72db9ddddd4cda9ea2e"}, + {file = "aiohttp-3.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:988a8c5e317544fdf0d39871559e67b6341065b87fceac641108c2096d5506b7"}, + {file = "aiohttp-3.13.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b174f267b5cfb9a7dba9ee6859cecd234e9a681841eb85068059bc867fb8f02"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:947c26539750deeaee933b000fb6517cc770bbd064bad6033f1cff4803881e43"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9ebf57d09e131f5323464bd347135a88622d1c0976e88ce15b670e7ad57e4bd6"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4ae5b5a0e1926e504c81c5b84353e7a5516d8778fbbff00429fe7b05bb25cbce"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2ba0eea45eb5cc3172dbfc497c066f19c41bac70963ea1a67d51fc92e4cf9a80"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bae5c2ed2eae26cc382020edad80d01f36cb8e746da40b292e68fec40421dc6a"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a60e60746623925eab7d25823329941aee7242d559baa119ca2b253c88a7bd6"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e50a2e1404f063427c9d027378472316201a2290959a295169bcf25992d04558"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:9a9dc347e5a3dc7dfdbc1f82da0ef29e388ddb2ed281bfce9dd8248a313e62b7"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b46020d11d23fe16551466c77823df9cc2f2c1e63cc965daf67fa5eec6ca1877"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:69c56fbc1993fa17043e24a546959c0178fe2b5782405ad4559e6c13975c15e3"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b99281b0704c103d4e11e72a76f1b543d4946fea7dd10767e7e1b5f00d4e5704"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:40c5e40ecc29ba010656c18052b877a1c28f84344825efa106705e835c28530f"}, + {file = "aiohttp-3.13.3-cp39-cp39-win32.whl", hash = "sha256:56339a36b9f1fc708260c76c87e593e2afb30d26de9ae1eb445b5e051b98a7a1"}, + {file = "aiohttp-3.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:c6b8568a3bb5819a0ad087f16d40e5a3fb6099f39ea1d5625a3edc1e923fc538"}, + {file = "aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88"}, ] [package.dependencies] -aiohappyeyeballs = ">=2.3.0" -aiosignal = ">=1.1.2" +aiohappyeyeballs = ">=2.5.0" +aiosignal = ">=1.4.0" async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" @@ -123,7 +168,7 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] +speedups = ["Brotli (>=1.2) ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "backports.zstd ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "brotlicffi (>=1.2) ; platform_python_implementation != \"CPython\""] [[package]] name = "aiosignal" @@ -131,6 +176,8 @@ version = "1.4.0" description = "aiosignal: a list of registered asynchronous callbacks" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"events\"" files = [ {file = "aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e"}, {file = "aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7"}, @@ -142,34 +189,36 @@ typing-extensions = {version = ">=4.2", markers = "python_version < \"3.13\""} [[package]] name = "alabaster" -version = "0.7.16" +version = "1.0.0" description = "A light, configurable Sphinx theme" optional = true -python-versions = ">=3.9" +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, - {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, + {file = "alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"}, + {file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"}, ] [[package]] name = "anyio" -version = "4.10.0" +version = "4.12.1" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ - {file = "anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1"}, - {file = "anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6"}, + {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, + {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" -sniffio = ">=1.1" typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -trio = ["trio (>=0.26.1)"] +trio = ["trio (>=0.31.0) ; python_version < \"3.10\"", "trio (>=0.32.0) ; python_version >= \"3.10\""] [[package]] name = "async-lru" @@ -177,6 +226,8 @@ version = "2.0.5" description = "Simple LRU cache for asyncio" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "async_lru-2.0.5-py3-none-any.whl", hash = "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943"}, {file = "async_lru-2.0.5.tar.gz", hash = "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb"}, @@ -191,6 +242,8 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(extra == \"pyats\" or extra == \"events\") and python_version == \"3.10\"" files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, @@ -198,51 +251,32 @@ files = [ [[package]] name = "attrs" -version = "25.3.0" +version = "25.4.0" description = "Classes Without Boilerplate" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"events\"" files = [ - {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, - {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, + {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, + {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, ] -[package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] - [[package]] name = "babel" version = "2.17.0" description = "Internationalization utilities" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, ] [package.extras] -dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] - -[[package]] -name = "backports-tarfile" -version = "1.2.0" -description = "Backport of CPython tarfile module" -optional = false -python-versions = ">=3.8" -files = [ - {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, - {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)"] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] [[package]] name = "bidict" @@ -250,153 +284,133 @@ version = "0.23.1" description = "The bidirectional mapping library for Python." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5"}, {file = "bidict-0.23.1.tar.gz", hash = "sha256:03069d763bc387bbd20e7d49914e75fc4132a41937fa3405417e1a5a2d006d71"}, ] -[[package]] -name = "build" -version = "1.3.0" -description = "A simple, correct Python build frontend" -optional = false -python-versions = ">=3.9" -files = [ - {file = "build-1.3.0-py3-none-any.whl", hash = "sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4"}, - {file = "build-1.3.0.tar.gz", hash = "sha256:698edd0ea270bde950f53aed21f3a0135672206f3911e0176261a31e0e07b397"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "os_name == \"nt\""} -importlib-metadata = {version = ">=4.6", markers = "python_full_version < \"3.10.2\""} -packaging = ">=19.1" -pyproject_hooks = "*" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} - -[package.extras] -uv = ["uv (>=0.1.18)"] -virtualenv = ["virtualenv (>=20.11)", "virtualenv (>=20.17)", "virtualenv (>=20.31)"] - -[[package]] -name = "cachecontrol" -version = "0.14.3" -description = "httplib2 caching for requests" -optional = false -python-versions = ">=3.9" -files = [ - {file = "cachecontrol-0.14.3-py3-none-any.whl", hash = "sha256:b35e44a3113f17d2a31c1e6b27b9de6d4405f84ae51baa8c1d3cc5b633010cae"}, - {file = "cachecontrol-0.14.3.tar.gz", hash = "sha256:73e7efec4b06b20d9267b441c1f733664f989fb8688391b670ca812d70795d11"}, -] - -[package.dependencies] -filelock = {version = ">=3.8.0", optional = true, markers = "extra == \"filecache\""} -msgpack = ">=0.5.2,<2.0.0" -requests = ">=2.16.0" - -[package.extras] -dev = ["CacheControl[filecache,redis]", "build", "cherrypy", "codespell[tomli]", "furo", "mypy", "pytest", "pytest-cov", "ruff", "sphinx", "sphinx-copybutton", "tox", "types-redis", "types-requests"] -filecache = ["filelock (>=3.8.0)"] -redis = ["redis (>=2.10.5)"] - [[package]] name = "certifi" -version = "2025.8.3" +version = "2026.1.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ - {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"}, - {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"}, + {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, + {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, ] [[package]] name = "cffi" -version = "1.17.1" +version = "2.0.0" description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "platform_python_implementation != \"PyPy\" and extra == \"pyats\"" +files = [ + {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, + {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"}, + {file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"}, + {file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"}, + {file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"}, + {file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"}, + {file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"}, + {file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"}, + {file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"}, + {file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b"}, + {file = "cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27"}, + {file = "cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75"}, + {file = "cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1"}, + {file = "cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f"}, + {file = "cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25"}, + {file = "cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4"}, + {file = "cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e"}, + {file = "cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6"}, + {file = "cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322"}, + {file = "cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a"}, + {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, + {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] [package.dependencies] -pycparser = "*" +pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} [[package]] name = "cfgv" -version = "3.4.0" +version = "3.5.0" description = "Validate configuration and produce human readable error messages." optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" +groups = ["dev"] files = [ - {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, - {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, + {file = "cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0"}, + {file = "cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132"}, ] [[package]] @@ -405,6 +419,8 @@ version = "4.0.0" description = "Universal encoding detector for Python 2 and 3" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, @@ -412,186 +428,213 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.3" +version = "3.4.4" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false +optional = true python-versions = ">=3.7" -files = [ - {file = "charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72"}, - {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe"}, - {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601"}, - {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c"}, - {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2"}, - {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0"}, - {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0"}, - {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0"}, - {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a"}, - {file = "charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f"}, - {file = "charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669"}, - {file = "charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b"}, - {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64"}, - {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91"}, - {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f"}, - {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07"}, - {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30"}, - {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14"}, - {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c"}, - {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae"}, - {file = "charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849"}, - {file = "charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c"}, - {file = "charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1"}, - {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884"}, - {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018"}, - {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392"}, - {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f"}, - {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154"}, - {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491"}, - {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93"}, - {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f"}, - {file = "charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37"}, - {file = "charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc"}, - {file = "charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe"}, - {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8"}, - {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9"}, - {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31"}, - {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f"}, - {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927"}, - {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9"}, - {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5"}, - {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc"}, - {file = "charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce"}, - {file = "charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef"}, - {file = "charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15"}, - {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db"}, - {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d"}, - {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096"}, - {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa"}, - {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049"}, - {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0"}, - {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92"}, - {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16"}, - {file = "charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce"}, - {file = "charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c"}, - {file = "charset_normalizer-3.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c"}, - {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b"}, - {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4"}, - {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b"}, - {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9"}, - {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb"}, - {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a"}, - {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942"}, - {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b"}, - {file = "charset_normalizer-3.4.3-cp38-cp38-win32.whl", hash = "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557"}, - {file = "charset_normalizer-3.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40"}, - {file = "charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05"}, - {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e"}, - {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99"}, - {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7"}, - {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7"}, - {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19"}, - {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312"}, - {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc"}, - {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34"}, - {file = "charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432"}, - {file = "charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca"}, - {file = "charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a"}, - {file = "charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14"}, -] - -[[package]] -name = "cleo" -version = "2.1.0" -description = "Cleo allows you to create beautiful and testable command-line interfaces." -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "cleo-2.1.0-py3-none-any.whl", hash = "sha256:4a31bd4dd45695a64ee3c4758f583f134267c2bc518d8ae9a29cf237d009b07e"}, - {file = "cleo-2.1.0.tar.gz", hash = "sha256:0b2c880b5d13660a7ea651001fb4acb527696c01f15c9ee650f377aa543fd523"}, +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"docs\"" +files = [ + {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, + {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, + {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, ] -[package.dependencies] -crashtest = ">=0.4.1,<0.5.0" -rapidfuzz = ">=3.0.0,<4.0.0" - [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] - -[[package]] -name = "crashtest" -version = "0.4.1" -description = "Manage Python errors with ease" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "crashtest-0.4.1-py3-none-any.whl", hash = "sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5"}, - {file = "crashtest-0.4.1.tar.gz", hash = "sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce"}, -] +markers = {main = "extra == \"docs\" and sys_platform == \"win32\"", dev = "sys_platform == \"win32\""} [[package]] name = "cryptography" -version = "45.0.6" +version = "46.0.5" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = "!=3.9.0,!=3.9.1,>=3.7" -files = [ - {file = "cryptography-45.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42"}, - {file = "cryptography-45.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05"}, - {file = "cryptography-45.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453"}, - {file = "cryptography-45.0.6-cp311-abi3-win32.whl", hash = "sha256:d063341378d7ee9c91f9d23b431a3502fc8bfacd54ef0a27baa72a0843b29159"}, - {file = "cryptography-45.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:833dc32dfc1e39b7376a87b9a6a4288a10aae234631268486558920029b086ec"}, - {file = "cryptography-45.0.6-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016"}, - {file = "cryptography-45.0.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3"}, - {file = "cryptography-45.0.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9"}, - {file = "cryptography-45.0.6-cp37-abi3-win32.whl", hash = "sha256:780c40fb751c7d2b0c6786ceee6b6f871e86e8718a8ff4bc35073ac353c7cd02"}, - {file = "cryptography-45.0.6-cp37-abi3-win_amd64.whl", hash = "sha256:20d15aed3ee522faac1a39fbfdfee25d17b1284bafd808e1640a74846d7c4d1b"}, - {file = "cryptography-45.0.6-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:705bb7c7ecc3d79a50f236adda12ca331c8e7ecfbea51edd931ce5a7a7c4f012"}, - {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:826b46dae41a1155a0c0e66fafba43d0ede1dc16570b95e40c4d83bfcf0a451d"}, - {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cc4d66f5dc4dc37b89cfef1bd5044387f7a1f6f0abb490815628501909332d5d"}, - {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f68f833a9d445cc49f01097d95c83a850795921b3f7cc6488731e69bde3288da"}, - {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:3b5bf5267e98661b9b888a9250d05b063220dfa917a8203744454573c7eb79db"}, - {file = "cryptography-45.0.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2384f2ab18d9be88a6e4f8972923405e2dbb8d3e16c6b43f15ca491d7831bd18"}, - {file = "cryptography-45.0.6-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc022c1fa5acff6def2fc6d7819bbbd31ccddfe67d075331a65d9cfb28a20983"}, - {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3de77e4df42ac8d4e4d6cdb342d989803ad37707cf8f3fbf7b088c9cbdd46427"}, - {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:599c8d7df950aa68baa7e98f7b73f4f414c9f02d0e8104a30c0182a07732638b"}, - {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:31a2b9a10530a1cb04ffd6aa1cd4d3be9ed49f7d77a4dafe198f3b382f41545c"}, - {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:e5b3dda1b00fb41da3af4c5ef3f922a200e33ee5ba0f0bc9ecf0b0c173958385"}, - {file = "cryptography-45.0.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:629127cfdcdc6806dfe234734d7cb8ac54edaf572148274fa377a7d3405b0043"}, - {file = "cryptography-45.0.6.tar.gz", hash = "sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719"}, +optional = true +python-versions = "!=3.9.0,!=3.9.1,>=3.8" +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731"}, + {file = "cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82"}, + {file = "cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1"}, + {file = "cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48"}, + {file = "cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4"}, + {file = "cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663"}, + {file = "cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826"}, + {file = "cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d"}, + {file = "cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a"}, + {file = "cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4"}, + {file = "cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c"}, + {file = "cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4"}, + {file = "cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9"}, + {file = "cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72"}, + {file = "cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595"}, + {file = "cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c"}, + {file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a"}, + {file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356"}, + {file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da"}, + {file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257"}, + {file = "cryptography-46.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7"}, + {file = "cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d"}, ] [package.dependencies] -cffi = {version = ">=1.14", markers = "platform_python_implementation != \"PyPy\""} +cffi = {version = ">=2.0.0", markers = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\""} +typing-extensions = {version = ">=4.13.2", markers = "python_full_version < \"3.11.0\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-inline-tabs", "sphinx-rtd-theme (>=3.0.0)"] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] -pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +nox = ["nox[uv] (>=2024.4.15)"] +pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.14)", "ruff (>=0.11.11)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==45.0.6)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test = ["certifi (>=2024)", "cryptography-vectors (==46.0.5)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -600,6 +643,8 @@ version = "0.4.0" description = "serialize all of Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"}, {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"}, @@ -615,6 +660,7 @@ version = "0.4.0" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16"}, {file = "distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d"}, @@ -626,6 +672,8 @@ version = "1.9.0" description = "Distro - an OS platform information API" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, @@ -637,86 +685,24 @@ version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] -[[package]] -name = "dulwich" -version = "0.22.8" -description = "Python Git Library" -optional = false -python-versions = ">=3.9" -files = [ - {file = "dulwich-0.22.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:546176d18b8cc0a492b0f23f07411e38686024cffa7e9d097ae20512a2e57127"}, - {file = "dulwich-0.22.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d2434dd72b2ae09b653c9cfe6764a03c25cfbd99fbbb7c426f0478f6fb1100f"}, - {file = "dulwich-0.22.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8318bc0921d42e3e69f03716f983a301b5ee4c8dc23c7f2c5bbb28581257a9"}, - {file = "dulwich-0.22.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7a0f96a2a87f3b4f7feae79d2ac6b94107d6b7d827ac08f2f331b88c8f597a1"}, - {file = "dulwich-0.22.8-cp310-cp310-win32.whl", hash = "sha256:432a37b25733202897b8d67cdd641688444d980167c356ef4e4dd15a17a39a24"}, - {file = "dulwich-0.22.8-cp310-cp310-win_amd64.whl", hash = "sha256:f3a15e58dac8b8a76073ddca34e014f66f3672a5540a99d49ef6a9c09ab21285"}, - {file = "dulwich-0.22.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0852edc51cff4f4f62976bdaa1d82f6ef248356c681c764c0feb699bc17d5782"}, - {file = "dulwich-0.22.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:826aae8b64ac1a12321d6b272fc13934d8f62804fda2bc6ae46f93f4380798eb"}, - {file = "dulwich-0.22.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7ae726f923057d36cdbb9f4fb7da0d0903751435934648b13f1b851f0e38ea1"}, - {file = "dulwich-0.22.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6987d753227f55cf75ba29a8dab69d1d83308ce483d7a8c6d223086f7a42e125"}, - {file = "dulwich-0.22.8-cp311-cp311-win32.whl", hash = "sha256:7757b4a2aad64c6f1920082fc1fccf4da25c3923a0ae7b242c08d06861dae6e1"}, - {file = "dulwich-0.22.8-cp311-cp311-win_amd64.whl", hash = "sha256:12b243b7e912011c7225dc67480c313ac8d2990744789b876016fb593f6f3e19"}, - {file = "dulwich-0.22.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d81697f74f50f008bb221ab5045595f8a3b87c0de2c86aa55be42ba97421f3cd"}, - {file = "dulwich-0.22.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bff1da8e2e6a607c3cb45f5c2e652739589fe891245e1d5b770330cdecbde41"}, - {file = "dulwich-0.22.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9969099e15b939d3936f8bee8459eaef7ef5a86cd6173393a17fe28ca3d38aff"}, - {file = "dulwich-0.22.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:017152c51b9a613f0698db28c67cf3e0a89392d28050dbf4f4ac3f657ea4c0dc"}, - {file = "dulwich-0.22.8-cp312-cp312-win32.whl", hash = "sha256:ee70e8bb8798b503f81b53f7a103cb869c8e89141db9005909f79ab1506e26e9"}, - {file = "dulwich-0.22.8-cp312-cp312-win_amd64.whl", hash = "sha256:dc89c6f14dcdcbfee200b0557c59ae243835e42720be143526d834d0e53ed3af"}, - {file = "dulwich-0.22.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbade3342376be1cd2409539fe1b901d2d57a531106bbae204da921ef4456a74"}, - {file = "dulwich-0.22.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71420ffb6deebc59b2ce875e63d814509f9c1dc89c76db962d547aebf15670c7"}, - {file = "dulwich-0.22.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a626adbfac44646a125618266a24133763bdc992bf8bd0702910d67e6b994443"}, - {file = "dulwich-0.22.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f1476c9c4e4ede95714d06c4831883a26680e37b040b8b6230f506e5ba39f51"}, - {file = "dulwich-0.22.8-cp313-cp313-win32.whl", hash = "sha256:b2b31913932bb5bd41658dd398b33b1a2d4d34825123ad54e40912cfdfe60003"}, - {file = "dulwich-0.22.8-cp313-cp313-win_amd64.whl", hash = "sha256:7a44e5a61a7989aca1e301d39cfb62ad2f8853368682f524d6e878b4115d823d"}, - {file = "dulwich-0.22.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9cd0c67fb44a38358b9fcabee948bf11044ef6ce7a129e50962f54c176d084e"}, - {file = "dulwich-0.22.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b79b94726c3f4a9e5a830c649376fd0963236e73142a4290bac6bc9fc9cb120"}, - {file = "dulwich-0.22.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16bbe483d663944972e22d64e1f191201123c3b5580fbdaac6a4f66bfaa4fc11"}, - {file = "dulwich-0.22.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e02d403af23d93dc1f96eb2408e25efd50046e38590a88c86fa4002adc9849b0"}, - {file = "dulwich-0.22.8-cp39-cp39-win32.whl", hash = "sha256:8bdd9543a77fb01be704377f5e634b71f955fec64caa4a493dc3bfb98e3a986e"}, - {file = "dulwich-0.22.8-cp39-cp39-win_amd64.whl", hash = "sha256:3b6757c6b3ba98212b854a766a4157b9cb79a06f4e1b06b46dec4bd834945b8e"}, - {file = "dulwich-0.22.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7bb18fa09daa1586c1040b3e2777d38d4212a5cdbe47d384ba66a1ac336fcc4c"}, - {file = "dulwich-0.22.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b2fda8e87907ed304d4a5962aea0338366144df0df60f950b8f7f125871707f"}, - {file = "dulwich-0.22.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1748cd573a0aee4d530bc223a23ccb8bb5b319645931a37bd1cfb68933b720c1"}, - {file = "dulwich-0.22.8-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a631b2309feb9a9631eabd896612ba36532e3ffedccace57f183bb868d7afc06"}, - {file = "dulwich-0.22.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:00e7d9a3d324f9e0a1b27880eec0e8e276ff76519621b66c1a429ca9eb3f5a8d"}, - {file = "dulwich-0.22.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f8aa3de93201f9e3e40198725389aa9554a4ee3318a865f96a8e9bc9080f0b25"}, - {file = "dulwich-0.22.8-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e8da9dd8135884975f5be0563ede02179240250e11f11942801ae31ac293f37"}, - {file = "dulwich-0.22.8-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fc5ce2435fb3abdf76f1acabe48f2e4b3f7428232cadaef9daaf50ea7fa30ee"}, - {file = "dulwich-0.22.8-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:982b21cc3100d959232cadb3da0a478bd549814dd937104ea50f43694ec27153"}, - {file = "dulwich-0.22.8-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6bde2b13a05cc0ec2ecd4597a99896663544c40af1466121f4d046119b874ce3"}, - {file = "dulwich-0.22.8-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6d446cb7d272a151934ad4b48ba691f32486d5267cf2de04ee3b5e05fc865326"}, - {file = "dulwich-0.22.8-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f6338e6cf95cd76a0191b3637dc3caed1f988ae84d8e75f876d5cd75a8dd81a"}, - {file = "dulwich-0.22.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e004fc532ea262f2d5f375068101ca4792becb9d4aa663b050f5ac31fda0bb5c"}, - {file = "dulwich-0.22.8-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bfdbc6fa477dee00d04e22d43a51571cd820cfaaaa886f0f155b8e29b3e3d45"}, - {file = "dulwich-0.22.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ae900c8e573f79d714c1d22b02cdadd50b64286dd7203028f0200f82089e4950"}, - {file = "dulwich-0.22.8-py3-none-any.whl", hash = "sha256:ffc7a02e62b72884de58baaa3b898b7f6427893e79b1289ffa075092efe59181"}, - {file = "dulwich-0.22.8.tar.gz", hash = "sha256:701547310415de300269331abe29cb5717aa1ea377af826bf513d0adfb1c209b"}, -] - -[package.dependencies] -urllib3 = ">=1.25" - -[package.extras] -dev = ["mypy (==1.15.0)", "ruff (==0.9.7)"] -fastimport = ["fastimport"] -https = ["urllib3 (>=1.24.1)"] -paramiko = ["paramiko"] -pgp = ["gpg"] - [[package]] name = "exceptiongroup" -version = "1.3.0" +version = "1.3.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] +markers = "python_version == \"3.10\"" files = [ - {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, - {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, + {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, + {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, ] [package.dependencies] @@ -726,50 +712,39 @@ typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} test = ["pytest (>=6)"] [[package]] -name = "fastjsonschema" -version = "2.21.2" -description = "Fastest Python implementation of JSON schema" +name = "execnet" +version = "2.1.2" +description = "execnet: rapid multi-Python deployment" optional = false -python-versions = "*" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463"}, - {file = "fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de"}, + {file = "execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec"}, + {file = "execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd"}, ] [package.extras] -devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] +testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "filelock" -version = "3.19.1" +version = "3.20.3" description = "A platform independent file lock." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" +groups = ["dev"] files = [ - {file = "filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d"}, - {file = "filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58"}, + {file = "filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1"}, + {file = "filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1"}, ] -[[package]] -name = "findpython" -version = "0.6.3" -description = "A utility to find python versions on your system" -optional = false -python-versions = ">=3.8" -files = [ - {file = "findpython-0.6.3-py3-none-any.whl", hash = "sha256:a85bb589b559cdf1b87227cc233736eb7cad894b9e68021ee498850611939ebc"}, - {file = "findpython-0.6.3.tar.gz", hash = "sha256:5863ea55556d8aadc693481a14ac4f3624952719efc1c5591abb0b4a9e965c94"}, -] - -[package.dependencies] -packaging = ">=20" - [[package]] name = "flake8" version = "7.3.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e"}, {file = "flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872"}, @@ -782,115 +757,143 @@ pyflakes = ">=3.4.0,<3.5.0" [[package]] name = "frozenlist" -version = "1.7.0" +version = "1.8.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = true python-versions = ">=3.9" -files = [ - {file = "frozenlist-1.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cc4df77d638aa2ed703b878dd093725b72a824c3c546c076e8fdf276f78ee84a"}, - {file = "frozenlist-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:716a9973a2cc963160394f701964fe25012600f3d311f60c790400b00e568b61"}, - {file = "frozenlist-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0fd1bad056a3600047fb9462cff4c5322cebc59ebf5d0a3725e0ee78955001d"}, - {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3789ebc19cb811163e70fe2bd354cea097254ce6e707ae42e56f45e31e96cb8e"}, - {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af369aa35ee34f132fcfad5be45fbfcde0e3a5f6a1ec0712857f286b7d20cca9"}, - {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac64b6478722eeb7a3313d494f8342ef3478dff539d17002f849101b212ef97c"}, - {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f89f65d85774f1797239693cef07ad4c97fdd0639544bad9ac4b869782eb1981"}, - {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1073557c941395fdfcfac13eb2456cb8aad89f9de27bae29fabca8e563b12615"}, - {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ed8d2fa095aae4bdc7fdd80351009a48d286635edffee66bf865e37a9125c50"}, - {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:24c34bea555fe42d9f928ba0a740c553088500377448febecaa82cc3e88aa1fa"}, - {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:69cac419ac6a6baad202c85aaf467b65ac860ac2e7f2ac1686dc40dbb52f6577"}, - {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:960d67d0611f4c87da7e2ae2eacf7ea81a5be967861e0c63cf205215afbfac59"}, - {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:41be2964bd4b15bf575e5daee5a5ce7ed3115320fb3c2b71fca05582ffa4dc9e"}, - {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:46d84d49e00c9429238a7ce02dc0be8f6d7cd0cd405abd1bebdc991bf27c15bd"}, - {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:15900082e886edb37480335d9d518cec978afc69ccbc30bd18610b7c1b22a718"}, - {file = "frozenlist-1.7.0-cp310-cp310-win32.whl", hash = "sha256:400ddd24ab4e55014bba442d917203c73b2846391dd42ca5e38ff52bb18c3c5e"}, - {file = "frozenlist-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:6eb93efb8101ef39d32d50bce242c84bcbddb4f7e9febfa7b524532a239b4464"}, - {file = "frozenlist-1.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa51e147a66b2d74de1e6e2cf5921890de6b0f4820b257465101d7f37b49fb5a"}, - {file = "frozenlist-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b35db7ce1cd71d36ba24f80f0c9e7cff73a28d7a74e91fe83e23d27c7828750"}, - {file = "frozenlist-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34a69a85e34ff37791e94542065c8416c1afbf820b68f720452f636d5fb990cd"}, - {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a646531fa8d82c87fe4bb2e596f23173caec9185bfbca5d583b4ccfb95183e2"}, - {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:79b2ffbba483f4ed36a0f236ccb85fbb16e670c9238313709638167670ba235f"}, - {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a26f205c9ca5829cbf82bb2a84b5c36f7184c4316617d7ef1b271a56720d6b30"}, - {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bcacfad3185a623fa11ea0e0634aac7b691aa925d50a440f39b458e41c561d98"}, - {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72c1b0fe8fe451b34f12dce46445ddf14bd2a5bcad7e324987194dc8e3a74c86"}, - {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d1a5baeaac6c0798ff6edfaeaa00e0e412d49946c53fae8d4b8e8b3566c4ae"}, - {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7edf5c043c062462f09b6820de9854bf28cc6cc5b6714b383149745e287181a8"}, - {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d50ac7627b3a1bd2dcef6f9da89a772694ec04d9a61b66cf87f7d9446b4a0c31"}, - {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce48b2fece5aeb45265bb7a58259f45027db0abff478e3077e12b05b17fb9da7"}, - {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:fe2365ae915a1fafd982c146754e1de6ab3478def8a59c86e1f7242d794f97d5"}, - {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:45a6f2fdbd10e074e8814eb98b05292f27bad7d1883afbe009d96abdcf3bc898"}, - {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:21884e23cffabb157a9dd7e353779077bf5b8f9a58e9b262c6caad2ef5f80a56"}, - {file = "frozenlist-1.7.0-cp311-cp311-win32.whl", hash = "sha256:284d233a8953d7b24f9159b8a3496fc1ddc00f4db99c324bd5fb5f22d8698ea7"}, - {file = "frozenlist-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:387cbfdcde2f2353f19c2f66bbb52406d06ed77519ac7ee21be0232147c2592d"}, - {file = "frozenlist-1.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3dbf9952c4bb0e90e98aec1bd992b3318685005702656bc6f67c1a32b76787f2"}, - {file = "frozenlist-1.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1f5906d3359300b8a9bb194239491122e6cf1444c2efb88865426f170c262cdb"}, - {file = "frozenlist-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3dabd5a8f84573c8d10d8859a50ea2dec01eea372031929871368c09fa103478"}, - {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa57daa5917f1738064f302bf2626281a1cb01920c32f711fbc7bc36111058a8"}, - {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08"}, - {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4"}, - {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8fc5d5cda37f62b262405cf9652cf0856839c4be8ee41be0afe8858f17f4c94b"}, - {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d5ce521d1dd7d620198829b87ea002956e4319002ef0bc8d3e6d045cb4646e"}, - {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488d0a7d6a0008ca0db273c542098a0fa9e7dfaa7e57f70acef43f32b3f69dca"}, - {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df"}, - {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5"}, - {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025"}, - {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:73bd45e1488c40b63fe5a7df892baf9e2a4d4bb6409a2b3b78ac1c6236178e01"}, - {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99886d98e1643269760e5fe0df31e5ae7050788dd288947f7f007209b8c33f08"}, - {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:290a172aae5a4c278c6da8a96222e6337744cd9c77313efe33d5670b9f65fc43"}, - {file = "frozenlist-1.7.0-cp312-cp312-win32.whl", hash = "sha256:426c7bc70e07cfebc178bc4c2bf2d861d720c4fff172181eeb4a4c41d4ca2ad3"}, - {file = "frozenlist-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:563b72efe5da92e02eb68c59cb37205457c977aa7a449ed1b37e6939e5c47c6a"}, - {file = "frozenlist-1.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee80eeda5e2a4e660651370ebffd1286542b67e268aa1ac8d6dbe973120ef7ee"}, - {file = "frozenlist-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d1a81c85417b914139e3a9b995d4a1c84559afc839a93cf2cb7f15e6e5f6ed2d"}, - {file = "frozenlist-1.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cbb65198a9132ebc334f237d7b0df163e4de83fb4f2bdfe46c1e654bdb0c5d43"}, - {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dab46c723eeb2c255a64f9dc05b8dd601fde66d6b19cdb82b2e09cc6ff8d8b5d"}, - {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6aeac207a759d0dedd2e40745575ae32ab30926ff4fa49b1635def65806fddee"}, - {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bd8c4e58ad14b4fa7802b8be49d47993182fdd4023393899632c88fd8cd994eb"}, - {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04fb24d104f425da3540ed83cbfc31388a586a7696142004c577fa61c6298c3f"}, - {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a5c505156368e4ea6b53b5ac23c92d7edc864537ff911d2fb24c140bb175e60"}, - {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bd7eb96a675f18aa5c553eb7ddc24a43c8c18f22e1f9925528128c052cdbe00"}, - {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:05579bf020096fe05a764f1f84cd104a12f78eaab68842d036772dc6d4870b4b"}, - {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:376b6222d114e97eeec13d46c486facd41d4f43bab626b7c3f6a8b4e81a5192c"}, - {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0aa7e176ebe115379b5b1c95b4096fb1c17cce0847402e227e712c27bdb5a949"}, - {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3fbba20e662b9c2130dc771e332a99eff5da078b2b2648153a40669a6d0e36ca"}, - {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f4410a0a601d349dd406b5713fec59b4cee7e71678d5b17edda7f4655a940b"}, - {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2cdfaaec6a2f9327bf43c933c0319a7c429058e8537c508964a133dffee412e"}, - {file = "frozenlist-1.7.0-cp313-cp313-win32.whl", hash = "sha256:5fc4df05a6591c7768459caba1b342d9ec23fa16195e744939ba5914596ae3e1"}, - {file = "frozenlist-1.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:52109052b9791a3e6b5d1b65f4b909703984b770694d3eb64fad124c835d7cba"}, - {file = "frozenlist-1.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a6f86e4193bb0e235ef6ce3dde5cbabed887e0b11f516ce8a0f4d3b33078ec2d"}, - {file = "frozenlist-1.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:82d664628865abeb32d90ae497fb93df398a69bb3434463d172b80fc25b0dd7d"}, - {file = "frozenlist-1.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:912a7e8375a1c9a68325a902f3953191b7b292aa3c3fb0d71a216221deca460b"}, - {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9537c2777167488d539bc5de2ad262efc44388230e5118868e172dd4a552b146"}, - {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f34560fb1b4c3e30ba35fa9a13894ba39e5acfc5f60f57d8accde65f46cc5e74"}, - {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acd03d224b0175f5a850edc104ac19040d35419eddad04e7cf2d5986d98427f1"}, - {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2038310bc582f3d6a09b3816ab01737d60bf7b1ec70f5356b09e84fb7408ab1"}, - {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8c05e4c8e5f36e5e088caa1bf78a687528f83c043706640a92cb76cd6999384"}, - {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:765bb588c86e47d0b68f23c1bee323d4b703218037765dcf3f25c838c6fecceb"}, - {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:32dc2e08c67d86d0969714dd484fd60ff08ff81d1a1e40a77dd34a387e6ebc0c"}, - {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:c0303e597eb5a5321b4de9c68e9845ac8f290d2ab3f3e2c864437d3c5a30cd65"}, - {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a47f2abb4e29b3a8d0b530f7c3598badc6b134562b1a5caee867f7c62fee51e3"}, - {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:3d688126c242a6fabbd92e02633414d40f50bb6002fa4cf995a1d18051525657"}, - {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4e7e9652b3d367c7bd449a727dc79d5043f48b88d0cbfd4f9f1060cf2b414104"}, - {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1a85e345b4c43db8b842cab1feb41be5cc0b10a1830e6295b69d7310f99becaf"}, - {file = "frozenlist-1.7.0-cp313-cp313t-win32.whl", hash = "sha256:3a14027124ddb70dfcee5148979998066897e79f89f64b13328595c4bdf77c81"}, - {file = "frozenlist-1.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3bf8010d71d4507775f658e9823210b7427be36625b387221642725b515dcf3e"}, - {file = "frozenlist-1.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cea3dbd15aea1341ea2de490574a4a37ca080b2ae24e4b4f4b51b9057b4c3630"}, - {file = "frozenlist-1.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7d536ee086b23fecc36c2073c371572374ff50ef4db515e4e503925361c24f71"}, - {file = "frozenlist-1.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dfcebf56f703cb2e346315431699f00db126d158455e513bd14089d992101e44"}, - {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974c5336e61d6e7eb1ea5b929cb645e882aadab0095c5a6974a111e6479f8878"}, - {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c70db4a0ab5ab20878432c40563573229a7ed9241506181bba12f6b7d0dc41cb"}, - {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1137b78384eebaf70560a36b7b229f752fb64d463d38d1304939984d5cb887b6"}, - {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e793a9f01b3e8b5c0bc646fb59140ce0efcc580d22a3468d70766091beb81b35"}, - {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74739ba8e4e38221d2c5c03d90a7e542cb8ad681915f4ca8f68d04f810ee0a87"}, - {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e63344c4e929b1a01e29bc184bbb5fd82954869033765bfe8d65d09e336a677"}, - {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ea2a7369eb76de2217a842f22087913cdf75f63cf1307b9024ab82dfb525938"}, - {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:836b42f472a0e006e02499cef9352ce8097f33df43baaba3e0a28a964c26c7d2"}, - {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e22b9a99741294b2571667c07d9f8cceec07cb92aae5ccda39ea1b6052ed4319"}, - {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:9a19e85cc503d958abe5218953df722748d87172f71b73cf3c9257a91b999890"}, - {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f22dac33bb3ee8fe3e013aa7b91dc12f60d61d05b7fe32191ffa84c3aafe77bd"}, - {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ccec739a99e4ccf664ea0775149f2749b8a6418eb5b8384b4dc0a7d15d304cb"}, - {file = "frozenlist-1.7.0-cp39-cp39-win32.whl", hash = "sha256:b3950f11058310008a87757f3eee16a8e1ca97979833239439586857bc25482e"}, - {file = "frozenlist-1.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:43a82fce6769c70f2f5a06248b614a7d268080a9d20f7457ef10ecee5af82b63"}, - {file = "frozenlist-1.7.0-py3-none-any.whl", hash = "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e"}, - {file = "frozenlist-1.7.0.tar.gz", hash = "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f"}, +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"events\"" +files = [ + {file = "frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011"}, + {file = "frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565"}, + {file = "frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7"}, + {file = "frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a"}, + {file = "frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6"}, + {file = "frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e"}, + {file = "frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84"}, + {file = "frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9"}, + {file = "frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967"}, + {file = "frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25"}, + {file = "frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b"}, + {file = "frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a"}, + {file = "frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1"}, + {file = "frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b"}, + {file = "frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa"}, + {file = "frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf"}, + {file = "frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746"}, + {file = "frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd"}, + {file = "frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a"}, + {file = "frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7"}, + {file = "frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed"}, + {file = "frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496"}, + {file = "frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231"}, + {file = "frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62"}, + {file = "frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94"}, + {file = "frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c"}, + {file = "frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41"}, + {file = "frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b"}, + {file = "frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888"}, + {file = "frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042"}, + {file = "frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0"}, + {file = "frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f"}, + {file = "frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7"}, + {file = "frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806"}, + {file = "frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0"}, + {file = "frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b"}, + {file = "frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d"}, + {file = "frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed"}, + {file = "frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e"}, + {file = "frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df"}, + {file = "frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd"}, + {file = "frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79"}, + {file = "frozenlist-1.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d8b7138e5cd0647e4523d6685b0eac5d4be9a184ae9634492f25c6eb38c12a47"}, + {file = "frozenlist-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a6483e309ca809f1efd154b4d37dc6d9f61037d6c6a81c2dc7a15cb22c8c5dca"}, + {file = "frozenlist-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b9290cf81e95e93fdf90548ce9d3c1211cf574b8e3f4b3b7cb0537cf2227068"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:59a6a5876ca59d1b63af8cd5e7ffffb024c3dc1e9cf9301b21a2e76286505c95"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6dc4126390929823e2d2d9dc79ab4046ed74680360fc5f38b585c12c66cdf459"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:332db6b2563333c5671fecacd085141b5800cb866be16d5e3eb15a2086476675"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ff15928d62a0b80bb875655c39bf517938c7d589554cbd2669be42d97c2cb61"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7bf6cdf8e07c8151fba6fe85735441240ec7f619f935a5205953d58009aef8c6"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:48e6d3f4ec5c7273dfe83ff27c91083c6c9065af655dc2684d2c200c94308bb5"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:1a7607e17ad33361677adcd1443edf6f5da0ce5e5377b798fba20fae194825f3"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3a935c3a4e89c733303a2d5a7c257ea44af3a56c8202df486b7f5de40f37e1"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:940d4a017dbfed9daf46a3b086e1d2167e7012ee297fef9e1c545c4d022f5178"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b9be22a69a014bc47e78072d0ecae716f5eb56c15238acca0f43d6eb8e4a5bda"}, + {file = "frozenlist-1.8.0-cp39-cp39-win32.whl", hash = "sha256:1aa77cb5697069af47472e39612976ed05343ff2e84a3dcf15437b232cbfd087"}, + {file = "frozenlist-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:7398c222d1d405e796970320036b1b563892b65809d9e5261487bb2c7f7b5c6a"}, + {file = "frozenlist-1.8.0-cp39-cp39-win_arm64.whl", hash = "sha256:b4f3b365f31c6cd4af24545ca0a244a53688cad8834e32f56831c4923b50a103"}, + {file = "frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d"}, + {file = "frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad"}, ] [[package]] @@ -899,6 +902,8 @@ version = "4.0.12" description = "Git Object Database" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -909,22 +914,23 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.45" +version = "3.1.46" description = "GitPython is a Python library used to interact with Git repositories" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ - {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"}, - {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"}, + {file = "gitpython-3.1.46-py3-none-any.whl", hash = "sha256:79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058"}, + {file = "gitpython-3.1.46.tar.gz", hash = "sha256:400124c7d0ef4ea03f7310ac2fbf7151e09ff97f2a3288d64a440c584a29c37f"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" -typing-extensions = {version = ">=3.10.0.2", markers = "python_version < \"3.10\""} [package.extras] doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] -test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy (==1.18.2) ; python_version >= \"3.9\"", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] [[package]] name = "h11" @@ -932,6 +938,7 @@ version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, @@ -943,6 +950,7 @@ version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, @@ -964,6 +972,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -976,7 +985,7 @@ httpcore = "==1.*" idna = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -984,13 +993,14 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "identify" -version = "2.6.13" +version = "2.6.16" description = "File identification library for Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" +groups = ["dev"] files = [ - {file = "identify-2.6.13-py2.py3-none-any.whl", hash = "sha256:60381139b3ae39447482ecc406944190f690d4a2997f2584062089848361b33b"}, - {file = "identify-2.6.13.tar.gz", hash = "sha256:da8d6c828e773620e13bfa86ea601c5a5310ba4bcd65edf378198b56a1f9fb32"}, + {file = "identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0"}, + {file = "identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980"}, ] [package.extras] @@ -998,13 +1008,14 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.10" +version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, ] [package.extras] @@ -1016,135 +1027,33 @@ version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] -[[package]] -name = "importlib-metadata" -version = "8.6.1" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.9" -files = [ - {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, - {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, -] - -[package.dependencies] -zipp = ">=3.20" - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] -type = ["pytest-mypy"] - [[package]] name = "iniconfig" -version = "2.1.0" +version = "2.3.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.8" -files = [ - {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, - {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, -] - -[[package]] -name = "installer" -version = "0.7.0" -description = "A library for installing Python wheels." -optional = false -python-versions = ">=3.7" -files = [ - {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, - {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, -] - -[[package]] -name = "jaraco-classes" -version = "3.4.0" -description = "Utility functions for Python class constructs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, - {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, -] - -[package.dependencies] -more-itertools = "*" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] - -[[package]] -name = "jaraco-context" -version = "6.0.1" -description = "Useful decorators and context managers" -optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" +groups = ["dev"] files = [ - {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, - {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, + {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, + {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, ] -[package.dependencies] -"backports.tarfile" = {version = "*", markers = "python_version < \"3.12\""} - -[package.extras] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] - -[[package]] -name = "jaraco-functools" -version = "4.3.0" -description = "Functools like those found in stdlib" -optional = false -python-versions = ">=3.9" -files = [ - {file = "jaraco_functools-4.3.0-py3-none-any.whl", hash = "sha256:227ff8ed6f7b8f62c56deff101545fa7543cf2c8e7b82a7c2116e672f29c26e8"}, - {file = "jaraco_functools-4.3.0.tar.gz", hash = "sha256:cfd13ad0dd2c47a3600b439ef72d8615d482cedcff1632930d6f28924d92f294"}, -] - -[package.dependencies] -more_itertools = "*" - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["jaraco.classes", "pytest (>=6,!=8.1.*)"] -type = ["pytest-mypy"] - -[[package]] -name = "jeepney" -version = "0.9.0" -description = "Low-level, pure Python DBus protocol wrapper." -optional = false -python-versions = ">=3.7" -files = [ - {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"}, - {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"}, -] - -[package.extras] -test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] -trio = ["trio"] - [[package]] name = "jinja2" version = "3.1.6" description = "A very fast and expressive template engine." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"docs\"" files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1162,6 +1071,8 @@ version = "1.9" description = "Creates JUnit XML test result documents that can be read by tools such as Jenkins" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "junit-xml-1.9.tar.gz", hash = "sha256:de16a051990d4e25a3982b2dd9e89d671067548718866416faec14d9de56db9f"}, {file = "junit_xml-1.9-py2.py3-none-any.whl", hash = "sha256:ec5ca1a55aefdd76d28fcc0b135251d156c7106fa979686a4b48d62b761b4732"}, @@ -1170,103 +1081,104 @@ files = [ [package.dependencies] six = "*" -[[package]] -name = "keyring" -version = "25.6.0" -description = "Store and access your passwords safely." -optional = false -python-versions = ">=3.9" -files = [ - {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, - {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, -] - -[package.dependencies] -importlib_metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} -"jaraco.classes" = "*" -"jaraco.context" = "*" -"jaraco.functools" = "*" -jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} -SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -completion = ["shtab (>=1.1.0)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["pyfakefs", "pytest (>=6,!=8.1.*)"] -type = ["pygobject-stubs", "pytest-mypy", "shtab", "types-pywin32"] - [[package]] name = "markupsafe" -version = "3.0.2" +version = "3.0.3" description = "Safely add untrusted strings to HTML/XML markup." optional = true python-versions = ">=3.9" -files = [ - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, - {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"docs\"" +files = [ + {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, + {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"}, + {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"}, + {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"}, + {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"}, + {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"}, + {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"}, + {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, + {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, ] [[package]] @@ -1275,207 +1187,167 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] -[[package]] -name = "more-itertools" -version = "10.7.0" -description = "More routines for operating on iterables, beyond itertools" -optional = false -python-versions = ">=3.9" -files = [ - {file = "more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e"}, - {file = "more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3"}, -] - -[[package]] -name = "msgpack" -version = "1.1.1" -description = "MessagePack serializer" -optional = false -python-versions = ">=3.8" -files = [ - {file = "msgpack-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:353b6fc0c36fde68b661a12949d7d49f8f51ff5fa019c1e47c87c4ff34b080ed"}, - {file = "msgpack-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:79c408fcf76a958491b4e3b103d1c417044544b68e96d06432a189b43d1215c8"}, - {file = "msgpack-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78426096939c2c7482bf31ef15ca219a9e24460289c00dd0b94411040bb73ad2"}, - {file = "msgpack-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b17ba27727a36cb73aabacaa44b13090feb88a01d012c0f4be70c00f75048b4"}, - {file = "msgpack-1.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a17ac1ea6ec3c7687d70201cfda3b1e8061466f28f686c24f627cae4ea8efd0"}, - {file = "msgpack-1.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:88d1e966c9235c1d4e2afac21ca83933ba59537e2e2727a999bf3f515ca2af26"}, - {file = "msgpack-1.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f6d58656842e1b2ddbe07f43f56b10a60f2ba5826164910968f5933e5178af75"}, - {file = "msgpack-1.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96decdfc4adcbc087f5ea7ebdcfd3dee9a13358cae6e81d54be962efc38f6338"}, - {file = "msgpack-1.1.1-cp310-cp310-win32.whl", hash = "sha256:6640fd979ca9a212e4bcdf6eb74051ade2c690b862b679bfcb60ae46e6dc4bfd"}, - {file = "msgpack-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:8b65b53204fe1bd037c40c4148d00ef918eb2108d24c9aaa20bc31f9810ce0a8"}, - {file = "msgpack-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:71ef05c1726884e44f8b1d1773604ab5d4d17729d8491403a705e649116c9558"}, - {file = "msgpack-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36043272c6aede309d29d56851f8841ba907a1a3d04435e43e8a19928e243c1d"}, - {file = "msgpack-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a32747b1b39c3ac27d0670122b57e6e57f28eefb725e0b625618d1b59bf9d1e0"}, - {file = "msgpack-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a8b10fdb84a43e50d38057b06901ec9da52baac6983d3f709d8507f3889d43f"}, - {file = "msgpack-1.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0c325c3f485dc54ec298d8b024e134acf07c10d494ffa24373bea729acf704"}, - {file = "msgpack-1.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:88daaf7d146e48ec71212ce21109b66e06a98e5e44dca47d853cbfe171d6c8d2"}, - {file = "msgpack-1.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8b55ea20dc59b181d3f47103f113e6f28a5e1c89fd5b67b9140edb442ab67f2"}, - {file = "msgpack-1.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a28e8072ae9779f20427af07f53bbb8b4aa81151054e882aee333b158da8752"}, - {file = "msgpack-1.1.1-cp311-cp311-win32.whl", hash = "sha256:7da8831f9a0fdb526621ba09a281fadc58ea12701bc709e7b8cbc362feabc295"}, - {file = "msgpack-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fd1b58e1431008a57247d6e7cc4faa41c3607e8e7d4aaf81f7c29ea013cb458"}, - {file = "msgpack-1.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae497b11f4c21558d95de9f64fff7053544f4d1a17731c866143ed6bb4591238"}, - {file = "msgpack-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:33be9ab121df9b6b461ff91baac6f2731f83d9b27ed948c5b9d1978ae28bf157"}, - {file = "msgpack-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f64ae8fe7ffba251fecb8408540c34ee9df1c26674c50c4544d72dbf792e5ce"}, - {file = "msgpack-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a494554874691720ba5891c9b0b39474ba43ffb1aaf32a5dac874effb1619e1a"}, - {file = "msgpack-1.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb643284ab0ed26f6957d969fe0dd8bb17beb567beb8998140b5e38a90974f6c"}, - {file = "msgpack-1.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d275a9e3c81b1093c060c3837e580c37f47c51eca031f7b5fb76f7b8470f5f9b"}, - {file = "msgpack-1.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4fd6b577e4541676e0cc9ddc1709d25014d3ad9a66caa19962c4f5de30fc09ef"}, - {file = "msgpack-1.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb29aaa613c0a1c40d1af111abf025f1732cab333f96f285d6a93b934738a68a"}, - {file = "msgpack-1.1.1-cp312-cp312-win32.whl", hash = "sha256:870b9a626280c86cff9c576ec0d9cbcc54a1e5ebda9cd26dab12baf41fee218c"}, - {file = "msgpack-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:5692095123007180dca3e788bb4c399cc26626da51629a31d40207cb262e67f4"}, - {file = "msgpack-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3765afa6bd4832fc11c3749be4ba4b69a0e8d7b728f78e68120a157a4c5d41f0"}, - {file = "msgpack-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8ddb2bcfd1a8b9e431c8d6f4f7db0773084e107730ecf3472f1dfe9ad583f3d9"}, - {file = "msgpack-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:196a736f0526a03653d829d7d4c5500a97eea3648aebfd4b6743875f28aa2af8"}, - {file = "msgpack-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d592d06e3cc2f537ceeeb23d38799c6ad83255289bb84c2e5792e5a8dea268a"}, - {file = "msgpack-1.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4df2311b0ce24f06ba253fda361f938dfecd7b961576f9be3f3fbd60e87130ac"}, - {file = "msgpack-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e4141c5a32b5e37905b5940aacbc59739f036930367d7acce7a64e4dec1f5e0b"}, - {file = "msgpack-1.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b1ce7f41670c5a69e1389420436f41385b1aa2504c3b0c30620764b15dded2e7"}, - {file = "msgpack-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4147151acabb9caed4e474c3344181e91ff7a388b888f1e19ea04f7e73dc7ad5"}, - {file = "msgpack-1.1.1-cp313-cp313-win32.whl", hash = "sha256:500e85823a27d6d9bba1d057c871b4210c1dd6fb01fbb764e37e4e8847376323"}, - {file = "msgpack-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:6d489fba546295983abd142812bda76b57e33d0b9f5d5b71c09a583285506f69"}, - {file = "msgpack-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bba1be28247e68994355e028dcd668316db30c1f758d3241a7b903ac78dcd285"}, - {file = "msgpack-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8f93dcddb243159c9e4109c9750ba5b335ab8d48d9522c5308cd05d7e3ce600"}, - {file = "msgpack-1.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fbbc0b906a24038c9958a1ba7ae0918ad35b06cb449d398b76a7d08470b0ed9"}, - {file = "msgpack-1.1.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:61e35a55a546a1690d9d09effaa436c25ae6130573b6ee9829c37ef0f18d5e78"}, - {file = "msgpack-1.1.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:1abfc6e949b352dadf4bce0eb78023212ec5ac42f6abfd469ce91d783c149c2a"}, - {file = "msgpack-1.1.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:996f2609ddf0142daba4cefd767d6db26958aac8439ee41db9cc0db9f4c4c3a6"}, - {file = "msgpack-1.1.1-cp38-cp38-win32.whl", hash = "sha256:4d3237b224b930d58e9d83c81c0dba7aacc20fcc2f89c1e5423aa0529a4cd142"}, - {file = "msgpack-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:da8f41e602574ece93dbbda1fab24650d6bf2a24089f9e9dbb4f5730ec1e58ad"}, - {file = "msgpack-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5be6b6bc52fad84d010cb45433720327ce886009d862f46b26d4d154001994b"}, - {file = "msgpack-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3a89cd8c087ea67e64844287ea52888239cbd2940884eafd2dcd25754fb72232"}, - {file = "msgpack-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d75f3807a9900a7d575d8d6674a3a47e9f227e8716256f35bc6f03fc597ffbf"}, - {file = "msgpack-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d182dac0221eb8faef2e6f44701812b467c02674a322c739355c39e94730cdbf"}, - {file = "msgpack-1.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b13fe0fb4aac1aa5320cd693b297fe6fdef0e7bea5518cbc2dd5299f873ae90"}, - {file = "msgpack-1.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:435807eeb1bc791ceb3247d13c79868deb22184e1fc4224808750f0d7d1affc1"}, - {file = "msgpack-1.1.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4835d17af722609a45e16037bb1d4d78b7bdf19d6c0128116d178956618c4e88"}, - {file = "msgpack-1.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a8ef6e342c137888ebbfb233e02b8fbd689bb5b5fcc59b34711ac47ebd504478"}, - {file = "msgpack-1.1.1-cp39-cp39-win32.whl", hash = "sha256:61abccf9de335d9efd149e2fff97ed5974f2481b3353772e8e2dd3402ba2bd57"}, - {file = "msgpack-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:40eae974c873b2992fd36424a5d9407f93e97656d999f43fca9d29f820899084"}, - {file = "msgpack-1.1.1.tar.gz", hash = "sha256:77b79ce34a2bdab2594f490c8e80dd62a02d650b91a75159a63ec413b8d104cd"}, -] - [[package]] name = "multidict" -version = "6.6.4" +version = "6.7.0" description = "multidict implementation" optional = true python-versions = ">=3.9" -files = [ - {file = "multidict-6.6.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b8aa6f0bd8125ddd04a6593437bad6a7e70f300ff4180a531654aa2ab3f6d58f"}, - {file = "multidict-6.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b9e5853bbd7264baca42ffc53391b490d65fe62849bf2c690fa3f6273dbcd0cb"}, - {file = "multidict-6.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0af5f9dee472371e36d6ae38bde009bd8ce65ac7335f55dcc240379d7bed1495"}, - {file = "multidict-6.6.4-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:d24f351e4d759f5054b641c81e8291e5d122af0fca5c72454ff77f7cbe492de8"}, - {file = "multidict-6.6.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db6a3810eec08280a172a6cd541ff4a5f6a97b161d93ec94e6c4018917deb6b7"}, - {file = "multidict-6.6.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a1b20a9d56b2d81e2ff52ecc0670d583eaabaa55f402e8d16dd062373dbbe796"}, - {file = "multidict-6.6.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8c9854df0eaa610a23494c32a6f44a3a550fb398b6b51a56e8c6b9b3689578db"}, - {file = "multidict-6.6.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4bb7627fd7a968f41905a4d6343b0d63244a0623f006e9ed989fa2b78f4438a0"}, - {file = "multidict-6.6.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caebafea30ed049c57c673d0b36238b1748683be2593965614d7b0e99125c877"}, - {file = "multidict-6.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ad887a8250eb47d3ab083d2f98db7f48098d13d42eb7a3b67d8a5c795f224ace"}, - {file = "multidict-6.6.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:ed8358ae7d94ffb7c397cecb62cbac9578a83ecefc1eba27b9090ee910e2efb6"}, - {file = "multidict-6.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ecab51ad2462197a4c000b6d5701fc8585b80eecb90583635d7e327b7b6923eb"}, - {file = "multidict-6.6.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c5c97aa666cf70e667dfa5af945424ba1329af5dd988a437efeb3a09430389fb"}, - {file = "multidict-6.6.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:9a950b7cf54099c1209f455ac5970b1ea81410f2af60ed9eb3c3f14f0bfcf987"}, - {file = "multidict-6.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:163c7ea522ea9365a8a57832dea7618e6cbdc3cd75f8c627663587459a4e328f"}, - {file = "multidict-6.6.4-cp310-cp310-win32.whl", hash = "sha256:17d2cbbfa6ff20821396b25890f155f40c986f9cfbce5667759696d83504954f"}, - {file = "multidict-6.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:ce9a40fbe52e57e7edf20113a4eaddfacac0561a0879734e636aa6d4bb5e3fb0"}, - {file = "multidict-6.6.4-cp310-cp310-win_arm64.whl", hash = "sha256:01d0959807a451fe9fdd4da3e139cb5b77f7328baf2140feeaf233e1d777b729"}, - {file = "multidict-6.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c7a0e9b561e6460484318a7612e725df1145d46b0ef57c6b9866441bf6e27e0c"}, - {file = "multidict-6.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6bf2f10f70acc7a2446965ffbc726e5fc0b272c97a90b485857e5c70022213eb"}, - {file = "multidict-6.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66247d72ed62d5dd29752ffc1d3b88f135c6a8de8b5f63b7c14e973ef5bda19e"}, - {file = "multidict-6.6.4-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:105245cc6b76f51e408451a844a54e6823bbd5a490ebfe5bdfc79798511ceded"}, - {file = "multidict-6.6.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cbbc54e58b34c3bae389ef00046be0961f30fef7cb0dd9c7756aee376a4f7683"}, - {file = "multidict-6.6.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:56c6b3652f945c9bc3ac6c8178cd93132b8d82dd581fcbc3a00676c51302bc1a"}, - {file = "multidict-6.6.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b95494daf857602eccf4c18ca33337dd2be705bccdb6dddbfc9d513e6addb9d9"}, - {file = "multidict-6.6.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e5b1413361cef15340ab9dc61523e653d25723e82d488ef7d60a12878227ed50"}, - {file = "multidict-6.6.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e167bf899c3d724f9662ef00b4f7fef87a19c22b2fead198a6f68b263618df52"}, - {file = "multidict-6.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aaea28ba20a9026dfa77f4b80369e51cb767c61e33a2d4043399c67bd95fb7c6"}, - {file = "multidict-6.6.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:8c91cdb30809a96d9ecf442ec9bc45e8cfaa0f7f8bdf534e082c2443a196727e"}, - {file = "multidict-6.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1a0ccbfe93ca114c5d65a2471d52d8829e56d467c97b0e341cf5ee45410033b3"}, - {file = "multidict-6.6.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:55624b3f321d84c403cb7d8e6e982f41ae233d85f85db54ba6286f7295dc8a9c"}, - {file = "multidict-6.6.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4a1fb393a2c9d202cb766c76208bd7945bc194eba8ac920ce98c6e458f0b524b"}, - {file = "multidict-6.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:43868297a5759a845fa3a483fb4392973a95fb1de891605a3728130c52b8f40f"}, - {file = "multidict-6.6.4-cp311-cp311-win32.whl", hash = "sha256:ed3b94c5e362a8a84d69642dbeac615452e8af9b8eb825b7bc9f31a53a1051e2"}, - {file = "multidict-6.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:d8c112f7a90d8ca5d20213aa41eac690bb50a76da153e3afb3886418e61cb22e"}, - {file = "multidict-6.6.4-cp311-cp311-win_arm64.whl", hash = "sha256:3bb0eae408fa1996d87247ca0d6a57b7fc1dcf83e8a5c47ab82c558c250d4adf"}, - {file = "multidict-6.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0ffb87be160942d56d7b87b0fdf098e81ed565add09eaa1294268c7f3caac4c8"}, - {file = "multidict-6.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d191de6cbab2aff5de6c5723101705fd044b3e4c7cfd587a1929b5028b9714b3"}, - {file = "multidict-6.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38a0956dd92d918ad5feff3db8fcb4a5eb7dba114da917e1a88475619781b57b"}, - {file = "multidict-6.6.4-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6865f6d3b7900ae020b495d599fcf3765653bc927951c1abb959017f81ae8287"}, - {file = "multidict-6.6.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a2088c126b6f72db6c9212ad827d0ba088c01d951cee25e758c450da732c138"}, - {file = "multidict-6.6.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0f37bed7319b848097085d7d48116f545985db988e2256b2e6f00563a3416ee6"}, - {file = "multidict-6.6.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:01368e3c94032ba6ca0b78e7ccb099643466cf24f8dc8eefcfdc0571d56e58f9"}, - {file = "multidict-6.6.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fe323540c255db0bffee79ad7f048c909f2ab0edb87a597e1c17da6a54e493c"}, - {file = "multidict-6.6.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8eb3025f17b0a4c3cd08cda49acf312a19ad6e8a4edd9dbd591e6506d999402"}, - {file = "multidict-6.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bbc14f0365534d35a06970d6a83478b249752e922d662dc24d489af1aa0d1be7"}, - {file = "multidict-6.6.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:75aa52fba2d96bf972e85451b99d8e19cc37ce26fd016f6d4aa60da9ab2b005f"}, - {file = "multidict-6.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4fefd4a815e362d4f011919d97d7b4a1e566f1dde83dc4ad8cfb5b41de1df68d"}, - {file = "multidict-6.6.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:db9801fe021f59a5b375ab778973127ca0ac52429a26e2fd86aa9508f4d26eb7"}, - {file = "multidict-6.6.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a650629970fa21ac1fb06ba25dabfc5b8a2054fcbf6ae97c758aa956b8dba802"}, - {file = "multidict-6.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:452ff5da78d4720d7516a3a2abd804957532dd69296cb77319c193e3ffb87e24"}, - {file = "multidict-6.6.4-cp312-cp312-win32.whl", hash = "sha256:8c2fcb12136530ed19572bbba61b407f655e3953ba669b96a35036a11a485793"}, - {file = "multidict-6.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:047d9425860a8c9544fed1b9584f0c8bcd31bcde9568b047c5e567a1025ecd6e"}, - {file = "multidict-6.6.4-cp312-cp312-win_arm64.whl", hash = "sha256:14754eb72feaa1e8ae528468f24250dd997b8e2188c3d2f593f9eba259e4b364"}, - {file = "multidict-6.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f46a6e8597f9bd71b31cc708195d42b634c8527fecbcf93febf1052cacc1f16e"}, - {file = "multidict-6.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:22e38b2bc176c5eb9c0a0e379f9d188ae4cd8b28c0f53b52bce7ab0a9e534657"}, - {file = "multidict-6.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5df8afd26f162da59e218ac0eefaa01b01b2e6cd606cffa46608f699539246da"}, - {file = "multidict-6.6.4-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:49517449b58d043023720aa58e62b2f74ce9b28f740a0b5d33971149553d72aa"}, - {file = "multidict-6.6.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae9408439537c5afdca05edd128a63f56a62680f4b3c234301055d7a2000220f"}, - {file = "multidict-6.6.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:87a32d20759dc52a9e850fe1061b6e41ab28e2998d44168a8a341b99ded1dba0"}, - {file = "multidict-6.6.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:52e3c8d43cdfff587ceedce9deb25e6ae77daba560b626e97a56ddcad3756879"}, - {file = "multidict-6.6.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ad8850921d3a8d8ff6fbef790e773cecfc260bbfa0566998980d3fa8f520bc4a"}, - {file = "multidict-6.6.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:497a2954adc25c08daff36f795077f63ad33e13f19bfff7736e72c785391534f"}, - {file = "multidict-6.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:024ce601f92d780ca1617ad4be5ac15b501cc2414970ffa2bb2bbc2bd5a68fa5"}, - {file = "multidict-6.6.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a693fc5ed9bdd1c9e898013e0da4dcc640de7963a371c0bd458e50e046bf6438"}, - {file = "multidict-6.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:190766dac95aab54cae5b152a56520fd99298f32a1266d66d27fdd1b5ac00f4e"}, - {file = "multidict-6.6.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:34d8f2a5ffdceab9dcd97c7a016deb2308531d5f0fced2bb0c9e1df45b3363d7"}, - {file = "multidict-6.6.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:59e8d40ab1f5a8597abcef00d04845155a5693b5da00d2c93dbe88f2050f2812"}, - {file = "multidict-6.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:467fe64138cfac771f0e949b938c2e1ada2b5af22f39692aa9258715e9ea613a"}, - {file = "multidict-6.6.4-cp313-cp313-win32.whl", hash = "sha256:14616a30fe6d0a48d0a48d1a633ab3b8bec4cf293aac65f32ed116f620adfd69"}, - {file = "multidict-6.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:40cd05eaeb39e2bc8939451f033e57feaa2ac99e07dbca8afe2be450a4a3b6cf"}, - {file = "multidict-6.6.4-cp313-cp313-win_arm64.whl", hash = "sha256:f6eb37d511bfae9e13e82cb4d1af36b91150466f24d9b2b8a9785816deb16605"}, - {file = "multidict-6.6.4-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6c84378acd4f37d1b507dfa0d459b449e2321b3ba5f2338f9b085cf7a7ba95eb"}, - {file = "multidict-6.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0e0558693063c75f3d952abf645c78f3c5dfdd825a41d8c4d8156fc0b0da6e7e"}, - {file = "multidict-6.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3f8e2384cb83ebd23fd07e9eada8ba64afc4c759cd94817433ab8c81ee4b403f"}, - {file = "multidict-6.6.4-cp313-cp313t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:f996b87b420995a9174b2a7c1a8daf7db4750be6848b03eb5e639674f7963773"}, - {file = "multidict-6.6.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc356250cffd6e78416cf5b40dc6a74f1edf3be8e834cf8862d9ed5265cf9b0e"}, - {file = "multidict-6.6.4-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:dadf95aa862714ea468a49ad1e09fe00fcc9ec67d122f6596a8d40caf6cec7d0"}, - {file = "multidict-6.6.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7dd57515bebffd8ebd714d101d4c434063322e4fe24042e90ced41f18b6d3395"}, - {file = "multidict-6.6.4-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:967af5f238ebc2eb1da4e77af5492219fbd9b4b812347da39a7b5f5c72c0fa45"}, - {file = "multidict-6.6.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a4c6875c37aae9794308ec43e3530e4aa0d36579ce38d89979bbf89582002bb"}, - {file = "multidict-6.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7f683a551e92bdb7fac545b9c6f9fa2aebdeefa61d607510b3533286fcab67f5"}, - {file = "multidict-6.6.4-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:3ba5aaf600edaf2a868a391779f7a85d93bed147854925f34edd24cc70a3e141"}, - {file = "multidict-6.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:580b643b7fd2c295d83cad90d78419081f53fd532d1f1eb67ceb7060f61cff0d"}, - {file = "multidict-6.6.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:37b7187197da6af3ee0b044dbc9625afd0c885f2800815b228a0e70f9a7f473d"}, - {file = "multidict-6.6.4-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e1b93790ed0bc26feb72e2f08299691ceb6da5e9e14a0d13cc74f1869af327a0"}, - {file = "multidict-6.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a506a77ddee1efcca81ecbeae27ade3e09cdf21a8ae854d766c2bb4f14053f92"}, - {file = "multidict-6.6.4-cp313-cp313t-win32.whl", hash = "sha256:f93b2b2279883d1d0a9e1bd01f312d6fc315c5e4c1f09e112e4736e2f650bc4e"}, - {file = "multidict-6.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:6d46a180acdf6e87cc41dc15d8f5c2986e1e8739dc25dbb7dac826731ef381a4"}, - {file = "multidict-6.6.4-cp313-cp313t-win_arm64.whl", hash = "sha256:756989334015e3335d087a27331659820d53ba432befdef6a718398b0a8493ad"}, - {file = "multidict-6.6.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:af7618b591bae552b40dbb6f93f5518328a949dac626ee75927bba1ecdeea9f4"}, - {file = "multidict-6.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b6819f83aef06f560cb15482d619d0e623ce9bf155115150a85ab11b8342a665"}, - {file = "multidict-6.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4d09384e75788861e046330308e7af54dd306aaf20eb760eb1d0de26b2bea2cb"}, - {file = "multidict-6.6.4-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:a59c63061f1a07b861c004e53869eb1211ffd1a4acbca330e3322efa6dd02978"}, - {file = "multidict-6.6.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:350f6b0fe1ced61e778037fdc7613f4051c8baf64b1ee19371b42a3acdb016a0"}, - {file = "multidict-6.6.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0c5cbac6b55ad69cb6aa17ee9343dfbba903118fd530348c330211dc7aa756d1"}, - {file = "multidict-6.6.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:630f70c32b8066ddfd920350bc236225814ad94dfa493fe1910ee17fe4365cbb"}, - {file = "multidict-6.6.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8d4916a81697faec6cb724a273bd5457e4c6c43d82b29f9dc02c5542fd21fc9"}, - {file = "multidict-6.6.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e42332cf8276bb7645d310cdecca93a16920256a5b01bebf747365f86a1675b"}, - {file = "multidict-6.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f3be27440f7644ab9a13a6fc86f09cdd90b347c3c5e30c6d6d860de822d7cb53"}, - {file = "multidict-6.6.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:21f216669109e02ef3e2415ede07f4f8987f00de8cdfa0cc0b3440d42534f9f0"}, - {file = "multidict-6.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d9890d68c45d1aeac5178ded1d1cccf3bc8d7accf1f976f79bf63099fb16e4bd"}, - {file = "multidict-6.6.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:edfdcae97cdc5d1a89477c436b61f472c4d40971774ac4729c613b4b133163cb"}, - {file = "multidict-6.6.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0b2e886624be5773e69cf32bcb8534aecdeb38943520b240fed3d5596a430f2f"}, - {file = "multidict-6.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:be5bf4b3224948032a845d12ab0f69f208293742df96dc14c4ff9b09e508fc17"}, - {file = "multidict-6.6.4-cp39-cp39-win32.whl", hash = "sha256:10a68a9191f284fe9d501fef4efe93226e74df92ce7a24e301371293bd4918ae"}, - {file = "multidict-6.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee25f82f53262f9ac93bd7e58e47ea1bdcc3393cef815847e397cba17e284210"}, - {file = "multidict-6.6.4-cp39-cp39-win_arm64.whl", hash = "sha256:f9867e55590e0855bcec60d4f9a092b69476db64573c9fe17e92b0c50614c16a"}, - {file = "multidict-6.6.4-py3-none-any.whl", hash = "sha256:27d8f8e125c07cb954e54d75d04905a9bba8a439c1d84aca94949d4d03d8601c"}, - {file = "multidict-6.6.4.tar.gz", hash = "sha256:d2d4e4787672911b48350df02ed3fa3fffdc2f2e8ca06dd6afdf34189b76a9dd"}, +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"events\"" +files = [ + {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349"}, + {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e"}, + {file = "multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36"}, + {file = "multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85"}, + {file = "multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7"}, + {file = "multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0"}, + {file = "multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc"}, + {file = "multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721"}, + {file = "multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34"}, + {file = "multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff"}, + {file = "multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81"}, + {file = "multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912"}, + {file = "multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184"}, + {file = "multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45"}, + {file = "multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8"}, + {file = "multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4"}, + {file = "multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b"}, + {file = "multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec"}, + {file = "multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6"}, + {file = "multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159"}, + {file = "multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288"}, + {file = "multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17"}, + {file = "multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390"}, + {file = "multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e"}, + {file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00"}, + {file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb"}, + {file = "multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6"}, + {file = "multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d"}, + {file = "multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6"}, + {file = "multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792"}, + {file = "multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842"}, + {file = "multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b"}, + {file = "multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f"}, + {file = "multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885"}, + {file = "multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c"}, + {file = "multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000"}, + {file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63"}, + {file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718"}, + {file = "multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0"}, + {file = "multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13"}, + {file = "multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd"}, + {file = "multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827"}, + {file = "multidict-6.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:363eb68a0a59bd2303216d2346e6c441ba10d36d1f9969fcb6f1ba700de7bb5c"}, + {file = "multidict-6.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d874eb056410ca05fed180b6642e680373688efafc7f077b2a2f61811e873a40"}, + {file = "multidict-6.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b55d5497b51afdfde55925e04a022f1de14d4f4f25cdfd4f5d9b0aa96166851"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f8e5c0031b90ca9ce555e2e8fd5c3b02a25f14989cbc310701823832c99eb687"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cf41880c991716f3c7cec48e2f19ae4045fc9db5fc9cff27347ada24d710bb5"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cfc12a8630a29d601f48d47787bd7eb730e475e83edb5d6c5084317463373eb"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3996b50c3237c4aec17459217c1e7bbdead9a22a0fcd3c365564fbd16439dde6"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7f5170993a0dd3ab871c74f45c0a21a4e2c37a2f2b01b5f722a2ad9c6650469e"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ec81878ddf0e98817def1e77d4f50dae5ef5b0e4fe796fae3bd674304172416e"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9281bf5b34f59afbc6b1e477a372e9526b66ca446f4bf62592839c195a718b32"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:68af405971779d8b37198726f2b6fe3955db846fee42db7a4286fc542203934c"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3ba3ef510467abb0667421a286dc906e30eb08569365f5cdb131d7aff7c2dd84"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b61189b29081a20c7e4e0b49b44d5d44bb0dc92be3c6d06a11cc043f81bf9329"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fb287618b9c7aa3bf8d825f02d9201b2f13078a5ed3b293c8f4d953917d84d5e"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:521f33e377ff64b96c4c556b81c55d0cfffb96a11c194fd0c3f1e56f3d8dd5a4"}, + {file = "multidict-6.7.0-cp39-cp39-win32.whl", hash = "sha256:ce8fdc2dca699f8dbf055a61d73eaa10482569ad20ee3c36ef9641f69afa8c91"}, + {file = "multidict-6.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:7e73299c99939f089dd9b2120a04a516b95cdf8c1cd2b18c53ebf0de80b1f18f"}, + {file = "multidict-6.7.0-cp39-cp39-win_arm64.whl", hash = "sha256:6bdce131e14b04fd34a809b6380dbfd826065c3e2fe8a50dbae659fa0c390546"}, + {file = "multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3"}, + {file = "multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5"}, ] [package.dependencies] @@ -1483,13 +1355,14 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} [[package]] name = "nodeenv" -version = "1.9.1" +version = "1.10.0" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ - {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, - {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, + {file = "nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827"}, + {file = "nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb"}, ] [[package]] @@ -1498,71 +1371,48 @@ version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] +markers = {main = "extra == \"pyats\" or extra == \"docs\""} [[package]] name = "pathspec" -version = "0.12.1" +version = "1.0.3" description = "Utility library for gitignore style pattern matching of file paths." optional = true -python-versions = ">=3.8" -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - -[[package]] -name = "pbs-installer" -version = "2025.8.27" -description = "Installer for Python Build Standalone" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pbs_installer-2025.8.27-py3-none-any.whl", hash = "sha256:145ed15f222af5157f5d4512a75041bc3c32784d4939d678231d41b15c0f16be"}, - {file = "pbs_installer-2025.8.27.tar.gz", hash = "sha256:606430ca10940f9600a1a7f20b2a4a0ea62d8e327dcaf8a7b9acf2a2a6a39cb4"}, -] - -[package.dependencies] -httpx = {version = ">=0.27.0,<1", optional = true, markers = "extra == \"download\""} -zstandard = {version = ">=0.21.0", optional = true, markers = "extra == \"install\""} - -[package.extras] -all = ["pbs-installer[download,install]"] -download = ["httpx (>=0.27.0,<1)"] -install = ["zstandard (>=0.21.0)"] - -[[package]] -name = "pkginfo" -version = "1.12.1.2" -description = "Query metadata from sdists / bdists / installed packages." -optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ - {file = "pkginfo-1.12.1.2-py3-none-any.whl", hash = "sha256:c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343"}, - {file = "pkginfo-1.12.1.2.tar.gz", hash = "sha256:5cd957824ac36f140260964eba3c6be6442a8359b8c48f4adf90210f33a04b7b"}, + {file = "pathspec-1.0.3-py3-none-any.whl", hash = "sha256:e80767021c1cc524aa3fb14bedda9c34406591343cc42797b386ce7b9354fb6c"}, + {file = "pathspec-1.0.3.tar.gz", hash = "sha256:bac5cf97ae2c2876e2d25ebb15078eb04d76e4b98921ee31c6f85ade8b59444d"}, ] [package.extras] -testing = ["pytest", "pytest-cov", "wheel"] +hyperscan = ["hyperscan (>=0.7)"] +optional = ["typing-extensions (>=4)"] +re2 = ["google-re2 (>=1.1)"] +tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] [[package]] name = "platformdirs" -version = "4.4.0" +version = "4.5.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" +groups = ["dev"] files = [ - {file = "platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85"}, - {file = "platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"}, + {file = "platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31"}, + {file = "platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.14.1)"] +docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx-autodoc-typehints (>=3.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"] +type = ["mypy (>=1.18.2)"] [[package]] name = "pluggy" @@ -1570,6 +1420,7 @@ version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, @@ -1579,77 +1430,16 @@ files = [ dev = ["pre-commit", "tox"] testing = ["coverage", "pytest", "pytest-benchmark"] -[[package]] -name = "poetry" -version = "2.1.4" -description = "Python dependency management and packaging made easy." -optional = false -python-versions = "<4.0,>=3.9" -files = [ - {file = "poetry-2.1.4-py3-none-any.whl", hash = "sha256:0019b64d33fed9184a332f7fad60ca47aace4d6a0e9c635cdea21b76e96f32ce"}, - {file = "poetry-2.1.4.tar.gz", hash = "sha256:bed4af5fc87fb145258ac5b1dae77de2cd7082ec494e3b2f66bca0f477cbfc5c"}, -] - -[package.dependencies] -build = ">=1.2.1,<2.0.0" -cachecontrol = {version = ">=0.14.0,<0.15.0", extras = ["filecache"]} -cleo = ">=2.1.0,<3.0.0" -dulwich = ">=0.22.6,<0.23.0" -fastjsonschema = ">=2.18.0,<3.0.0" -findpython = ">=0.6.2,<0.7.0" -importlib-metadata = {version = ">=4.4,<8.7", markers = "python_version < \"3.10\""} -installer = ">=0.7.0,<0.8.0" -keyring = ">=25.1.0,<26.0.0" -packaging = ">=24.0" -pbs-installer = {version = ">=2025.1.6,<2026.0.0", extras = ["download", "install"]} -pkginfo = ">=1.12,<2.0" -platformdirs = ">=3.0.0,<5" -poetry-core = "2.1.3" -pyproject-hooks = ">=1.0.0,<2.0.0" -requests = ">=2.26,<3.0" -requests-toolbelt = ">=1.0.0,<2.0.0" -shellingham = ">=1.5,<2.0" -tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} -tomlkit = ">=0.11.4,<1.0.0" -trove-classifiers = ">=2022.5.19" -virtualenv = ">=20.26.6,<20.33.0" -xattr = {version = ">=1.0.0,<2.0.0", markers = "sys_platform == \"darwin\""} - -[[package]] -name = "poetry-core" -version = "2.1.3" -description = "Poetry PEP 517 Build Backend" -optional = false -python-versions = "<4.0,>=3.9" -files = [ - {file = "poetry_core-2.1.3-py3-none-any.whl", hash = "sha256:2c704f05016698a54ca1d327f46ce2426d72eaca6ff614132c8477c292266771"}, - {file = "poetry_core-2.1.3.tar.gz", hash = "sha256:0522a015477ed622c89aad56a477a57813cace0c8e7ff2a2906b7ef4a2e296a4"}, -] - -[[package]] -name = "poetry-plugin-export" -version = "1.9.0" -description = "Poetry plugin to export the dependencies to various formats" -optional = false -python-versions = "<4.0,>=3.9" -files = [ - {file = "poetry_plugin_export-1.9.0-py3-none-any.whl", hash = "sha256:e2621dd8c260dd705a8227f076075246a7ff5c697e18ddb90ff68081f47ee642"}, - {file = "poetry_plugin_export-1.9.0.tar.gz", hash = "sha256:6fc8755cfac93c74752f85510b171983e2e47d782d4ab5be4ffc4f6945be7967"}, -] - -[package.dependencies] -poetry = ">=2.0.0,<3.0.0" -poetry-core = ">=1.7.0,<3.0.0" - [[package]] name = "pre-commit" -version = "4.3.0" +version = "4.5.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" +groups = ["dev"] files = [ - {file = "pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8"}, - {file = "pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16"}, + {file = "pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77"}, + {file = "pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61"}, ] [package.dependencies] @@ -1661,13 +1451,15 @@ virtualenv = ">=20.10.0" [[package]] name = "prettytable" -version = "3.16.0" +version = "3.17.0" description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" optional = true -python-versions = ">=3.9" +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ - {file = "prettytable-3.16.0-py3-none-any.whl", hash = "sha256:b5eccfabb82222f5aa46b798ff02a8452cf530a352c31bddfa29be41242863aa"}, - {file = "prettytable-3.16.0.tar.gz", hash = "sha256:3c64b31719d961bf69c9a7e03d0c1e477320906a98da63952bc6698d6164ff57"}, + {file = "prettytable-3.17.0-py3-none-any.whl", hash = "sha256:aad69b294ddbe3e1f95ef8886a060ed1666a0b83018bbf56295f6f226c43d287"}, + {file = "prettytable-3.17.0.tar.gz", hash = "sha256:59f2590776527f3c9e8cf9fe7b66dd215837cca96a9c39567414cbc632e8ddb0"}, ] [package.dependencies] @@ -1678,249 +1470,285 @@ tests = ["pytest", "pytest-cov", "pytest-lazy-fixtures"] [[package]] name = "propcache" -version = "0.3.2" +version = "0.4.1" description = "Accelerated property cache" optional = true python-versions = ">=3.9" -files = [ - {file = "propcache-0.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:22d9962a358aedbb7a2e36187ff273adeaab9743373a272976d2e348d08c7770"}, - {file = "propcache-0.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0d0fda578d1dc3f77b6b5a5dce3b9ad69a8250a891760a548df850a5e8da87f3"}, - {file = "propcache-0.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3def3da3ac3ce41562d85db655d18ebac740cb3fa4367f11a52b3da9d03a5cc3"}, - {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bec58347a5a6cebf239daba9bda37dffec5b8d2ce004d9fe4edef3d2815137e"}, - {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55ffda449a507e9fbd4aca1a7d9aa6753b07d6166140e5a18d2ac9bc49eac220"}, - {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64a67fb39229a8a8491dd42f864e5e263155e729c2e7ff723d6e25f596b1e8cb"}, - {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da1cf97b92b51253d5b68cf5a2b9e0dafca095e36b7f2da335e27dc6172a614"}, - {file = "propcache-0.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f559e127134b07425134b4065be45b166183fdcb433cb6c24c8e4149056ad50"}, - {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aff2e4e06435d61f11a428360a932138d0ec288b0a31dd9bd78d200bd4a2b339"}, - {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4927842833830942a5d0a56e6f4839bc484785b8e1ce8d287359794818633ba0"}, - {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6107ddd08b02654a30fb8ad7a132021759d750a82578b94cd55ee2772b6ebea2"}, - {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:70bd8b9cd6b519e12859c99f3fc9a93f375ebd22a50296c3a295028bea73b9e7"}, - {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2183111651d710d3097338dd1893fcf09c9f54e27ff1a8795495a16a469cc90b"}, - {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fb075ad271405dcad8e2a7ffc9a750a3bf70e533bd86e89f0603e607b93aa64c"}, - {file = "propcache-0.3.2-cp310-cp310-win32.whl", hash = "sha256:404d70768080d3d3bdb41d0771037da19d8340d50b08e104ca0e7f9ce55fce70"}, - {file = "propcache-0.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:7435d766f978b4ede777002e6b3b6641dd229cd1da8d3d3106a45770365f9ad9"}, - {file = "propcache-0.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0b8d2f607bd8f80ddc04088bc2a037fdd17884a6fcadc47a96e334d72f3717be"}, - {file = "propcache-0.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06766d8f34733416e2e34f46fea488ad5d60726bb9481d3cddf89a6fa2d9603f"}, - {file = "propcache-0.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2dc1f4a1df4fecf4e6f68013575ff4af84ef6f478fe5344317a65d38a8e6dc9"}, - {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be29c4f4810c5789cf10ddf6af80b041c724e629fa51e308a7a0fb19ed1ef7bf"}, - {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59d61f6970ecbd8ff2e9360304d5c8876a6abd4530cb752c06586849ac8a9dc9"}, - {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62180e0b8dbb6b004baec00a7983e4cc52f5ada9cd11f48c3528d8cfa7b96a66"}, - {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c144ca294a204c470f18cf4c9d78887810d04a3e2fbb30eea903575a779159df"}, - {file = "propcache-0.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5c2a784234c28854878d68978265617aa6dc0780e53d44b4d67f3651a17a9a2"}, - {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5745bc7acdafa978ca1642891b82c19238eadc78ba2aaa293c6863b304e552d7"}, - {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c0075bf773d66fa8c9d41f66cc132ecc75e5bb9dd7cce3cfd14adc5ca184cb95"}, - {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5f57aa0847730daceff0497f417c9de353c575d8da3579162cc74ac294c5369e"}, - {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:eef914c014bf72d18efb55619447e0aecd5fb7c2e3fa7441e2e5d6099bddff7e"}, - {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2a4092e8549031e82facf3decdbc0883755d5bbcc62d3aea9d9e185549936dcf"}, - {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:85871b050f174bc0bfb437efbdb68aaf860611953ed12418e4361bc9c392749e"}, - {file = "propcache-0.3.2-cp311-cp311-win32.whl", hash = "sha256:36c8d9b673ec57900c3554264e630d45980fd302458e4ac801802a7fd2ef7897"}, - {file = "propcache-0.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53af8cb6a781b02d2ea079b5b853ba9430fcbe18a8e3ce647d5982a3ff69f39"}, - {file = "propcache-0.3.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8de106b6c84506b31c27168582cd3cb3000a6412c16df14a8628e5871ff83c10"}, - {file = "propcache-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28710b0d3975117239c76600ea351934ac7b5ff56e60953474342608dbbb6154"}, - {file = "propcache-0.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce26862344bdf836650ed2487c3d724b00fbfec4233a1013f597b78c1cb73615"}, - {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca54bd347a253af2cf4544bbec232ab982f4868de0dd684246b67a51bc6b1db"}, - {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55780d5e9a2ddc59711d727226bb1ba83a22dd32f64ee15594b9392b1f544eb1"}, - {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c"}, - {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67"}, - {file = "propcache-0.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ca3aee1aa955438c4dba34fc20a9f390e4c79967257d830f137bd5a8a32ed3b"}, - {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4f30862869fa2b68380d677cc1c5fcf1e0f2b9ea0cf665812895c75d0ca3b8"}, - {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b77ec3c257d7816d9f3700013639db7491a434644c906a2578a11daf13176251"}, - {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cab90ac9d3f14b2d5050928483d3d3b8fb6b4018893fc75710e6aa361ecb2474"}, - {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535"}, - {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06"}, - {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b4239611205294cc433845b914131b2a1f03500ff3c1ed093ed216b82621e1"}, - {file = "propcache-0.3.2-cp312-cp312-win32.whl", hash = "sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1"}, - {file = "propcache-0.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7046e79b989d7fe457bb755844019e10f693752d169076138abf17f31380800c"}, - {file = "propcache-0.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ca592ed634a73ca002967458187109265e980422116c0a107cf93d81f95af945"}, - {file = "propcache-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9ecb0aad4020e275652ba3975740f241bd12a61f1a784df044cf7477a02bc252"}, - {file = "propcache-0.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f08f1cc28bd2eade7a8a3d2954ccc673bb02062e3e7da09bc75d843386b342f"}, - {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a342c834734edb4be5ecb1e9fb48cb64b1e2320fccbd8c54bf8da8f2a84c33"}, - {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a544caaae1ac73f1fecfae70ded3e93728831affebd017d53449e3ac052ac1e"}, - {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310d11aa44635298397db47a3ebce7db99a4cc4b9bbdfcf6c98a60c8d5261cf1"}, - {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1396592321ac83157ac03a2023aa6cc4a3cc3cfdecb71090054c09e5a7cce3"}, - {file = "propcache-0.3.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cabf5b5902272565e78197edb682017d21cf3b550ba0460ee473753f28d23c1"}, - {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0a2f2235ac46a7aa25bdeb03a9e7060f6ecbd213b1f9101c43b3090ffb971ef6"}, - {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:92b69e12e34869a6970fd2f3da91669899994b47c98f5d430b781c26f1d9f387"}, - {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:54e02207c79968ebbdffc169591009f4474dde3b4679e16634d34c9363ff56b4"}, - {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4adfb44cb588001f68c5466579d3f1157ca07f7504fc91ec87862e2b8e556b88"}, - {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fd3e6019dc1261cd0291ee8919dd91fbab7b169bb76aeef6c716833a3f65d206"}, - {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4c181cad81158d71c41a2bce88edce078458e2dd5ffee7eddd6b05da85079f43"}, - {file = "propcache-0.3.2-cp313-cp313-win32.whl", hash = "sha256:8a08154613f2249519e549de2330cf8e2071c2887309a7b07fb56098f5170a02"}, - {file = "propcache-0.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e41671f1594fc4ab0a6dec1351864713cb3a279910ae8b58f884a88a0a632c05"}, - {file = "propcache-0.3.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9a3cf035bbaf035f109987d9d55dc90e4b0e36e04bbbb95af3055ef17194057b"}, - {file = "propcache-0.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:156c03d07dc1323d8dacaa221fbe028c5c70d16709cdd63502778e6c3ccca1b0"}, - {file = "propcache-0.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74413c0ba02ba86f55cf60d18daab219f7e531620c15f1e23d95563f505efe7e"}, - {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f066b437bb3fa39c58ff97ab2ca351db465157d68ed0440abecb21715eb24b28"}, - {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1304b085c83067914721e7e9d9917d41ad87696bf70f0bc7dee450e9c71ad0a"}, - {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab50cef01b372763a13333b4e54021bdcb291fc9a8e2ccb9c2df98be51bcde6c"}, - {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad3b2a085ec259ad2c2842666b2a0a49dea8463579c606426128925af1ed725"}, - {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:261fa020c1c14deafd54c76b014956e2f86991af198c51139faf41c4d5e83892"}, - {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:46d7f8aa79c927e5f987ee3a80205c987717d3659f035c85cf0c3680526bdb44"}, - {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:6d8f3f0eebf73e3c0ff0e7853f68be638b4043c65a70517bb575eff54edd8dbe"}, - {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:03c89c1b14a5452cf15403e291c0ccd7751d5b9736ecb2c5bab977ad6c5bcd81"}, - {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:0cc17efde71e12bbaad086d679ce575268d70bc123a5a71ea7ad76f70ba30bba"}, - {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:acdf05d00696bc0447e278bb53cb04ca72354e562cf88ea6f9107df8e7fd9770"}, - {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330"}, - {file = "propcache-0.3.2-cp313-cp313t-win32.whl", hash = "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394"}, - {file = "propcache-0.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198"}, - {file = "propcache-0.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a7fad897f14d92086d6b03fdd2eb844777b0c4d7ec5e3bac0fbae2ab0602bbe5"}, - {file = "propcache-0.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1f43837d4ca000243fd7fd6301947d7cb93360d03cd08369969450cc6b2ce3b4"}, - {file = "propcache-0.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:261df2e9474a5949c46e962065d88eb9b96ce0f2bd30e9d3136bcde84befd8f2"}, - {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e514326b79e51f0a177daab1052bc164d9d9e54133797a3a58d24c9c87a3fe6d"}, - {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a996adb6904f85894570301939afeee65f072b4fd265ed7e569e8d9058e4ec"}, - {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76cace5d6b2a54e55b137669b30f31aa15977eeed390c7cbfb1dafa8dfe9a701"}, - {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31248e44b81d59d6addbb182c4720f90b44e1efdc19f58112a3c3a1615fb47ef"}, - {file = "propcache-0.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abb7fa19dbf88d3857363e0493b999b8011eea856b846305d8c0512dfdf8fbb1"}, - {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d81ac3ae39d38588ad0549e321e6f773a4e7cc68e7751524a22885d5bbadf886"}, - {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:cc2782eb0f7a16462285b6f8394bbbd0e1ee5f928034e941ffc444012224171b"}, - {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:db429c19a6c7e8a1c320e6a13c99799450f411b02251fb1b75e6217cf4a14fcb"}, - {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:21d8759141a9e00a681d35a1f160892a36fb6caa715ba0b832f7747da48fb6ea"}, - {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2ca6d378f09adb13837614ad2754fa8afaee330254f404299611bce41a8438cb"}, - {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:34a624af06c048946709f4278b4176470073deda88d91342665d95f7c6270fbe"}, - {file = "propcache-0.3.2-cp39-cp39-win32.whl", hash = "sha256:4ba3fef1c30f306b1c274ce0b8baaa2c3cdd91f645c48f06394068f37d3837a1"}, - {file = "propcache-0.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:7a2368eed65fc69a7a7a40b27f22e85e7627b74216f0846b04ba5c116e191ec9"}, - {file = "propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f"}, - {file = "propcache-0.3.2.tar.gz", hash = "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168"}, +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"events\"" +files = [ + {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db"}, + {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8"}, + {file = "propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c"}, + {file = "propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb"}, + {file = "propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37"}, + {file = "propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581"}, + {file = "propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf"}, + {file = "propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5"}, + {file = "propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f"}, + {file = "propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1"}, + {file = "propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6"}, + {file = "propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239"}, + {file = "propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2"}, + {file = "propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403"}, + {file = "propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75"}, + {file = "propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8"}, + {file = "propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db"}, + {file = "propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1"}, + {file = "propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf"}, + {file = "propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311"}, + {file = "propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66"}, + {file = "propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81"}, + {file = "propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e"}, + {file = "propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1"}, + {file = "propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b"}, + {file = "propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566"}, + {file = "propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1"}, + {file = "propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717"}, + {file = "propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37"}, + {file = "propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a"}, + {file = "propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12"}, + {file = "propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c"}, + {file = "propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144"}, + {file = "propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f"}, + {file = "propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153"}, + {file = "propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992"}, + {file = "propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f"}, + {file = "propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393"}, + {file = "propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455"}, + {file = "propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85"}, + {file = "propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1"}, + {file = "propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9"}, + {file = "propcache-0.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d233076ccf9e450c8b3bc6720af226b898ef5d051a2d145f7d765e6e9f9bcff"}, + {file = "propcache-0.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:357f5bb5c377a82e105e44bd3d52ba22b616f7b9773714bff93573988ef0a5fb"}, + {file = "propcache-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbc3b6dfc728105b2a57c06791eb07a94229202ea75c59db644d7d496b698cac"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:182b51b421f0501952d938dc0b0eb45246a5b5153c50d42b495ad5fb7517c888"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b536b39c5199b96fc6245eb5fb796c497381d3942f169e44e8e392b29c9ebcc"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:db65d2af507bbfbdcedb254a11149f894169d90488dd3e7190f7cdcb2d6cd57a"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd2dbc472da1f772a4dae4fa24be938a6c544671a912e30529984dd80400cd88"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:daede9cd44e0f8bdd9e6cc9a607fc81feb80fae7a5fc6cecaff0e0bb32e42d00"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:71b749281b816793678ae7f3d0d84bd36e694953822eaad408d682efc5ca18e0"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:0002004213ee1f36cfb3f9a42b5066100c44276b9b72b4e1504cddd3d692e86e"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fe49d0a85038f36ba9e3ffafa1103e61170b28e95b16622e11be0a0ea07c6781"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99d43339c83aaf4d32bda60928231848eee470c6bda8d02599cc4cebe872d183"}, + {file = "propcache-0.4.1-cp39-cp39-win32.whl", hash = "sha256:a129e76735bc792794d5177069691c3217898b9f5cee2b2661471e52ffe13f19"}, + {file = "propcache-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:948dab269721ae9a87fd16c514a0a2c2a1bdb23a9a61b969b0f9d9ee2968546f"}, + {file = "propcache-0.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:5fd37c406dd6dc85aa743e214cef35dc54bbdd1419baac4f6ae5e5b1a2976938"}, + {file = "propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237"}, + {file = "propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d"}, ] [[package]] name = "psutil" -version = "7.0.0" -description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." +version = "7.2.1" +description = "Cross-platform lib for process and system monitoring." optional = true python-versions = ">=3.6" -files = [ - {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, - {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, - {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"}, - {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"}, - {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, - {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, - {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, -] - -[package.extras] -dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] -test = ["pytest", "pytest-xdist", "setuptools"] +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "psutil-7.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d"}, + {file = "psutil-7.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49"}, + {file = "psutil-7.2.1-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc"}, + {file = "psutil-7.2.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf"}, + {file = "psutil-7.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f"}, + {file = "psutil-7.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672"}, + {file = "psutil-7.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679"}, + {file = "psutil-7.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f"}, + {file = "psutil-7.2.1-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129"}, + {file = "psutil-7.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a"}, + {file = "psutil-7.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79"}, + {file = "psutil-7.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266"}, + {file = "psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42"}, + {file = "psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1"}, + {file = "psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8"}, + {file = "psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6"}, + {file = "psutil-7.2.1-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8"}, + {file = "psutil-7.2.1-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67"}, + {file = "psutil-7.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17"}, + {file = "psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442"}, + {file = "psutil-7.2.1.tar.gz", hash = "sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3"}, +] + +[package.extras] +dev = ["abi3audit", "black", "check-manifest", "coverage", "packaging", "psleak", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-instafail", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel"] +test = ["psleak", "pytest", "pytest-instafail", "pytest-xdist", "setuptools"] [[package]] name = "pyats" -version = "25.7" +version = "25.11" description = "pyATS - Python Automation Test System" optional = true python-versions = ">=3.8" -files = [ - {file = "pyats-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:73eebb1cbd03415cd5c78be8c9a422c9b9f36a09ee7856c5226123c5ec91c140"}, - {file = "pyats-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a87cfb1770acac9bf98b74df9a574743889b559619798153a733d9c5e16cbde6"}, - {file = "pyats-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:2e997aff9bd8d2035a316eb233c6ff1157c36f3aae29f381bb1b76b97ccdf816"}, - {file = "pyats-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b399dee926f0b35aeac0a8d36971df97c894715f63d4251981db459bb5bdf035"}, - {file = "pyats-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:74992f08c524ffafda9bd230ea735f1bdbe5a7a92bd87d951d53451d9cc294f8"}, - {file = "pyats-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:bc97fe9ece4befeb6d634666fea9fb8e71c1f597f20a7051cc0b477517e8fbd9"}, - {file = "pyats-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:6f51cad54f069698037abbb861afa00e5fde92be5d43307085c80004b3be42d0"}, - {file = "pyats-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:d3b30f3f9c5c3195e27fe84830d4182fba2b133c7fc6c9fe50db878a74e56622"}, - {file = "pyats-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:cbf3be7b35a094033a92b4c1af2b7f80580964a1db93a2a88221b4d4460f59ca"}, - {file = "pyats-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:7b2ecbed12cc920a1ba0e7fac68d55a9c7c57b7c40ca1e1736852f56125d5dc6"}, - {file = "pyats-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:8604cc1996d970f68fb8aaf06678d224543996735ff24bfe263f39d2b98fb7b9"}, - {file = "pyats-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:d8602855fbb96dc65a6f983dc1ba4c27cc55f646bca274799f1568262b09472b"}, - {file = "pyats-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:95ad4f03939877e5b7cd76f6c91a9d057a118b2ac0387887ffdf5eeb563a571c"}, - {file = "pyats-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:61d86a47137c742334c0c7e2a9b7f60dd9e9c4cd67348b62e1603645dc5cc69e"}, - {file = "pyats-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f26bf4a663a51461f44118728787e896b045e25b732840e5e71912c60d071dbe"}, - {file = "pyats-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a97ea1354cd04b59ef45790bb9594e2303bf7ec8dbbb172fbf5e84dcbb16ffa1"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "pyats-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:b6f28c635440fbec0856908b7401f9a97a329481c5fc9e9bc26d6dee3038ddca"}, + {file = "pyats-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:0dfc5adcd1000de2de37d8729138e73266a73a9059db8e71c843549a35f7d785"}, + {file = "pyats-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:06505f88bc2072a25bf58fc4217d6e5a94a458edb89eb9ca370ac551a441bd9c"}, + {file = "pyats-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1aa50566c80dbedbe17685c2c2140eef8d17944fb12b76fffe6eb4894eceda2e"}, + {file = "pyats-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:efbc78a121afab1efbb82e05013db78eb8bcb8c0af2c1917aeb17229904ae8a3"}, + {file = "pyats-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:e4223a75f14cbd4b702465c12b010a513b920e2dc7b0d43090dbf2f3eda015a5"}, + {file = "pyats-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:b960a150a08080caa6df3d7d97220211e43f6587a8f712c58276e41c39e48ad8"}, + {file = "pyats-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:287e8324bd586eec0306bde061fa48e596964fb1fc85e93aba8c40d2157dd82e"}, + {file = "pyats-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:384b062ae44e20b96ef4f7489d98f0bae5be232afddf5304a71e506727e630a3"}, + {file = "pyats-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:b7276e27c9d260ffd09a1c19f29d5e07161af5cfc958ab8fbdcd62ef29127c49"}, + {file = "pyats-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:07cd28029f3670cfaf31dd571b4df43079e7d5da0da7570f82572c613175fd5a"}, + {file = "pyats-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:47f3be39940a60cdf1e886a28bc8dce70ebd3003f7c05127b35c9115c643feb2"}, + {file = "pyats-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:81c95ad295ae7dc964370ece4e3a722d2828b5c54b899c72133473922b2cd5b7"}, ] [package.dependencies] packaging = ">=20.0" -"pyats.aereport" = ">=25.7.0,<25.8.0" -"pyats.aetest" = ">=25.7.0,<25.8.0" -"pyats.async" = ">=25.7.0,<25.8.0" -"pyats.connections" = ">=25.7.0,<25.8.0" -"pyats.datastructures" = ">=25.7.0,<25.8.0" -"pyats.easypy" = ">=25.7.0,<25.8.0" -"pyats.kleenex" = ">=25.7.0,<25.8.0" -"pyats.log" = ">=25.7.0,<25.8.0" -"pyats.reporter" = ">=25.7.0,<25.8.0" -"pyats.results" = ">=25.7.0,<25.8.0" -"pyats.tcl" = ">=25.7.0,<25.8.0" -"pyats.topology" = ">=25.7.0,<25.8.0" -"pyats.utils" = ">=25.7.0,<25.8.0" - -[package.extras] -full = ["cookiecutter", "genie (>=25.7.0,<25.8.0)", "genie.libs.robot (>=25.7.0,<25.8.0)", "genie.telemetry (>=25.7.0,<25.8.0)", "genie.trafficgen (>=25.7.0,<25.8.0)", "pyats.contrib (>=25.7.0,<25.8.0)", "pyats.robot (>=25.7.0,<25.8.0)"] -library = ["genie (>=25.7.0,<25.8.0)"] -robot = ["genie.libs.robot (>=25.7.0,<25.8.0)", "pyats.robot (>=25.7.0,<25.8.0)"] +"pyats.aereport" = ">=25.11.0,<25.12.0" +"pyats.aetest" = ">=25.11.0,<25.12.0" +"pyats.async" = ">=25.11.0,<25.12.0" +"pyats.connections" = ">=25.11.0,<25.12.0" +"pyats.datastructures" = ">=25.11.0,<25.12.0" +"pyats.easypy" = ">=25.11.0,<25.12.0" +"pyats.kleenex" = ">=25.11.0,<25.12.0" +"pyats.log" = ">=25.11.0,<25.12.0" +"pyats.reporter" = ">=25.11.0,<25.12.0" +"pyats.results" = ">=25.11.0,<25.12.0" +"pyats.tcl" = ">=25.11.0,<25.12.0" +"pyats.topology" = ">=25.11.0,<25.12.0" +"pyats.utils" = ">=25.11.0,<25.12.0" + +[package.extras] +full = ["cookiecutter", "genie (>=25.11.0,<25.12.0)", "genie.libs.robot (>=25.11.0,<25.12.0)", "genie.telemetry (>=25.11.0,<25.12.0)", "genie.trafficgen (>=25.11.0,<25.12.0)", "pyats.contrib (>=25.11.0,<25.12.0)", "pyats.robot (>=25.11.0,<25.12.0)"] +library = ["genie (>=25.11.0,<25.12.0)"] +robot = ["genie.libs.robot (>=25.11.0,<25.12.0)", "pyats.robot (>=25.11.0,<25.12.0)"] template = ["cookiecutter"] [[package]] name = "pyats-aereport" -version = "25.7" +version = "25.11" description = "pyATS AEreport: Result Collection and Reporting" optional = true python-versions = ">=3.8" -files = [ - {file = "pyats.aereport-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:3be5fff259e13da8d9569f4079d3f56e552b6a9e02a141fe0b9e07a0c9cee27b"}, - {file = "pyats.aereport-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:b76454c3af704b8cfdd2043ada3fd533b9807846386af7bc44cfb124c7a9c525"}, - {file = "pyats.aereport-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:9863ad99c1b1677a319eb8a3f69a3ae9fe79a9b4e842c6f937e772b26f2fd498"}, - {file = "pyats.aereport-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:876ce20682a014ab238d6adcf2f48472c5cd4fbcdc69b03dc4b122ed6c9601cb"}, - {file = "pyats.aereport-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:2231ed5d6d5c786bf376e96837af1c628c0184d59dbab9672003e8acaf6351a0"}, - {file = "pyats.aereport-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:4197a453d214577e63b6bccff5ae2f83bd536cf7af1061370a4d1a0c804c26b4"}, - {file = "pyats.aereport-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:af25a3fbcdf2443279432f80b120403606d04ad8160a70e5ae36bbb1d32fc345"}, - {file = "pyats.aereport-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:acc65e0a6997fd4580fcfff250039dafa7a1fa69089e26a743d7dc2fc95d13bf"}, - {file = "pyats.aereport-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:6c01622a5403de82d27dfd01e8f5778cafb2a35222002407f2e4a9842474390b"}, - {file = "pyats.aereport-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8eb145c4d813216a37d756d7e3954a701f9b925ac0cf13d921a601c6ddd376d1"}, - {file = "pyats.aereport-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0a6bdade4bd6348f8510e0795fb0caab5c3712619014eb3ea7ab04bbd3e84ed6"}, - {file = "pyats_aereport-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:05c3316e8502a330953059ca26b1199bb15be5ac5905fcae613e8c5477ff11dd"}, - {file = "pyats_aereport-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:44d5c2a92341cc79015cb681210261c584621eaaf8268295b9a3facbcdc740ff"}, - {file = "pyats_aereport-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:13a1b9fe8c2368dbb7cb7c5efeedbf939fbf0eb1897113a50943d39c31cabdc1"}, - {file = "pyats_aereport-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:90e7b5b8c08cf4dfceedde86bb7d1145b1e1da0e5e477dc43ba91a2cc46e1057"}, - {file = "pyats_aereport-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5c2b37f38572a956118211cb0a4b43c4240d88fbe3db212effa9ff34364d7206"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "pyats_aereport-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:1803724eac82f8e6ef8ef253503af262972c829804661df1b219cf477cfd2a38"}, + {file = "pyats_aereport-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9150f93bd961742c2daf2c5a38f29f5f6c4472a2be1eb36ff337dd8f9f801dc1"}, + {file = "pyats_aereport-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:0471f74d3805e05d609ad91a9c6bf3b38be9f8af32a6922ba39f8dc8df97b4ce"}, + {file = "pyats_aereport-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:25415b33dc8867e03f7134b648c6b19b0ee1d5b78c42efdc2a4cb25522541d12"}, + {file = "pyats_aereport-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:49e257717d3b028f85c403985c1223089e9d657997059a0842f876e52fa40575"}, + {file = "pyats_aereport-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:2f4cbd6c6a5fa838525dbdb329dfa0bdb5dcde5f4d9cb9a3df07d542a8c20270"}, + {file = "pyats_aereport-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:07907fd63e4f4ead9bd2d38c7c0e92d08621f8d3d25625b2e2a7847c93e1287f"}, + {file = "pyats_aereport-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:bb2867f9cf0d8f988709cc5305440bb1294452daa4b0f167cca3a30cfaf5881f"}, + {file = "pyats_aereport-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:09b4ff16ea799c2cc56a59d588302795b22d2614539dfb8c9482b7026adef2fc"}, + {file = "pyats_aereport-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:3434fa0a8aeff1a632757e76b6079246d5dbcc0a937ef94f9f607094a701250a"}, + {file = "pyats_aereport-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:2be47a56e23f0fbc74f3ae4797a57839ec8957e5f4e943640b18f1955e18a2e3"}, + {file = "pyats_aereport-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:757c637b00671aa08472f85c93375c869f2cc9e4970162d6ac25b19bb4cb8501"}, + {file = "pyats_aereport-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:39a6040fac8641feffbd5432097f3d1d60d29ed19fa210c1e5e061dee9af4e6e"}, ] [package.dependencies] jinja2 = "*" junit-xml = "*" psutil = "*" -"pyats.log" = ">=25.7.0,<25.8.0" -"pyats.results" = ">=25.7.0,<25.8.0" +"pyats.log" = ">=25.11.0,<25.12.0" +"pyats.results" = ">=25.11.0,<25.12.0" [package.extras] dev = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pyats-aetest" -version = "25.7" +version = "25.11" description = "pyATS AEtest: Testscript Engine" optional = true python-versions = ">=3.8" -files = [ - {file = "pyats.aetest-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:60659b7a078cdd2ea65129d10e6d3f0a0e40035dbeefb29724a4a80da175f921"}, - {file = "pyats.aetest-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:96a38f834fca70647c997d1318a93bb3908f1e8c0019087bb1262fcbd18feeac"}, - {file = "pyats.aetest-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:f1d76a460e98b0b1f53eb80d0f360e61644ad1c0734f6c4839cb6157e184eb1c"}, - {file = "pyats.aetest-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:20be71372179da9020221ac55fc59ce9af18e70bec19f7fe09ae8748b28fbea5"}, - {file = "pyats.aetest-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4b5b063d41025f071b3a9a69d48147f58a0bb4c43f5fde68aa0d351fdbb46cbe"}, - {file = "pyats.aetest-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:45a742d707a52ca8a376b84505224c33bb5006a3846c5642f38b5704175ea801"}, - {file = "pyats.aetest-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:8206943a7044465f12c6bb3f6d51e52a6a16d5595e26aedf68b9d3dea59ea97d"}, - {file = "pyats.aetest-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:cf97d2e0fd5c81b5cf0052cc4dcc05a7e4f2d34388e41425730774346d044e62"}, - {file = "pyats.aetest-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:36f2a8b4db4b42ed2b52a5ae9aab2805688832942be0246c6d7f3f93bc6535da"}, - {file = "pyats.aetest-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f83ac8e4a92e57028f7a7c1bdd7c7cd6744813f9b7540233831676e02e718784"}, - {file = "pyats.aetest-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:273eec2370a1c01d6743a8cd6ab4bb5fd55829baf36ed6e9bd72fae836c3edce"}, - {file = "pyats_aetest-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:8d308ce070faa5ea6fccd34b8af251a08478ccf813cdb35def17bd1bc48e5ac2"}, - {file = "pyats_aetest-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:1755066ce04b3f1375ee717f1877ca4f440e40ab19825b8ad9750397b1537536"}, - {file = "pyats_aetest-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:f189e69c8c3ec597e98cb5c1091ea889265754f6c23e73b7780aaddd6d61c472"}, - {file = "pyats_aetest-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:68841b16f154e822247b22875ca6ec4718c43defb5894f963e634b9a40010485"}, - {file = "pyats_aetest-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:022d6f14fbab8fe841b4330570488c8fb614cf27b46e4f864d04c43bd571a882"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "pyats_aetest-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:f316531ca5efae94727e00c5a696397a2a8ff1031fea6a9e3ce9647adfd71464"}, + {file = "pyats_aetest-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9d279f2589946fdeed2f8a95f05a7aa4796bd2469c4d1b91ac5cdbb612d24ce4"}, + {file = "pyats_aetest-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:2242dd0d43edb934de4459dc742f661cc132a6eb6966365aa3821730d644d73e"}, + {file = "pyats_aetest-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ba00c10d24c2fb9cb1992ffc1658bce3cf973293678af5c169d826e5b9e1c51f"}, + {file = "pyats_aetest-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:58c565debe58e3025f3b5182b41dc5d7f401f7888e18931aa16b534c75d7c3da"}, + {file = "pyats_aetest-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b19b025952ccfb2c7673a3d739a2e7869dcd68edfff81e6ec8aad0ee458edc01"}, + {file = "pyats_aetest-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:44047b563c0bbe251995012a4d4b0beac33649b398cc58fc68cbf3da9fa4c7ff"}, + {file = "pyats_aetest-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:612c4cb441b897c5f079c25032a60a5ff7979f2caebdeca757892f004fd88e2f"}, + {file = "pyats_aetest-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:b682bf842badd1f0637319d6ec02bece427fe279bccc908d3371ac789f1acc99"}, + {file = "pyats_aetest-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:54faedd1281a57368720bafd190d6e321b9e299783be1c191fd9f473cd2a5063"}, + {file = "pyats_aetest-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:df944130cfc32376c38e178632aebe3ad1c1d62557c34deb06409e83627da49c"}, + {file = "pyats_aetest-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:1f49e0412eac78af98b99cda89d1f2a75b0ba6a0530a9ad5d3a12a5e70465d4f"}, + {file = "pyats_aetest-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:de7d4f65cd1f00362449358a64d5ed2092d91abdca79817c3a4c3f3fbe08ad0f"}, ] [package.dependencies] jinja2 = "*" prettytable = "*" -"pyats.aereport" = ">=25.7.0,<25.8.0" -"pyats.datastructures" = ">=25.7.0,<25.8.0" -"pyats.log" = ">=25.7.0,<25.8.0" -"pyats.results" = ">=25.7.0,<25.8.0" -"pyats.utils" = ">=25.7.0,<25.8.0" +"pyats.aereport" = ">=25.11.0,<25.12.0" +"pyats.datastructures" = ">=25.11.0,<25.12.0" +"pyats.log" = ">=25.11.0,<25.12.0" +"pyats.results" = ">=25.11.0,<25.12.0" +"pyats.utils" = ">=25.11.0,<25.12.0" pyyaml = "*" [package.extras] @@ -1928,91 +1756,88 @@ dev = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pyats-async" -version = "25.7" +version = "25.11" description = "pyATS Async: Asynchronous Execution of Codes" optional = true python-versions = ">=3.8" -files = [ - {file = "pyats.async-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:61e6cbbf72a50e260f09394c814c77d5b7602dcafec95eb4409f51be51a6f08d"}, - {file = "pyats.async-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:6f72f286d9d173bd0601811e7db543f5321217bc1c39b5793a8aa66b0b45a1f5"}, - {file = "pyats.async-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:f715a4254767c159f70c09f2a25bc93823aaef689b1e4d7632629bc1762c379c"}, - {file = "pyats.async-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:254ebf8e72833d829603da3e0480a8ad10af6fa325d71af9ad66d36db6207b91"}, - {file = "pyats.async-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:20bc19a139136ab03ed483fbc545bce29a893d793d67ecf039eb7a77b009f945"}, - {file = "pyats.async-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:a4c3330af499e8bb0899df88c3db824714981d46ec43c2f54f5606cb4d66843c"}, - {file = "pyats.async-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:b681959acb95272cdacd9bffdad627213db2347dcd86c89d604689dde8f30b93"}, - {file = "pyats.async-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:a0091f36ad108ed381d5ec671fa93d41e31bdd3bfa7d1be982df0fc8f631616a"}, - {file = "pyats.async-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da5f9308721532480b0dc575cc3be967779b2853d1eb55b3e6bf90ffc477063f"}, - {file = "pyats.async-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:7f11e926255a0306b1ff354eb8183e34fbbbb0f5a22dd9c99da13a6a5d6c6bff"}, - {file = "pyats.async-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:715d3eaff81e0a38cc6010a52e4a9aead1976ab6fc85fd9a8fde2e2d69a236cf"}, - {file = "pyats_async-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:13e1003d6fd8b7b71fbb2f3de6f86f4958af80b5f25ee72ebd55aed1e0f1f822"}, - {file = "pyats_async-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:2143f926cc5e929a7b1f2915d97bef80a7ca99cafa860eb382d1a17cbb300f57"}, - {file = "pyats_async-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:58eec39358f1be77f2271f9db85152e79cb051ea7f4ffa4f4833e558514df7b8"}, - {file = "pyats_async-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:9aeb7614348e7fa0eadfc911830a94748c1289e94672f58e24974670c39676d4"}, - {file = "pyats_async-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8f4abae83d204d09540ebdba3f362229f24012296cece27b3b9e08bbb8053ccb"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "pyats_async-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:dce112213685404202f1a67234803ab5ac4578354b11a7e8bb9d4d4fd5919493"}, + {file = "pyats_async-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d89116ff530cf28544f5e0fc0a174bd0c770fbd43251ef305ab07863b5edefad"}, + {file = "pyats_async-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:ba0ccea670337cec4e10786502d1c6c897d083e5bb34e16cf7840fd576e3adb1"}, + {file = "pyats_async-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b2323d51d0fcd8dc92ba2b431536d83e67000b6f6b639cfea9cb929a1fbc7782"}, + {file = "pyats_async-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:3bc983bd93e2c70e43e1ec2d4dfb59383299224de48bae8c59d878f2f020e134"}, + {file = "pyats_async-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:0236cd5dab6cbf54da6d89db5866dc3d6cfb6805f9a9aa9473a43fe3669daedc"}, + {file = "pyats_async-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:98901be8833897fd0b27c22a34b1f9ed46506d7b5dd9dc24b651434f11c1e2a5"}, + {file = "pyats_async-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5de74dc8ac6a827ddfd27cdd0d29236754f7d96c5f45c25371c2868aa8da53e6"}, + {file = "pyats_async-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:c29c69f8524aab357e8bc7d7b401657d4f9e30590acd04e74ca58dc8f18ade1f"}, + {file = "pyats_async-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:02083547ce2cc13fc97dd716615fbb913cecd2585b7652c64fe54198eb9ab317"}, + {file = "pyats_async-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:b4bbc8168667730b56951e75dfc36b7a4b72ce222ff607fb3e93d8b1ee8a7a99"}, + {file = "pyats_async-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:ebfd6684c13df967e449b86eb608c8ee2e0e49968a859395bdeb738a4fa1c18d"}, + {file = "pyats_async-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:ca0cc1465f9abb6d4a75a543f91108f9f8a55923594c86b3bb1b4e2d3e456c8c"}, ] [package.dependencies] -"pyats.log" = ">=25.7.0,<25.8.0" +"pyats.log" = ">=25.11.0,<25.12.0" [package.extras] dev = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pyats-connections" -version = "25.7" +version = "25.11" description = "pyATS Connection: Device Connection Handling & Base Classes" optional = true python-versions = ">=3.8" -files = [ - {file = "pyats.connections-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8eea1ea1a1f2c991fda08ffe60553a59589b4d28ce18f63a5044f28604fb4f83"}, - {file = "pyats.connections-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:62c1e9877b2974a5d2dac83aa5337f18a9e4fac6daacb6b677066402336aa6f4"}, - {file = "pyats.connections-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:90c5e26618ec71f2cc9fb5a808e8871bd2db0a7c8f5ac4951e7ceb25f434006e"}, - {file = "pyats.connections-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:6e531ac1e69799ab91b1823bcaec6d3f656063804deea139796e8471e3e36ecc"}, - {file = "pyats.connections-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5f8ca5e14ad258c45b2a61b28ca78e6a6114109964e747790d616a6f5cb09f05"}, - {file = "pyats.connections-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:0b16dd47deda02e376d62dcdfd84413029fc1fb55378568bcfecd8f50a7afa01"}, - {file = "pyats.connections-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:b62a007aaf3f4ead71e7a70975b6b498467053addb6f1961632e5985cc2f53b4"}, - {file = "pyats.connections-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:e15414a65568a2a473021abc6a31a2f042cbd9d2e6ba8bf54f22d91d1c9e1662"}, - {file = "pyats.connections-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:bcb815f383c630eaefa3822d8ffaca06dca8385194abc27685114fcf38b2c966"}, - {file = "pyats.connections-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bb6644acef0f206a88d4d6b0015e74e1dbb0c7e350d3b91bc0780d88a7ee7167"}, - {file = "pyats.connections-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02646aa07532e7d80258cc7bdd72dfcf7719b3eda7436bb93b197cfb5e0e9384"}, - {file = "pyats_connections-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:589153f6c2ecb23c059d7bf97a62e1d7bf1cc14325f539cf104ccf7f4787f7cc"}, - {file = "pyats_connections-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:8e90fff4a9f41f56610076181fe686c34789b1b582f9c2734877a287a3a92a0d"}, - {file = "pyats_connections-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:91d579eda64655474c235653833c6dc8345f170eb9c4f15aee80376bd75f2f9a"}, - {file = "pyats_connections-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:0d11d0332ca0a412018e4f53c8e92ac98e5ba1d8eb273aeb4622cbcf4ba21021"}, - {file = "pyats_connections-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:347a99e550bc29acdca1900a56e298664d63eef26d8f340026e3ef85f4ea3897"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "pyats_connections-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:5ca5bd185a27eb3f9c89cfec42328a3a9687c696f18e4af5f027642780f867db"}, + {file = "pyats_connections-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c294c989c8ecaccbc468fba91f4ee9e3f1e08b95435b2b7dba3914e1d2ddeb9e"}, + {file = "pyats_connections-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:325182e9fb731aa267221e4706e5f3b34b6a978ee853ecd6527e625296ea22dc"}, + {file = "pyats_connections-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6970992e8a415d34301668da3156497b0e2e88de508d68f6e6ac3104e165d15a"}, + {file = "pyats_connections-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8ce0f10b7a639df2d9252f94771f014cf4dcdc50596567e1f3bef5d4519367e8"}, + {file = "pyats_connections-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:63ec2755230a24567f8f28173d31f70e6ac3bd968e44b5b6d16562657fda37d8"}, + {file = "pyats_connections-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:94cee62a35b5390f49051e444ee49192ef33d2a9135a7c999d5a769d72e81556"}, + {file = "pyats_connections-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:45be62c88d181cff39738105cdd00778b4c16db65a5ac8e4cedb8dee3a6f63a1"}, + {file = "pyats_connections-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:95a4b5c2ae7d6f520d9f405de914b6fe95c77ff84320c75dcc79cae338313453"}, + {file = "pyats_connections-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:c7082d955449b8c9bc3d8a0359931608d8fbe83280900c1608dcc5e7569cfdea"}, + {file = "pyats_connections-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:41320896b18b67905eae7e4295b0f3867c1a61355adf439d768a8141481e6244"}, + {file = "pyats_connections-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:ad321bb7d6f4d4afe250ec5b57f94331e52ab959edea6b8286a05f71aa1b39c3"}, + {file = "pyats_connections-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:ce10c020dcbf2fee46e48c224324fffb6ac6e7dbc797d2029d7e259be5206c9b"}, ] [package.dependencies] -"pyats.async" = ">=25.7.0,<25.8.0" -"pyats.datastructures" = ">=25.7.0,<25.8.0" -unicon = ">=25.7.0,<25.8.0" +"pyats.async" = ">=25.11.0,<25.12.0" +"pyats.datastructures" = ">=25.11.0,<25.12.0" +unicon = ">=25.11.0,<25.12.0" [package.extras] dev = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pyats-datastructures" -version = "25.7" +version = "25.11" description = "pyATS Datastructures: Extended Datastructures for Grownups" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ - {file = "pyats.datastructures-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:672c968e1228ed8b04f2e8075606f1c132a0c17ab5b0565b61599e3a2cf86fdc"}, - {file = "pyats.datastructures-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:18057f77a4013432040593676e9ece233593620d3a70cdcabafd73ffe6014b23"}, - {file = "pyats.datastructures-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:f12622a3c5990fca9270ee38dd12cb7f469fa51a18bd7f6cb85a0ce21c994d2c"}, - {file = "pyats.datastructures-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:048f8837c6ca5a8796941bf03ece6c4032adf6c57e9be00fa2ba51728e1eae81"}, - {file = "pyats.datastructures-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:e42f030954722dd77a2c343364ebc428556eb737cb33d52dca5d07fd2c69a47b"}, - {file = "pyats.datastructures-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:e79b0cddf279596ca139094650e9f232b81f4a591fb3079fb005a491c3cbf843"}, - {file = "pyats.datastructures-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:4908530e924facf0ffc8f47f0a761dbc4a9709bb801fae940f733ca4e2fa6521"}, - {file = "pyats.datastructures-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:cce4f3dc2e59ed5079ddbfda880064f81572dcff5bd22909b60159d9be842c56"}, - {file = "pyats.datastructures-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:17289db7eda2a851df35b42852a7fbb906674d88f36c8e5c524ace7d9596ba29"}, - {file = "pyats.datastructures-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f408bd3f299d52697fb494689f7b73d92b0a2f119b011699f8f5ec487287f3af"}, - {file = "pyats.datastructures-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:be957714c13fc7710045d8fa4b7c1ad4f9f810c0daf4313dccbccc46eb5553d2"}, - {file = "pyats_datastructures-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:e2897e91e6b2dbe42af87a2e02c1dd8d5a602ccce62978672b7784a79162661f"}, - {file = "pyats_datastructures-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:59b4a5fad6e2158717733bd028cfbfc1b8d408063bb625b02c5db15d1fc8a754"}, - {file = "pyats_datastructures-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:25e712c62c71828c57b9ee2e54a24c0820ceee8f05c59afbb4656adedbdcea23"}, - {file = "pyats_datastructures-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:cd8ae843048432dcad731c4a29c923895e53761019d8b9e359928d00c32a2f06"}, - {file = "pyats_datastructures-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1dc9626c400e79959ef9ecffb9c3627f1ce9ae26085d8ceeeecfe5d41ffc0f59"}, + {file = "pyats_datastructures-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:99b43706e8dada2310e9b0dcef537efa0625ab133741ea85a6f1e8b94695d1e6"}, + {file = "pyats_datastructures-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:919255b42f559be3ba8664bb2fcaaed8a9d1f2141f4ce23f701c75a8cf4014bd"}, + {file = "pyats_datastructures-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:5fe7644bd88fb7fc142f4ed724154df8c1492e451bbe756e4814e47bc85ea15f"}, + {file = "pyats_datastructures-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a9a25f8355b17530431372811514de9e7d1b6355abe0c3f242a6bcd210abb9da"}, + {file = "pyats_datastructures-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:2e712594df659d7321a1fb23306f90e11da235ea8d1370fa93e664c5c5990c7f"}, + {file = "pyats_datastructures-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:187f506c4ce5ad8e9a7ea14a7f0ca2ab4e5dd6fe939e37e74b9edbb8c7f28d19"}, + {file = "pyats_datastructures-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:c9f2d786474b0b242c1fae92f176bc00fff9ae5782b8805e5ad9932b7a436805"}, + {file = "pyats_datastructures-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:2e5b535a7e8a72cc0f5c12c24057135dd9266c380213dc4e55989da8232f319e"}, + {file = "pyats_datastructures-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:c6b99ed53215361a1d27b70c12a5b1e939a841348eb6a536ddfbc5fee34d67a2"}, + {file = "pyats_datastructures-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:6e7fbfc3f345afd7a6537f3477f918f8344071e2cc783e4577e74d5df5ce863f"}, + {file = "pyats_datastructures-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:5d43fd89db4ff77a225e71dd3aa356bbc14cad45f61d20a716b54fb68e4da782"}, + {file = "pyats_datastructures-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:1192c8cf9143cae5946f9a4666701f3ed5adc60231495b367add068d75996e4d"}, + {file = "pyats_datastructures-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:36e6d2e3ab5344637f60a43753c1c1adf3cce8d7811fbeb5125e2a4514a9daec"}, ] [package.extras] @@ -2020,40 +1845,39 @@ dev = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pyats-easypy" -version = "25.7" +version = "25.11" description = "pyATS Easypy: launcher and runtime environment" optional = true python-versions = ">=3.8" -files = [ - {file = "pyats.easypy-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8f9469aa9e6d66189aea49fc56f5b9df28d849d6adcd88bffd9cbc6860c39fff"}, - {file = "pyats.easypy-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:fecd4799d9655380d77396fbe2f96122774a81c7bc7fdf90df437078b1fa8752"}, - {file = "pyats.easypy-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:462fea1f92f262f228b4e50f95c374f43639ea27f98f7a998d0f378bdf927edc"}, - {file = "pyats.easypy-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:4bf3da140d0cf1c47a2a9b440b97528e36bceec365ccbd8611631a4c1c47d88e"}, - {file = "pyats.easypy-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:31fecf7c00208a0b3c92a0e779cf0a5af2fb82caad02e17909b9db130c6164e4"}, - {file = "pyats.easypy-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:3269cd93cbf1a81f3be9bd53ffdaf54c9ff4d2c30238b7613bb2c858f67de00d"}, - {file = "pyats.easypy-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:ef13adcc76a9d2dcb0bcbe8a1c9af2bb06593f545c0818ee11c9233e67a17ca4"}, - {file = "pyats.easypy-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:c14c649896f548cae991ed1cd5c7583212706b156f146015c3f28e9d7d2b9ea9"}, - {file = "pyats.easypy-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:e1be5039f728f7b7762387cbfce67fa9af38559990264dcc14d4cf49266fe62d"}, - {file = "pyats.easypy-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:1eccb162b8b219853c4c632e6f3835096273065048b4d1be96aafa9bd5fdf8dc"}, - {file = "pyats.easypy-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ce1597c1d737fc03ab77c0dce07dfabce6643ed458db60930dd31e21fdda2a1"}, - {file = "pyats_easypy-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9043199aeb10079f63062d8138d17a60efdf18489381508db1c0401ec8093002"}, - {file = "pyats_easypy-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b5e85164ca7044e3661b9e110bb70ffd5629c5d5236c80f7b084b73563810084"}, - {file = "pyats_easypy-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:70d3ad2e522bc5f1e7ff73d3983424957f59c6f9f89eac262a063fed3de9b11c"}, - {file = "pyats_easypy-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:f8779ae2be3981b04189afd46701eb94e33d2d84a00c68b6719e40870d2a63c5"}, - {file = "pyats_easypy-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:93399856c7ab6936da608ab915947abc68c3639f21efdff233da264156ea7125"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "pyats_easypy-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:e024719159f66179b32b32886858193d9516747cb59e4bdf20ad3122ee5ec76a"}, + {file = "pyats_easypy-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:75a331b34919926f450a28461b9c8560a43d155314a9c7ca00a7e61a9f0e85a5"}, + {file = "pyats_easypy-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:1092673edd2673a1c959b440e09902c81fefabca8b9f063d9ad3ead43908fee8"}, + {file = "pyats_easypy-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e71bd977da2648027bc70e91449b244f3cb1df98ba3420a331c2d02e07de2e44"}, + {file = "pyats_easypy-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:d0bd1af96eb9cbc5bb11c179398ce9a98d81c5244cc1cfaad408ac20c8f14c87"}, + {file = "pyats_easypy-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:1db68cdcd18f5f52134a595f6927a1c848a643fee55b8a1d3acf2b27e1435994"}, + {file = "pyats_easypy-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:01e98fbba645639a17a1d1749705103aa070e31af0577fb37b2a649fbbe9832f"}, + {file = "pyats_easypy-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:10c16d55db0aa043ba91f1f431d1966cc91a490b996af7b535e87823e3991627"}, + {file = "pyats_easypy-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:52ac75f0513ec58e1297b6e401235f4f87c88bfdcde098f58121eef0ba5a83af"}, + {file = "pyats_easypy-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:b265b73fed2c241b53f17b1591c60f2d28fb1419f6539097758514fcf1ccbace"}, + {file = "pyats_easypy-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:825047ea2f144b2d8a7c5799dbaa472bda1a71d0699308fbad55a4c85e6f5f1d"}, + {file = "pyats_easypy-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:4dab5ee4ade834ba32652c51411492ccdfc715346fd668442cc347ebb86efeb1"}, + {file = "pyats_easypy-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:db1f83beb6badbadab868827854edc294b2f302eb527a0b90d8d89f70bbd265d"}, ] [package.dependencies] distro = "*" jinja2 = "*" psutil = "*" -"pyats.aereport" = ">=25.7.0,<25.8.0" -"pyats.datastructures" = ">=25.7.0,<25.8.0" -"pyats.kleenex" = ">=25.7.0,<25.8.0" -"pyats.log" = ">=25.7.0,<25.8.0" -"pyats.results" = ">=25.7.0,<25.8.0" -"pyats.topology" = ">=25.7.0,<25.8.0" -"pyats.utils" = ">=25.7.0,<25.8.0" +"pyats.aereport" = ">=25.11.0,<25.12.0" +"pyats.datastructures" = ">=25.11.0,<25.12.0" +"pyats.kleenex" = ">=25.11.0,<25.12.0" +"pyats.log" = ">=25.11.0,<25.12.0" +"pyats.results" = ">=25.11.0,<25.12.0" +"pyats.topology" = ">=25.11.0,<25.12.0" +"pyats.utils" = ">=25.11.0,<25.12.0" setuptools = "*" [package.extras] @@ -2061,37 +1885,36 @@ dev = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pyats-kleenex" -version = "25.7" +version = "25.11" description = "pyATS Kleenex: Testbed Preparation, Clean & Finalization" optional = true python-versions = ">=3.8" -files = [ - {file = "pyats.kleenex-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:778f8ae805be54ea9dc90dbb326c72398ff33330fbd078cc17384da5937dc780"}, - {file = "pyats.kleenex-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:f26bc856c2da755f28243d8e63d749af4f7ee7d4f8ce4f8fab3c5485f17f4465"}, - {file = "pyats.kleenex-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:85891866ce7f28a09dd81513730fec31820737a71a4547cb9ae3c945fb38cdec"}, - {file = "pyats.kleenex-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:2a24bf7955adc34837fd51faef0f9d8085b60ce1702525b861d2359ddb8fee19"}, - {file = "pyats.kleenex-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:aa1eeb86c06acfb8e6029b1c059418c320a6a5f3901791adaa16ad0da9bd8587"}, - {file = "pyats.kleenex-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:4d0c9624b21f69695845fc387d6c123ff4272769f27c00452d112cfbf0dc791a"}, - {file = "pyats.kleenex-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a098fc44f923191aefdd517e8ac7a577fef2a0a5478db43c4f5b1eee8639957"}, - {file = "pyats.kleenex-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:2c7d29fd43346edb529f650471861d1dd120130ca3ea0fbee004b8cb49d244cc"}, - {file = "pyats.kleenex-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:34edfd5ac9c7bd0bbbe48f266ba706f8cfdf83d8eecace8a797563a3aad08f4a"}, - {file = "pyats.kleenex-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fb236ac18d856c0f3f99f3f988ede4cfeba98933e0e4e51438c9d5d853a857e7"}, - {file = "pyats.kleenex-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1989fe652c9d44bdbf4a5fc406a4d615a1598630070704173d1eb4e766d786b4"}, - {file = "pyats_kleenex-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a7bf71afa59c99f6aba86f3349a3f0386056521b43286f98a5cd1c1204ff1357"}, - {file = "pyats_kleenex-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:dc8107493bbd9d083995b7b981ce36cb3c349c9705b35d909b458d35e695e163"}, - {file = "pyats_kleenex-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:c64d233853c4d3a4f2a09f19a2417cc32beccbe772dfbd6a249efb6b3485e2f8"}, - {file = "pyats_kleenex-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:ac7431d6c09e7ab8843cb103bf4d8818139e6646080ecc0a8379d985e09b24e6"}, - {file = "pyats_kleenex-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1d705c921d6b3c288732394770d6e16b93fb61b7c4e87842e2a46ddf196c3957"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "pyats_kleenex-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:e14879d2545422e279587f5ef7283396cfb8498d701dcc5aca0608fd9e0c33f0"}, + {file = "pyats_kleenex-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9d7b1fc0aa08598115e736e0a9a3a9bb3eab4d9d79c069d5b61ac25c582918e1"}, + {file = "pyats_kleenex-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:b84e348145e5d8a251e447487e0d54e3863e46f4433a4c465ae8ee1b8b00f894"}, + {file = "pyats_kleenex-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:293a5dd27e707380fc73206f0bb5997f00495fa5595a079d861b24443d122c69"}, + {file = "pyats_kleenex-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ee6d4e8f47376fea0e61e742ec92f1093269bcf9aac9201fed6fcd7a7c167869"}, + {file = "pyats_kleenex-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:ce0ad7d01aba4671be97c271b2a600ddceafdc4ab9202d1d1433067651f9e1b4"}, + {file = "pyats_kleenex-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:4bc0672fd0dcf39d06e296e7e2ea7303bdcb8c492e3ad54c3b077aadb98a04e2"}, + {file = "pyats_kleenex-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:506fd8b195677a1400d62d9b1ac36845d7b0f8ab93e7e09936b42b3030c110cd"}, + {file = "pyats_kleenex-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:8b079ade62ad6d42d1d4eeeb200511628667ef50142988048f3c95c5f588180f"}, + {file = "pyats_kleenex-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:d597049c797f72dd746a577bacde1b3b2c0bf5e7775ce22e1989acdaa9571e6f"}, + {file = "pyats_kleenex-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:c6cac91d14c55db6f57e06a5dbc4c7bd6f738744552ef412fc3eb1d910166da2"}, + {file = "pyats_kleenex-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:a40f6601a61c71269cae8a8f62c65d871930018be7a5fc16025ef94e9d7c80e6"}, + {file = "pyats_kleenex-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:e36ded7f9604f17ee8d8c48b5d45c2425f2085b06cd99ff1d7e5c0d43db3cdf4"}, ] [package.dependencies] distro = "*" -"pyats.aetest" = ">=25.7.0,<25.8.0" -"pyats.async" = ">=25.7.0,<25.8.0" -"pyats.datastructures" = ">=25.7.0,<25.8.0" -"pyats.log" = ">=25.7.0,<25.8.0" -"pyats.topology" = ">=25.7.0,<25.8.0" -"pyats.utils" = ">=25.7.0,<25.8.0" +"pyats.aetest" = ">=25.11.0,<25.12.0" +"pyats.async" = ">=25.11.0,<25.12.0" +"pyats.datastructures" = ">=25.11.0,<25.12.0" +"pyats.log" = ">=25.11.0,<25.12.0" +"pyats.topology" = ">=25.11.0,<25.12.0" +"pyats.utils" = ">=25.11.0,<25.12.0" requests = "*" [package.extras] @@ -2099,27 +1922,26 @@ dev = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pyats-log" -version = "25.7" +version = "25.11" description = "pyATS Log: Logging Format and Utilities" optional = true python-versions = ">=3.8" -files = [ - {file = "pyats.log-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:71625f796b698fedd575dac83874279e8f6318ef3392d5722ea10ffc86939482"}, - {file = "pyats.log-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:6745c8feca1eedd6803f8742aad05411ccace74ca133bba2e560116edd6cc62b"}, - {file = "pyats.log-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:cc7c769da65d002f3c8a8e6ef6a42e8de5695ae03d2e5c3017b6abe89623c80b"}, - {file = "pyats.log-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:69dac3708f79db55aee4fdd0c12ee0c199664318d56d21f9bbc635e039206463"}, - {file = "pyats.log-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:144b8bddcd09ea97bdd6487a45ff0f39ed5c70238b23181bee16d5cc0ee219b0"}, - {file = "pyats.log-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:4af9d74985575bd8d8d0e4abfed7742d75359302141593e1cb0988980e3774e2"}, - {file = "pyats.log-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:bedd892974227e9e1cc4dd05dde08812528345dd9217df0c8dc4c16efc979e50"}, - {file = "pyats.log-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:f4ea1ee9f5c0968acbdf3b66be3a068e2c4329f9f4619272d6852def65595416"}, - {file = "pyats.log-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:09b506e783cf990d225806b57b22e461ce51f5ca95f4a06938b199ca9bae3105"}, - {file = "pyats.log-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8dea445c830e3403c9d39974ec80ad9be85ea30f73e2c57ef9b459844f595fd8"}, - {file = "pyats.log-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2375f0554b69293e21a02ce409d7b308441383ce99af0ab32810cc92a0b28b1d"}, - {file = "pyats_log-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:b682bd69bcc60b38992e6d3603b39b74ebc329b189929d6e0d1f1118d8cc3856"}, - {file = "pyats_log-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:f478b82d7dff07cac983703d42c0e1941ae2d99f9a860c7ccdfc1a72df4ae42e"}, - {file = "pyats_log-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:721262516c22dc3a0e5bef0c7cf276ed5a09d2bdb960f7700f20ba125bb037a8"}, - {file = "pyats_log-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:0ccaaec6e5017afb8420c667b4dfcb59c69dbfdada74f68df6de3a80f7f17109"}, - {file = "pyats_log-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:cf260208b62c5f0da8f6265bf0dcdb68da5a3b51014e78d811f5e28ea403b340"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "pyats_log-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8fbcd9e04ffae82b80ecabc90d7d2785657015aa3339c8fcbd33abe9cf122170"}, + {file = "pyats_log-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:46598d4aebcb3c7244501cc2083b1074e26d3419475122007f389f5f937ff883"}, + {file = "pyats_log-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:c5f9dd249e7e60ae5ec89f0d7788ea72b2147f80c01b294d610048c8a40d1207"}, + {file = "pyats_log-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d34b118ddc744d944548acaac31356a368df1d5a69eef37e9f6379428e81976"}, + {file = "pyats_log-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ea112e1cc50fa73964f46d57920fddc60d8117a33a92cf42f4c6dbef20cdd8cb"}, + {file = "pyats_log-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:f5303f7fb47b6c354696bfb303f1fb385ae7da7acd572308ccce753ff23be86c"}, + {file = "pyats_log-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:1247bc6b8ced9983f82781b4a67e1f7a1147cc100ff3f71ad6866c60f1540157"}, + {file = "pyats_log-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:616db49b5bee20b8728774645caa506ca0ea2986f4a7f48d01020bb4af42af45"}, + {file = "pyats_log-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:66e58b3126e2caade34e1effc241f53fa18c043b18eb3cbf9ddb4685157e3574"}, + {file = "pyats_log-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:de67df5e69b4c78fa36fc38e17496f3984999dff64ea88cd9be49d72dd6370c3"}, + {file = "pyats_log-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:7a10cacf63901fb8f0933fbc38041de7cddba5f2a329a8d238374907527ace07"}, + {file = "pyats_log-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:4d9226c7d1d44832df28e0151e49a53cd1806cc99013e14c7f8fd984880c5c9b"}, + {file = "pyats_log-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:8f4dbafaff9f26d8ceae5bb0852aaa99231361f8256978bf260ee10f334d1e90"}, ] [package.dependencies] @@ -2128,7 +1950,7 @@ aiohttp = {version = "<4.0", markers = "python_version >= \"3.6\""} async-lru = ">=1.0.2" chardet = ">=3.0.4,<5.0.0" jinja2 = "*" -"pyats.datastructures" = ">=25.7.0,<25.8.0" +"pyats.datastructures" = ">=25.11.0,<25.12.0" python-engineio = ">=3.13.0,<4.10.0" python-socketio = ">=4.2.0,<5.11.3" pyyaml = "*" @@ -2138,35 +1960,34 @@ dev = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pyats-reporter" -version = "25.7" +version = "25.11" description = "pyATS Reporter: Result Collection and Reporting" optional = true python-versions = ">=3.8" -files = [ - {file = "pyats.reporter-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:ac743c7a2a1d0ce679ef9652fcfd7f76824ff35120b880aaabff8e8716e8b253"}, - {file = "pyats.reporter-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:c48718974daa4a0ed8d7ae41622a81a4a539582f0a955dd05f3d766be728d123"}, - {file = "pyats.reporter-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:3d59430a568642c49d3c61ca4ba559e605a4e1483a4fa88d1c10b29ee4bff875"}, - {file = "pyats.reporter-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:a89ea161f3f294423eb0fe4cbf66b6060dd5e18fc70b4524d3258166160a9226"}, - {file = "pyats.reporter-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:fe03b6479af098f37122ee66181a00c26508478fc5563f610b3e08b59a634023"}, - {file = "pyats.reporter-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:8f0916799555ac6ee4aa29a208b0236a36e191ed4a0fbf932ef3180f1309d2ec"}, - {file = "pyats.reporter-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:69799be96ee2170d3b5017e9393d469972d6ce306dffe8232dcab3f33e06b098"}, - {file = "pyats.reporter-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:ffb187d3299e13b725b1e7b19ae7d3b36fb84b5b9f8b6871bbabfe12e29b85cb"}, - {file = "pyats.reporter-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:72ada8dc37bf0b56a5c62d81824c4e9d09ee7cf47ddc4fe7b8e342315e078b7a"}, - {file = "pyats.reporter-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:96bc475e765fa22f0cc3be139c16bc71cc7fa95b16b941394870aa1599801ee0"}, - {file = "pyats.reporter-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:40486390d4d767a0d497b5f1f929bceba060ffe17baed9958caee5b8630096f4"}, - {file = "pyats_reporter-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:4c74b535918fc475612488ca6578484d26db372d49732c2d3a908c49e3f37019"}, - {file = "pyats_reporter-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:6153b1993d09f6762a743e54509a7708d6cd1f56df28c57aa7c54aeffcb82077"}, - {file = "pyats_reporter-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:955f1816639433362ed24f613c08fb247900544dd39e94a942df9fff541ac040"}, - {file = "pyats_reporter-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:2a7e08265e94cf59c3a47cda493043b9ac1737a87ee11e286fd860413d7dbd6f"}, - {file = "pyats_reporter-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b82f7cf0e85fe33e9cc68d45de5264accfadece3f1b9daa3ec9c85dfbf682a8f"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "pyats_reporter-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:11e2b2c0106ebd6b3e98357cd175e69c8a097c229525530e98c16a84d62ea182"}, + {file = "pyats_reporter-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:e13fc29558833c724bbdff9ed4bed95b78c023fed7d4240ca84a91da5129b11e"}, + {file = "pyats_reporter-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:0ec7486490c9a86129e1116d1e66606f157821d1f5baaeac59e2470ba02da464"}, + {file = "pyats_reporter-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0d83eea930c229e999aa4af811d4c4c564f088d2384ce2413d6530348a383be6"}, + {file = "pyats_reporter-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:d7e6f6d9addb0158c74e9d1b0be0c8ee30e15b9a3f43484abcf6bd9bf0d4fcc9"}, + {file = "pyats_reporter-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:bea504f2ff7a50e6a5cec795c6c24af0e1d39fe767710221566356e6ca84f7cf"}, + {file = "pyats_reporter-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:c863874d383ec2164a64603fc1483862cf15e30df061f5bfafbade89fa46052a"}, + {file = "pyats_reporter-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:33463291c055ee8d3a3bb5cfbab3c11a8b58e4f7559ec949f11c56aaccda6244"}, + {file = "pyats_reporter-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:47e881a4ae5d291587a006f06db45e975a6b71483ba09e21538645f2011c9877"}, + {file = "pyats_reporter-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:cf84a2cf827f89bb47bc78e08832f8846c2c38238a50699d0add29fe6849a243"}, + {file = "pyats_reporter-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:103b9405355871a810f941cda80c14a77e052645099e75bc34624da13b45bc36"}, + {file = "pyats_reporter-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:25685621a93f68688d58d2d58d0b3427dc83232aade19c23d58796ed2db471b8"}, + {file = "pyats_reporter-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:219e19257c2e01e84fee4966c4ff16a28932c941d1ae0fb89fad79759cf5622a"}, ] [package.dependencies] gitpython = "*" -"pyats.aereport" = ">=25.7.0,<25.8.0" -"pyats.log" = ">=25.7.0,<25.8.0" -"pyats.results" = ">=25.7.0,<25.8.0" -"pyats.utils" = ">=25.7.0,<25.8.0" +"pyats.aereport" = ">=25.11.0,<25.12.0" +"pyats.log" = ">=25.11.0,<25.12.0" +"pyats.results" = ">=25.11.0,<25.12.0" +"pyats.utils" = ">=25.11.0,<25.12.0" pyyaml = "*" [package.extras] @@ -2174,27 +1995,26 @@ dev = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pyats-results" -version = "25.7" +version = "25.11" description = "pyATS Results: Representing Results using Objects" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ - {file = "pyats.results-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:82d3a078014ac91754e9c2e92c110c87cdec296087fb1ee64344b6e3e1bc4f68"}, - {file = "pyats.results-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:277264c76fdb4887ed90f61a0905ec8c48571601704951eca8aa4036935697df"}, - {file = "pyats.results-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1a883f73773ff0381e1261dc02b17a52104325ceacd480fa7981323c1d06dc6a"}, - {file = "pyats.results-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:925e69ebfb424e96560dfbfee0f0c24cbd92cd2ab5a46b1005789a7df6913d25"}, - {file = "pyats.results-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:0a4c90001964a4ae612e7943ad98adf86c4a63d780c4206935ffe2972ad7cec5"}, - {file = "pyats.results-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:2db3b669f2a3c785e0ff1d089c74194e1eca76dfe895d5911fd8c735728816eb"}, - {file = "pyats.results-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:8b679b084851360ba3c2656000856bf9a7773c91d73b04bb21be4ab309ae76be"}, - {file = "pyats.results-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:04d244ebfd6ee7eeb666c10780de5f4071e68b96cfa4af848fb43a2736835d70"}, - {file = "pyats.results-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:eccc8e5f9738663246c492bfe454d4b54a81f9bcbb4cb7b9784e8b2d8b7f4e01"}, - {file = "pyats.results-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:9040883c29981760bc4770a0478dd2ef589bc7ddd0d4961bdb405cd345d995cf"}, - {file = "pyats.results-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:55c2136da86da679dc0f4b03401f56cc13eb108073efad44438e1d539de32959"}, - {file = "pyats_results-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:31f35f19fc83160bbc77760832da208d7df5e9a2a2a158ef076aadaf41928f4a"}, - {file = "pyats_results-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:1f43d224d3a021d61d3c0d375bfe150cb3a21d4376301c223973cd954060a998"}, - {file = "pyats_results-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:7a9a58a9c3c992c6940f455720d0bdc36151ae690cd550d4c5f2770a73b7e967"}, - {file = "pyats_results-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:4a588c2c35df03bda2d583bd59173b285e5b3750765d27e0819bf5bb8abe37f8"}, - {file = "pyats_results-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:86c3d601851b9cb323b8187dcf2f8e50136dd953e27caca6e838d4bf6fa2945e"}, + {file = "pyats_results-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:b94c4fed4089d22f9f4d3f7127ed0f4da79220c77e10100181c90ac9b257c26d"}, + {file = "pyats_results-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:95f2d53a7f6f216760adf6214c5238541447d78ff4078325e7d0085869391e95"}, + {file = "pyats_results-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:f9a5189af656a5c7da1f330f393eb28ff1d23315cccc4656f65ef59453caa8a6"}, + {file = "pyats_results-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b64084cd57b8a7c4616efe8307c2336e0f65c79761f2647d77b1c104a43dd8e9"}, + {file = "pyats_results-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e793eb8b5f051631dbf7ea698e068e6f6167b633e182f3c8b348542748ad7079"}, + {file = "pyats_results-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:e1a5ab52b88483df473bf8367e675f5b84980384c6dfe69f0fa1a0b2aec6523d"}, + {file = "pyats_results-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:709d804833a72b066375bc64548f11f9ad90469e0e5496a74fc006211631470b"}, + {file = "pyats_results-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:12ad3a38ef2bfc995205cc3b9be93d43214f5d68b0543f2ac0f88a2e378a4aff"}, + {file = "pyats_results-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:c074e56d3cb6e002086ae0bc82ea0b402c14215ed0b05ad9197425a7ac4edb67"}, + {file = "pyats_results-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:679452d91df38955998b603f78a367a16a54343095a3276378c5ac56cdb5f6dd"}, + {file = "pyats_results-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:7d9ded23a9d57391df27fe2386dd7077932d2ee849e7616a56f4ec62867d5f07"}, + {file = "pyats_results-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:4bc394bc1c85608005627b7ee5b315e36616addc02f1a1e8d2273aa876765189"}, + {file = "pyats_results-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:b0708d6231580ee2a102539054d62ac6a301ec600eb23b49030ce7a8c3482bf9"}, ] [package.extras] @@ -2202,65 +2022,63 @@ dev = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pyats-tcl" -version = "25.7" +version = "25.11" description = "pyATS Tcl: Tcl Integration and Objects" optional = true python-versions = ">=3.8" -files = [ - {file = "pyats.tcl-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:a8a15adb8dbefd0b9d9726d818d0d450de3237fe5c02a2c2bf38d4be7ca9d50c"}, - {file = "pyats.tcl-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:ce58e49efbf08f8a936994247aa8b38d2ac8a1c2281e78a71ac06c13c49b7aab"}, - {file = "pyats.tcl-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:74f3405d9377bf9b7c901228f3728f7a98d233edc02504af69e9647f602e4853"}, - {file = "pyats.tcl-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:0dc47958c53095cead75ecab2bdbbbf7cfe40c9ab95a0e7281af16e61373ab7a"}, - {file = "pyats.tcl-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4221429af0a6e8ed5cf5831c094ae52af084204c44bc84b9867f120abf1c744e"}, - {file = "pyats.tcl-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:224ff031c1efaaea454f07d5355949a34a5e9a3afb2e5e80fc705bc01a6ecb0e"}, - {file = "pyats.tcl-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:9235d898f155364a6e6c7b48b377dfcd06bcff924cea09d901c2cedc774ee018"}, - {file = "pyats.tcl-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:0792ae9caa945503faa3df4340f598caa77993b37106e672fe77db7becfedf8b"}, - {file = "pyats.tcl-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:a1ef1d05141012400e6033ef1e72aea289b656e308a5502191e3a1477130625a"}, - {file = "pyats.tcl-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:1ae559f93c892fb00dfbc79dd79986658a74d7f885054e46ef98aa9d626e84a8"}, - {file = "pyats.tcl-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7d59a0041cc40a221c9b6c66cbbd57b1aa38859e807b19ebe10dee322fb10e7a"}, - {file = "pyats_tcl-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c599af69ecc652013f8e194ed49ef50a8dfa148865b24038e93912aa147f426c"}, - {file = "pyats_tcl-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:80133ad7d6127249b912f0bce4d76a9a4d21a80d09a8c0df3b04939ed562e681"}, - {file = "pyats_tcl-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:3a6926ea324cacf5a63fed7e487c9d1d1587552733681e527fa0810fbc7b6d76"}, - {file = "pyats_tcl-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:4601e3051e8dbe3bffae654172a04d154e20d7d02881a399406408224deb8162"}, - {file = "pyats_tcl-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e08ea9509ede1eb18c054c4ca1327b5353b9747b7422a70f225c4cc6471a63a2"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "pyats_tcl-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8fb59702bf61f291ee128318a06b53c0862a8b380f2fd10e5cd6ecb1aeb699f4"}, + {file = "pyats_tcl-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d6926befe888c55302e97b5d10a4ef565987603987afb74cabc12aeef47105e8"}, + {file = "pyats_tcl-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:7afc66c049d73681b388ad42215fce1626adb1a30b784053f083687a7471fab6"}, + {file = "pyats_tcl-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:38fabd53bf01e85b83b9c1ff22d50f0c867a672659bdcc8e80d4ef09cc2be437"}, + {file = "pyats_tcl-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:c68f614a324557cac8e9742d4723cc95aca41210df3be83fab715f355783cf26"}, + {file = "pyats_tcl-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:657d42e4771557f602b4b57a581251050273bad370d1058c31d4e4b78f71a25c"}, + {file = "pyats_tcl-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:6f34e037ce820bb1bdb13c59f83bf0afedc4c25f6f86f7c40a83e972d4badd5d"}, + {file = "pyats_tcl-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:da12472272f96e629418073fc485030a3c8b11c219a67169b2406f9eb9e6375b"}, + {file = "pyats_tcl-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:dba610d2f93b014e2cfa3fa80ab022e26986d52b3c2cf657e291755b1b8e9d76"}, + {file = "pyats_tcl-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:ca450a092bd3763bffeb57f843a585a6caaf551a30275a60d86fe2a88ae3c989"}, + {file = "pyats_tcl-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:3c37989743b4e12f101180a5b108e4a5f01312fad822cf89ce391d9c6e47a86b"}, + {file = "pyats_tcl-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:c1cab1c90474d528591c6792decfa0751d0ba1a4dd9e648638f45882c7069c53"}, + {file = "pyats_tcl-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:cbd9c0e7584620c3ed3b46354def8254a2c7600951c449518a6343db7f6d0260"}, ] [package.dependencies] -"pyats.datastructures" = ">=25.7.0,<25.8.0" -"pyats.log" = ">=25.7.0,<25.8.0" +"pyats.datastructures" = ">=25.11.0,<25.12.0" +"pyats.log" = ">=25.11.0,<25.12.0" [package.extras] dev = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pyats-topology" -version = "25.7" +version = "25.11" description = "pyATS Topology: Topology Objects and Testbed YAMLs" optional = true python-versions = ">=3.8" -files = [ - {file = "pyats.topology-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:03853323daaab98b2db99c155ca6ed0a7070c86bd9c309be16178b92681502fb"}, - {file = "pyats.topology-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:29ac1ca2fb1259a60a1ad262b8ae5ef7f6b21988b99242bbd4f2c03fafda4b1c"}, - {file = "pyats.topology-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:505d5ad8db127999c3af748b0fd235694805b3ae1a0b4b5605be79eea75316ed"}, - {file = "pyats.topology-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:507731174e462b8229736bb36ff61cc3cb9c03d4e8c87ee4177c7f74e9b6d658"}, - {file = "pyats.topology-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ce90496b53865d48fd766559aa5855cb5063046d5b6d4bb6a9ff112b5f211f9b"}, - {file = "pyats.topology-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:f2e03de49bad1afce26ff9138fbcfadb69fd09f8eb9e0e418bae2e2ba2b6ee47"}, - {file = "pyats.topology-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:40997e3a9b51f68774db364d0ca5f1aed003afd8335c2da4f8f6ea47c24b289d"}, - {file = "pyats.topology-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:526488dd0ef746397ebe578c839802ccabb73cb17d292c94a8a9bfb2baa6f3d6"}, - {file = "pyats.topology-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:5eaa6362ed62d0c0d23506a7fdaf573d26ba3a02abda14669378f11050625ae6"}, - {file = "pyats.topology-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:eb31337a6ce485271910baff5875f50c69336011283b53551ed5976ca53286a6"}, - {file = "pyats.topology-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:09f05074861c3e3fed1af8b1d68f2d27b2696c250fb0900060148aca53a5e863"}, - {file = "pyats_topology-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9da6390792ded41b35871a2fcb3872a7a1f980ae79129f319d1d9a48abd05d48"}, - {file = "pyats_topology-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:aef87a00cbae0dbc362f7b9cd15f4c6dbf2fedf6bfacf2b8206de74d00331106"}, - {file = "pyats_topology-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:af4e9654af9decab0ee27b8dbd7c6382f824cbadc0a373e0a063a2f1e7f12f85"}, - {file = "pyats_topology-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:fe5af97c60cb6d133550b454dc6054ab8b65764a39aa53b8f0f2c0df38f77a89"}, - {file = "pyats_topology-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0d5257ca1292e470d58d0e402258538d198d822b8790ec12e739cdbf13dd2515"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "pyats_topology-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:aa99a049b8cb74f085ca4e1c61b63205f3a39e536bce0b2d22c913d99654a9b2"}, + {file = "pyats_topology-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:3742714bcd509286288309979f8a292e2807aece9fa67179fb0d5564f48b219e"}, + {file = "pyats_topology-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:dde246e66f534955f8fc7b8e47a555eb1ec13c9eb7b2c2ec5295cf3a784d4e6d"}, + {file = "pyats_topology-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09ce21a56a27da63ffc266f0bc10caeaa1f9fe053b05b9f44e5fd36cccf0003f"}, + {file = "pyats_topology-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:afdf37dc4fba871dfb53a591d859b2bb9d7416302c221491791315955de5cfe7"}, + {file = "pyats_topology-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:10ded94680fc107cbc6031afc4be9b8b2a066fd470aa1d9001b4bcb72e3ab894"}, + {file = "pyats_topology-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:ada061e919d91240083b27162a42a29b609a560d9b9c6d7a33221e9cd0bad871"}, + {file = "pyats_topology-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:055a14f40a50ce39de4e5352d83fb78b9cac3032be384f1ab07d2c140c93893e"}, + {file = "pyats_topology-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a0954ddf1b19e34d5cac7ef7ecd2dfe97d67291f1fe4bb6e8f0510f43af33589"}, + {file = "pyats_topology-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:2c4871adf1174aa5f3f9206bb209d783a1a29628e628f45918deaf11eed2e083"}, + {file = "pyats_topology-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:9330540b5ae042762052c9fc7380f749c6fa5a89e64c22f10e43fcff95addf6a"}, + {file = "pyats_topology-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:27e874d3dd18e4ee8913387a6b1cfd72e856e7c1f3c7b3b55465139d5b34f71e"}, + {file = "pyats_topology-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:e83d9bafb34a30a4937964017346398b24e5342d49355fc015263a23a2e042ff"}, ] [package.dependencies] -"pyats.connections" = ">=25.7.0,<25.8.0" -"pyats.datastructures" = ">=25.7.0,<25.8.0" -"pyats.utils" = ">=25.7.0,<25.8.0" +"pyats.connections" = ">=25.11.0,<25.12.0" +"pyats.datastructures" = ">=25.11.0,<25.12.0" +"pyats.utils" = ">=25.11.0,<25.12.0" pyyaml = "*" yamllint = "*" @@ -2269,34 +2087,33 @@ dev = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pyats-utils" -version = "25.7" +version = "25.11" description = "pyATS Utils: Utilities Module" optional = true python-versions = ">=3.8" -files = [ - {file = "pyats.utils-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9fd7679efd855fdb2925c22e7fa66ecffdd7a91c38b44f1b90c239ef20639cb2"}, - {file = "pyats.utils-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:114501a3bd60d397c54415b5e4cd65328997f1693bc04cb5ca78de45d9086f1b"}, - {file = "pyats.utils-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:4cd6c4da70c593e3b4432ad283760c4aa27f1724865be5a6ad98bb76f783bef3"}, - {file = "pyats.utils-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:3f6a16cc3076d1fadfd64d66e13e821334018ab62efd7a5f4b635eb13893846a"}, - {file = "pyats.utils-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:0af74a2c2d387120d7330278f6837ffa2ccc8d69f108f0e84679d28446a544a4"}, - {file = "pyats.utils-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:db049d6e938d1fda12071f38b2e334dbb7af8d369a0d4c96e5165989733c53cc"}, - {file = "pyats.utils-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:0b3047fc464609ec948c74014f8885ffbe9f9e0dab7eb8e57d9779e2063c807f"}, - {file = "pyats.utils-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:cf23a36550c4b55e31468c38d3a304a5ad6e25f2f6634f48e13883c61501879a"}, - {file = "pyats.utils-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:e726a2e28be68ee42df33654735bff8dc3c752d409dcb926311061fa67322fc3"}, - {file = "pyats.utils-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:d23ad4ac2e6c815d97e29269e7d11d8920a813f0cfd81ad7c0ec85903bb4b005"}, - {file = "pyats.utils-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e5b48a13e41abaf13380ee91a01ec56f7f57457b3cef980a6159201f68326be4"}, - {file = "pyats_utils-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:67de4781722087ecdf5adab7fa879828384a0cc50551a032a4469eceaaac7c4b"}, - {file = "pyats_utils-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:863658e8dbc97408075a8b811fb0802ee262d68fa4c88a47249395439dd499eb"}, - {file = "pyats_utils-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:42df3fe85739d42f785955dfde35243e6e556a1c9117c6fd3f36b1df2ddbfd9d"}, - {file = "pyats_utils-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:b1152058053556301a8cc125fc9c1200e7f43f45ca536b316e7cb37156fd1771"}, - {file = "pyats_utils-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e20817e42eebf0c94cccd6251f402d68ffd2ba6883b6d43fe2eeccf12a71fc01"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "pyats_utils-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:eb6ce0e5a17b23a44900d34ab928426fdeaf4bd2c2fa24ab975b28ebf97a536e"}, + {file = "pyats_utils-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:e2b8398804c34d86bd853abc301936d46aa46db731cd45c4468037d1fd8d7344"}, + {file = "pyats_utils-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:a57420450c0893083cd490199ccc8d8122f4717816ab3596cdd0121bf15ee8f1"}, + {file = "pyats_utils-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2234c1c38b6792b34e37a752c82b115c1003e1bc5420744fcf4e0c9ac2fd80c0"}, + {file = "pyats_utils-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:874ce427a6de94d2e96344673808ebf5107cf0b4c0046d8869ed7e5910f95dc9"}, + {file = "pyats_utils-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:0a25bbf1375bc57e3d39c5434cb65df23d5864205b10c763f35872c137a282d7"}, + {file = "pyats_utils-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:621a7d4dbc23fb459561040964a2bb26b8c2eb846babb98b6f2865a9ce371351"}, + {file = "pyats_utils-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:06206315dbc068c1334bc0e67d309aef2c3eadb194ae1ba31430b4ab38397b67"}, + {file = "pyats_utils-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:e3e4d0f2ece80242efdc2561a39027ec84db06a324211fcaac5a4a2d88629c97"}, + {file = "pyats_utils-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:65f9e9c82d9d89529b906be500c58e975ad2d558430aed7b3b99ab8bc74ce397"}, + {file = "pyats_utils-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:30a090cd3bc895355c056e12583336e989e447717f016c45c56633c4e1297855"}, + {file = "pyats_utils-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:bf6726563c174e6c963dd8bcd9f5a5e0ec0b041acb2cea373bf2ff74333422ff"}, + {file = "pyats_utils-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:93925f4f2dcdd8ae2b0569bb6e4fe33185a4f1404dfec4c9214b4326126feaf3"}, ] [package.dependencies] cryptography = "*" distro = "*" -"pyats.datastructures" = ">=25.7.0,<25.8.0" -"pyats.topology" = ">=25.7.0,<25.8.0" +"pyats.datastructures" = ">=25.11.0,<25.12.0" +"pyats.topology" = ">=25.11.0,<25.12.0" [package.extras] dev = ["Sphinx", "requests-mock", "sphinx-rtd-theme"] @@ -2307,6 +2124,7 @@ version = "2.14.0" description = "Python style guide checker" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d"}, {file = "pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783"}, @@ -2314,13 +2132,15 @@ files = [ [[package]] name = "pycparser" -version = "2.22" +version = "2.23" description = "C parser in Python" -optional = false +optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "platform_python_implementation != \"PyPy\" and extra == \"pyats\" and implementation_name != \"PyPy\"" files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, + {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, + {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, ] [[package]] @@ -2329,6 +2149,7 @@ version = "3.4.0" description = "passive checker of Python programs" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f"}, {file = "pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58"}, @@ -2340,41 +2161,33 @@ version = "2.19.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, ] +markers = {main = "extra == \"docs\""} [package.extras] windows-terminal = ["colorama (>=0.4.6)"] -[[package]] -name = "pyproject-hooks" -version = "1.2.0" -description = "Wrappers to call pyproject.toml-based build backend hooks." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913"}, - {file = "pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8"}, -] - [[package]] name = "pytest" -version = "8.4.1" +version = "9.0.2" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" +groups = ["dev"] files = [ - {file = "pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7"}, - {file = "pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c"}, + {file = "pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b"}, + {file = "pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11"}, ] [package.dependencies] colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} -iniconfig = ">=1" -packaging = ">=20" +iniconfig = ">=1.0.1" +packaging = ">=22" pluggy = ">=1.5,<2" pygments = ">=2.7.2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} @@ -2382,12 +2195,35 @@ tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest-xdist" +version = "3.8.0" +description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88"}, + {file = "pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1"}, +] + +[package.dependencies] +execnet = ">=2.1" +pytest = ">=7.0.0" + +[package.extras] +psutil = ["psutil (>=3.0)"] +setproctitle = ["setproctitle"] +testing = ["filelock"] + [[package]] name = "python-engineio" version = "4.9.1" description = "Engine.IO server and client for Python" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "python_engineio-4.9.1-py3-none-any.whl", hash = "sha256:f995e702b21f6b9ebde4e2000cd2ad0112ba0e5116ec8d22fe3515e76ba9dddd"}, {file = "python_engineio-4.9.1.tar.gz", hash = "sha256:7631cf5563086076611e494c643b3fa93dd3a854634b5488be0bba0ef9b99709"}, @@ -2407,6 +2243,8 @@ version = "5.11.2" description = "Socket.IO server and client for Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "python-socketio-5.11.2.tar.gz", hash = "sha256:ae6a1de5c5209ca859dc574dccc8931c4be17ee003e74ce3b8d1306162bb4a37"}, {file = "python_socketio-5.11.2-py3-none-any.whl", hash = "sha256:b9f22a8ff762d7a6e123d16a43ddb1a27d50f07c3c88ea999334f2f89b0ad52b"}, @@ -2421,191 +2259,98 @@ asyncio-client = ["aiohttp (>=3.4)"] client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] docs = ["sphinx"] -[[package]] -name = "pywin32-ctypes" -version = "0.2.3" -description = "A (partial) reimplementation of pywin32 using ctypes/cffi" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, - {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, -] - [[package]] name = "pyyaml" -version = "6.0.2" +version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, -] - -[[package]] -name = "rapidfuzz" -version = "3.13.0" -description = "rapid fuzzy string matching" -optional = false -python-versions = ">=3.9" -files = [ - {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aafc42a1dc5e1beeba52cd83baa41372228d6d8266f6d803c16dbabbcc156255"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:85c9a131a44a95f9cac2eb6e65531db014e09d89c4f18c7b1fa54979cb9ff1f3"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d7cec4242d30dd521ef91c0df872e14449d1dffc2a6990ede33943b0dae56c3"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e297c09972698c95649e89121e3550cee761ca3640cd005e24aaa2619175464e"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef0f5f03f61b0e5a57b1df7beafd83df993fd5811a09871bad6038d08e526d0d"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8cf5f7cd6e4d5eb272baf6a54e182b2c237548d048e2882258336533f3f02b7"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9256218ac8f1a957806ec2fb9a6ddfc6c32ea937c0429e88cf16362a20ed8602"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1bdd2e6d0c5f9706ef7595773a81ca2b40f3b33fd7f9840b726fb00c6c4eb2e"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5280be8fd7e2bee5822e254fe0a5763aa0ad57054b85a32a3d9970e9b09bbcbf"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd742c03885db1fce798a1cd87a20f47f144ccf26d75d52feb6f2bae3d57af05"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5435fcac94c9ecf0504bf88a8a60c55482c32e18e108d6079a0089c47f3f8cf6"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:93a755266856599be4ab6346273f192acde3102d7aa0735e2f48b456397a041f"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-win32.whl", hash = "sha256:3abe6a4e8eb4cfc4cda04dd650a2dc6d2934cbdeda5def7e6fd1c20f6e7d2a0b"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:e8ddb58961401da7d6f55f185512c0d6bd24f529a637078d41dd8ffa5a49c107"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-win_arm64.whl", hash = "sha256:c523620d14ebd03a8d473c89e05fa1ae152821920c3ff78b839218ff69e19ca3"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d395a5cad0c09c7f096433e5fd4224d83b53298d53499945a9b0e5a971a84f3a"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7b3eda607a019169f7187328a8d1648fb9a90265087f6903d7ee3a8eee01805"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e0bfa602e1942d542de077baf15d658bd9d5dcfe9b762aff791724c1c38b70"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bef86df6d59667d9655905b02770a0c776d2853971c0773767d5ef8077acd624"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fedd316c165beed6307bf754dee54d3faca2c47e1f3bcbd67595001dfa11e969"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5158da7f2ec02a930be13bac53bb5903527c073c90ee37804090614cab83c29e"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b6f913ee4618ddb6d6f3e387b76e8ec2fc5efee313a128809fbd44e65c2bbb2"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d25fdbce6459ccbbbf23b4b044f56fbd1158b97ac50994eaae2a1c0baae78301"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25343ccc589a4579fbde832e6a1e27258bfdd7f2eb0f28cb836d6694ab8591fc"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a9ad1f37894e3ffb76bbab76256e8a8b789657183870be11aa64e306bb5228fd"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5dc71ef23845bb6b62d194c39a97bb30ff171389c9812d83030c1199f319098c"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b7f4c65facdb94f44be759bbd9b6dda1fa54d0d6169cdf1a209a5ab97d311a75"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-win32.whl", hash = "sha256:b5104b62711565e0ff6deab2a8f5dbf1fbe333c5155abe26d2cfd6f1849b6c87"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:9093cdeb926deb32a4887ebe6910f57fbcdbc9fbfa52252c10b56ef2efb0289f"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:f70f646751b6aa9d05be1fb40372f006cc89d6aad54e9d79ae97bd1f5fce5203"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a1a6a906ba62f2556372282b1ef37b26bca67e3d2ea957277cfcefc6275cca7"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fd0975e015b05c79a97f38883a11236f5a24cca83aa992bd2558ceaa5652b26"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d4e13593d298c50c4f94ce453f757b4b398af3fa0fd2fde693c3e51195b7f69"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed6f416bda1c9133000009d84d9409823eb2358df0950231cc936e4bf784eb97"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dc82b6ed01acb536b94a43996a94471a218f4d89f3fdd9185ab496de4b2a981"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9d824de871daa6e443b39ff495a884931970d567eb0dfa213d234337343835f"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d18228a2390375cf45726ce1af9d36ff3dc1f11dce9775eae1f1b13ac6ec50f"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5fe634c9482ec5d4a6692afb8c45d370ae86755e5f57aa6c50bfe4ca2bdd87"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:694eb531889f71022b2be86f625a4209c4049e74be9ca836919b9e395d5e33b3"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:11b47b40650e06147dee5e51a9c9ad73bb7b86968b6f7d30e503b9f8dd1292db"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:98b8107ff14f5af0243f27d236bcc6e1ef8e7e3b3c25df114e91e3a99572da73"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b836f486dba0aceb2551e838ff3f514a38ee72b015364f739e526d720fdb823a"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-win32.whl", hash = "sha256:4671ee300d1818d7bdfd8fa0608580d7778ba701817216f0c17fb29e6b972514"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:65cc97c2fc2c2fe23586599686f3b1ceeedeca8e598cfcc1b7e56dc8ca7e2aa7"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09e908064d3684c541d312bd4c7b05acb99a2c764f6231bd507d4b4b65226c23"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:57c390336cb50d5d3bfb0cfe1467478a15733703af61f6dffb14b1cd312a6fae"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0da54aa8547b3c2c188db3d1c7eb4d1bb6dd80baa8cdaeaec3d1da3346ec9caa"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df8e8c21e67afb9d7fbe18f42c6111fe155e801ab103c81109a61312927cc611"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:461fd13250a2adf8e90ca9a0e1e166515cbcaa5e9c3b1f37545cbbeff9e77f6b"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2b3dd5d206a12deca16870acc0d6e5036abeb70e3cad6549c294eff15591527"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1343d745fbf4688e412d8f398c6e6d6f269db99a54456873f232ba2e7aeb4939"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b1b065f370d54551dcc785c6f9eeb5bd517ae14c983d2784c064b3aa525896df"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:11b125d8edd67e767b2295eac6eb9afe0b1cdc82ea3d4b9257da4b8e06077798"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c33f9c841630b2bb7e69a3fb5c84a854075bb812c47620978bddc591f764da3d"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ae4574cb66cf1e85d32bb7e9ec45af5409c5b3970b7ceb8dea90168024127566"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e05752418b24bbd411841b256344c26f57da1148c5509e34ea39c7eb5099ab72"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-win32.whl", hash = "sha256:0e1d08cb884805a543f2de1f6744069495ef527e279e05370dd7c83416af83f8"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f32f15bacd1838c929b35c84b43618481e1b3d7a61b5ed2db0291b70ae88b53"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc64da907114d7a18b5e589057e3acaf2fec723d31c49e13fedf043592a3f6a7"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4d9d7f84c8e992a8dbe5a3fdbea73d733da39bf464e62c912ac3ceba9c0cff93"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a79a2f07786a2070669b4b8e45bd96a01c788e7a3c218f531f3947878e0f956"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f338e71c45b69a482de8b11bf4a029993230760120c8c6e7c9b71760b6825a1"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb40ca8ddfcd4edd07b0713a860be32bdf632687f656963bcbce84cea04b8d8"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48719f7dcf62dfb181063b60ee2d0a39d327fa8ad81b05e3e510680c44e1c078"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9327a4577f65fc3fb712e79f78233815b8a1c94433d0c2c9f6bc5953018b3565"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:200030dfc0a1d5d6ac18e993c5097c870c97c41574e67f227300a1fb74457b1d"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cc269e74cad6043cb8a46d0ce580031ab642b5930562c2bb79aa7fbf9c858d26"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:e62779c6371bd2b21dbd1fdce89eaec2d93fd98179d36f61130b489f62294a92"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f4797f821dc5d7c2b6fc818b89f8a3f37bcc900dd9e4369e6ebf1e525efce5db"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d21f188f6fe4fbf422e647ae9d5a68671d00218e187f91859c963d0738ccd88c"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-win32.whl", hash = "sha256:45dd4628dd9c21acc5c97627dad0bb791764feea81436fb6e0a06eef4c6dceaa"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:624a108122039af89ddda1a2b7ab2a11abe60c1521956f142f5d11bcd42ef138"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-win_arm64.whl", hash = "sha256:435071fd07a085ecbf4d28702a66fd2e676a03369ee497cc38bcb69a46bc77e2"}, - {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe5790a36d33a5d0a6a1f802aa42ecae282bf29ac6f7506d8e12510847b82a45"}, - {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cdb33ee9f8a8e4742c6b268fa6bd739024f34651a06b26913381b1413ebe7590"}, - {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c99b76b93f7b495eee7dcb0d6a38fb3ce91e72e99d9f78faa5664a881cb2b7d"}, - {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6af42f2ede8b596a6aaf6d49fdee3066ca578f4856b85ab5c1e2145de367a12d"}, - {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c0efa73afbc5b265aca0d8a467ae2a3f40d6854cbe1481cb442a62b7bf23c99"}, - {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7ac21489de962a4e2fc1e8f0b0da4aa1adc6ab9512fd845563fecb4b4c52093a"}, - {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1ba007f4d35a45ee68656b2eb83b8715e11d0f90e5b9f02d615a8a321ff00c27"}, - {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d7a217310429b43be95b3b8ad7f8fc41aba341109dc91e978cd7c703f928c58f"}, - {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:558bf526bcd777de32b7885790a95a9548ffdcce68f704a81207be4a286c1095"}, - {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:202a87760f5145140d56153b193a797ae9338f7939eb16652dd7ff96f8faf64c"}, - {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcccc08f671646ccb1e413c773bb92e7bba789e3a1796fd49d23c12539fe2e4"}, - {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:1f219f1e3c3194d7a7de222f54450ce12bc907862ff9a8962d83061c1f923c86"}, - {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ccbd0e7ea1a216315f63ffdc7cd09c55f57851afc8fe59a74184cb7316c0598b"}, - {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a50856f49a4016ef56edd10caabdaf3608993f9faf1e05c3c7f4beeac46bd12a"}, - {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fd05336db4d0b8348d7eaaf6fa3c517b11a56abaa5e89470ce1714e73e4aca7"}, - {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:573ad267eb9b3f6e9b04febce5de55d8538a87c56c64bf8fd2599a48dc9d8b77"}, - {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30fd1451f87ccb6c2f9d18f6caa483116bbb57b5a55d04d3ddbd7b86f5b14998"}, - {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6dd36d4916cf57ddb05286ed40b09d034ca5d4bca85c17be0cb6a21290597d9"}, - {file = "rapidfuzz-3.13.0.tar.gz", hash = "sha256:d2eaf3839e52cbcc0accbe9817a67b4b0fcf70aaeb229cfddc1c28061f9ce5d8"}, -] - -[package.extras] -all = ["numpy"] +groups = ["main", "dev"] +files = [ + {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"}, + {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"}, + {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"}, + {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, + {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, + {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, + {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, +] +markers = {main = "extra == \"pyats\""} [[package]] name = "requests" version = "2.32.5" description = "Python HTTP for Humans." -optional = false +optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"docs\"" files = [ {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, @@ -2621,26 +2366,13 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -description = "A utility belt for advanced users of python-requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, - {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, -] - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - [[package]] name = "respx" version = "0.22.0" description = "A utility for mocking out the Python HTTPX and HTTP Core libraries." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "respx-0.22.0-py2.py3-none-any.whl", hash = "sha256:631128d4c9aba15e56903fb5f66fb1eff412ce28dd387ca3a81339e52dbd3ad0"}, {file = "respx-0.22.0.tar.gz", hash = "sha256:3c8924caa2a50bd71aefc07aa812f2466ff489f1848c96e954a5362d17095d91"}, @@ -2649,51 +2381,27 @@ files = [ [package.dependencies] httpx = ">=0.25.0" -[[package]] -name = "secretstorage" -version = "3.3.3" -description = "Python bindings to FreeDesktop.org Secret Service API" -optional = false -python-versions = ">=3.6" -files = [ - {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, - {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, -] - -[package.dependencies] -cryptography = ">=2.0" -jeepney = ">=0.6" - [[package]] name = "setuptools" version = "80.9.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"}, {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] -core = ["importlib_metadata (>=6)", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] - -[[package]] -name = "shellingham" -version = "1.5.4" -description = "Tool to Detect Surrounding Shell" -optional = false -python-versions = ">=3.7" -files = [ - {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, - {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, -] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "simple-websocket" @@ -2701,6 +2409,8 @@ version = "1.1.0" description = "Simple WebSocket server and client for Python" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "simple_websocket-1.1.0-py3-none-any.whl", hash = "sha256:4af6069630a38ed6c561010f0e11a5bc0d4ca569b36306eb257cd9a192497c8c"}, {file = "simple_websocket-1.1.0.tar.gz", hash = "sha256:7939234e7aa067c534abdab3a9ed933ec9ce4691b0713c78acb195560aa52ae4"}, @@ -2719,6 +2429,8 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -2730,28 +2442,21 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, ] -[[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 = "3.0.1" description = "This package provides 32 stemmers for 30 languages generated from Snowball algorithms." optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064"}, {file = "snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895"}, @@ -2759,54 +2464,57 @@ files = [ [[package]] name = "sphinx" -version = "7.4.7" +version = "8.1.3" description = "Python documentation generator" optional = true -python-versions = ">=3.9" +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"}, - {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"}, + {file = "sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2"}, + {file = "sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927"}, ] [package.dependencies] -alabaster = ">=0.7.14,<0.8.0" +alabaster = ">=0.7.14" babel = ">=2.13" colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} docutils = ">=0.20,<0.22" imagesize = ">=1.3" -importlib-metadata = {version = ">=6.0", markers = "python_version < \"3.10\""} Jinja2 = ">=3.1" packaging = ">=23.0" Pygments = ">=2.17" requests = ">=2.30.0" snowballstemmer = ">=2.2" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" +sphinxcontrib-applehelp = ">=1.0.7" +sphinxcontrib-devhelp = ">=1.0.6" +sphinxcontrib-htmlhelp = ">=2.0.6" +sphinxcontrib-jsmath = ">=1.0.1" +sphinxcontrib-qthelp = ">=1.0.6" sphinxcontrib-serializinghtml = ">=1.1.9" tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"] +lint = ["flake8 (>=6.0)", "mypy (==1.11.1)", "pyright (==1.1.384)", "pytest (>=6.0)", "ruff (==0.6.9)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-Pillow (==10.2.0.20240822)", "types-Pygments (==2.18.0.20240506)", "types-colorama (==0.4.15.20240311)", "types-defusedxml (==0.7.0.20240218)", "types-docutils (==0.21.0.20241005)", "types-requests (==2.32.0.20240914)", "types-urllib3 (==1.26.25.14)"] test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] [[package]] name = "sphinx-rtd-theme" -version = "3.0.2" +version = "3.1.0" description = "Read the Docs theme for Sphinx" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl", hash = "sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13"}, - {file = "sphinx_rtd_theme-3.0.2.tar.gz", hash = "sha256:b7457bc25dda723b20b086a670b9953c859eab60a2a03ee8eb2bb23e176e5f85"}, + {file = "sphinx_rtd_theme-3.1.0-py2.py3-none-any.whl", hash = "sha256:1785824ae8e6632060490f67cf3a72d404a85d2d9fc26bce3619944de5682b89"}, + {file = "sphinx_rtd_theme-3.1.0.tar.gz", hash = "sha256:b44276f2c276e909239a4f6c955aa667aaafeb78597923b1c60babc76db78e4c"}, ] [package.dependencies] -docutils = ">0.18,<0.22" -sphinx = ">=6,<9" +docutils = ">0.18,<0.23" +sphinx = ">=6,<10" sphinxcontrib-jquery = ">=4,<5" [package.extras] @@ -2818,6 +2526,8 @@ version = "2.0.0" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, @@ -2834,6 +2544,8 @@ version = "2.0.0" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, @@ -2850,6 +2562,8 @@ version = "2.1.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, @@ -2866,6 +2580,8 @@ version = "4.1" description = "Extension to include jQuery on newer Sphinx releases" optional = true python-versions = ">=2.7" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, @@ -2880,6 +2596,8 @@ version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" optional = true python-versions = ">=3.5" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, @@ -2894,6 +2612,8 @@ version = "2.0.0" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, @@ -2910,6 +2630,8 @@ version = "2.0.0" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, @@ -2922,66 +2644,61 @@ test = ["pytest"] [[package]] name = "tomli" -version = "2.2.1" +version = "2.4.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -files = [ - {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, - {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, - {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, - {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, - {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, - {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, - {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, - {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, - {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, -] - -[[package]] -name = "tomlkit" -version = "0.13.3" -description = "Style preserving TOML library" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, - {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, -] - -[[package]] -name = "trove-classifiers" -version = "2025.8.26.11" -description = "Canonical source for classifiers on PyPI (pypi.org)." -optional = false -python-versions = "*" -files = [ - {file = "trove_classifiers-2025.8.26.11-py3-none-any.whl", hash = "sha256:887fb0a402bdbecd4415a52c06e6728f8bdaa506a7143372d2b893e2c5e2d859"}, - {file = "trove_classifiers-2025.8.26.11.tar.gz", hash = "sha256:e73efff317c492a7990092f9c12676c705bf6cfe40a258a93f63f4b4c9941432"}, -] +groups = ["main", "dev"] +files = [ + {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576"}, + {file = "tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a"}, + {file = "tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa"}, + {file = "tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51"}, + {file = "tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729"}, + {file = "tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da"}, + {file = "tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f"}, + {file = "tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86"}, + {file = "tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87"}, + {file = "tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8"}, + {file = "tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776"}, + {file = "tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475"}, + {file = "tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b"}, + {file = "tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087"}, + {file = "tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd"}, + {file = "tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4"}, + {file = "tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a"}, + {file = "tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c"}, +] +markers = {main = "extra == \"docs\" and python_version == \"3.10\"", dev = "python_version == \"3.10\""} [[package]] name = "typing-extensions" @@ -2989,6 +2706,8 @@ version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] +markers = "python_version < \"3.13\"" files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, @@ -2996,334 +2715,288 @@ files = [ [[package]] name = "unicon" -version = "25.7" +version = "25.11" description = "Unicon Connection Library" optional = true python-versions = ">=3.8" -files = [ - {file = "unicon-25.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:691444e3992c6f4df7aeddcb81c71d263bfc90c3f812911d7a0b2a4dba0793b5"}, - {file = "unicon-25.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:4c075c3e355b4cdea66e277636c4a50dd9d6ee0fe3b23d7bd1141ad4f78b4db4"}, - {file = "unicon-25.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:a70161706d8456bd1b369bc2f412f71f376fe4128732aad27f9936e1c528837a"}, - {file = "unicon-25.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:171db770039aec48c5d62830b45aa3241c55392065cb8bd29d1b7e1091571ff4"}, - {file = "unicon-25.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:a328dfee20f50f390764b19d5fd0cfc2f31a227510c185d6bea024ab11eb1ab8"}, - {file = "unicon-25.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:f2d7fbb55bf8d05a962f1a11b91a27626b6da958eb108a643f500840814db484"}, - {file = "unicon-25.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5e9f8bcbac01522e6c9dade20150dc1a3ce5702217526f6265c8c2a06029fa1e"}, - {file = "unicon-25.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:525fc59b770896c6392a2efa6dd99f9cd17e679934e8ac46d333b65f3cd22105"}, - {file = "unicon-25.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:9e70975db010ff48b6244d96540e4320e105339fc09fc59ae4c3fed24fb2e133"}, - {file = "unicon-25.7-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:f27b49d1430f83a8d5720110ff0d3094b2cc277838eb4cebed52b2dbab35b630"}, - {file = "unicon-25.7-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:de8f1693e215c83f03d49894826c6fe87fe5de8b2fb9844dc04c189e249f7ad1"}, - {file = "unicon-25.7-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:39a9d9ad86204491e203af9b36ffe1dd3f18efca6dc7d24e8f1ed96f689963b2"}, - {file = "unicon-25.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:2f21930434ab53a698f236aba8ae1d18586aad157aa29d74dd4bd50b014628e4"}, - {file = "unicon-25.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f433bbd8bac1150f224dd2b029e4f8027ba5a422d2a52bd727e3c89b42bbed42"}, - {file = "unicon-25.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:7be058ea4b2592ab5c452529816b9d037bc9ea3038fe118dc219756103cfa7d9"}, - {file = "unicon-25.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2f61a565eb2a3e4b8810d1177864327a9e69726c47e8b10ab25edf26523ad3e4"}, +groups = ["main"] +markers = "extra == \"pyats\"" +files = [ + {file = "unicon-25.11-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:64f8640580bfd4d983c22f0f835cde08974fdb251cdba294aadf984d380cf882"}, + {file = "unicon-25.11-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:362242b663b2f2696a99a180399f796415f90351621c11bec25080870d04c460"}, + {file = "unicon-25.11-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:72c57e3d7d7113b375dc119c9bfbaa7ebf1f4e5dd33ca6d4cb699699dd32b147"}, + {file = "unicon-25.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad547ddea5989249fa3750346e0cdc1cbaec536ed4a4e56ae6add447e25b77b7"}, + {file = "unicon-25.11-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:c58d80ef0fa0e2c53432a18e3aea9f5bad8508e3c600a42a3f4242a34eacd148"}, + {file = "unicon-25.11-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b7e4bbd9fa791be0511d89f62a9bdb5cf935b41f10638f34850c6519d23713f0"}, + {file = "unicon-25.11-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:a9f039a7f4d9a424a00531d8f1fffc795d0e2bcc0c4aebd479178eaad20b7031"}, + {file = "unicon-25.11-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:6ab29778c2a012496615b4a97d835bf5e1e49de07922d8843897d24c542c3ad0"}, + {file = "unicon-25.11-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:5c71de86071282867b45b2ad025896d9cf484f3b6539bfa16726411b394d2dea"}, + {file = "unicon-25.11-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:6d31e8b30b654944e2b89e51bfc75ea4a3771c6c56da50fc3a3796dbe256151a"}, + {file = "unicon-25.11-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:6c6204544fd67642500457c648f56b942240a4ae8b63c6819d6a1b4123d19fd9"}, + {file = "unicon-25.11-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:3558a4c2cf153c479ca47492589d371881a699c9220ba504f8256b66cfe078f6"}, + {file = "unicon-25.11-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:83d50bc1041a98c8ea986a32de670089aae2242fa46673e9835eda7de74a8017"}, ] [package.dependencies] dill = "*" pyyaml = "*" -"unicon.plugins" = ">=25.7.0,<25.8.0" +"unicon.plugins" = ">=25.11.0,<25.12.0" [package.extras] -dev = ["Sphinx", "coverage", "restview", "sphinx-rtd-theme", "sphinxcontrib-mockautodoc", "sphinxcontrib-napoleon"] +dev = ["Sphinx", "coverage", "restview", "sphinx-rtd-theme", "sphinxcontrib-napoleon"] pyats = ["pyats"] robot = ["robotframework"] [[package]] name = "unicon-plugins" -version = "25.7" +version = "25.11" description = "Unicon Connection Library Plugins" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ - {file = "unicon.plugins-25.7-py3-none-any.whl", hash = "sha256:bf80d44f6d4fb349a045725483668ef3a4182c6c11b3ef40fd30ce322f78267a"}, + {file = "unicon_plugins-25.11-py3-none-any.whl", hash = "sha256:42158df9873c1a07cdb17d55a8833ba9812d761a2365fc60a8976917ad4b99cd"}, ] [package.dependencies] cryptography = ">=43.0" PrettyTable = "*" pyyaml = "*" -unicon = ">=25.7.0,<25.8.0" +unicon = ">=25.11.0,<25.12.0" [package.extras] dev = ["Sphinx", "coverage", "pip", "restview", "setuptools", "sphinx-rtd-theme", "sphinxcontrib-mockautodoc", "sphinxcontrib-napoleon", "wheel"] [[package]] name = "urllib3" -version = "2.5.0" +version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false +optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"docs\"" files = [ - {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, - {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "virtualenv" -version = "20.32.0" +version = "20.36.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "virtualenv-20.32.0-py3-none-any.whl", hash = "sha256:2c310aecb62e5aa1b06103ed7c2977b81e042695de2697d01017ff0f1034af56"}, - {file = "virtualenv-20.32.0.tar.gz", hash = "sha256:886bf75cadfdc964674e6e33eb74d787dff31ca314ceace03ca5810620f4ecf0"}, + {file = "virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f"}, + {file = "virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba"}, ] [package.dependencies] distlib = ">=0.3.7,<1" -filelock = ">=3.12.2,<4" +filelock = {version = ">=3.20.1,<4", markers = "python_version >= \"3.10\""} platformdirs = ">=3.9.1,<5" +typing-extensions = {version = ">=4.13.2", markers = "python_version < \"3.11\""} [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "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)"] +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) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] [[package]] name = "wcwidth" -version = "0.2.13" +version = "0.2.14" description = "Measures the displayed width of unicode strings in a terminal" optional = true -python-versions = "*" +python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, + {file = "wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1"}, + {file = "wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605"}, ] [[package]] name = "wsproto" -version = "1.2.0" -description = "WebSockets state-machine based protocol implementation" +version = "1.3.2" +description = "Pure-Python WebSocket protocol implementation" optional = true -python-versions = ">=3.7.0" +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ - {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, - {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, + {file = "wsproto-1.3.2-py3-none-any.whl", hash = "sha256:61eea322cdf56e8cc904bd3ad7573359a242ba65688716b0710a5eb12beab584"}, + {file = "wsproto-1.3.2.tar.gz", hash = "sha256:b86885dcf294e15204919950f666e06ffc6c7c114ca900b060d6e16293528294"}, ] [package.dependencies] -h11 = ">=0.9.0,<1" - -[[package]] -name = "xattr" -version = "1.2.0" -description = "Python wrapper for extended filesystem attributes" -optional = false -python-versions = ">=3.8" -files = [ - {file = "xattr-1.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3df4d8d91e2996c3c72a390ec82e8544acdcb6c7df67b954f1736ff37ea4293e"}, - {file = "xattr-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f5eec248976bbfa6c23df25d4995413df57dccf4161f6cbae36f643e99dbc397"}, - {file = "xattr-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fafecfdedf7e8d455443bec2c3edab8a93d64672619cd1a4ee043a806152e19c"}, - {file = "xattr-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c229e245c6c9a85d2fd7d07531498f837dd34670e556b552f73350f11edf000c"}, - {file = "xattr-1.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:376631e2383918fbc3dc9bcaeb9a533e319322d2cff1c119635849edf74e1126"}, - {file = "xattr-1.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbae24ab22afe078d549645501ecacaa17229e0b7769c8418fad69b51ad37c9"}, - {file = "xattr-1.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a161160211081d765ac41fa056f4f9b1051f027f08188730fbc9782d0dce623e"}, - {file = "xattr-1.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a542acf6c4e8221664b51b35e0160c44bd0ed1f2fd80019476f7698f4911e560"}, - {file = "xattr-1.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:034f075fc5a9391a1597a6c9a21cb57b688680f0f18ecf73b2efc22b8d330cff"}, - {file = "xattr-1.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:00c26c14c90058338993bb2d3e1cebf562e94ec516cafba64a8f34f74b9d18b4"}, - {file = "xattr-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b4f43dc644db87d5eb9484a9518c34a864cb2e588db34cffc42139bf55302a1c"}, - {file = "xattr-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7602583fc643ca76576498e2319c7cef0b72aef1936701678589da6371b731b"}, - {file = "xattr-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90c3ad4a9205cceb64ec54616aa90aa42d140c8ae3b9710a0aaa2843a6f1aca7"}, - {file = "xattr-1.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83d87cfe19cd606fc0709d45a4d6efc276900797deced99e239566926a5afedf"}, - {file = "xattr-1.2.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c67dabd9ddc04ead63fbc85aed459c9afcc24abfc5bb3217fff7ec9a466faacb"}, - {file = "xattr-1.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9a18ee82d8ba2c17f1e8414bfeb421fa763e0fb4acbc1e124988ca1584ad32d5"}, - {file = "xattr-1.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:38de598c47b85185e745986a061094d2e706e9c2d9022210d2c738066990fe91"}, - {file = "xattr-1.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:15e754e854bdaac366ad3f1c8fbf77f6668e8858266b4246e8c5f487eeaf1179"}, - {file = "xattr-1.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:daff0c1f5c5e4eaf758c56259c4f72631fa9619875e7a25554b6077dc73da964"}, - {file = "xattr-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:109b11fb3f73a0d4e199962f11230ab5f462e85a8021874f96c1732aa61148d5"}, - {file = "xattr-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c7c12968ce0bf798d8ba90194cef65de768bee9f51a684e022c74cab4218305"}, - {file = "xattr-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37989dabf25ff18773e4aaeebcb65604b9528f8645f43e02bebaa363e3ae958"}, - {file = "xattr-1.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:165de92b0f2adafb336f936931d044619b9840e35ba01079f4dd288747b73714"}, - {file = "xattr-1.2.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82191c006ae4c609b22b9aea5f38f68fff022dc6884c4c0e1dba329effd4b288"}, - {file = "xattr-1.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b2e9c87dc643b09d86befad218e921f6e65b59a4668d6262b85308de5dbd1dd"}, - {file = "xattr-1.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:14edd5d47d0bb92b23222c0bb6379abbddab01fb776b2170758e666035ecf3aa"}, - {file = "xattr-1.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:12183d5eb104d4da787638c7dadf63b718472d92fec6dbe12994ea5d094d7863"}, - {file = "xattr-1.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c385ea93a18aeb6443a719eb6a6b1d7f7b143a4d1f2b08bc4fadfc429209e629"}, - {file = "xattr-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2d39d7b36842c67ab3040bead7eb6d601e35fa0d6214ed20a43df4ec30b6f9f9"}, - {file = "xattr-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:320ef856bb817f4c40213b6de956dc440d0f23cdc62da3ea02239eb5147093f8"}, - {file = "xattr-1.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26d306bfb3b5641726f2ee0da6f63a2656aa7fdcfd15de61c476e3ca6bc3277e"}, - {file = "xattr-1.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c67e70d5d8136d328ad13f85b887ffa97690422f1a11fb29ab2f702cf66e825a"}, - {file = "xattr-1.2.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8904d3539afe1a84fc0b7f02fa91da60d2505adf2d5951dc855bf9e75fe322b2"}, - {file = "xattr-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2520516c1d058895eae00b2b2f10833514caea6dc6802eef1e431c474b5317ad"}, - {file = "xattr-1.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:29d06abbef4024b7469fcd0d4ade6d2290582350a4df95fcc48fa48b2e83246b"}, - {file = "xattr-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:093c75f7d9190be355b8e86da3f460b9bfe3d6a176f92852d44dcc3289aa10dc"}, - {file = "xattr-1.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ee3901db48de913dcef004c5d7b477a1f4aadff997445ef62907b10fdad57de"}, - {file = "xattr-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b837898a5225c7f7df731783cd78bae2ed81b84bacf020821f1cd2ab2d74de58"}, - {file = "xattr-1.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cedc281811e424ecf6a14208532f7ac646866f91f88e8eadd00d8fe535e505fd"}, - {file = "xattr-1.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf60577caa248f539e4e646090b10d6ad1f54189de9a7f1854c23fdef28f574e"}, - {file = "xattr-1.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:363724f33510d2e7c7e080b389271a1241cb4929a1d9294f89721152b4410972"}, - {file = "xattr-1.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97db00596865845efb72f3d565a1f82b01006c5bf5a87d8854a6afac43502593"}, - {file = "xattr-1.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0b199ba31078f3e4181578595cd60400ee055b4399672169ceee846d33ff26de"}, - {file = "xattr-1.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:b19472dc38150ac09a478c71092738d86882bc9ff687a4a8f7d1a25abce20b5e"}, - {file = "xattr-1.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:79f7823b30ed557e0e7ffd9a6b1a821a22f485f5347e54b8d24c4a34b7545ba4"}, - {file = "xattr-1.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eee258f5774933cb972cff5c3388166374e678980d2a1f417d7d6f61d9ae172"}, - {file = "xattr-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2a9de621eadf0466c391363bd6ed903b1a1bcd272422b5183fd06ef79d05347b"}, - {file = "xattr-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bc714f236f17c57c510ae9ada9962d8e4efc9f9ea91504e2c6a09008f3918ddf"}, - {file = "xattr-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:545e0ad3f706724029efd23dec58fb358422ae68ab4b560b712aedeaf40446a0"}, - {file = "xattr-1.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:200bb3cdba057cb721b727607bc340a74c28274f4a628a26011f574860f5846b"}, - {file = "xattr-1.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b0b27c889cc9ff0dba62ac8a2eef98f4911c1621e4e8c409d5beb224c4c227c"}, - {file = "xattr-1.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ea7cf8afd717853ad78eba8ca83ff66a53484ba2bb2a4283462bc5c767518174"}, - {file = "xattr-1.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:02fa813db054bbb7a61c570ae025bd01c36fc20727b40f49031feb930234bc72"}, - {file = "xattr-1.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2827e23d7a1a20f31162c47ab4bd341a31e83421121978c4ab2aad5cd79ea82b"}, - {file = "xattr-1.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:29ae44247d46e63671311bf7e700826a97921278e2c0c04c2d11741888db41b8"}, - {file = "xattr-1.2.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:629c42c1dd813442d90f281f69b88ef0c9625f604989bef8411428671f70f43e"}, - {file = "xattr-1.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:549f8fbda5da48cafc81ba6ab7bb8e8e14c4b0748c37963dc504bcae505474b7"}, - {file = "xattr-1.2.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa83e677b5f92a3c5c86eaf875e9d3abbc43887ff1767178def865fa9f12a3a0"}, - {file = "xattr-1.2.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb669f01627962ce2bc556f19d421162247bc2cad0d4625d6ea5eb32af4cf29b"}, - {file = "xattr-1.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:212156aa5fb987a53211606bc09e6fea3eda3855af9f2940e40df5a2a592425a"}, - {file = "xattr-1.2.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7dc4fa9448a513077c5ccd1ce428ff0682cdddfc71301dbbe4ee385c74517f73"}, - {file = "xattr-1.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e4b93f2e74793b61c0a7b7bdef4a3813930df9c01eda72fad706b8db7658bc2"}, - {file = "xattr-1.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dddd5f6d0bb95b099d6a3888c248bf246525647ccb8cf9e8f0fc3952e012d6fb"}, - {file = "xattr-1.2.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68fbdffebe8c398a82c84ecf5e6f6a3adde9364f891cba066e58352af404a45c"}, - {file = "xattr-1.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c9ee84de7cd4a6d61b0b79e2f58a6bdb13b03dbad948489ebb0b73a95caee7ae"}, - {file = "xattr-1.2.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5594fcbc38fdbb3af16a8ad18c37c81c8814955f0d636be857a67850cd556490"}, - {file = "xattr-1.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:017aac8005e1e84d5efa4b86c0896c6eb96f2331732d388600a5b999166fec1c"}, - {file = "xattr-1.2.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d27a64f695440450c119ae4bc8f54b0b726a812ebea1666fff3873236936f36"}, - {file = "xattr-1.2.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f7e7067e1a400ad4485536a9e84c3330373086b2324fafa26d07527eeb4b175"}, - {file = "xattr-1.2.0.tar.gz", hash = "sha256:a64c8e21eff1be143accf80fd3b8fde3e28a478c37da298742af647ac3e5e0a7"}, -] - -[package.dependencies] -cffi = ">=1.16.0" - -[package.extras] -test = ["pytest"] +h11 = ">=0.16.0,<1" [[package]] name = "yamllint" -version = "1.37.1" +version = "1.38.0" description = "A linter for YAML files." optional = true -python-versions = ">=3.9" +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"pyats\"" files = [ - {file = "yamllint-1.37.1-py3-none-any.whl", hash = "sha256:364f0d79e81409f591e323725e6a9f4504c8699ddf2d7263d8d2b539cd66a583"}, - {file = "yamllint-1.37.1.tar.gz", hash = "sha256:81f7c0c5559becc8049470d86046b36e96113637bcbe4753ecef06977c00245d"}, + {file = "yamllint-1.38.0-py3-none-any.whl", hash = "sha256:fc394a5b3be980a4062607b8fdddc0843f4fa394152b6da21722f5d59013c220"}, + {file = "yamllint-1.38.0.tar.gz", hash = "sha256:09e5f29531daab93366bb061e76019d5e91691ef0a40328f04c927387d1d364d"}, ] [package.dependencies] -pathspec = ">=0.5.3" +pathspec = ">=1.0.0" pyyaml = "*" [package.extras] -dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] +dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "ruff", "sphinx"] [[package]] name = "yarl" -version = "1.20.1" +version = "1.22.0" description = "Yet another URL library" optional = true python-versions = ">=3.9" -files = [ - {file = "yarl-1.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6032e6da6abd41e4acda34d75a816012717000fa6839f37124a47fcefc49bec4"}, - {file = "yarl-1.20.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c7b34d804b8cf9b214f05015c4fee2ebe7ed05cf581e7192c06555c71f4446a"}, - {file = "yarl-1.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c869f2651cc77465f6cd01d938d91a11d9ea5d798738c1dc077f3de0b5e5fed"}, - {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62915e6688eb4d180d93840cda4110995ad50c459bf931b8b3775b37c264af1e"}, - {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:41ebd28167bc6af8abb97fec1a399f412eec5fd61a3ccbe2305a18b84fb4ca73"}, - {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21242b4288a6d56f04ea193adde174b7e347ac46ce6bc84989ff7c1b1ecea84e"}, - {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bea21cdae6c7eb02ba02a475f37463abfe0a01f5d7200121b03e605d6a0439f8"}, - {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f8a891e4a22a89f5dde7862994485e19db246b70bb288d3ce73a34422e55b23"}, - {file = "yarl-1.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd803820d44c8853a109a34e3660e5a61beae12970da479cf44aa2954019bf70"}, - {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b982fa7f74c80d5c0c7b5b38f908971e513380a10fecea528091405f519b9ebb"}, - {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:33f29ecfe0330c570d997bcf1afd304377f2e48f61447f37e846a6058a4d33b2"}, - {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:835ab2cfc74d5eb4a6a528c57f05688099da41cf4957cf08cad38647e4a83b30"}, - {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:46b5e0ccf1943a9a6e766b2c2b8c732c55b34e28be57d8daa2b3c1d1d4009309"}, - {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:df47c55f7d74127d1b11251fe6397d84afdde0d53b90bedb46a23c0e534f9d24"}, - {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76d12524d05841276b0e22573f28d5fbcb67589836772ae9244d90dd7d66aa13"}, - {file = "yarl-1.20.1-cp310-cp310-win32.whl", hash = "sha256:6c4fbf6b02d70e512d7ade4b1f998f237137f1417ab07ec06358ea04f69134f8"}, - {file = "yarl-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:aef6c4d69554d44b7f9d923245f8ad9a707d971e6209d51279196d8e8fe1ae16"}, - {file = "yarl-1.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47ee6188fea634bdfaeb2cc420f5b3b17332e6225ce88149a17c413c77ff269e"}, - {file = "yarl-1.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0f6500f69e8402d513e5eedb77a4e1818691e8f45e6b687147963514d84b44b"}, - {file = "yarl-1.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a8900a42fcdaad568de58887c7b2f602962356908eedb7628eaf6021a6e435b"}, - {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bad6d131fda8ef508b36be3ece16d0902e80b88ea7200f030a0f6c11d9e508d4"}, - {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:df018d92fe22aaebb679a7f89fe0c0f368ec497e3dda6cb81a567610f04501f1"}, - {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f969afbb0a9b63c18d0feecf0db09d164b7a44a053e78a7d05f5df163e43833"}, - {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:812303eb4aa98e302886ccda58d6b099e3576b1b9276161469c25803a8db277d"}, - {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c4a7d166635147924aa0bf9bfe8d8abad6fffa6102de9c99ea04a1376f91e8"}, - {file = "yarl-1.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12e768f966538e81e6e7550f9086a6236b16e26cd964cf4df35349970f3551cf"}, - {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe41919b9d899661c5c28a8b4b0acf704510b88f27f0934ac7a7bebdd8938d5e"}, - {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:8601bc010d1d7780592f3fc1bdc6c72e2b6466ea34569778422943e1a1f3c389"}, - {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:daadbdc1f2a9033a2399c42646fbd46da7992e868a5fe9513860122d7fe7a73f"}, - {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:03aa1e041727cb438ca762628109ef1333498b122e4c76dd858d186a37cec845"}, - {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:642980ef5e0fa1de5fa96d905c7e00cb2c47cb468bfcac5a18c58e27dbf8d8d1"}, - {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:86971e2795584fe8c002356d3b97ef6c61862720eeff03db2a7c86b678d85b3e"}, - {file = "yarl-1.20.1-cp311-cp311-win32.whl", hash = "sha256:597f40615b8d25812f14562699e287f0dcc035d25eb74da72cae043bb884d773"}, - {file = "yarl-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:26ef53a9e726e61e9cd1cda6b478f17e350fb5800b4bd1cd9fe81c4d91cfeb2e"}, - {file = "yarl-1.20.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdcc4cd244e58593a4379fe60fdee5ac0331f8eb70320a24d591a3be197b94a9"}, - {file = "yarl-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b29a2c385a5f5b9c7d9347e5812b6f7ab267193c62d282a540b4fc528c8a9d2a"}, - {file = "yarl-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2"}, - {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90bbd29c4fe234233f7fa2b9b121fb63c321830e5d05b45153a2ca68f7d310ee"}, - {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:680e19c7ce3710ac4cd964e90dad99bf9b5029372ba0c7cbfcd55e54d90ea819"}, - {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a979218c1fdb4246a05efc2cc23859d47c89af463a90b99b7c56094daf25a16"}, - {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255b468adf57b4a7b65d8aad5b5138dce6a0752c139965711bdcb81bc370e1b6"}, - {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a97d67108e79cfe22e2b430d80d7571ae57d19f17cda8bb967057ca8a7bf5bfd"}, - {file = "yarl-1.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8570d998db4ddbfb9a590b185a0a33dbf8aafb831d07a5257b4ec9948df9cb0a"}, - {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97c75596019baae7c71ccf1d8cc4738bc08134060d0adfcbe5642f778d1dca38"}, - {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef"}, - {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4c3ae28f3ae1563c50f3d37f064ddb1511ecc1d5584e88c6b7c63cf7702a6d5f"}, - {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8"}, - {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2c26b0c49220d5799f7b22c6838409ee9bc58ee5c95361a4d7831f03cc225b5a"}, - {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564ab3d517e3d01c408c67f2e5247aad4019dcf1969982aba3974b4093279004"}, - {file = "yarl-1.20.1-cp312-cp312-win32.whl", hash = "sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5"}, - {file = "yarl-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:48ea7d7f9be0487339828a4de0360d7ce0efc06524a48e1810f945c45b813698"}, - {file = "yarl-1.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0b5ff0fbb7c9f1b1b5ab53330acbfc5247893069e7716840c8e7d5bb7355038a"}, - {file = "yarl-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:14f326acd845c2b2e2eb38fb1346c94f7f3b01a4f5c788f8144f9b630bfff9a3"}, - {file = "yarl-1.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f60e4ad5db23f0b96e49c018596707c3ae89f5d0bd97f0ad3684bcbad899f1e7"}, - {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49bdd1b8e00ce57e68ba51916e4bb04461746e794e7c4d4bbc42ba2f18297691"}, - {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:66252d780b45189975abfed839616e8fd2dbacbdc262105ad7742c6ae58f3e31"}, - {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59174e7332f5d153d8f7452a102b103e2e74035ad085f404df2e40e663a22b28"}, - {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3968ec7d92a0c0f9ac34d5ecfd03869ec0cab0697c91a45db3fbbd95fe1b653"}, - {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1a4fbb50e14396ba3d375f68bfe02215d8e7bc3ec49da8341fe3157f59d2ff5"}, - {file = "yarl-1.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11a62c839c3a8eac2410e951301309426f368388ff2f33799052787035793b02"}, - {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:041eaa14f73ff5a8986b4388ac6bb43a77f2ea09bf1913df7a35d4646db69e53"}, - {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:377fae2fef158e8fd9d60b4c8751387b8d1fb121d3d0b8e9b0be07d1b41e83dc"}, - {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1c92f4390e407513f619d49319023664643d3339bd5e5a56a3bebe01bc67ec04"}, - {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d25ddcf954df1754ab0f86bb696af765c5bfaba39b74095f27eececa049ef9a4"}, - {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:909313577e9619dcff8c31a0ea2aa0a2a828341d92673015456b3ae492e7317b"}, - {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:793fd0580cb9664548c6b83c63b43c477212c0260891ddf86809e1c06c8b08f1"}, - {file = "yarl-1.20.1-cp313-cp313-win32.whl", hash = "sha256:468f6e40285de5a5b3c44981ca3a319a4b208ccc07d526b20b12aeedcfa654b7"}, - {file = "yarl-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:495b4ef2fea40596bfc0affe3837411d6aa3371abcf31aac0ccc4bdd64d4ef5c"}, - {file = "yarl-1.20.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f60233b98423aab21d249a30eb27c389c14929f47be8430efa7dbd91493a729d"}, - {file = "yarl-1.20.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6f3eff4cc3f03d650d8755c6eefc844edde99d641d0dcf4da3ab27141a5f8ddf"}, - {file = "yarl-1.20.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:69ff8439d8ba832d6bed88af2c2b3445977eba9a4588b787b32945871c2444e3"}, - {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cf34efa60eb81dd2645a2e13e00bb98b76c35ab5061a3989c7a70f78c85006d"}, - {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8e0fe9364ad0fddab2688ce72cb7a8e61ea42eff3c7caeeb83874a5d479c896c"}, - {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f64fbf81878ba914562c672024089e3401974a39767747691c65080a67b18c1"}, - {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6342d643bf9a1de97e512e45e4b9560a043347e779a173250824f8b254bd5ce"}, - {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56dac5f452ed25eef0f6e3c6a066c6ab68971d96a9fb441791cad0efba6140d3"}, - {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7d7f497126d65e2cad8dc5f97d34c27b19199b6414a40cb36b52f41b79014be"}, - {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:67e708dfb8e78d8a19169818eeb5c7a80717562de9051bf2413aca8e3696bf16"}, - {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:595c07bc79af2494365cc96ddeb772f76272364ef7c80fb892ef9d0649586513"}, - {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7bdd2f80f4a7df852ab9ab49484a4dee8030023aa536df41f2d922fd57bf023f"}, - {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c03bfebc4ae8d862f853a9757199677ab74ec25424d0ebd68a0027e9c639a390"}, - {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:344d1103e9c1523f32a5ed704d576172d2cabed3122ea90b1d4e11fe17c66458"}, - {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88cab98aa4e13e1ade8c141daeedd300a4603b7132819c484841bb7af3edce9e"}, - {file = "yarl-1.20.1-cp313-cp313t-win32.whl", hash = "sha256:b121ff6a7cbd4abc28985b6028235491941b9fe8fe226e6fdc539c977ea1739d"}, - {file = "yarl-1.20.1-cp313-cp313t-win_amd64.whl", hash = "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f"}, - {file = "yarl-1.20.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e42ba79e2efb6845ebab49c7bf20306c4edf74a0b20fc6b2ccdd1a219d12fad3"}, - {file = "yarl-1.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:41493b9b7c312ac448b7f0a42a089dffe1d6e6e981a2d76205801a023ed26a2b"}, - {file = "yarl-1.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5a5928ff5eb13408c62a968ac90d43f8322fd56d87008b8f9dabf3c0f6ee983"}, - {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c41ad5d717b3961b2dd785593b67d386b73feca30522048d37298fee981805"}, - {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:59febc3969b0781682b469d4aca1a5cab7505a4f7b85acf6db01fa500fa3f6ba"}, - {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2b6fb3622b7e5bf7a6e5b679a69326b4279e805ed1699d749739a61d242449e"}, - {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:749d73611db8d26a6281086f859ea7ec08f9c4c56cec864e52028c8b328db723"}, - {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9427925776096e664c39e131447aa20ec738bdd77c049c48ea5200db2237e000"}, - {file = "yarl-1.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff70f32aa316393eaf8222d518ce9118148eddb8a53073c2403863b41033eed5"}, - {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c7ddf7a09f38667aea38801da8b8d6bfe81df767d9dfc8c88eb45827b195cd1c"}, - {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:57edc88517d7fc62b174fcfb2e939fbc486a68315d648d7e74d07fac42cec240"}, - {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:dab096ce479d5894d62c26ff4f699ec9072269d514b4edd630a393223f45a0ee"}, - {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14a85f3bd2d7bb255be7183e5d7d6e70add151a98edf56a770d6140f5d5f4010"}, - {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c89b5c792685dd9cd3fa9761c1b9f46fc240c2a3265483acc1565769996a3f8"}, - {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:69e9b141de5511021942a6866990aea6d111c9042235de90e08f94cf972ca03d"}, - {file = "yarl-1.20.1-cp39-cp39-win32.whl", hash = "sha256:b5f307337819cdfdbb40193cad84978a029f847b0a357fbe49f712063cfc4f06"}, - {file = "yarl-1.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:eae7bfe2069f9c1c5b05fc7fe5d612e5bbc089a39309904ee8b829e322dcad00"}, - {file = "yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77"}, - {file = "yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac"}, +groups = ["main"] +markers = "extra == \"pyats\" or extra == \"events\"" +files = [ + {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e"}, + {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f"}, + {file = "yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467"}, + {file = "yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea"}, + {file = "yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca"}, + {file = "yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b"}, + {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511"}, + {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6"}, + {file = "yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e"}, + {file = "yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca"}, + {file = "yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b"}, + {file = "yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376"}, + {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f"}, + {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2"}, + {file = "yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520"}, + {file = "yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8"}, + {file = "yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c"}, + {file = "yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74"}, + {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53"}, + {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a"}, + {file = "yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67"}, + {file = "yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95"}, + {file = "yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d"}, + {file = "yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b"}, + {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10"}, + {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3"}, + {file = "yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62"}, + {file = "yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03"}, + {file = "yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249"}, + {file = "yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b"}, + {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4"}, + {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683"}, + {file = "yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da"}, + {file = "yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2"}, + {file = "yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79"}, + {file = "yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33"}, + {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1"}, + {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca"}, + {file = "yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c"}, + {file = "yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e"}, + {file = "yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27"}, + {file = "yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1"}, + {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3aa27acb6de7a23785d81557577491f6c38a5209a254d1191519d07d8fe51748"}, + {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:af74f05666a5e531289cb1cc9c883d1de2088b8e5b4de48004e5ca8a830ac859"}, + {file = "yarl-1.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62441e55958977b8167b2709c164c91a6363e25da322d87ae6dd9c6019ceecf9"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b580e71cac3f8113d3135888770903eaf2f507e9421e5697d6ee6d8cd1c7f054"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e81fda2fb4a07eda1a2252b216aa0df23ebcd4d584894e9612e80999a78fd95b"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:99b6fc1d55782461b78221e95fc357b47ad98b041e8e20f47c1411d0aacddc60"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:088e4e08f033db4be2ccd1f34cf29fe994772fb54cfe004bbf54db320af56890"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4e1f6f0b4da23e61188676e3ed027ef0baa833a2e633c29ff8530800edccba"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:84fc3ec96fce86ce5aa305eb4aa9358279d1aa644b71fab7b8ed33fe3ba1a7ca"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5dbeefd6ca588b33576a01b0ad58aa934bc1b41ef89dee505bf2932b22ddffba"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14291620375b1060613f4aab9ebf21850058b6b1b438f386cc814813d901c60b"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a4fcfc8eb2c34148c118dfa02e6427ca278bfd0f3df7c5f99e33d2c0e81eae3e"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:029866bde8d7b0878b9c160e72305bbf0a7342bcd20b9999381704ae03308dc8"}, + {file = "yarl-1.22.0-cp39-cp39-win32.whl", hash = "sha256:4dcc74149ccc8bba31ce1944acee24813e93cfdee2acda3c172df844948ddf7b"}, + {file = "yarl-1.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:10619d9fdee46d20edc49d3479e2f8269d0779f1b031e6f7c2aa1c76be04b7ed"}, + {file = "yarl-1.22.0-cp39-cp39-win_arm64.whl", hash = "sha256:dd7afd3f8b0bfb4e0d9fc3c31bfe8a4ec7debe124cfd90619305def3c8ca8cd2"}, + {file = "yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff"}, + {file = "yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71"}, ] [package.dependencies] @@ -3331,142 +3004,12 @@ idna = ">=2.0" multidict = ">=4.0" propcache = ">=0.2.1" -[[package]] -name = "zipp" -version = "3.23.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.9" -files = [ - {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, - {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] -type = ["pytest-mypy"] - -[[package]] -name = "zstandard" -version = "0.24.0" -description = "Zstandard bindings for Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "zstandard-0.24.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af1394c2c5febc44e0bbf0fc6428263fa928b50d1b1982ce1d870dc793a8e5f4"}, - {file = "zstandard-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e941654cef13a1d53634ec30933722eda11f44f99e1d0bc62bbce3387580d50"}, - {file = "zstandard-0.24.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:561123d05681197c0e24eb8ab3cfdaf299e2b59c293d19dad96e1610ccd8fbc6"}, - {file = "zstandard-0.24.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0f6d9a146e07458cb41423ca2d783aefe3a3a97fe72838973c13b8f1ecc7343a"}, - {file = "zstandard-0.24.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf02f915fa7934ea5dfc8d96757729c99a8868b7c340b97704795d6413cf5fe6"}, - {file = "zstandard-0.24.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:35f13501a8accf834457d8e40e744568287a215818778bc4d79337af2f3f0d97"}, - {file = "zstandard-0.24.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92be52ca4e6e604f03d5daa079caec9e04ab4cbf6972b995aaebb877d3d24e13"}, - {file = "zstandard-0.24.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0c9c3cba57f5792532a3df3f895980d47d78eda94b0e5b800651b53e96e0b604"}, - {file = "zstandard-0.24.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:dd91b0134a32dfcd8be504e8e46de44ad0045a569efc25101f2a12ccd41b5759"}, - {file = "zstandard-0.24.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d6975f2d903bc354916a17b91a7aaac7299603f9ecdb788145060dde6e573a16"}, - {file = "zstandard-0.24.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7ac6e4d727521d86d20ec291a3f4e64a478e8a73eaee80af8f38ec403e77a409"}, - {file = "zstandard-0.24.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:87ae1684bc3c02d5c35884b3726525eda85307073dbefe68c3c779e104a59036"}, - {file = "zstandard-0.24.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:7de5869e616d426b56809be7dc6dba4d37b95b90411ccd3de47f421a42d4d42c"}, - {file = "zstandard-0.24.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:388aad2d693707f4a0f6cc687eb457b33303d6b57ecf212c8ff4468c34426892"}, - {file = "zstandard-0.24.0-cp310-cp310-win32.whl", hash = "sha256:962ea3aecedcc944f8034812e23d7200d52c6e32765b8da396eeb8b8ffca71ce"}, - {file = "zstandard-0.24.0-cp310-cp310-win_amd64.whl", hash = "sha256:869bf13f66b124b13be37dd6e08e4b728948ff9735308694e0b0479119e08ea7"}, - {file = "zstandard-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:addfc23e3bd5f4b6787b9ca95b2d09a1a67ad5a3c318daaa783ff90b2d3a366e"}, - {file = "zstandard-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b005bcee4be9c3984b355336283afe77b2defa76ed6b89332eced7b6fa68b68"}, - {file = "zstandard-0.24.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:3f96a9130171e01dbb6c3d4d9925d604e2131a97f540e223b88ba45daf56d6fb"}, - {file = "zstandard-0.24.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd0d3d16e63873253bad22b413ec679cf6586e51b5772eb10733899832efec42"}, - {file = "zstandard-0.24.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b7a8c30d9bf4bd5e4dcfe26900bef0fcd9749acde45cdf0b3c89e2052fda9a13"}, - {file = "zstandard-0.24.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:52cd7d9fa0a115c9446abb79b06a47171b7d916c35c10e0c3aa6f01d57561382"}, - {file = "zstandard-0.24.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0f6fc2ea6e07e20df48752e7700e02e1892c61f9a6bfbacaf2c5b24d5ad504b"}, - {file = "zstandard-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e46eb6702691b24ddb3e31e88b4a499e31506991db3d3724a85bd1c5fc3cfe4e"}, - {file = "zstandard-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5e3b9310fd7f0d12edc75532cd9a56da6293840c84da90070d692e0bb15f186"}, - {file = "zstandard-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76cdfe7f920738ea871f035568f82bad3328cbc8d98f1f6988264096b5264efd"}, - {file = "zstandard-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3f2fe35ec84908dddf0fbf66b35d7c2878dbe349552dd52e005c755d3493d61c"}, - {file = "zstandard-0.24.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:aa705beb74ab116563f4ce784fa94771f230c05d09ab5de9c397793e725bb1db"}, - {file = "zstandard-0.24.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:aadf32c389bb7f02b8ec5c243c38302b92c006da565e120dfcb7bf0378f4f848"}, - {file = "zstandard-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e40cd0fc734aa1d4bd0e7ad102fd2a1aefa50ce9ef570005ffc2273c5442ddc3"}, - {file = "zstandard-0.24.0-cp311-cp311-win32.whl", hash = "sha256:cda61c46343809ecda43dc620d1333dd7433a25d0a252f2dcc7667f6331c7b61"}, - {file = "zstandard-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:3b95fc06489aa9388400d1aab01a83652bc040c9c087bd732eb214909d7fb0dd"}, - {file = "zstandard-0.24.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad9fd176ff6800a0cf52bcf59c71e5de4fa25bf3ba62b58800e0f84885344d34"}, - {file = "zstandard-0.24.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a2bda8f2790add22773ee7a4e43c90ea05598bffc94c21c40ae0a9000b0133c3"}, - {file = "zstandard-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cc76de75300f65b8eb574d855c12518dc25a075dadb41dd18f6322bda3fe15d5"}, - {file = "zstandard-0.24.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:d2b3b4bda1a025b10fe0269369475f420177f2cb06e0f9d32c95b4873c9f80b8"}, - {file = "zstandard-0.24.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b84c6c210684286e504022d11ec294d2b7922d66c823e87575d8b23eba7c81f"}, - {file = "zstandard-0.24.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c59740682a686bf835a1a4d8d0ed1eefe31ac07f1c5a7ed5f2e72cf577692b00"}, - {file = "zstandard-0.24.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6324fde5cf5120fbf6541d5ff3c86011ec056e8d0f915d8e7822926a5377193a"}, - {file = "zstandard-0.24.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51a86bd963de3f36688553926a84e550d45d7f9745bd1947d79472eca27fcc75"}, - {file = "zstandard-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d82ac87017b734f2fb70ff93818c66f0ad2c3810f61040f077ed38d924e19980"}, - {file = "zstandard-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92ea7855d5bcfb386c34557516c73753435fb2d4a014e2c9343b5f5ba148b5d8"}, - {file = "zstandard-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3adb4b5414febf074800d264ddf69ecade8c658837a83a19e8ab820e924c9933"}, - {file = "zstandard-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6374feaf347e6b83ec13cc5dcfa70076f06d8f7ecd46cc71d58fac798ff08b76"}, - {file = "zstandard-0.24.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:13fc548e214df08d896ee5f29e1f91ee35db14f733fef8eabea8dca6e451d1e2"}, - {file = "zstandard-0.24.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0a416814608610abf5488889c74e43ffa0343ca6cf43957c6b6ec526212422da"}, - {file = "zstandard-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0d66da2649bb0af4471699aeb7a83d6f59ae30236fb9f6b5d20fb618ef6c6777"}, - {file = "zstandard-0.24.0-cp312-cp312-win32.whl", hash = "sha256:ff19efaa33e7f136fe95f9bbcc90ab7fb60648453b03f95d1de3ab6997de0f32"}, - {file = "zstandard-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc05f8a875eb651d1cc62e12a4a0e6afa5cd0cc231381adb830d2e9c196ea895"}, - {file = "zstandard-0.24.0-cp312-cp312-win_arm64.whl", hash = "sha256:b04c94718f7a8ed7cdd01b162b6caa1954b3c9d486f00ecbbd300f149d2b2606"}, - {file = "zstandard-0.24.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e4ebb000c0fe24a6d0f3534b6256844d9dbf042fdf003efe5cf40690cf4e0f3e"}, - {file = "zstandard-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:498f88f5109666c19531f0243a90d2fdd2252839cd6c8cc6e9213a3446670fa8"}, - {file = "zstandard-0.24.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0a9e95ceb180ccd12a8b3437bac7e8a8a089c9094e39522900a8917745542184"}, - {file = "zstandard-0.24.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bcf69e0bcddbf2adcfafc1a7e864edcc204dd8171756d3a8f3340f6f6cc87b7b"}, - {file = "zstandard-0.24.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:10e284748a7e7fbe2815ca62a9d6e84497d34cfdd0143fa9e8e208efa808d7c4"}, - {file = "zstandard-0.24.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1bda8a85e5b9d5e73af2e61b23609a8cc1598c1b3b2473969912979205a1ff25"}, - {file = "zstandard-0.24.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1b14bc92af065d0534856bf1b30fc48753163ea673da98857ea4932be62079b1"}, - {file = "zstandard-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:b4f20417a4f511c656762b001ec827500cbee54d1810253c6ca2df2c0a307a5f"}, - {file = "zstandard-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:337572a7340e1d92fd7fb5248c8300d0e91071002d92e0b8cabe8d9ae7b58159"}, - {file = "zstandard-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df4be1cf6e8f0f2bbe2a3eabfff163ef592c84a40e1a20a8d7db7f27cfe08fc2"}, - {file = "zstandard-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6885ae4b33aee8835dbdb4249d3dfec09af55e705d74d9b660bfb9da51baaa8b"}, - {file = "zstandard-0.24.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:663848a8bac4fdbba27feea2926049fdf7b55ec545d5b9aea096ef21e7f0b079"}, - {file = "zstandard-0.24.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:05d27c953f2e0a3ecc8edbe91d6827736acc4c04d0479672e0400ccdb23d818c"}, - {file = "zstandard-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77b8b7b98893eaf47da03d262816f01f251c2aa059c063ed8a45c50eada123a5"}, - {file = "zstandard-0.24.0-cp313-cp313-win32.whl", hash = "sha256:cf7fbb4e54136e9a03c7ed7691843c4df6d2ecc854a2541f840665f4f2bb2edd"}, - {file = "zstandard-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:d64899cc0f33a8f446f1e60bffc21fa88b99f0e8208750d9144ea717610a80ce"}, - {file = "zstandard-0.24.0-cp313-cp313-win_arm64.whl", hash = "sha256:57be3abb4313e0dd625596376bbb607f40059d801d51c1a1da94d7477e63b255"}, - {file = "zstandard-0.24.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b7fa260dd2731afd0dfa47881c30239f422d00faee4b8b341d3e597cface1483"}, - {file = "zstandard-0.24.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e05d66239d14a04b4717998b736a25494372b1b2409339b04bf42aa4663bf251"}, - {file = "zstandard-0.24.0-cp314-cp314-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:622e1e04bd8a085994e02313ba06fbcf4f9ed9a488c6a77a8dbc0692abab6a38"}, - {file = "zstandard-0.24.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:55872e818598319f065e8192ebefecd6ac05f62a43f055ed71884b0a26218f41"}, - {file = "zstandard-0.24.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bb2446a55b3a0fd8aa02aa7194bd64740015464a2daaf160d2025204e1d7c282"}, - {file = "zstandard-0.24.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2825a3951f945fb2613ded0f517d402b1e5a68e87e0ee65f5bd224a8333a9a46"}, - {file = "zstandard-0.24.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09887301001e7a81a3618156bc1759e48588de24bddfdd5b7a4364da9a8fbc20"}, - {file = "zstandard-0.24.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:98ca91dc9602cf351497d5600aa66e6d011a38c085a8237b370433fcb53e3409"}, - {file = "zstandard-0.24.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:e69f8e534b4e254f523e2f9d4732cf9c169c327ca1ce0922682aac9a5ee01155"}, - {file = "zstandard-0.24.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:444633b487a711e34f4bccc46a0c5dfbe1aee82c1a511e58cdc16f6bd66f187c"}, - {file = "zstandard-0.24.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f7d3fe9e1483171e9183ffdb1fab07c5fef80a9c3840374a38ec2ab869ebae20"}, - {file = "zstandard-0.24.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:27b6fa72b57824a3f7901fc9cc4ce1c1c834b28f3a43d1d4254c64c8f11149d4"}, - {file = "zstandard-0.24.0-cp314-cp314-win32.whl", hash = "sha256:fdc7a52a4cdaf7293e10813fd6a3abc0c7753660db12a3b864ab1fb5a0c60c16"}, - {file = "zstandard-0.24.0-cp314-cp314-win_amd64.whl", hash = "sha256:656ed895b28c7e42dd5b40dfcea3217cfc166b6b7eef88c3da2f5fc62484035b"}, - {file = "zstandard-0.24.0-cp314-cp314-win_arm64.whl", hash = "sha256:0101f835da7de08375f380192ff75135527e46e3f79bef224e3c49cb640fef6a"}, - {file = "zstandard-0.24.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52788e7c489069e317fde641de41b757fa0ddc150e06488f153dd5daebac7192"}, - {file = "zstandard-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ec194197e90ca063f5ecb935d6c10063d84208cac5423c07d0f1a09d1c2ea42b"}, - {file = "zstandard-0.24.0-cp39-cp39-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e91a4e5d62da7cb3f53e04fe254f1aa41009af578801ee6477fe56e7bef74ee2"}, - {file = "zstandard-0.24.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fc67eb15ed573950bc6436a04b3faea6c36c7db98d2db030d48391c6736a0dc"}, - {file = "zstandard-0.24.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f6ae9fc67e636fc0fa9adee39db87dfbdeabfa8420bc0e678a1ac8441e01b22b"}, - {file = "zstandard-0.24.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ab2357353894a5ec084bb8508ff892aa43fb7fe8a69ad310eac58221ee7f72aa"}, - {file = "zstandard-0.24.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f578fab202f4df67a955145c3e3ca60ccaaaf66c97808545b2625efeecdef10"}, - {file = "zstandard-0.24.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c39d2b6161f3c5c5d12e9207ecf1006bb661a647a97a6573656b09aaea3f00ef"}, - {file = "zstandard-0.24.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dc5654586613aebe5405c1ba180e67b3f29e7d98cf3187c79efdcc172f39457"}, - {file = "zstandard-0.24.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b91380aefa9c7ac831b011368daf378d3277e0bdeb6bad9535e21251e26dd55a"}, - {file = "zstandard-0.24.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:010302face38c9a909b8934e3bf6038266d6afc69523f3efa023c5cb5d38271b"}, - {file = "zstandard-0.24.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:3aa3b4344b206941385a425ea25e6dd63e5cb0f535a4b88d56e3f8902086be9e"}, - {file = "zstandard-0.24.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:63d39b161000aeeaa06a1cb77c9806e939bfe460dfd593e4cbf24e6bc717ae94"}, - {file = "zstandard-0.24.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ed8345b504df1cab280af923ef69ec0d7d52f7b22f78ec7982fde7c33a43c4f"}, - {file = "zstandard-0.24.0-cp39-cp39-win32.whl", hash = "sha256:1e133a9dd51ac0bcd5fd547ba7da45a58346dbc63def883f999857b0d0c003c4"}, - {file = "zstandard-0.24.0-cp39-cp39-win_amd64.whl", hash = "sha256:8ecd3b1f7a601f79e0cd20c26057d770219c0dc2f572ea07390248da2def79a4"}, - {file = "zstandard-0.24.0.tar.gz", hash = "sha256:fe3198b81c00032326342d973e526803f183f97aa9e9a98e3f897ebafe21178f"}, -] - -[package.extras] -cffi = ["cffi (>=1.17)"] - [extras] docs = ["sphinx", "sphinx_rtd_theme"] events = ["aiohttp"] pyats = ["pyats"] [metadata] -lock-version = "2.0" -python-versions = "^3.9.2" -content-hash = "bf253fa5ba90d3674a5fae340644e57548dedf0800266e35fbffb283c1b6ae3c" +lock-version = "2.1" +python-versions = "^3.10" +content-hash = "6e9d8ca328b3c187c54f78cbf43ab684ef56d272a5c0314e90482d0c3516c9ca" diff --git a/pyproject.toml b/pyproject.toml index bc286a27..8e76fb3d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,21 @@ +# +# This file is part of VIRL 2 +# Copyright (c) 2019-2026, Cisco Systems, Inc. +# All rights reserved. +# [tool.poetry] name = "virl2_client" -version = "2.9.1" +version = "2.10.0" description = "VIRL2 Client Library" authors = ["Simon Knight ", "Ralph Schmieder "] license = "Apache-2.0" readme = "README.md" homepage = "https://github.com/ciscodevnet/virl2-client" repository = "https://github.com/ciscodevnet/virl2-client" -include = ["examples/*"] -exclude = ["tests/**/*"] +exclude = [ + "tests/**/*", + "examples/*" +] classifiers = [ "Development Status :: 4 - Beta", @@ -20,13 +27,12 @@ classifiers = [ ] [tool.poetry.dependencies] -# cryptography requires python>=3.9.2 -python = "^3.9.2" +python = "^3.10" httpx = "^0.28.1" # https://github.com/python-poetry/poetry/pull/606 -- no support for optional dev-deps # optional package for events -aiohttp = {version = "~3.11.18", optional = true} +aiohttp = {version = "^3", optional = true} # optional pyATS package # (this pulls in a lot more dependencies) @@ -35,14 +41,14 @@ pyats = {version = "^25", optional = true} # optional packages for documentation build sphinx_rtd_theme = {version="^3", optional = true} -# version 8 is available but requires python>=3.10 -sphinx = {version="^7", optional = true} +# version 8.2.3 is available but requires python>=3.11 +sphinx = {version="<8.2", optional = true} [tool.poetry.group.dev.dependencies] flake8 = "^7" -poetry-plugin-export = "*" pre-commit = "^4" pytest = "*" +pytest-xdist = "*" respx = "^0.22.0" [tool.poetry.extras] @@ -50,6 +56,9 @@ events = ["aiohttp"] pyats = ["pyats"] docs = ["sphinx", "sphinx_rtd_theme"] +[tool.poetry.requires-plugins] +poetry-plugin-export = "*" + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/pytest.ini b/pytest.ini index 46461d6d..e297d48c 100644 --- a/pytest.ini +++ b/pytest.ini @@ -9,14 +9,7 @@ addopts = # --cov-branch # --cov-report term-missing -filterwarnings = - # genie/pyats/unicon need some updates - ignore: pkg_resources is deprecated.*:DeprecationWarning - ignore: Deprecated call to `pkg_resources.declare_namespace.*:DeprecationWarning - junit_family=xunit1 -asyncio_mode=auto -asyncio_default_fixture_loop_scope=function # start pytest with --log-level=info # log_cli=True diff --git a/tests/conftest.py b/tests/conftest.py index ebef48aa..94372036 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -18,22 +18,28 @@ # limitations under the License. # +import sys +from collections.abc import Iterator from functools import partial from pathlib import Path -from unittest.mock import patch +from unittest.mock import MagicMock, patch import httpx import pytest +from respx import MockRouter from virl2_client.models import authentication from virl2_client.virl2_client import ClientLibrary +# Patch sys.stdin.isatty to simulate an interactive terminal +sys.stdin.isatty = lambda: True + CURRENT_VERSION = ClientLibrary.VERSION.version_str FAKE_HOST = "https://0.0.0.0" FAKE_HOST_API = f"{FAKE_HOST}/api/v0/" -def client_library_patched_system_info(version): +def client_library_patched_system_info(version: str) -> Iterator[MagicMock]: with patch.object( ClientLibrary, "system_info", return_value={"version": version, "ready": True} ) as cl: @@ -41,22 +47,29 @@ def client_library_patched_system_info(version): @pytest.fixture -def client_library_server_current(): +def client_library_server_current() -> Iterator[MagicMock]: yield from client_library_patched_system_info(version=CURRENT_VERSION) @pytest.fixture -def client_library_server_2_0_0(): +def client_library_server_2_0_0() -> Iterator[MagicMock]: yield from client_library_patched_system_info(version="2.0.0") @pytest.fixture -def client_library_server_2_19_0(): +def client_library_server_2_19_0() -> Iterator[MagicMock]: yield from client_library_patched_system_info(version="2.19.0") @pytest.fixture -def mocked_session(): +def client_library_server_2_9_0() -> Iterator[MagicMock]: + """Simulate a controller running CML version 2.9.0.""" + + yield from client_library_patched_system_info(version="2.9.0") + + +@pytest.fixture +def mocked_session() -> Iterator[MagicMock]: with patch.object(authentication, "CustomClient", autospec=True) as session: yield session @@ -86,7 +99,7 @@ def resp_body_from_file(test_data_dir: Path, request: httpx.Request) -> httpx.Re @pytest.fixture -def respx_mock_with_labs(respx_mock, test_data_dir: Path): +def respx_mock_with_labs(respx_mock: MockRouter, test_data_dir: Path): """ A test fixture that provides basic lab data with respx_mock so that unit tests can call ``client.all_labs`` or ``client.join_existing_lab``. The sample data includes @@ -96,7 +109,15 @@ def respx_mock_with_labs(respx_mock, test_data_dir: Path): json={"version": CURRENT_VERSION, "ready": True, "oui": "52:54:00:00:00:00"}, ) respx_mock.post(FAKE_HOST_API + "authenticate").respond(json="BOGUS_TOKEN") - respx_mock.get(FAKE_HOST_API + "authok") + respx_mock.get(FAKE_HOST_API + "authentication").respond( + json={ + "username": "username", + "id": "6c7dd461-1cbe-428f-bdd5-545a0d766ed7", + "token": "BOGUS_TOKEN", + "admin": True, + "error": None, + } + ) respx_mock.get( FAKE_HOST_API + "labs/444a78d1-575c-4746-8469-696e580f17b6/resource_pools" ).respond(json=[]) @@ -119,6 +140,16 @@ def respx_mock_with_labs(respx_mock, test_data_dir: Path): ).respond( json={"operational": {"compute_id": "99c887f5-052e-4864-a583-49fa7c4b68a9"}} ) + respx_mock.get( + FAKE_HOST_API + + f"labs/444a78d1-575c-4746-8469-696e580f17b6/nodes/{node}/interfaces" + + "?data=true&operational=true" + ).respond(json=[]) + + respx_mock.get( + FAKE_HOST_API + "labs/444a78d1-575c-4746-8469-696e580f17b6/interfaces" + ).respond(json=[]) + respx_mock.get( FAKE_HOST_API + "labs/444a78d1-575c-4746-8469-696e580f17b6/nodes?data=true&operational=true&" @@ -154,6 +185,7 @@ def respx_mock_with_labs(respx_mock, test_data_dir: Path): @pytest.fixture -def client_library(respx_mock_with_labs): +def client_library(respx_mock_with_labs: MockRouter) -> Iterator[ClientLibrary]: + _ = respx_mock_with_labs client = ClientLibrary(url=FAKE_HOST, username="test", password="pa$$") yield client diff --git a/tests/requirements.txt b/tests/requirements.txt index 48727fb0..2624e1c4 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,824 +1,209 @@ -anyio==4.10.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6 \ - --hash=sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1 -backports-tarfile==1.2.0 ; python_full_version >= "3.9.2" and python_version < "3.12" \ - --hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \ - --hash=sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991 -build==1.3.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:698edd0ea270bde950f53aed21f3a0135672206f3911e0176261a31e0e07b397 \ - --hash=sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4 -cachecontrol[filecache]==0.14.3 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:73e7efec4b06b20d9267b441c1f733664f989fb8688391b670ca812d70795d11 \ - --hash=sha256:b35e44a3113f17d2a31c1e6b27b9de6d4405f84ae51baa8c1d3cc5b633010cae -certifi==2025.8.3 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407 \ - --hash=sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5 -cffi==1.17.1 ; python_full_version >= "3.9.2" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") and (sys_platform == "darwin" or platform_python_implementation != "PyPy") \ - --hash=sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8 \ - --hash=sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2 \ - --hash=sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1 \ - --hash=sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15 \ - --hash=sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36 \ - --hash=sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824 \ - --hash=sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8 \ - --hash=sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36 \ - --hash=sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17 \ - --hash=sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf \ - --hash=sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc \ - --hash=sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3 \ - --hash=sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed \ - --hash=sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702 \ - --hash=sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1 \ - --hash=sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8 \ - --hash=sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903 \ - --hash=sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6 \ - --hash=sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d \ - --hash=sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b \ - --hash=sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e \ - --hash=sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be \ - --hash=sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c \ - --hash=sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683 \ - --hash=sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9 \ - --hash=sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c \ - --hash=sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8 \ - --hash=sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1 \ - --hash=sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4 \ - --hash=sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655 \ - --hash=sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67 \ - --hash=sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595 \ - --hash=sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0 \ - --hash=sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65 \ - --hash=sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 \ - --hash=sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6 \ - --hash=sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 \ - --hash=sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6 \ - --hash=sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3 \ - --hash=sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16 \ - --hash=sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93 \ - --hash=sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e \ - --hash=sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4 \ - --hash=sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964 \ - --hash=sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c \ - --hash=sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576 \ - --hash=sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0 \ - --hash=sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3 \ - --hash=sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662 \ - --hash=sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3 \ - --hash=sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff \ - --hash=sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5 \ - --hash=sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd \ - --hash=sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f \ - --hash=sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5 \ - --hash=sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14 \ - --hash=sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d \ - --hash=sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9 \ - --hash=sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7 \ - --hash=sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382 \ - --hash=sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a \ - --hash=sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e \ - --hash=sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a \ - --hash=sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4 \ - --hash=sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99 \ - --hash=sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87 \ - --hash=sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b -cfgv==3.4.0 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ - --hash=sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9 \ - --hash=sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560 -charset-normalizer==3.4.3 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91 \ - --hash=sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0 \ - --hash=sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154 \ - --hash=sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601 \ - --hash=sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884 \ - --hash=sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07 \ - --hash=sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c \ - --hash=sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64 \ - --hash=sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe \ - --hash=sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f \ - --hash=sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432 \ - --hash=sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc \ - --hash=sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa \ - --hash=sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9 \ - --hash=sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae \ - --hash=sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19 \ - --hash=sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d \ - --hash=sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e \ - --hash=sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4 \ - --hash=sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7 \ - --hash=sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312 \ - --hash=sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92 \ - --hash=sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31 \ - --hash=sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c \ - --hash=sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f \ - --hash=sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99 \ - --hash=sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b \ - --hash=sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15 \ - --hash=sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392 \ - --hash=sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f \ - --hash=sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8 \ - --hash=sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491 \ - --hash=sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0 \ - --hash=sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc \ - --hash=sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0 \ - --hash=sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f \ - --hash=sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a \ - --hash=sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40 \ - --hash=sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927 \ - --hash=sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849 \ - --hash=sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce \ - --hash=sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14 \ - --hash=sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05 \ - --hash=sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c \ - --hash=sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c \ - --hash=sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a \ - --hash=sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc \ - --hash=sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34 \ - --hash=sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9 \ - --hash=sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096 \ - --hash=sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14 \ - --hash=sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30 \ - --hash=sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b \ - --hash=sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b \ - --hash=sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942 \ - --hash=sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db \ - --hash=sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5 \ - --hash=sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b \ - --hash=sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce \ - --hash=sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669 \ - --hash=sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0 \ - --hash=sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018 \ - --hash=sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93 \ - --hash=sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe \ - --hash=sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049 \ - --hash=sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a \ - --hash=sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef \ - --hash=sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2 \ - --hash=sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca \ - --hash=sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16 \ - --hash=sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f \ - --hash=sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb \ - --hash=sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1 \ - --hash=sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557 \ - --hash=sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37 \ - --hash=sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7 \ - --hash=sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72 \ - --hash=sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c \ - --hash=sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9 -cleo==2.1.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:0b2c880b5d13660a7ea651001fb4acb527696c01f15c9ee650f377aa543fd523 \ - --hash=sha256:4a31bd4dd45695a64ee3c4758f583f134267c2bc518d8ae9a29cf237d009b07e -colorama==0.4.6 ; python_full_version >= "3.9.2" and python_version < "4.0" and (sys_platform == "win32" or os_name == "nt") \ +anyio==4.12.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703 \ + --hash=sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c +certifi==2026.1.4 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c \ + --hash=sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120 +cfgv==3.5.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0 \ + --hash=sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132 +colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32" \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 -crashtest==0.4.1 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce \ - --hash=sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5 -cryptography==45.0.6 ; python_full_version >= "3.9.2" and python_version < "4.0" and sys_platform == "linux" \ - --hash=sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5 \ - --hash=sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74 \ - --hash=sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394 \ - --hash=sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301 \ - --hash=sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08 \ - --hash=sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3 \ - --hash=sha256:20d15aed3ee522faac1a39fbfdfee25d17b1284bafd808e1640a74846d7c4d1b \ - --hash=sha256:2384f2ab18d9be88a6e4f8972923405e2dbb8d3e16c6b43f15ca491d7831bd18 \ - --hash=sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402 \ - --hash=sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3 \ - --hash=sha256:31a2b9a10530a1cb04ffd6aa1cd4d3be9ed49f7d77a4dafe198f3b382f41545c \ - --hash=sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0 \ - --hash=sha256:3b5bf5267e98661b9b888a9250d05b063220dfa917a8203744454573c7eb79db \ - --hash=sha256:3de77e4df42ac8d4e4d6cdb342d989803ad37707cf8f3fbf7b088c9cbdd46427 \ - --hash=sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f \ - --hash=sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3 \ - --hash=sha256:599c8d7df950aa68baa7e98f7b73f4f414c9f02d0e8104a30c0182a07732638b \ - --hash=sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9 \ - --hash=sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5 \ - --hash=sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719 \ - --hash=sha256:629127cfdcdc6806dfe234734d7cb8ac54edaf572148274fa377a7d3405b0043 \ - --hash=sha256:705bb7c7ecc3d79a50f236adda12ca331c8e7ecfbea51edd931ce5a7a7c4f012 \ - --hash=sha256:780c40fb751c7d2b0c6786ceee6b6f871e86e8718a8ff4bc35073ac353c7cd02 \ - --hash=sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2 \ - --hash=sha256:826b46dae41a1155a0c0e66fafba43d0ede1dc16570b95e40c4d83bfcf0a451d \ - --hash=sha256:833dc32dfc1e39b7376a87b9a6a4288a10aae234631268486558920029b086ec \ - --hash=sha256:cc4d66f5dc4dc37b89cfef1bd5044387f7a1f6f0abb490815628501909332d5d \ - --hash=sha256:d063341378d7ee9c91f9d23b431a3502fc8bfacd54ef0a27baa72a0843b29159 \ - --hash=sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453 \ - --hash=sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf \ - --hash=sha256:e5b3dda1b00fb41da3af4c5ef3f922a200e33ee5ba0f0bc9ecf0b0c173958385 \ - --hash=sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9 \ - --hash=sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016 \ - --hash=sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05 \ - --hash=sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42 \ - --hash=sha256:f68f833a9d445cc49f01097d95c83a850795921b3f7cc6488731e69bde3288da \ - --hash=sha256:fc022c1fa5acff6def2fc6d7819bbbd31ccddfe67d075331a65d9cfb28a20983 -distlib==0.4.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ +distlib==0.4.0 ; python_version >= "3.10" and python_version < "4.0" \ --hash=sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16 \ --hash=sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d -dulwich==0.22.8 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:00e7d9a3d324f9e0a1b27880eec0e8e276ff76519621b66c1a429ca9eb3f5a8d \ - --hash=sha256:017152c51b9a613f0698db28c67cf3e0a89392d28050dbf4f4ac3f657ea4c0dc \ - --hash=sha256:0852edc51cff4f4f62976bdaa1d82f6ef248356c681c764c0feb699bc17d5782 \ - --hash=sha256:0f1476c9c4e4ede95714d06c4831883a26680e37b040b8b6230f506e5ba39f51 \ - --hash=sha256:12b243b7e912011c7225dc67480c313ac8d2990744789b876016fb593f6f3e19 \ - --hash=sha256:16bbe483d663944972e22d64e1f191201123c3b5580fbdaac6a4f66bfaa4fc11 \ - --hash=sha256:1748cd573a0aee4d530bc223a23ccb8bb5b319645931a37bd1cfb68933b720c1 \ - --hash=sha256:1e8da9dd8135884975f5be0563ede02179240250e11f11942801ae31ac293f37 \ - --hash=sha256:2b2fda8e87907ed304d4a5962aea0338366144df0df60f950b8f7f125871707f \ - --hash=sha256:3b6757c6b3ba98212b854a766a4157b9cb79a06f4e1b06b46dec4bd834945b8e \ - --hash=sha256:432a37b25733202897b8d67cdd641688444d980167c356ef4e4dd15a17a39a24 \ - --hash=sha256:4fc5ce2435fb3abdf76f1acabe48f2e4b3f7428232cadaef9daaf50ea7fa30ee \ - --hash=sha256:546176d18b8cc0a492b0f23f07411e38686024cffa7e9d097ae20512a2e57127 \ - --hash=sha256:5b79b94726c3f4a9e5a830c649376fd0963236e73142a4290bac6bc9fc9cb120 \ - --hash=sha256:5f6338e6cf95cd76a0191b3637dc3caed1f988ae84d8e75f876d5cd75a8dd81a \ - --hash=sha256:6987d753227f55cf75ba29a8dab69d1d83308ce483d7a8c6d223086f7a42e125 \ - --hash=sha256:6bde2b13a05cc0ec2ecd4597a99896663544c40af1466121f4d046119b874ce3 \ - --hash=sha256:6bfdbc6fa477dee00d04e22d43a51571cd820cfaaaa886f0f155b8e29b3e3d45 \ - --hash=sha256:6d446cb7d272a151934ad4b48ba691f32486d5267cf2de04ee3b5e05fc865326 \ - --hash=sha256:701547310415de300269331abe29cb5717aa1ea377af826bf513d0adfb1c209b \ - --hash=sha256:71420ffb6deebc59b2ce875e63d814509f9c1dc89c76db962d547aebf15670c7 \ - --hash=sha256:7757b4a2aad64c6f1920082fc1fccf4da25c3923a0ae7b242c08d06861dae6e1 \ - --hash=sha256:7a44e5a61a7989aca1e301d39cfb62ad2f8853368682f524d6e878b4115d823d \ - --hash=sha256:7bb18fa09daa1586c1040b3e2777d38d4212a5cdbe47d384ba66a1ac336fcc4c \ - --hash=sha256:7bff1da8e2e6a607c3cb45f5c2e652739589fe891245e1d5b770330cdecbde41 \ - --hash=sha256:7d2434dd72b2ae09b653c9cfe6764a03c25cfbd99fbbb7c426f0478f6fb1100f \ - --hash=sha256:826aae8b64ac1a12321d6b272fc13934d8f62804fda2bc6ae46f93f4380798eb \ - --hash=sha256:8bdd9543a77fb01be704377f5e634b71f955fec64caa4a493dc3bfb98e3a986e \ - --hash=sha256:982b21cc3100d959232cadb3da0a478bd549814dd937104ea50f43694ec27153 \ - --hash=sha256:9969099e15b939d3936f8bee8459eaef7ef5a86cd6173393a17fe28ca3d38aff \ - --hash=sha256:a626adbfac44646a125618266a24133763bdc992bf8bd0702910d67e6b994443 \ - --hash=sha256:a631b2309feb9a9631eabd896612ba36532e3ffedccace57f183bb868d7afc06 \ - --hash=sha256:ae900c8e573f79d714c1d22b02cdadd50b64286dd7203028f0200f82089e4950 \ - --hash=sha256:b2b31913932bb5bd41658dd398b33b1a2d4d34825123ad54e40912cfdfe60003 \ - --hash=sha256:c7a0f96a2a87f3b4f7feae79d2ac6b94107d6b7d827ac08f2f331b88c8f597a1 \ - --hash=sha256:d81697f74f50f008bb221ab5045595f8a3b87c0de2c86aa55be42ba97421f3cd \ - --hash=sha256:dbade3342376be1cd2409539fe1b901d2d57a531106bbae204da921ef4456a74 \ - --hash=sha256:dc89c6f14dcdcbfee200b0557c59ae243835e42720be143526d834d0e53ed3af \ - --hash=sha256:e004fc532ea262f2d5f375068101ca4792becb9d4aa663b050f5ac31fda0bb5c \ - --hash=sha256:e02d403af23d93dc1f96eb2408e25efd50046e38590a88c86fa4002adc9849b0 \ - --hash=sha256:ee70e8bb8798b503f81b53f7a103cb869c8e89141db9005909f79ab1506e26e9 \ - --hash=sha256:f3a15e58dac8b8a76073ddca34e014f66f3672a5540a99d49ef6a9c09ab21285 \ - --hash=sha256:f7ae726f923057d36cdbb9f4fb7da0d0903751435934648b13f1b851f0e38ea1 \ - --hash=sha256:f8aa3de93201f9e3e40198725389aa9554a4ee3318a865f96a8e9bc9080f0b25 \ - --hash=sha256:f9cd0c67fb44a38358b9fcabee948bf11044ef6ce7a129e50962f54c176d084e \ - --hash=sha256:fe8318bc0921d42e3e69f03716f983a301b5ee4c8dc23c7f2c5bbb28581257a9 \ - --hash=sha256:ffc7a02e62b72884de58baaa3b898b7f6427893e79b1289ffa075092efe59181 -exceptiongroup==1.3.0 ; python_full_version >= "3.9.2" and python_version < "3.11" \ - --hash=sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10 \ - --hash=sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88 -fastjsonschema==2.21.2 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463 \ - --hash=sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de -filelock==3.19.1 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58 \ - --hash=sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d -findpython==0.6.3 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:5863ea55556d8aadc693481a14ac4f3624952719efc1c5591abb0b4a9e965c94 \ - --hash=sha256:a85bb589b559cdf1b87227cc233736eb7cad894b9e68021ee498850611939ebc -flake8==7.3.0 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ +exceptiongroup==1.3.1 ; python_version == "3.10" \ + --hash=sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219 \ + --hash=sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598 +execnet==2.1.2 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd \ + --hash=sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec +filelock==3.20.3 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1 \ + --hash=sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1 +flake8==7.3.0 ; python_version >= "3.10" and python_version < "4.0" \ --hash=sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e \ --hash=sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872 -h11==0.16.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ +h11==0.16.0 ; python_version >= "3.10" and python_version < "4.0" \ --hash=sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1 \ --hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 -httpcore==1.0.9 ; python_full_version >= "3.9.2" and python_version < "4.0" \ +httpcore==1.0.9 ; python_version >= "3.10" and python_version < "4.0" \ --hash=sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55 \ --hash=sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8 -httpx==0.28.1 ; python_full_version >= "3.9.2" and python_version < "4.0" \ +httpx==0.28.1 ; python_version >= "3.10" and python_version < "4.0" \ --hash=sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc \ --hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad -identify==2.6.13 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ - --hash=sha256:60381139b3ae39447482ecc406944190f690d4a2997f2584062089848361b33b \ - --hash=sha256:da8d6c828e773620e13bfa86ea601c5a5310ba4bcd65edf378198b56a1f9fb32 -idna==3.10 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ - --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 -importlib-metadata==8.6.1 ; python_full_version >= "3.9.2" and python_version < "3.12" \ - --hash=sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e \ - --hash=sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580 -iniconfig==2.1.0 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ - --hash=sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7 \ - --hash=sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 -installer==0.7.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53 \ - --hash=sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631 -jaraco-classes==3.4.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd \ - --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790 -jaraco-context==6.0.1 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3 \ - --hash=sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4 -jaraco-functools==4.3.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:227ff8ed6f7b8f62c56deff101545fa7543cf2c8e7b82a7c2116e672f29c26e8 \ - --hash=sha256:cfd13ad0dd2c47a3600b439ef72d8615d482cedcff1632930d6f28924d92f294 -jeepney==0.9.0 ; python_full_version >= "3.9.2" and python_version < "4.0" and sys_platform == "linux" \ - --hash=sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683 \ - --hash=sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732 -keyring==25.6.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66 \ - --hash=sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd -mccabe==0.7.0 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ +identify==2.6.16 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0 \ + --hash=sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980 +idna==3.11 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea \ + --hash=sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902 +iniconfig==2.3.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730 \ + --hash=sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12 +mccabe==0.7.0 ; python_version >= "3.10" and python_version < "4.0" \ --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e -more-itertools==10.7.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3 \ - --hash=sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e -msgpack==1.1.1 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:196a736f0526a03653d829d7d4c5500a97eea3648aebfd4b6743875f28aa2af8 \ - --hash=sha256:1abfc6e949b352dadf4bce0eb78023212ec5ac42f6abfd469ce91d783c149c2a \ - --hash=sha256:1b13fe0fb4aac1aa5320cd693b297fe6fdef0e7bea5518cbc2dd5299f873ae90 \ - --hash=sha256:1d75f3807a9900a7d575d8d6674a3a47e9f227e8716256f35bc6f03fc597ffbf \ - --hash=sha256:2fbbc0b906a24038c9958a1ba7ae0918ad35b06cb449d398b76a7d08470b0ed9 \ - --hash=sha256:33be9ab121df9b6b461ff91baac6f2731f83d9b27ed948c5b9d1978ae28bf157 \ - --hash=sha256:353b6fc0c36fde68b661a12949d7d49f8f51ff5fa019c1e47c87c4ff34b080ed \ - --hash=sha256:36043272c6aede309d29d56851f8841ba907a1a3d04435e43e8a19928e243c1d \ - --hash=sha256:3765afa6bd4832fc11c3749be4ba4b69a0e8d7b728f78e68120a157a4c5d41f0 \ - --hash=sha256:3a89cd8c087ea67e64844287ea52888239cbd2940884eafd2dcd25754fb72232 \ - --hash=sha256:40eae974c873b2992fd36424a5d9407f93e97656d999f43fca9d29f820899084 \ - --hash=sha256:4147151acabb9caed4e474c3344181e91ff7a388b888f1e19ea04f7e73dc7ad5 \ - --hash=sha256:435807eeb1bc791ceb3247d13c79868deb22184e1fc4224808750f0d7d1affc1 \ - --hash=sha256:4835d17af722609a45e16037bb1d4d78b7bdf19d6c0128116d178956618c4e88 \ - --hash=sha256:4a28e8072ae9779f20427af07f53bbb8b4aa81151054e882aee333b158da8752 \ - --hash=sha256:4d3237b224b930d58e9d83c81c0dba7aacc20fcc2f89c1e5423aa0529a4cd142 \ - --hash=sha256:4df2311b0ce24f06ba253fda361f938dfecd7b961576f9be3f3fbd60e87130ac \ - --hash=sha256:4fd6b577e4541676e0cc9ddc1709d25014d3ad9a66caa19962c4f5de30fc09ef \ - --hash=sha256:500e85823a27d6d9bba1d057c871b4210c1dd6fb01fbb764e37e4e8847376323 \ - --hash=sha256:5692095123007180dca3e788bb4c399cc26626da51629a31d40207cb262e67f4 \ - --hash=sha256:5fd1b58e1431008a57247d6e7cc4faa41c3607e8e7d4aaf81f7c29ea013cb458 \ - --hash=sha256:61abccf9de335d9efd149e2fff97ed5974f2481b3353772e8e2dd3402ba2bd57 \ - --hash=sha256:61e35a55a546a1690d9d09effaa436c25ae6130573b6ee9829c37ef0f18d5e78 \ - --hash=sha256:6640fd979ca9a212e4bcdf6eb74051ade2c690b862b679bfcb60ae46e6dc4bfd \ - --hash=sha256:6d489fba546295983abd142812bda76b57e33d0b9f5d5b71c09a583285506f69 \ - --hash=sha256:6f64ae8fe7ffba251fecb8408540c34ee9df1c26674c50c4544d72dbf792e5ce \ - --hash=sha256:71ef05c1726884e44f8b1d1773604ab5d4d17729d8491403a705e649116c9558 \ - --hash=sha256:77b79ce34a2bdab2594f490c8e80dd62a02d650b91a75159a63ec413b8d104cd \ - --hash=sha256:78426096939c2c7482bf31ef15ca219a9e24460289c00dd0b94411040bb73ad2 \ - --hash=sha256:79c408fcf76a958491b4e3b103d1c417044544b68e96d06432a189b43d1215c8 \ - --hash=sha256:7a17ac1ea6ec3c7687d70201cfda3b1e8061466f28f686c24f627cae4ea8efd0 \ - --hash=sha256:7da8831f9a0fdb526621ba09a281fadc58ea12701bc709e7b8cbc362feabc295 \ - --hash=sha256:870b9a626280c86cff9c576ec0d9cbcc54a1e5ebda9cd26dab12baf41fee218c \ - --hash=sha256:88d1e966c9235c1d4e2afac21ca83933ba59537e2e2727a999bf3f515ca2af26 \ - --hash=sha256:88daaf7d146e48ec71212ce21109b66e06a98e5e44dca47d853cbfe171d6c8d2 \ - --hash=sha256:8a8b10fdb84a43e50d38057b06901ec9da52baac6983d3f709d8507f3889d43f \ - --hash=sha256:8b17ba27727a36cb73aabacaa44b13090feb88a01d012c0f4be70c00f75048b4 \ - --hash=sha256:8b65b53204fe1bd037c40c4148d00ef918eb2108d24c9aaa20bc31f9810ce0a8 \ - --hash=sha256:8ddb2bcfd1a8b9e431c8d6f4f7db0773084e107730ecf3472f1dfe9ad583f3d9 \ - --hash=sha256:96decdfc4adcbc087f5ea7ebdcfd3dee9a13358cae6e81d54be962efc38f6338 \ - --hash=sha256:996f2609ddf0142daba4cefd767d6db26958aac8439ee41db9cc0db9f4c4c3a6 \ - --hash=sha256:9d592d06e3cc2f537ceeeb23d38799c6ad83255289bb84c2e5792e5a8dea268a \ - --hash=sha256:a32747b1b39c3ac27d0670122b57e6e57f28eefb725e0b625618d1b59bf9d1e0 \ - --hash=sha256:a494554874691720ba5891c9b0b39474ba43ffb1aaf32a5dac874effb1619e1a \ - --hash=sha256:a8ef6e342c137888ebbfb233e02b8fbd689bb5b5fcc59b34711ac47ebd504478 \ - --hash=sha256:ae497b11f4c21558d95de9f64fff7053544f4d1a17731c866143ed6bb4591238 \ - --hash=sha256:b1ce7f41670c5a69e1389420436f41385b1aa2504c3b0c30620764b15dded2e7 \ - --hash=sha256:b8f93dcddb243159c9e4109c9750ba5b335ab8d48d9522c5308cd05d7e3ce600 \ - --hash=sha256:ba0c325c3f485dc54ec298d8b024e134acf07c10d494ffa24373bea729acf704 \ - --hash=sha256:bb29aaa613c0a1c40d1af111abf025f1732cab333f96f285d6a93b934738a68a \ - --hash=sha256:bba1be28247e68994355e028dcd668316db30c1f758d3241a7b903ac78dcd285 \ - --hash=sha256:cb643284ab0ed26f6957d969fe0dd8bb17beb567beb8998140b5e38a90974f6c \ - --hash=sha256:d182dac0221eb8faef2e6f44701812b467c02674a322c739355c39e94730cdbf \ - --hash=sha256:d275a9e3c81b1093c060c3837e580c37f47c51eca031f7b5fb76f7b8470f5f9b \ - --hash=sha256:d8b55ea20dc59b181d3f47103f113e6f28a5e1c89fd5b67b9140edb442ab67f2 \ - --hash=sha256:da8f41e602574ece93dbbda1fab24650d6bf2a24089f9e9dbb4f5730ec1e58ad \ - --hash=sha256:e4141c5a32b5e37905b5940aacbc59739f036930367d7acce7a64e4dec1f5e0b \ - --hash=sha256:f5be6b6bc52fad84d010cb45433720327ce886009d862f46b26d4d154001994b \ - --hash=sha256:f6d58656842e1b2ddbe07f43f56b10a60f2ba5826164910968f5933e5178af75 -nodeenv==1.9.1 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ - --hash=sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f \ - --hash=sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 -packaging==25.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ +nodeenv==1.10.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827 \ + --hash=sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb +packaging==25.0 ; python_version >= "3.10" and python_version < "4.0" \ --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f -pbs-installer[download,install]==2025.8.27 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:145ed15f222af5157f5d4512a75041bc3c32784d4939d678231d41b15c0f16be \ - --hash=sha256:606430ca10940f9600a1a7f20b2a4a0ea62d8e327dcaf8a7b9acf2a2a6a39cb4 -pkginfo==1.12.1.2 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:5cd957824ac36f140260964eba3c6be6442a8359b8c48f4adf90210f33a04b7b \ - --hash=sha256:c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343 -platformdirs==4.4.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85 \ - --hash=sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf -pluggy==1.6.0 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ +platformdirs==4.5.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda \ + --hash=sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31 +pluggy==1.6.0 ; python_version >= "3.10" and python_version < "4.0" \ --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 -poetry-core==2.1.3 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:0522a015477ed622c89aad56a477a57813cace0c8e7ff2a2906b7ef4a2e296a4 \ - --hash=sha256:2c704f05016698a54ca1d327f46ce2426d72eaca6ff614132c8477c292266771 -poetry-plugin-export==1.9.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:6fc8755cfac93c74752f85510b171983e2e47d782d4ab5be4ffc4f6945be7967 \ - --hash=sha256:e2621dd8c260dd705a8227f076075246a7ff5c697e18ddb90ff68081f47ee642 -poetry==2.1.4 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:0019b64d33fed9184a332f7fad60ca47aace4d6a0e9c635cdea21b76e96f32ce \ - --hash=sha256:bed4af5fc87fb145258ac5b1dae77de2cd7082ec494e3b2f66bca0f477cbfc5c -pre-commit==4.3.0 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ - --hash=sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8 \ - --hash=sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16 -pycodestyle==2.14.0 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ +pre-commit==4.5.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77 \ + --hash=sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61 +pycodestyle==2.14.0 ; python_version >= "3.10" and python_version < "4.0" \ --hash=sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783 \ --hash=sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d -pycparser==2.22 ; python_full_version >= "3.9.2" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") and (sys_platform == "darwin" or platform_python_implementation != "PyPy") \ - --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ - --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc -pyflakes==3.4.0 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ +pyflakes==3.4.0 ; python_version >= "3.10" and python_version < "4.0" \ --hash=sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58 \ --hash=sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f -pygments==2.19.2 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ +pygments==2.19.2 ; python_version >= "3.10" and python_version < "4.0" \ --hash=sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887 \ --hash=sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b -pyproject-hooks==1.2.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8 \ - --hash=sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913 -pytest==8.4.1 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ - --hash=sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7 \ - --hash=sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c -pywin32-ctypes==0.2.3 ; python_full_version >= "3.9.2" and python_version < "4.0" and sys_platform == "win32" \ - --hash=sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8 \ - --hash=sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755 -pyyaml==6.0.2 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ - --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \ - --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \ - --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \ - --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \ - --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \ - --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \ - --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \ - --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \ - --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \ - --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \ - --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \ - --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \ - --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \ - --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \ - --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \ - --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \ - --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \ - --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \ - --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \ - --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \ - --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \ - --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \ - --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \ - --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \ - --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \ - --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \ - --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \ - --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \ - --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \ - --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \ - --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \ - --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \ - --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \ - --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \ - --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \ - --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \ - --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \ - --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \ - --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \ - --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \ - --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \ - --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \ - --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \ - --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \ - --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \ - --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \ - --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \ - --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \ - --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \ - --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \ - --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \ - --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \ - --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4 -rapidfuzz==3.13.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:09e908064d3684c541d312bd4c7b05acb99a2c764f6231bd507d4b4b65226c23 \ - --hash=sha256:0da54aa8547b3c2c188db3d1c7eb4d1bb6dd80baa8cdaeaec3d1da3346ec9caa \ - --hash=sha256:0e1d08cb884805a543f2de1f6744069495ef527e279e05370dd7c83416af83f8 \ - --hash=sha256:0fd05336db4d0b8348d7eaaf6fa3c517b11a56abaa5e89470ce1714e73e4aca7 \ - --hash=sha256:11b125d8edd67e767b2295eac6eb9afe0b1cdc82ea3d4b9257da4b8e06077798 \ - --hash=sha256:11b47b40650e06147dee5e51a9c9ad73bb7b86968b6f7d30e503b9f8dd1292db \ - --hash=sha256:1343d745fbf4688e412d8f398c6e6d6f269db99a54456873f232ba2e7aeb4939 \ - --hash=sha256:1a79a2f07786a2070669b4b8e45bd96a01c788e7a3c218f531f3947878e0f956 \ - --hash=sha256:1ba007f4d35a45ee68656b2eb83b8715e11d0f90e5b9f02d615a8a321ff00c27 \ - --hash=sha256:1dc82b6ed01acb536b94a43996a94471a218f4d89f3fdd9185ab496de4b2a981 \ - --hash=sha256:1f219f1e3c3194d7a7de222f54450ce12bc907862ff9a8962d83061c1f923c86 \ - --hash=sha256:200030dfc0a1d5d6ac18e993c5097c870c97c41574e67f227300a1fb74457b1d \ - --hash=sha256:202a87760f5145140d56153b193a797ae9338f7939eb16652dd7ff96f8faf64c \ - --hash=sha256:25343ccc589a4579fbde832e6a1e27258bfdd7f2eb0f28cb836d6694ab8591fc \ - --hash=sha256:2d18228a2390375cf45726ce1af9d36ff3dc1f11dce9775eae1f1b13ac6ec50f \ - --hash=sha256:2fd0975e015b05c79a97f38883a11236f5a24cca83aa992bd2558ceaa5652b26 \ - --hash=sha256:30fd1451f87ccb6c2f9d18f6caa483116bbb57b5a55d04d3ddbd7b86f5b14998 \ - --hash=sha256:3abe6a4e8eb4cfc4cda04dd650a2dc6d2934cbdeda5def7e6fd1c20f6e7d2a0b \ - --hash=sha256:3b6f913ee4618ddb6d6f3e387b76e8ec2fc5efee313a128809fbd44e65c2bbb2 \ - --hash=sha256:3f32f15bacd1838c929b35c84b43618481e1b3d7a61b5ed2db0291b70ae88b53 \ - --hash=sha256:435071fd07a085ecbf4d28702a66fd2e676a03369ee497cc38bcb69a46bc77e2 \ - --hash=sha256:45dd4628dd9c21acc5c97627dad0bb791764feea81436fb6e0a06eef4c6dceaa \ - --hash=sha256:461fd13250a2adf8e90ca9a0e1e166515cbcaa5e9c3b1f37545cbbeff9e77f6b \ - --hash=sha256:4671ee300d1818d7bdfd8fa0608580d7778ba701817216f0c17fb29e6b972514 \ - --hash=sha256:48719f7dcf62dfb181063b60ee2d0a39d327fa8ad81b05e3e510680c44e1c078 \ - --hash=sha256:4a1a6a906ba62f2556372282b1ef37b26bca67e3d2ea957277cfcefc6275cca7 \ - --hash=sha256:4d9d7f84c8e992a8dbe5a3fdbea73d733da39bf464e62c912ac3ceba9c0cff93 \ - --hash=sha256:5158da7f2ec02a930be13bac53bb5903527c073c90ee37804090614cab83c29e \ - --hash=sha256:5280be8fd7e2bee5822e254fe0a5763aa0ad57054b85a32a3d9970e9b09bbcbf \ - --hash=sha256:5435fcac94c9ecf0504bf88a8a60c55482c32e18e108d6079a0089c47f3f8cf6 \ - --hash=sha256:558bf526bcd777de32b7885790a95a9548ffdcce68f704a81207be4a286c1095 \ - --hash=sha256:573ad267eb9b3f6e9b04febce5de55d8538a87c56c64bf8fd2599a48dc9d8b77 \ - --hash=sha256:57c390336cb50d5d3bfb0cfe1467478a15733703af61f6dffb14b1cd312a6fae \ - --hash=sha256:5d4e13593d298c50c4f94ce453f757b4b398af3fa0fd2fde693c3e51195b7f69 \ - --hash=sha256:5dc71ef23845bb6b62d194c39a97bb30ff171389c9812d83030c1199f319098c \ - --hash=sha256:624a108122039af89ddda1a2b7ab2a11abe60c1521956f142f5d11bcd42ef138 \ - --hash=sha256:65cc97c2fc2c2fe23586599686f3b1ceeedeca8e598cfcc1b7e56dc8ca7e2aa7 \ - --hash=sha256:694eb531889f71022b2be86f625a4209c4049e74be9ca836919b9e395d5e33b3 \ - --hash=sha256:6af42f2ede8b596a6aaf6d49fdee3066ca578f4856b85ab5c1e2145de367a12d \ - --hash=sha256:6c0efa73afbc5b265aca0d8a467ae2a3f40d6854cbe1481cb442a62b7bf23c99 \ - --hash=sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e \ - --hash=sha256:7ac21489de962a4e2fc1e8f0b0da4aa1adc6ab9512fd845563fecb4b4c52093a \ - --hash=sha256:7d7cec4242d30dd521ef91c0df872e14449d1dffc2a6990ede33943b0dae56c3 \ - --hash=sha256:85c9a131a44a95f9cac2eb6e65531db014e09d89c4f18c7b1fa54979cb9ff1f3 \ - --hash=sha256:8c99b76b93f7b495eee7dcb0d6a38fb3ce91e72e99d9f78faa5664a881cb2b7d \ - --hash=sha256:9093cdeb926deb32a4887ebe6910f57fbcdbc9fbfa52252c10b56ef2efb0289f \ - --hash=sha256:9256218ac8f1a957806ec2fb9a6ddfc6c32ea937c0429e88cf16362a20ed8602 \ - --hash=sha256:9327a4577f65fc3fb712e79f78233815b8a1c94433d0c2c9f6bc5953018b3565 \ - --hash=sha256:93a755266856599be4ab6346273f192acde3102d7aa0735e2f48b456397a041f \ - --hash=sha256:98b8107ff14f5af0243f27d236bcc6e1ef8e7e3b3c25df114e91e3a99572da73 \ - --hash=sha256:98e0bfa602e1942d542de077baf15d658bd9d5dcfe9b762aff791724c1c38b70 \ - --hash=sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264 \ - --hash=sha256:9f338e71c45b69a482de8b11bf4a029993230760120c8c6e7c9b71760b6825a1 \ - --hash=sha256:9f5fe634c9482ec5d4a6692afb8c45d370ae86755e5f57aa6c50bfe4ca2bdd87 \ - --hash=sha256:a50856f49a4016ef56edd10caabdaf3608993f9faf1e05c3c7f4beeac46bd12a \ - --hash=sha256:a6dd36d4916cf57ddb05286ed40b09d034ca5d4bca85c17be0cb6a21290597d9 \ - --hash=sha256:a9ad1f37894e3ffb76bbab76256e8a8b789657183870be11aa64e306bb5228fd \ - --hash=sha256:aafc42a1dc5e1beeba52cd83baa41372228d6d8266f6d803c16dbabbcc156255 \ - --hash=sha256:adb40ca8ddfcd4edd07b0713a860be32bdf632687f656963bcbce84cea04b8d8 \ - --hash=sha256:ae4574cb66cf1e85d32bb7e9ec45af5409c5b3970b7ceb8dea90168024127566 \ - --hash=sha256:b1b065f370d54551dcc785c6f9eeb5bd517ae14c983d2784c064b3aa525896df \ - --hash=sha256:b5104b62711565e0ff6deab2a8f5dbf1fbe333c5155abe26d2cfd6f1849b6c87 \ - --hash=sha256:b7b3eda607a019169f7187328a8d1648fb9a90265087f6903d7ee3a8eee01805 \ - --hash=sha256:b7f4c65facdb94f44be759bbd9b6dda1fa54d0d6169cdf1a209a5ab97d311a75 \ - --hash=sha256:b836f486dba0aceb2551e838ff3f514a38ee72b015364f739e526d720fdb823a \ - --hash=sha256:bef86df6d59667d9655905b02770a0c776d2853971c0773767d5ef8077acd624 \ - --hash=sha256:c2b3dd5d206a12deca16870acc0d6e5036abeb70e3cad6549c294eff15591527 \ - --hash=sha256:c33f9c841630b2bb7e69a3fb5c84a854075bb812c47620978bddc591f764da3d \ - --hash=sha256:c523620d14ebd03a8d473c89e05fa1ae152821920c3ff78b839218ff69e19ca3 \ - --hash=sha256:cc269e74cad6043cb8a46d0ce580031ab642b5930562c2bb79aa7fbf9c858d26 \ - --hash=sha256:cc64da907114d7a18b5e589057e3acaf2fec723d31c49e13fedf043592a3f6a7 \ - --hash=sha256:ccbd0e7ea1a216315f63ffdc7cd09c55f57851afc8fe59a74184cb7316c0598b \ - --hash=sha256:cdb33ee9f8a8e4742c6b268fa6bd739024f34651a06b26913381b1413ebe7590 \ - --hash=sha256:cfcccc08f671646ccb1e413c773bb92e7bba789e3a1796fd49d23c12539fe2e4 \ - --hash=sha256:d21f188f6fe4fbf422e647ae9d5a68671d00218e187f91859c963d0738ccd88c \ - --hash=sha256:d25fdbce6459ccbbbf23b4b044f56fbd1158b97ac50994eaae2a1c0baae78301 \ - --hash=sha256:d2eaf3839e52cbcc0accbe9817a67b4b0fcf70aaeb229cfddc1c28061f9ce5d8 \ - --hash=sha256:d395a5cad0c09c7f096433e5fd4224d83b53298d53499945a9b0e5a971a84f3a \ - --hash=sha256:d7a217310429b43be95b3b8ad7f8fc41aba341109dc91e978cd7c703f928c58f \ - --hash=sha256:d8cf5f7cd6e4d5eb272baf6a54e182b2c237548d048e2882258336533f3f02b7 \ - --hash=sha256:df8e8c21e67afb9d7fbe18f42c6111fe155e801ab103c81109a61312927cc611 \ - --hash=sha256:e05752418b24bbd411841b256344c26f57da1148c5509e34ea39c7eb5099ab72 \ - --hash=sha256:e1bdd2e6d0c5f9706ef7595773a81ca2b40f3b33fd7f9840b726fb00c6c4eb2e \ - --hash=sha256:e297c09972698c95649e89121e3550cee761ca3640cd005e24aaa2619175464e \ - --hash=sha256:e62779c6371bd2b21dbd1fdce89eaec2d93fd98179d36f61130b489f62294a92 \ - --hash=sha256:e8ddb58961401da7d6f55f185512c0d6bd24f529a637078d41dd8ffa5a49c107 \ - --hash=sha256:e9d824de871daa6e443b39ff495a884931970d567eb0dfa213d234337343835f \ - --hash=sha256:ed6f416bda1c9133000009d84d9409823eb2358df0950231cc936e4bf784eb97 \ - --hash=sha256:ef0f5f03f61b0e5a57b1df7beafd83df993fd5811a09871bad6038d08e526d0d \ - --hash=sha256:f4797f821dc5d7c2b6fc818b89f8a3f37bcc900dd9e4369e6ebf1e525efce5db \ - --hash=sha256:f70f646751b6aa9d05be1fb40372f006cc89d6aad54e9d79ae97bd1f5fce5203 \ - --hash=sha256:fd742c03885db1fce798a1cd87a20f47f144ccf26d75d52feb6f2bae3d57af05 \ - --hash=sha256:fe5790a36d33a5d0a6a1f802aa42ecae282bf29ac6f7506d8e12510847b82a45 \ - --hash=sha256:fedd316c165beed6307bf754dee54d3faca2c47e1f3bcbd67595001dfa11e969 -requests-toolbelt==1.0.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \ - --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 -requests==2.32.5 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6 \ - --hash=sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf -respx==0.22.0 ; python_full_version >= "3.9.2" and python_full_version < "4.0.0" \ +pytest-xdist==3.8.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88 \ + --hash=sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1 +pytest==9.0.2 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b \ + --hash=sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11 +pyyaml==6.0.3 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \ + --hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \ + --hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956 \ + --hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \ + --hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c \ + --hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \ + --hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a \ + --hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0 \ + --hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b \ + --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ + --hash=sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 \ + --hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7 \ + --hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e \ + --hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007 \ + --hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \ + --hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \ + --hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9 \ + --hash=sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295 \ + --hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \ + --hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0 \ + --hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e \ + --hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \ + --hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \ + --hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \ + --hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \ + --hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \ + --hash=sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b \ + --hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69 \ + --hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5 \ + --hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b \ + --hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \ + --hash=sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369 \ + --hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd \ + --hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \ + --hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198 \ + --hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \ + --hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \ + --hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \ + --hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \ + --hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 \ + --hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b \ + --hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \ + --hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \ + --hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \ + --hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \ + --hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \ + --hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \ + --hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5 \ + --hash=sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4 \ + --hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b \ + --hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf \ + --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ + --hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \ + --hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8 \ + --hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \ + --hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da \ + --hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \ + --hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \ + --hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c \ + --hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \ + --hash=sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f \ + --hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917 \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ + --hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \ + --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \ + --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \ + --hash=sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3 \ + --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \ + --hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \ + --hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 +respx==0.22.0 ; python_version >= "3.10" and python_version < "4.0" \ --hash=sha256:3c8924caa2a50bd71aefc07aa812f2466ff489f1848c96e954a5362d17095d91 \ --hash=sha256:631128d4c9aba15e56903fb5f66fb1eff412ce28dd387ca3a81339e52dbd3ad0 -secretstorage==3.3.3 ; python_full_version >= "3.9.2" and python_version < "4.0" and sys_platform == "linux" \ - --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ - --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 -shellingham==1.5.4 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686 \ - --hash=sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de -sniffio==1.3.1 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \ - --hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc -tomli==2.2.1 ; python_full_version >= "3.9.2" and python_version < "3.11" \ - --hash=sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6 \ - --hash=sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd \ - --hash=sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c \ - --hash=sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b \ - --hash=sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8 \ - --hash=sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6 \ - --hash=sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77 \ - --hash=sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff \ - --hash=sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea \ - --hash=sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192 \ - --hash=sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249 \ - --hash=sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee \ - --hash=sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4 \ - --hash=sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98 \ - --hash=sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8 \ - --hash=sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4 \ - --hash=sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281 \ - --hash=sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744 \ - --hash=sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69 \ - --hash=sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13 \ - --hash=sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140 \ - --hash=sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e \ - --hash=sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e \ - --hash=sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc \ - --hash=sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff \ - --hash=sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec \ - --hash=sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2 \ - --hash=sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222 \ - --hash=sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106 \ - --hash=sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272 \ - --hash=sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a \ - --hash=sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7 -tomlkit==0.13.3 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1 \ - --hash=sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0 -trove-classifiers==2025.8.26.11 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:887fb0a402bdbecd4415a52c06e6728f8bdaa506a7143372d2b893e2c5e2d859 \ - --hash=sha256:e73efff317c492a7990092f9c12676c705bf6cfe40a258a93f63f4b4c9941432 -typing-extensions==4.15.0 ; python_full_version >= "3.9.2" and python_version < "3.13" \ +tomli==2.4.0 ; python_version == "3.10" \ + --hash=sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729 \ + --hash=sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b \ + --hash=sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d \ + --hash=sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df \ + --hash=sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576 \ + --hash=sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d \ + --hash=sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1 \ + --hash=sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a \ + --hash=sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e \ + --hash=sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc \ + --hash=sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702 \ + --hash=sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6 \ + --hash=sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd \ + --hash=sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4 \ + --hash=sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776 \ + --hash=sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a \ + --hash=sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66 \ + --hash=sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87 \ + --hash=sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2 \ + --hash=sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f \ + --hash=sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475 \ + --hash=sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f \ + --hash=sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95 \ + --hash=sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9 \ + --hash=sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3 \ + --hash=sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9 \ + --hash=sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76 \ + --hash=sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da \ + --hash=sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8 \ + --hash=sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51 \ + --hash=sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86 \ + --hash=sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8 \ + --hash=sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0 \ + --hash=sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b \ + --hash=sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1 \ + --hash=sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e \ + --hash=sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d \ + --hash=sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c \ + --hash=sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867 \ + --hash=sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a \ + --hash=sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c \ + --hash=sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0 \ + --hash=sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4 \ + --hash=sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614 \ + --hash=sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132 \ + --hash=sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa \ + --hash=sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087 +typing-extensions==4.15.0 ; python_version >= "3.10" and python_version < "3.13" \ --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 -urllib3==2.5.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760 \ - --hash=sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc -virtualenv==20.32.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:2c310aecb62e5aa1b06103ed7c2977b81e042695de2697d01017ff0f1034af56 \ - --hash=sha256:886bf75cadfdc964674e6e33eb74d787dff31ca314ceace03ca5810620f4ecf0 -xattr==1.2.0 ; python_full_version >= "3.9.2" and python_version < "4.0" and sys_platform == "darwin" \ - --hash=sha256:00c26c14c90058338993bb2d3e1cebf562e94ec516cafba64a8f34f74b9d18b4 \ - --hash=sha256:017aac8005e1e84d5efa4b86c0896c6eb96f2331732d388600a5b999166fec1c \ - --hash=sha256:02fa813db054bbb7a61c570ae025bd01c36fc20727b40f49031feb930234bc72 \ - --hash=sha256:034f075fc5a9391a1597a6c9a21cb57b688680f0f18ecf73b2efc22b8d330cff \ - --hash=sha256:093c75f7d9190be355b8e86da3f460b9bfe3d6a176f92852d44dcc3289aa10dc \ - --hash=sha256:0b199ba31078f3e4181578595cd60400ee055b4399672169ceee846d33ff26de \ - --hash=sha256:109b11fb3f73a0d4e199962f11230ab5f462e85a8021874f96c1732aa61148d5 \ - --hash=sha256:12183d5eb104d4da787638c7dadf63b718472d92fec6dbe12994ea5d094d7863 \ - --hash=sha256:14edd5d47d0bb92b23222c0bb6379abbddab01fb776b2170758e666035ecf3aa \ - --hash=sha256:15e754e854bdaac366ad3f1c8fbf77f6668e8858266b4246e8c5f487eeaf1179 \ - --hash=sha256:165de92b0f2adafb336f936931d044619b9840e35ba01079f4dd288747b73714 \ - --hash=sha256:1e4b93f2e74793b61c0a7b7bdef4a3813930df9c01eda72fad706b8db7658bc2 \ - --hash=sha256:1f7e7067e1a400ad4485536a9e84c3330373086b2324fafa26d07527eeb4b175 \ - --hash=sha256:200bb3cdba057cb721b727607bc340a74c28274f4a628a26011f574860f5846b \ - --hash=sha256:212156aa5fb987a53211606bc09e6fea3eda3855af9f2940e40df5a2a592425a \ - --hash=sha256:2520516c1d058895eae00b2b2f10833514caea6dc6802eef1e431c474b5317ad \ - --hash=sha256:26d306bfb3b5641726f2ee0da6f63a2656aa7fdcfd15de61c476e3ca6bc3277e \ - --hash=sha256:2827e23d7a1a20f31162c47ab4bd341a31e83421121978c4ab2aad5cd79ea82b \ - --hash=sha256:29ae44247d46e63671311bf7e700826a97921278e2c0c04c2d11741888db41b8 \ - --hash=sha256:29d06abbef4024b7469fcd0d4ade6d2290582350a4df95fcc48fa48b2e83246b \ - --hash=sha256:2a9de621eadf0466c391363bd6ed903b1a1bcd272422b5183fd06ef79d05347b \ - --hash=sha256:2b2e9c87dc643b09d86befad218e921f6e65b59a4668d6262b85308de5dbd1dd \ - --hash=sha256:2d27a64f695440450c119ae4bc8f54b0b726a812ebea1666fff3873236936f36 \ - --hash=sha256:2d39d7b36842c67ab3040bead7eb6d601e35fa0d6214ed20a43df4ec30b6f9f9 \ - --hash=sha256:2ee3901db48de913dcef004c5d7b477a1f4aadff997445ef62907b10fdad57de \ - --hash=sha256:2fbae24ab22afe078d549645501ecacaa17229e0b7769c8418fad69b51ad37c9 \ - --hash=sha256:320ef856bb817f4c40213b6de956dc440d0f23cdc62da3ea02239eb5147093f8 \ - --hash=sha256:363724f33510d2e7c7e080b389271a1241cb4929a1d9294f89721152b4410972 \ - --hash=sha256:376631e2383918fbc3dc9bcaeb9a533e319322d2cff1c119635849edf74e1126 \ - --hash=sha256:38de598c47b85185e745986a061094d2e706e9c2d9022210d2c738066990fe91 \ - --hash=sha256:3df4d8d91e2996c3c72a390ec82e8544acdcb6c7df67b954f1736ff37ea4293e \ - --hash=sha256:545e0ad3f706724029efd23dec58fb358422ae68ab4b560b712aedeaf40446a0 \ - --hash=sha256:549f8fbda5da48cafc81ba6ab7bb8e8e14c4b0748c37963dc504bcae505474b7 \ - --hash=sha256:5594fcbc38fdbb3af16a8ad18c37c81c8814955f0d636be857a67850cd556490 \ - --hash=sha256:629c42c1dd813442d90f281f69b88ef0c9625f604989bef8411428671f70f43e \ - --hash=sha256:68fbdffebe8c398a82c84ecf5e6f6a3adde9364f891cba066e58352af404a45c \ - --hash=sha256:79f7823b30ed557e0e7ffd9a6b1a821a22f485f5347e54b8d24c4a34b7545ba4 \ - --hash=sha256:7c7c12968ce0bf798d8ba90194cef65de768bee9f51a684e022c74cab4218305 \ - --hash=sha256:7dc4fa9448a513077c5ccd1ce428ff0682cdddfc71301dbbe4ee385c74517f73 \ - --hash=sha256:82191c006ae4c609b22b9aea5f38f68fff022dc6884c4c0e1dba329effd4b288 \ - --hash=sha256:83d87cfe19cd606fc0709d45a4d6efc276900797deced99e239566926a5afedf \ - --hash=sha256:8904d3539afe1a84fc0b7f02fa91da60d2505adf2d5951dc855bf9e75fe322b2 \ - --hash=sha256:8eee258f5774933cb972cff5c3388166374e678980d2a1f417d7d6f61d9ae172 \ - --hash=sha256:90c3ad4a9205cceb64ec54616aa90aa42d140c8ae3b9710a0aaa2843a6f1aca7 \ - --hash=sha256:97db00596865845efb72f3d565a1f82b01006c5bf5a87d8854a6afac43502593 \ - --hash=sha256:9a18ee82d8ba2c17f1e8414bfeb421fa763e0fb4acbc1e124988ca1584ad32d5 \ - --hash=sha256:9b0b27c889cc9ff0dba62ac8a2eef98f4911c1621e4e8c409d5beb224c4c227c \ - --hash=sha256:a161160211081d765ac41fa056f4f9b1051f027f08188730fbc9782d0dce623e \ - --hash=sha256:a542acf6c4e8221664b51b35e0160c44bd0ed1f2fd80019476f7698f4911e560 \ - --hash=sha256:a64c8e21eff1be143accf80fd3b8fde3e28a478c37da298742af647ac3e5e0a7 \ - --hash=sha256:aa83e677b5f92a3c5c86eaf875e9d3abbc43887ff1767178def865fa9f12a3a0 \ - --hash=sha256:b19472dc38150ac09a478c71092738d86882bc9ff687a4a8f7d1a25abce20b5e \ - --hash=sha256:b4f43dc644db87d5eb9484a9518c34a864cb2e588db34cffc42139bf55302a1c \ - --hash=sha256:b837898a5225c7f7df731783cd78bae2ed81b84bacf020821f1cd2ab2d74de58 \ - --hash=sha256:bb669f01627962ce2bc556f19d421162247bc2cad0d4625d6ea5eb32af4cf29b \ - --hash=sha256:bc714f236f17c57c510ae9ada9962d8e4efc9f9ea91504e2c6a09008f3918ddf \ - --hash=sha256:c229e245c6c9a85d2fd7d07531498f837dd34670e556b552f73350f11edf000c \ - --hash=sha256:c385ea93a18aeb6443a719eb6a6b1d7f7b143a4d1f2b08bc4fadfc429209e629 \ - --hash=sha256:c67dabd9ddc04ead63fbc85aed459c9afcc24abfc5bb3217fff7ec9a466faacb \ - --hash=sha256:c67e70d5d8136d328ad13f85b887ffa97690422f1a11fb29ab2f702cf66e825a \ - --hash=sha256:c7602583fc643ca76576498e2319c7cef0b72aef1936701678589da6371b731b \ - --hash=sha256:c9ee84de7cd4a6d61b0b79e2f58a6bdb13b03dbad948489ebb0b73a95caee7ae \ - --hash=sha256:cedc281811e424ecf6a14208532f7ac646866f91f88e8eadd00d8fe535e505fd \ - --hash=sha256:cf60577caa248f539e4e646090b10d6ad1f54189de9a7f1854c23fdef28f574e \ - --hash=sha256:d37989dabf25ff18773e4aaeebcb65604b9528f8645f43e02bebaa363e3ae958 \ - --hash=sha256:daff0c1f5c5e4eaf758c56259c4f72631fa9619875e7a25554b6077dc73da964 \ - --hash=sha256:dddd5f6d0bb95b099d6a3888c248bf246525647ccb8cf9e8f0fc3952e012d6fb \ - --hash=sha256:ea7cf8afd717853ad78eba8ca83ff66a53484ba2bb2a4283462bc5c767518174 \ - --hash=sha256:f5eec248976bbfa6c23df25d4995413df57dccf4161f6cbae36f643e99dbc397 \ - --hash=sha256:fafecfdedf7e8d455443bec2c3edab8a93d64672619cd1a4ee043a806152e19c -zipp==3.23.0 ; python_full_version >= "3.9.2" and python_version < "3.12" \ - --hash=sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e \ - --hash=sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166 -zstandard==0.24.0 ; python_full_version >= "3.9.2" and python_version < "4.0" \ - --hash=sha256:0101f835da7de08375f380192ff75135527e46e3f79bef224e3c49cb640fef6a \ - --hash=sha256:010302face38c9a909b8934e3bf6038266d6afc69523f3efa023c5cb5d38271b \ - --hash=sha256:05d27c953f2e0a3ecc8edbe91d6827736acc4c04d0479672e0400ccdb23d818c \ - --hash=sha256:09887301001e7a81a3618156bc1759e48588de24bddfdd5b7a4364da9a8fbc20 \ - --hash=sha256:0a416814608610abf5488889c74e43ffa0343ca6cf43957c6b6ec526212422da \ - --hash=sha256:0a9e95ceb180ccd12a8b3437bac7e8a8a089c9094e39522900a8917745542184 \ - --hash=sha256:0c9c3cba57f5792532a3df3f895980d47d78eda94b0e5b800651b53e96e0b604 \ - --hash=sha256:0d66da2649bb0af4471699aeb7a83d6f59ae30236fb9f6b5d20fb618ef6c6777 \ - --hash=sha256:0dc5654586613aebe5405c1ba180e67b3f29e7d98cf3187c79efdcc172f39457 \ - --hash=sha256:0ed8345b504df1cab280af923ef69ec0d7d52f7b22f78ec7982fde7c33a43c4f \ - --hash=sha256:0f6d9a146e07458cb41423ca2d783aefe3a3a97fe72838973c13b8f1ecc7343a \ - --hash=sha256:10e284748a7e7fbe2815ca62a9d6e84497d34cfdd0143fa9e8e208efa808d7c4 \ - --hash=sha256:13fc548e214df08d896ee5f29e1f91ee35db14f733fef8eabea8dca6e451d1e2 \ - --hash=sha256:1b14bc92af065d0534856bf1b30fc48753163ea673da98857ea4932be62079b1 \ - --hash=sha256:1bda8a85e5b9d5e73af2e61b23609a8cc1598c1b3b2473969912979205a1ff25 \ - --hash=sha256:1e133a9dd51ac0bcd5fd547ba7da45a58346dbc63def883f999857b0d0c003c4 \ - --hash=sha256:1f578fab202f4df67a955145c3e3ca60ccaaaf66c97808545b2625efeecdef10 \ - --hash=sha256:27b6fa72b57824a3f7901fc9cc4ce1c1c834b28f3a43d1d4254c64c8f11149d4 \ - --hash=sha256:2825a3951f945fb2613ded0f517d402b1e5a68e87e0ee65f5bd224a8333a9a46 \ - --hash=sha256:2fc67eb15ed573950bc6436a04b3faea6c36c7db98d2db030d48391c6736a0dc \ - --hash=sha256:337572a7340e1d92fd7fb5248c8300d0e91071002d92e0b8cabe8d9ae7b58159 \ - --hash=sha256:35f13501a8accf834457d8e40e744568287a215818778bc4d79337af2f3f0d97 \ - --hash=sha256:388aad2d693707f4a0f6cc687eb457b33303d6b57ecf212c8ff4468c34426892 \ - --hash=sha256:3aa3b4344b206941385a425ea25e6dd63e5cb0f535a4b88d56e3f8902086be9e \ - --hash=sha256:3adb4b5414febf074800d264ddf69ecade8c658837a83a19e8ab820e924c9933 \ - --hash=sha256:3b95fc06489aa9388400d1aab01a83652bc040c9c087bd732eb214909d7fb0dd \ - --hash=sha256:3f2fe35ec84908dddf0fbf66b35d7c2878dbe349552dd52e005c755d3493d61c \ - --hash=sha256:3f96a9130171e01dbb6c3d4d9925d604e2131a97f540e223b88ba45daf56d6fb \ - --hash=sha256:444633b487a711e34f4bccc46a0c5dfbe1aee82c1a511e58cdc16f6bd66f187c \ - --hash=sha256:498f88f5109666c19531f0243a90d2fdd2252839cd6c8cc6e9213a3446670fa8 \ - --hash=sha256:51a86bd963de3f36688553926a84e550d45d7f9745bd1947d79472eca27fcc75 \ - --hash=sha256:52788e7c489069e317fde641de41b757fa0ddc150e06488f153dd5daebac7192 \ - --hash=sha256:52cd7d9fa0a115c9446abb79b06a47171b7d916c35c10e0c3aa6f01d57561382 \ - --hash=sha256:55872e818598319f065e8192ebefecd6ac05f62a43f055ed71884b0a26218f41 \ - --hash=sha256:561123d05681197c0e24eb8ab3cfdaf299e2b59c293d19dad96e1610ccd8fbc6 \ - --hash=sha256:57be3abb4313e0dd625596376bbb607f40059d801d51c1a1da94d7477e63b255 \ - --hash=sha256:5e941654cef13a1d53634ec30933722eda11f44f99e1d0bc62bbce3387580d50 \ - --hash=sha256:622e1e04bd8a085994e02313ba06fbcf4f9ed9a488c6a77a8dbc0692abab6a38 \ - --hash=sha256:6324fde5cf5120fbf6541d5ff3c86011ec056e8d0f915d8e7822926a5377193a \ - --hash=sha256:6374feaf347e6b83ec13cc5dcfa70076f06d8f7ecd46cc71d58fac798ff08b76 \ - --hash=sha256:63d39b161000aeeaa06a1cb77c9806e939bfe460dfd593e4cbf24e6bc717ae94 \ - --hash=sha256:656ed895b28c7e42dd5b40dfcea3217cfc166b6b7eef88c3da2f5fc62484035b \ - --hash=sha256:663848a8bac4fdbba27feea2926049fdf7b55ec545d5b9aea096ef21e7f0b079 \ - --hash=sha256:6885ae4b33aee8835dbdb4249d3dfec09af55e705d74d9b660bfb9da51baaa8b \ - --hash=sha256:6b005bcee4be9c3984b355336283afe77b2defa76ed6b89332eced7b6fa68b68 \ - --hash=sha256:76cdfe7f920738ea871f035568f82bad3328cbc8d98f1f6988264096b5264efd \ - --hash=sha256:77b8b7b98893eaf47da03d262816f01f251c2aa059c063ed8a45c50eada123a5 \ - --hash=sha256:7ac6e4d727521d86d20ec291a3f4e64a478e8a73eaee80af8f38ec403e77a409 \ - --hash=sha256:7de5869e616d426b56809be7dc6dba4d37b95b90411ccd3de47f421a42d4d42c \ - --hash=sha256:869bf13f66b124b13be37dd6e08e4b728948ff9735308694e0b0479119e08ea7 \ - --hash=sha256:87ae1684bc3c02d5c35884b3726525eda85307073dbefe68c3c779e104a59036 \ - --hash=sha256:8ecd3b1f7a601f79e0cd20c26057d770219c0dc2f572ea07390248da2def79a4 \ - --hash=sha256:92be52ca4e6e604f03d5daa079caec9e04ab4cbf6972b995aaebb877d3d24e13 \ - --hash=sha256:92ea7855d5bcfb386c34557516c73753435fb2d4a014e2c9343b5f5ba148b5d8 \ - --hash=sha256:962ea3aecedcc944f8034812e23d7200d52c6e32765b8da396eeb8b8ffca71ce \ - --hash=sha256:98ca91dc9602cf351497d5600aa66e6d011a38c085a8237b370433fcb53e3409 \ - --hash=sha256:9b84c6c210684286e504022d11ec294d2b7922d66c823e87575d8b23eba7c81f \ - --hash=sha256:a0f6fc2ea6e07e20df48752e7700e02e1892c61f9a6bfbacaf2c5b24d5ad504b \ - --hash=sha256:a2bda8f2790add22773ee7a4e43c90ea05598bffc94c21c40ae0a9000b0133c3 \ - --hash=sha256:aa705beb74ab116563f4ce784fa94771f230c05d09ab5de9c397793e725bb1db \ - --hash=sha256:aadf32c389bb7f02b8ec5c243c38302b92c006da565e120dfcb7bf0378f4f848 \ - --hash=sha256:ab2357353894a5ec084bb8508ff892aa43fb7fe8a69ad310eac58221ee7f72aa \ - --hash=sha256:ad9fd176ff6800a0cf52bcf59c71e5de4fa25bf3ba62b58800e0f84885344d34 \ - --hash=sha256:addfc23e3bd5f4b6787b9ca95b2d09a1a67ad5a3c318daaa783ff90b2d3a366e \ - --hash=sha256:af1394c2c5febc44e0bbf0fc6428263fa928b50d1b1982ce1d870dc793a8e5f4 \ - --hash=sha256:b04c94718f7a8ed7cdd01b162b6caa1954b3c9d486f00ecbbd300f149d2b2606 \ - --hash=sha256:b4f20417a4f511c656762b001ec827500cbee54d1810253c6ca2df2c0a307a5f \ - --hash=sha256:b7a8c30d9bf4bd5e4dcfe26900bef0fcd9749acde45cdf0b3c89e2052fda9a13 \ - --hash=sha256:b7fa260dd2731afd0dfa47881c30239f422d00faee4b8b341d3e597cface1483 \ - --hash=sha256:b91380aefa9c7ac831b011368daf378d3277e0bdeb6bad9535e21251e26dd55a \ - --hash=sha256:bb2446a55b3a0fd8aa02aa7194bd64740015464a2daaf160d2025204e1d7c282 \ - --hash=sha256:bc05f8a875eb651d1cc62e12a4a0e6afa5cd0cc231381adb830d2e9c196ea895 \ - --hash=sha256:bcf69e0bcddbf2adcfafc1a7e864edcc204dd8171756d3a8f3340f6f6cc87b7b \ - --hash=sha256:bf02f915fa7934ea5dfc8d96757729c99a8868b7c340b97704795d6413cf5fe6 \ - --hash=sha256:c39d2b6161f3c5c5d12e9207ecf1006bb661a647a97a6573656b09aaea3f00ef \ - --hash=sha256:c59740682a686bf835a1a4d8d0ed1eefe31ac07f1c5a7ed5f2e72cf577692b00 \ - --hash=sha256:cc76de75300f65b8eb574d855c12518dc25a075dadb41dd18f6322bda3fe15d5 \ - --hash=sha256:cd0d3d16e63873253bad22b413ec679cf6586e51b5772eb10733899832efec42 \ - --hash=sha256:cda61c46343809ecda43dc620d1333dd7433a25d0a252f2dcc7667f6331c7b61 \ - --hash=sha256:cf7fbb4e54136e9a03c7ed7691843c4df6d2ecc854a2541f840665f4f2bb2edd \ - --hash=sha256:d2b3b4bda1a025b10fe0269369475f420177f2cb06e0f9d32c95b4873c9f80b8 \ - --hash=sha256:d5e3b9310fd7f0d12edc75532cd9a56da6293840c84da90070d692e0bb15f186 \ - --hash=sha256:d64899cc0f33a8f446f1e60bffc21fa88b99f0e8208750d9144ea717610a80ce \ - --hash=sha256:d6975f2d903bc354916a17b91a7aaac7299603f9ecdb788145060dde6e573a16 \ - --hash=sha256:d82ac87017b734f2fb70ff93818c66f0ad2c3810f61040f077ed38d924e19980 \ - --hash=sha256:dd91b0134a32dfcd8be504e8e46de44ad0045a569efc25101f2a12ccd41b5759 \ - --hash=sha256:df4be1cf6e8f0f2bbe2a3eabfff163ef592c84a40e1a20a8d7db7f27cfe08fc2 \ - --hash=sha256:e05d66239d14a04b4717998b736a25494372b1b2409339b04bf42aa4663bf251 \ - --hash=sha256:e40cd0fc734aa1d4bd0e7ad102fd2a1aefa50ce9ef570005ffc2273c5442ddc3 \ - --hash=sha256:e46eb6702691b24ddb3e31e88b4a499e31506991db3d3724a85bd1c5fc3cfe4e \ - --hash=sha256:e4ebb000c0fe24a6d0f3534b6256844d9dbf042fdf003efe5cf40690cf4e0f3e \ - --hash=sha256:e69f8e534b4e254f523e2f9d4732cf9c169c327ca1ce0922682aac9a5ee01155 \ - --hash=sha256:e91a4e5d62da7cb3f53e04fe254f1aa41009af578801ee6477fe56e7bef74ee2 \ - --hash=sha256:ec194197e90ca063f5ecb935d6c10063d84208cac5423c07d0f1a09d1c2ea42b \ - --hash=sha256:f6ae9fc67e636fc0fa9adee39db87dfbdeabfa8420bc0e678a1ac8441e01b22b \ - --hash=sha256:f7d3fe9e1483171e9183ffdb1fab07c5fef80a9c3840374a38ec2ab869ebae20 \ - --hash=sha256:fdc7a52a4cdaf7293e10813fd6a3abc0c7753660db12a3b864ab1fb5a0c60c16 \ - --hash=sha256:fe3198b81c00032326342d973e526803f183f97aa9e9a98e3f897ebafe21178f \ - --hash=sha256:ff19efaa33e7f136fe95f9bbcc90ab7fb60648453b03f95d1de3ab6997de0f32 +virtualenv==20.36.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f \ + --hash=sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba diff --git a/tests/test_auth_management.py b/tests/test_auth_management.py new file mode 100644 index 00000000..35ab77e3 --- /dev/null +++ b/tests/test_auth_management.py @@ -0,0 +1,358 @@ +# +# This file is part of VIRL 2 +# Copyright (c) 2019-2026, Cisco Systems, Inc. +# All rights reserved. +# +# Python bindings for the Cisco VIRL 2 Network Simulation Platform +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import time +from unittest.mock import MagicMock + +import pytest + +from virl2_client.exceptions import MethodNotActive +from virl2_client.models.auth_management import ( + AuthManagement, + LDAPManager, + RADIUSManager, +) +from virl2_client.models.resource_pool import ResourcePool + + +def make_auth_management(settings: dict) -> tuple[AuthManagement, MagicMock]: + session = MagicMock() + auth_management = AuthManagement(session, auto_sync=False) + auth_management._settings = settings.copy() + return auth_management, session + + +@pytest.mark.parametrize( + ("method", "manager_cls"), + [ + ("ldap", LDAPManager), + ("radius", RADIUSManager), + ], +) +def test_manager_returns_expected_manager(method: str, manager_cls): + auth_management, _ = make_auth_management({"method": method}) + + assert isinstance(auth_management.manager, manager_cls) + + +def test_update_settings_no_args_raises(): + auth_management, _ = make_auth_management({"method": "ldap"}) + + with pytest.raises(TypeError, match="No settings to update"): + auth_management.update_settings() + + +def test_sync_updates_settings_and_timestamp(): + auth_management, session = make_auth_management({"method": "ldap"}) + session.get.return_value.json.return_value = {"method": "local"} + + before = time.time() + auth_management.sync() + after = time.time() + + assert auth_management._settings == {"method": "local"} + assert before <= auth_management._last_sync_time <= after + session.get.assert_called_once_with("system/auth/config") + + +@pytest.mark.parametrize("search_filter", [None, "(cn=admins)"]) +def test_get_ldap_groups(search_filter: str | None): + auth_management, session = make_auth_management({"method": "ldap"}) + session.get.return_value.json.return_value = ["group-1", "group-2"] + + response = auth_management.get_ldap_groups(search_filter=search_filter) + + assert response == ["group-1", "group-2"] + if search_filter is None: + session.get.assert_called_once_with("system/auth/groups", params=None) + else: + session.get.assert_called_once_with( + "system/auth/groups", params={"filter": search_filter} + ) + + +def test_refresh_ldap_groups(): + auth_management, session = make_auth_management({"method": "ldap"}) + + auth_management.refresh_ldap_groups() + + session.put.assert_called_once_with("system/auth/refresh") + + +def test_test_auth_with_user_credentials(): + auth_management, session = make_auth_management({"method": "ldap"}) + session.post.return_value.json.return_value = {"auth_ok": True} + + response = auth_management.test_auth( + config={"method": "ldap"}, username="user", password="pa$$" + ) + + assert response == {"auth_ok": True} + session.post.assert_called_once_with( + "system/auth/test", + json={ + "auth-config": {"method": "ldap"}, + "auth-data": {"username": "user", "password": "pa$$"}, + }, + ) + + +def test_test_auth_with_group_name(): + auth_management, session = make_auth_management({"method": "ldap"}) + session.post.return_value.json.return_value = {"auth_ok": True} + + response = auth_management.test_auth( + config={"method": "ldap"}, group_name="cmladmins" + ) + + assert response == {"auth_ok": True} + session.post.assert_called_once_with( + "system/auth/test", + json={ + "auth-config": {"method": "ldap"}, + "group-data": {"group_name": "cmladmins"}, + }, + ) + + +def test_test_current_auth_includes_manager_password(): + auth_management, session = make_auth_management( + {"method": "ldap", "verify_tls": True} + ) + session.post.return_value.json.return_value = {"auth_ok": True} + + response = auth_management.test_current_auth( + manager_password="secret", username="user", password="pa$$" + ) + + assert response == {"auth_ok": True} + session.post.assert_called_once_with( + "system/auth/test", + json={ + "auth-config": { + "method": "ldap", + "verify_tls": True, + "manager_password": "secret", + }, + "auth-data": {"username": "user", "password": "pa$$"}, + }, + ) + + +@pytest.mark.parametrize( + "setting,value", + [ + ("admin_search_filter", "(&(uid={0})(memberOf=cn=admins,dc=corp,dc=com))"), + ( + "cert_data_pem", + "-----BEGIN CERTIFICATE-----\nMIIB\n-----END CERTIFICATE-----", + ), + ("display_attribute", "displayName"), + ("email_address_attribute", "mail"), + ("group_display_attribute", "description"), + ("group_membership_filter", "(member={0})"), + ("group_search_base", "cn=groups,dc=corp,dc=com"), + ("group_search_filter", "(&(cn={0})(objectClass=groupOfNames))"), + ("group_user_attribute", "memberOf"), + ("group_via_user", True), + ("manager_dn", "uid=manager,cn=users,dc=corp,dc=com"), + ("resource_pool", "pool-id"), + ("root_dn", "dc=corp,dc=com"), + ("server_urls", "ldaps://ad.corp.com:3269"), + ("timeout", 10.0), + ("use_ntlm", True), + ("user_search_base", "cn=users,dc=corp,dc=com"), + ("user_search_filter", "(&(uid={0})(objectClass=person))"), + ("verify_tls", False), + ], +) +def test_ldap_settings_update(setting: str, value): + auth_management, session = make_auth_management({"method": "ldap", setting: value}) + manager = auth_management._managers["ldap"] + + setattr(manager, setting, value) + + session.patch.assert_called_once_with( + "system/auth/config", json={setting: value, "method": "ldap"} + ) + assert auth_management._settings[setting] == value + + +def test_ldap_timeout_inactive_method_raises(): + auth_management, _ = make_auth_management({"method": "local", "timeout": 5}) + + with pytest.raises(MethodNotActive): + _ = auth_management._managers["ldap"].timeout + + +def test_ldap_resource_pool_accepts_resource_pool_instance(): + auth_management, session = make_auth_management( + {"method": "ldap", "resource_pool": "old"} + ) + manager = auth_management._managers["ldap"] + resource_pool = ResourcePool( + MagicMock(_session=MagicMock()), + "pool-123", + "label", + None, + None, + None, + None, + None, + None, + None, + None, + None, + ) + + manager.resource_pool = resource_pool + + session.patch.assert_called_once_with( + "system/auth/config", json={"resource_pool": "pool-123", "method": "ldap"} + ) + assert auth_management._settings["resource_pool"] == "pool-123" + + +@pytest.mark.parametrize( + "setting,value", + [ + ("server_hosts", "radius-1 radius-2:1813"), + ("port", 1813), + ("timeout", 7.5), + ("nas_identifier", "cml-01"), + ("resource_pool", "pool-id"), + ], +) +def test_radius_settings_update(setting: str, value): + auth_management, session = make_auth_management( + {"method": "radius", setting: value} + ) + manager = auth_management._managers["radius"] + + setattr(manager, setting, value) + + session.patch.assert_called_once_with( + "system/auth/config", json={setting: value, "method": "radius"} + ) + assert auth_management._settings[setting] == value + + +def test_radius_secret_setter_updates_setting(): + auth_management, session = make_auth_management({"method": "radius"}) + manager = auth_management._managers["radius"] + + manager.secret = "secret" + + session.patch.assert_called_once_with( + "system/auth/config", json={"secret": "secret", "method": "radius"} + ) + + +def test_radius_timeout_inactive_method_raises(): + auth_management, _ = make_auth_management({"method": "local", "timeout": 5}) + + with pytest.raises(MethodNotActive): + _ = auth_management._managers["radius"].timeout + + +def test_radius_resource_pool_accepts_resource_pool_instance(): + auth_management, session = make_auth_management( + {"method": "radius", "resource_pool": "old"} + ) + manager = auth_management._managers["radius"] + resource_pool = ResourcePool( + MagicMock(_session=MagicMock()), + "pool-456", + "label", + None, + None, + None, + None, + None, + None, + None, + None, + None, + ) + + manager.resource_pool = resource_pool + + session.patch.assert_called_once_with( + "system/auth/config", json={"resource_pool": "pool-456", "method": "radius"} + ) + assert auth_management._settings["resource_pool"] == "pool-456" + + +def test_ldap_manager_password_setter_updates_setting(): + auth_management, session = make_auth_management({"method": "ldap"}) + manager = auth_management._managers["ldap"] + + manager.manager_password = "secret" + + session.patch.assert_called_once_with( + "system/auth/config", json={"manager_password": "secret", "method": "ldap"} + ) + + +def test_update_settings_precedence_and_sync_called(): + auth_management, session = make_auth_management({"method": "ldap"}) + session.get.return_value.json.return_value = {"method": "ldap", "verify_tls": False} + + auth_management.update_settings({"verify_tls": True}, verify_tls=False) + + session.patch.assert_called_once_with( + "system/auth/config", json={"verify_tls": False} + ) + session.get.assert_called_once_with("system/auth/config") + assert auth_management._settings["verify_tls"] is False + + +def test_sync_if_outdated_triggers_sync(monkeypatch: pytest.MonkeyPatch): + auth_management, session = make_auth_management({"method": "ldap"}) + session.get.return_value.json.return_value = {"method": "ldap"} + auth_management.auto_sync = True + auth_management.auto_sync_interval = 10.0 + auth_management._last_sync_time = 0.0 + + monkeypatch.setattr(time, "time", lambda: 20.0) + + auth_management.sync_if_outdated() + + session.get.assert_called_once_with("system/auth/config") + + +def test_sync_if_outdated_skips_when_recent(monkeypatch: pytest.MonkeyPatch): + auth_management, session = make_auth_management({"method": "ldap"}) + auth_management.auto_sync = True + auth_management.auto_sync_interval = 10.0 + auth_management._last_sync_time = 15.0 + + monkeypatch.setattr(time, "time", lambda: 20.0) + + auth_management.sync_if_outdated() + + session.get.assert_not_called() + + +def test_accessing_wrong_manager_raises(): + auth_management, _ = make_auth_management({"method": "ldap"}) + + with pytest.raises(MethodNotActive): + _ = auth_management._managers["radius"].timeout diff --git a/tests/test_autostart.py b/tests/test_autostart.py new file mode 100644 index 00000000..66ef2494 --- /dev/null +++ b/tests/test_autostart.py @@ -0,0 +1,167 @@ +# +# This file is part of VIRL 2 +# Copyright (c) 2019-2026, Cisco Systems, Inc. +# All rights reserved. +# +# Python bindings for the Cisco VIRL 2 Network Simulation Platform +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from unittest.mock import MagicMock, Mock + +import pytest + +from virl2_client.models import Lab + +RESOURCE_POOL_MANAGER = Mock() +USER_MANAGEMENT = Mock() + + +def conditional_side_effect(*args, **kwargs): + _ = args + resp = kwargs.get("json", {}) + if autostart := resp.get("autostart"): + if not isinstance(autostart.get("enabled"), bool): + raise ValueError("Invalid value for enabled") + if priority := autostart.get("priority"): + if not isinstance(priority, int) or not 0 <= priority <= 10000: + raise ValueError("Invalid value for priority") + if delay := autostart.get("delay"): + if not isinstance(delay, int) or not 0 <= delay <= 86400: + raise ValueError("Invalid value for delay") + + +def test_autostart_initial_values(): + """Test that new lab has correct initial autostart values.""" + session = MagicMock() + lab = Lab( + "test_lab", + "1", + session, + "user", + "pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + assert lab._autostart == {"enabled": False, "priority": None, "delay": None} + + +def test_lab_autostart_setter(): + """Test setting the autostart parameter on a Lab instance.""" + session = MagicMock() + lab = Lab( + title="Test Lab", + lab_id="lab-id", + session=session, + username="user", + password="pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + + lab.set_autostart(enabled=True, priority=5, delay=10) + assert lab.autostart == {"enabled": True, "priority": 5, "delay": 10} + session.patch.assert_called_once_with( + "labs/lab-id", json={"autostart": {"enabled": True, "priority": 5, "delay": 10}} + ) + + +def test_lab_autostart_setter_invalid(): + """Test setting invalid autostart parameters raises ValueError.""" + session = MagicMock() + session.patch.side_effect = conditional_side_effect + lab = Lab( + title="Test Lab", + lab_id="lab-id", + session=session, + username="user", + password="pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + + with pytest.raises(ValueError): + lab.set_autostart(enabled="yes", priority=5, delay=10) + with pytest.raises(ValueError): + lab.set_autostart(enabled=True, priority="yes", delay=10) + with pytest.raises(ValueError): + lab.set_autostart(enabled=True, priority=-1, delay=10) + with pytest.raises(ValueError): + lab.set_autostart(enabled=True, priority=10001, delay=10) + with pytest.raises(ValueError): + lab.set_autostart(enabled=True, priority=5, delay="yes") + with pytest.raises(ValueError): + lab.set_autostart(enabled=True, priority=5, delay=-10) + with pytest.raises(ValueError): + lab.set_autostart(enabled=True, priority=5, delay=86401) + + +def test_lab_autostart_setter_no_change(): + """Test that setting autostart to the same value does not trigger an API call.""" + session = MagicMock() + lab = Lab( + title="Test Lab", + lab_id="lab-id", + session=session, + username="user", + password="pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + lab._autostart = {"enabled": True, "priority": 5, "delay": 10} + + lab.set_autostart() + session.patch.assert_not_called() + + lab.set_autostart(enabled=True, priority=5, delay=10) + session.patch.assert_called() + + +def test_lab_autostart_setter_partial_update(): + """Test that setting only some autostart parameters updates correctly.""" + session = MagicMock() + lab = Lab( + title="Test Lab", + lab_id="lab-id", + session=session, + username="user", + password="pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + lab._autostart = {"enabled": False, "priority": None, "delay": None} + + lab.set_autostart(enabled=True) + assert lab.autostart == {"enabled": True, "priority": None, "delay": None} + session.patch.assert_called_with( + "labs/lab-id", + json={"autostart": {"enabled": True, "priority": None, "delay": None}}, + ) + + lab.set_autostart(priority=7) + assert lab.autostart == {"enabled": True, "priority": 7, "delay": None} + session.patch.assert_called_with( + "labs/lab-id", + json={"autostart": {"enabled": True, "priority": 7, "delay": None}}, + ) + + lab.set_autostart(delay=15) + assert lab.autostart == {"enabled": True, "priority": 7, "delay": 15} + session.patch.assert_called_with( + "labs/lab-id", json={"autostart": {"enabled": True, "priority": 7, "delay": 15}} + ) diff --git a/tests/test_client_library.py b/tests/test_client_library.py index d1028ddf..485fa254 100644 --- a/tests/test_client_library.py +++ b/tests/test_client_library.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -21,17 +21,17 @@ import json import logging import re -import sys +from collections.abc import Iterator from pathlib import Path -from unittest.mock import Mock, call, patch +from unittest.mock import MagicMock, Mock, call, patch import httpx import pytest import respx +from virl2_client.exceptions import APIError from virl2_client.models import Lab from virl2_client.virl2_client import ( - ClientConfig, ClientLibrary, DiagnosticsCategory, InitializationError, @@ -39,15 +39,12 @@ ) CURRENT_VERSION = ClientLibrary.VERSION.version_str - -python37_or_newer = pytest.mark.skipif( - sys.version_info < (3, 7), reason="requires Python3.7" -) +FAKE_URL = "https://0.0.0.0/fake_url/" # TODO: split into multiple test modules, by feature. @pytest.fixture -def reset_env(monkeypatch): +def reset_env(monkeypatch: pytest.MonkeyPatch): env_vars = [ "VIRL2_URL", "VIRL_HOST", @@ -55,19 +52,20 @@ def reset_env(monkeypatch): "VIRL_USERNAME", "VIRL2_PASS", "VIRL_PASSWORD", + "VIRL2_JWT", ] for key in env_vars: monkeypatch.delenv(key, raising=False) -@python37_or_newer def test_import_lab_from_path_virl( - client_library_server_current, mocked_session, tmp_path: Path + client_library_server_current: MagicMock, + mocked_session: MagicMock, + tmp_path: Path, ): - cl = ClientLibrary( - url="https://0.0.0.0/fake_url/", username="test", password="pa$$" - ) + _ = client_library_server_current, mocked_session + cl = ClientLibrary(url=FAKE_URL, username="test", password="pa$$") Lab.sync = Mock() (tmp_path / "topology.virl").write_text("") @@ -84,13 +82,13 @@ def test_import_lab_from_path_virl( cl._session.post.assert_called_once() -@python37_or_newer def test_import_lab_from_path_virl_title( - client_library_server_current, mocked_session, tmp_path: Path + client_library_server_current: MagicMock, + mocked_session: MagicMock, + tmp_path: Path, ): - cl = ClientLibrary( - url="https://0.0.0.0/fake_url/", username="test", password="pa$$" - ) + _ = client_library_server_current, mocked_session + cl = ClientLibrary(url=FAKE_URL, username="test", password="pa$$") Lab.sync = Mock() new_title = "new_title" (tmp_path / "topology.virl").write_text("") @@ -107,9 +105,12 @@ def test_import_lab_from_path_virl_title( ) -def test_ssl_certificate(client_library_server_current, mocked_session): +def test_ssl_certificate( + client_library_server_current: MagicMock, mocked_session: MagicMock +): + _ = client_library_server_current, mocked_session cl = ClientLibrary( - url="https://0.0.0.0/fake_url/", + url=FAKE_URL, username="test", password="pa$$", ssl_verify="/home/user/cert.pem", @@ -117,26 +118,60 @@ def test_ssl_certificate(client_library_server_current, mocked_session): cl.is_system_ready(wait=True) assert cl._ssl_verify == "/home/user/cert.pem" - assert cl._session.mock_calls[:4] == [call.get("authok")] + assert cl._session.mock_calls[0] == call.get("authentication") def test_ssl_certificate_from_env_variable( - client_library_server_current, monkeypatch, mocked_session + client_library_server_current: MagicMock, + monkeypatch: pytest.MonkeyPatch, + mocked_session: MagicMock, ): + _ = client_library_server_current, mocked_session monkeypatch.setenv("CA_BUNDLE", "/home/user/cert.pem") - cl = ClientLibrary( - url="https://0.0.0.0/fake_url/", username="test", password="pa$$" - ) + cl = ClientLibrary(url=FAKE_URL, username="test", password="pa$$") assert cl.is_system_ready() assert cl._ssl_verify == "/home/user/cert.pem" - assert cl._session.mock_calls[:4] == [call.get("authok")] + assert cl._session.mock_calls[0] == call.get("authentication") -@python37_or_newer @respx.mock -def test_auth_and_reauth_token(client_library_server_current): - def initial_different_response(initial, subsequent=httpx.Response(200)): +def test_new_auth_url_used_with_cml_2_10( + client_library_server_current: MagicMock, +): + """Verify that the new auth URL is used with CML 2.10.x controllers. + + With the current client version (2.10.0), _make_test_auth_call should + access the "authentication" endpoint and not the legacy "authok" one. + """ + + _ = client_library_server_current + + respx.post(f"{FAKE_URL}api/v0/authenticate").respond(json="BOGUS_TOKEN") + new_auth_route = respx.get(f"{FAKE_URL}api/v0/authentication").respond( + 200, + json={ + "username": "username", + "admin": True, + "id": "6c7dd461-1cbe-428f-bdd5-545a0d766ed7", + "token": "BOGUS_TOKEN", + "error": None, + }, + ) + old_auth_route = respx.get(f"{FAKE_URL}api/v0/authok").respond(404) + + ClientLibrary(url=FAKE_URL, username="test", password="pa$$") + + assert new_auth_route.called + assert not old_auth_route.called + + +@respx.mock +def test_auth_and_reauth_token(client_library_server_current: MagicMock): + def initial_different_response( + initial: httpx.Response, subsequent: httpx.Response = httpx.Response(200) + ) -> Iterator[httpx.Response]: + _ = client_library_server_current yield initial while True: yield subsequent @@ -145,53 +180,169 @@ def initial_different_response(initial, subsequent=httpx.Response(200)): side_effect = initial_different_response( httpx.Response(403), httpx.Response(200, json="7bbcan78a98bch7nh3cm7hao3nc7") ) - respx.post("https://0.0.0.0/fake_url/api/v0/authenticate").side_effect = side_effect - side_effect = initial_different_response(httpx.Response(401)) - respx.get("https://0.0.0.0/fake_url/api/v0/authok").side_effect = side_effect + respx.post(f"{FAKE_URL}api/v0/authenticate").side_effect = side_effect + side_effect = initial_different_response( + httpx.Response(401), + httpx.Response( + 200, + json={ + "username": "username", + "admin": True, + "id": "6c7dd461-1cbe-428f-bdd5-545a0d766ed7", + "token": "BOGUS_TOKEN", + "error": None, + }, + ), + ) + respx.get(f"{FAKE_URL}api/v0/authentication").side_effect = side_effect # mock get labs - respx.get("https://0.0.0.0/fake_url/api/v0/labs").respond(json=[]) + respx.get(f"{FAKE_URL}api/v0/labs").respond(json=[]) with pytest.raises(InitializationError): # Test returns custom exception when instructed to raise on failure ClientLibrary( - url="https://0.0.0.0/fake_url/", + url=FAKE_URL, username="test", password="pa$$", raise_for_auth_failure=True, ) - cl = ClientLibrary( - url="https://0.0.0.0/fake_url/", username="test", password="pa$$" - ) + cl = ClientLibrary(url=FAKE_URL, username="test", password="pa$$") cl.all_labs() - # for idx, item in enumerate(respx.calls): - # print(idx, item.request.url) - # - # this is what we expect: - # 0 https://0.0.0.0/fake_url/api/v0/authenticate - # 1 https://0.0.0.0/fake_url/api/v0/authenticate - # 2 https://0.0.0.0/fake_url/api/v0/authok - # 3 https://0.0.0.0/fake_url/api/v0/authenticate - # 4 https://0.0.0.0/fake_url/api/v0/authok - # 5 https://0.0.0.0/fake_url/api/v0/labs - - assert respx.calls[0].request.url == "https://0.0.0.0/fake_url/api/v0/authenticate" + assert respx.calls[0].request.url == f"{FAKE_URL}api/v0/authenticate" assert json.loads(respx.calls[0].request.content) == { "username": "test", "password": "pa$$", } - assert respx.calls[1].request.url == "https://0.0.0.0/fake_url/api/v0/authenticate" - assert respx.calls[2].request.url == "https://0.0.0.0/fake_url/api/v0/authok" - assert respx.calls[3].request.url == "https://0.0.0.0/fake_url/api/v0/authenticate" - assert respx.calls[4].request.url == "https://0.0.0.0/fake_url/api/v0/authok" - assert respx.calls[5].request.url == "https://0.0.0.0/fake_url/api/v0/labs" + assert respx.calls[1].request.url == f"{FAKE_URL}api/v0/authenticate" + assert respx.calls[2].request.url == f"{FAKE_URL}api/v0/authentication" + assert respx.calls[3].request.url == f"{FAKE_URL}api/v0/authenticate" + assert respx.calls[4].request.url == f"{FAKE_URL}api/v0/authentication" + assert respx.calls[5].request.url == f"{FAKE_URL}api/v0/labs" assert respx.calls.call_count == 6 -def test_client_library_init_allow_http(client_library_server_current): +@respx.mock +def test_jwt_only_valid_token_does_not_call_password_auth( + client_library_server_current: MagicMock, +): + _ = client_library_server_current + + auth_route = respx.get(f"{FAKE_URL}api/v0/authentication").respond( + 200, + json={ + "username": "jwt_user", + "admin": False, + "id": "6c7dd461-1cbe-428f-bdd5-545a0d766ed7", + "token": "VALID_TOKEN", + "error": None, + }, + ) + password_auth_route = respx.post(f"{FAKE_URL}api/v0/authenticate").respond( + json="SHOULD_NOT_BE_USED" + ) + respx.get(f"{FAKE_URL}api/v0/labs").respond(json=[]) + + cl = ClientLibrary(url=FAKE_URL, jwtoken="VALID_TOKEN") + cl.all_labs() + + assert auth_route.called + assert not password_auth_route.called + + +@respx.mock +def test_jwt_expired_with_credentials_reauths_using_password_auth( + client_library_server_current: MagicMock, +): + _ = client_library_server_current + + auth_route = respx.get(f"{FAKE_URL}api/v0/authentication") + auth_route.side_effect = [ + httpx.Response(401), + httpx.Response( + 200, + json={ + "username": "test", + "admin": True, + "id": "6c7dd461-1cbe-428f-bdd5-545a0d766ed7", + "token": "REFRESHED_TOKEN", + "error": None, + }, + ), + ] + password_auth_route = respx.post(f"{FAKE_URL}api/v0/authenticate").respond( + json="REFRESHED_TOKEN" + ) + + ClientLibrary( + url=FAKE_URL, + username="test", + password="pa$$", + jwtoken="EXPIRED_TOKEN", + ) + + assert auth_route.called + assert auth_route.call_count == 2 + assert password_auth_route.called + assert json.loads(password_auth_route.calls[0].request.content) == { + "username": "test", + "password": "pa$$", + } + + +@respx.mock +def test_jwt_reauth_without_credentials_fails_cleanly( + client_library_server_current: MagicMock, + reset_env: None, +): + _ = client_library_server_current, reset_env + + auth_route = respx.get(f"{FAKE_URL}api/v0/authentication").respond(401) + password_auth_route = respx.post(f"{FAKE_URL}api/v0/authenticate").respond( + json="SHOULD_NOT_BE_USED" + ) + + with pytest.raises( + APIError, + match="JWT token expired and automatic re-authentication is not possible", + ): + ClientLibrary(url=FAKE_URL, jwtoken="EXPIRED_TOKEN") + + assert auth_route.called + assert auth_route.call_count == 1 + assert not password_auth_route.called + + +@respx.mock +def test_old_auth_url_used_with_cml_2_9( + client_library_server_2_9_0: MagicMock, monkeypatch: pytest.MonkeyPatch +): + """Verify that the legacy auth URL is used with a 2.9.x controller when + the client library version is also 2.9.x. + + This simulates running an older client (2.9) against a 2.9 controller, + where only the legacy "authok" endpoint is available. + """ + + _ = client_library_server_2_9_0 + + monkeypatch.setattr(ClientLibrary, "VERSION", Version("2.9.0")) + + respx.post(f"{FAKE_URL}api/v0/authenticate").respond(json="BOGUS_TOKEN") + old_auth_route = respx.get(f"{FAKE_URL}api/v0/authok").respond(200, text="OK") + new_auth_route = respx.get(f"{FAKE_URL}api/v0/authentication").respond(404) + + ClientLibrary(url=FAKE_URL, username="test", password="pa$$") + + assert old_auth_route.called + assert not new_auth_route.called + + +def test_client_library_init_allow_http(client_library_server_current: MagicMock): + _ = client_library_server_current cl = ClientLibrary("http://somehost", "virl2", "virl2", allow_http=True) assert cl._session.base_url.scheme == "http" assert cl._session.base_url.host == "somehost" @@ -201,13 +352,70 @@ def test_client_library_init_allow_http(client_library_server_current): assert cl.password == "virl2" -def test_client_library_init_disallow_http(client_library_server_current): +def test_client_library_init_disallow_http(client_library_server_current: MagicMock): + _ = client_library_server_current with pytest.raises(InitializationError, match="must be https"): ClientLibrary("http://somehost", "virl2", "virl2") with pytest.raises(InitializationError, match="must be https"): ClientLibrary("http://somehost", "virl2", "virl2", allow_http=False) +@respx.mock +def test_new_auth_url_fails_with_cml_2_9(client_library_server_2_9_0: MagicMock): + """Negative test: new auth URL does not work with CML 2.9.x. + + With the current client version (2.10.0) and a 2.9 controller, only the + legacy "authok" endpoint is expected to exist server-side. + """ + + _ = client_library_server_2_9_0 + + respx.post(f"{FAKE_URL}api/v0/authenticate").respond(json="BOGUS_TOKEN") + old_auth_route = respx.get(f"{FAKE_URL}api/v0/authok").respond(200, text="OK") + new_auth_route = respx.get(f"{FAKE_URL}api/v0/authentication").respond(404) + + ClientLibrary(url=FAKE_URL, username="test", password="pa$$") + + assert old_auth_route.called + assert not new_auth_route.called + + +@respx.mock +def test_old_auth_url_deprecated_with_cml_2_10( + client_library_server_current: MagicMock, monkeypatch: pytest.MonkeyPatch +): + """Negative test: legacy auth URL should be considered deprecated on + CML 2.10.x controllers. This is a theoretical scenario in case it is not + forbidden to connect to a newer controller with an older client anymore. + + This simulates using an older client (2.9.x) against a 2.10 controller, + where the "authok" endpointis deprecated. _make_test_auth_call will + select the "legacy" endpoint, which still works, but eventually won't. + """ + + _ = client_library_server_current + + monkeypatch.setattr(ClientLibrary, "VERSION", Version("2.9.0")) + + respx.post(f"{FAKE_URL}api/v0/authenticate").respond(json="BOGUS_TOKEN") + old_auth_route = respx.get(f"{FAKE_URL}api/v0/authok").respond(200, text="OK") + new_auth_route = respx.get(f"{FAKE_URL}api/v0/authentication").respond( + 200, + json={ + "username": "username", + "admin": True, + "id": "6c7dd461-1cbe-428f-bdd5-545a0d766ed7", + "token": "BOGUS_TOKEN", + "error": None, + }, + ) + + ClientLibrary(url=FAKE_URL, username="test", password="pa$$") + + assert new_auth_route.called + assert not old_auth_route.called + + # the test fails if you have variables set in env @pytest.mark.parametrize("via", ["environment", "parameter"]) @pytest.mark.parametrize("env_var", ["VIRL2_URL", "VIRL_HOST"]) @@ -224,8 +432,14 @@ def test_client_library_init_disallow_http(client_library_server_current): ], ) def test_client_library_init_url( - client_library_server_current, reset_env, monkeypatch, via, env_var, params + client_library_server_current: MagicMock, + reset_env: None, + monkeypatch: pytest.MonkeyPatch, + via: str, + env_var: str, + params: tuple, ): + _ = client_library_server_current, reset_env monkeypatch.setattr("getpass.getpass", input) (fail, url) = params expected_parts = None if fail else httpx.URL(url) @@ -267,8 +481,14 @@ def test_client_library_init_url( @pytest.mark.parametrize("env_var", ["VIRL2_USER", "VIRL_USERNAME"]) @pytest.mark.parametrize("params", [(False, "johndoe"), (True, ""), (True, None)]) def test_client_library_init_user( - client_library_server_current, reset_env, monkeypatch, via, env_var, params + client_library_server_current: MagicMock, + reset_env: None, + monkeypatch: pytest.MonkeyPatch, + via: str, + env_var: str, + params: tuple, ): + _ = client_library_server_current, reset_env monkeypatch.setattr("getpass.getpass", input) url = "validhostname" (fail, user) = params @@ -277,7 +497,7 @@ def test_client_library_init_user( env = user or "" user = None else: - env = "baduser" if user else None + env = "baduser" if user else "" if env is None: monkeypatch.delenv(env_var, raising=False) else: @@ -300,8 +520,14 @@ def test_client_library_init_user( @pytest.mark.parametrize("env_var", ["VIRL2_PASS", "VIRL_PASSWORD"]) @pytest.mark.parametrize("params", [(False, "validPa$$w!2"), (True, ""), (True, None)]) def test_client_library_init_password( - client_library_server_current, reset_env, monkeypatch, via, env_var, params + client_library_server_current: MagicMock, + reset_env: None, + monkeypatch: pytest.MonkeyPatch, + via: str, + env_var: str, + params: tuple, ): + _ = client_library_server_current, reset_env monkeypatch.setattr("getpass.getpass", input) url = "validhostname" (fail, password) = params @@ -310,7 +536,7 @@ def test_client_library_init_password( env = password or "" password = None else: - env = "badpass" if password else None + env = "badpass" if password else "" if env is None: monkeypatch.delenv(env_var, raising=False) else: @@ -328,75 +554,53 @@ def test_client_library_init_password( assert cl._session.base_url == "https://validhostname/api/v0/" -@pytest.mark.parametrize( - "config", - [ - ClientConfig("http://somehost", "virl2", "pa$$", allow_http=True), - ClientConfig("https://somehost:443", "virl4", "somepass", ssl_verify=False), - ClientConfig("https://somehost", "virl4", "somepass", ssl_verify="/path.pem"), - ClientConfig("https://somehost", "virl4", "somepass", auto_sync=-1), - ClientConfig("https://somehost", "virl4", "somepass", auto_sync=0.0), - ClientConfig("https://somehost", "virl4", "somepass", auto_sync=2.3), - ], -) -def test_client_library_config(client_library_server_current, mocked_session, config): - client_library = config.make_client() - assert client_library._session.base_url.path.startswith(config.url) - assert client_library.username == config.username - assert client_library.password == config.password - assert client_library.allow_http == config.allow_http - assert client_library._ssl_verify == config.ssl_verify - assert client_library.auto_sync == (config.auto_sync >= 0.0) - assert client_library.auto_sync_interval == config.auto_sync - assert client_library._session.mock_calls == [ - call.get("authok"), - call.base_url.path.startswith(config.url), - call.base_url.path.startswith().__bool__(), - ] - - -def test_client_library_str_and_repr(client_library_server_current): +def test_client_library_str_and_repr(client_library_server_current: MagicMock): + _ = client_library_server_current client_library = ClientLibrary("somehost", "virl2", password="virl2") assert repr(client_library) == "ClientLibrary('https://somehost')" assert str(client_library) == "ClientLibrary URL: https://somehost/api/v0/" -def test_incompatible_version(client_library_server_2_0_0): +def test_incompatible_version(client_library_server_2_0_0: MagicMock): + _ = client_library_server_2_0_0 with pytest.raises(InitializationError) as err: - with patch.object( - ClientLibrary, "INCOMPATIBLE_CONTROLLER_VERSIONS", new=[Version("2.0.0")] - ): - ClientLibrary("somehost", "virl2", password="virl2") - assert ( - str(err.value) == "Controller version 2.0.0 is marked incompatible! " - "List of versions marked explicitly as incompatible: [2.0.0]." + ClientLibrary("somehost", "virl2", password="virl2") + assert str(err.value) == ( + "Unsupported minor version (only last 3 minor versions are supported). " + f"Client {ClientLibrary.VERSION}, controller 2.0.0." ) -def test_client_minor_version_gt_nowarn(client_library_server_current, caplog): +def test_client_minor_version_gt_nowarn( + client_library_server_current: MagicMock, caplog: pytest.LogCaptureFixture +): + _ = client_library_server_current with caplog.at_level(logging.WARNING): - client_library = ClientLibrary("somehost", "virl2", password="virl2") - assert client_library is not None + ClientLibrary("somehost", "virl2", password="virl2") assert ( f"Please ensure the client version is compatible with the controller version. " f"Client {CURRENT_VERSION}, controller 2.0.0." not in caplog.text ) -def test_client_minor_version_lt_warn(client_library_server_2_19_0, caplog): +def test_client_minor_version_lt_warn( + client_library_server_2_19_0: MagicMock, caplog: pytest.LogCaptureFixture +): + _ = client_library_server_2_19_0 with caplog.at_level(logging.WARNING): - client_library = ClientLibrary("somehost", "virl2", password="virl2") - assert client_library is not None + ClientLibrary("somehost", "virl2", password="virl2") assert ( f"Please ensure the client version is compatible with the controller version. " f"Client {CURRENT_VERSION}, controller 2.19.0." in caplog.text ) -def test_exact_version_no_warn(client_library_server_current, caplog): +def test_exact_version_no_warn( + client_library_server_current: MagicMock, caplog: pytest.LogCaptureFixture +): + _ = client_library_server_current with caplog.at_level(logging.WARNING): - client_library = ClientLibrary("somehost", "virl2", password="virl2") - assert client_library is not None + ClientLibrary("somehost", "virl2", password="virl2") assert ( f"Please ensure the client version is compatible with the controller version. " f"Client {CURRENT_VERSION}, controller 2.0.0." not in caplog.text @@ -456,7 +660,9 @@ def test_exact_version_no_warn(client_library_server_current, caplog): ), ], ) -def test_version_comparison_greater_than(greater, lesser, expected): +def test_version_comparison_greater_than( + greater: Version, lesser: Version, expected: bool +): assert (greater > lesser) == expected @@ -537,7 +743,9 @@ def test_version_comparison_greater_than(greater, lesser, expected): ), ], ) -def test_version_comparison_greater_than_or_equal_to(first, second, expected): +def test_version_comparison_greater_than_or_equal_to( + first: Version, second: Version, expected: bool +): assert (first >= second) == expected @@ -588,7 +796,9 @@ def test_version_comparison_greater_than_or_equal_to(first, second, expected): ), ], ) -def test_version_comparison_less_than(lesser, greater, expected): +def test_version_comparison_less_than( + lesser: Version, greater: Version, expected: bool +): assert (lesser < greater) == expected @@ -663,7 +873,9 @@ def test_version_comparison_less_than(lesser, greater, expected): ), ], ) -def test_version_comparison_less_than_or_equal_to(first, second, expected): +def test_version_comparison_less_than_or_equal_to( + first: Version, second: Version, expected: bool +): assert (first <= second) == expected @@ -690,11 +902,13 @@ def test_different_version_strings(): def test_import_lab_offline_deprecated( - client_library_server_current, mocked_session, tmp_path: Path, test_data_dir: Path + client_library_server_current: MagicMock, + mocked_session: MagicMock, + tmp_path: Path, + test_data_dir: Path, ): - client_library = ClientLibrary( - url="https://0.0.0.0/fake_url/", username="test", password="pa$$" - ) + _ = client_library_server_current, mocked_session, tmp_path + client_library = ClientLibrary(url=FAKE_URL, username="test", password="pa$$") topology_file_path = test_data_dir / "sample_topology.json" with open(topology_file_path) as fh: topology_file = fh.read() @@ -702,11 +916,14 @@ def test_import_lab_offline_deprecated( client_library.import_lab(topology_file, "topology-v0_0_4", offline=True) -def test_convergence_parametrization(client_library_server_current, mocked_session): +def test_convergence_parametrization( + client_library_server_current: MagicMock, mocked_session: MagicMock +): + _ = client_library_server_current, mocked_session max_iter = 2 max_time = 1 cl = ClientLibrary( - url="https://0.0.0.0/fake_url/", + url=FAKE_URL, username="test", password="pa$$", convergence_wait_max_iter=max_iter, @@ -772,10 +989,20 @@ def test_get_diagnostics_paths( @respx.mock def test_system_management_controller_triggers_compute_load( - client_library_server_current, + client_library_server_current: MagicMock, ): + _ = client_library_server_current respx.post("https://localhost/api/v0/authenticate").respond(json="fake_token") - respx.get("https://localhost/api/v0/authok").respond(200) + respx.get("https://localhost/api/v0/authentication").respond( + 200, + json={ + "username": "username", + "id": "6c7dd461-1cbe-428f-bdd5-545a0d766ed7", + "token": "BOGUS_TOKEN", + "admin": True, + "error": None, + }, + ) compute_hosts_response = [ { diff --git a/tests/test_client_library_labs.py b/tests/test_client_library_labs.py index e442620e..b82e9e6f 100644 --- a/tests/test_client_library_labs.py +++ b/tests/test_client_library_labs.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -21,12 +21,16 @@ from unittest.mock import MagicMock, Mock import pytest +from respx import MockRouter from virl2_client.exceptions import NodeNotFound from virl2_client.models import Interface, Lab from virl2_client.models.authentication import make_session +from virl2_client.models.node import Node +from virl2_client.virl2_client import ClientLibrary RESOURCE_POOL_MANAGER = Mock() +USER_MANAGEMENT = Mock() def test_topology_creation_and_removal(): @@ -38,8 +42,9 @@ def test_topology_creation_and_removal(): session, username, password, - auto_sync=0, + auto_sync=False, resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, ) node_a = lab._create_node_local("0", "node A", "nd") node_b = lab._create_node_local("1", "node B", "nd") @@ -151,9 +156,10 @@ def test_need_to_wait1(): session, username, password, - auto_sync=0, + auto_sync=False, wait=True, resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, ) assert lab.need_to_wait(None) is True assert lab.need_to_wait(False) is False @@ -169,9 +175,10 @@ def test_need_to_wait2(): session, username, password, - auto_sync=0, + auto_sync=False, wait=False, resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, ) assert lab.need_to_wait(None) is False assert lab.need_to_wait(False) is False @@ -187,9 +194,10 @@ def test_str_and_repr(): session, username, password, - auto_sync=0, + auto_sync=False, wait=False, resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, ) assert str(lab) == "Lab: laboratory" assert repr(lab) == "Lab('1', 'laboratory', '/')" @@ -204,9 +212,10 @@ def test_create_node(): session, username, password, - auto_sync=0, + auto_sync=False, wait=False, resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, ) node = lab.create_node("testnode", "server") assert node.node_definition == "server" @@ -215,7 +224,7 @@ def test_create_node(): @pytest.mark.parametrize("connect_two_nodes", [True, False]) -def test_create_link(respx_mock, connect_two_nodes): +def test_create_link(respx_mock: MockRouter, connect_two_nodes: bool): respx_mock.post("mock://mock/labs/1/nodes").respond(json={"id": "n0"}) respx_mock.post("mock://mock/labs/1/interfaces").respond( json={"id": "i0", "label": "eth0", "slot": 0} @@ -232,9 +241,10 @@ def test_create_link(respx_mock, connect_two_nodes): session, username, password, - auto_sync=0, + auto_sync=False, wait=False, resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, ) node1 = lab.create_node("testnode", "server") node2 = lab.create_node("testnode", "server") @@ -259,7 +269,7 @@ def test_create_link(respx_mock, connect_two_nodes): respx_mock.assert_all_called() -def test_sync_stats(respx_mock): +def test_sync_stats(respx_mock: MockRouter): respx_mock.get("mock://mock/labs/1/simulation_stats").respond( json={"nodes": {}, "links": {}} ) @@ -272,9 +282,10 @@ def test_sync_stats(respx_mock): session, username, password, - auto_sync=0, + auto_sync=False, wait=False, resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, ) lab.sync_statistics() respx_mock.assert_all_called() @@ -289,8 +300,9 @@ def test_tags(): session, username, password, - auto_sync=0, + auto_sync=False, resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, ) lab.get_smart_annotation_by_tag = MagicMock() node_a = lab._create_node_local("0", "node A", "nd") @@ -327,8 +339,9 @@ def test_find_by_label(): session, username, password, - auto_sync=0, + auto_sync=False, resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, ) lab._create_node_local("n0", "server-a", "nd") @@ -353,8 +366,9 @@ def test_next_free_interface(): session, username, password, - auto_sync=0, + auto_sync=False, resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, ) node_a = lab._create_node_local("0", "node A", "nd") node_b = lab._create_node_local("1", "node B", "nd") @@ -373,7 +387,7 @@ def test_next_free_interface(): assert nf is None -def test_join_existing_lab(client_library): +def test_join_existing_lab(client_library: ClientLibrary): lab = client_library.join_existing_lab("444a78d1-575c-4746-8469-696e580f17b6") assert lab.title == "IOSv Feature Tests" assert lab.statistics == { @@ -385,7 +399,7 @@ def test_join_existing_lab(client_library): } -def test_all_labs(client_library): +def test_all_labs(client_library: ClientLibrary): all_labs = client_library.all_labs() assert len(all_labs) == 4 iosv_labs = client_library.find_labs_by_title("IOSv Feature Tests") @@ -393,3 +407,106 @@ def test_all_labs(client_library): lab: Lab = iosv_labs[0] node = lab.get_node_by_label("csr1000v-0") assert node.compute_id == "99c887f5-052e-4864-a583-49fa7c4b68a9" + + +def test_sync_interfaces_operational(respx_mock: MockRouter): + """Test Lab.sync_interfaces_operational() uses bulk interfaces endpoint.""" + respx_mock.get("mock://mock/labs/1/interfaces").respond( + json=[{"id": "iface1", "operational": {"mac_address": "aa:bb:cc:dd:ee:ff"}}] + ) + session = make_session("mock://mock") + session.lock = MagicMock() + lab = Lab( + "test", + "1", + session, + "user", + "pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + lab._interfaces = {"iface1": MagicMock()} + + lab.sync_interfaces_operational() + + respx_mock.assert_all_called() + assert lab._interfaces["iface1"]._operational == { + "mac_address": "aa:bb:cc:dd:ee:ff" + } + + +def test_lab_clear_discovered_addresses(respx_mock: MockRouter): + """Test Lab.clear_discovered_addresses() calls API.""" + respx_mock.delete("mock://mock/labs/1/layer3_addresses").respond(status_code=204) + session = make_session("mock://mock") + session.lock = MagicMock() + lab = Lab( + "test", + "1", + session, + "user", + "pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + + lab.clear_discovered_addresses() + + respx_mock.assert_all_called() + + +def test_node_clear_discovered_addresses(respx_mock: MockRouter): + """Test Node.clear_discovered_addresses()""" + respx_mock.delete("mock://mock/labs/1/nodes/n1/layer3_addresses").respond( + status_code=204 + ) + session = make_session("mock://mock") + session.lock = MagicMock() + lab = Lab( + "test", + "1", + session, + "user", + "pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + + node = Node(lab, "n1", "test", "iosv") + + interface1 = Interface("if1", node, "eth0", 0) + interface1._ip_snooped_info = { + "ipv4": ["192.168.1.1/24", "10.0.0.1/8"], + "ipv6": [], + "mac_address": None, + } + interface2 = Interface("if2", node, "eth1", 1) + interface2._ip_snooped_info = { + "ipv4": ["192.168.2.1/24"], + "ipv6": [], + "mac_address": None, + } + + lab._interfaces = {"if1": interface1, "if2": interface2} + lab._nodes = {"n1": node} + + assert interface1.discovered_ipv4 == ["192.168.1.1/24", "10.0.0.1/8"] + assert interface2.discovered_ipv4 == ["192.168.2.1/24"] + assert interface1.discovered_ipv6 == [] + assert interface2.discovered_ipv6 == [] + assert interface1.discovered_mac_address is None + assert interface2.discovered_mac_address is None + + node.clear_discovered_addresses() + + assert interface1.discovered_ipv4 is None + assert interface2.discovered_ipv4 is None + assert interface1.discovered_ipv6 is None + assert interface2.discovered_ipv6 is None + assert interface1.discovered_mac_address is None + assert interface2.discovered_mac_address is None + + respx_mock.assert_all_called() diff --git a/tests/test_configuration.py b/tests/test_configuration.py index 4edd44f9..3af2bab2 100644 --- a/tests/test_configuration.py +++ b/tests/test_configuration.py @@ -1,14 +1,19 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # import os +import warnings +from collections.abc import Iterator +from pathlib import Path +from unittest.mock import MagicMock, call import pytest from virl2_client import ClientLibrary -from virl2_client.models.configuration import _CONFIG_FILE_NAME +from virl2_client.exceptions import InitializationError +from virl2_client.virl2_client import ClientConfig _TEST_ENV = { "VIRL2_URL": "0.0.0.0", @@ -17,12 +22,15 @@ "VIRL_USERNAME": "test_admin", "VIRL2_PASS": "test_test123", "VIRL_PASSWORD": "test_test123", + "VIRL2_JWT": "test_jwt_token", + "CA_BUNDLE": "/path/to/ca-bundle.pem", + "CML_VERIFY_CERT": "1", } @pytest.fixture -def cwd_virlrc(tmp_path): - path = tmp_path / _CONFIG_FILE_NAME +def cwd_virlrc(tmp_path: Path) -> Iterator[Path]: + path = tmp_path / ClientConfig._CONFIG_FILE_NAME with path.open("w") as f: for name, value in _TEST_ENV.items(): f.write(f"{name}={value}\n") @@ -35,8 +43,8 @@ def cwd_virlrc(tmp_path): @pytest.fixture -def home_virlrc(tmp_path): - path = tmp_path / _CONFIG_FILE_NAME +def home_virlrc(tmp_path: Path) -> Iterator[Path]: + path = tmp_path / ClientConfig._CONFIG_FILE_NAME with path.open("w") as f: for name, value in _TEST_ENV.items(): f.write(f"{name}={value}\n") @@ -51,27 +59,266 @@ def home_virlrc(tmp_path): os.remove(path) -def test_local_virlrc(client_library_server_current, cwd_virlrc): +def test_local_virlrc(client_library_server_current: MagicMock, cwd_virlrc: Path): + _ = client_library_server_current, cwd_virlrc cl = ClientLibrary(ssl_verify=False) assert cl.is_system_ready() - assert all([cl.url, cl.username, cl.password]) + assert cl.url == f"https://{_TEST_ENV['VIRL2_URL']}" + assert cl.username == _TEST_ENV["VIRL2_USER"] + assert cl.password == _TEST_ENV["VIRL2_PASS"] + assert cl.jwtoken == _TEST_ENV["VIRL2_JWT"] -def test_export_credentials(client_library_server_current, monkeypatch): +def test_export_credentials( + client_library_server_current: MagicMock, monkeypatch: pytest.MonkeyPatch +): + _ = client_library_server_current for name, value in _TEST_ENV.items(): monkeypatch.setenv(name, value) cl = ClientLibrary(ssl_verify=False) assert cl.is_system_ready() - assert all([cl.url, cl.username, cl.password]) + assert cl.url == f"https://{_TEST_ENV['VIRL2_URL']}" + assert cl.username == _TEST_ENV["VIRL2_USER"] + assert cl.password == _TEST_ENV["VIRL2_PASS"] + assert cl.jwtoken == _TEST_ENV["VIRL2_JWT"] -def test_home_directory_virlrc(client_library_server_current, home_virlrc): +def test_home_directory_virlrc( + client_library_server_current: MagicMock, home_virlrc: Path +): + _ = client_library_server_current, home_virlrc cl = ClientLibrary(ssl_verify=False) assert cl.is_system_ready() - assert all([cl.url, cl.username, cl.password]) + assert cl.url == f"https://{_TEST_ENV['VIRL2_URL']}" + assert cl.username == _TEST_ENV["VIRL2_USER"] + assert cl.password == _TEST_ENV["VIRL2_PASS"] + assert cl.jwtoken == _TEST_ENV["VIRL2_JWT"] -def test_read_from_stdin(client_library_server_current): +def test_read_from_stdin(client_library_server_current: MagicMock): + _ = client_library_server_current with pytest.raises(OSError, match="reading from stdin"): _ = ClientLibrary(ssl_verify=False) + + +def test_get_configuration_uses_jwt_from_env(monkeypatch: pytest.MonkeyPatch): + monkeypatch.setenv("VIRL2_URL", _TEST_ENV["VIRL2_URL"]) + monkeypatch.setenv("VIRL2_JWT", _TEST_ENV["VIRL2_JWT"]) + + config = ClientConfig.get_configuration( + url=None, username=None, password=None, jwtoken=None, ssl_verify=None + ) + + assert config.url == _TEST_ENV["VIRL2_URL"] + assert config.jwtoken == _TEST_ENV["VIRL2_JWT"] + assert config.username is None + assert config.password is None + + +def test_get_configuration_uses_ca_bundle_for_ssl_verify( + monkeypatch: pytest.MonkeyPatch, +): + monkeypatch.setenv("VIRL2_URL", _TEST_ENV["VIRL2_URL"]) + monkeypatch.setenv("VIRL2_USER", _TEST_ENV["VIRL2_USER"]) + monkeypatch.setenv("VIRL2_PASS", _TEST_ENV["VIRL2_PASS"]) + monkeypatch.setenv("CA_BUNDLE", _TEST_ENV["CA_BUNDLE"]) + + config = ClientConfig.get_configuration( + url=None, username=None, password=None, jwtoken=None, ssl_verify=None + ) + + assert config.ssl_verify == _TEST_ENV["CA_BUNDLE"] + + +def test_get_configuration_uses_cml_verify_cert_for_ssl_verify( + monkeypatch: pytest.MonkeyPatch, +): + monkeypatch.setenv("VIRL2_URL", _TEST_ENV["VIRL2_URL"]) + monkeypatch.setenv("VIRL2_USER", _TEST_ENV["VIRL2_USER"]) + monkeypatch.setenv("VIRL2_PASS", _TEST_ENV["VIRL2_PASS"]) + monkeypatch.setenv("CML_VERIFY_CERT", _TEST_ENV["CML_VERIFY_CERT"]) + + config = ClientConfig.get_configuration( + url=None, username=None, password=None, jwtoken=None, ssl_verify=None + ) + + assert config.ssl_verify == _TEST_ENV["CML_VERIFY_CERT"] + + +@pytest.mark.parametrize( + "config", + [ + ClientConfig( + url="http://somehost", username="virl2", password="pa$$", allow_http=True + ), + ClientConfig( + url="https://somehost:443", + username="virl4", + password="somepass", + ssl_verify=False, + ), + ClientConfig( + url="https://somehost", + username="virl4", + password="somepass", + ssl_verify="/path.pem", + ), + ClientConfig( + url="https://somehost", username="virl4", password="somepass", auto_sync=-1 + ), + ClientConfig( + url="https://somehost", username="virl4", password="somepass", auto_sync=0.0 + ), + ClientConfig( + url="https://somehost", username="virl4", password="somepass", auto_sync=2.3 + ), + ClientConfig( + url="https://somehost", jwtoken="JWT_TOKEN", ssl_verify="/path.pem" + ), + ], +) +def test_client_library_config( + client_library_server_current: MagicMock, + mocked_session: MagicMock, + config: ClientConfig, +): + _ = client_library_server_current + mock_client = mocked_session.return_value + mock_client.get.return_value.json.return_value = { + "admin": False, + "username": config.username or "username", + "id": "6c7dd461-1cbe-428f-bdd5-545a0d766ed7", + "token": "BOGUS_TOKEN", + "error": None, + } + client_library = config.make_client() + assert client_library._session.base_url.path.startswith(config.url) + if config.username is not None: + assert client_library.username == config.username + else: + assert client_library.username == "username" + assert client_library.password == config.password + assert client_library.jwtoken == config.jwtoken + assert client_library.allow_http == config.allow_http + assert client_library._ssl_verify == config.ssl_verify + assert client_library.auto_sync == (config.auto_sync >= 0.0) + assert client_library.auto_sync_interval == config.auto_sync + assert client_library._session.mock_calls == [ + call.get("authentication"), + call.get().json(), + call.base_url.path.startswith(config.url), + call.base_url.path.startswith().__bool__(), + ] + + +@pytest.mark.parametrize( + "config_kwargs", + [ + # Missing URL + { + "url": None, + "username": "user", + "password": "pass", + "jwtoken": None, + "ssl_verify": False, + }, + # Missing authentication (no username/password and no JWT) + { + "url": "https://somehost", + "username": None, + "password": None, + "jwtoken": None, + "ssl_verify": False, + }, + # Username without password and no JWT + { + "url": "https://somehost", + "username": "user", + "password": None, + "jwtoken": None, + "ssl_verify": False, + }, + ], +) +@pytest.mark.parametrize("allow_inputs", [True, False, None]) +def test_deprecation_warning( + monkeypatch: pytest.MonkeyPatch, config_kwargs: dict, allow_inputs: bool | None +): + """Verify deprecation warning and interactive input behavior for allow_inputs. + + - When allow_inputs is None and stdin is not a TTY, a DeprecationWarning + should be emitted and interactive prompts should be used. + - When allow_inputs is False, no warning should be emitted and no + interactive prompts should be used. + - When allow_inputs is True, no warning should be emitted but interactive + prompts should be used. + """ + # Treat stdin as non-interactive to exercise the deprecation path when + # allow_inputs is None. + monkeypatch.setattr("sys.stdin.isatty", lambda: False) + + # Mock input() and getpass.getpass() so we don't actually read from stdin + # under pytest, while still tracking whether they were called. + calls: dict[str, int] = {"input": 0, "getpass": 0} + + def _fake_input(prompt: str) -> str: + calls["input"] += 1 + if "IP / hostname" in prompt: + return config_kwargs["url"] or "" + return config_kwargs["username"] or "" + + def _fake_getpass(_: str) -> str: + calls["getpass"] += 1 + return config_kwargs["password"] or "" + + monkeypatch.setattr("builtins.input", _fake_input) + monkeypatch.setattr("getpass.getpass", _fake_getpass) + + # Capture warnings while invoking get_configuration with the given + # allow_inputs setting. Some combinations still result in an + # InitializationError; that's fine for this test. + with warnings.catch_warnings(record=True) as caught: + with pytest.raises(InitializationError): + ClientConfig.get_configuration(**config_kwargs, allow_inputs=allow_inputs) + + got_deprecation = any(issubclass(w.category, DeprecationWarning) for w in caught) + assert got_deprecation == (allow_inputs is None) + + # Interactive prompts should only be used when allow_inputs is not False. + if allow_inputs is False: + assert calls["input"] == 0 + assert calls["getpass"] == 0 + else: + assert calls["input"] + calls["getpass"] > 0 + + orig_get_configuration = ClientConfig.get_configuration.__func__ + + def patched_get_configuration(*_): + # Always forward the parametrized allow_inputs from this test, + # regardless of what the caller passes (or omits). + return orig_get_configuration( + ClientConfig, **config_kwargs, allow_inputs=allow_inputs + ) + + monkeypatch.setattr( + ClientConfig, + "get_configuration", + classmethod(patched_get_configuration), + ) + + calls = {"input": 0, "getpass": 0} + + config = ClientConfig(**config_kwargs) + with warnings.catch_warnings(record=True) as caught: + with pytest.raises(InitializationError): + config.make_client() + + got_deprecation = any(issubclass(w.category, DeprecationWarning) for w in caught) + assert got_deprecation == (allow_inputs is None) + + if allow_inputs is False: + assert calls["input"] == 0 + assert calls["getpass"] == 0 + else: + assert calls["input"] + calls["getpass"] > 0 diff --git a/tests/test_definitions.py b/tests/test_definitions.py index 15c6f4d5..a8d4ab5b 100644 --- a/tests/test_definitions.py +++ b/tests/test_definitions.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform diff --git a/tests/test_image_upload.py b/tests/test_image_upload.py index 8e1d82d2..319f1d86 100644 --- a/tests/test_image_upload.py +++ b/tests/test_image_upload.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -21,6 +21,7 @@ import contextlib import pathlib +import sys from collections.abc import Iterator from io import BufferedReader from unittest.mock import ANY, MagicMock @@ -36,12 +37,8 @@ "file", ".text", ".qcow2", - "qcow.", "qcow2", "qcow", - ".qcow.", - ".file.", - "file.qcow.", ] NOT_SUPPORTED_LIST = [ " . ", @@ -67,13 +64,22 @@ "file.tar.gz", ] +# pathlib treats ending dot differently since Python 3.14 +to_extend = NOT_SUPPORTED_LIST if sys.version_info >= (3, 14) else WRONG_FORMAT_LIST +to_extend += [ + ".qcow.", + "qcow.", + ".file.", + "file.qcow.", +] + # This fixture is not meant to be used in tests - rather, it's here to easily manually # update files when the expected_pass_list is changed. Just change autouse to True, # then locally run test_image_upload_file, and this will generate all the files # in the expected_pass_list into test_data. @pytest.fixture -def create_test_files(test_data_dir): +def create_test_files(test_data_dir: pathlib.Path): for file_path in EXPECTED_PASS_LIST: path = test_data_dir / file_path path.write_text("test") @@ -95,6 +101,17 @@ def windows_path(path: str) -> Iterator[None]: @pytest.mark.parametrize( "test_path", ["", "/", "./", "./../", "test/test/", "/test/test/", "\\", "..\\..\\", "\\test\\"], + ids=[ + "empty", + "root", + "current_unix", + "parent_unix", + "relative_unix", + "absolute_unix", + "backslash", + "parent_windows", + "absolute_windows", + ], ) @pytest.mark.parametrize("rename", [None, "rename"]) @pytest.mark.parametrize( diff --git a/tests/test_node_staging.py b/tests/test_node_staging.py new file mode 100644 index 00000000..e3271f1b --- /dev/null +++ b/tests/test_node_staging.py @@ -0,0 +1,281 @@ +# +# This file is part of VIRL 2 +# Copyright (c) 2019-2026, Cisco Systems, Inc. +# All rights reserved. +# +# Python bindings for the Cisco VIRL 2 Network Simulation Platform +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from unittest.mock import MagicMock, Mock + +import pytest + +from virl2_client.models import Lab +from virl2_client.models.node import Node + +RESOURCE_POOL_MANAGER = Mock() +USER_MANAGEMENT = Mock() + + +def conditional_side_effect(*args, **kwargs): + _ = args + resp = kwargs.get("json", {}) + if node_staging := resp.get("node_staging"): + if not isinstance(node_staging.get("enabled", False), bool): + raise ValueError("Invalid value for enabled") + if not isinstance(node_staging.get("abort_on_failure", False), bool): + raise ValueError("Invalid value for abort_on_failure") + if not isinstance(node_staging.get("start_remaining", True), bool): + raise ValueError("Invalid value for start_remaining") + elif priority := resp.get("priority"): + if not isinstance(priority, int) or not 0 <= priority <= 10000: + raise ValueError("Invalid value for priority") + + +def test_node_staging_initial_values(): + """Test that new lab has correct initial node staging values.""" + session = MagicMock() + lab = Lab( + "test_lab", + "1", + session, + "user", + "pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + node = Node( + lab, + "node-id", + "node1", + "node-type", + ) + + assert lab._node_staging == { + "enabled": False, + "abort_on_failure": False, + "start_remaining": True, + } + assert lab.node_staging == { + "enabled": False, + "abort_on_failure": False, + "start_remaining": True, + } + assert node._priority is None + assert node.priority is None + + +def test_lab_node_staging_setter(): + """Test setting the node_staging parameter on a Lab instance.""" + session = MagicMock() + + lab = Lab( + title="Test Lab", + lab_id="lab-id", + session=session, + username="user", + password="pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + node = Node( + lab, + "node-id", + "node1", + "node-type", + ) + + lab.set_node_staging(enabled=True, abort_on_failure=True, start_remaining=False) + assert lab.node_staging == { + "enabled": True, + "abort_on_failure": True, + "start_remaining": False, + } + session.patch.assert_called_once_with( + "labs/lab-id", + json={ + "node_staging": { + "enabled": True, + "abort_on_failure": True, + "start_remaining": False, + } + }, + ) + session.patch.reset_mock() + + node.priority = 5 + session.patch.assert_called_once_with( + "labs/lab-id/nodes/node-id?exclude_configurations=false", + json={"priority": 5}, + ) + assert node.priority == 5 + + +def test_lab_node_staging_setter_invalid(): + """Test setting invalid node_staging parameters raises ValueError.""" + session = MagicMock() + session.patch.side_effect = conditional_side_effect + lab = Lab( + title="Test Lab", + lab_id="lab-id", + session=session, + username="user", + password="pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + node = Node( + lab, + "node-id", + "node1", + "node-type", + ) + + with pytest.raises(ValueError): + lab.set_node_staging(enabled="yes", abort_on_failure=True, start_remaining=True) + with pytest.raises(ValueError): + lab.set_node_staging(enabled=True, abort_on_failure="yes", start_remaining=True) + with pytest.raises(ValueError): + lab.set_node_staging(enabled=True, abort_on_failure=True, start_remaining="yes") + with pytest.raises(ValueError): + node.priority = "yes" + with pytest.raises(ValueError): + node.priority = -1 + with pytest.raises(ValueError): + node.priority = 10001 + + +def test_lab_node_staging_setter_no_change(): + """Test that setting node_staging to the same value does not trigger an API call.""" + session = MagicMock() + lab = Lab( + title="Test Lab", + lab_id="lab-id", + session=session, + username="user", + password="pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + lab._node_staging = { + "enabled": True, + "abort_on_failure": True, + "start_remaining": False, + } + node = Node( + lab, + "node-id", + "node1", + "node-type", + ) + node._priority = 5 + + lab.set_node_staging() + session.patch.assert_not_called() + + lab.set_node_staging(enabled=False, abort_on_failure=False, start_remaining=True) + session.patch.assert_called_once_with( + "labs/lab-id", + json={ + "node_staging": { + "enabled": False, + "abort_on_failure": False, + "start_remaining": True, + } + }, + ) + session.patch.reset_mock() + + node.priority = 5 + session.patch.assert_called_once_with( + "labs/lab-id/nodes/node-id?exclude_configurations=false", + json={"priority": 5}, + ) + session.patch.reset_mock() + + node.priority = 10 + session.patch.assert_called_once_with( + "labs/lab-id/nodes/node-id?exclude_configurations=false", + json={"priority": 10}, + ) + + +def test_lab_node_staging_setter_partial_update(): + """Test that setting only some node_staging parameters updates correctly.""" + session = MagicMock() + lab = Lab( + title="Test Lab", + lab_id="lab-id", + session=session, + username="user", + password="pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + + lab.set_node_staging(enabled=True) + assert lab.node_staging == { + "enabled": True, + "abort_on_failure": False, + "start_remaining": True, + } + session.patch.assert_called_with( + "labs/lab-id", + json={ + "node_staging": { + "enabled": True, + "abort_on_failure": False, + "start_remaining": True, + } + }, + ) + + lab.set_node_staging(abort_on_failure=True) + assert lab.node_staging == { + "enabled": True, + "abort_on_failure": True, + "start_remaining": True, + } + session.patch.assert_called_with( + "labs/lab-id", + json={ + "node_staging": { + "enabled": True, + "abort_on_failure": True, + "start_remaining": True, + } + }, + ) + + lab.set_node_staging(start_remaining=False) + assert lab.node_staging == { + "enabled": True, + "abort_on_failure": True, + "start_remaining": False, + } + session.patch.assert_called_with( + "labs/lab-id", + json={ + "node_staging": { + "enabled": True, + "abort_on_failure": True, + "start_remaining": False, + } + }, + ) diff --git a/tests/test_pcap.py b/tests/test_pcap.py new file mode 100644 index 00000000..0ac55518 --- /dev/null +++ b/tests/test_pcap.py @@ -0,0 +1,167 @@ +# +# This file is part of VIRL 2 +# Copyright (c) 2019-2026, Cisco Systems, Inc. +# All rights reserved. +# +# Python bindings for the Cisco VIRL 2 Network Simulation Platform +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from unittest.mock import Mock + +import pytest +import respx + +from virl2_client.models.link import Link + + +@pytest.fixture +def mock_link(): + """Create a mock link with mocked session for testing.""" + mock_session = Mock() + mock_lab = Mock() + mock_lab._url_for.return_value = "labs/test-lab" + mock_interface_a = Mock() + mock_interface_b = Mock() + + link = Link(mock_lab, "test-link", mock_interface_a, mock_interface_b) + link._session = mock_session + return link + + +def test_url_templates_exist(): + """Test that all required URL templates are defined.""" + required_templates = ["capture_start", "capture_stop", "capture_status"] + + for template in required_templates: + assert template in Link._URL_TEMPLATES + assert "{lab}/links/{id}/capture/" in Link._URL_TEMPLATES[template] + + +@respx.mock +def test_start_capture_with_params(mock_link): + """Test start_capture with explicit parameters.""" + expected_response = { + "config": { + "link_capture_key": mock_link.id, + "maxpackets": 100, + "encap": "ethernet", + }, + "starttime": "2026-01-12T10:00:00Z", + "packetscaptured": 0, + } + + mock_link._session.put.return_value.json.return_value = expected_response + + result = mock_link.start_capture(maxpackets=100) + + assert result == expected_response + assert result["config"]["maxpackets"] == 100 + assert result["config"]["link_capture_key"] == mock_link.id + + +@respx.mock +def test_start_capture_defaults(mock_link): + """Test start_capture without parameters uses server defaults.""" + expected_response = { + "config": { + "link_capture_key": mock_link.id, + "maxpackets": 1000000, + "maxtime": 86400, + "encap": "ethernet", + }, + "starttime": "2026-01-12T10:00:00Z", + "packetscaptured": 0, + } + + mock_link._session.put.return_value.json.return_value = expected_response + + result = mock_link.start_capture() + + assert result == expected_response + assert result["config"]["maxpackets"] == 1000000 + assert result["config"]["maxtime"] == 86400 + assert result["config"]["link_capture_key"] == mock_link.id + + +@respx.mock +def test_capture_status(mock_link): + """Test capture_status with mocked HTTP call.""" + expected_status = { + "config": { + "link_capture_key": mock_link.id, + "maxpackets": 200, + "encap": "ethernet", + }, + "starttime": "2026-01-12T09:30:00Z", + "packetscaptured": 15, + } + + mock_link._session.get.return_value.json.return_value = expected_status + + result = mock_link.capture_status() + + assert result == expected_status + assert result["packetscaptured"] == 15 + assert result["config"]["link_capture_key"] == mock_link.id + + +@respx.mock +def test_stop_capture(mock_link): + """Test stop_capture with mocked HTTP call.""" + mock_link._session.put.return_value = Mock() + + result = mock_link.stop_capture() + + mock_link._session.put.assert_called_once() + assert result is None + + +@respx.mock +def test_download_capture(mock_link): + """Test download_capture.""" + expected_content = b"PCAP file content" + mock_link._session.get.return_value.content = expected_content + + result = mock_link.download_capture() + + mock_link._session.get.assert_called_once() + assert result == expected_content + + +@respx.mock +def test_get_capture_packets(mock_link): + """Test get_capture_packets with mocked HTTP call.""" + expected_packets = [ + {"packet": {"timestamp": "2026-01-12T10:00:01Z", "size": 64}}, + {"packet": {"timestamp": "2026-01-12T10:00:02Z", "size": 128}}, + ] + mock_link._session.get.return_value.json.return_value = expected_packets + + result = mock_link.get_capture_packets() + + assert result == expected_packets + assert len(result) == 2 + + +@respx.mock +def test_get_capture_packet(mock_link): + """Test download_capture_packet with mocked HTTP call.""" + # the actual PDML is rather large + expected_packet_data = {"proto": []} + mock_link._session.get.return_value.json.return_value = expected_packet_data + + result = mock_link.get_capture_packet(packet_id=5) + + assert result == expected_packet_data diff --git a/tests/test_pyats.py b/tests/test_pyats.py new file mode 100644 index 00000000..d2673873 --- /dev/null +++ b/tests/test_pyats.py @@ -0,0 +1,176 @@ +# +# This file is part of VIRL 2 +# Copyright (c) 2019-2026, Cisco Systems, Inc. +# All rights reserved. +# +# Python bindings for the Cisco VIRL 2 Network Simulation Platform +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from unittest.mock import MagicMock, Mock + +import pytest + +from virl2_client.models import Lab +from virl2_client.models.node import Node + +RESOURCE_POOL_MANAGER = Mock() +USER_MANAGEMENT = Mock() + + +@pytest.fixture +def session() -> MagicMock: + """Mocked HTTP session used by Lab/Node instances.""" + return MagicMock() + + +@pytest.fixture +def node(request: pytest.FixtureRequest, session: MagicMock) -> Node: + """Create a Node (and Lab) for a given initial pyATS mapping. + + The parametrized value for this fixture (via ``indirect=["node"]``) + is interpreted as the initial ``pyats`` dict or ``None``. + """ + + initial_pyats: dict | None = getattr(request, "param", None) + lab = Lab( + "test_lab", + "lab-id", + session, + "user", + "pass", + auto_sync=False, + resource_pool_manager=RESOURCE_POOL_MANAGER, + user_management=USER_MANAGEMENT, + ) + node_kwargs = {"pyats": initial_pyats} if initial_pyats is not None else {} + return Node( + lab, + "node-id", + "node1", + "node-type", + **node_kwargs, + ) + + +@pytest.mark.parametrize( + "node, initial_pyats, expected_pyats", + [ + # default: nothing set + (None, {}, {"username": None, "password": None, "enable_password": None}), + # set only username from default + ( + None, + {"username": "pyuser"}, + {"username": "pyuser", "password": None, "enable_password": None}, + ), + # set only password from default + ( + None, + {"password": "pypass"}, + {"username": None, "password": "pypass", "enable_password": None}, + ), + # set both from default + ( + None, + {"username": "pyuser", "password": "pypass"}, + {"username": "pyuser", "password": "pypass", "enable_password": None}, + ), + # set only enable_password from default + ( + None, + {"enable_password": "enpass"}, + {"username": None, "password": None, "enable_password": "enpass"}, + ), + # explicitly clear username and password back to None + ( + {"username": "u", "password": "p"}, + {"username": None, "password": None}, + {"username": None, "password": None}, + ), + # change only username, leaving password as-is (non-None) + ( + {"username": "old", "password": "p"}, + {"username": "new"}, + {"username": "new", "password": "p"}, + ), + # change only password, leaving username as-is (non-None) + ( + {"username": "u", "password": "old"}, + {"password": "new"}, + {"username": "u", "password": "new"}, + ), + # set username to None while keeping existing password + ( + {"username": "u", "password": "p"}, + {"username": None}, + {"username": None, "password": "p"}, + ), + # set password to None while keeping existing username + ( + {"username": "u", "password": "p"}, + {"password": None}, + {"username": "u", "password": None}, + ), + # set enable_password on node that already has enable_password + ( + {"username": "u", "password": "p", "enable_password": None}, + {"enable_password": "enpass"}, + {"username": "u", "password": "p", "enable_password": "enpass"}, + ), + # clear enable_password back to None + ( + {"username": "u", "password": "p", "enable_password": "enpass"}, + {"enable_password": None}, + {"username": "u", "password": "p", "enable_password": None}, + ), + ], + ids=[ + "default", + "set_username_only", + "set_password_only", + "set_both", + "set_enable_password_only", + "clear_both", + "change_username_only", + "change_password_only", + "set_username_none", + "set_password_none", + "set_enable_password_from_existing", + "clear_enable_password", + ], + indirect=["node"], +) +def test_node_pyats_credentials_parametrized( + session: MagicMock, + node: Node, + initial_pyats: dict[str, str | None], + expected_pyats: dict[str, str | None], +) -> None: + """Verify pyATS credential updates, including None handling, in one place.""" + if initial_pyats: + node.set_pyats_credentials(**initial_pyats) + + assert node.pyats_credentials == expected_pyats + + # Default case (no kwargs) should not call the API at all. + if not initial_pyats: + session.patch.assert_not_called() + return + + # For updates, ensure the correct payload goes out. + session.patch.assert_called_once_with( + "labs/lab-id/nodes/node-id?exclude_configurations=false", + json={"pyats": expected_pyats}, + ) diff --git a/tests/test_system_lab_repositories.py b/tests/test_system_lab_repositories.py new file mode 100644 index 00000000..bbc43fd4 --- /dev/null +++ b/tests/test_system_lab_repositories.py @@ -0,0 +1,410 @@ +# +# This file is part of VIRL 2 +# Copyright (c) 2019-2026, Cisco Systems, Inc. +# All rights reserved. +# +# Python bindings for the Cisco VIRL 2 Network Simulation Platform +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import time +from unittest.mock import Mock, patch + +import httpx +import pytest +import respx + +from virl2_client.exceptions import LabRepositoryNotFound +from virl2_client.models.lab_repository import LabRepository, LabRepositoryManagement +from virl2_client.models.system import SystemManagement +from virl2_client.virl2_client import ClientLibrary + +MOCK_LAB_REPOSITORY_1 = { + "id": "repo-123", + "url": "https://github.com/cisco/lab-templates.git", + "name": "cisco-templates", + "folder": "cisco_labs", +} + +MOCK_LAB_REPOSITORY_2 = { + "id": "repo-456", + "url": "https://github.com/example/custom-labs.git", + "name": "custom-labs", + "folder": "custom_folder", +} + +MOCK_LAB_REPOSITORIES_LIST = [MOCK_LAB_REPOSITORY_1, MOCK_LAB_REPOSITORY_2] + + +@pytest.fixture +def mock_lab_repository_management(): + session_mock = Mock() + system_mock = Mock() + lab_repo_mgmt = LabRepositoryManagement(system_mock, session_mock, auto_sync=False) + return lab_repo_mgmt + + +@pytest.fixture +def mock_system_management(): + session_mock = Mock() + system = SystemManagement(session=session_mock, auto_sync=False) + return system + + +@pytest.fixture +def system_with_repos(mock_lab_repository_management): + lab_repo_mgmt = mock_lab_repository_management + for repo_data in MOCK_LAB_REPOSITORIES_LIST: + lab_repo_mgmt.add_lab_repository_local(**repo_data) + return lab_repo_mgmt + + +def test_lab_repository_initialization(mock_system_management): + """Test that LabRepository initializes correctly.""" + repo = LabRepository( + system=mock_system_management, + id="test-id", + url="https://github.com/test/repo.git", + name="test-repo", + folder="test_folder", + ) + + assert repo.id == "test-id" + assert repo._url == "https://github.com/test/repo.git" + assert repo._name == "test-repo" + assert repo._folder == "test_folder" + assert repo._system is mock_system_management + assert str(repo) == "Lab repository: test-repo" + + +def test_lab_repository_properties_sync_behavior(mock_system_management): + """Test property access sync behavior - sync for mutable properties, not for id.""" + repo = LabRepository( + system=mock_system_management, + id="test-id", + url="https://github.com/test/repo.git", + name="test-repo", + folder="test_folder", + ) + + mock_system_management.sync_lab_repositories_if_outdated = Mock() + + _ = repo.id + mock_system_management.sync_lab_repositories_if_outdated.assert_not_called() + + _ = repo.url + assert mock_system_management.sync_lab_repositories_if_outdated.call_count == 1 + + _ = repo.name + assert mock_system_management.sync_lab_repositories_if_outdated.call_count == 2 + + _ = repo.folder + assert mock_system_management.sync_lab_repositories_if_outdated.call_count == 3 + + +def test_lab_repository_remove(mock_lab_repository_management): + """Test remove method calls system's DELETE API""" + lab_repo_mgmt = mock_lab_repository_management + repo = LabRepository( + system=lab_repo_mgmt, + id="test-id", + url="https://github.com/test/repo.git", + name="test-repo", + folder="test_folder", + ) + + lab_repo_mgmt._lab_repositories["test-id"] = repo + + repo._url_for = Mock(return_value="lab_repos/test-id") + repo.remove() + lab_repo_mgmt._session.delete.assert_called_once_with("lab_repos/test-id") + + assert "test-id" not in lab_repo_mgmt._lab_repositories + + +def test_lab_repositories_property_behavior(mock_lab_repository_management): + """Test lab_repositories property triggers sync and returns a copy.""" + lab_repo_mgmt = mock_lab_repository_management + lab_repo_mgmt.sync_lab_repositories_if_outdated = Mock() + + lab_repo_mgmt._lab_repositories = { + "repo-123": Mock(), + "repo-456": Mock(), + } + + result = lab_repo_mgmt.lab_repositories + lab_repo_mgmt.sync_lab_repositories_if_outdated.assert_called_once() + + assert result is not lab_repo_mgmt._lab_repositories + assert len(result) == 2 + + +def test_sync_lab_repositories_if_outdated_conditions(mock_lab_repository_management): + """Test sync_lab_repositories_if_outdated behavior under different conditions.""" + lab_repo_mgmt = mock_lab_repository_management + lab_repo_mgmt.sync_lab_repositories = Mock() + + # Test 1: Auto-sync disabled - should not sync + lab_repo_mgmt.auto_sync = False + lab_repo_mgmt._last_sync_lab_repository_time = 0.0 + lab_repo_mgmt.sync_lab_repositories_if_outdated() + lab_repo_mgmt.sync_lab_repositories.assert_not_called() + + # Test 2: Auto-sync enabled, recent sync - should not sync + lab_repo_mgmt.auto_sync = True + lab_repo_mgmt.auto_sync_interval = 1.0 + lab_repo_mgmt._last_sync_lab_repository_time = time.time() + lab_repo_mgmt.sync_lab_repositories_if_outdated() + lab_repo_mgmt.sync_lab_repositories.assert_not_called() + + # Test 3: Auto-sync enabled, outdated - should sync + lab_repo_mgmt._last_sync_lab_repository_time = 0.0 + lab_repo_mgmt.sync_lab_repositories_if_outdated() + lab_repo_mgmt.sync_lab_repositories.assert_called_once() + + +def test_add_lab_repository_local(mock_lab_repository_management): + """Test add_lab_repository_local creates and stores LabRepository.""" + lab_repo_mgmt = mock_lab_repository_management + + repo = lab_repo_mgmt.add_lab_repository_local(**MOCK_LAB_REPOSITORY_1) + + assert isinstance(repo, LabRepository) + assert repo.id == "repo-123" + assert repo._url == "https://github.com/cisco/lab-templates.git" + assert repo._name == "cisco-templates" + assert repo._folder == "cisco_labs" + + assert "repo-123" in lab_repo_mgmt._lab_repositories + assert lab_repo_mgmt._lab_repositories["repo-123"] is repo + + +def test_get_lab_repository_success_and_failure(system_with_repos): + """Test get_lab_repository for both success and failure cases.""" + lab_repo_mgmt = system_with_repos + lab_repo_mgmt.sync_lab_repositories_if_outdated = Mock() + + repo = lab_repo_mgmt.get_lab_repository("repo-123") + assert repo.id == "repo-123" + assert repo._name == "cisco-templates" + + with pytest.raises(LabRepositoryNotFound) as exc_info: + lab_repo_mgmt.get_lab_repository("nonexistent-repo") + assert "nonexistent-repo" in str(exc_info.value) + + +def test_get_lab_repository_by_name_success_and_failure(system_with_repos): + """Test get_lab_repository_by_name for both success and failure cases.""" + lab_repo_mgmt = system_with_repos + lab_repo_mgmt.sync_lab_repositories_if_outdated = Mock() + + repo = lab_repo_mgmt.get_lab_repository_by_name("cisco-templates") + assert repo.id == "repo-123" + assert repo._name == "cisco-templates" + + with pytest.raises(LabRepositoryNotFound) as exc_info: + lab_repo_mgmt.get_lab_repository_by_name("non-existent-name") + assert "non-existent-name" in str(exc_info.value) + + +def test_get_lab_repositories_api_call(mock_lab_repository_management): + """Test get_lab_repositories makes correct API call.""" + lab_repo_mgmt = mock_lab_repository_management + + mock_response = Mock() + mock_response.json.return_value = MOCK_LAB_REPOSITORIES_LIST + lab_repo_mgmt._session.get.return_value = mock_response + + lab_repo_mgmt._url_for = Mock(return_value="lab_repos") + + result = lab_repo_mgmt.get_lab_repositories() + + assert result == MOCK_LAB_REPOSITORIES_LIST + lab_repo_mgmt._url_for.assert_called_once_with("lab_repos") + lab_repo_mgmt._session.get.assert_called_once_with("lab_repos") + + +def test_add_lab_repository_api_call(mock_lab_repository_management): + """Test add_lab_repository makes correct API call and updates local storage.""" + lab_repo_mgmt = mock_lab_repository_management + + mock_response = Mock() + mock_response.json.return_value = MOCK_LAB_REPOSITORY_1 + lab_repo_mgmt._session.post.return_value = mock_response + + lab_repo_mgmt._url_for = Mock(return_value="lab_repos") + lab_repo_mgmt.add_lab_repository_local = Mock(return_value=Mock()) + + result = lab_repo_mgmt.add_lab_repository( + url="https://github.com/cisco/lab-templates.git", + name="cisco-templates", + folder="cisco_labs", + ) + + assert result == MOCK_LAB_REPOSITORY_1 + lab_repo_mgmt._url_for.assert_called_once_with("lab_repos") + expected_data = { + "url": "https://github.com/cisco/lab-templates.git", + "name": "cisco-templates", + "folder": "cisco_labs", + } + lab_repo_mgmt._session.post.assert_called_once_with("lab_repos", json=expected_data) + + lab_repo_mgmt.add_lab_repository_local.assert_called_once_with( + **MOCK_LAB_REPOSITORY_1 + ) + + +def test_refresh_lab_repositories_api_call(mock_lab_repository_management): + """Test refresh_lab_repositories makes correct API call.""" + lab_repo_mgmt = mock_lab_repository_management + + refresh_response = { + "repo-123": {"status": "success", "message": "Updated successfully"}, + "repo-456": {"status": "error", "message": "Failed to pull"}, + } + mock_response = Mock() + mock_response.json.return_value = refresh_response + lab_repo_mgmt._session.put.return_value = mock_response + + lab_repo_mgmt._url_for = Mock(return_value="lab_repos/refresh") + result = lab_repo_mgmt.refresh_lab_repositories() + + assert result == refresh_response + lab_repo_mgmt._url_for.assert_called_once_with("lab_repos_refresh") + lab_repo_mgmt._session.put.assert_called_once_with("lab_repos/refresh") + + +@patch("time.time") +def test_sync_lab_repositories_behavior(mock_time, mock_lab_repository_management): + """Test sync_lab_repositories preserves existing, adds new, and removes deleted repos.""" + mock_time.return_value = 1234567890.0 + lab_repo_mgmt = mock_lab_repository_management + + lab_repo_mgmt.add_lab_repository_local(**MOCK_LAB_REPOSITORY_1) + lab_repo_mgmt.add_lab_repository_local(**MOCK_LAB_REPOSITORY_2) + + new_repo_data = { + "id": "repo-789", + "url": "https://github.com/new/repo.git", + "name": "new-repo", + "folder": "new_folder", + } + + mock_response = Mock() + mock_response.json.return_value = [MOCK_LAB_REPOSITORY_1, new_repo_data] + lab_repo_mgmt._session.get.return_value = mock_response + lab_repo_mgmt._url_for = Mock(return_value="lab_repos") + + original_repo_123 = lab_repo_mgmt._lab_repositories["repo-123"] + original_name = original_repo_123.name + + lab_repo_mgmt.sync_lab_repositories() + + assert lab_repo_mgmt._lab_repositories["repo-123"] is original_repo_123 + assert original_repo_123.name == original_name + + assert "repo-789" in lab_repo_mgmt._lab_repositories + assert lab_repo_mgmt._lab_repositories["repo-789"].name == "new-repo" + + assert "repo-456" not in lab_repo_mgmt._lab_repositories + + assert len(lab_repo_mgmt._lab_repositories) == 2 + + assert lab_repo_mgmt._last_sync_lab_repository_time == 1234567890.0 + + +def test_lab_repository_not_found_exception(): + """Test LabRepositoryNotFound exception behavior and inheritance.""" + from virl2_client.exceptions import ElementNotFound + + exc = LabRepositoryNotFound("test-repo-id") + assert "test-repo-id" in str(exc) + assert isinstance(exc, ElementNotFound) + assert isinstance(exc, KeyError) + + +@respx.mock +def test_lab_repository_end_to_end_workflow(): + """Test complete workflow using LabRepositoryManagement directly.""" + respx.post("https://localhost/api/v0/authenticate").respond(json="fake_token") + respx.get("https://localhost/api/v0/authentication").respond( + 200, + json={ + "username": "username", + "id": "6c7dd461-1cbe-428f-bdd5-545a0d766ed7", + "token": "BOGUS_TOKEN", + "admin": True, + "error": None, + }, + ) + + respx.get("https://localhost/api/v0/system_information").respond( + json={"version": "2.10.0"} + ) + + deleted = [False] + + def get_lab_repos_response(request): + if deleted[0]: + return httpx.Response(200, json=[]) + elif len(respx.calls) >= 4: + return httpx.Response(200, json=[MOCK_LAB_REPOSITORY_1]) + else: + return httpx.Response(200, json=[]) + + def delete_lab_repo_response(request): + deleted[0] = True + return httpx.Response(200) + + respx.get("https://localhost/api/v0/lab_repos").mock( + side_effect=get_lab_repos_response + ) + respx.post("https://localhost/api/v0/lab_repos").respond(json=MOCK_LAB_REPOSITORY_1) + respx.delete("https://localhost/api/v0/lab_repos/repo-123").mock( + side_effect=delete_lab_repo_response + ) + + client = ClientLibrary("https://localhost", "admin", "admin") + + lab_repo_mgmt = LabRepositoryManagement( + system=client.system_management, + session=client._session, + auto_sync=True, + auto_sync_interval=0.001, + ) + + repos = lab_repo_mgmt.lab_repositories + assert len(repos) == 0 + + result = lab_repo_mgmt.add_lab_repository( + url="https://github.com/cisco/lab-templates.git", + name="cisco-templates", + folder="cisco_labs", + ) + assert result == MOCK_LAB_REPOSITORY_1 + + repo = lab_repo_mgmt.get_lab_repository("repo-123") + assert repo.id == "repo-123" + assert repo.name == "cisco-templates" + + repo_by_name = lab_repo_mgmt.get_lab_repository_by_name("cisco-templates") + assert repo_by_name.id == "repo-123" + + repo.remove() + + lab_repo_mgmt.sync_lab_repositories() + + with pytest.raises(LabRepositoryNotFound): + lab_repo_mgmt.get_lab_repository("repo-123") diff --git a/virl2_client/__init__.py b/virl2_client/__init__.py index a64fe9c3..c15de5b7 100644 --- a/virl2_client/__init__.py +++ b/virl2_client/__init__.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform diff --git a/virl2_client/event_handling.py b/virl2_client/event_handling.py index e7f47ad5..36e0a608 100644 --- a/virl2_client/event_handling.py +++ b/virl2_client/event_handling.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -313,8 +313,7 @@ def _handle_element_modified(self, event: Event) -> None: event.element._update(event.data, push_to_server=False) elif event.element_type == "link": - # only sends link_capture_key which is not used by the client, - # so we discard the message + # not used by the client so we discard the message pass else: diff --git a/virl2_client/event_listening.py b/virl2_client/event_listening.py index a244aa0c..163ee4d6 100644 --- a/virl2_client/event_listening.py +++ b/virl2_client/event_listening.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -169,7 +169,7 @@ async def _ws_client(self): _LOGGER.info("Connected successfully") self._ws_close = ws.close() self._ws_connected_event.set() - async for msg in ws: # type: aiohttp.WSMessage + async for msg in ws: self._queue.put_nowait(msg.data) except aiohttp.ClientError: _LOGGER.error("Connection closed unexpectedly", exc_info=True) diff --git a/virl2_client/exceptions.py b/virl2_client/exceptions.py index 7535a0d0..760f45e4 100644 --- a/virl2_client/exceptions.py +++ b/virl2_client/exceptions.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -60,6 +60,10 @@ class LabNotFound(ElementNotFound): pass +class LabRepositoryNotFound(ElementNotFound): + pass + + class InvalidContentType(VirlException): pass @@ -76,11 +80,15 @@ class InvalidProperty(VirlException): pass +class InvalidTopologySchema(VirlException): + pass + + class MethodNotActive(VirlException): pass -class PyatsException(Exception): +class PyatsException(VirlException): pass @@ -93,7 +101,8 @@ class PyatsDeviceNotFound(PyatsException): class ControllerNotFound(VirlException): - message = "Controller not found" + def __init__(self) -> None: + super().__init__("Controller not found") class APIError(VirlException, httpx.HTTPStatusError): diff --git a/virl2_client/models/__init__.py b/virl2_client/models/__init__.py index 7fed7659..50e2723c 100644 --- a/virl2_client/models/__init__.py +++ b/virl2_client/models/__init__.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -28,6 +28,7 @@ from .group import GroupManagement from .interface import Interface from .lab import Lab +from .lab_repository import LabRepository, LabRepositoryManagement from .licensing import Licensing from .link import Link from .node import Node @@ -40,6 +41,8 @@ __all__ = ( "Interface", "Lab", + "LabRepository", + "LabRepositoryManagement", "Link", "Node", "NodeImageDefinitions", diff --git a/virl2_client/models/annotation.py b/virl2_client/models/annotation.py index 9c6a928a..fc821fc4 100644 --- a/virl2_client/models/annotation.py +++ b/virl2_client/models/annotation.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -21,7 +21,7 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING, Any, Literal +from typing import TYPE_CHECKING, Any, Literal, Union from ..exceptions import InvalidProperty from ..utils import _deprecated_argument, check_stale, get_url_from_template, locked @@ -33,13 +33,13 @@ from .lab import Lab AnnotationTypeString = Literal["text", "line", "ellipse", "rectangle"] - AnnotationType = ( - "Annotation" - | "AnnotationRectangle" - | "AnnotationEllipse" - | "AnnotationLine" - | "AnnotationText" - ) + AnnotationType = Union[ + "Annotation", + "AnnotationRectangle", + "AnnotationEllipse", + "AnnotationLine", + "AnnotationText", + ] _LOGGER = logging.getLogger(__name__) @@ -115,12 +115,91 @@ _ANNOTATION_TYPES = ["text", "line", "ellipse", "rectangle"] +class _CoordinateXY2Mixin: + """Mixin providing x2/y2 coordinate properties for annotation subclasses.""" + + @property + def x2(self) -> int: + """X2 coordinate. + + :returns: The x2 coordinate value. + """ + self._lab.sync_topology_if_outdated() + return self._x2 + + @x2.setter + @locked + def x2(self, value: int) -> None: + """Set x2 coordinate. + + :param value: The x2 coordinate value to set. + """ + self._set_annotation_property("x2", value) + self._x2 = value + + @property + def y2(self) -> int: + """Y2 coordinate. + + :returns: The y2 coordinate value. + """ + self._lab.sync_topology_if_outdated() + return self._y2 + + @y2.setter + @locked + def y2(self, value: int) -> None: + """Set y2 coordinate. + + :param value: The y2 coordinate value to set. + """ + self._set_annotation_property("y2", value) + self._y2 = value + + +class _RotationMixin: + """Mixin providing rotation property for annotation subclasses.""" + + @property + def rotation(self) -> int: + """Rotation of an object, in degrees. + + :returns: The rotation value in degrees. + """ + self._lab.sync_topology_if_outdated() + return self._rotation + + @rotation.setter + @locked + def rotation(self, value: int) -> None: + """Set rotation of an object, in degrees. + + :param value: The rotation value in degrees to set. + """ + self._set_annotation_property("rotation", value) + self._rotation = value + + class Annotation: _URL_TEMPLATES = { "annotations": "labs/{lab_id}/annotations", "annotation": "labs/{lab_id}/annotations/{annotation_id}", } + _VALID_KEYS: frozenset[str] = frozenset( + { + "id", + "type", + "border_color", + "border_style", + "color", + "thickness", + "x1", + "y1", + "z_index", + } + ) + def __init__( self, lab: Lab, @@ -130,7 +209,7 @@ def __init__( """ A VIRL2 lab annotation. - :param lab: The lab object to which the link belongs. + :param lab: The lab object to which the annotation belongs. :param annotation_id: The ID of the annotation. :param annotation_type: annotation type (text, line, ellipse, rectangle) """ @@ -298,7 +377,7 @@ def get_default_property_values(cls, annotation_type: str) -> dict[str, Any]: for ppty in ANNOTATION_PROPERTY_MAP: if ppty == "type": continue - if not ANNOTATION_MAP[annotation_type] & ANNOTATION_PROPERTY_MAP[ppty]: + if not cls._is_property_valid_for_type(annotation_type, ppty): continue ppty_default = ANNOTATION_PROPERTIES_DEFAULTS[ppty] if isinstance(ppty_default, dict): @@ -309,17 +388,22 @@ def get_default_property_values(cls, annotation_type: str) -> dict[str, Any]: @classmethod def is_valid_property( - cls, - annotation_type: AnnotationTypeString, - _property: str, + cls, annotation_type: AnnotationTypeString, _property: str ) -> bool: """Check if the given property is recognized by the selected annotation type.""" - try: - assert annotation_type in _ANNOTATION_TYPES - assert _property in ANNOTATION_PROPERTY_MAP - except AssertionError: - return False - return ANNOTATION_MAP[annotation_type] & ANNOTATION_PROPERTY_MAP[_property] > 0 + return ( + annotation_type in _ANNOTATION_TYPES + and _property in ANNOTATION_PROPERTY_MAP + and cls._is_property_valid_for_type(annotation_type, _property) + ) + + @classmethod + def _is_property_valid_for_type( + cls, annotation_type: AnnotationTypeString, _property: str + ) -> bool: + return bool( + ANNOTATION_MAP[annotation_type] & ANNOTATION_PROPERTY_MAP[_property] + ) @locked def as_dict(self) -> dict[str, Any]: @@ -372,9 +456,8 @@ def _update(self, annotation_data: dict[str, Any], push_to_server: bool) -> None raise ValueError("Can't change annotation type.") # make sure all properties we want to update are valid - existing_keys = dir(self) for key in annotation_data: - if key not in existing_keys: + if key not in self._VALID_KEYS: raise InvalidProperty(f"Invalid annotation property: {key}") if push_to_server: @@ -407,11 +490,15 @@ def _set_annotation_properties(self, annotation_data: dict[str, Any]) -> None: # ~~~~~< Annotation subclasses >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class AnnotationRectangle(Annotation): +class AnnotationRectangle(_CoordinateXY2Mixin, _RotationMixin, Annotation): """ Annotation class representing rectangle annotation. """ + _VALID_KEYS = Annotation._VALID_KEYS | frozenset( + {"border_radius", "x2", "y2", "rotation"} + ) + def __init__( self, lab: Lab, @@ -443,51 +530,14 @@ def border_radius(self, value: int) -> None: self._set_annotation_property("border_radius", value) self._border_radius = value - @property - def x2(self) -> int: - """X2 coordinate.""" - self._lab.sync_topology_if_outdated() - return self._x2 - - @x2.setter - @locked - def x2(self, value: int) -> None: - """Set x2 coordinate.""" - self._set_annotation_property("x2", value) - self._x2 = value - - @property - def y2(self) -> int: - """Y2 coordinate.""" - self._lab.sync_topology_if_outdated() - return self._y2 - - @y2.setter - @locked - def y2(self, value: int) -> None: - """Set y2 coordinate.""" - self._set_annotation_property("y2", value) - self._y2 = value - - @property - def rotation(self) -> int: - """Rotation of an object, in degrees.""" - self._lab.sync_topology_if_outdated() - return self._rotation - - @rotation.setter - @locked - def rotation(self, value: int) -> None: - """Set rotation of an object, in degrees.""" - self._set_annotation_property("rotation", value) - self._rotation = value - -class AnnotationEllipse(Annotation): +class AnnotationEllipse(_CoordinateXY2Mixin, _RotationMixin, Annotation): """ Annotation class representing ellipse annotation. """ + _VALID_KEYS = Annotation._VALID_KEYS | frozenset({"x2", "y2", "rotation"}) + def __init__( self, lab: Lab, @@ -505,51 +555,16 @@ def __init__( if annotation_data: self._update(annotation_data, push_to_server=False) - @property - def x2(self) -> int: - """X2 coordinate.""" - self._lab.sync_topology_if_outdated() - return self._x2 - - @x2.setter - @locked - def x2(self, value: int) -> None: - """Set x2 coordinate.""" - self._set_annotation_property("x2", value) - self._x2 = value - - @property - def y2(self) -> int: - """Y2 coordinate.""" - self._lab.sync_topology_if_outdated() - return self._y2 - - @y2.setter - @locked - def y2(self, value: int) -> None: - """Set y2 coordinate.""" - self._set_annotation_property("y2", value) - self._y2 = value - - @property - def rotation(self) -> int: - """Rotation of an object, in degrees.""" - self._lab.sync_topology_if_outdated() - return self._rotation - - @rotation.setter - @locked - def rotation(self, value: int) -> None: - """Set rotation of an object, in degrees.""" - self._set_annotation_property("rotation", value) - self._rotation = value - -class AnnotationLine(Annotation): +class AnnotationLine(_CoordinateXY2Mixin, Annotation): """ Annotation class representing line annotation. """ + _VALID_KEYS = Annotation._VALID_KEYS | frozenset( + {"x2", "y2", "line_start", "line_end"} + ) + def __init__( self, lab: Lab, @@ -568,32 +583,6 @@ def __init__( if annotation_data: self._update(annotation_data, push_to_server=False) - @property - def x2(self) -> int: - """X2 coordinate.""" - self._lab.sync_topology_if_outdated() - return self._x2 - - @x2.setter - @locked - def x2(self, value: int) -> None: - """Set x2 coordinate.""" - self._set_annotation_property("x2", value) - self._x2 = value - - @property - def y2(self) -> int: - """Y2 coordinate.""" - self._lab.sync_topology_if_outdated() - return self._y2 - - @y2.setter - @locked - def y2(self, value: int) -> None: - """Set y2 coordinate.""" - self._set_annotation_property("y2", value) - self._y2 = value - @property def line_start(self) -> str | None: """Line arrow start style.""" @@ -621,11 +610,25 @@ def line_end(self, value: str | None) -> None: self._line_end = value -class AnnotationText(Annotation): +class AnnotationText(_RotationMixin, Annotation): """ Annotation class representing text annotation. """ + _VALID_KEYS = Annotation._VALID_KEYS | frozenset( + { + "x2", + "y2", + "rotation", + "text_bold", + "text_content", + "text_font", + "text_italic", + "text_size", + "text_unit", + } + ) + def __init__( self, lab: Lab, @@ -649,19 +652,6 @@ def __init__( if annotation_data: self._update(annotation_data, push_to_server=False) - @property - def rotation(self) -> int: - """Rotation of an object, in degrees.""" - self._lab.sync_topology_if_outdated() - return self._rotation - - @rotation.setter - @locked - def rotation(self, value: int) -> None: - """Set rotation of an object, in degrees.""" - self._set_annotation_property("rotation", value) - self._rotation = value - @property def text_bold(self) -> bool: """Text boldness.""" diff --git a/virl2_client/models/auth_management.py b/virl2_client/models/auth_management.py index cb63be94..9cf6add2 100644 --- a/virl2_client/models/auth_management.py +++ b/virl2_client/models/auth_management.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -55,6 +55,7 @@ def __init__(self, session: Client, auto_sync=True, auto_sync_interval=1.0): self._managers = { "local": None, "ldap": LDAPManager(self), + "radius": RADIUSManager(self), } def _url_for(self, endpoint, **kwargs): @@ -458,9 +459,19 @@ def manager_dn(self, value: str) -> None: """Set the manager DN.""" self._update_setting("manager_dn", value) + @property + def timeout(self) -> float: + """Return the LDAP request timeout in seconds.""" + return self._get_setting("timeout") + + @timeout.setter + def timeout(self, value: float) -> None: + """Set the LDAP request timeout in seconds.""" + self._update_setting("timeout", value) + def manager_password(self, value: str) -> None: """Set the manager password.""" - self._update_setting("display_attribute", value) + self._update_setting("manager_password", value) # manager password can't be retrieved, only set, so we only provide a setter manager_password = property(fset=manager_password) @@ -506,3 +517,73 @@ def resource_pool(self, value: str | ResourcePool) -> None: if isinstance(value, ResourcePool): value = value.id self._update_setting("resource_pool", value) + + +class RADIUSManager(AuthMethodManager): + """ + Manages RADIUS authentication settings. + + Extends the AuthMethodManager class and provides properties + for retrieving and updating RADIUS settings. + """ + + METHOD = "radius" + + @property + def server_hosts(self) -> str: + """Return the RADIUS server hosts.""" + return self._get_setting("server_hosts") + + @server_hosts.setter + def server_hosts(self, value: str) -> None: + """Set the RADIUS server hosts.""" + self._update_setting("server_hosts", value) + + @property + def port(self) -> int: + """Return the default RADIUS server port.""" + return self._get_setting("port") + + @port.setter + def port(self, value: int) -> None: + """Set the default RADIUS server port.""" + self._update_setting("port", value) + + @property + def timeout(self) -> float: + """Return the RADIUS request timeout in seconds.""" + return self._get_setting("timeout") + + @timeout.setter + def timeout(self, value: float) -> None: + """Set the RADIUS request timeout in seconds.""" + self._update_setting("timeout", value) + + @property + def nas_identifier(self) -> str: + """Return the NAS-Identifier used in requests.""" + return self._get_setting("nas_identifier") + + @nas_identifier.setter + def nas_identifier(self, value: str | None) -> None: + """Set the NAS-Identifier used in requests.""" + self._update_setting("nas_identifier", value) + + def secret(self, value: str) -> None: + """Set the shared secret for the RADIUS server(s).""" + self._update_setting("secret", value) + + # secret can't be retrieved, only set, so we only provide a setter + secret = property(fset=secret) + + @property + def resource_pool(self) -> str: + """Return the resource pool a new user will be added to.""" + return self._get_setting("resource_pool") + + @resource_pool.setter + def resource_pool(self, value: str | ResourcePool) -> None: + """Set the resource pool a new user will be added to.""" + if isinstance(value, ResourcePool): + value = value.id + self._update_setting("resource_pool", value) diff --git a/virl2_client/models/authentication.py b/virl2_client/models/authentication.py index 57d12a6f..5d97251b 100644 --- a/virl2_client/models/authentication.py +++ b/virl2_client/models/authentication.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -71,7 +71,6 @@ def __init__(self, client_library: ClientLibrary): :param client_library: A client library instance. """ self.client_library = client_library - self._token: str | None = None @property def token(self) -> str | None: @@ -79,8 +78,8 @@ def token(self) -> str | None: Return the authentication token. If the token has not been set, it is obtained from the server. """ - if self._token is not None: - return self._token + if self.client_library.jwtoken: + return self.client_library.jwtoken base_url = self.client_library._session.base_url if base_url.port is not None and base_url.port != 443: @@ -97,8 +96,8 @@ def token(self) -> str | None: auth=None, # type: ignore ) # auth=None works but is missing from .post's type hint raise_for_status(response) - self._token = response.json() - return self._token + self.client_library.jwtoken = response.json() + return self.client_library.jwtoken @token.setter def token(self, value: str | None) -> None: @@ -107,7 +106,7 @@ def token(self, value: str | None) -> None: :param value: The value to set as the authentication token. """ - self._token = value + self.client_library.jwtoken = value def auth_flow( self, request: httpx.Request @@ -124,6 +123,14 @@ def auth_flow( if response.status_code == 401: _LOGGER.warning("re-auth called on 401 unauthorized") self.token = None + if not (self.client_library.username and self.client_library.password): + raise APIError( + "JWT token expired and automatic re-authentication is not " + "possible because username/password are not configured. " + "Set client.jwtoken, or initialize with username/password.", + request=response.request, + response=response, + ) request.headers["Authorization"] = f"Bearer {self.token}" response = yield request @@ -171,7 +178,7 @@ def _request(self, *args, **kwargs): except httpx.HTTPStatusError as error: try: error_detail = json.loads(error.response.text)["description"] - except (json.JSONDecodeError, IndexError, TypeError): + except (json.JSONDecodeError, IndexError, KeyError, TypeError): error_detail = error.response.text prefix = self._ERROR_PREFIX.get(error.response.status_code // 100, "") api_error = APIError( @@ -183,7 +190,7 @@ def _request(self, *args, **kwargs): def make_session( - base_url: str, ssl_verify: bool | str = True, client_type: str = None + base_url: str, ssl_verify: bool | str = True, client_type: str | None = None ) -> httpx.Client: """ Create an httpx Client object with the specified base URL diff --git a/virl2_client/models/cl_pyats.py b/virl2_client/models/cl_pyats.py index 3360bb45..c483a942 100644 --- a/virl2_client/models/cl_pyats.py +++ b/virl2_client/models/cl_pyats.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -21,6 +21,8 @@ from __future__ import annotations import io +import logging +import os from pathlib import Path from typing import TYPE_CHECKING, Any @@ -28,9 +30,13 @@ from pyats.topology.loader.base import TestbedFileLoader as _PyatsTFLoader from pyats.topology.loader.markup import TestbedMarkupProcessor as _PyatsTMProcessor from pyats.utils.yaml.markup import Processor as _PyatsProcessor + from unicon.core.errors import ConnectionError as _UConnectionError + from unicon.core.errors import SubCommandFailure as _USubCommandFailure except ImportError: _PyatsTFLoader = None _PyatsTMProcessor = None + _UConnectionError = None + _USubCommandFailure = None else: # Ensure markup processor never uses the command line arguments as that's broken _PyatsProcessor.argv.clear() @@ -45,6 +51,15 @@ from .lab import Lab +_LOGGER = logging.getLogger(__name__) + +# Do not use any identity keys and agents with the terminal server +# by default - the keys would be attempted before password, and may +# exhaust the number of allowed attempts at the server +# to use ssh keys, set the specific key path or set empty ssh_options +DEFAULT_SSH_OPTIONS = "-o IdentitiesOnly=yes -o IdentityAgent=none" + + class ClPyats: def __init__(self, lab: Lab, hostname: str | None = None) -> None: """ @@ -55,8 +70,6 @@ def __init__(self, lab: Lab, hostname: str | None = None) -> None: :param lab: The lab object to be used with pyATS. :param hostname: Forced hostname or IP address and port of the console terminal server. - :raises PyatsNotInstalled: If pyATS is not installed. - :raises PyatsDeviceNotFound: If the device cannot be found. """ self._lab = lab self._hostname = hostname @@ -114,26 +127,65 @@ def sync_testbed(self, username: str, password: str) -> None: :param username: The username to be inserted into the testbed data. :param password: The password to be inserted into the testbed data. + :raises PyatsNotInstalled: If pyATS is not installed. """ self._check_pyats_installed() testbed_yaml = self._lab.get_pyats_testbed(self._hostname) self._testbed = self._load_pyats_testbed(testbed_yaml) self.set_termserv_credentials(username, password) + def switch_serial_console(self, node_label: str, console_number: int | str) -> None: + """ + Switch to different serial console that is used to execute PyAts commands + should be executed after sync_testbed + and re-executed after every sync_testbed call. + + :param node_label: The label/title of the device. + :param console_number: The serial console number to be used for PyAts. + :raises PyatsDeviceNotFound: If the device cannot be found. + :raises PyatsNotInstalled: If pyATS is not installed. + """ + self._check_pyats_installed() + try: + pyats_device: Device = self._testbed.devices[node_label] + except KeyError: + raise PyatsDeviceNotFound(node_label) + + command = pyats_device.connections["a"]["command"] + pyats_device.connections["a"]["command"] = command[:-1] + str(console_number) + def set_termserv_credentials( self, username: str | None = None, password: str | None = None, key_path: Path | str | None = None, + ssh_options: str = DEFAULT_SSH_OPTIONS, ) -> None: + """ + Configure how to connect to the SSH terminal server after the testbed + was synced with the server; the username must be known before making + any connections. Then either set the password, or path to an identity + file if SSH authentication with public keys is set up on the server. + By default, this function disables authentication agents and identity + files that would be loaded from the environment and running user ssh + configuration, so that the passed password or key is attempted first. + Pass empty string or custom SSH options to override this behavior. + + :param username: The username to be set. + :param password: The password to be set. + :param key_path: The SSH key path to be set. + :raises PyatsNotInstalled: If pyATS is not installed. + """ + self._check_pyats_installed() terminal = self._testbed.devices.terminal_server if username is not None: terminal.credentials.default.username = username if password is not None: terminal.credentials.default.password = password - if key_path is not None: - ssh_options = f"-o IdentitiesOnly=yes -o IdentityFile={key_path}" terminal.connections.cli.ssh_options = ssh_options + if key_path is not None: + ssh_options += f" -o IdentityFile={key_path}" + terminal.connections.cli.ssh_options = ssh_options def _prepare_params( self, @@ -156,6 +208,29 @@ def _prepare_params( params["init_config_commands"] = init_config_commands return params + def _is_connected(self, pyats_device: "Device") -> bool: + """Helper method to see if the device appears connected""" + if pyats_device not in self._connections or not pyats_device.is_connected(): + return False + try: + spawn = pyats_device.connectionmgr.connections.cli.spawn + return bool(spawn.fd) + except (TypeError, AttributeError): + return False + + def _reconnect(self, pyats_device: "Device", params: dict) -> None: + """Helper method to reconnect a PyATS device with proper cleanup.""" + if self._is_connected(pyats_device): + return + self._destroy_device(pyats_device, raise_exc=False) + try: + pyats_device.connect( + logfile=os.devnull, log_stdout=False, learn_hostname=True, **params + ) + finally: + _remove_unicon_loggers(pyats_device) + self._connections.add(pyats_device) + def _execute_command( self, node_label: str, @@ -163,6 +238,7 @@ def _execute_command( configure_mode: bool = False, init_exec_commands: list[str] | None = None, init_config_commands: list[str] | None = None, + _retry_attempted: bool = False, **pyats_params: Any, ) -> str: """ @@ -181,27 +257,45 @@ def _execute_command( :param pyats_params: Additional PyATS call parameters :returns: The output from the device. :raises PyatsDeviceNotFound: If the device cannot be found. + :raises PyatsNotInstalled: If pyATS is not installed. """ self._check_pyats_installed() + if self._testbed is None: + raise RuntimeError("pyATS testbed is not initialized") + try: - pyats_device: Device = self._testbed.devices[node_label] + pyats_device: "Device" = self._testbed.devices[node_label] except KeyError: raise PyatsDeviceNotFound(node_label) params = self._prepare_params( init_exec_commands, init_config_commands, **pyats_params ) - if pyats_device not in self._connections or not pyats_device.is_connected(): - if pyats_device in self._connections: - pyats_device.destroy() - - pyats_device.connect(log_stdout=False, learn_hostname=True, **params) - self._connections.add(pyats_device) - if configure_mode: - return pyats_device.configure(command, log_stdout=False, **params) - else: + + try: + self._reconnect(pyats_device, params) + if configure_mode: + return pyats_device.configure(command, log_stdout=False, **params) return pyats_device.execute(command, log_stdout=False, **params) + except Exception as exc: + should_raise, retry_reason = _analyze_execute_failure(exc) + + if _retry_attempted or should_raise: + raise + + _LOGGER.info( + f"PyATS command failed on node {node_label}, retrying after reconnection. Reason: {retry_reason}" + ) + return self._execute_command( + node_label, + command, + configure_mode, + init_exec_commands, + init_config_commands, + _retry_attempted=True, + **pyats_params, + ) def run_command( self, @@ -223,6 +317,8 @@ def run_command( before the command. Default commands will be run if omitted. Pass an empty list to run no commands. :param pyats_params: Additional PyATS call parameters + :raises PyatsDeviceNotFound: If the device cannot be found. + :raises PyatsNotInstalled: If pyATS is not installed. :returns: The output from the device. """ return self._execute_command( @@ -255,6 +351,8 @@ def run_config_command( before the command. Default commands will be run if omitted. Pass an empty list to run no commands. :param pyats_params: Additional PyATS call parameters + :raises PyatsDeviceNotFound: If the device cannot be found. + :raises PyatsNotInstalled: If pyATS is not installed. :returns: The output from the device. """ return self._execute_command( @@ -266,8 +364,64 @@ def run_config_command( **pyats_params, ) - def cleanup(self) -> None: - """Clean up the pyATS connections.""" - for pyats_device in self._connections: + def cleanup(self, node_label: str | None = None) -> None: + """ + Clean up pyATS connections. + + :param node_label: The label/title of a specific node to cleanup. + If None, all connections will be cleaned up. + """ + if node_label is None: + for pyats_device in tuple(self._connections): + self._destroy_device(pyats_device) + return + if self._testbed is None: + return + try: + pyats_device: "Device" = self._testbed.devices[node_label] + except KeyError: + return + if pyats_device in self._connections: + self._destroy_device(pyats_device) + + def _destroy_device(self, pyats_device: "Device", raise_exc=True) -> None: + try: pyats_device.destroy() - self._connections.clear() + except Exception: + if raise_exc: + raise + finally: + self._connections.discard(pyats_device) + + +def _analyze_execute_failure(exc: Exception) -> tuple[bool, str | None]: + should_raise = True + retry_reason = None + + if _UConnectionError and isinstance(exc, _UConnectionError): + should_raise = False + retry_reason = f"ConnectionError: {exc}" + elif _USubCommandFailure and isinstance(exc, _USubCommandFailure): + cause = getattr(exc, "__cause__", None) + if isinstance(cause, TimeoutError): + should_raise = False + retry_reason = f"SubCommandFailure with TimeoutError cause: {cause}" + return should_raise, retry_reason + + +def _remove_unicon_loggers(pyats_device: "Device") -> None: + """Prevent unicon logger instances and placeholders from accummulating""" + loggers = logging.root.manager.loggerDict + try: + names = { + con.log.name for con in pyats_device.connectionmgr.connections.values() + } + names.update( + name for name in loggers if name.startswith("unicon.terminal_server.") + ) + except (AttributeError, TypeError, KeyError): + return + for name in names: + while name.startswith("unicon."): + loggers.pop(name, None) + name = name.rsplit(".", 1)[0] diff --git a/virl2_client/models/configuration.py b/virl2_client/models/configuration.py deleted file mode 100644 index 8602cd1c..00000000 --- a/virl2_client/models/configuration.py +++ /dev/null @@ -1,145 +0,0 @@ -# -# This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. -# All rights reserved. -# -# Python bindings for the Cisco VIRL 2 Network Simulation Platform -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -""" -A collection of utility classes to make getting credentials and -configuration easier. -""" - -from __future__ import annotations - -import getpass -import os -from pathlib import Path - -from ..exceptions import InitializationError - -_CONFIG_FILE_NAME = ".virlrc" - - -def _get_from_file(virlrc_parent: Path, prop_name: str) -> str | None: - """ - Retrieve a property value from a file. - - :param virlrc_parent: The parent directory of the file. - :param prop_name: The name of the property to retrieve. - :returns: The value of the property if found, otherwise None. - """ - virlrc = virlrc_parent / _CONFIG_FILE_NAME - if virlrc.is_file(): - with virlrc.open() as fh: - config = fh.readlines() - - for line in config: - if line.startswith(prop_name): - prop = line.split("=")[1].strip() - if prop.startswith('"') and prop.endswith('"'): - prop = prop[1:-1] - return prop - return None - - -def _get_prop(prop_name: str) -> str | None: - """ - Get the value of a variable. - - The function follows the order: - - 1. Check for .virlrc in the current directory - 2. Recurse up the directory tree for .virlrc - 3. Check environment variables - 4. Check ~/.virlrc - - :param prop_name: The name of the property to retrieve. - :returns: The value of the property if found, otherwise None. - """ - # check for .virlrc in current directory - cwd = Path.cwd() - if prop := _get_from_file(cwd, prop_name): - return prop - - # search up directory tree for a .virlrc - for path in cwd.parents: - if prop := _get_from_file(path, prop_name): - return prop - - # try environment next - prop = os.getenv(prop_name, None) - if prop: - return prop - - # check for .virlrc in home directory - prop = _get_from_file(Path.home(), prop_name) - - return prop or None - - -def get_configuration( - host: str | None, username: str | None, password: str | None, ssl_verify: bool | str -) -> tuple[str, str, str, bool | str]: - """ - Get the login configuration. - - The login configuration is retrieved in the following order: - - 1. Retrieve from function arguments - 2. Check for .virlrc in the current directory - 3. Recurse up the directory tree for .virlrc - 4. Check environment variables - 5. Check ~/.virlrc - 6. Prompt the user (except for the cert path) - - :param host: The host address of the CML server. - :param username: The username. - :param password: The password. - :param ssl_verify: The CA bundle path or boolean value indicating SSL verification. - :returns: A tuple containing the host, username, password, - and SSL verification information. - """ - if not ( - host - or (host := _get_prop("VIRL2_URL") or _get_prop("VIRL_HOST")) - or (host := input("Please enter the IP / hostname of your virl server: ")) - ): - message = "No URL provided." - raise InitializationError(message) - - if not ( - username - or (username := _get_prop("VIRL2_USER") or _get_prop("VIRL_USERNAME")) - or (username := input("Please enter your VIRL username: ")) - ): - message = "No username provided." - raise InitializationError(message) - - if not ( - password - or (password := _get_prop("VIRL2_PASS") or _get_prop("VIRL_PASSWORD")) - or (password := getpass.getpass("Please enter your password: ")) - ): - message = "No password provided." - raise InitializationError(message) - - if ssl_verify is True: - ssl_verify = _get_prop("CA_BUNDLE") or _get_prop("CML_VERIFY_CERT") or True - # to match the behavior of virlutils, we allow to disable the SSL check via ENV - if isinstance(ssl_verify, str) and ssl_verify.lower() == "false": - ssl_verify = False - - return host, username, password, ssl_verify diff --git a/virl2_client/models/group.py b/virl2_client/models/group.py index be7c9544..10a3b068 100644 --- a/virl2_client/models/group.py +++ b/virl2_client/models/group.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -165,8 +165,7 @@ def group_labs(self, group_id: str) -> list[str]: :returns: A list of labs associated with this group. """ warnings.warn( - "'GroupManagement.group_labs()' is deprecated." - "Use '.associations' instead.", + "'GroupManagement.group_labs()' is deprecated.Use '.associations' instead.", ) return [lab["id"] for lab in self.get_group(group_id)["labs"]] diff --git a/virl2_client/models/groups.py b/virl2_client/models/groups.py index cebfad93..b6478549 100644 --- a/virl2_client/models/groups.py +++ b/virl2_client/models/groups.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform diff --git a/virl2_client/models/interface.py b/virl2_client/models/interface.py index f2e0aa01..22f11e14 100644 --- a/virl2_client/models/interface.py +++ b/virl2_client/models/interface.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -21,7 +21,6 @@ from __future__ import annotations import logging -import warnings from typing import TYPE_CHECKING, Any from ..utils import check_stale, get_url_from_template, locked @@ -79,7 +78,7 @@ def __init__( "writebytes": 0, "writepackets": 0, } - self._ip_snooped_info: dict[str, str | None] = { + self._ip_snooped_info: dict[str, Any] = { "mac_address": None, "ipv4": None, "ipv6": None, @@ -227,7 +226,7 @@ def writepackets(self) -> int: return int(self.statistics["writepackets"]) @property - def ip_snooped_info(self) -> dict[str, str | None]: + def ip_snooped_info(self) -> dict[str, list[str] | str | None]: """ Return the discovered MAC, IPv4 and IPv6 addresses of the interface in a dictionary. @@ -242,14 +241,14 @@ def discovered_mac_address(self) -> str | None: return self._ip_snooped_info["mac_address"] @property - def discovered_ipv4(self) -> str | None: - """Return the discovered IPv4 address of the interface.""" + def discovered_ipv4(self) -> list[str] | None: + """Return the discovered IPv4 addresses of the interface.""" self.node.sync_l3_addresses_if_outdated() return self._ip_snooped_info["ipv4"] @property - def discovered_ipv6(self) -> str | None: - """Return the discovered IPv6 address of the interface.""" + def discovered_ipv6(self) -> list[str] | None: + """Return the discovered IPv6 addresses of the interface.""" self.node.sync_l3_addresses_if_outdated() return self._ip_snooped_info["ipv6"] @@ -265,20 +264,7 @@ def operational(self) -> dict[str, Any]: self._lab.sync_operational_if_outdated() return self._operational.copy() - @property - def is_physical(self) -> bool: - """ - DEPRECATED: Use `.physical` instead. - (Reason: renamed to match similar parameters) - - Check if the interface is physical. - """ - warnings.warn( - "'Interface.is_physical' is deprecated. Use '.physical' instead.", - ) - return self.physical - - def as_dict(self) -> dict[str, str]: + def as_dict(self) -> dict[str, str | dict]: """Convert the interface to a dictionary representation.""" return { "id": self.id, @@ -321,18 +307,6 @@ def _remove_on_server(self) -> None: url = self._url_for("interface") self._session.delete(url) - def remove_on_server(self) -> None: - """ - DEPRECATED: Use `.remove()` instead. - (Reason: was never meant to be public, removing only on server is not useful) - - Remove the interface on the server. - """ - warnings.warn( - "'Interface.remove_on_server()' is deprecated. Use '.remove()' instead.", - ) - self._remove_on_server() - @check_stale def bring_up(self) -> None: """Bring up the interface.""" @@ -345,70 +319,6 @@ def shutdown(self) -> None: url = self._url_for("stop") self._session.put(url) - def peer_interfaces(self): - """ - DEPRECATED: Use `.peer_interface` instead. - (Reason: pointless plural, could have been a parameter) - - Return the peer interface connected to this interface in a set. - """ - warnings.warn( - "'Interface.peer_interfaces()' is deprecated. " - "Use '.peer_interface' instead.", - ) - return {self.peer_interface} - - def peer_nodes(self): - """ - DEPRECATED: Use `.peer_node` instead. - (Reason: pointless plural, could have been a parameter) - - Return the node of the peer interface in a set. - """ - warnings.warn( - "'Interface.peer_nodes() is deprecated. Use '.peer_node' instead.", - ) - return {self.peer_node} - - def links(self): - """ - DEPRECATED: Use `.link` instead. - (Reason: pointless plural, could have been a parameter) - - Return the link connected to this interface in a list. - """ - warnings.warn( - "'Interface.links()' is deprecated. Use '.link' instead.", - ) - link = self.link - if link is None: - return [] - return [link] - - def degree(self): - """ - DEPRECATED: Use `.connected` instead. - (Reason: degree always 0 or 1) - - Return the degree of the interface. - """ - warnings.warn( - "'Interface.degree()' is deprecated. Use '.connected' instead.", - ) - return int(self.connected) - - def is_connected(self): - """ - DEPRECATED: Use `.connected` instead. - (Reason: should have been a parameter, renamed to match similar parameters) - - Check if the interface is connected to a link. - """ - warnings.warn( - "'Interface.is_connected()' is deprecated. Use '.connected' instead.", - ) - return self.connected - @check_stale @locked def _update( @@ -436,7 +346,7 @@ def _set_interface_property(self, key: str, val: Any) -> None: :param key: The key of the property to set. :param val: The value to set. """ - _LOGGER.debug(f"Setting node property {self} {key}: {val}") + _LOGGER.debug(f"Setting interface property {self} {key}: {val}") self._set_interface_properties({key: val}) @check_stale diff --git a/virl2_client/models/lab.py b/virl2_client/models/lab.py index 33122dde..c11379b8 100644 --- a/virl2_client/models/lab.py +++ b/virl2_client/models/lab.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -34,13 +34,14 @@ ElementAlreadyExists, InterfaceNotFound, InvalidAnnotationType, + InvalidTopologySchema, LabNotFound, LinkNotFound, NodeNotFound, SmartAnnotationNotFound, VirlException, ) -from ..utils import check_stale, get_url_from_template, locked +from ..utils import UNCHANGED, _Sentinel, check_stale, get_url_from_template, locked from ..utils import property_s as property from .annotation import ( Annotation, @@ -60,6 +61,7 @@ from .annotation import AnnotationType from .resource_pool import ResourcePool, ResourcePoolManagement + from .user import UserManagement _LOGGER = logging.getLogger(__name__) @@ -91,7 +93,6 @@ class Lab: "connector_mappings": "labs/{lab_id}/connector_mappings", "resource_pools": "labs/{lab_id}/resource_pools", "annotations": "labs/{lab_id}/annotations", - "user_list": "users", } def __init__( @@ -108,6 +109,7 @@ def __init__( wait_time: int | float = 5, hostname: str | None = None, resource_pool_manager: ResourcePoolManagement | None = None, + user_management: UserManagement | None = None, ) -> None: """ A VIRL2 lab network topology. @@ -127,6 +129,8 @@ def __init__( :param hostname: Hostname/IP and port for pyATS console terminal server. :param resource_pool_manager: ResourcePoolManagement object shared with parent ClientLibrary. + :param user_management: UserManagement object shared with parent + ClientLibrary for resolving user IDs to usernames. :raises VirlException: If the lab object is created without a resource pool manager. """ @@ -137,6 +141,16 @@ def __init__( self._title = title self._description = "" self._notes = "" + self._autostart = { + "enabled": False, + "priority": None, + "delay": None, + } + self._node_staging = { + "enabled": False, + "start_remaining": True, + "abort_on_failure": False, + } self._id = lab_id self._session = session self._owner = username @@ -189,6 +203,12 @@ def __init__( "because it is missing a resource pool manager." ) self._resource_pool_manager = resource_pool_manager + if user_management is None: + raise VirlException( + f"Lab object for lab {title or lab_id} cannot be created " + "because it is missing a user management." + ) + self._user_management = user_management self._resource_pools = [] self._stale = False self._synced_configs = True @@ -331,6 +351,66 @@ def description(self, value: str) -> None: """Set the description of the lab.""" self._set_property("description", value) + @property + def autostart(self) -> dict[str, Any]: + """Return the autostart configuration as a dict.""" + self.sync_topology_if_outdated() + return self._autostart.copy() + + def set_autostart( + self, + enabled: bool | None = None, + priority: int | None | _Sentinel = UNCHANGED, + delay: int | None | _Sentinel = UNCHANGED, + ) -> None: + """ + Set all autostart configuration properties. + + :param enabled: Whether autostart is enabled. + :param priority: Priority of the lab autostart (0-10000, None for default). + :param delay: Delay in seconds before lab autostart (0-86400, None for default). + """ + autostart = {} + if enabled is not None: + autostart["enabled"] = enabled + if priority is not UNCHANGED: + autostart["priority"] = priority + if delay is not UNCHANGED: + autostart["delay"] = delay + if autostart: + self._autostart.update(autostart) + self._set_property("autostart", self._autostart) + + @property + def node_staging(self) -> dict[str, bool]: + """Return the node staging configuration as a dict.""" + self.sync_topology_if_outdated() + return self._node_staging.copy() + + def set_node_staging( + self, + enabled: bool | None = None, + start_remaining: bool | None = None, + abort_on_failure: bool | None = None, + ) -> None: + """ + Set all node staging configuration properties. + + :param enabled: Whether node staging is enabled. + :param start_remaining: Whether to start remaining nodes after staging. + :param abort_on_failure: Whether to abort staging on failure. + """ + node_staging = {} + if enabled is not None: + node_staging["enabled"] = enabled + if start_remaining is not None: + node_staging["start_remaining"] = start_remaining + if abort_on_failure is not None: + node_staging["abort_on_failure"] = abort_on_failure + if node_staging: + self._node_staging.update(node_staging) + self._set_property("node_staging", self._node_staging) + def _set_property(self, prop: str, value: Any): """ Set the value of a lab property both locally and on the server. @@ -392,6 +472,21 @@ def interfaces(self) -> list[Interface]: self.sync_topology_if_outdated() return list(self._interfaces.values()) + @check_stale + @locked + def sync_interfaces_operational(self) -> None: + """Synchronize the operational state of all interfaces in the lab.""" + url = self._url_for("interfaces") + response = self._session.get(url).json() + + response_dict = {item["id"]: item for item in response} + + for interface_id, interface in self._interfaces.items(): + interface_data = response_dict.get(interface_id) or {} + interface._operational = interface_data.get("operational") or {} + + self._last_sync_operational_time = time.time() + def annotations(self) -> list[AnnotationType]: """ Return the list of annotations in the lab. @@ -482,49 +577,6 @@ def get_link_by_id(self, link_id: str) -> Link: except KeyError: raise LinkNotFound(link_id) - @staticmethod - def get_link_by_nodes(node1: Node, node2: Node) -> Link: - """ - DEPRECATED: Use `Node.get_link_to()` to get one link - or `Node.get_links_to()` to get all links. - (Reason: redundancy) - - Return ONE of the links identified by two node objects. - - :param node1: The first node. - :param node2: The second node. - :returns: One of links between the nodes. - :raises LinkNotFound: If no such link exists. - """ - warnings.warn( - "'Lab.get_link_by_nodes()' is deprecated. " - "Use 'Node.get_link_to()' or 'Node.get_links_to()' instead.", - ) - if not (links := node1.get_links_to(node2)): - raise LinkNotFound - return links[0] - - @staticmethod - def get_link_by_interfaces(iface1: Interface, iface2: Interface) -> Link | None: - """ - DEPRECATED: Use `Interface.get_link_to()` instead. - (Reason: redundancy) - - Return the link identified by two interface objects. - - :param iface1: The first interface. - :param iface2: The second interface. - :returns: The link between the interfaces. - :raises LinkNotFound: If no such link exists. - """ - warnings.warn( - "'Lab.get_link_by_interfaces()' is deprecated. " - "Use 'Interface.get_link_to()' instead.", - ) - if (link := iface1.link) is not None and iface2 in link.interfaces: - return link - raise LinkNotFound - def get_annotation_by_id(self, annotation_id: str) -> AnnotationType: """ Return the annotation identified by the ID. @@ -600,7 +652,27 @@ def create_node( If left at the default value, the lab's wait property is used instead. :param populate_interfaces: Automatically create a pre-defined number of interfaces on node creation. + :param kwargs: Optional parameters. See below. :returns: A Node object. + + :Keyword Arguments: + - image_definition: The definition of the image used by this node. + - configuration: The initial configuration of this node. + - ram: The memory of the node in MiB (if applicable). + - cpus: The number of CPUs in this node (if applicable). + - cpu_limit: The CPU limit of the node (default is 100%). + - data_volume: The size in GiB of the second HDD (if > 0). + - boot_disk_size: The size in GiB of the boot disk + (will expand to this size). + - hide_links: A flag indicating whether the node's links should be hidden + in UI visualization. + - tags: A list of tags associated with the node. + - resource_pool: The ID of the resource pool if the node is part + of a resource pool. + - pinned_compute_id: The ID of the compute this node is pinned to. + The node will not run on any other compute. + - priority: The launch priority of the node (0-10000, or None). + The higher the priority, the sooner the node will be started. """ try: self.get_node_by_label(label) @@ -640,21 +712,6 @@ def create_node( node = self._create_node_local(node_id, **kwargs) return node - def add_node_local(self, *args, **kwargs): - """ - DEPRECATED: Use `.create_node()` instead. - (Reason: only creates a node in the client, which is not useful; - if really needed, use `._create_node_local()`) - - Creates a node in the client, but not on the server. - """ - warnings.warn( - "'Lab.add_node_local()' is deprecated. You probably want Lab.create_node() " - "instead. (If you really want to create a node locally only, " - "use '._create_node_local()'.)", - ) - return self._create_node_local(*args, **kwargs) - @locked def _create_node_local( self, node_id: str, label: str, node_definition: str, **kwargs @@ -711,7 +768,7 @@ def remove_nodes(self, wait: bool | None = None) -> None: """ # Use case - user was assigned one lab, wants to reset work; # can't delete lab, so removing all nodes is the only option - for node in list(self._nodes.values()): + for node in tuple(self._nodes.values()): self.remove_node(node, wait=False) if self.need_to_wait(wait): @@ -864,14 +921,14 @@ def _remove_smart_annotation_local(self, annotation: SmartAnnotation) -> None: @locked def remove_annotations(self) -> None: """Remove all annotations from the lab.""" - for ann in list(self._annotations.values()): + for ann in tuple(self._annotations.values()): self.remove_annotation(ann) _LOGGER.debug("all annotations removed from lab %s", self._id) @locked def remove_smart_annotations(self) -> None: """Remove all smart annotations from the lab.""" - for ann in list(self._smart_annotations.values()): + for ann in tuple(self._smart_annotations.values()): self.remove_smart_annotation(ann) _LOGGER.debug("all smart annotations removed from lab %s", self._id) @@ -1155,8 +1212,18 @@ def sync_states(self) -> None: """Sync all the states of the various elements with the backend server.""" url = self._url_for("lab_element_state") states: dict[str, dict[str, str]] = self._session.get(url).json() + + nodes = self._nodes.copy() for node_id, node_state in states["nodes"].items(): - self._nodes[node_id]._state = node_state + try: + node = nodes.pop(node_id) + except KeyError: + pass + else: + node._state = node_state + for stale_node in nodes.values(): + stale_node._stale = True + ifaces = self._interfaces.copy() for interface_id, interface_state in states["interfaces"].items(): try: @@ -1165,10 +1232,19 @@ def sync_states(self) -> None: pass else: iface._state = interface_state - for stale_iface in ifaces: - ifaces[stale_iface]._stale = True + for stale_iface in ifaces.values(): + stale_iface._stale = True + + links = self._links.copy() for link_id, link_state in states["links"].items(): - self._links[link_id]._state = link_state + try: + link = links.pop(link_id) + except KeyError: + pass + else: + link._state = link_state + for stale_link in links.values(): + stale_link._stale = True self._last_sync_state_time = time.time() @@ -1242,6 +1318,7 @@ def stop(self, wait: bool | None = None) -> None: """ url = self._url_for("stop") self._session.put(url) + self.cleanup_pyats_connections() if self.need_to_wait(wait): self.wait_until_lab_converged() _LOGGER.debug(f"Stopped lab: {self._id}") @@ -1333,7 +1410,6 @@ def build_configurations(self) -> None: def sync( self, topology_only=True, - with_node_configurations: bool | None = None, exclude_configurations: bool | None = False, ) -> None: """ @@ -1341,19 +1417,9 @@ def sync( :param topology_only: Only sync the topology without statistics and IP addresses. - :param with_node_configurations: DEPRECATED: does the opposite of what - is expected. Use exclude_configurations instead. :param exclude_configurations: Whether to exclude configurations from synchronization. """ - if with_node_configurations is not None: - warnings.warn( - "Lab.sync(): The argument 'with_node_configurations' is deprecated, " - "as it does the opposite of what is expected. " - "Use exclude_configurations instead.", - ) - exclude_configurations = with_node_configurations - self._sync_topology(exclude_configurations) if not topology_only: @@ -1409,7 +1475,7 @@ def import_lab(self, topology: dict) -> None: self._handle_import_annotations(topology) @locked - def _import_lab(self, topology: dict, created: bool = False) -> None: + def _import_lab(self, topology: dict[str, dict], created: bool = False) -> None: """ Replace lab properties with the given topology. @@ -1427,19 +1493,23 @@ def _import_lab(self, topology: dict, created: bool = False) -> None: # If we just created the lab, we skip the warning, since the # lab post endpoint returns data in the old format if not created: - warnings.warn( - "Labs created in older CML releases (schema version 0.0.5 or lower)" - " are deprecated. Use labs with schema version 0.1.0 or higher.", - ) + raise InvalidTopologySchema self._title = topology["lab_title"] self._description = topology["lab_description"] self._notes = topology["lab_notes"] self._set_owner(topology.get("lab_owner"), default_owner) + if autostart := topology.get("autostart"): + self._autostart = autostart + node_staging = topology.get("node_staging") else: self._title = lab_dict["title"] self._description = lab_dict["description"] self._notes = lab_dict["notes"] self._set_owner(lab_dict.get("owner"), default_owner) + node_staging = lab_dict.get("node_staging") + + if node_staging: + self._node_staging = node_staging @locked def _handle_import_nodes(self, topology: dict) -> None: @@ -1448,7 +1518,8 @@ def _handle_import_nodes(self, topology: dict) -> None: :param topology: The topology to import nodes from. """ - for node in topology["nodes"]: # type: dict + node: dict + for node in topology["nodes"]: node_id = node["id"] if node_id in self._nodes: @@ -1456,7 +1527,7 @@ def _handle_import_nodes(self, topology: dict) -> None: self._import_node(node_id, node) - interfaces = node.get("interfaces", []) + interfaces = node.get("interfaces") or [] if not interfaces: continue @@ -1504,7 +1575,7 @@ def _handle_import_links(self, topology: dict) -> None: iface_b_id = link["interface_b"] label = link.get("label") - self._import_link(link_id, iface_b_id, iface_a_id, label) + self._import_link(link_id, iface_a_id, iface_b_id, label) @locked def _handle_import_annotations(self, topology: dict) -> None: @@ -1539,16 +1610,16 @@ def _handle_import_annotations(self, topology: dict) -> None: def _import_link( self, link_id: str, - iface_b_id: str, iface_a_id: str, + iface_b_id: str, label: str | None = None, ) -> Link: """ Import a link with the given parameters. :param link_id: The ID of the link. - :param iface_b_id: The ID of the second interface. :param iface_a_id: The ID of the first interface. + :param iface_b_id: The ID of the second interface. :param label: The label of the link. :returns: The imported Link object. """ @@ -1648,7 +1719,6 @@ def _import_smart_annotation( annotation_data = { key: annotation_data[key] for key in annotation_data if key != "id" } - annotation = self._create_smart_annotation_local( annotation_id, **annotation_data ) @@ -1663,7 +1733,6 @@ def update_lab(self, topology: dict, exclude_configurations: bool) -> None: :param exclude_configurations: Whether to exclude configurations from updating. """ self._import_lab(topology) - # add in order: node -> interface -> link -> annotation # remove in reverse: annotation -> link -> interface -> node existing_node_ids = set(self._nodes) @@ -1672,22 +1741,20 @@ def update_lab(self, topology: dict, exclude_configurations: bool) -> None: existing_annotation_ids = set(self._annotations) existing_smart_annotation_ids = set(self._smart_annotations) - update_node_ids = set(node["id"] for node in topology["nodes"]) - update_link_ids = set(link["id"] for link in topology["links"]) - if "interfaces" in topology: - update_interface_ids = set(iface["id"] for iface in topology["interfaces"]) + update_node_ids = {node["id"] for node in topology["nodes"]} + update_link_ids = {link["id"] for link in topology["links"]} + if topology.get("interfaces") is not None: + update_interface_ids = {iface["id"] for iface in topology["interfaces"]} else: - update_interface_ids = set( + update_interface_ids = { interface["id"] for node in topology["nodes"] for interface in node["interfaces"] - ) - update_annotation_ids = set( - ann["id"] for ann in topology.get("annotations", []) - ) - update_smart_annotation_ids = set( + } + update_annotation_ids = {ann["id"] for ann in topology.get("annotations", [])} + update_smart_annotation_ids = { ann["id"] for ann in topology.get("smart_annotations", []) - ) + } # removed elements removed_nodes = existing_node_ids - update_node_ids @@ -1817,9 +1884,10 @@ def _add_nodes( :param new_nodes: Iterable of node IDs to be added. :param new_interfaces: Iterable of interface IDs to be added. """ - for node in topology["nodes"]: # type: dict + node: dict + for node in topology["nodes"]: node_id = node["id"] - interfaces = node.get("interfaces", []) + interfaces = node.get("interfaces") or [] if node_id in new_nodes: new_node = self._import_node(node_id, node) _LOGGER.info(f"Added node {new_node}") @@ -1841,7 +1909,7 @@ def _add_interfaces(self, topology: dict, new_interfaces: Iterable[str]) -> None :param topology: Dictionary containing the lab topology. :param new_interfaces: Iterable of interface IDs to be added. """ - if "interfaces" in topology: + if topology.get("interfaces") is not None: for iface in topology["interfaces"]: iface_id = iface["id"] if iface_id in new_interfaces: @@ -1861,7 +1929,7 @@ def _add_links(self, topology: dict, new_links: Iterable[str]) -> None: iface_a_id = link_data["interface_a"] iface_b_id = link_data["interface_b"] label = link_data.get("label") - link = self._import_link(link_id, iface_b_id, iface_a_id, label) + link = self._import_link(link_id, iface_a_id, iface_b_id, label) _LOGGER.info(f"Added link {link}") @locked @@ -1924,6 +1992,10 @@ def _update_elements( interface_data = self._find_interface_in_topology( interface_id, topology ) + # a temporary workaround to ensure compliance with API changes + # ignore node field as node_id on higher level has priority + # while this one can be None and cause inconsistency + interface_data.pop("node", None) interface = self._interfaces[interface_id] interface._update(interface_data, push_to_server=False) @@ -1951,6 +2023,19 @@ def update_lab_properties(self, properties: dict[str, Any]): self._description = properties.get("description", self._description) self._notes = properties.get("notes", self._notes) self._owner = properties.get("owner", self._owner) + self._autostart.update(properties.get("autostart", {})) + + # Handle node staging properties + node_staging = properties.get("node_staging", {}) + self._node_staging = { + "enabled": node_staging.get("enabled", self._node_staging["enabled"]), + "start_remaining": node_staging.get( + "start_remaining", self._node_staging["start_remaining"] + ), + "abort_on_failure": node_staging.get( + "abort_on_failure", self._node_staging["abort_on_failure"] + ), + } @staticmethod def _find_link_in_topology(link_id: str, topology: dict) -> dict: @@ -1978,11 +2063,11 @@ def _find_interface_in_topology(interface_id: str, topology: dict) -> dict: :returns: The interface with the specified ID. :raises InterfaceNotFound: If the interface cannot be found in the topology. """ - interface_containers: list = ( - [topology] if "interfaces" in topology else topology["nodes"] + interface_containers: list[dict] = ( + [topology] if topology.get("interfaces") else topology["nodes"] ) for container in interface_containers: - for interface in container.get("interfaces", []): + for interface in container.get("interfaces") or []: if interface["id"] == interface_id: return interface # if it cannot be found, it is an internal structure error @@ -2084,12 +2169,21 @@ def sync_layer3_addresses(self) -> None: """Sync all layer 3 IP addresses from the backend server.""" url = self._url_for("layer3_addresses") result: dict[str, dict] = self._session.get(url).json() - for node_id, node_data in result.items(): - node = self.get_node_by_id(node_id) + + for node in self.nodes(): + node_data = result.get(node.id, {}) mapping = node_data.get("interfaces", {}) node.map_l3_addresses_to_interfaces(mapping) + self._last_sync_l3_address_time = time.time() + def clear_discovered_addresses(self) -> None: + """Clear all discovered L3 addresses for all nodes in this lab from snooper.""" + url = self._url_for("layer3_addresses") + self._session.delete(url) + for node in self.nodes(): + node.map_l3_addresses_to_interfaces({}) + @check_stale def download(self) -> str: """ @@ -2138,7 +2232,7 @@ def update_lab_groups( return self._session.patch(url, json=data).json() @property - def associations(self) -> dict[list[dict[str, str]]]: + def associations(self) -> dict[str, list[dict[str, list[str]]]]: """ Return the group and user associations for this lab. @@ -2150,8 +2244,8 @@ def associations(self) -> dict[list[dict[str, str]]]: @check_stale def update_associations( - self, associations: dict[list[dict[str, str]]] - ) -> dict[list[dict[str, str]]]: + self, associations: dict[str, list[dict[str, list[str]]]] + ) -> dict[str, list[dict[str, list[str]]]]: """ Modify lab/group/user associations. @@ -2204,28 +2298,16 @@ def sync_operational(self) -> None: url = self._url_for("nodes_operational") response: list[dict] = self._session.get(url).json() - for node_data in response: - if node := self._nodes.get(node_data["id"]): - node.sync_operational(node_data) - self._last_sync_operational_time = time.time() + response_dict = {item["id"]: item for item in response} - def _user_name(self, user_id: str) -> str | None: - """ - Get the username of the user with the given ID. + for node in self.nodes(): + node_data = response_dict.get(node.id, {}) + node.sync_operational(node_data) - :param user_id: User unique identifier. - :returns: Username. - """ - # Need an endpoint here in Lab that would normally be handled by UserManagement, - # but a Lab has no access to UserManagement, this seems like a better idea than - # dragging the entire UserManagement to the Lab for two lines - url = self._url_for("user_list") - users = self._session.get(url).json() - for user in users: - if user["id"] == user_id: - return user["username"] - return None + self.sync_interfaces_operational() + + self._last_sync_operational_time = time.time() def _set_owner( self, user_id: str | None = None, user_name: str | None = None @@ -2239,5 +2321,7 @@ def _set_owner( :param user_name: Username. """ if user_id: - user_name = self._user_name(user_id) or user_name + resolved = self._user_management.get_username(user_id) + if resolved is not None: + user_name = resolved self._owner = user_name diff --git a/virl2_client/models/lab_repository.py b/virl2_client/models/lab_repository.py new file mode 100644 index 00000000..da9aefd2 --- /dev/null +++ b/virl2_client/models/lab_repository.py @@ -0,0 +1,280 @@ +# +# This file is part of VIRL 2 +# Copyright (c) 2019-2026, Cisco Systems, Inc. +# All rights reserved. +# +# Python bindings for the Cisco VIRL 2 Network Simulation Platform +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import annotations + +import logging +import time +from typing import TYPE_CHECKING, Any + +from ..exceptions import LabRepositoryNotFound +from ..utils import get_url_from_template + +if TYPE_CHECKING: + import httpx + +_LOGGER = logging.getLogger(__name__) + + +class LabRepository: + _URL_TEMPLATES = {"lab_repo": "lab_repos/{repo_id}"} + + def __init__( + self, + system, + id: str, + url: str, + name: str, + folder: str, + ): + """ + A lab repository, which provides access to lab templates and resources. + + :param system: The SystemManagement instance. + :param id: The ID of the lab repository. + :param url: The URL of the lab repository. + :param name: The name of the lab repository. + :param folder: The folder name for the lab repository. + """ + self._system = system + self._session: httpx.Client = system._session + self._id = id + self._url = url + self._name = name + self._folder = folder + + def __str__(self): + return f"Lab repository: {self._name}" + + def _url_for(self, endpoint, **kwargs) -> str: + """ + Generate the URL for a given API endpoint. + + :param endpoint: The desired endpoint. + :param **kwargs: Keyword arguments used to format the URL. + :returns: The formatted URL. + """ + kwargs["repo_id"] = self._id + return get_url_from_template(endpoint, self._URL_TEMPLATES, kwargs) + + @property + def id(self) -> str: + """Return the ID of the lab repository.""" + return self._id + + @property + def url(self) -> str: + """Return the URL of the lab repository.""" + if hasattr(self._system, "sync_lab_repositories_if_outdated"): + self._system.sync_lab_repositories_if_outdated() + elif hasattr(self._system, "lab_repository_management"): + self._system.lab_repository_management.sync_lab_repositories_if_outdated() + return self._url + + @property + def name(self) -> str: + """Return the name of the lab repository.""" + if hasattr(self._system, "sync_lab_repositories_if_outdated"): + self._system.sync_lab_repositories_if_outdated() + elif hasattr(self._system, "lab_repository_management"): + self._system.lab_repository_management.sync_lab_repositories_if_outdated() + return self._name + + @property + def folder(self) -> str: + """Return the folder name of the lab repository.""" + if hasattr(self._system, "sync_lab_repositories_if_outdated"): + self._system.sync_lab_repositories_if_outdated() + elif hasattr(self._system, "lab_repository_management"): + self._system.lab_repository_management.sync_lab_repositories_if_outdated() + return self._folder + + def remove(self) -> None: + """Remove the lab repository.""" + _LOGGER.info(f"Removing lab repository {self}") + url = self._url_for("lab_repo") + self._session.delete(url) + + if hasattr(self._system, "_lab_repositories"): + if self._id in self._system._lab_repositories: + del self._system._lab_repositories[self._id] + elif hasattr(self._system, "lab_repository_management"): + if self._id in self._system.lab_repository_management._lab_repositories: + del self._system.lab_repository_management._lab_repositories[self._id] + + +class LabRepositoryManagement: + """Manage lab repositories.""" + + _URL_TEMPLATES = { + "lab_repos": "lab_repos", + "lab_repos_refresh": "lab_repos/refresh", + } + + def __init__( + self, + system, + session: httpx.Client, + auto_sync: bool = True, + auto_sync_interval: float = 1.0, + ) -> None: + """ + Manage lab repositories. + + :param system: The SystemManagement instance. + :param session: The httpx-based HTTP client for this session with the server. + :param auto_sync: A boolean indicating whether auto synchronization is enabled. + :param auto_sync_interval: The interval in seconds between auto synchronizations. + """ + self._system = system + self._session = session + self.auto_sync = auto_sync + self.auto_sync_interval = auto_sync_interval + self._last_sync_lab_repository_time = 0.0 + self._lab_repositories: dict[str, LabRepository] = {} + + def __len__(self) -> int: + """Return the number of lab repositories.""" + self.sync_lab_repositories_if_outdated() + return len(self._lab_repositories) + + def _url_for(self, endpoint, **kwargs): + """ + Generate the URL for a given API endpoint. + + :param endpoint: The desired endpoint. + :param **kwargs: Keyword arguments used to format the URL. + :returns: The formatted URL. + """ + return get_url_from_template(endpoint, self._URL_TEMPLATES, kwargs) + + @property + def lab_repositories(self) -> dict[str, LabRepository]: + """Return a dictionary of lab repositories.""" + self.sync_lab_repositories_if_outdated() + return self._lab_repositories.copy() + + def sync_lab_repositories_if_outdated(self) -> None: + """Synchronize lab repositories if they are outdated.""" + timestamp = time.time() + if ( + self.auto_sync + and timestamp - self._last_sync_lab_repository_time + > self.auto_sync_interval + ): + self.sync_lab_repositories() + + def sync_lab_repositories(self) -> None: + """Synchronize lab repositories from the server.""" + url = self._url_for("lab_repos") + lab_repositories = self._session.get(url).json() + lab_repository_ids = [] + + for lab_repository in lab_repositories: + repo_id = lab_repository.get("id") + if repo_id not in self._lab_repositories: + self.add_lab_repository_local(**lab_repository) + lab_repository_ids.append(repo_id) + + for repo_id in tuple(self._lab_repositories): + if repo_id not in lab_repository_ids: + self._lab_repositories.pop(repo_id) + self._last_sync_lab_repository_time = time.time() + + def get_lab_repositories(self) -> list[dict[str, Any]]: + """ + Get the list of configured lab repositories. + + :returns: A list of lab repository objects. + """ + url = self._url_for("lab_repos") + return self._session.get(url).json() + + def add_lab_repository(self, url: str, name: str, folder: str) -> dict[str, Any]: + """ + Add a lab repository. + + :param url: The URL of the lab repository. + :param name: The name of the lab repository. + :param folder: The folder name for the lab repository. + :returns: The created lab repository data. + """ + repo_url = self._url_for("lab_repos") + data = {"url": url, "name": name, "folder": folder} + result = self._session.post(repo_url, json=data).json() + + self.add_lab_repository_local(**result) + return result + + def refresh_lab_repositories(self) -> dict[str, dict[str, Any]]: + """ + Performs a git pull on each configured lab repository and returns the result. + + :returns: A dictionary containing the refresh status for each repository. + """ + url = self._url_for("lab_repos_refresh") + return self._session.put(url).json() + + def add_lab_repository_local( + self, + id: str, + url: str, + name: str, + folder: str, + ) -> LabRepository: + """ + Add a lab repository locally. + + :param id: The unique identifier of the lab repository. + :param url: The URL of the lab repository. + :param name: The name of the lab repository. + :param folder: The folder name for the lab repository. + :returns: The newly created lab repository object. + """ + new_lab_repository = LabRepository(self._system, id, url, name, folder) + self._lab_repositories[id] = new_lab_repository + return new_lab_repository + + def get_lab_repository(self, repo_id: str) -> LabRepository: + """ + Get a lab repository by its ID. + + :param repo_id: The ID of the lab repository. + :returns: The lab repository with the specified ID. + :raises LabRepositoryNotFound: If no lab repository with the specified ID is found. + """ + self.sync_lab_repositories_if_outdated() + if repo_id not in self._lab_repositories: + raise LabRepositoryNotFound(repo_id) + return self._lab_repositories[repo_id] + + def get_lab_repository_by_name(self, name: str) -> LabRepository: + """ + Get a lab repository by its name. + + :param name: The name of the lab repository. + :returns: The lab repository with the specified name. + :raises LabRepositoryNotFound: If no lab repository with the specified name is found. + """ + self.sync_lab_repositories_if_outdated() + for repo in self._lab_repositories.values(): + if repo.name == name: + return repo + raise LabRepositoryNotFound(name) diff --git a/virl2_client/models/licensing.py b/virl2_client/models/licensing.py index f6bc4fce..d226eb89 100644 --- a/virl2_client/models/licensing.py +++ b/virl2_client/models/licensing.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -43,7 +43,6 @@ class Licensing: "authorization_renew": "licensing/authorization/renew", "transport": "licensing/transport", "product_license": "licensing/product_license", - "certificate": "licensing/certificate", "registration": "licensing/registration", "registration_renew": "licensing/registration/renew", "deregistration": "licensing/deregistration", @@ -53,7 +52,7 @@ class Licensing: max_wait = 30 wait_interval = 1.5 - def __init__(self, session: httpx.Client, is_cert_deprecated: bool) -> None: + def __init__(self, session: httpx.Client) -> None: """ Manage licensing. @@ -61,7 +60,6 @@ def __init__(self, session: httpx.Client, is_cert_deprecated: bool) -> None: :param is_cert_deprecated: Whether the certificate supported is deprecated. """ self._session = session - self._is_cert_deprecated = is_cert_deprecated def _url_for(self, endpoint, **kwargs): """ @@ -119,61 +117,6 @@ def set_product_license(self, product_license: str) -> bool: _LOGGER.info("Product license was accepted by the agent.") return response.status_code == 204 - def get_certificate(self) -> str | None: - """ - DEPRECATED: There is no replacement as the certificate support was dropped. - (Reason: the certificate support was dropped in CML 2.7.0) - - Get the currently installed licensing public certificate. - """ - if self._is_cert_deprecated: - warnings.warn( - "'Licensing.get_certificate()' is deprecated.", - ) - return None - url = self._url_for("certificate") - response = self._session.get(url) - if response.is_success: - _LOGGER.info("Certificate received.") - return response.json() - return None - - def install_certificate(self, cert: str) -> bool: - """ - DEPRECATED: There is no replacement as the certificate support was dropped. - (Reason: the certificate support was dropped in CML 2.7.0) - - Set up a licensing public certificate for internal deployment - of an unregistered product instance. - """ - if self._is_cert_deprecated: - warnings.warn( - "'Licensing.install_certificate()' is deprecated.", - ) - return False - url = self._url_for("certificate") - response = self._session.post(url, content=cert) - _LOGGER.info("Certificate was accepted by the agent.") - return response.status_code == 204 - - def remove_certificate(self) -> bool: - """ - DEPRECATED: There is no replacement as the certificate support was dropped. - (Reason: the certificate support was dropped in CML 2.7.0) - - Clear any licensing public certificate for internal deployment - of an unregistered product instance. - """ - if self._is_cert_deprecated: - warnings.warn( - "'Licensing.remove_certificate()' is deprecated.", - ) - return False - url = self._url_for("certificate") - response = self._session.delete(url) - _LOGGER.info("Certificate was removed.") - return response.status_code == 204 - def register(self, token: str, reregister=False) -> bool: """Setup licensing registration.""" url = self._url_for("registration") @@ -218,9 +161,18 @@ def deregister(self) -> int: return response.status_code def features(self) -> list[dict[str, str | int]]: - """Get current licensing features.""" - url = self._url_for("features") - return self._session.get(url).json() + """ + DEPRECATED: Use `.status()` instead. + (Reason: dropped in favor of single call to get the whole licensing status) + + Get current licensing features. + """ + warnings.warn( + "'Licensing.features()' is deprecated. " + "Use '.status()[\"features\"]' instead.", + DeprecationWarning, + ) + return self.status().get("features") def update_features(self, features: dict[str, int] | list[dict[str, int]]) -> None: """Update licensing feature's explicit count in reservation mode.""" diff --git a/virl2_client/models/link.py b/virl2_client/models/link.py index fc4db52c..ac314c3b 100644 --- a/virl2_client/models/link.py +++ b/virl2_client/models/link.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -22,10 +22,9 @@ import logging import time -import warnings from typing import TYPE_CHECKING -from ..utils import check_stale, get_url_from_template, locked +from ..utils import UNCHANGED, _Sentinel, check_stale, get_url_from_template, locked from ..utils import property_s as property if TYPE_CHECKING: @@ -46,6 +45,12 @@ class Link: "start": "{lab}/links/{id}/state/start", "stop": "{lab}/links/{id}/state/stop", "condition": "{lab}/links/{id}/condition", + "capture_start": "{lab}/links/{id}/capture/start", + "capture_stop": "{lab}/links/{id}/capture/stop", + "capture_status": "{lab}/links/{id}/capture/status", + "pcap_file": "{pcap}/{id}", + "pcap_packets": "{pcap}/{id}/packets", + "pcap_packet": "{pcap}/{id}/packets/{packet_id}", } def __init__( @@ -102,7 +107,7 @@ def __eq__(self, other: object): def __hash__(self): return hash(self._id) - def _url_for(self, endpoint, **kwargs): + def _url_for(self, endpoint: str, **kwargs): """ Generate the URL for a given API endpoint. @@ -110,8 +115,11 @@ def _url_for(self, endpoint, **kwargs): :param **kwargs: Keyword arguments used to format the URL. :returns: The formatted URL. """ - kwargs["lab"] = self._lab._url_for("lab") - kwargs["id"] = self.id + if endpoint.startswith("pcap"): + kwargs["pcap"] = f"{self._session.base_url}/api/v0/pcap" + else: + kwargs["lab"] = self._lab._url_for("lab") + kwargs["id"] = self._id return get_url_from_template(endpoint, self._URL_TEMPLATES, kwargs) @property @@ -218,18 +226,6 @@ def _remove_on_server(self) -> None: url = self._url_for("link") self._session.delete(url) - def remove_on_server(self) -> None: - """ - DEPRECATED: Use `.remove()` instead. - (Reason: was never meant to be public, removing only on server is not useful) - - Remove the link on the server. - """ - warnings.warn( - "'Link.remove_on_server()' is deprecated. Use '.remove()' instead.", - ) - self._remove_on_server() - def wait_until_converged( self, max_iterations: int | None = None, wait_time: int | None = None ) -> None: @@ -302,7 +298,12 @@ def stop(self, wait: bool | None = None) -> None: @check_stale def set_condition( - self, bandwidth: int, latency: int, jitter: int, loss: float + self, + bandwidth: int | None | _Sentinel = UNCHANGED, + latency: int | None | _Sentinel = UNCHANGED, + jitter: int | None | _Sentinel = UNCHANGED, + loss: float | None | _Sentinel = UNCHANGED, + **kwargs: dict[str, float | int | bool | None], ) -> None: """ Set the conditioning parameters for the link. @@ -310,15 +311,48 @@ def set_condition( :param bandwidth: The desired bandwidth in kbps (0-10000000). :param latency: The desired latency in ms (0-10000). :param jitter: The desired jitter in ms (0-10000). - :param loss: The desired packet loss percentage (0-100). + :param loss: The desired packet loss in percent (0-100). + :param kwargs: Additional parameters. See below. + + :Keyword Arguments: + - enabled: Whether the link conditioning is enabled. + - delay_corr: The desired packet loss correlation in percent (0-100). + - limit: The desired maximum delay in ms (0-10000). + - loss_corr: The desired packet loss correlation in percent (0-100). + - gap: The desired gap between packets in ms (0-10000). + - duplicate: The desired probability of duplicates in percent (0-100). + - duplicate_corr: The desired correlation of duplicates in percent (0-100). + - reorder_prob: The desired probability of re-orders in percent (0-100). + - reorder_corr: The desired re-order correlation in percent (0-100). + - corrupt_prob: The desired corruption probability in percent (0-100). + - corrupt_corr: The desired corruption correlation in percent (0-100). """ url = self._url_for("condition") - data = { - "bandwidth": bandwidth, - "latency": latency, - "jitter": jitter, - "loss": loss, - } + data: dict[str, float | int | bool] = {} + if bandwidth is not UNCHANGED: + data["bandwidth"] = bandwidth + if latency is not UNCHANGED: + data["latency"] = latency + if jitter is not UNCHANGED: + data["jitter"] = jitter + if loss is not UNCHANGED: + data["loss"] = loss + expected_params = [ + "enabled", + "delay_corr", + "limit", + "loss_corr", + "gap", + "duplicate", + "duplicate_corr", + "reorder_prob", + "reorder_corr", + "corrupt_prob", + "corrupt_corr", + ] + for key, value in kwargs.items(): + if key in expected_params: + data[key] = value self._session.patch(url, json=data) @check_stale @@ -329,9 +363,7 @@ def get_condition(self) -> dict: :returns: A dictionary containing the current conditioning parameters. """ url = self._url_for("condition") - condition = self._session.get(url).json() - keys = ["bandwidth", "latency", "jitter", "loss"] - return {k: v for k, v in condition.items() if k in keys} + return self._session.get(url).json() @check_stale def remove_condition(self) -> None: @@ -386,4 +418,84 @@ def set_condition_by_name(self, name: str) -> None: raise ValueError(msg) latency, bandwidth, loss = options[name] - self.set_condition(bandwidth, latency, 0, loss) + self.set_condition(bandwidth=bandwidth, latency=latency, loss=loss) + + @check_stale + def start_capture( + self, + maxpackets: int | None = None, + maxtime: int | None = None, + bpfilter: str | None = None, + encap: str = "ethernet", + ) -> dict: + """ + Start a packet capture on this link. + + :param maxpackets: Maximum number of packets to capture (1-1000000). If None, server sets default. + :param maxtime: Maximum time in seconds to capture (1-86400). If None, server sets default. + :param bpfilter: Berkeley packet filter string (1-128 chars). + :param encap: Link encapsulation type. + :returns: Dictionary containing the capture status and configuration. + """ + url = self._url_for("capture_start") + data: dict[str, str | int] = {"encap": encap} + + if maxpackets is not None: + data["maxpackets"] = maxpackets + if maxtime is not None: + data["maxtime"] = maxtime + if bpfilter is not None: + data["bpfilter"] = bpfilter + + _LOGGER.info(f"Starting packet capture on link {self._id}") + return self._session.put(url, json=data).json() + + @check_stale + def stop_capture(self) -> None: + """ + Stop the packet capture on this link. + """ + url = self._url_for("capture_stop") + _LOGGER.info(f"Stopping packet capture on link {self._id}") + self._session.put(url) + + @check_stale + def capture_status(self) -> dict: + """ + Get the current packet capture status for this link. + + :returns: Dictionary containing capture configuration, start time, and packet count. + """ + url = self._url_for("capture_status") + return self._session.get(url).json() + + def download_capture(self) -> bytes: + """ + Download the PCAP file for this link's last capture. + + :returns: The PCAP file content as bytes. + """ + url = self._url_for("pcap_file") + _LOGGER.info(f"Downloading PCAP for link {self._id}") + return self._session.get(url).content + + def get_capture_packets(self) -> list[dict]: + """ + Get a list of all captured packets in decoded format from last capture. + + :returns: List of packet dictionaries with decoded packet information. + """ + url = self._url_for("pcap_packets") + _LOGGER.info(f"Getting packet list for link {self._id}") + return self._session.get(url).json() + + def get_capture_packet(self, packet_id: int) -> dict: + """ + Get a specific packet from the last capture in decoded format. + + :param packet_id: The ID of the packet (1-based index). + :returns: Dictionary containing the decoded packet information. + """ + url = self._url_for("pcap_packet", packet_id=packet_id) + _LOGGER.info(f"Downloading packet {packet_id} for link {self._id}") + return self._session.get(url).json() diff --git a/virl2_client/models/node.py b/virl2_client/models/node.py index 3012a1bc..a8694400 100644 --- a/virl2_client/models/node.py +++ b/virl2_client/models/node.py @@ -1,7 +1,7 @@ # # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -23,17 +23,23 @@ import logging import time -import warnings from copy import deepcopy from typing import TYPE_CHECKING, Any +import httpx + from ..exceptions import InterfaceNotFound, SmartAnnotationNotFound -from ..utils import _deprecated_argument, check_stale, get_url_from_template, locked +from ..utils import ( + UNCHANGED, + _deprecated_argument, + _Sentinel, + check_stale, + get_url_from_template, + locked, +) from ..utils import property_s as property if TYPE_CHECKING: - import httpx - from .interface import Interface from .lab import Lab from .link import Link @@ -58,7 +64,7 @@ class Node: "vnc_key": "{lab}/nodes/{id}/keys/vnc", "layer3_addresses": "{lab}/nodes/{id}/layer3_addresses", "operational": "{lab}/nodes/{id}?operational=true&exclude_configurations=true", - "inteface_operational": "{lab}/nodes/{id}/interfaces?data=true&operational=true", + "interface_operational": "{lab}/nodes/{id}/interfaces?data=true&operational=true", } def __init__( @@ -92,6 +98,9 @@ def __init__( of a resource pool. - pinned_compute_id: The ID of the compute this node is pinned to. The node will not run on any other compute. + - priority: The launch priority of the node (0-10000, or None). + The higher the priority, the sooner the node will be started. + - pyats: PyATS credentials for this node (if applicable). """ self._lab: Lab = lab self._id: str = nid @@ -113,14 +122,18 @@ def __init__( self._hide_links: bool = kwargs.get("hide_links", False) self._tags: list[str] = kwargs.get("tags", []) self._parameters: dict = kwargs.get("parameters", {}) + self._pyats: dict[str, str | None] = kwargs.get( + "pyats", {"username": None, "password": None, "enable_password": None} + ) self._pinned_compute_id: str | None = kwargs.get("pinned_compute_id") + self._priority: int | None = kwargs.get("priority") self._operational: dict[str, Any] = kwargs.get("operational", {}) self._state: str | None = None self._session: httpx.Client = lab._session self._stale = False self._last_sync_l3_address_time = 0.0 - self._last_sync_interface_operational_time = 0.0 + self._last_sync_operational_time = 0.0 self.statistics: dict[str, int | float] = { "cpu_usage": 0, @@ -176,13 +189,24 @@ def sync_l3_addresses_if_outdated(self) -> None: ): self.sync_layer3_addresses() + @check_stale + @locked + def sync_operational_if_outdated(self) -> None: + timestamp = time.time() + if ( + self._lab.auto_sync + and timestamp - self._last_sync_operational_time + > self._lab.auto_sync_interval + ): + self.sync_operational() + @check_stale @locked def sync_interface_operational_if_outdated(self) -> None: timestamp = time.time() if ( self._lab.auto_sync - and timestamp - self._last_sync_interface_operational_time + and timestamp - self._last_sync_operational_time > self._lab.auto_sync_interval ): self.sync_interface_operational() @@ -238,7 +262,7 @@ def next_available_interface(self, index: int = 0) -> Interface | None: :returns: An available physical interface or None if all existing ones are connected. """ - for _, iface in enumerate(self.interfaces(), index): + for iface in self.interfaces()[index:]: if not iface.connected and iface.physical: return iface return None @@ -452,37 +476,52 @@ def configuration_files(self) -> list[dict[str, str]] | None: return deepcopy(self._configuration) @property - def config(self) -> str | None: - """ - DEPRECATED: Use `.configuration` instead. - (Reason: consistency with API) + def parameters(self) -> dict: + """Return node parameters.""" + self._lab.sync_topology_if_outdated() + return self._parameters + + @property + def pyats_credentials(self) -> dict[str, str | None]: + """Return pyATS credentials for this node, if configured. - Return the initial configuration of this node. + The value is expected to be a mapping with "username" and "password" keys, + as provided by the backend (for example via the node's node definition). """ - warnings.warn( - "'Node.config' is deprecated. Use '.configuration' instead.", - ) - return self.configuration + self._lab.sync_topology_if_outdated() + return self._pyats - @config.setter @locked - def config(self, value: str) -> None: - """ - DEPRECATED: Use `.configuration` instead. - (Reason: consistency with API) + def set_pyats_credentials( + self, + username: str | None | _Sentinel = UNCHANGED, + password: str | None | _Sentinel = UNCHANGED, + enable_password: str | None | _Sentinel = UNCHANGED, + ) -> None: + """Set pyATS credentials for this node. - Set the initial configuration of this node. - """ - warnings.warn( - "'Node.config' is deprecated. Use '.configuration' instead.", - ) - self.configuration = value + :param username: The username to set, or None to clear it. + :param password: The password to set, or None to clear it. + :param enable_password: The enable password to set, or None to clear it. - @property - def parameters(self) -> dict: - """Return node parameters.""" - self._lab.sync_topology_if_outdated() - return self._parameters + This updates the node on the controller with a ``pyats`` field whose + structure matches the backend expectation, typically:: + + { + "username": "", + "password": "", + "enable_password": "" + } + """ + pyats = self._pyats.copy() + if username is not UNCHANGED: + pyats["username"] = username + if password is not UNCHANGED: + pyats["password"] = password + if enable_password is not UNCHANGED: + pyats["enable_password"] = enable_password + self._set_node_property("pyats", pyats) + self._pyats = pyats def update_parameters(self, new_params: dict) -> None: """ @@ -526,6 +565,19 @@ def pinned_compute_id(self, value) -> None: self._set_node_property("pinned_compute_id", value) self._pinned_compute_id = value + @property + def priority(self) -> int | None: + """Return the priority of the node.""" + self._lab.sync_topology_if_outdated() + return self._priority + + @priority.setter + @locked + def priority(self, value: int | None) -> None: + """Set the priority of the node (0-10000, or None).""" + self._set_node_property("priority", value) + self._priority = value + @property def smart_annotations(self) -> dict[str, SmartAnnotation]: """Return the tags on this node and their corresponding smart annotations.""" @@ -689,6 +741,7 @@ def stop(self, wait=False) -> None: """ url = self._url_for("stop") self._session.put(url) + self._lab.pyats.cleanup(self.label) if self._lab.need_to_wait(wait): self.wait_until_converged() @@ -734,14 +787,16 @@ def console_logs(self, console_id: int, lines: int | None = None) -> dict: return self._session.get(url).json() @check_stale - def console_key(self) -> str: + def console_key(self, console_number: int = 0) -> str: """ Get the console key of the node. + :param console_number: The console number (defaults to 0). :returns: The console key. """ + params = {"line": console_number} url = self._url_for("console_key") - return self._session.get(url).json() + return self._session.get(url, params=params).json() @check_stale def vnc_key(self) -> str: @@ -764,19 +819,6 @@ def _remove_on_server(self) -> None: url = self._url_for("node") self._session.delete(url) - def remove_on_server(self) -> None: - """ - DEPRECATED: Use `.remove()` instead. - (Reason: was never meant to be public, removing only on server is not useful) - - Remove the node on the server. - """ - warnings.warn( - "'Node.remove_on_server()' is deprecated. Use '.remove()' instead.", - ) - # To not change behavior of scripts, this will still remove on server only. - self._remove_on_server() - @check_stale def tags(self) -> list[str]: """ @@ -865,10 +907,14 @@ def sync_layer3_addresses(self) -> None: For this to work, the device has to be attached to the external network in bridge mode and must run DHCP to acquire an IP address. + + If the node is not running or there's an error fetching L3 addresses, + this method will silently clear the discovered addresses rather than + raising an exception. """ url = self._url_for("layer3_addresses") result = self._session.get(url).json() - interfaces = result.get("interfaces", {}) + interfaces = result.get("interfaces") or {} self.map_l3_addresses_to_interfaces(interfaces) @check_stale @@ -879,24 +925,44 @@ def map_l3_addresses_to_interfaces( """ Map layer 3 addresses to interfaces. + This method updates all loaded interfaces on this node: + - Interfaces present in the mapping get updated with new L3 address info + - Interfaces NOT present in the mapping get their L3 addresses cleared + :param mapping: A dictionary mapping MAC addresses to interface information. """ - for mac_address, entry in mapping.items(): - if not (label := entry.get("label")): - continue - try: - iface = self.get_interface_by_label(label) - except InterfaceNotFound: + node_interfaces = self.interfaces() + + id_to_mapping = { + entry["id"]: (mac_address, entry) + for mac_address, entry in mapping.items() + if entry.get("id") + } + + for iface in node_interfaces: + if iface.id not in id_to_mapping: + iface._ip_snooped_info = { + "mac_address": None, + "ipv4": None, + "ipv6": None, + } continue - ipv4 = entry.get("ip4") - ipv6 = entry.get("ip6") + + mac_address, entry = id_to_mapping[iface.id] iface._ip_snooped_info = { "mac_address": mac_address, - "ipv4": ipv4, - "ipv6": ipv6, + "ipv4": entry.get("ip4"), + "ipv6": entry.get("ip6"), } + self._last_sync_l3_address_time = time.time() + def clear_discovered_addresses(self) -> None: + """Clear all discovered L3 addresses for this node from the snooper.""" + url = self._url_for("layer3_addresses") + self._session.delete(url) + self.map_l3_addresses_to_interfaces({}) + @check_stale @locked def sync_operational(self, response: dict[str, Any] | None = None) -> None: @@ -910,19 +976,19 @@ def sync_operational(self, response: dict[str, Any] | None = None) -> None: if response is None: url = self._url_for("operational") response = self._session.get(url).json() - self._operational = response.get("operational") + self._operational = response.get("operational") or {} @check_stale @locked def sync_interface_operational(self) -> None: """Synchronize the operational state of the node's interfaces.""" - url = self._url_for("inteface_operational") + url = self._url_for("interface_operational") response = self._session.get(url).json() self._lab.sync_topology_if_outdated() for interface_data in response: interface = self._lab._interfaces[interface_data["id"]] - interface._operational = interface_data.get("operational") - self._last_sync_interface_operational_time = time.time() + interface._operational = interface_data.get("operational") or {} + self._last_sync_operational_time = time.time() def update( self, diff --git a/virl2_client/models/node_image_definition.py b/virl2_client/models/node_image_definition.py index 124b1f37..917296ba 100644 --- a/virl2_client/models/node_image_definition.py +++ b/virl2_client/models/node_image_definition.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -23,7 +23,6 @@ import os import pathlib import time -import warnings from collections.abc import Callable from typing import TYPE_CHECKING, BinaryIO @@ -126,25 +125,15 @@ def set_node_definition_read_only( url = f"node_definitions/{definition_id}/read_only" return self._session.put(url, json=read_only).json() - def upload_node_definition( - self, body: str | dict, update: bool = False, json: bool | None = None - ) -> str: + def upload_node_definition(self, body: str | dict, update: bool = False) -> str: """ Upload a new node definition. :param body: The node definition (yaml or json). :param update: If creating a new node definition or updating an existing one. - :param json: DEPRECATED: Replaced with type check. :returns: "Success". """ is_json = _is_json_content(body) - if json is not None: - warnings.warn( - "'NodeImageDefinitions.upload_node_definition()': " - "The argument 'json' is deprecated as the content type " - "is determined from the provided 'body'.", - ) - is_json = True url = self._url_for("node_defs") method = "PUT" if update else "POST" if is_json: @@ -153,25 +142,15 @@ def upload_node_definition( # YAML return self._session.request(method, url, content=body).json() - def upload_image_definition( - self, body: str | dict, update: bool = False, json: bool | None = None - ) -> str: + def upload_image_definition(self, body: str | dict, update: bool = False) -> str: """ Upload a new image definition. :param body: The image definition (yaml or json). :param update: If creating a new image definition or updating an existing one. - :param json: DEPRECATED: Replaced with type check. :returns: "Success". """ is_json = _is_json_content(body) - if json is not None: - warnings.warn( - "'NodeImageDefinitions.upload_image_definition()': " - "The argument 'json' is deprecated as the content type " - "is determined from the provided 'body'.", - ) - is_json = True url = self._url_for("image_defs") method = "PUT" if update else "POST" if is_json: diff --git a/virl2_client/models/node_image_definitions.py b/virl2_client/models/node_image_definitions.py index 907e7714..84c53607 100644 --- a/virl2_client/models/node_image_definitions.py +++ b/virl2_client/models/node_image_definitions.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform diff --git a/virl2_client/models/resource_pool.py b/virl2_client/models/resource_pool.py index 48592e69..a880ca96 100644 --- a/virl2_client/models/resource_pool.py +++ b/virl2_client/models/resource_pool.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -99,7 +99,7 @@ def sync_resource_pools(self) -> None: self._add_resource_pool_local(**res_pool) res_pool_ids.append(pool_id) # remove all local pools that don't exist on remove - for local_res_pool_id in list(self._resource_pools): + for local_res_pool_id in tuple(self._resource_pools): if local_res_pool_id not in res_pool_ids: self._resource_pools.pop(local_res_pool_id) self._last_sync_resource_pool_time = time.time() diff --git a/virl2_client/models/resource_pools.py b/virl2_client/models/resource_pools.py index 3cc519d7..ab5e0cc7 100644 --- a/virl2_client/models/resource_pools.py +++ b/virl2_client/models/resource_pools.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform diff --git a/virl2_client/models/smart_annotation.py b/virl2_client/models/smart_annotation.py index 8fb172d9..b3b8f72d 100644 --- a/virl2_client/models/smart_annotation.py +++ b/virl2_client/models/smart_annotation.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -64,7 +64,7 @@ def __init__( """ A VIRL2 lab smart annotation. - :param lab: The lab object to which the link belongs. + :param lab: The lab object to which the smart annotation belongs. :param annotation_id: The ID of the smart annotation. """ self._id = annotation_id diff --git a/virl2_client/models/system.py b/virl2_client/models/system.py index de002654..e23b5fbe 100644 --- a/virl2_client/models/system.py +++ b/virl2_client/models/system.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -27,7 +27,7 @@ from virl2_client.exceptions import ControllerNotFound -from ..utils import _deprecated_argument, get_url_from_template +from ..utils import OptInStatus, _deprecated_argument, get_url_from_template if TYPE_CHECKING: import httpx @@ -41,9 +41,10 @@ class SystemManagement: "compute_hosts": "system/compute_hosts", "notices": "system/notices", "external_connectors": "system/external_connectors", - "external_connector": "system/external_connectors", "web_session_timeout": "web_session_timeout", "host_configuration": "system/compute_hosts/configuration", + "telemetry": "telemetry", + "telemetry_events": "telemetry/events", } def __init__( @@ -98,7 +99,7 @@ def controller(self) -> ComputeHost: for compute_host in self._compute_hosts.values(): if compute_host.is_connector: return compute_host - raise ControllerNotFound + raise ControllerNotFound() @property def system_notices(self) -> dict[str, SystemNotice]: @@ -140,6 +141,28 @@ def maintenance_notice(self, notice: SystemNotice | None) -> None: notice._update(resolved, push_to_server=False) self._maintenance_notice = notice + @property + def telemetry(self) -> dict[str, OptInStatus | str]: + """Return the telemetry state.""" + url = self._url_for("telemetry") + return self._session.get(url).json() + + @property + def telemetry_state(self) -> OptInStatus: + """Return the telemetry state.""" + return OptInStatus(self.telemetry["opt_in"]) + + @telemetry_state.setter + def telemetry_state(self, mode: OptInStatus) -> None: + """Set the telemetry state.""" + url = self._url_for("telemetry") + self._session.put(url, json={"opt_in": mode.name}) + + def get_telemetry_events(self) -> list[dict[str, Any]]: + """Return the list of telemetry events.""" + url = self._url_for("telemetry_events") + return self._session.get(url).json() + def sync_compute_hosts_if_outdated(self) -> None: """Synchronize compute hosts if they are outdated.""" timestamp = time.time() @@ -176,7 +199,7 @@ def sync_compute_hosts(self) -> None: self.add_compute_host_local(**compute_host) compute_host_ids.append(compute_id) - for compute_id in list(self._compute_hosts): + for compute_id in tuple(self._compute_hosts): if compute_id not in compute_host_ids: self._compute_hosts.pop(compute_id) self._last_sync_compute_host_time = time.time() @@ -197,7 +220,7 @@ def sync_system_notices(self) -> None: self.add_system_notice_local(**system_notice) system_notice_ids.append(notice_id) - for notice_id in list(self._system_notices): + for notice_id in tuple(self._system_notices): if notice_id not in system_notice_ids: self._system_notices.pop(notice_id) @@ -238,7 +261,7 @@ def update_external_connector( :param data: The data to update. :returns: The updated data. """ - url = f"{self._url_for('external_connector')}/{connector_id}" + url = f"{self._url_for('external_connectors')}/{connector_id}" return self._session.patch(url, json=data).json() def delete_external_connector(self, connector_id: str) -> None: @@ -247,7 +270,7 @@ def delete_external_connector(self, connector_id: str) -> None: :param connector_id: The ID of the connector to delete. """ - url = f"{self._url_for('external_connector')}/{connector_id}" + url = f"{self._url_for('external_connectors')}/{connector_id}" self._session.delete(url) def get_web_session_timeout(self) -> int: @@ -259,15 +282,15 @@ def get_web_session_timeout(self) -> int: url = self._url_for("web_session_timeout") return self._session.get(url).json() - def set_web_session_timeout(self, timeout: int) -> str: + def set_web_session_timeout(self, timeout: int) -> None: """ Set the web session timeout in seconds. :param timeout: The timeout value in seconds. - :returns: 'OK' + :returns: None """ url = f"{self._url_for('web_session_timeout')}/{timeout}" - return self._session.patch(url).json() + self._session.patch(url) def get_new_compute_host_state(self) -> str: """ diff --git a/virl2_client/models/user.py b/virl2_client/models/user.py index b108ee28..fddf822e 100644 --- a/virl2_client/models/user.py +++ b/virl2_client/models/user.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -20,9 +20,11 @@ from __future__ import annotations +import time +import warnings from typing import TYPE_CHECKING, Any -from ..utils import UNCHANGED, _Sentinel, get_url_from_template +from ..utils import UNCHANGED, OptInStatus, _Sentinel, get_url_from_template if TYPE_CHECKING: import httpx @@ -35,8 +37,17 @@ class UserManagement: "user_id": "users/{username}/id", } - def __init__(self, session: httpx.Client) -> None: + def __init__( + self, + session: httpx.Client, + auto_sync: bool = True, + auto_sync_interval: float = 1.0, + ) -> None: self._session = session + self.auto_sync = auto_sync + self.auto_sync_interval = auto_sync_interval + self._last_sync_users_time = 0.0 + self._users_by_id: dict[str, dict] = {} def _url_for(self, endpoint, **kwargs): """ @@ -57,6 +68,36 @@ def users(self) -> list[dict]: url = self._url_for("users") return self._session.get(url).json() + def sync_users(self) -> None: + """Fetch all users from the server and store them locally.""" + user_list = self.users() + self._users_by_id = {user["id"]: user for user in user_list} + self._last_sync_users_time = time.time() + + def sync_users_if_outdated(self) -> None: + """Synchronize the user list if the auto-sync interval has elapsed.""" + timestamp = time.time() + if ( + self.auto_sync + and timestamp - self._last_sync_users_time > self.auto_sync_interval + ): + self.sync_users() + + def get_username(self, user_id: str) -> str | None: + """Look up a username by user ID from the locally synced user list. + + Triggers a sync if the local list is outdated. Returns ``None`` if + the *user_id* is not found. + + :param user_id: User UUID4. + :returns: The username, or ``None`` if not found. + """ + self.sync_users_if_outdated() + user = self._users_by_id.get(user_id) + if user is not None: + return user["username"] + return None + def get_user(self, user_id: str) -> dict: """ Get user information. @@ -76,7 +117,7 @@ def delete_user(self, user_id: str) -> None: url = self._url_for("user", user_id=user_id) self._session.delete(url) - def create_user(self, username: str, pwd: str, **kwargs: Any) -> dict: + def create_user(self, username: str, pwd: str, **kwargs: dict[str, Any]) -> dict: """ Create a new user. @@ -103,7 +144,7 @@ def create_user(self, username: str, pwd: str, **kwargs: Any) -> dict: url = self._url_for("users") return self._session.post(url, json=data).json() - def update_user(self, user_id: str, **kwargs: Any) -> dict: + def update_user(self, user_id: str, **kwargs: dict[str, Any]) -> dict: """ Update an existing user. @@ -142,9 +183,9 @@ def _prepare_body( password_dict: dict[str, str] | None = None, pubkey: str | None = None, resource_pool: str | None | _Sentinel = UNCHANGED, - opt_in: bool | None | _Sentinel = UNCHANGED, + opt_in: OptInStatus | bool | None | _Sentinel = UNCHANGED, tour_version: str | None = None, - ) -> dict[str, Any]: + ) -> None: optional_data = { "fullname": fullname, "description": description, @@ -156,16 +197,27 @@ def _prepare_body( "pubkey": pubkey, "tour_version": tour_version, } - sentinel_data = { - "resource_pool": resource_pool, - "opt_in": opt_in, - } for key, value in optional_data.items(): if value is not None: data[key] = value - for key, value in sentinel_data.items(): - if value != UNCHANGED: - data[key] = value + if resource_pool is not UNCHANGED: + data["resource_pool"] = resource_pool + if opt_in is UNCHANGED: + return + + if not isinstance(opt_in, OptInStatus): + warnings.warn( + "Using boolean or None values for opt_in are deprecated. " + f"Use one of {[str(status) for status in OptInStatus]} instead.", + DeprecationWarning, + ) + if opt_in is None: + opt_in = OptInStatus.UNSET + elif opt_in is False: + opt_in = OptInStatus.DECLINED + else: + opt_in = OptInStatus.ACCEPTED + data["opt_in"] = opt_in.value def user_groups(self, user_id: str) -> list[str]: """ diff --git a/virl2_client/models/users.py b/virl2_client/models/users.py index bec55376..f12b76ab 100644 --- a/virl2_client/models/users.py +++ b/virl2_client/models/users.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform diff --git a/virl2_client/utils.py b/virl2_client/utils.py index 43e0a360..4b34e901 100644 --- a/virl2_client/utils.py +++ b/virl2_client/utils.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -23,6 +23,7 @@ import warnings from collections.abc import Callable from contextlib import nullcontext +from enum import Enum from functools import wraps from typing import TYPE_CHECKING, Any, Type, TypeVar, cast @@ -56,6 +57,12 @@ def __repr__(self): _CONFIG_MODE = "exclude_configurations=false" +class OptInStatus(Enum): + ACCEPTED = "accepted" + DECLINED = "declined" + UNSET = "unset" + + def _make_not_found(instance: Element) -> ElementNotFound: """Composes and raises an ElementNotFound error for the given instance.""" class_name = type(instance).__name__ diff --git a/virl2_client/virl2_client.py b/virl2_client/virl2_client.py index bcd41b09..70375051 100644 --- a/virl2_client/virl2_client.py +++ b/virl2_client/virl2_client.py @@ -1,6 +1,6 @@ # # This file is part of VIRL 2 -# Copyright (c) 2019-2025, Cisco Systems, Inc. +# Copyright (c) 2019-2026, Cisco Systems, Inc. # All rights reserved. # # Python bindings for the Cisco VIRL 2 Network Simulation Platform @@ -20,16 +20,18 @@ from __future__ import annotations +import getpass import logging import os import re +import sys import time import warnings from enum import Enum from functools import lru_cache from pathlib import Path from threading import RLock -from typing import Any, NamedTuple +from typing import NamedTuple from urllib.parse import urljoin, urlsplit, urlunsplit import httpx @@ -47,7 +49,6 @@ UserManagement, ) from .models.authentication import make_session -from .models.configuration import get_configuration from .utils import _deprecated_argument, get_url_from_template, locked _LOGGER = logging.getLogger(__name__) @@ -75,43 +76,33 @@ def parse_version_str(version_str: str) -> str: def __repr__(self): return self.version_str - def __eq__(self, other): - return ( - isinstance(other, self.__class__) - and self.major == other.major - and self.minor == other.minor - and self.patch == other.patch - ) + def _as_tuple(self) -> tuple[int, int, int]: + return (self.major, self.minor, self.patch) - def __gt__(self, other): - if isinstance(other, self.__class__): - if self.major > other.major: - return True - elif self.major == other.major: - if self.minor > other.minor: - return True - elif self.minor == other.minor: - if self.patch > other.patch: - return True - return False + def __eq__(self, other: object) -> bool: + if not isinstance(other, Version): + return False + return self._as_tuple() == other._as_tuple() - def __ge__(self, other): - return self == other or self > other - - def __lt__(self, other): - if isinstance(other, self.__class__): - if self.major < other.major: - return True - elif self.major == other.major: - if self.minor < other.minor: - return True - elif self.minor == other.minor: - if self.patch < other.patch: - return True - return False + def __gt__(self, other: object) -> bool: + if not isinstance(other, Version): + return False + return self._as_tuple() > other._as_tuple() + + def __ge__(self, other: object) -> bool: + if not isinstance(other, Version): + return False + return self._as_tuple() >= other._as_tuple() - def __le__(self, other): - return self == other or self < other + def __lt__(self, other: object) -> bool: + if not isinstance(other, Version): + return False + return self._as_tuple() < other._as_tuple() + + def __le__(self, other: object) -> bool: + if not isinstance(other, Version): + return False + return self._as_tuple() <= other._as_tuple() def major_differs(self, other: Version) -> bool: return self.major != other.major @@ -136,9 +127,19 @@ class ClientConfig(NamedTuple): """Stores client library configuration, which can be used to create any number of identically configured instances of ClientLibrary.""" + _CONFIG_FILE_NAME = ".virlrc" + _CONFIG_SOURCES = { + "url": ["VIRL2_URL", "VIRL_HOST"], + "username": ["VIRL2_USER", "VIRL_USERNAME"], + "password": ["VIRL2_PASS", "VIRL_PASSWORD"], + "jwtoken": ["VIRL2_JWT"], + "ssl_verify": ["CA_BUNDLE", "CML_VERIFY_CERT"], + } + url: str | None = None username: str | None = None password: str | None = None + jwtoken: str | None = None ssl_verify: bool | str = True allow_http: bool = False auto_sync: float = 1.0 @@ -146,23 +147,138 @@ class ClientConfig(NamedTuple): raise_for_auth_failure: bool = True convergence_wait_max_iter: int = 500 convergence_wait_time: int | float = 5 + check_version: bool = True def make_client(self) -> ClientLibrary: client = ClientLibrary( url=self.url, username=self.username, password=self.password, + jwtoken=self.jwtoken, ssl_verify=self.ssl_verify, raise_for_auth_failure=self.raise_for_auth_failure, allow_http=self.allow_http, convergence_wait_max_iter=self.convergence_wait_max_iter, convergence_wait_time=self.convergence_wait_time, + check_version=self.check_version, events=self.events, ) client.auto_sync_interval = self.auto_sync client.auto_sync = self.auto_sync >= 0.0 and not self.events return client + @classmethod + def _get_from_file(cls, virlrc_parent: Path, prop_name: str) -> str | None: + virlrc = virlrc_parent / cls._CONFIG_FILE_NAME + if virlrc.is_file(): + with virlrc.open() as fh: + config = fh.readlines() + + for line in config: + if line.startswith(prop_name): + prop = line.split("=")[1].strip() + if prop.startswith('"') and prop.endswith('"'): + prop = prop[1:-1] + return prop + return None + + @classmethod + def _get_prop(cls, prop_name: str) -> str | None: + cwd = Path.cwd() + if prop := cls._get_from_file(cwd, prop_name): + return prop + + for path in cwd.parents: + if prop := cls._get_from_file(path, prop_name): + return prop + + return cls._get_from_file(Path.home(), prop_name) or None + + @classmethod + def _populate_from_env(cls, config: dict): + for key, env_vars in cls._CONFIG_SOURCES.items(): + if config[key] is not None: + continue + for env_var in env_vars: + if value := os.getenv(env_var): + config[key] = value + break + + @classmethod + def _populate_from_rc_files(cls, config: dict): + for key, env_vars in cls._CONFIG_SOURCES.items(): + if config[key] is None: + config[key] = cls._get_prop(env_vars[0]) + + @classmethod + def _populate_from_inputs(cls, config: dict): + if config["url"] is None: + config["url"] = input("Please enter the IP / hostname of your CML server: ") + + if config["username"] is None and config["jwtoken"] is None: + auth_input = input("Please enter your username or JWT (if using a token): ") + if len(auth_input) > 32: + config["jwtoken"] = auth_input + else: + config["username"] = auth_input + + if config["username"] is not None and config["password"] is None: + config["password"] = getpass.getpass("Please enter your password: ") + + @classmethod + def _validate(cls, config: dict, final=False) -> bool: + message = None + if not config["url"]: + message = "No URL provided." + if not (config["jwtoken"] or (config["username"] and config["password"])): + message = "Incomplete authentication configuration." + ssl_verify_pending = config["ssl_verify"] is None + if final: + if message: + raise InitializationError(message) + elif ssl_verify_pending: + config["ssl_verify"] = True + return True + return not ssl_verify_pending and not message + + @classmethod + def get_configuration( + cls, + url: str | None, + username: str | None, + password: str | None, + jwtoken: str | None, + ssl_verify: bool | str | None, + allow_inputs: bool | None = None, + ) -> "ClientConfig": + config = { + "url": url, + "username": username, + "password": password, + "jwtoken": jwtoken, + "ssl_verify": ssl_verify, + } + + cls._populate_from_env(config) + if cls._validate(config): + return cls(**config) + + cls._populate_from_rc_files(config) + if cls._validate(config): + return cls(**config) + + if allow_inputs is None: + if not sys.stdin.isatty(): + warnings.warn( + "Interactive inputs are deprecated when stdin is not a TTY. " + "In the future, allow_inputs will default to False in such cases.", + DeprecationWarning, + ) + if allow_inputs is not False: + cls._populate_from_inputs(config) + if cls._validate(config, final=True): + return cls(**config) + class DiagnosticsCategory(Enum): ALL = "all" @@ -181,28 +297,11 @@ class ClientLibrary: """Python bindings for the REST API of a CML controller.""" # current client version - VERSION = Version("2.9.1") - # list of Version objects - INCOMPATIBLE_CONTROLLER_VERSIONS = [ - Version("2.0.0"), - Version("2.0.1"), - Version("2.1.0"), - Version("2.1.1"), - Version("2.1.2"), - Version("2.2.1"), - Version("2.2.2"), - Version("2.2.3"), - Version("2.3.0"), - Version("2.3.1"), - Version("2.4.0"), - Version("2.4.1"), - Version("2.5.0"), - Version("2.5.1"), - Version("2.6.0"), - Version("2.6.1"), - ] + VERSION = Version("2.10.0") + _URL_TEMPLATES = { - "auth_test": "authok", + "auth": "authentication", + "old_auth": "authok", "system_info": "system_information", "import": "import", "import_1x": "import/virl-1x", @@ -222,55 +321,43 @@ def __init__( url: str | None = None, username: str | None = None, password: str | None = None, - ssl_verify: bool | str = True, + jwtoken: str | None = None, + ssl_verify: bool | str | None = None, raise_for_auth_failure: bool = False, allow_http: bool = False, convergence_wait_max_iter: int = 500, convergence_wait_time: int | float = 5, events: bool = False, client_type: str = None, + check_version: bool = True, ) -> None: - """ - Initialize a ClientLibrary instance. Note that ssl_verify can - also be a string that points to a cert (see class documentation). - - :param url: URL of controller. It's also possible to pass the - URL via the ``VIRL2_URL`` or ``VIRL_HOST`` environment variable. - If no protocol scheme is provided, "https:" is used. - :param username: Username of the user to authenticate. It's also possible - to pass the username via ``VIRL2_USER`` or ``VIRL_USERNAME`` variable. - :param password: Password of the user to authenticate. It's also possible - to pass the password via ``VIRL2_PASS`` or ``VIRL_PASSWORD`` variable. - :param ssl_verify: Path of the SSL controller certificate, or True to load - from ``CA_BUNDLE`` or ``CML_VERIFY_CERT`` environment variable, - or False to disable. - :param raise_for_auth_failure: Raise an exception if unable to connect to - controller. (Use for scripting scenarios.) - :param allow_http: If set, a https URL will not be enforced. - :param convergence_wait_max_iter: Maximum number of iterations for convergence. - :param convergence_wait_time: Time in seconds to sleep between convergence calls - on the backend. - :param events: A flag indicating whether to enable event-based data - synchronization from the server. When enabled, utilizes a mechanism for - receiving real-time updates from the server, instead of periodically - requesting the data. - :raises InitializationError: If no URL is provided, authentication fails or host - can't be reached. - """ - url, username, password, cert = get_configuration( - url, username, password, ssl_verify + client_config = ClientConfig.get_configuration( + url, username, password, jwtoken, ssl_verify ) - if cert is not None: - ssl_verify = cert - - url, base_url = _prepare_url(url, allow_http) - self.username: str = username - self.password: str = password + self.allow_http = allow_http + url, base_url = _prepare_url(client_config.url, allow_http) + self.username: str | None = client_config.username + self.password: str | None = client_config.password + self.jwtoken: str | None = client_config.jwtoken + self.url: str = url + self.raise_for_auth_failure = raise_for_auth_failure + self.check_version = check_version - if ssl_verify is False: + self._ssl_verify = client_config.ssl_verify + if client_config.ssl_verify is False: _LOGGER.warning("SSL Verification disabled") - self._ssl_verify = ssl_verify + self.auto_sync = True + """`auto_sync` automatically syncs data with the backend after a specific + time. The default expiry time is 1.0s. This time can be configured by + setting the `auto_sync_interval`.""" + self.auto_sync_interval = 1.0 # seconds + + self.convergence_wait_max_iter = convergence_wait_max_iter + self.convergence_wait_time = convergence_wait_time + + self._labs: dict[str, Lab] = {} + try: self._session = make_session(base_url, ssl_verify, client_type) except httpx.InvalidURL as exc: @@ -283,26 +370,13 @@ def __init__( # which has no logout function; this TokenAuth function will, therefore, # not be visible to a type checker, causing warnings. - self.auto_sync = True - """`auto_sync` automatically syncs data with the backend after a specific - time. The default expiry time is 1.0s. This time can be configured by - setting the `auto_sync_interval`.""" - self.auto_sync_interval = 1.0 # seconds - - self.convergence_wait_max_iter = convergence_wait_max_iter - self.convergence_wait_time = convergence_wait_time - - self.allow_http = allow_http self.definitions = NodeImageDefinitions(self._session) - - self.url: str = url - self.raise_for_auth_failure = raise_for_auth_failure - self._labs: dict[str, Lab] = {} - - self.licensing = Licensing( - self._session, is_cert_deprecated=controller_version >= Version("2.7.0") + self.licensing = Licensing(self._session) + self.user_management = UserManagement( + self._session, + auto_sync=self.auto_sync, + auto_sync_interval=self.auto_sync_interval, ) - self.user_management = UserManagement(self._session) self.group_management = GroupManagement(self._session) self.system_management = SystemManagement( self._session, @@ -321,7 +395,7 @@ def __init__( ) try: - self._make_test_auth_call() + self._make_test_auth_call(controller_version >= Version("2.10.0")) except InitializationError as exc: if raise_for_auth_failure: raise @@ -352,15 +426,18 @@ def _url_for(self, endpoint, **kwargs): """ return get_url_from_template(endpoint, self._URL_TEMPLATES, kwargs) - def _make_test_auth_call(self) -> None: + def _make_test_auth_call(self, new_auth: bool) -> None: """ Make a call to confirm that authentication works. :raises InitializationError: If authentication fails. """ - url = self._url_for("auth_test") + if new_auth: + url = self._url_for("auth") + else: + url = self._url_for("old_auth") try: - self._session.get(url) + response = self._session.get(url) except httpx.HTTPStatusError as exc: status_code = exc.response.status_code if status_code == httpx.codes.FORBIDDEN: @@ -371,28 +448,11 @@ def _make_test_auth_call(self) -> None: raise except httpx.HTTPError as exc: raise InitializationError(exc) - - @staticmethod - def _environ_get( - key: str, value: Any | None = None, default: Any | None = None - ) -> Any | None: - """ - If the value is not yet set, fetch it from the environment or return the default - value. - - :param key: The key to fetch the value for. - :param value: The value to use if it is already set. - :param default: The default value to use if the key is not set - and value is None. - :returns: The fetched value or the default value. - """ - if value is None: - value = os.environ.get(key) - if value: - _LOGGER.info(f"Using value {key} from environment") - else: - value = default - return value + if new_auth: + user_info: dict = response.json() + self.user_id = user_info["id"] + self.admin = user_info.get("admin", False) + self.username = user_info["username"] @property def uuid(self) -> str: @@ -428,35 +488,40 @@ def system_info(self) -> dict: def check_controller_version(self) -> Version | None: """ Check remote controller version against current client version - (specified in `self.VERSION`) and against controller version - blacklist (specified in `self.INCOMPATIBLE_CONTROLLER_VERSIONS`). + (specified in `self.VERSION` and support last 3 minor versions). Raise exception if versions are incompatible, or print warning if the client minor version is lower than the controller minor version. + These all are disabled if `self.check_version` attribute is set to False. + + :raises InitializationError: If the controller version is incompatible. + :returns: None """ - controller_version = self.system_info().get("version", "") + controller_version_str = self.system_info().get("version", "") try: - controller_version_obj = Version(controller_version) + controller_version = Version(controller_version_str) except (TypeError, ValueError): - _LOGGER.warning(f"Invalid version detected: {controller_version}!") + _LOGGER.warning(f"Invalid version detected: {controller_version_str}!") + return None + + if not self.check_version: return None - if controller_version_obj in self.INCOMPATIBLE_CONTROLLER_VERSIONS: + if self.VERSION.major_lt(controller_version): raise InitializationError( - f"Controller version {controller_version_obj} is marked incompatible! " - f"List of versions marked explicitly as incompatible: " - f"{self.INCOMPATIBLE_CONTROLLER_VERSIONS}." + "Major version mismatch. " + f"Client {self.VERSION}, controller {controller_version}." ) - if self.VERSION.major_lt(controller_version_obj): + if self.VERSION.minor - 3 >= controller_version.minor: raise InitializationError( - f"Major version mismatch. Client {self.VERSION}, " - f"controller {controller_version_obj}." + "Unsupported minor version (only last 3 minor versions are supported). " + f"Client {self.VERSION}, controller {controller_version}." ) - if self.VERSION.minor_lt(controller_version_obj): + if self.VERSION.minor_lt(controller_version): _LOGGER.warning( - f"Please ensure the client version is compatible with the controller " - f"version. Client {self.VERSION}, controller {controller_version_obj}." + "Please ensure the client version is compatible with the controller " + f"version. Client {self.VERSION}, controller {controller_version}." ) - return controller_version_obj + return controller_version def is_system_ready( self, wait: bool = False, max_wait: int = 60, sleep: int = 5 @@ -583,6 +648,7 @@ def _create_imported_lab( auto_sync=self.auto_sync, auto_sync_interval=self.auto_sync_interval, resource_pool_manager=self.resource_pool_management, + user_management=self.user_management, ) @locked @@ -645,7 +711,7 @@ def all_labs(self, show_all: bool = False) -> list[Lab]: @locked def _remove_stale_labs(self): """Remove stale labs from the client library.""" - for lab in list(self._labs.values()): + for lab in tuple(self._labs.values()): if lab._stale: self._remove_lab_local(lab) @@ -680,6 +746,8 @@ def create_lab( title: str | None = None, description: str | None = None, notes: str | None = None, + autostart: dict | None = None, + node_staging: dict | None = None, ) -> Lab: """ Create a new lab with optional title, description, and notes. @@ -700,10 +768,21 @@ def create_lab( :param title: The title of the lab. :param description: The description of the lab. :param notes: The notes of the lab. + :param autostart: Parameter for autostart (enabled, priority, delay). + :param node_staging: Parameter for node staging (enabled, abort_on_failure, start_remaining). :returns: A Lab instance representing the created lab. """ url = self._url_for("labs") - body = {"title": title, "description": description, "notes": notes} + body: dict[str, str | dict | None] = { + "title": title, + "description": description, + "notes": notes, + } + if autostart: + body["autostart"] = autostart + if node_staging: + body["node_staging"] = node_staging + # exclude values left at None body = {k: v for k, v in body.items() if v is not None} result = self._session.post(url, json=body).json() @@ -719,6 +798,7 @@ def create_lab( wait_max_iterations=self.convergence_wait_max_iter, wait_time=self.convergence_wait_time, resource_pool_manager=self.resource_pool_management, + user_management=self.user_management, ) lab._import_lab(result, created=True) self._labs[lab_id] = lab @@ -806,10 +886,12 @@ def join_existing_lab(self, lab_id: str, sync_lab: bool = True) -> Lab: wait_max_iterations=self.convergence_wait_max_iter, wait_time=self.convergence_wait_time, resource_pool_manager=self.resource_pool_management, + user_management=self.user_management, ) if sync_lab: lab.import_lab(topology) lab._initialized = True + lab._last_sync_topology_time = time.time() else: lab._owner = None self._labs[lab_id] = lab @@ -833,6 +915,12 @@ def get_diagnostics(self, *categories: DiagnosticsCategory) -> dict: DeprecationWarning, ) categories = [DiagnosticsCategory.ALL] + if DiagnosticsCategory.USER_LIST in categories: + warnings.warn( + "'DiagnosticsCategory.USER_LIST' is deprecated. " + "Use UserManagement.users() instead.", + DeprecationWarning, + ) if DiagnosticsCategory.ALL in categories: categories = list(DiagnosticsCategory)[1:] @@ -906,10 +994,8 @@ def get_lab_list(self, show_all: bool = False) -> list[str]: owned by the admin (False). :returns: A list of lab IDs. """ - url: dict[str, str | dict] = {"url": self._url_for("labs")} - if show_all: - url["params"] = {"show_all": True} - return self._session.get(**url).json() + params = {"show_all": True} if show_all else None + return self._session.get(self._url_for("labs"), params=params).json() def _prepare_url(url: str, allow_http: bool) -> tuple[str, str]: