From 4c9c87fa476a1e710dd679db88c54ed11ed6f658 Mon Sep 17 00:00:00 2001 From: michaelboulton Date: Sat, 21 Sep 2024 18:30:23 +0100 Subject: [PATCH] Update deps, precommit, images (#944) --- .github/workflows/main.yml | 6 +- .pre-commit-config.yaml | 10 +- constraints.txt | 184 +++-- docs/source/basics.md | 2 +- docs/source/cookbook.md | 4 +- docs/source/index.md | 2 +- example/advanced/Dockerfile | 2 +- example/components/Dockerfile | 2 +- example/cookies/Dockerfile | 2 +- example/hooks/Dockerfile | 2 +- pyproject.toml | 14 +- requirements.txt | 1102 +++++++++++++++------------- tavern/_core/dict_util.py | 18 +- tavern/_core/exceptions.py | 4 +- tavern/_core/extfunctions.py | 7 +- tavern/_core/general.py | 4 +- tavern/_core/jmesutils.py | 7 +- tavern/_core/loader.py | 4 +- tavern/_core/plugins.py | 17 +- tavern/_core/pytest/config.py | 4 +- tavern/_core/pytest/error.py | 14 +- tavern/_core/pytest/file.py | 31 +- tavern/_core/pytest/item.py | 5 +- tavern/_core/pytest/newhooks.py | 7 +- tavern/_core/pytest/util.py | 10 +- tavern/_core/report.py | 6 +- tavern/_core/run.py | 12 +- tavern/_core/schema/extensions.py | 11 +- tavern/_core/schema/files.py | 6 +- tavern/_core/schema/jsonschema.py | 2 +- tavern/_core/stage_lines.py | 11 +- tavern/_core/strict_util.py | 6 +- tavern/_core/testhelpers.py | 3 +- tavern/_core/tincture.py | 9 +- tavern/_plugins/grpc/client.py | 12 +- tavern/_plugins/grpc/protos.py | 3 +- tavern/_plugins/grpc/request.py | 6 +- tavern/_plugins/grpc/response.py | 13 +- tavern/_plugins/mqtt/client.py | 9 +- tavern/_plugins/mqtt/request.py | 5 +- tavern/_plugins/mqtt/response.py | 23 +- tavern/_plugins/mqtt/tavernhook.py | 9 +- tavern/_plugins/rest/files.py | 10 +- tavern/_plugins/rest/request.py | 7 +- tavern/_plugins/rest/response.py | 9 +- tavern/_plugins/rest/tavernhook.py | 3 +- tavern/entry.py | 5 +- tavern/helpers.py | 9 +- tavern/response.py | 6 +- tests/integration/Dockerfile | 2 +- tests/unit/test_core.py | 28 +- tests/unit/test_mqtt.py | 25 +- tox-integration.ini | 2 +- tox.ini | 2 +- 54 files changed, 958 insertions(+), 760 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e83d8cddc..e94eb3964 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.9" - uses: pre-commit/action@v3.0.0 @@ -52,7 +52,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.9" - name: install deps run: | @@ -114,7 +114,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.9" - name: Install Protoc if: ${{ contains(matrix.TOXENV, 'grpc') }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 500edf2d0..d70ecfef6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,13 +1,13 @@ repos: - repo: https://github.com/asottile/pyupgrade - rev: v3.15.2 + rev: v3.17.0 hooks: - id: pyupgrade args: - - --py38-plus + - --py39-plus files: "tavern/.*" - repo: https://github.com/rhysd/actionlint - rev: v1.7.0 + rev: v1.7.1 hooks: - id: actionlint args: ["-shellcheck="] @@ -16,7 +16,7 @@ repos: hooks: - id: pycln - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: "v0.4.4" + rev: "v0.6.6" hooks: - id: ruff-format - id: ruff @@ -27,7 +27,7 @@ repos: - id: prettier types_or: [yaml] - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.10.0 + rev: v1.11.2 hooks: - id: mypy additional_dependencies: diff --git a/constraints.txt b/constraints.txt index f5f770041..66cea8333 100644 --- a/constraints.txt +++ b/constraints.txt @@ -3,23 +3,24 @@ alabaster==0.7.16 # via sphinx allure-pytest==2.13.5 + # via tavern (pyproject.toml) allure-python-commons==2.13.5 # via allure-pytest -attrs==23.2.0 +attrs==24.2.0 # via # allure-python-commons # jsonschema # pytest # referencing -babel==2.15.0 +babel==2.16.0 # via sphinx blinker==1.8.2 # via flask -cachetools==5.3.3 +cachetools==5.5.0 # via # google-auth # tox -certifi==2024.2.2 +certifi==2024.8.30 # via requests cfgv==3.4.0 # via pre-commit @@ -32,98 +33,125 @@ click==8.1.7 colorama==0.4.6 # via tox colorlog==6.8.2 + # via tavern (pyproject.toml) commonmark==0.9.1 - # via recommonmark -coverage==7.5.1 - # via pytest-cov + # via + # tavern (pyproject.toml) + # recommonmark +coverage==7.6.1 + # via + # tavern (pyproject.toml) + # pytest-cov distlib==0.3.8 # via virtualenv docopt==0.6.2 # via pykwalify docutils==0.20.1 # via + # tavern (pyproject.toml) # flit # recommonmark # sphinx # sphinx-rtd-theme -exceptiongroup==1.2.1 - # via pytest +exceptiongroup==1.2.2 + # via + # tavern (pyproject.toml) + # pytest execnet==2.1.1 # via pytest-xdist -faker==25.1.0 -filelock==3.14.0 +faker==29.0.0 + # via tavern (pyproject.toml) +filelock==3.16.1 # via # tox # virtualenv flask==3.0.3 + # via tavern (pyproject.toml) flit==3.9.0 + # via tavern (pyproject.toml) flit-core==3.9.0 # via flit -fluent-logger==0.11.0 -google-api-core==2.19.0 +fluent-logger==0.11.1 + # via tavern (pyproject.toml) +google-api-core==2.20.0 # via google-api-python-client -google-api-python-client==2.129.0 -google-auth==2.29.0 +google-api-python-client==2.146.0 + # via tavern (pyproject.toml) +google-auth==2.35.0 # via # google-api-core # google-api-python-client # google-auth-httplib2 google-auth-httplib2==0.2.0 # via google-api-python-client -googleapis-common-protos==1.63.0 +googleapis-common-protos==1.65.0 # via # google-api-core # grpcio-status grpc-interceptor==0.15.4 -grpcio==1.63.0 + # via tavern (pyproject.toml) +grpcio==1.66.1 # via + # tavern (pyproject.toml) # grpc-interceptor # grpcio-reflection # grpcio-status -grpcio-reflection==1.62.2 -grpcio-status==1.62.2 +grpcio-reflection==1.62.3 + # via tavern (pyproject.toml) +grpcio-status==1.62.3 + # via tavern (pyproject.toml) httplib2==0.22.0 # via # google-api-python-client # google-auth-httplib2 -identify==2.5.36 +identify==2.6.1 # via pre-commit -idna==3.7 +idna==3.10 # via requests imagesize==1.4.1 # via sphinx +importlib-metadata==8.5.0 + # via + # flask + # markdown + # sphinx iniconfig==2.0.0 # via pytest itsdangerous==2.2.0 - # via flask + # via + # tavern (pyproject.toml) + # flask jinja2==3.1.4 # via # flask # sphinx jmespath==1.0.1 -jsonschema==4.22.0 + # via tavern (pyproject.toml) +jsonschema==4.23.0 + # via tavern (pyproject.toml) jsonschema-specifications==2023.12.1 # via jsonschema -markdown==3.6 +markdown==3.7 # via sphinx-markdown-tables markupsafe==2.1.5 # via # jinja2 # werkzeug -msgpack==1.0.8 +msgpack==1.1.0 # via fluent-logger -nodeenv==1.8.0 +nodeenv==1.9.1 # via pre-commit -packaging==24.0 +packaging==24.1 # via # pyproject-api # pytest # sphinx # tox paho-mqtt==1.6.1 -pbr==6.0.0 + # via tavern (pyproject.toml) +pbr==6.1.0 # via stevedore -platformdirs==4.2.1 +platformdirs==4.3.6 # via # tox # virtualenv @@ -132,56 +160,74 @@ pluggy==1.5.0 # allure-python-commons # pytest # tox -pre-commit==3.7.1 -proto-plus==1.23.0 - # via google-api-core -protobuf==4.25.3 +pre-commit==3.8.0 + # via tavern (pyproject.toml) +proto-plus==1.24.0 # via + # tavern (pyproject.toml) + # google-api-core +protobuf==4.25.5 + # via + # tavern (pyproject.toml) # google-api-core # googleapis-common-protos # grpcio-reflection # grpcio-status # proto-plus py==1.11.0 -pyasn1==0.6.0 + # via tavern (pyproject.toml) +pyasn1==0.6.1 # via # pyasn1-modules # rsa -pyasn1-modules==0.4.0 +pyasn1-modules==0.4.1 # via google-auth pygments==2.18.0 - # via sphinx -pyjwt==2.8.0 + # via + # tavern (pyproject.toml) + # sphinx +pyjwt==2.9.0 + # via tavern (pyproject.toml) pykwalify==1.8.0 -pyparsing==3.1.2 + # via tavern (pyproject.toml) +pyparsing==3.1.4 # via httplib2 -pyproject-api==1.6.1 +pyproject-api==1.8.0 # via tox pytest==7.2.2 # via + # tavern (pyproject.toml) # allure-pytest # pytest-cov # pytest-xdist pytest-cov==5.0.0 + # via tavern (pyproject.toml) pytest-xdist==3.6.1 + # via tavern (pyproject.toml) python-box==6.1.0 + # via tavern (pyproject.toml) python-dateutil==2.9.0.post0 # via # faker # pykwalify -pyyaml==6.0.1 - # via pre-commit +pyyaml==6.0.2 + # via + # tavern (pyproject.toml) + # pre-commit recommonmark==0.7.1 + # via tavern (pyproject.toml) referencing==0.35.1 # via # jsonschema # jsonschema-specifications -requests==2.31.0 + # types-jsonschema +requests==2.32.3 # via + # tavern (pyproject.toml) # flit # google-api-core # sphinx -rpds-py==0.18.1 +rpds-py==0.20.0 # via # jsonschema # referencing @@ -191,37 +237,41 @@ ruamel-yaml==0.18.6 # via pykwalify ruamel-yaml-clib==0.2.8 # via ruamel-yaml -ruff==0.4.4 -setuptools==69.5.1 - # via nodeenv +ruff==0.6.6 + # via tavern (pyproject.toml) six==1.16.0 # via python-dateutil snowballstemmer==2.2.0 # via sphinx -sphinx==7.3.7 +sphinx==7.4.7 # via + # tavern (pyproject.toml) # recommonmark # sphinx-rtd-theme # sphinxcontrib-jquery sphinx-markdown-tables==0.0.17 + # via tavern (pyproject.toml) sphinx-rtd-theme==2.0.0 -sphinxcontrib-applehelp==1.0.8 + # via tavern (pyproject.toml) +sphinxcontrib-applehelp==2.0.0 # via sphinx -sphinxcontrib-devhelp==1.0.6 +sphinxcontrib-devhelp==2.0.0 # via sphinx -sphinxcontrib-htmlhelp==2.0.5 +sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jquery==4.1 # via sphinx-rtd-theme sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.7 +sphinxcontrib-qthelp==2.0.0 # via sphinx -sphinxcontrib-serializinghtml==1.1.10 +sphinxcontrib-serializinghtml==2.0.0 # via sphinx stevedore==4.1.1 + # via tavern (pyproject.toml) tomli==2.0.1 # via + # tavern (pyproject.toml) # coverage # pyproject-api # pytest @@ -229,21 +279,35 @@ tomli==2.0.1 # tox tomli-w==1.0.0 # via flit -tox==4.15.0 +tox==4.20.0 + # via tavern (pyproject.toml) +types-jmespath==1.0.2.20240106 + # via tavern (pyproject.toml) +types-jsonschema==4.23.0.20240813 + # via tavern (pyproject.toml) +types-paho-mqtt==1.6.0.20240321 + # via tavern (pyproject.toml) types-protobuf==4.25.0.20240417 -types-pyyaml==6.0.12.20240311 -types-requests==2.31.0.20240406 + # via tavern (pyproject.toml) +types-pyyaml==6.0.12.20240917 + # via tavern (pyproject.toml) +types-requests==2.32.0.20240914 + # via tavern (pyproject.toml) uritemplate==4.1.1 # via google-api-python-client -urllib3==2.2.1 +urllib3==2.2.3 # via # requests # types-requests -uv==0.1.42 -virtualenv==20.26.1 +uv==0.4.15 + # via tavern (pyproject.toml) +virtualenv==20.26.5 # via # pre-commit # tox -werkzeug==3.0.3 +werkzeug==3.0.4 # via flask -wheel==0.43.0 +wheel==0.44.0 + # via tavern (pyproject.toml) +zipp==3.20.2 + # via importlib-metadata diff --git a/docs/source/basics.md b/docs/source/basics.md index e0c379349..161e0858a 100644 --- a/docs/source/basics.md +++ b/docs/source/basics.md @@ -1520,7 +1520,7 @@ third block must start with 4 and the third block must start with 8, 9, "A", or ``` This is using the `!re_fullmatch` variant of the tag - this calls -[`re.fullmatch`](https://docs.python.org/3.8/library/re.html#re.fullmatch) under +[`re.fullmatch`](https://docs.python.org/3.9/library/re.html#re.fullmatch) under the hood, which means that the regex given needs to match the _entire_ part of the response that is being checked for it to pass. There is also `!re_search` which will pass if it matches _part_ of the thing being checked, or `!re_match` diff --git a/docs/source/cookbook.md b/docs/source/cookbook.md index c6929a6d4..3636a2e62 100644 --- a/docs/source/cookbook.md +++ b/docs/source/cookbook.md @@ -23,7 +23,7 @@ any Pytest plugins as mentioned above): ```dockerfile # tavern.Dockerfile -FROM python:3.10-slim +FROM python:3.9-slim RUN pip3 install tavern ``` @@ -38,7 +38,7 @@ Or if you need a specific version (hopefully you shouldn't): ```dockerfile # tavern.Dockerfile -FROM python:3.10-slim +FROM python:3.9-slim ARG TAVERNVER RUN pip3 install tavern==$TAVERNVER diff --git a/docs/source/index.md b/docs/source/index.md index 105814a87..3e32bbfd4 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -4,7 +4,7 @@ Tavern is an advanced pytest based API testing framework for HTTP, MQTT or other protocols. Note that Tavern **only** supports Python 3.4 and up. At the time of writing we -test against Python 3.8-3.10. Python 2 is now **unsupported**. +test against Python 3.10. Python 2 is now **unsupported**. ## Why Tavern diff --git a/example/advanced/Dockerfile b/example/advanced/Dockerfile index 09ad42407..d78f591f5 100644 --- a/example/advanced/Dockerfile +++ b/example/advanced/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10-alpine +FROM python:3.9-alpine RUN pip3 install 'pyjwt>=2.4.0,<3' 'flask>=2.2.3' diff --git a/example/components/Dockerfile b/example/components/Dockerfile index f07717262..c98d0e4d3 100644 --- a/example/components/Dockerfile +++ b/example/components/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10-alpine +FROM python:3.9-alpine RUN pip3 install pyjwt~=2.4.0 flask~=2.0.3 diff --git a/example/cookies/Dockerfile b/example/cookies/Dockerfile index 68b46a7f7..35cd9eac1 100644 --- a/example/cookies/Dockerfile +++ b/example/cookies/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10-alpine +FROM python:3.9-alpine RUN pip3 install pyjwt~=2.4.0 flask~=2.0.3 diff --git a/example/hooks/Dockerfile b/example/hooks/Dockerfile index edd2733d2..f58ef5f33 100644 --- a/example/hooks/Dockerfile +++ b/example/hooks/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10-alpine +FROM python:3.9-alpine RUN pip3 install 'pyjwt>=2.4.0,<3' 'flask>=2.2.3' diff --git a/pyproject.toml b/pyproject.toml index ece3b1ef0..c1ecacffe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,6 @@ classifiers = [ "Intended Audience :: Developers", "Framework :: Pytest", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", @@ -38,7 +37,7 @@ dependencies = [ "stevedore>=4,<5", ] -requires-python = ">=3.8" +requires-python = ">=3.9" [[project.authors]] name = "Michael Boulton" @@ -85,6 +84,9 @@ dev = [ "types-PyYAML", "types-protobuf>=4,<5", "types-requests", + "types-jsonschema", + "types-paho-mqtt", + "types-jmespath", "sphinx>=7,<8", "sphinx_rtd_theme", "recommonmark", @@ -92,8 +94,10 @@ dev = [ "docutils", "pygments", "sphinx-markdown-tables", -# "grpcio-tools", "grpc-interceptor", + # for pytest + "exceptiongroup", + "tomli" # This has to be installed separately, otherwise you can't upload to pypi # "tbump@https://github.com/michaelboulton/tbump/archive/714ba8957a3c84b625608ceca39811ebe56229dc.zip", ] @@ -115,7 +119,7 @@ paho-mqtt = "tavern._plugins.mqtt.tavernhook" grpc = "tavern._plugins.grpc.tavernhook" [tool.mypy] -python_version = 3.8 +python_version = 3.9 # See https://mypy.readthedocs.io/en/stable/running_mypy.html#mapping-file-paths-to-modules explicit_package_bases = true @@ -163,7 +167,7 @@ norecursedirs = [ ] [tool.ruff] -target-version = "py38" +target-version = "py39" extend-exclude = [ "tests/unit/tavern_grpc/test_services_pb2.py", "tests/unit/tavern_grpc/test_services_pb2.pyi", diff --git a/requirements.txt b/requirements.txt index 8bfd55348..7ecaef9d5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,35 +7,36 @@ alabaster==0.7.16 \ allure-pytest==2.13.5 \ --hash=sha256:0ef8e1790c44a988db6b83c4d4f5e91451e2c4c8ea10601dfa88528d23afcf6e \ --hash=sha256:94130bac32964b78058e62cf4b815ad97a5ac82a065e6dd2d43abac2be7640fc + # via tavern (pyproject.toml) allure-python-commons==2.13.5 \ --hash=sha256:8b0e837b6e32d810adec563f49e1d04127a5b6770e0232065b7cb09b9953980d \ --hash=sha256:a232e7955811f988e49a4c1dd6c16cce7e9b81d0ea0422b1e5654d3254e2caf3 # via allure-pytest -attrs==23.2.0 \ - --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ - --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 +attrs==24.2.0 \ + --hash=sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346 \ + --hash=sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 # via # allure-python-commons # jsonschema # pytest # referencing -babel==2.15.0 \ - --hash=sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb \ - --hash=sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413 +babel==2.16.0 \ + --hash=sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b \ + --hash=sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316 # via sphinx blinker==1.8.2 \ --hash=sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01 \ --hash=sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83 # via flask -cachetools==5.3.3 \ - --hash=sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945 \ - --hash=sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105 +cachetools==5.5.0 \ + --hash=sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292 \ + --hash=sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a # via # google-auth # tox -certifi==2024.2.2 \ - --hash=sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f \ - --hash=sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 +certifi==2024.8.30 \ + --hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \ + --hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9 # via requests cfgv==3.4.0 \ --hash=sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9 \ @@ -148,64 +149,89 @@ colorama==0.4.6 \ colorlog==6.8.2 \ --hash=sha256:3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44 \ --hash=sha256:4dcbb62368e2800cb3c5abd348da7e53f6c362dda502ec27c560b2e58a66bd33 + # via tavern (pyproject.toml) commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 - # via recommonmark -coverage==7.5.1 \ - --hash=sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de \ - --hash=sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661 \ - --hash=sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26 \ - --hash=sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41 \ - --hash=sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d \ - --hash=sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981 \ - --hash=sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2 \ - --hash=sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34 \ - --hash=sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f \ - --hash=sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a \ - --hash=sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35 \ - --hash=sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223 \ - --hash=sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1 \ - --hash=sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746 \ - --hash=sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90 \ - --hash=sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c \ - --hash=sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca \ - --hash=sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8 \ - --hash=sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596 \ - --hash=sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e \ - --hash=sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd \ - --hash=sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e \ - --hash=sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3 \ - --hash=sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e \ - --hash=sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312 \ - --hash=sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7 \ - --hash=sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572 \ - --hash=sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428 \ - --hash=sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f \ - --hash=sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07 \ - --hash=sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e \ - --hash=sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4 \ - --hash=sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136 \ - --hash=sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5 \ - --hash=sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8 \ - --hash=sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d \ - --hash=sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228 \ - --hash=sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206 \ - --hash=sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa \ - --hash=sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e \ - --hash=sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be \ - --hash=sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5 \ - --hash=sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668 \ - --hash=sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601 \ - --hash=sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057 \ - --hash=sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146 \ - --hash=sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f \ - --hash=sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8 \ - --hash=sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7 \ - --hash=sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987 \ - --hash=sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19 \ - --hash=sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece - # via pytest-cov + # via + # tavern (pyproject.toml) + # recommonmark +coverage==7.6.1 \ + --hash=sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca \ + --hash=sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d \ + --hash=sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6 \ + --hash=sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989 \ + --hash=sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c \ + --hash=sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b \ + --hash=sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223 \ + --hash=sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f \ + --hash=sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56 \ + --hash=sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3 \ + --hash=sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8 \ + --hash=sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb \ + --hash=sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388 \ + --hash=sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0 \ + --hash=sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a \ + --hash=sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8 \ + --hash=sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f \ + --hash=sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a \ + --hash=sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962 \ + --hash=sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8 \ + --hash=sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391 \ + --hash=sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc \ + --hash=sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2 \ + --hash=sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155 \ + --hash=sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb \ + --hash=sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0 \ + --hash=sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c \ + --hash=sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a \ + --hash=sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004 \ + --hash=sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060 \ + --hash=sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232 \ + --hash=sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93 \ + --hash=sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129 \ + --hash=sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163 \ + --hash=sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de \ + --hash=sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6 \ + --hash=sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23 \ + --hash=sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569 \ + --hash=sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d \ + --hash=sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778 \ + --hash=sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d \ + --hash=sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36 \ + --hash=sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a \ + --hash=sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6 \ + --hash=sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34 \ + --hash=sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704 \ + --hash=sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106 \ + --hash=sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9 \ + --hash=sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862 \ + --hash=sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b \ + --hash=sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255 \ + --hash=sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16 \ + --hash=sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3 \ + --hash=sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133 \ + --hash=sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb \ + --hash=sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657 \ + --hash=sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d \ + --hash=sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca \ + --hash=sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36 \ + --hash=sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c \ + --hash=sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e \ + --hash=sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff \ + --hash=sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7 \ + --hash=sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5 \ + --hash=sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02 \ + --hash=sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c \ + --hash=sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df \ + --hash=sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3 \ + --hash=sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a \ + --hash=sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959 \ + --hash=sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234 \ + --hash=sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc + # via + # tavern (pyproject.toml) + # pytest-cov distlib==0.3.8 \ --hash=sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784 \ --hash=sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64 @@ -217,50 +243,58 @@ docutils==0.20.1 \ --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \ --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b # via + # tavern (pyproject.toml) # flit # recommonmark # sphinx # sphinx-rtd-theme -exceptiongroup==1.2.1 \ - --hash=sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad \ - --hash=sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16 - # via pytest +exceptiongroup==1.2.2 \ + --hash=sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b \ + --hash=sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc + # via + # tavern (pyproject.toml) + # pytest execnet==2.1.1 \ --hash=sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc \ --hash=sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3 # via pytest-xdist -faker==25.1.0 \ - --hash=sha256:2107618cf306bb188dcfea3e5cfd94aa92d65c7293a2437c1e96a99c83274755 \ - --hash=sha256:24e28dce0b89683bb9e017e042b971c8c4909cff551b6d46f1e207674c7c2526 -filelock==3.14.0 \ - --hash=sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f \ - --hash=sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a +faker==29.0.0 \ + --hash=sha256:32d0ee7d42925ff06e4a7d906ee7efbf34f5052a41a2a1eb8bb174a422a5498f \ + --hash=sha256:34e89aec594cad9773431ca479ee95c7ce03dd9f22fda2524e2373b880a2fa77 + # via tavern (pyproject.toml) +filelock==3.16.1 \ + --hash=sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0 \ + --hash=sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435 # via # tox # virtualenv flask==3.0.3 \ --hash=sha256:34e815dfaa43340d1d15a5c3a02b8476004037eb4840b34910c6e21679d288f3 \ --hash=sha256:ceb27b0af3823ea2737928a4d99d125a06175b8512c445cbd9a9ce200ef76842 + # via tavern (pyproject.toml) flit==3.9.0 \ --hash=sha256:076c3aaba5ac24cf0ad3251f910900d95a08218e6bcb26f21fef1036cc4679ca \ --hash=sha256:d75edf5eb324da20d53570a6a6f87f51e606eee8384925cd66a90611140844c7 + # via tavern (pyproject.toml) flit-core==3.9.0 \ --hash=sha256:72ad266176c4a3fcfab5f2930d76896059851240570ce9a98733b658cb786eba \ --hash=sha256:7aada352fb0c7f5538c4fafeddf314d3a6a92ee8e2b1de70482329e42de70301 # via flit -fluent-logger==0.11.0 \ - --hash=sha256:3485cc006294b8cb6faf2a832ba088da55b7daef3f99fd379468623108c7e2c7 \ - --hash=sha256:813cf44b70ad204f7c161b79604892c89bc92df63fcd132f3c6734bab56e6527 -google-api-core==2.19.0 \ - --hash=sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251 \ - --hash=sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10 +fluent-logger==0.11.1 \ + --hash=sha256:1601c4b929a93b4aef03310573387ac808cf4463cdeaf619c39b257da34c0c0c \ + --hash=sha256:6727525ba08671b758e3ac222f36fa3345bc1a77b81e7ddbc045ced68f44cd77 + # via tavern (pyproject.toml) +google-api-core==2.20.0 \ + --hash=sha256:ef0591ef03c30bb83f79b3d0575c3f31219001fc9c5cf37024d08310aeffed8a \ + --hash=sha256:f74dff1889ba291a4b76c5079df0711810e2d9da81abfdc99957bc961c1eb28f # via google-api-python-client -google-api-python-client==2.129.0 \ - --hash=sha256:984cc8cc8eb4923468b1926d2b8effc5b459a4dda3c845896eb87c153b28ef84 \ - --hash=sha256:d50f7e2dfdbb7fc2732f6a0cba1c54d7bb676390679526c6bb628c901e43ec86 -google-auth==2.29.0 \ - --hash=sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360 \ - --hash=sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415 +google-api-python-client==2.146.0 \ + --hash=sha256:41f671be10fa077ee5143ee9f0903c14006d39dc644564f4e044ae96b380bf68 \ + --hash=sha256:b1e62c9889c5ef6022f11d30d7ef23dc55100300f0e8aaf8aa09e8e92540acad + # via tavern (pyproject.toml) +google-auth==2.35.0 \ + --hash=sha256:25df55f327ef021de8be50bad0dfd4a916ad0de96da86cd05661c9297723ad3f \ + --hash=sha256:f4c64ed4e01e8e8b646ef34c018f8bf3338df0c8e37d8b3bba40e7f574a3278a # via # google-api-core # google-api-python-client @@ -269,90 +303,101 @@ google-auth-httplib2==0.2.0 \ --hash=sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05 \ --hash=sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d # via google-api-python-client -googleapis-common-protos==1.63.0 \ - --hash=sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e \ - --hash=sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632 +googleapis-common-protos==1.65.0 \ + --hash=sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63 \ + --hash=sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0 # via # google-api-core # grpcio-status grpc-interceptor==0.15.4 \ --hash=sha256:0035f33228693ed3767ee49d937bac424318db173fef4d2d0170b3215f254d9d \ --hash=sha256:1f45c0bcb58b6f332f37c637632247c9b02bc6af0fdceb7ba7ce8d2ebbfb0926 -grpcio==1.63.0 \ - --hash=sha256:01799e8649f9e94ba7db1aeb3452188048b0019dc37696b0f5ce212c87c560c3 \ - --hash=sha256:0697563d1d84d6985e40ec5ec596ff41b52abb3fd91ec240e8cb44a63b895094 \ - --hash=sha256:08e1559fd3b3b4468486b26b0af64a3904a8dbc78d8d936af9c1cf9636eb3e8b \ - --hash=sha256:166e5c460e5d7d4656ff9e63b13e1f6029b122104c1633d5f37eaea348d7356d \ - --hash=sha256:1ff737cf29b5b801619f10e59b581869e32f400159e8b12d7a97e7e3bdeee6a2 \ - --hash=sha256:219bb1848cd2c90348c79ed0a6b0ea51866bc7e72fa6e205e459fedab5770172 \ - --hash=sha256:259e11932230d70ef24a21b9fb5bb947eb4703f57865a404054400ee92f42f5d \ - --hash=sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c \ - --hash=sha256:3a6d1f9ea965e750db7b4ee6f9fdef5fdf135abe8a249e75d84b0a3e0c668a1b \ - --hash=sha256:50344663068041b34a992c19c600236e7abb42d6ec32567916b87b4c8b8833b3 \ - --hash=sha256:56cdf96ff82e3cc90dbe8bac260352993f23e8e256e063c327b6cf9c88daf7a9 \ - --hash=sha256:5c039ef01516039fa39da8a8a43a95b64e288f79f42a17e6c2904a02a319b357 \ - --hash=sha256:6426e1fb92d006e47476d42b8f240c1d916a6d4423c5258ccc5b105e43438f61 \ - --hash=sha256:65bf975639a1f93bee63ca60d2e4951f1b543f498d581869922910a476ead2f5 \ - --hash=sha256:6a1a3642d76f887aa4009d92f71eb37809abceb3b7b5a1eec9c554a246f20e3a \ - --hash=sha256:6ef0ad92873672a2a3767cb827b64741c363ebaa27e7f21659e4e31f4d750280 \ - --hash=sha256:756fed02dacd24e8f488f295a913f250b56b98fb793f41d5b2de6c44fb762434 \ - --hash=sha256:75f701ff645858a2b16bc8c9fc68af215a8bb2d5a9b647448129de6e85d52bce \ - --hash=sha256:8064d986d3a64ba21e498b9a376cbc5d6ab2e8ab0e288d39f266f0fca169b90d \ - --hash=sha256:878b1d88d0137df60e6b09b74cdb73db123f9579232c8456f53e9abc4f62eb3c \ - --hash=sha256:8f3f6883ce54a7a5f47db43289a0a4c776487912de1a0e2cc83fdaec9685cc9f \ - --hash=sha256:91b73d3f1340fefa1e1716c8c1ec9930c676d6b10a3513ab6c26004cb02d8b3f \ - --hash=sha256:93a46794cc96c3a674cdfb59ef9ce84d46185fe9421baf2268ccb556f8f81f57 \ - --hash=sha256:93f45f27f516548e23e4ec3fbab21b060416007dbe768a111fc4611464cc773f \ - --hash=sha256:9e350cb096e5c67832e9b6e018cf8a0d2a53b2a958f6251615173165269a91b0 \ - --hash=sha256:a2d60cd1d58817bc5985fae6168d8b5655c4981d448d0f5b6194bbcc038090d2 \ - --hash=sha256:a3abfe0b0f6798dedd2e9e92e881d9acd0fdb62ae27dcbbfa7654a57e24060c0 \ - --hash=sha256:a44624aad77bf8ca198c55af811fd28f2b3eaf0a50ec5b57b06c034416ef2d0a \ - --hash=sha256:a7b19dfc74d0be7032ca1eda0ed545e582ee46cd65c162f9e9fc6b26ef827dc6 \ - --hash=sha256:ad2ac8903b2eae071055a927ef74121ed52d69468e91d9bcbd028bd0e554be6d \ - --hash=sha256:b005292369d9c1f80bf70c1db1c17c6c342da7576f1c689e8eee4fb0c256af85 \ - --hash=sha256:b2e44f59316716532a993ca2966636df6fbe7be4ab6f099de6815570ebe4383a \ - --hash=sha256:b3afbd9d6827fa6f475a4f91db55e441113f6d3eb9b7ebb8fb806e5bb6d6bd0d \ - --hash=sha256:b416252ac5588d9dfb8a30a191451adbf534e9ce5f56bb02cd193f12d8845b7f \ - --hash=sha256:b5194775fec7dc3dbd6a935102bb156cd2c35efe1685b0a46c67b927c74f0cfb \ - --hash=sha256:cacdef0348a08e475a721967f48206a2254a1b26ee7637638d9e081761a5ba86 \ - --hash=sha256:cd1e68776262dd44dedd7381b1a0ad09d9930ffb405f737d64f505eb7f77d6c7 \ - --hash=sha256:cdcda1156dcc41e042d1e899ba1f5c2e9f3cd7625b3d6ebfa619806a4c1aadda \ - --hash=sha256:cf8dae9cc0412cb86c8de5a8f3be395c5119a370f3ce2e69c8b7d46bb9872c8d \ - --hash=sha256:d2497769895bb03efe3187fb1888fc20e98a5f18b3d14b606167dacda5789434 \ - --hash=sha256:e3b77eaefc74d7eb861d3ffbdf91b50a1bb1639514ebe764c47773b833fa2d91 \ - --hash=sha256:e48cee31bc5f5a31fb2f3b573764bd563aaa5472342860edcc7039525b53e46a \ - --hash=sha256:e4cbb2100ee46d024c45920d16e888ee5d3cf47c66e316210bc236d5bebc42b3 \ - --hash=sha256:f28f8b2db7b86c77916829d64ab21ff49a9d8289ea1564a2b2a3a8ed9ffcccd3 \ - --hash=sha256:f3023e14805c61bc439fb40ca545ac3d5740ce66120a678a3c6c2c55b70343d1 \ - --hash=sha256:fdf348ae69c6ff484402cfdb14e18c1b0054ac2420079d575c53a60b9b2853ae + # via tavern (pyproject.toml) +grpcio==1.66.1 \ + --hash=sha256:0e6c9b42ded5d02b6b1fea3a25f036a2236eeb75d0579bfd43c0018c88bf0a3e \ + --hash=sha256:161d5c535c2bdf61b95080e7f0f017a1dfcb812bf54093e71e5562b16225b4ce \ + --hash=sha256:17663598aadbedc3cacd7bbde432f541c8e07d2496564e22b214b22c7523dac8 \ + --hash=sha256:1c17ebcec157cfb8dd445890a03e20caf6209a5bd4ac5b040ae9dbc59eef091d \ + --hash=sha256:292a846b92cdcd40ecca46e694997dd6b9be6c4c01a94a0dfb3fcb75d20da858 \ + --hash=sha256:2ca2559692d8e7e245d456877a85ee41525f3ed425aa97eb7a70fc9a79df91a0 \ + --hash=sha256:307b1d538140f19ccbd3aed7a93d8f71103c5d525f3c96f8616111614b14bf2a \ + --hash=sha256:30a1c2cf9390c894c90bbc70147f2372130ad189cffef161f0432d0157973f45 \ + --hash=sha256:31a049daa428f928f21090403e5d18ea02670e3d5d172581670be006100db9ef \ + --hash=sha256:35334f9c9745add3e357e3372756fd32d925bd52c41da97f4dfdafbde0bf0ee2 \ + --hash=sha256:3750c5a00bd644c75f4507f77a804d0189d97a107eb1481945a0cf3af3e7a5ac \ + --hash=sha256:3885f037eb11f1cacc41f207b705f38a44b69478086f40608959bf5ad85826dd \ + --hash=sha256:4573608e23f7e091acfbe3e84ac2045680b69751d8d67685ffa193a4429fedb1 \ + --hash=sha256:4825a3aa5648010842e1c9d35a082187746aa0cdbf1b7a2a930595a94fb10fce \ + --hash=sha256:4877ba180591acdf127afe21ec1c7ff8a5ecf0fe2600f0d3c50e8c4a1cbc6492 \ + --hash=sha256:48b0d92d45ce3be2084b92fb5bae2f64c208fea8ceed7fccf6a7b524d3c4942e \ + --hash=sha256:4d813316d1a752be6f5c4360c49f55b06d4fe212d7df03253dfdae90c8a402bb \ + --hash=sha256:5dd67ed9da78e5121efc5c510f0122a972216808d6de70953a740560c572eb44 \ + --hash=sha256:6f914386e52cbdeb5d2a7ce3bf1fdfacbe9d818dd81b6099a05b741aaf3848bb \ + --hash=sha256:7101db1bd4cd9b880294dec41a93fcdce465bdbb602cd8dc5bd2d6362b618759 \ + --hash=sha256:7e06aa1f764ec8265b19d8f00140b8c4b6ca179a6dc67aa9413867c47e1fb04e \ + --hash=sha256:84ca1be089fb4446490dd1135828bd42a7c7f8421e74fa581611f7afdf7ab761 \ + --hash=sha256:8a1e224ce6f740dbb6b24c58f885422deebd7eb724aff0671a847f8951857c26 \ + --hash=sha256:97ae7edd3f3f91480e48ede5d3e7d431ad6005bfdbd65c1b56913799ec79e791 \ + --hash=sha256:9c9bebc6627873ec27a70fc800f6083a13c70b23a5564788754b9ee52c5aef6c \ + --hash=sha256:a013c5fbb12bfb5f927444b477a26f1080755a931d5d362e6a9a720ca7dbae60 \ + --hash=sha256:a66fe4dc35d2330c185cfbb42959f57ad36f257e0cc4557d11d9f0a3f14311df \ + --hash=sha256:a92c4f58c01c77205df6ff999faa008540475c39b835277fb8883b11cada127a \ + --hash=sha256:aa8ba945c96e73de29d25331b26f3e416e0c0f621e984a3ebdb2d0d0b596a3b3 \ + --hash=sha256:b0aa03d240b5539648d996cc60438f128c7f46050989e35b25f5c18286c86734 \ + --hash=sha256:b1b24c23d51a1e8790b25514157d43f0a4dce1ac12b3f0b8e9f66a5e2c4c132f \ + --hash=sha256:b7ffb8ea674d68de4cac6f57d2498fef477cef582f1fa849e9f844863af50083 \ + --hash=sha256:b9feb4e5ec8dc2d15709f4d5fc367794d69277f5d680baf1910fc9915c633524 \ + --hash=sha256:bff2096bdba686019fb32d2dde45b95981f0d1490e054400f70fc9a8af34b49d \ + --hash=sha256:c30aeceeaff11cd5ddbc348f37c58bcb96da8d5aa93fed78ab329de5f37a0d7a \ + --hash=sha256:c9f80f9fad93a8cf71c7f161778ba47fd730d13a343a46258065c4deb4b550c0 \ + --hash=sha256:cfd349de4158d797db2bd82d2020554a121674e98fbe6b15328456b3bf2495bb \ + --hash=sha256:d0cd7050397b3609ea51727b1811e663ffda8bda39c6a5bb69525ef12414b503 \ + --hash=sha256:d639c939ad7c440c7b2819a28d559179a4508783f7e5b991166f8d7a34b52815 \ + --hash=sha256:e3ba04659e4fce609de2658fe4dbf7d6ed21987a94460f5f92df7579fd5d0e22 \ + --hash=sha256:ecfe735e7a59e5a98208447293ff8580e9db1e890e232b8b292dc8bd15afc0d2 \ + --hash=sha256:ef82d361ed5849d34cf09105d00b94b6728d289d6b9235513cb2fcc79f7c432c \ + --hash=sha256:f03a5884c56256e08fd9e262e11b5cfacf1af96e2ce78dc095d2c41ccae2c80d \ + --hash=sha256:f1fe60d0772831d96d263b53d83fb9a3d050a94b0e94b6d004a5ad111faa5b5b \ + --hash=sha256:f517fd7259fe823ef3bd21e508b653d5492e706e9f0ef82c16ce3347a8a5620c \ + --hash=sha256:fdb14bad0835914f325349ed34a51940bc2ad965142eb3090081593c6e347be9 # via + # tavern (pyproject.toml) # grpc-interceptor # grpcio-reflection # grpcio-status -grpcio-reflection==1.62.2 \ - --hash=sha256:2dd44806d68d0006636529bda573012b19a42281478c2d051cdaaebb91e2516c \ - --hash=sha256:68e8dff3617a9afaf7c462c688f7ca62b55323f497c662abf9965f2953508885 -grpcio-status==1.62.2 \ - --hash=sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f \ - --hash=sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a +grpcio-reflection==1.62.3 \ + --hash=sha256:a48ef37df81a3bada78261fc92ef382f061112f989d1312398b945cc69838b9c \ + --hash=sha256:cb84682933c400bddf94dd94f928d1c6570f500b6dd255973d4bfb495b82585f + # via tavern (pyproject.toml) +grpcio-status==1.62.3 \ + --hash=sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485 \ + --hash=sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8 + # via tavern (pyproject.toml) httplib2==0.22.0 \ --hash=sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc \ --hash=sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81 # via # google-api-python-client # google-auth-httplib2 -identify==2.5.36 \ - --hash=sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa \ - --hash=sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d +identify==2.6.1 \ + --hash=sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0 \ + --hash=sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98 # via pre-commit -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 +idna==3.10 \ + --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ + --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 # via requests imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx +importlib-metadata==8.5.0 \ + --hash=sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b \ + --hash=sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7 + # via + # flask + # markdown + # sphinx iniconfig==2.0.0 \ --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 @@ -360,7 +405,9 @@ iniconfig==2.0.0 \ itsdangerous==2.2.0 \ --hash=sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef \ --hash=sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173 - # via flask + # via + # tavern (pyproject.toml) + # flask jinja2==3.1.4 \ --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d @@ -370,16 +417,18 @@ jinja2==3.1.4 \ jmespath==1.0.1 \ --hash=sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980 \ --hash=sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe -jsonschema==4.22.0 \ - --hash=sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7 \ - --hash=sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802 + # via tavern (pyproject.toml) +jsonschema==4.23.0 \ + --hash=sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4 \ + --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 + # via tavern (pyproject.toml) jsonschema-specifications==2023.12.1 \ --hash=sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc \ --hash=sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c # via jsonschema -markdown==3.6 \ - --hash=sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f \ - --hash=sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224 +markdown==3.7 \ + --hash=sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2 \ + --hash=sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803 # via sphinx-markdown-tables markupsafe==2.1.5 \ --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ @@ -445,71 +494,79 @@ markupsafe==2.1.5 \ # via # jinja2 # werkzeug -msgpack==1.0.8 \ - --hash=sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982 \ - --hash=sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3 \ - --hash=sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40 \ - --hash=sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee \ - --hash=sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693 \ - --hash=sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950 \ - --hash=sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151 \ - --hash=sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24 \ - --hash=sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305 \ - --hash=sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b \ - --hash=sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c \ - --hash=sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659 \ - --hash=sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d \ - --hash=sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18 \ - --hash=sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746 \ - --hash=sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868 \ - --hash=sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2 \ - --hash=sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba \ - --hash=sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228 \ - --hash=sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2 \ - --hash=sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273 \ - --hash=sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c \ - --hash=sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653 \ - --hash=sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a \ - --hash=sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596 \ - --hash=sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd \ - --hash=sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8 \ - --hash=sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa \ - --hash=sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85 \ - --hash=sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc \ - --hash=sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836 \ - --hash=sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3 \ - --hash=sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58 \ - --hash=sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128 \ - --hash=sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db \ - --hash=sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f \ - --hash=sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77 \ - --hash=sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad \ - --hash=sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13 \ - --hash=sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8 \ - --hash=sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b \ - --hash=sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a \ - --hash=sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543 \ - --hash=sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b \ - --hash=sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce \ - --hash=sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d \ - --hash=sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a \ - --hash=sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c \ - --hash=sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f \ - --hash=sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e \ - --hash=sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011 \ - --hash=sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04 \ - --hash=sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480 \ - --hash=sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a \ - --hash=sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d \ - --hash=sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d +msgpack==1.1.0 \ + --hash=sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b \ + --hash=sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf \ + --hash=sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca \ + --hash=sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330 \ + --hash=sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f \ + --hash=sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f \ + --hash=sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39 \ + --hash=sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247 \ + --hash=sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b \ + --hash=sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c \ + --hash=sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7 \ + --hash=sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044 \ + --hash=sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6 \ + --hash=sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b \ + --hash=sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0 \ + --hash=sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2 \ + --hash=sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468 \ + --hash=sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7 \ + --hash=sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734 \ + --hash=sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434 \ + --hash=sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325 \ + --hash=sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1 \ + --hash=sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846 \ + --hash=sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88 \ + --hash=sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420 \ + --hash=sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e \ + --hash=sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2 \ + --hash=sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59 \ + --hash=sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb \ + --hash=sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68 \ + --hash=sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915 \ + --hash=sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f \ + --hash=sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701 \ + --hash=sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b \ + --hash=sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d \ + --hash=sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa \ + --hash=sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d \ + --hash=sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd \ + --hash=sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc \ + --hash=sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48 \ + --hash=sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb \ + --hash=sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74 \ + --hash=sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b \ + --hash=sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346 \ + --hash=sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e \ + --hash=sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6 \ + --hash=sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5 \ + --hash=sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f \ + --hash=sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5 \ + --hash=sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b \ + --hash=sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c \ + --hash=sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f \ + --hash=sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec \ + --hash=sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8 \ + --hash=sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5 \ + --hash=sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d \ + --hash=sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e \ + --hash=sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e \ + --hash=sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870 \ + --hash=sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f \ + --hash=sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96 \ + --hash=sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c \ + --hash=sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd \ + --hash=sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788 # via fluent-logger -nodeenv==1.8.0 \ - --hash=sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2 \ - --hash=sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec +nodeenv==1.9.1 \ + --hash=sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f \ + --hash=sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 # via pre-commit -packaging==24.0 \ - --hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \ - --hash=sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9 +packaging==24.1 \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 # via # pyproject-api # pytest @@ -517,13 +574,14 @@ packaging==24.0 \ # tox paho-mqtt==1.6.1 \ --hash=sha256:2a8291c81623aec00372b5a85558a372c747cbca8e9934dfe218638b8eefc26f -pbr==6.0.0 \ - --hash=sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda \ - --hash=sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9 + # via tavern (pyproject.toml) +pbr==6.1.0 \ + --hash=sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24 \ + --hash=sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a # via stevedore -platformdirs==4.2.1 \ - --hash=sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf \ - --hash=sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1 +platformdirs==4.3.6 \ + --hash=sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907 \ + --hash=sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb # via # tox # virtualenv @@ -534,26 +592,30 @@ pluggy==1.5.0 \ # allure-python-commons # pytest # tox -pre-commit==3.7.1 \ - --hash=sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a \ - --hash=sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5 -proto-plus==1.23.0 \ - --hash=sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2 \ - --hash=sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c - # via google-api-core -protobuf==4.25.3 \ - --hash=sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4 \ - --hash=sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8 \ - --hash=sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c \ - --hash=sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d \ - --hash=sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4 \ - --hash=sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa \ - --hash=sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c \ - --hash=sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019 \ - --hash=sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9 \ - --hash=sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c \ - --hash=sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2 +pre-commit==3.8.0 \ + --hash=sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af \ + --hash=sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f + # via tavern (pyproject.toml) +proto-plus==1.24.0 \ + --hash=sha256:30b72a5ecafe4406b0d339db35b56c4059064e69227b8c3bda7462397f966445 \ + --hash=sha256:402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12 # via + # tavern (pyproject.toml) + # google-api-core +protobuf==4.25.5 \ + --hash=sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41 \ + --hash=sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea \ + --hash=sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8 \ + --hash=sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45 \ + --hash=sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584 \ + --hash=sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d \ + --hash=sha256:98d8d8aa50de6a2747efd9cceba361c9034050ecce3e09136f90de37ddba66e1 \ + --hash=sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f \ + --hash=sha256:b0234dd5a03049e4ddd94b93400b67803c823cfc405689688f59b34e0742381a \ + --hash=sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173 \ + --hash=sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331 + # via + # tavern (pyproject.toml) # google-api-core # googleapis-common-protos # grpcio-reflection @@ -562,47 +624,55 @@ protobuf==4.25.3 \ py==1.11.0 \ --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 -pyasn1==0.6.0 \ - --hash=sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c \ - --hash=sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473 + # via tavern (pyproject.toml) +pyasn1==0.6.1 \ + --hash=sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629 \ + --hash=sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034 # via # pyasn1-modules # rsa -pyasn1-modules==0.4.0 \ - --hash=sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6 \ - --hash=sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b +pyasn1-modules==0.4.1 \ + --hash=sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd \ + --hash=sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c # via google-auth pygments==2.18.0 \ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a - # via sphinx -pyjwt==2.8.0 \ - --hash=sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de \ - --hash=sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 + # via + # tavern (pyproject.toml) + # sphinx +pyjwt==2.9.0 \ + --hash=sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850 \ + --hash=sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c + # via tavern (pyproject.toml) pykwalify==1.8.0 \ --hash=sha256:731dfa87338cca9f559d1fca2bdea37299116e3139b73f78ca90a543722d6651 \ --hash=sha256:796b2ad3ed4cb99b88308b533fb2f559c30fa6efb4fa9fda11347f483d245884 -pyparsing==3.1.2 \ - --hash=sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad \ - --hash=sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742 + # via tavern (pyproject.toml) +pyparsing==3.1.4 \ + --hash=sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c \ + --hash=sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032 # via httplib2 -pyproject-api==1.6.1 \ - --hash=sha256:1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538 \ - --hash=sha256:4c0116d60476b0786c88692cf4e325a9814965e2469c5998b830bba16b183675 +pyproject-api==1.8.0 \ + --hash=sha256:3d7d347a047afe796fd5d1885b1e391ba29be7169bd2f102fcd378f04273d228 \ + --hash=sha256:77b8049f2feb5d33eefcc21b57f1e279636277a8ac8ad6b5871037b243778496 # via tox pytest==7.2.2 \ --hash=sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e \ --hash=sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4 # via + # tavern (pyproject.toml) # allure-pytest # pytest-cov # pytest-xdist pytest-cov==5.0.0 \ --hash=sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652 \ --hash=sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857 + # via tavern (pyproject.toml) pytest-xdist==3.6.1 \ --hash=sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7 \ --hash=sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d + # via tavern (pyproject.toml) python-box==6.1.0 \ --hash=sha256:11cbe62f0dace8a6e2a10d210a5e87b99ad1a1286865568862516794c923a988 \ --hash=sha256:1d29eafaa287857751e27fbe9a08dd856480f0037fe988b221eba4dac33e5852 \ @@ -621,181 +691,193 @@ python-box==6.1.0 \ --hash=sha256:d199cd289b4f4d053770eadd70217c76214aac30b92a23adfb9627fd8558d300 \ --hash=sha256:ed6d7fe47d756dc2d9dea448702cea103716580a2efee7c859954929295fe28e \ --hash=sha256:fa4696b5e09ccf695bf05c16bb5ca1fcc95a141a71a31eb262eee8e2ac07189a + # via tavern (pyproject.toml) python-dateutil==2.9.0.post0 \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # via # faker # pykwalify -pyyaml==6.0.1 \ - --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ - --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ - --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ - --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ - --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ - --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ - --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ - --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ - --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ - --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ - --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ - --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ - --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ - --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ - --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ - --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ - --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ - --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ - --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ - --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ - --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ - --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ - --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ - --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ - --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ - --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ - --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ - --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ - --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ - --hash=sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef \ - --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ - --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ - --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ - --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ - --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ - --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ - --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ - --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ - --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ - --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ - --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ - --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ - --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ - --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ - --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ - --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ - --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ - --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ - --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ - --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ - --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f - # via pre-commit +pyyaml==6.0.2 \ + --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 + # via + # tavern (pyproject.toml) + # pre-commit recommonmark==0.7.1 \ --hash=sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f \ --hash=sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67 + # via tavern (pyproject.toml) referencing==0.35.1 \ --hash=sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c \ --hash=sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de # via # jsonschema # jsonschema-specifications -requests==2.31.0 \ - --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ - --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 + # types-jsonschema +requests==2.32.3 \ + --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 # via + # tavern (pyproject.toml) # flit # google-api-core # sphinx -rpds-py==0.18.1 \ - --hash=sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee \ - --hash=sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc \ - --hash=sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc \ - --hash=sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944 \ - --hash=sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20 \ - --hash=sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7 \ - --hash=sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4 \ - --hash=sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6 \ - --hash=sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6 \ - --hash=sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93 \ - --hash=sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633 \ - --hash=sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0 \ - --hash=sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360 \ - --hash=sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8 \ - --hash=sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139 \ - --hash=sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7 \ - --hash=sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a \ - --hash=sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9 \ - --hash=sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26 \ - --hash=sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724 \ - --hash=sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72 \ - --hash=sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b \ - --hash=sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09 \ - --hash=sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100 \ - --hash=sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3 \ - --hash=sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261 \ - --hash=sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3 \ - --hash=sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9 \ - --hash=sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b \ - --hash=sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3 \ - --hash=sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de \ - --hash=sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d \ - --hash=sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e \ - --hash=sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8 \ - --hash=sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff \ - --hash=sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5 \ - --hash=sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c \ - --hash=sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e \ - --hash=sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e \ - --hash=sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4 \ - --hash=sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8 \ - --hash=sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922 \ - --hash=sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338 \ - --hash=sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d \ - --hash=sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8 \ - --hash=sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2 \ - --hash=sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72 \ - --hash=sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80 \ - --hash=sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644 \ - --hash=sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae \ - --hash=sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163 \ - --hash=sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104 \ - --hash=sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d \ - --hash=sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60 \ - --hash=sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a \ - --hash=sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d \ - --hash=sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07 \ - --hash=sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49 \ - --hash=sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10 \ - --hash=sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f \ - --hash=sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2 \ - --hash=sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8 \ - --hash=sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7 \ - --hash=sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88 \ - --hash=sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65 \ - --hash=sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0 \ - --hash=sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909 \ - --hash=sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8 \ - --hash=sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c \ - --hash=sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184 \ - --hash=sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397 \ - --hash=sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a \ - --hash=sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346 \ - --hash=sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590 \ - --hash=sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333 \ - --hash=sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb \ - --hash=sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74 \ - --hash=sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e \ - --hash=sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d \ - --hash=sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa \ - --hash=sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f \ - --hash=sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53 \ - --hash=sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1 \ - --hash=sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac \ - --hash=sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0 \ - --hash=sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd \ - --hash=sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611 \ - --hash=sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f \ - --hash=sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c \ - --hash=sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5 \ - --hash=sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab \ - --hash=sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc \ - --hash=sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43 \ - --hash=sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da \ - --hash=sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac \ - --hash=sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843 \ - --hash=sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e \ - --hash=sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89 \ - --hash=sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64 +rpds-py==0.20.0 \ + --hash=sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c \ + --hash=sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585 \ + --hash=sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5 \ + --hash=sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6 \ + --hash=sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef \ + --hash=sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2 \ + --hash=sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29 \ + --hash=sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318 \ + --hash=sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b \ + --hash=sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399 \ + --hash=sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739 \ + --hash=sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee \ + --hash=sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174 \ + --hash=sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a \ + --hash=sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344 \ + --hash=sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2 \ + --hash=sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03 \ + --hash=sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5 \ + --hash=sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22 \ + --hash=sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e \ + --hash=sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96 \ + --hash=sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91 \ + --hash=sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752 \ + --hash=sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075 \ + --hash=sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253 \ + --hash=sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee \ + --hash=sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad \ + --hash=sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5 \ + --hash=sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce \ + --hash=sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7 \ + --hash=sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b \ + --hash=sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8 \ + --hash=sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57 \ + --hash=sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3 \ + --hash=sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec \ + --hash=sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209 \ + --hash=sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921 \ + --hash=sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045 \ + --hash=sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074 \ + --hash=sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580 \ + --hash=sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7 \ + --hash=sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5 \ + --hash=sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3 \ + --hash=sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0 \ + --hash=sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24 \ + --hash=sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139 \ + --hash=sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db \ + --hash=sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc \ + --hash=sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789 \ + --hash=sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f \ + --hash=sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2 \ + --hash=sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c \ + --hash=sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232 \ + --hash=sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6 \ + --hash=sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c \ + --hash=sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29 \ + --hash=sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489 \ + --hash=sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94 \ + --hash=sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751 \ + --hash=sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2 \ + --hash=sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda \ + --hash=sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9 \ + --hash=sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51 \ + --hash=sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c \ + --hash=sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8 \ + --hash=sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989 \ + --hash=sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511 \ + --hash=sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1 \ + --hash=sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2 \ + --hash=sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150 \ + --hash=sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c \ + --hash=sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965 \ + --hash=sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f \ + --hash=sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58 \ + --hash=sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b \ + --hash=sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f \ + --hash=sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d \ + --hash=sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821 \ + --hash=sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de \ + --hash=sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121 \ + --hash=sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855 \ + --hash=sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272 \ + --hash=sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60 \ + --hash=sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02 \ + --hash=sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1 \ + --hash=sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140 \ + --hash=sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879 \ + --hash=sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940 \ + --hash=sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364 \ + --hash=sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4 \ + --hash=sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e \ + --hash=sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420 \ + --hash=sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5 \ + --hash=sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24 \ + --hash=sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c \ + --hash=sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf \ + --hash=sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f \ + --hash=sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e \ + --hash=sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab \ + --hash=sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08 \ + --hash=sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92 \ + --hash=sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a \ + --hash=sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8 # via # jsonschema # referencing @@ -859,28 +941,26 @@ ruamel-yaml-clib==0.2.8 \ --hash=sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875 \ --hash=sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412 # via ruamel-yaml -ruff==0.4.4 \ - --hash=sha256:1aecced1269481ef2894cc495647392a34b0bf3e28ff53ed95a385b13aa45768 \ - --hash=sha256:29d44ef5bb6a08e235c8249294fa8d431adc1426bfda99ed493119e6f9ea1bf6 \ - --hash=sha256:39df0537b47d3b597293edbb95baf54ff5b49589eb7ff41926d8243caa995ea6 \ - --hash=sha256:424e5b72597482543b684c11def82669cc6b395aa8cc69acc1858b5ef3e5daae \ - --hash=sha256:4c8e2f1e8fc12d07ab521a9005d68a969e167b589cbcaee354cb61e9d9de9c15 \ - --hash=sha256:60ed88b636a463214905c002fa3eaab19795679ed55529f91e488db3fe8976ab \ - --hash=sha256:8e7e6ebc10ef16dcdc77fd5557ee60647512b400e4a60bdc4849468f076f6eef \ - --hash=sha256:958b4ea5589706a81065e2a776237de2ecc3e763342e5cc8e02a4a4d8a5e6f95 \ - --hash=sha256:9da73eb616b3241a307b837f32756dc20a0b07e2bcb694fec73699c93d04a69e \ - --hash=sha256:b1867ee9bf3acc21778dcb293db504692eda5f7a11a6e6cc40890182a9f9e595 \ - --hash=sha256:b5eb0a4bfd6400b7d07c09a7725e1a98c3b838be557fee229ac0f84d9aa49c36 \ - --hash=sha256:b90fc5e170fc71c712cc4d9ab0e24ea505c6a9e4ebf346787a67e691dfb72e85 \ - --hash=sha256:b9ddb2c494fb79fc208cd15ffe08f32b7682519e067413dbaf5f4b01a6087bcd \ - --hash=sha256:c4efe62b5bbb24178c950732ddd40712b878a9b96b1d02b0ff0b08a090cbd891 \ - --hash=sha256:c51c928a14f9f0a871082603e25a1588059b7e08a920f2f9fa7157b5bf08cfe9 \ - --hash=sha256:cb53473849f011bca6e754f2cdf47cafc9c4f4ff4570003a0dad0b9b6890e876 \ - --hash=sha256:f87ea42d5cdebdc6a69761a9d0bc83ae9b3b30d0ad78952005ba6568d6c022af -setuptools==69.5.1 \ - --hash=sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987 \ - --hash=sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32 - # via nodeenv +ruff==0.6.6 \ + --hash=sha256:0adb801771bc1f1b8cf4e0a6fdc30776e7c1894810ff3b344e50da82ef50eeb1 \ + --hash=sha256:0fc030b6fd14814d69ac0196396f6761921bd20831725c7361e1b8100b818034 \ + --hash=sha256:2653fc3b2a9315bd809725c88dd2446550099728d077a04191febb5ea79a4f79 \ + --hash=sha256:488f8e15c01ea9afb8c0ba35d55bd951f484d0c1b7c5fd746ce3c47ccdedce68 \ + --hash=sha256:4b4d32c137bc781c298964dd4e52f07d6f7d57c03eae97a72d97856844aa510a \ + --hash=sha256:515a698254c9c47bb84335281a170213b3ee5eb47feebe903e1be10087a167ce \ + --hash=sha256:59627e97364329e4eae7d86fa7980c10e2b129e2293d25c478ebcb861b3e3fd6 \ + --hash=sha256:69c546f412dfae8bb9cc4f27f0e45cdd554e42fecbb34f03312b93368e1cd0a6 \ + --hash=sha256:6bb1b4995775f1837ab70f26698dd73852bbb82e8f70b175d2713c0354fe9182 \ + --hash=sha256:704da526c1e137f38c8a067a4a975fe6834b9f8ba7dbc5fd7503d58148851b8f \ + --hash=sha256:94c3f78c3d32190aafbb6bc5410c96cfed0a88aadb49c3f852bbc2aa9783a7d8 \ + --hash=sha256:a4c0698cc780bcb2c61496cbd56b6a3ac0ad858c966652f7dbf4ceb029252fbe \ + --hash=sha256:aadf81ddc8ab5b62da7aae78a91ec933cbae9f8f1663ec0325dae2c364e4ad84 \ + --hash=sha256:aefb0bd15f1cfa4c9c227b6120573bb3d6c4ee3b29fb54a5ad58f03859bc43c6 \ + --hash=sha256:bb858cd9ce2d062503337c5b9784d7b583bcf9d1a43c4df6ccb5eab774fbafcb \ + --hash=sha256:e368aef0cc02ca3593eae2fb8186b81c9c2b3f39acaaa1108eb6b4d04617e61f \ + --hash=sha256:efeede5815a24104579a0f6320660536c5ffc1c91ae94f8c65659af915fb9de9 \ + --hash=sha256:f5bc5398457484fc0374425b43b030e4668ed4d2da8ee7fdda0e926c9f11ccfb + # via tavern (pyproject.toml) six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 @@ -889,30 +969,33 @@ snowballstemmer==2.2.0 \ --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a # via sphinx -sphinx==7.3.7 \ - --hash=sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3 \ - --hash=sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc +sphinx==7.4.7 \ + --hash=sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe \ + --hash=sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239 # via + # tavern (pyproject.toml) # recommonmark # sphinx-rtd-theme # sphinxcontrib-jquery sphinx-markdown-tables==0.0.17 \ --hash=sha256:2bd0c30779653e4dd120300cbd9ca412c480738cc2241f6dea477a883f299e04 \ --hash=sha256:6bc6d3d400eaccfeebd288446bc08dd83083367c58b85d40fe6c12d77ef592f1 + # via tavern (pyproject.toml) sphinx-rtd-theme==2.0.0 \ --hash=sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b \ --hash=sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586 -sphinxcontrib-applehelp==1.0.8 \ - --hash=sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619 \ - --hash=sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4 + # via tavern (pyproject.toml) +sphinxcontrib-applehelp==2.0.0 \ + --hash=sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1 \ + --hash=sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 # via sphinx -sphinxcontrib-devhelp==1.0.6 \ - --hash=sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f \ - --hash=sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3 +sphinxcontrib-devhelp==2.0.0 \ + --hash=sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad \ + --hash=sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 # via sphinx -sphinxcontrib-htmlhelp==2.0.5 \ - --hash=sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015 \ - --hash=sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04 +sphinxcontrib-htmlhelp==2.1.0 \ + --hash=sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 \ + --hash=sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9 # via sphinx sphinxcontrib-jquery==4.1 \ --hash=sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a \ @@ -922,21 +1005,23 @@ sphinxcontrib-jsmath==1.0.1 \ --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 \ --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8 # via sphinx -sphinxcontrib-qthelp==1.0.7 \ - --hash=sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6 \ - --hash=sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182 +sphinxcontrib-qthelp==2.0.0 \ + --hash=sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab \ + --hash=sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb # via sphinx -sphinxcontrib-serializinghtml==1.1.10 \ - --hash=sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7 \ - --hash=sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f +sphinxcontrib-serializinghtml==2.0.0 \ + --hash=sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 \ + --hash=sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d # via sphinx stevedore==4.1.1 \ --hash=sha256:7f8aeb6e3f90f96832c301bff21a7eb5eefbe894c88c506483d355565d88cc1a \ --hash=sha256:aa6436565c069b2946fe4ebff07f5041e0c8bf18c7376dd29edf80cf7d524e4e + # via tavern (pyproject.toml) tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f # via + # tavern (pyproject.toml) # coverage # pyproject-api # pytest @@ -946,56 +1031,79 @@ tomli-w==1.0.0 \ --hash=sha256:9f2a07e8be30a0729e533ec968016807069991ae2fd921a78d42f429ae5f4463 \ --hash=sha256:f463434305e0336248cac9c2dc8076b707d8a12d019dd349f5c1e382dd1ae1b9 # via flit -tox==4.15.0 \ - --hash=sha256:300055f335d855b2ab1b12c5802de7f62a36d4fd53f30bd2835f6a201dda46ea \ - --hash=sha256:7a0beeef166fbe566f54f795b4906c31b428eddafc0102ac00d20998dd1933f6 +tox==4.20.0 \ + --hash=sha256:21a8005e3d3fe5658a8e36b8ca3ed13a4230429063c5cc2a2fdac6ee5aa0de34 \ + --hash=sha256:5b78a49b6eaaeab3ae4186415e7c97d524f762ae967c63562687c3e5f0ec23d5 + # via tavern (pyproject.toml) +types-jmespath==1.0.2.20240106 \ + --hash=sha256:b4a65a116bfc1c700a4fd9d24e2e397f4a431122e0320a77b7f1989a6b5d819e \ + --hash=sha256:c3e715fcaae9e5f8d74e14328fdedc4f2b3f0e18df17f3e457ae0a18e245bde0 + # via tavern (pyproject.toml) +types-jsonschema==4.23.0.20240813 \ + --hash=sha256:be283e23f0b87547316c2ee6b0fd36d95ea30e921db06478029e10b5b6aa6ac3 \ + --hash=sha256:c93f48206f209a5bc4608d295ac39f172fb98b9e24159ce577dbd25ddb79a1c0 + # via tavern (pyproject.toml) +types-paho-mqtt==1.6.0.20240321 \ + --hash=sha256:694eec160340f2a2b151237dcc3f107a63e1c4e5b8f9fcda0ba392049af9cbec \ + --hash=sha256:cd275c14f39363c2a0f8286ead9a46962e5421ebd477547b892ae016699f5a4a + # via tavern (pyproject.toml) types-protobuf==4.25.0.20240417 \ --hash=sha256:c34eff17b9b3a0adb6830622f0f302484e4c089f533a46e3f147568313544352 \ --hash=sha256:e9b613227c2127e3d4881d75d93c93b4d6fd97b5f6a099a0b654a05351c8685d -types-pyyaml==6.0.12.20240311 \ - --hash=sha256:a9e0f0f88dc835739b0c1ca51ee90d04ca2a897a71af79de9aec5f38cb0a5342 \ - --hash=sha256:b845b06a1c7e54b8e5b4c683043de0d9caf205e7434b3edc678ff2411979b8f6 -types-requests==2.31.0.20240406 \ - --hash=sha256:4428df33c5503945c74b3f42e82b181e86ec7b724620419a2966e2de604ce1a1 \ - --hash=sha256:6216cdac377c6b9a040ac1c0404f7284bd13199c0e1bb235f4324627e8898cf5 + # via tavern (pyproject.toml) +types-pyyaml==6.0.12.20240917 \ + --hash=sha256:392b267f1c0fe6022952462bf5d6523f31e37f6cea49b14cee7ad634b6301570 \ + --hash=sha256:d1405a86f9576682234ef83bcb4e6fff7c9305c8b1fbad5e0bcd4f7dbdc9c587 + # via tavern (pyproject.toml) +types-requests==2.32.0.20240914 \ + --hash=sha256:2850e178db3919d9bf809e434eef65ba49d0e7e33ac92d588f4a5e295fffd405 \ + --hash=sha256:59c2f673eb55f32a99b2894faf6020e1a9f4a402ad0f192bfee0b64469054310 + # via tavern (pyproject.toml) uritemplate==4.1.1 \ --hash=sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0 \ --hash=sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e # via google-api-python-client -urllib3==2.2.1 \ - --hash=sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d \ - --hash=sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19 +urllib3==2.2.3 \ + --hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \ + --hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9 # via # requests # types-requests -uv==0.1.42 \ - --hash=sha256:199e28690da15326ff9391f10a4d316ac515e95a328ad6a046908d829e0b77c9 \ - --hash=sha256:1c6d7e2916c83d42bf6cd37e121c5c42d6033d4b4469fe5238c85420d9d184cf \ - --hash=sha256:29a34a1a9b9e414fd075c2cac772722443fada50d7221c0c855f4e83a01a2939 \ - --hash=sha256:34a749742b57f357e2a0795790a6408bfdacefa184d21b060ea4df2d8736a4d6 \ - --hash=sha256:40a9664ec199ad21c1a4fe3a665ffb75ff641dd8af7a16381fa462ca14e02474 \ - --hash=sha256:5bcb0937279c84c051e08e3893b9bde3c4bca05455b9c68d173d67f01c136cf9 \ - --hash=sha256:8583204cbe97ede7bf3250f5f84722f0f9027d3bf025b91bb2a00f09348010ec \ - --hash=sha256:877d7fd26aa46b693571b4b7e84b44b4eb36a3e3902fc291a6c1c8af6fe8372a \ - --hash=sha256:9dcd7fd148b958b24507a5f6402db91a5a37f04bb5bd9941e149acbf82b390b0 \ - --hash=sha256:a31e8d4fca0031eadeeceafbf742532344c2f7aaaf7d95e3f00316a2d1a633c6 \ - --hash=sha256:af9711bd667c2effa89319ad2a0b312c6754d153f0d44f8a410d66ebbf2fa104 \ - --hash=sha256:b3dbd7f50b2f0e4e50ea0cfbf7b3f7fdc2a28e76e2643d3c4060842263bf6c36 \ - --hash=sha256:c59ad07b9a660173cc255daf1a764400d62234a345d4308194ff4af84f06cf67 \ - --hash=sha256:c873475f4409d36c4722f31e7d34039b99fab7224a157d33c30bb26a91b19482 \ - --hash=sha256:d795560b1fcc9d504781fd727178b80afeed1b5f79aef71b73058b3d8e47bb08 \ - --hash=sha256:dab260d7eb28f6aa290bc93f7c05d05b28e841f830f299234d22dd5c3a00d163 \ - --hash=sha256:e490004734e101ec6f00ac5d28e31b5cb8eb7579634d38963c33e62c570b3747 -virtualenv==20.26.1 \ - --hash=sha256:604bfdceaeece392802e6ae48e69cec49168b9c5f4a44e483963f9242eb0e78b \ - --hash=sha256:7aa9982a728ae5892558bff6a2839c00b9ed145523ece2274fad6f414690ae75 +uv==0.4.15 \ + --hash=sha256:04858bfd551fabe1635127d9a0afe5c62e1e7d56cf309a9674840c90bfc1f21e \ + --hash=sha256:0e9b78f1a800a4cfdfbdc9ff4e5d4cce34af770f8a1f2b9416b161f294eb3703 \ + --hash=sha256:1401e73f0e8df62b4cfbf394e65a75f18b73bf8a94a6c5653a55bd6fdb8e1bc3 \ + --hash=sha256:1bb79cb06be9bb25a1bf8641bf34593f64a96b3ba66ebd8712954f647d9faa24 \ + --hash=sha256:21a3cedb2276d635543a10a11c61f75c6e387110e23e90cdb6c6dd2e1f3c9453 \ + --hash=sha256:27884429b7fed371fe1fcbe829659c4a259463d0ecacb7891d800e4754b5f24c \ + --hash=sha256:4e40deb2cf2cb403dbaf65209d49c45462ebbb1bff290d4c18b902b5b385cdc9 \ + --hash=sha256:6eef6881abf9b858020ffd23f4e5d77423329da2d4a1bc0af6613c2f698c369a \ + --hash=sha256:7fcf7f3812dd173d39273e99fb2abb0814be6133e7a721baa424cbcfd25b483b \ + --hash=sha256:8d45295757f66d1913e5917c06f1974745adad842403d419362491939be889a6 \ + --hash=sha256:8e36b8e07595fc6216d01e729c81a0b4ff029a93cc2ef987a73d3b650d6d559c \ + --hash=sha256:9822fa4db0d8d50abf5eebe081c01666a98120455090d0b71463d01d5d4153c1 \ + --hash=sha256:9e28141883c0aa8525ad5418e519d8791b7dd75f35020d3b1457db89346c5dc8 \ + --hash=sha256:a5920ff4d114025c51d3f925130ca3b0fad277631846b1109347c24948b29159 \ + --hash=sha256:be46b37b569e3c8ffb7d78022bcc0eadeb987109f709c1cec01b00c261ed9595 \ + --hash=sha256:cf7d554656bb8c5b7710300e04d86ab5137ebdd31fe309d66860a9d474b385f8 \ + --hash=sha256:d16ae6b97eb77f478dfe51d6eb3627048d3f47bd04282d3006e6a212e541dba0 \ + --hash=sha256:e32137ba8202b1291e879e8145113bfb543fcc992b5f043852a96d803788b83c + # via tavern (pyproject.toml) +virtualenv==20.26.5 \ + --hash=sha256:4f3ac17b81fba3ce3bd6f4ead2749a72da5929c01774948e243db9ba41df4ff6 \ + --hash=sha256:ce489cac131aa58f4b25e321d6d186171f78e6cb13fafbf32a840cee67733ff4 # via # pre-commit # tox -werkzeug==3.0.3 \ - --hash=sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18 \ - --hash=sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8 +werkzeug==3.0.4 \ + --hash=sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c \ + --hash=sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306 # via flask -wheel==0.43.0 \ - --hash=sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85 \ - --hash=sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81 +wheel==0.44.0 \ + --hash=sha256:2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f \ + --hash=sha256:a29c3f2817e95ab89aa4660681ad547c0e9547f20e75b0562fe7723c9a2a9d49 + # via tavern (pyproject.toml) +zipp==3.20.2 \ + --hash=sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350 \ + --hash=sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29 + # via importlib-metadata diff --git a/tavern/_core/dict_util.py b/tavern/_core/dict_util.py index 07c5364ad..6df8a8bd8 100644 --- a/tavern/_core/dict_util.py +++ b/tavern/_core/dict_util.py @@ -5,8 +5,8 @@ import re import string import typing -from collections.abc import Collection -from typing import Any, Dict, Iterator, List, Mapping, Optional, Tuple, Union +from collections.abc import Collection, Iterator, Mapping +from typing import Any, Optional, Union import box import jmespath @@ -97,7 +97,7 @@ def _attempt_find_include(to_format: str, box_vars: box.Box) -> Optional[str]: return formatter.convert_field(would_replace, conversion) -T = typing.TypeVar("T", str, Dict, List, Tuple) +T = typing.TypeVar("T", str, dict, list, tuple) def format_keys( @@ -167,7 +167,7 @@ def format_keys( return val -def recurse_access_key(data: Union[List, Mapping], query: str) -> Any: +def recurse_access_key(data: Union[list, Mapping], query: str) -> Any: """ Search for something in the given data using the given query. @@ -210,7 +210,7 @@ def recurse_access_key(data: Union[List, Mapping], query: str) -> Any: def _deprecated_recurse_access_key( - current_val: Union[List, Mapping], keys: List + current_val: Union[list, Mapping], keys: list ) -> Any: """Given a list of keys and a dictionary, recursively access the dicionary using the keys until we find the key its looking for @@ -257,7 +257,7 @@ def _deprecated_recurse_access_key( raise -def deep_dict_merge(initial_dct: Dict, merge_dct: Mapping) -> dict: +def deep_dict_merge(initial_dct: dict, merge_dct: Mapping) -> dict: """Recursive dict merge. Instead of updating only top-level keys, dict_merge recurses down into dicts nested to an arbitrary depth and returns the merged dict. Keys values present in merge_dct take @@ -305,7 +305,7 @@ def check_expected_keys(expected: Collection, actual: Collection) -> None: raise exceptions.UnexpectedKeysError(msg) -def yield_keyvals(block: Union[List, Dict]) -> Iterator[Tuple[List, str, str]]: +def yield_keyvals(block: Union[list, dict]) -> Iterator[tuple[list, str, str]]: """Return indexes, keys and expected values for matching recursive keys Given a list or dict, return a 3-tuple of the 'split' key (key split on @@ -352,13 +352,13 @@ def yield_keyvals(block: Union[List, Dict]) -> Iterator[Tuple[List, str, str]]: yield [sidx], sidx, val -Checked = typing.TypeVar("Checked", Dict, Collection, str) +Checked = typing.TypeVar("Checked", dict, Collection, str) def check_keys_match_recursive( expected_val: Checked, actual_val: Checked, - keys: List[Union[str, int]], + keys: list[Union[str, int]], strict: StrictSettingKinds = True, ) -> None: """Utility to recursively check response values diff --git a/tavern/_core/exceptions.py b/tavern/_core/exceptions.py index 9c825007c..832c72f33 100644 --- a/tavern/_core/exceptions.py +++ b/tavern/_core/exceptions.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Dict, Optional +from typing import TYPE_CHECKING, Optional if TYPE_CHECKING: from tavern._core.pytest.config import TestConfig @@ -15,7 +15,7 @@ class TavernException(Exception): test_block_config: config for stage """ - stage: Optional[Dict] + stage: Optional[dict] test_block_config: Optional["TestConfig"] is_final: bool = False diff --git a/tavern/_core/extfunctions.py b/tavern/_core/extfunctions.py index 66b5347d2..a09561ba6 100644 --- a/tavern/_core/extfunctions.py +++ b/tavern/_core/extfunctions.py @@ -1,7 +1,8 @@ import functools import importlib import logging -from typing import Any, Callable, Iterable, List, Mapping, Optional, Tuple +from collections.abc import Iterable, Mapping +from typing import Any, Callable, Optional from tavern._core import exceptions @@ -125,7 +126,7 @@ def inner(): return inner -def _get_ext_values(ext: Mapping) -> Tuple[Callable, Iterable, Mapping]: +def _get_ext_values(ext: Mapping) -> tuple[Callable, Iterable, Mapping]: if not isinstance(ext, Mapping): raise exceptions.InvalidExtFunctionError( f"ext block should be a dict, but it was a {type(ext)}" @@ -143,7 +144,7 @@ def _get_ext_values(ext: Mapping) -> Tuple[Callable, Iterable, Mapping]: return func, args, kwargs -def update_from_ext(request_args: dict, keys_to_check: List[str]) -> None: +def update_from_ext(request_args: dict, keys_to_check: list[str]) -> None: """ Updates the request_args dict with any values from external functions diff --git a/tavern/_core/general.py b/tavern/_core/general.py index 25658cb61..874245d73 100644 --- a/tavern/_core/general.py +++ b/tavern/_core/general.py @@ -1,6 +1,6 @@ import logging import os -from typing import List, Union +from typing import Union from tavern._core.loader import load_single_document_yaml @@ -9,7 +9,7 @@ logger: logging.Logger = logging.getLogger(__name__) -def load_global_config(global_cfg_paths: List[Union[str, os.PathLike]]) -> dict: +def load_global_config(global_cfg_paths: list[Union[str, os.PathLike]]) -> dict: """Given a list of file paths to global config files, load each of them and return the joined dictionary. diff --git a/tavern/_core/jmesutils.py b/tavern/_core/jmesutils.py index 35055548f..09e3103f1 100644 --- a/tavern/_core/jmesutils.py +++ b/tavern/_core/jmesutils.py @@ -1,6 +1,7 @@ import operator import re -from typing import Any, Dict, List, Sized +from collections.abc import Sized +from typing import Any from tavern._core import exceptions @@ -37,7 +38,7 @@ def test_type(val, mytype) -> bool: "regex": lambda x, y: regex_compare(str(x), str(y)), "type": test_type, } -TYPES: Dict[str, List[Any]] = { +TYPES: dict[str, list[Any]] = { "none": [type(None)], "number": [int, float], "int": [int], @@ -61,7 +62,7 @@ def safe_length(var: Sized) -> int: return -1 -def validate_comparison(each_comparison: Dict[Any, Any]): +def validate_comparison(each_comparison: dict[Any, Any]): if extra := set(each_comparison.keys()) - {"jmespath", "operator", "expected"}: raise exceptions.BadSchemaError( "Invalid keys given to JMES validation function (got extra keys: {})".format( diff --git a/tavern/_core/loader.py b/tavern/_core/loader.py index 690a1ee1f..74b4d9a1e 100644 --- a/tavern/_core/loader.py +++ b/tavern/_core/loader.py @@ -6,7 +6,7 @@ import uuid from abc import abstractmethod from itertools import chain -from typing import List, Optional, Union +from typing import Optional, Union import pytest import yaml @@ -121,7 +121,7 @@ def __init__(self, stream): Resolver.__init__(self) SourceMappingConstructor.__init__(self) - env_path_list: Optional[List] = None + env_path_list: Optional[list] = None env_var_name = "TAVERN_INCLUDE" diff --git a/tavern/_core/plugins.py b/tavern/_core/plugins.py index a46bbd600..742520944 100644 --- a/tavern/_core/plugins.py +++ b/tavern/_core/plugins.py @@ -6,8 +6,9 @@ import dataclasses import logging +from collections.abc import Mapping from functools import partial -from typing import Any, Callable, Dict, List, Mapping, Optional, Protocol, Type +from typing import Any, Callable, Optional, Protocol import stevedore @@ -33,9 +34,9 @@ def plugin_load_error(mgr, entry_point, err): class _TavernPlugin(Protocol): """A tavern plugin""" - session_type: Type[Any] - request_type: Type[BaseRequest] - verifier_type: Type[BaseResponse] + session_type: type[Any] + request_type: type[BaseRequest] + verifier_type: type[BaseResponse] response_block_name: str request_block_name: str schema: Mapping @@ -90,9 +91,9 @@ class _Plugin: @dataclasses.dataclass class _PluginCache: - plugins: List[_Plugin] = dataclasses.field(default_factory=list) + plugins: list[_Plugin] = dataclasses.field(default_factory=list) - def __call__(self, config: Optional[TestConfig] = None) -> List[_Plugin]: + def __call__(self, config: Optional[TestConfig] = None) -> list[_Plugin]: if self.plugins: return self.plugins @@ -103,7 +104,7 @@ def __call__(self, config: Optional[TestConfig] = None) -> List[_Plugin]: raise exceptions.PluginLoadError("No config to load plugins from") - def _load_plugins(self, test_block_config: TestConfig) -> List[_Plugin]: + def _load_plugins(self, test_block_config: TestConfig) -> list[_Plugin]: """Load plugins from the 'tavern' entrypoint namespace This can be a module or a class as long as it defines the right things @@ -256,7 +257,7 @@ def _foreach_response( stage: Mapping, test_block_config: TestConfig, action: Callable[[_Plugin, str], dict], -) -> Dict[str, dict]: +) -> dict[str, dict]: """Do something for each response Args: diff --git a/tavern/_core/pytest/config.py b/tavern/_core/pytest/config.py index 51b0b65e5..6f70a2f8b 100644 --- a/tavern/_core/pytest/config.py +++ b/tavern/_core/pytest/config.py @@ -2,7 +2,7 @@ import dataclasses import logging from importlib.util import find_spec -from typing import Any, List +from typing import Any from tavern._core.strict_util import StrictLevel @@ -52,7 +52,7 @@ def with_strictness(self, new_strict: StrictLevel) -> "TestConfig": return dataclasses.replace(self, strict=new_strict) @staticmethod - def backends() -> List[str]: + def backends() -> list[str]: available_backends = ["http"] if has_module("paho.mqtt"): diff --git a/tavern/_core/pytest/error.py b/tavern/_core/pytest/error.py index 7fe619d5c..4d3bdc0a2 100644 --- a/tavern/_core/pytest/error.py +++ b/tavern/_core/pytest/error.py @@ -4,7 +4,7 @@ import re import typing from io import StringIO -from typing import Any, Dict, List, Optional +from typing import Any, Optional import yaml from _pytest._code.code import FormattedExcinfo, TerminalRepr @@ -32,7 +32,7 @@ class ReprdError(TerminalRepr): exce: Any item: "YamlItem" - def _get_available_format_keys(self) -> Dict: + def _get_available_format_keys(self) -> dict: """Try to get the format variables for the stage If we can't get the variable for this specific stage, just return the @@ -50,8 +50,8 @@ def _get_available_format_keys(self) -> Dict: return keys def _print_format_variables( - self, tw: TerminalWriter, code_lines: List[str] - ) -> List[str]: + self, tw: TerminalWriter, code_lines: list[str] + ) -> list[str]: """Print a list of the format variables and their value at this stage If the format variable is not defined, print it in red as '???' @@ -114,8 +114,8 @@ def read_formatted_vars(lines): def _print_test_stage( self, tw: TerminalWriter, - code_lines: List[str], - missing_format_vars: List[str], + code_lines: list[str], + missing_format_vars: list[str], line_start: Optional[int], ) -> None: """Print the direct source lines from this test stage @@ -143,7 +143,7 @@ def _print_test_stage( else: tw.line(line, white=True) - def _print_formatted_stage(self, tw: TerminalWriter, stage: Dict) -> None: + def _print_formatted_stage(self, tw: TerminalWriter, stage: dict) -> None: """Print the 'formatted' stage that Tavern will actually use to send the request/process the response diff --git a/tavern/_core/pytest/file.py b/tavern/_core/pytest/file.py index c0f690a16..73dc9d7bb 100644 --- a/tavern/_core/pytest/file.py +++ b/tavern/_core/pytest/file.py @@ -3,7 +3,8 @@ import itertools import logging import typing -from typing import Any, Callable, Dict, Iterable, Iterator, List, Mapping, Tuple, Union +from collections.abc import Iterable, Iterator, Mapping +from typing import Any, Callable, Union import pytest import yaml @@ -23,14 +24,14 @@ T = typing.TypeVar("T") -_format_without_inner: Callable[[T, Mapping], T] = functools.partial( +_format_without_inner: Callable[[T, Mapping], T] = functools.partial( # type:ignore format_keys, no_double_format=False ) def _format_test_marks( original_marks: Iterable[Union[str, dict]], fmt_vars: Mapping, test_name: str -) -> Tuple[List[Mark], List[Mapping]]: +) -> tuple[list[Mark], list[Mapping]]: """Given the 'raw' marks from the test and any available format variables, generate new marks for this test @@ -60,8 +61,8 @@ def _format_test_marks( """ - pytest_marks: List[Mark] = [] - formatted_marks: List[Mapping] = [] + pytest_marks: list[Mark] = [] + formatted_marks: list[Mapping] = [] for m in original_marks: if isinstance(m, str): @@ -129,8 +130,8 @@ def _maybe_load_ext(pair): def _generate_parametrized_test_items( - keys: Iterable[Union[str, List, Tuple]], vals_combination: Iterable[Tuple[str, str]] -) -> Tuple[Mapping[str, Any], str]: + keys: Iterable[Union[str, list, tuple]], vals_combination: Iterable[tuple[str, str]] +) -> tuple[Mapping[str, Any], str]: """Generate test name from given key(s)/value(s) combination Args: @@ -140,8 +141,8 @@ def _generate_parametrized_test_items( Returns: tuple of the variables for the stage and the generated stage name """ - flattened_values: List[Iterable[str]] = [] - variables: Dict[str, Any] = {} + flattened_values: list[Iterable[str]] = [] + variables: dict[str, Any] = {} # combination of keys and the values they correspond to for pair in zip(keys, vals_combination): @@ -180,9 +181,9 @@ def _generate_parametrized_test_items( def _get_parametrized_items( parent: pytest.File, - test_spec: Dict, - parametrize_marks: List[Dict], - pytest_marks: List[pytest.Mark], + test_spec: dict, + parametrize_marks: list[dict], + pytest_marks: list[pytest.Mark], ) -> Iterator[YamlItem]: """Return new items with new format values available based on the mark @@ -220,7 +221,7 @@ def unwrap_map(value): "Invalid match between numbers of keys and number of values in parametrize mark" ) from e - keys: List[str] = [i["parametrize"]["key"] for i in parametrize_marks] + keys: list[str] = [i["parametrize"]["key"] for i in parametrize_marks] for vals_combination in combined: logger.debug("Generating test for %s/%s", keys, vals_combination) @@ -284,7 +285,7 @@ def _get_test_fmt_vars(self, test_spec: Mapping) -> dict: # skipif: {my_integer} > 2 # skipif: 'https' in '{hostname}' # skipif: '{hostname}'.contains('ignoreme') - fmt_vars: Dict = {} + fmt_vars: dict = {} global_cfg = load_global_cfg(self.config) fmt_vars.update(**global_cfg.variables) @@ -309,7 +310,7 @@ def _get_test_fmt_vars(self, test_spec: Mapping) -> dict: tavern_box.merge_update(**fmt_vars) return tavern_box - def _generate_items(self, test_spec: Dict) -> Iterator[YamlItem]: + def _generate_items(self, test_spec: dict) -> Iterator[YamlItem]: """Modify or generate tests based on test spec If there are any 'parametrize' marks, this will generate extra tests diff --git a/tavern/_core/pytest/item.py b/tavern/_core/pytest/item.py index 6e14984a5..176d42d8b 100644 --- a/tavern/_core/pytest/item.py +++ b/tavern/_core/pytest/item.py @@ -1,6 +1,7 @@ import logging import pathlib -from typing import MutableMapping, Optional, Tuple, Union +from collections.abc import MutableMapping +from typing import Optional, Union import attr import pytest @@ -276,7 +277,7 @@ def repr_failure( attach_text(str(error), name="error_output") return error - def reportinfo(self) -> Tuple[pathlib.Path, int, str]: + def reportinfo(self) -> tuple[pathlib.Path, int, str]: return ( self.path, 0, diff --git a/tavern/_core/pytest/newhooks.py b/tavern/_core/pytest/newhooks.py index b76955afc..a6a4cf021 100644 --- a/tavern/_core/pytest/newhooks.py +++ b/tavern/_core/pytest/newhooks.py @@ -1,12 +1,13 @@ import logging -from typing import Any, Dict, MutableMapping +from collections.abc import MutableMapping +from typing import Any from tavern._core.pytest.config import TestConfig logger: logging.Logger = logging.getLogger(__name__) -def pytest_tavern_beta_before_every_test_run(test_dict: Dict, variables: Dict) -> None: +def pytest_tavern_beta_before_every_test_run(test_dict: dict, variables: dict) -> None: """Called: - directly after fixtures are loaded for a test @@ -23,7 +24,7 @@ def pytest_tavern_beta_before_every_test_run(test_dict: Dict, variables: Dict) - """ -def pytest_tavern_beta_after_every_test_run(test_dict: Dict, variables: Dict) -> None: +def pytest_tavern_beta_after_every_test_run(test_dict: dict, variables: dict) -> None: """Called: - After test run diff --git a/tavern/_core/pytest/util.py b/tavern/_core/pytest/util.py index 03416d2c4..c9c4a0366 100644 --- a/tavern/_core/pytest/util.py +++ b/tavern/_core/pytest/util.py @@ -1,7 +1,7 @@ import logging from functools import lru_cache from pathlib import Path -from typing import Any, Dict, List, Optional, TypeVar, Union +from typing import Any, Optional, TypeVar, Union import pytest @@ -152,7 +152,7 @@ def _load_global_cfg(pytest_config: pytest.Config) -> TestConfig: all_paths = ini_global_cfg_paths + cmdline_global_cfg_paths global_cfg_dict = load_global_config(all_paths) - variables: Dict = {} + variables: dict = {} try: loaded_variables = global_cfg_dict["variables"] except KeyError: @@ -175,7 +175,7 @@ def _load_global_cfg(pytest_config: pytest.Config) -> TestConfig: return global_cfg -def _load_global_backends(pytest_config: pytest.Config) -> Dict[str, Any]: +def _load_global_backends(pytest_config: pytest.Config) -> dict[str, Any]: """Load which backend should be used""" return { b: get_option_generic(pytest_config, f"tavern-{b}-backend", None) @@ -186,7 +186,7 @@ def _load_global_backends(pytest_config: pytest.Config) -> Dict[str, Any]: def _load_global_strictness(pytest_config: pytest.Config) -> StrictLevel: """Load the global 'strictness' setting""" - options: List = get_option_generic(pytest_config, "tavern-strict", []) + options: list = get_option_generic(pytest_config, "tavern-strict", []) return StrictLevel.from_options(options) @@ -196,7 +196,7 @@ def _load_global_follow_redirects(pytest_config: pytest.Config) -> bool: return get_option_generic(pytest_config, "tavern-always-follow-redirects", False) -T = TypeVar("T", bound=Optional[Union[str, List, List[Path], List[str], bool]]) +T = TypeVar("T", bound=Optional[Union[str, list, list[Path], list[str], bool]]) def get_option_generic( diff --git a/tavern/_core/report.py b/tavern/_core/report.py index 2bfba54bc..78c8f28cd 100644 --- a/tavern/_core/report.py +++ b/tavern/_core/report.py @@ -1,6 +1,6 @@ import logging from textwrap import dedent -from typing import Dict, List, Set, Tuple, Union +from typing import Union import yaml @@ -28,7 +28,7 @@ def call(step_func): logger: logging.Logger = logging.getLogger(__name__) -def prepare_yaml(val: Union[Dict, Set, List, Tuple, str]) -> Union[Dict, List, str]: +def prepare_yaml(val: Union[dict, set, list, tuple, str]) -> Union[dict, list, str]: """Sanitises the formatted string into a format safe for dumping""" if isinstance(val, dict): prepared = {} @@ -47,7 +47,7 @@ def prepare_yaml(val: Union[Dict, Set, List, Tuple, str]) -> Union[Dict, List, s return val -def attach_stage_content(stage: Dict) -> None: +def attach_stage_content(stage: dict) -> None: first_line, last_line, _ = get_stage_lines(stage) code_lines = list(read_relevant_lines(stage, first_line, last_line)) diff --git a/tavern/_core/run.py b/tavern/_core/run.py index 1478331e3..65b06aceb 100644 --- a/tavern/_core/run.py +++ b/tavern/_core/run.py @@ -3,9 +3,9 @@ import functools import logging import pathlib +from collections.abc import Mapping, MutableMapping from contextlib import ExitStack from copy import deepcopy -from typing import Dict, List, Mapping, MutableMapping import box @@ -31,8 +31,8 @@ def _resolve_test_stages( - stages: List[Mapping], available_stages: Mapping -) -> List[Mapping]: + stages: list[Mapping], available_stages: Mapping +) -> list[Mapping]: """Looks for 'ref' stages in the given stages and returns any resolved stages Args: @@ -75,8 +75,8 @@ def _get_included_stages( tavern_box: box.Box, test_block_config: TestConfig, test_spec: Mapping, - available_stages: List[dict], -) -> List[dict]: + available_stages: list[dict], +) -> list[dict]: """ Get any stages which were included via config files which will be available for use in this test @@ -293,7 +293,7 @@ def update_stage_options(new_option): @dataclasses.dataclass(frozen=True) class _TestRunner: default_global_strictness: StrictLevel - sessions: Dict[str, PluginHelperBase] + sessions: dict[str, PluginHelperBase] test_block_config: TestConfig test_spec: Mapping diff --git a/tavern/_core/schema/extensions.py b/tavern/_core/schema/extensions.py index 44bc7075c..9e70cf365 100644 --- a/tavern/_core/schema/extensions.py +++ b/tavern/_core/schema/extensions.py @@ -1,6 +1,7 @@ import os import re -from typing import TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Tuple, Type, Union +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, Callable, Union from pykwalify.types import is_bool, is_float, is_int @@ -28,7 +29,7 @@ # To extend pykwalify's type validation, extend its internal functions # These return boolean values def validate_type_and_token( - validate_type: Callable[[Any], bool], token: Type[TypeConvertToken] + validate_type: Callable[[Any], bool], token: type[TypeConvertToken] ): def validate(value): return validate_type(value) or isinstance(value, token) @@ -333,7 +334,7 @@ def validate_json_with_ext(value, rule_obj, path) -> bool: return True -def check_strict_key(value: Union[List, bool], rule_obj, path) -> bool: +def check_strict_key(value: Union[list, bool], rule_obj, path) -> bool: """Make sure the 'strict' key is either a bool or a list""" if not isinstance(value, list) and not is_bool_like(value): @@ -350,7 +351,7 @@ def check_strict_key(value: Union[List, bool], rule_obj, path) -> bool: return True -def validate_timeout_tuple_or_float(value: Union[List, Tuple], rule_obj, path) -> bool: +def validate_timeout_tuple_or_float(value: Union[list, tuple], rule_obj, path) -> bool: """Make sure timeout is a float/int or a tuple of floats/ints""" err_msg = "'timeout' must be either a float/int or a 2-tuple of floats/ints - got '{}' (type {})".format( @@ -405,7 +406,7 @@ def validate_cert_tuple_or_str(value, rule_obj, path) -> bool: return True -def validate_file_spec(value: Dict, rule_obj, path) -> bool: +def validate_file_spec(value: dict, rule_obj, path) -> bool: """Validate file upload arguments""" logger = get_pykwalify_logger("tavern.schema.extensions") diff --git a/tavern/_core/schema/files.py b/tavern/_core/schema/files.py index 2672c1ab8..3d9429101 100644 --- a/tavern/_core/schema/files.py +++ b/tavern/_core/schema/files.py @@ -3,7 +3,7 @@ import logging import os import tempfile -from typing import Dict, Mapping +from collections.abc import Mapping import pykwalify import yaml @@ -21,7 +21,7 @@ class SchemaCache: """Caches loaded schemas""" def __init__(self) -> None: - self._loaded: Dict[str, Dict] = {} + self._loaded: dict[str, dict] = {} def _load_base_schema(self, schema_filename): try: @@ -33,7 +33,7 @@ def _load_base_schema(self, schema_filename): return self._loaded[schema_filename] - def _load_schema_with_plugins(self, schema_filename: str) -> Dict: + def _load_schema_with_plugins(self, schema_filename: str) -> dict: mangled = f"{schema_filename}-plugins" try: diff --git a/tavern/_core/schema/jsonschema.py b/tavern/_core/schema/jsonschema.py index c439a732a..d3e881495 100644 --- a/tavern/_core/schema/jsonschema.py +++ b/tavern/_core/schema/jsonschema.py @@ -1,6 +1,6 @@ import logging import re -from typing import Mapping +from collections.abc import Mapping import jsonschema from jsonschema import Draft7Validator, ValidationError diff --git a/tavern/_core/stage_lines.py b/tavern/_core/stage_lines.py index 7c6f97221..134ffe266 100644 --- a/tavern/_core/stage_lines.py +++ b/tavern/_core/stage_lines.py @@ -1,12 +1,9 @@ import dataclasses import logging +from collections.abc import Iterable, Mapping from typing import ( - Iterable, - Mapping, Optional, Protocol, - Tuple, - Type, Union, ) @@ -31,7 +28,7 @@ class _WithMarks(Protocol): PyYamlDict = Union[_WithMarks, Mapping] -def get_stage_lines(stage: PyYamlDict) -> Tuple[int, int, int]: +def get_stage_lines(stage: PyYamlDict) -> tuple[int, int, int]: first_line = start_mark(stage).line - 1 last_line = end_mark(stage).line line_start = first_line + 1 @@ -60,14 +57,14 @@ def get_stage_filename(yaml_block: PyYamlDict) -> Optional[str]: return start_mark(yaml_block).name -def start_mark(yaml_block: PyYamlDict) -> Union[Type[YamlMark], YamlMark]: +def start_mark(yaml_block: PyYamlDict) -> Union[type[YamlMark], YamlMark]: try: return yaml_block.start_mark # type:ignore except AttributeError: return YamlMark() -def end_mark(yaml_block: PyYamlDict) -> Union[Type[YamlMark], YamlMark]: +def end_mark(yaml_block: PyYamlDict) -> Union[type[YamlMark], YamlMark]: try: return yaml_block.end_mark # type:ignore except AttributeError: diff --git a/tavern/_core/strict_util.py b/tavern/_core/strict_util.py index bc7c63ee4..f4c7f686b 100644 --- a/tavern/_core/strict_util.py +++ b/tavern/_core/strict_util.py @@ -2,7 +2,7 @@ import enum import logging import re -from typing import List, Optional, Tuple, Union +from typing import Optional, Union from tavern._core import exceptions from tavern._core.strtobool import strtobool @@ -100,7 +100,7 @@ class StrictLevel: ) @classmethod - def from_options(cls, options: Union[List[str], str]) -> "StrictLevel": + def from_options(cls, options: Union[list[str], str]) -> "StrictLevel": if isinstance(options, str): options = [options] elif not isinstance(options, list): @@ -135,7 +135,7 @@ def all_off(cls) -> "StrictLevel": StrictSettingKinds = Union[None, bool, StrictSetting, StrictOption] -def extract_strict_setting(strict: StrictSettingKinds) -> Tuple[bool, StrictSetting]: +def extract_strict_setting(strict: StrictSettingKinds) -> tuple[bool, StrictSetting]: """Takes either a bool, StrictOption, or a StrictSetting and return the bool representation and StrictSetting representation""" diff --git a/tavern/_core/testhelpers.py b/tavern/_core/testhelpers.py index 3c294a4c1..20cf6eb8c 100644 --- a/tavern/_core/testhelpers.py +++ b/tavern/_core/testhelpers.py @@ -1,7 +1,8 @@ import logging import time +from collections.abc import Mapping from functools import wraps -from typing import Callable, Mapping, Union +from typing import Callable, Union from tavern._core import exceptions from tavern._core.dict_util import format_keys diff --git a/tavern/_core/tincture.py b/tavern/_core/tincture.py index 212802393..f4f1fe269 100644 --- a/tavern/_core/tincture.py +++ b/tavern/_core/tincture.py @@ -2,7 +2,8 @@ import dataclasses import inspect import logging -from typing import Any, Generator, List +from collections.abc import Generator +from typing import Any from tavern._core import exceptions from tavern._core.extfunctions import get_wrapped_response_function @@ -12,8 +13,10 @@ @dataclasses.dataclass class Tinctures: - tinctures: List[Any] - needs_response: List[Generator] = dataclasses.field(default_factory=list) + tinctures: list[Any] + needs_response: list[Generator[None, tuple[Any, Any], None]] = dataclasses.field( + default_factory=list + ) def start_tinctures(self, stage: collections.abc.Mapping) -> None: results = [t(stage) for t in self.tinctures] diff --git a/tavern/_plugins/grpc/client.py b/tavern/_plugins/grpc/client.py index 8e51b110a..ee6a37c8c 100644 --- a/tavern/_plugins/grpc/client.py +++ b/tavern/_plugins/grpc/client.py @@ -1,8 +1,8 @@ import dataclasses import logging -import typing import warnings -from typing import Any, Dict, List, Mapping, Optional, Tuple +from collections.abc import Mapping +from typing import Any, Optional import grpc import grpc_reflection @@ -28,7 +28,7 @@ warnings.simplefilter("ignore") warnings.warn("deprecated", DeprecationWarning) # noqa: B028 -_ProtoMessageType = typing.Type[proto.message.Message] +_ProtoMessageType = type[proto.message.Message] @dataclasses.dataclass @@ -69,7 +69,7 @@ def __init__(self, **kwargs) -> None: self.timeout = int(_connect_args.get("timeout", 5)) self.secure = bool(_connect_args.get("secure", False)) - self._options: List[Tuple[str, Any]] = [] + self._options: list[tuple[str, Any]] = [] for key, value in _connect_args.pop("options", {}).items(): if not key.startswith("grpc."): raise exceptions.GRPCServiceException( @@ -77,7 +77,7 @@ def __init__(self, **kwargs) -> None: ) self._options.append((key, value)) - self.channels: Dict[str, grpc.Channel] = {} + self.channels: dict[str, grpc.Channel] = {} # Using the default symbol database is a bit undesirable because it means that things being imported from # previous tests will affect later ones which can mask bugs. But there isn't a nice way to have a # self-contained symbol database, because then you need to transitively import all dependencies of protos and @@ -143,7 +143,7 @@ def _get_grpc_service( def get_method_types( self, full_method_name: str - ) -> Tuple[_ProtoMessageType, _ProtoMessageType]: + ) -> tuple[_ProtoMessageType, _ProtoMessageType]: """Uses the builtin symbol pool to try and find the input and output types for the given method Args: diff --git a/tavern/_plugins/grpc/protos.py b/tavern/_plugins/grpc/protos.py index e34503b26..14805d129 100644 --- a/tavern/_plugins/grpc/protos.py +++ b/tavern/_plugins/grpc/protos.py @@ -9,7 +9,6 @@ import tempfile from distutils.spawn import find_executable from importlib.machinery import ModuleSpec -from typing import List from tavern._core import exceptions @@ -118,7 +117,7 @@ def _import_grpc_module(python_module_name: str) -> None: f"relative imports for Python grpc modules not allowed (got {python_module_name})" ) - import_specs: List[ModuleSpec] = [] + import_specs: list[ModuleSpec] = [] # Check if its already on the python path if (spec := importlib.util.find_spec(python_module_name)) is not None: diff --git a/tavern/_plugins/grpc/request.py b/tavern/_plugins/grpc/request.py index 706f0bb52..16c39de43 100644 --- a/tavern/_plugins/grpc/request.py +++ b/tavern/_plugins/grpc/request.py @@ -3,7 +3,7 @@ import json import logging import warnings -from typing import Dict, Union +from typing import Union import grpc from box import Box @@ -17,7 +17,7 @@ logger: logging.Logger = logging.getLogger(__name__) -def get_grpc_args(rspec: Dict, test_block_config: TestConfig) -> Dict: +def get_grpc_args(rspec: dict, test_block_config: TestConfig) -> dict: """Format GRPC request args""" fspec = format_keys(rspec, test_block_config.variables) @@ -50,7 +50,7 @@ class GRPCRequest(BaseRequest): _warned = False def __init__( - self, client: GRPCClient, request_spec: Dict, test_block_config: TestConfig + self, client: GRPCClient, request_spec: dict, test_block_config: TestConfig ) -> None: if not self._warned: warnings.warn( diff --git a/tavern/_plugins/grpc/response.py b/tavern/_plugins/grpc/response.py index a618e2d99..87e648ff2 100644 --- a/tavern/_plugins/grpc/response.py +++ b/tavern/_plugins/grpc/response.py @@ -1,5 +1,6 @@ import logging -from typing import TYPE_CHECKING, Any, Dict, List, Mapping, Optional, TypedDict, Union +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, Optional, TypedDict, Union import grpc import proto.message @@ -20,10 +21,10 @@ logger: logging.Logger = logging.getLogger(__name__) -GRPCCode = Union[str, int, List[str], List[int]] +GRPCCode = Union[str, int, list[str], list[int]] -def _to_grpc_name(status: GRPCCode) -> Union[str, List[str]]: +def _to_grpc_name(status: GRPCCode) -> Union[str, list[str]]: if isinstance(status, list): return [_to_grpc_name(s) for s in status] # type:ignore @@ -128,8 +129,8 @@ def _handle_grpc_response( self, grpc_response: Union[grpc.Call, grpc.Future], response: "WrappedFuture", - verify_status: List[str], - ) -> Optional[Dict[str, Any]]: + verify_status: list[str], + ) -> Optional[dict[str, Any]]: if grpc_response.code().name != "OK": # TODO: Should allow checking grpc RPC error details etc. logger.info( @@ -169,7 +170,7 @@ def _handle_grpc_response( self._validate_block("json", json_result) self._maybe_run_validate_functions(json_result) - saved: Dict[str, Any] = {} + saved: dict[str, Any] = {} saved.update(self.maybe_get_save_values_from_save_block("body", json_result)) saved.update(self.maybe_get_save_values_from_ext(json_result, self.expected)) diff --git a/tavern/_plugins/mqtt/client.py b/tavern/_plugins/mqtt/client.py index 7ac4a5a90..a0745e47d 100644 --- a/tavern/_plugins/mqtt/client.py +++ b/tavern/_plugins/mqtt/client.py @@ -4,8 +4,9 @@ import ssl import threading import time +from collections.abc import Mapping, MutableMapping from queue import Empty, Full, Queue -from typing import Any, Dict, List, Mapping, MutableMapping, Optional, Union +from typing import Any, Optional, Union import paho.mqtt.client as paho from paho.mqtt.client import MQTTMessageInfo @@ -88,7 +89,7 @@ def _handle_ssl_context_args( def _check_and_update_common_tls_args( - tls_args: MutableMapping, check_file_keys: List[str] + tls_args: MutableMapping, check_file_keys: list[str] ) -> None: """Checks common args between ssl/tls args""" @@ -275,14 +276,14 @@ def __init__(self, **kwargs) -> None: self._client.tls_insecure_set(True) # Topics to subscribe to - mapping of subscription message id to subscription object - self._subscribed: Dict[int, _Subscription] = {} + self._subscribed: dict[int, _Subscription] = {} # Lock to ensure there is no race condition when subscribing self._subscribe_lock = threading.RLock() # callback self._client.on_subscribe = self._on_subscribe # Mapping of topic -> subscription id, for indexing into self._subscribed - self._subscription_mappings: Dict[str, int] = {} + self._subscription_mappings: dict[str, int] = {} self._userdata = { "_subscription_mappings": self._subscription_mappings, "_subscribed": self._subscribed, diff --git a/tavern/_plugins/mqtt/request.py b/tavern/_plugins/mqtt/request.py index 6f1705fd2..57630be50 100644 --- a/tavern/_plugins/mqtt/request.py +++ b/tavern/_plugins/mqtt/request.py @@ -1,7 +1,6 @@ import functools import json import logging -from typing import Dict from box.box import Box @@ -16,7 +15,7 @@ logger: logging.Logger = logging.getLogger(__name__) -def get_publish_args(rspec: Dict, test_block_config: TestConfig) -> dict: +def get_publish_args(rspec: dict, test_block_config: TestConfig) -> dict: """Format mqtt request args and update using ext functions""" fspec = format_keys(rspec, test_block_config.variables) @@ -41,7 +40,7 @@ class MQTTRequest(BaseRequest): """ def __init__( - self, client: MQTTClient, rspec: Dict, test_block_config: TestConfig + self, client: MQTTClient, rspec: dict, test_block_config: TestConfig ) -> None: expected = {"topic", "payload", "json", "qos", "retain"} diff --git a/tavern/_plugins/mqtt/response.py b/tavern/_plugins/mqtt/response.py index 305e8496d..752f95b92 100644 --- a/tavern/_plugins/mqtt/response.py +++ b/tavern/_plugins/mqtt/response.py @@ -5,8 +5,9 @@ import json import logging import time +from collections.abc import Mapping from dataclasses import dataclass -from typing import Dict, List, Mapping, Optional, Tuple, Union +from typing import Optional, Union from paho.mqtt.client import MQTTMessage @@ -40,7 +41,7 @@ def __init__( self._client = client - self.received_messages: List = [] + self.received_messages: list = [] def __str__(self) -> str: if self.response: @@ -76,8 +77,8 @@ def _await_response(self) -> Mapping: m: list(v) for m, v in itertools.groupby(expected, lambda x: x["topic"]) } - correct_messages: List["_ReturnedMessage"] = [] - warnings: List[str] = [] + correct_messages: list["_ReturnedMessage"] = [] + warnings: list[str] = [] with concurrent.futures.ThreadPoolExecutor() as executor: futures = [] @@ -111,7 +112,7 @@ def _await_response(self) -> Mapping: failures=self.errors, ) - saved: Dict = {} + saved: dict = {} for msg in correct_messages: # Check saving things from the payload and from json @@ -144,8 +145,8 @@ def _await_response(self) -> Mapping: return saved def _await_messages_on_topic( - self, topic: str, expected: List[Dict] - ) -> Tuple[List["_ReturnedMessage"], List[str]]: + self, topic: str, expected: list[dict] + ) -> tuple[list["_ReturnedMessage"], list[str]]: """ Waits for the specific message @@ -198,7 +199,7 @@ def _await_messages_on_topic( name="rest_response", ) - found: List[int] = [] + found: list[int] = [] for i, v in enumerate(verifiers): if v.is_valid(msg): correct_messages.append(_ReturnedMessage(v.expected, msg)) @@ -255,7 +256,7 @@ def __init__(self, test_block_config: TestConfig, expected: Mapping) -> None: # Any warnings to do with the request # eg, if a message was received but it didn't match, message had payload, etc. - self.warnings: List[str] = [] + self.warnings: list[str] = [] def is_valid(self, msg: MQTTMessage) -> bool: if time.time() > self.expires: @@ -327,7 +328,7 @@ def addwarning(w, *args, **kwargs): return False @staticmethod - def _get_payload_vals(expected: Mapping) -> Tuple[Optional[Union[str, dict]], bool]: + def _get_payload_vals(expected: Mapping) -> tuple[Optional[Union[str, dict]], bool]: """Gets the payload from the 'expected' block Returns: @@ -357,7 +358,7 @@ def _get_payload_vals(expected: Mapping) -> Tuple[Optional[Union[str, dict]], bo return payload, json_payload - def popwarnings(self) -> List[str]: + def popwarnings(self) -> list[str]: popped = [] while self.warnings: popped.append(self.warnings.pop(0)) diff --git a/tavern/_plugins/mqtt/tavernhook.py b/tavern/_plugins/mqtt/tavernhook.py index bc37d2677..f6fe4d3e4 100644 --- a/tavern/_plugins/mqtt/tavernhook.py +++ b/tavern/_plugins/mqtt/tavernhook.py @@ -1,6 +1,7 @@ import logging +from collections.abc import Iterable from os.path import abspath, dirname, join -from typing import Dict, Iterable, Optional, Union +from typing import Optional, Union import yaml @@ -20,11 +21,11 @@ def get_expected_from_request( - response_block: Union[Dict, Iterable[Dict]], + response_block: Union[dict, Iterable[dict]], test_block_config: TestConfig, session: MQTTClient, -) -> Optional[Dict]: - expected: Optional[Dict] = None +) -> Optional[dict]: + expected: Optional[dict] = None # mqtt response is not required if response_block: diff --git a/tavern/_plugins/rest/files.py b/tavern/_plugins/rest/files.py index 8aba5b9e3..e48cf9769 100644 --- a/tavern/_plugins/rest/files.py +++ b/tavern/_plugins/rest/files.py @@ -3,7 +3,7 @@ import mimetypes import os from contextlib import ExitStack -from typing import Any, List, Optional, Tuple, Union +from typing import Any, Optional, Union from tavern._core import exceptions from tavern._core.dict_util import format_keys @@ -64,7 +64,7 @@ def _parse_filespec(filespec: Union[str, dict]) -> _Filespec: def guess_filespec( filespec: Union[str, dict], stack: ExitStack, test_block_config: TestConfig -) -> Tuple[List, Optional[str]]: +) -> tuple[list, Optional[str]]: """tries to guess the content type and encoding from a file. Args: @@ -133,9 +133,9 @@ def _parse_file_mapping(file_args, stack, test_block_config) -> dict: return files_to_send -def _parse_file_list(file_args, stack, test_block_config) -> List: +def _parse_file_list(file_args, stack, test_block_config) -> list: """Parses a case where there may be multiple files uploaded as part of one form field""" - files_to_send: List[Any] = [] + files_to_send: list[Any] = [] for filespec in file_args: file_spec, form_field_name = guess_filespec(filespec, stack, test_block_config) @@ -170,7 +170,7 @@ def get_file_arguments( mapping of 'files' block to pass directly to requests """ - files_to_send: Optional[Union[dict, List]] = None + files_to_send: Optional[Union[dict, list]] = None file_args = request_args.get("files") diff --git a/tavern/_plugins/rest/request.py b/tavern/_plugins/rest/request.py index 1c1a28619..cb4497988 100644 --- a/tavern/_plugins/rest/request.py +++ b/tavern/_plugins/rest/request.py @@ -2,9 +2,10 @@ import json import logging import warnings +from collections.abc import Mapping from contextlib import ExitStack from itertools import filterfalse, tee -from typing import Callable, ClassVar, Dict, List, Mapping, Optional +from typing import Callable, ClassVar, Optional from urllib.parse import quote_plus import requests @@ -24,7 +25,7 @@ logger: logging.Logger = logging.getLogger(__name__) -def get_request_args(rspec: Dict, test_block_config: TestConfig) -> Dict: +def get_request_args(rspec: dict, test_block_config: TestConfig) -> dict: """Format the test spec given values inthe global config Todo: @@ -334,7 +335,7 @@ def partition(pred, iterable): class RestRequest(BaseRequest): - optional_in_file: ClassVar[List[str]] = [ + optional_in_file: ClassVar[list[str]] = [ "json", "data", "params", diff --git a/tavern/_plugins/rest/response.py b/tavern/_plugins/rest/response.py index 598fe6cd5..0fbf43dbd 100644 --- a/tavern/_plugins/rest/response.py +++ b/tavern/_plugins/rest/response.py @@ -1,7 +1,8 @@ import contextlib import json import logging -from typing import Any, Dict, List, Mapping, Union +from collections.abc import Mapping +from typing import Any, Union from urllib.parse import parse_qs, urlparse import requests @@ -78,7 +79,7 @@ def log_dict_block(block, name): logger.debug("Redirect location: %s", to_path) log_dict_block(redirect_query_params, "Redirect URL query parameters") - def _get_redirect_query_params(self, response: requests.Response) -> Dict[str, str]: + def _get_redirect_query_params(self, response: requests.Response) -> dict[str, str]: """If there was a redirect header, get any query parameters from it""" try: @@ -98,7 +99,7 @@ def _get_redirect_query_params(self, response: requests.Response) -> Dict[str, s return redirect_query_params - def _check_status_code(self, status_code: Union[int, List[int]], body: Any) -> None: + def _check_status_code(self, status_code: Union[int, list[int]], body: Any) -> None: expected_code = self.expected["status_code"] if (isinstance(expected_code, int) and status_code == expected_code) or ( @@ -176,7 +177,7 @@ def verify(self, response: requests.Response) -> dict: self._maybe_run_validate_functions(response) # Get any keys to save - saved: Dict = {} + saved: dict = {} saved.update(self.maybe_get_save_values_from_save_block("json", body)) saved.update( diff --git a/tavern/_plugins/rest/tavernhook.py b/tavern/_plugins/rest/tavernhook.py index 3a08bf6f5..8f6a56e2b 100644 --- a/tavern/_plugins/rest/tavernhook.py +++ b/tavern/_plugins/rest/tavernhook.py @@ -1,5 +1,4 @@ import logging -from typing import Dict import requests @@ -22,7 +21,7 @@ class TavernRestPlugin(PluginHelperBase): @staticmethod def get_expected_from_request( - response_block: Dict, test_block_config: TestConfig, session + response_block: dict, test_block_config: TestConfig, session ): if response_block is None: raise exceptions.MissingSettingsError( diff --git a/tavern/entry.py b/tavern/entry.py index b996f94c7..500bf352e 100644 --- a/tavern/entry.py +++ b/tavern/entry.py @@ -2,7 +2,6 @@ import logging.config from argparse import ArgumentParser from textwrap import dedent -from typing import Dict from .core import run @@ -39,7 +38,7 @@ def __init__(self) -> None: ) -def main(): +def main() -> None: args, remaining = TavernArgParser().parse_known_args() vargs = vars(args) @@ -49,7 +48,7 @@ def main(): log_level = "INFO" # Basic logging config that will print out useful information - log_cfg: Dict = { + log_cfg: dict = { "version": 1, "formatters": { "default": { diff --git a/tavern/helpers.py b/tavern/helpers.py index aabe2c7a4..8460ea871 100644 --- a/tavern/helpers.py +++ b/tavern/helpers.py @@ -2,7 +2,8 @@ import json import logging import re -from typing import Dict, Iterable, Mapping, Optional +from collections.abc import Iterable, Mapping +from typing import Optional import jmespath import jwt @@ -98,7 +99,7 @@ def validate_jwt( return {"jwt": Box(decoded)} -def validate_pykwalify(response: requests.Response, schema: Dict) -> None: +def validate_pykwalify(response: requests.Response, schema: dict) -> None: """Make sure the response matches a given schema Args: @@ -122,7 +123,7 @@ def validate_regex( *, header: Optional[str] = None, in_jmespath: Optional[str] = None, -) -> Dict[str, Box]: +) -> dict[str, Box]: """Make sure the response matches a regex expression Args: @@ -173,7 +174,7 @@ def validate_regex( return {"regex": Box(match.groupdict())} -def validate_content(response: requests.Response, comparisons: Iterable[Dict]) -> None: +def validate_content(response: requests.Response, comparisons: Iterable[dict]) -> None: """Asserts expected value with actual value using JMES path expression Args: diff --git a/tavern/response.py b/tavern/response.py index 0b90246af..ff9dd1134 100644 --- a/tavern/response.py +++ b/tavern/response.py @@ -4,7 +4,7 @@ from abc import abstractmethod from collections.abc import Mapping from textwrap import indent -from typing import Any, List, Optional +from typing import Any, Optional from tavern._core import exceptions from tavern._core.dict_util import check_keys_match_recursive, recurse_access_key @@ -28,8 +28,8 @@ class BaseResponse: test_block_config: TestConfig response: Optional[Any] = None - validate_functions: List[Any] = dataclasses.field(init=False, default_factory=list) - errors: List[str] = dataclasses.field(init=False, default_factory=list) + validate_functions: list[Any] = dataclasses.field(init=False, default_factory=list) + errors: list[str] = dataclasses.field(init=False, default_factory=list) def __post_init__(self) -> None: self._check_for_validate_functions(self.expected) diff --git a/tests/integration/Dockerfile b/tests/integration/Dockerfile index 7c964d8b6..4ab877a08 100644 --- a/tests/integration/Dockerfile +++ b/tests/integration/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10-alpine +FROM python:3.9-alpine RUN pip3 install 'pyjwt>=2.4.0,<3' 'flask>=2.2.3' "python-box>=6,<7" diff --git a/tests/unit/test_core.py b/tests/unit/test_core.py index ad67a39fa..89ad1ab27 100644 --- a/tests/unit/test_core.py +++ b/tests/unit/test_core.py @@ -402,11 +402,14 @@ def test_format_request_var_value(self, fulltest, mockargs, includes, request_ke mock_response = Mock(**mockargs) - with patch( - "tavern._plugins.rest.request.requests.Session.request", - return_value=mock_response, - ) as pmock, patch( - "tavern._plugins.rest.request.valid_http_methods", ["POST", sent_value] + with ( + patch( + "tavern._plugins.rest.request.requests.Session.request", + return_value=mock_response, + ) as pmock, + patch( + "tavern._plugins.rest.request.valid_http_methods", ["POST", sent_value] + ), ): run_test("heif", fulltest, includes) @@ -639,12 +642,15 @@ def test_tinctures( tincture_func_mock = Mock() - with patch( - "tavern._plugins.rest.request.requests.Session.request", - return_value=mock_response, - ) as pmock, patch( - "tavern._core.tincture.get_wrapped_response_function", - return_value=tincture_func_mock, + with ( + patch( + "tavern._plugins.rest.request.requests.Session.request", + return_value=mock_response, + ) as pmock, + patch( + "tavern._core.tincture.get_wrapped_response_function", + return_value=tincture_func_mock, + ), ): run_test("heif", fulltest, includes) diff --git a/tests/unit/test_mqtt.py b/tests/unit/test_mqtt.py index 75ff51eb1..24e7b44a3 100644 --- a/tests/unit/test_mqtt.py +++ b/tests/unit/test_mqtt.py @@ -65,8 +65,9 @@ def test_context_connection_failure(self, fake_client): def test_context_connection_success(self, fake_client): """returns self on success""" - with patch.object(fake_client._client, "loop_start"), patch.object( - fake_client._client, "connect_async" + with ( + patch.object(fake_client._client, "loop_start"), + patch.object(fake_client._client, "connect_async"), ): fake_client._client._state = paho.mqtt_cs_connected with fake_client as x: @@ -81,8 +82,9 @@ def wait_for_publish(self, timeout=None): rc = 1 - with patch.object(fake_client._client, "subscribe"), patch.object( - fake_client._client, "publish", return_value=FakeMessage(10) + with ( + patch.object(fake_client._client, "subscribe"), + patch.object(fake_client._client, "publish", return_value=FakeMessage(10)), ): with pytest.raises(exceptions.MQTTError): fake_client.publish("abc", "123") @@ -99,8 +101,9 @@ def is_published(self): rc = 1 - with patch.object(fake_client._client, "subscribe"), patch.object( - fake_client._client, "publish", return_value=FakeMessage(10) + with ( + patch.object(fake_client._client, "subscribe"), + patch.object(fake_client._client, "publish", return_value=FakeMessage(10)), ): with pytest.raises(exceptions.MQTTError): fake_client.publish("abc", "123") @@ -117,8 +120,9 @@ def is_published(self): rc = 1 - with patch.object(fake_client._client, "subscribe"), patch.object( - fake_client._client, "publish", return_value=FakeMessage(10) + with ( + patch.object(fake_client._client, "subscribe"), + patch.object(fake_client._client, "publish", return_value=FakeMessage(10)), ): fake_client.publish("abc", "123") @@ -131,8 +135,9 @@ def is_published(self): rc = 2342423 - with patch.object(fake_client._client, "subscribe"), patch.object( - fake_client._client, "publish", return_value=FakeMessage(10) + with ( + patch.object(fake_client._client, "subscribe"), + patch.object(fake_client._client, "publish", return_value=FakeMessage(10)), ): with pytest.raises(exceptions.MQTTError): fake_client.publish("abc", "123") diff --git a/tox-integration.ini b/tox-integration.ini index eab3b6a94..237b18304 100644 --- a/tox-integration.ini +++ b/tox-integration.ini @@ -6,7 +6,7 @@ isolated_build = True [testenv] allowlist_externals = docker -basepython = python3.11 +basepython = python3.9 passenv = DOCKER_TLS_VERIFY,DOCKER_HOST,DOCKER_CERT_PATH,DOCKER_BUILDKIT setenv = TEST_HOST = http://localhost:5003 diff --git a/tox.ini b/tox.ini index 12cc78a71..231ea6bbd 100644 --- a/tox.ini +++ b/tox.ini @@ -5,7 +5,7 @@ isolated_build = True [testenv] passenv = XDG_CACHE_HOME -basepython = python3.11 +basepython = python3.9 allowlist_externals = uv install_command = uv pip install {opts} {packages} -c constraints.txt