From b6c66ca477ebbb5a5d423fdfe5a97ce6a825c2c8 Mon Sep 17 00:00:00 2001
From: "knope-bot[bot]" <152252888+knope-bot[bot]@users.noreply.github.com>
Date: Fri, 22 Nov 2024 18:33:37 -0700
Subject: [PATCH 01/18] Release 0.21.7 (#1151)
> [!IMPORTANT]
> Merging this pull request will create this release
## Fixes
- allow required fields list to be specified as empty (#651) (#1149)
- import cast for required const properties, since it's used in the
template (#1153)
Co-authored-by: knope-bot[bot] <152252888+knope-bot[bot]@users.noreply.github.com>
---
CHANGELOG.md | 7 +++++++
pyproject.toml | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 037998c3e..1c20dd597 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,13 @@ Programmatic usage of this project (e.g., importing it as a Python module) and t
The 0.x prefix used in versions for this project is to indicate that breaking changes are expected frequently (several times a year). Breaking changes will increment the minor number, all other changes will increment the patch number. You can track the progress toward 1.0 [here](https://github.com/openapi-generators/openapi-python-client/projects/2).
+## 0.21.7 (2024-10-28)
+
+### Fixes
+
+- allow required fields list to be specified as empty (#651) (#1149)
+- import cast for required const properties, since it's used in the template (#1153)
+
## 0.21.6 (2024-10-20)
### Features
diff --git a/pyproject.toml b/pyproject.toml
index 82d2fb6e5..f7fd9ff9b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -18,7 +18,7 @@ dependencies = [
"typing-extensions>=4.8.0,<5.0.0",
]
name = "openapi-python-client"
-version = "0.21.6"
+version = "0.21.7"
description = "Generate modern Python clients from OpenAPI"
keywords = [
"OpenAPI",
From 9fe5dc1d5dc5e8fbac50ee13fbd19eed44ffe080 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sat, 23 Nov 2024 01:38:41 +0000
Subject: [PATCH 02/18] chore(deps): update dependency typer to >0.6,<0.14
(#1160)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [typer](https://redirect.github.com/fastapi/typer)
([changelog](https://typer.tiangolo.com/release-notes/)) | `>0.6,<0.13`
-> `>0.6,<0.14` |
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
---
### Release Notes
fastapi/typer (typer)
###
[`v0.13.0`](https://redirect.github.com/fastapi/typer/releases/tag/0.13.0)
[Compare
Source](https://redirect.github.com/fastapi/typer/compare/0.12.5...0.13.0)
##### Features
- ✨ Handle `KeyboardInterrupt` separately from other exceptions. PR
[#1039](https://redirect.github.com/fastapi/typer/pull/1039) by
[@patrick91](https://redirect.github.com/patrick91).
- ✨ Update `launch` to not print anything when opening urls. PR
[#1035](https://redirect.github.com/fastapi/typer/pull/1035) by
[@patrick91](https://redirect.github.com/patrick91).
- ✨ Show help items in order of definition. PR
[#944](https://redirect.github.com/fastapi/typer/pull/944) by
[@svlandeg](https://redirect.github.com/svlandeg).
##### Fixes
- 🐛 Fix equality check for custom classes. PR
[#979](https://redirect.github.com/fastapi/typer/pull/979) by
[@AryazE](https://redirect.github.com/AryazE).
- 🐛 Allow colon in zsh autocomplete values and descriptions. PR
[#988](https://redirect.github.com/fastapi/typer/pull/988) by
[@snapbug](https://redirect.github.com/snapbug).
##### Refactors
- 🗑️ Deprecate support for `is_flag` and `flag_value` parameters. PR
[#987](https://redirect.github.com/fastapi/typer/pull/987) by
[@svlandeg](https://redirect.github.com/svlandeg).
- 🔥 Remove unused functionality from `_typing.py` file. PR
[#805](https://redirect.github.com/fastapi/typer/pull/805) by
[@ivantodorovich](https://redirect.github.com/ivantodorovich).
- ✏️ Fix typo in function name `_make_rich_text`. PR
[#959](https://redirect.github.com/fastapi/typer/pull/959) by
[@svlandeg](https://redirect.github.com/svlandeg).
##### Internal
- ✅ Only run completion installation tests when the env var
`_TYPER_RUN_INSTALL_COMPLETION_TESTS` is set. PR
[#995](https://redirect.github.com/fastapi/typer/pull/995) by
[@svlandeg](https://redirect.github.com/svlandeg).
- 📝 Update the docstring of the `_make_rich_text` method. PR
[#972](https://redirect.github.com/fastapi/typer/pull/972) by
[@svlandeg](https://redirect.github.com/svlandeg).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#1040](https://redirect.github.com/fastapi/typer/pull/1040) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- ⬆ Bump mkdocs-material from 9.5.42 to 9.5.44. PR
[#1042](https://redirect.github.com/fastapi/typer/pull/1042) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump ruff from 0.7.1 to 0.7.2. PR
[#1038](https://redirect.github.com/fastapi/typer/pull/1038) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump mkdocs-macros-plugin from 1.3.6 to 1.3.7. PR
[#1031](https://redirect.github.com/fastapi/typer/pull/1031) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#1032](https://redirect.github.com/fastapi/typer/pull/1032) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- ⬆ Bump ruff from 0.7.0 to 0.7.1. PR
[#1029](https://redirect.github.com/fastapi/typer/pull/1029) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump pillow from 10.4.0 to 11.0.0. PR
[#1023](https://redirect.github.com/fastapi/typer/pull/1023) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump mkdocs-material from 9.5.35 to 9.5.42. PR
[#1027](https://redirect.github.com/fastapi/typer/pull/1027) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump ruff from 0.6.5 to 0.7.0. PR
[#1026](https://redirect.github.com/fastapi/typer/pull/1026) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump mkdocs-macros-plugin from 1.2.0 to 1.3.6. PR
[#1025](https://redirect.github.com/fastapi/typer/pull/1025) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Update pre-commit requirement from <4.0.0,>=2.17.0 to
>=2.17.0,<5.0.0. PR
[#1012](https://redirect.github.com/fastapi/typer/pull/1012) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump pypa/gh-action-pypi-publish from 1.10.1 to 1.10.3. PR
[#1009](https://redirect.github.com/fastapi/typer/pull/1009) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#1001](https://redirect.github.com/fastapi/typer/pull/1001) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- 👷 Update Deploy docs CI to use uv. PR
[#1021](https://redirect.github.com/fastapi/typer/pull/1021) by
[@tiangolo](https://redirect.github.com/tiangolo).
- 👷 Fix smokeshow, checkout files on CI. PR
[#1020](https://redirect.github.com/fastapi/typer/pull/1020) by
[@tiangolo](https://redirect.github.com/tiangolo).
- 👷 Use uv in CI. PR
[#1019](https://redirect.github.com/fastapi/typer/pull/1019) by
[@tiangolo](https://redirect.github.com/tiangolo).
- 👷 Update `labeler.yml`. PR
[#1014](https://redirect.github.com/fastapi/typer/pull/1014) by
[@tiangolo](https://redirect.github.com/tiangolo).
- 👷 Update worfkow deploy-docs-notify URL. PR
[#1011](https://redirect.github.com/fastapi/typer/pull/1011) by
[@tiangolo](https://redirect.github.com/tiangolo).
- 👷 Upgrade Cloudflare GitHub Action. PR
[#1010](https://redirect.github.com/fastapi/typer/pull/1010) by
[@tiangolo](https://redirect.github.com/tiangolo).
- ⬆ Bump mkdocs-macros-plugin from 1.0.5 to 1.2.0. PR
[#992](https://redirect.github.com/fastapi/typer/pull/992) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump ruff from 0.6.4 to 0.6.5. PR
[#991](https://redirect.github.com/fastapi/typer/pull/991) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump mkdocs-material from 9.5.34 to 9.5.35. PR
[#996](https://redirect.github.com/fastapi/typer/pull/996) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#993](https://redirect.github.com/fastapi/typer/pull/993) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#982](https://redirect.github.com/fastapi/typer/pull/982) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- ⬆ Bump tiangolo/issue-manager from 0.5.0 to 0.5.1. PR
[#980](https://redirect.github.com/fastapi/typer/pull/980) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- 👷 Update `issue-manager.yml`. PR
[#978](https://redirect.github.com/fastapi/typer/pull/978) by
[@tiangolo](https://redirect.github.com/tiangolo).
- ⬆ Bump ruff from 0.6.3 to 0.6.4. PR
[#975](https://redirect.github.com/fastapi/typer/pull/975) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump mkdocs-material from 9.5.33 to 9.5.34. PR
[#963](https://redirect.github.com/fastapi/typer/pull/963) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump pypa/gh-action-pypi-publish from 1.9.0 to 1.10.1. PR
[#973](https://redirect.github.com/fastapi/typer/pull/973) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#966](https://redirect.github.com/fastapi/typer/pull/966) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- 💚 Set `include-hidden-files` to `True` when using the
`upload-artifact` GH action. PR
[#967](https://redirect.github.com/fastapi/typer/pull/967) by
[@svlandeg](https://redirect.github.com/svlandeg).
- ⬆ Bump ruff from 0.6.1 to 0.6.3. PR
[#961](https://redirect.github.com/fastapi/typer/pull/961) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#689](https://redirect.github.com/fastapi/typer/pull/689) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- ⬆ Bump ruff from 0.2.0 to 0.6.1. PR
[#938](https://redirect.github.com/fastapi/typer/pull/938) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- 👷 Update `latest-changes` GitHub Action. PR
[#955](https://redirect.github.com/fastapi/typer/pull/955) by
[@tiangolo](https://redirect.github.com/tiangolo).
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/openapi-generators/openapi-python-client).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
pdm.lock | 14 +++++++-------
pyproject.toml | 2 +-
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/pdm.lock b/pdm.lock
index 3970e7752..6aca0368e 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -5,7 +5,7 @@
groups = ["default", "dev"]
strategy = ["inherit_metadata"]
lock_version = "4.5.0"
-content_hash = "sha256:3b1d2a8edbe074a22af87e0a5174d19511c04e3ccee607161baa74a52a9177d9"
+content_hash = "sha256:b73d22dbc5f83e955263b2941d1ec9b6ef27a6487f3d274afd8e70f27e10c696"
[[metadata.targets]]
requires_python = ">=3.8.1,<4.0"
@@ -750,7 +750,7 @@ files = [
[[package]]
name = "rich"
-version = "13.9.2"
+version = "13.9.4"
requires_python = ">=3.8.0"
summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
groups = ["default"]
@@ -760,8 +760,8 @@ dependencies = [
"typing-extensions<5.0,>=4.0.0; python_version < \"3.11\"",
]
files = [
- {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"},
- {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"},
+ {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"},
+ {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"},
]
[[package]]
@@ -949,7 +949,7 @@ files = [
[[package]]
name = "typer"
-version = "0.12.5"
+version = "0.13.0"
requires_python = ">=3.7"
summary = "Typer, build great CLIs. Easy to code. Based on Python type hints."
groups = ["default"]
@@ -960,8 +960,8 @@ dependencies = [
"typing-extensions>=3.7.4.3",
]
files = [
- {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"},
- {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"},
+ {file = "typer-0.13.0-py3-none-any.whl", hash = "sha256:d85fe0b777b2517cc99c8055ed735452f2659cd45e451507c76f48ce5c1d00e2"},
+ {file = "typer-0.13.0.tar.gz", hash = "sha256:f1c7198347939361eec90139ffa0fd8b3df3a2259d5852a0f7400e476d95985c"},
]
[[package]]
diff --git a/pyproject.toml b/pyproject.toml
index f7fd9ff9b..68d7f18d3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -6,7 +6,7 @@ license = { text = "MIT" }
requires-python = ">=3.8.1,<4.0"
dependencies = [
"jinja2>=3.0.0,<4.0.0",
- "typer>0.6,<0.13",
+ "typer>0.6,<0.14",
"colorama>=0.4.3; sys_platform == \"win32\"",
"shellingham>=1.3.2,<2.0.0",
"pydantic>=2.1.1,<3.0.0",
From 46dcdc59ca7509702b42b07b4e6764962458127e Mon Sep 17 00:00:00 2001
From: Dylan Anthony <43723790+dbanty@users.noreply.github.com>
Date: Fri, 22 Nov 2024 18:54:46 -0700
Subject: [PATCH 03/18] Remove Python 3.8 support (#1143)
Now that 3.8 is EoL, we can finally update to use 3.9's generic syntax!
---------
Co-authored-by: Dylan Anthony
---
.changeset/drop_support_for_python_38.md | 8 ++
.../type_is_now_a_reserved_field_name.md | 8 ++
.github/workflows/checks.yml | 4 +-
CONTRIBUTING.md | 2 +-
.../my_test_api_client/api/__init__.py | 28 ++---
.../api/bodies/json_like.py | 8 +-
.../api/bodies/post_bodies_multiple.py | 8 +-
.../my_test_api_client/api/bodies/refs.py | 8 +-
.../api/config/content_type_override.py | 8 +-
.../api/default/get_common_parameters.py | 8 +-
.../api/default/get_models_allof.py | 6 +-
.../get_models_oneof_with_required_const.py | 6 +-
.../api/default/post_common_parameters.py | 8 +-
.../api/default/reserved_parameters.py | 8 +-
.../defaults/defaults_tests_defaults_post.py | 26 ++--
.../enums/bool_enum_tests_bool_enum_post.py | 8 +-
.../api/enums/int_enum_tests_int_enum_post.py | 8 +-
.../api/location/get_location_header_types.py | 8 +-
.../get_location_query_optionality.py | 8 +-
.../api/naming/hyphen_in_path.py | 6 +-
.../api/naming/mixed_case.py | 8 +-
...st_naming_property_conflict_with_import.py | 8 +-
.../get_parameter_references_path_param.py | 10 +-
...lete_common_parameters_overriding_param.py | 8 +-
.../get_common_parameters_overriding_param.py | 8 +-
.../get_same_name_multiple_locations_param.py | 10 +-
.../parameters/multiple_path_parameters.py | 6 +-
..._responses_unions_simple_before_complex.py | 6 +-
.../api/responses/text_response.py | 6 +-
.../api/tag1/get_tag_with_number.py | 6 +-
.../api/tests/callback_test.py | 8 +-
.../api/tests/description_with_backslash.py | 6 +-
.../api/tests/get_basic_list_of_booleans.py | 28 ++---
.../api/tests/get_basic_list_of_floats.py | 28 ++---
.../api/tests/get_basic_list_of_integers.py | 28 ++---
.../api/tests/get_basic_list_of_strings.py | 28 ++---
.../api/tests/get_user_list.py | 82 ++++++-------
.../tests/json_body_tests_json_body_post.py | 8 +-
.../no_response_tests_no_response_get.py | 6 +-
.../octet_stream_tests_octet_stream_get.py | 6 +-
.../octet_stream_tests_octet_stream_post.py | 8 +-
.../api/tests/post_form_data.py | 8 +-
.../api/tests/post_form_data_inline.py | 8 +-
.../api/tests/post_tests_json_body_string.py | 8 +-
.../api/tests/test_inline_objects.py | 8 +-
..._with_cookie_auth_token_with_cookie_get.py | 6 +-
...d_content_tests_unsupported_content_get.py | 6 +-
.../tests/upload_file_tests_upload_post.py | 8 +-
...upload_multiple_files_tests_upload_post.py | 26 ++--
.../my_test_api_client/api/true_/false_.py | 8 +-
.../my_test_api_client/client.py | 22 ++--
.../models/a_discriminated_union_type_1.py | 12 +-
.../models/a_discriminated_union_type_2.py | 12 +-
.../my_test_api_client/models/a_form_data.py | 12 +-
.../my_test_api_client/models/a_model.py | 28 ++---
...roperties_reference_that_are_not_object.py | 116 +++++++++---------
.../all_of_has_properties_but_no_type.py | 26 ++--
.../models/all_of_sub_model.py | 26 ++--
...h_a_circular_ref_in_items_object_a_item.py | 18 +--
...ems_object_additional_properties_a_item.py | 16 +--
...ems_object_additional_properties_b_item.py | 16 +--
...h_a_circular_ref_in_items_object_b_item.py | 18 +--
...items_object_additional_properties_item.py | 16 +--
...th_a_recursive_ref_in_items_object_item.py | 18 +--
.../models/another_all_of_sub_model.py | 38 +++---
.../body_upload_file_tests_upload_post.py | 48 ++++----
...e_tests_upload_post_additional_property.py | 12 +-
..._tests_upload_post_some_nullable_object.py | 12 +-
...load_file_tests_upload_post_some_object.py | 12 +-
..._tests_upload_post_some_optional_object.py | 12 +-
.../my_test_api_client/models/extended.py | 32 ++---
.../models/free_form_model.py | 12 +-
.../models/get_models_allof_response_200.py | 18 +--
...with_required_const_response_200_type_0.py | 28 ++---
...with_required_const_response_200_type_1.py | 28 ++---
.../models/http_validation_error.py | 14 +--
.../my_test_api_client/models/import_.py | 12 +-
.../models/json_like_body.py | 12 +-
.../models/mixed_case_response_200.py | 12 +-
.../models/model_from_all_of.py | 38 +++---
.../my_test_api_client/models/model_name.py | 12 +-
.../models/model_reference_with_periods.py | 12 +-
...odel_with_additional_properties_inlined.py | 12 +-
..._properties_inlined_additional_property.py | 12 +-
.../model_with_additional_properties_refed.py | 12 +-
.../models/model_with_any_json_properties.py | 24 ++--
...n_properties_additional_property_type_0.py | 12 +-
.../model_with_backslash_in_description.py | 12 +-
.../models/model_with_circular_ref_a.py | 14 +--
.../models/model_with_circular_ref_b.py | 14 +--
...circular_ref_in_additional_properties_a.py | 12 +-
...circular_ref_in_additional_properties_b.py | 12 +-
.../models/model_with_date_time_property.py | 12 +-
.../models/model_with_discriminated_union.py | 14 +--
.../models/model_with_merged_properties.py | 12 +-
.../models/model_with_no_properties.py | 8 +-
...el_with_primitive_additional_properties.py | 14 +--
...ive_additional_properties_a_date_holder.py | 12 +-
.../models/model_with_property_ref.py | 14 +--
.../models/model_with_recursive_ref.py | 14 +--
..._recursive_ref_in_additional_properties.py | 12 +-
.../models/model_with_union_property.py | 8 +-
.../model_with_union_property_inlined.py | 10 +-
...ith_union_property_inlined_fruit_type_0.py | 12 +-
...ith_union_property_inlined_fruit_type_1.py | 12 +-
.../my_test_api_client/models/none.py | 12 +-
.../models/post_bodies_multiple_data_body.py | 12 +-
.../models/post_bodies_multiple_files_body.py | 16 +--
.../models/post_bodies_multiple_json_body.py | 12 +-
.../models/post_form_data_inline_body.py | 12 +-
...ming_property_conflict_with_import_body.py | 12 +-
...perty_conflict_with_import_response_200.py | 12 +-
...ions_simple_before_complex_response_200.py | 14 +--
...ple_before_complex_response_200a_type_1.py | 12 +-
.../models/test_inline_objects_body.py | 8 +-
.../test_inline_objects_response_200.py | 8 +-
.../models/validation_error.py | 26 ++--
.../golden-record/my_test_api_client/types.py | 5 +-
end_to_end_tests/golden-record/pyproject.toml | 2 +-
.../enums/bool_enum_tests_bool_enum_post.py | 8 +-
.../api/enums/int_enum_tests_int_enum_post.py | 8 +-
.../api/tests/get_user_list.py | 84 ++++++-------
.../api/tests/post_user_list.py | 28 ++---
.../my_enum_api_client/client.py | 22 ++--
.../my_enum_api_client/models/a_model.py | 14 +--
.../models/an_all_of_enum.py | 4 +-
.../my_enum_api_client/models/an_enum.py | 4 +-
.../models/an_enum_with_null.py | 4 +-
.../my_enum_api_client/models/an_int_enum.py | 4 +-
.../models/different_enum.py | 4 +-
.../models/get_user_list_int_enum_header.py | 4 +-
.../get_user_list_string_enum_header.py | 4 +-
.../models/post_user_list_body.py | 54 ++++----
.../my_enum_api_client/types.py | 5 +-
.../pyproject.toml | 2 +-
.../metadata_snapshots/pdm.pyproject.toml | 2 +-
.../metadata_snapshots/poetry.pyproject.toml | 2 +-
end_to_end_tests/metadata_snapshots/setup.py | 2 +-
.../test-3-1-golden-record/pyproject.toml | 2 +-
.../api/const/post_const_path.py | 10 +-
.../api/prefix_items/post_prefix_items.py | 8 +-
.../test_3_1_features_client/client.py | 22 ++--
.../models/post_const_path_body.py | 12 +-
.../models/post_prefix_items_body.py | 24 ++--
.../test_3_1_features_client/types.py | 5 +-
.../test_custom_templates/api_init.py.jinja | 3 +-
end_to_end_tests/test_end_to_end.py | 18 +--
.../api/body/post_body_multipart.py | 8 +-
.../api/parameters/post_parameters_header.py | 8 +-
integration-tests/integration_tests/client.py | 22 ++--
.../models/post_body_multipart_body.py | 16 +--
.../post_body_multipart_response_200.py | 12 +-
.../post_parameters_header_response_200.py | 12 +-
.../integration_tests/models/problem.py | 12 +-
.../integration_tests/models/public_error.py | 42 +++----
integration-tests/integration_tests/types.py | 5 +-
openapi_python_client/__init__.py | 13 +-
openapi_python_client/cli.py | 3 +-
openapi_python_client/config.py | 14 +--
openapi_python_client/parser/bodies.py | 10 +-
openapi_python_client/parser/openapi.py | 61 ++++-----
.../parser/properties/__init__.py | 2 +-
.../parser/properties/enum_property.py | 4 +-
.../parser/properties/list_property.py | 8 +-
.../properties/literal_enum_property.py | 4 +-
.../parser/properties/model_property.py | 5 +-
.../parser/properties/protocol.py | 2 +-
.../parser/properties/schemas.py | 22 ++--
openapi_python_client/parser/responses.py | 4 +-
.../openapi_schema_pydantic/callback.py | 4 +-
.../openapi_schema_pydantic/components.py | 20 +--
.../openapi_schema_pydantic/discriminator.py | 4 +-
.../openapi_schema_pydantic/encoding.py | 4 +-
.../schema/openapi_schema_pydantic/link.py | 4 +-
.../openapi_schema_pydantic/media_type.py | 6 +-
.../openapi_schema_pydantic/oauth_flow.py | 4 +-
.../openapi_schema_pydantic/open_api.py | 8 +-
.../openapi_schema_pydantic/operation.py | 12 +-
.../openapi_schema_pydantic/parameter.py | 6 +-
.../openapi_schema_pydantic/path_item.py | 6 +-
.../schema/openapi_schema_pydantic/paths.py | 4 +-
.../openapi_schema_pydantic/request_body.py | 4 +-
.../openapi_schema_pydantic/response.py | 8 +-
.../openapi_schema_pydantic/responses.py | 4 +-
.../schema/openapi_schema_pydantic/schema.py | 18 +--
.../security_requirement.py | 4 +-
.../schema/openapi_schema_pydantic/server.py | 4 +-
.../server_variable.py | 4 +-
.../templates/client.py.jinja | 12 +-
.../templates/endpoint_macros.py.jinja | 4 +-
.../templates/endpoint_module.py.jinja | 6 +-
.../templates/literal_enum.py.jinja | 4 +-
.../templates/model.py.jinja | 19 ++-
.../property_templates/enum_property.py.jinja | 2 +-
.../property_templates/list_property.py.jinja | 2 +-
.../literal_enum_property.py.jinja | 2 +-
.../templates/pyproject.toml.jinja | 4 +-
.../templates/setup.py.jinja | 2 +-
.../templates/types.py.jinja | 6 +-
openapi_python_client/utils.py | 1 -
pdm.lock | 16 +--
pyproject.toml | 3 +-
.../test_properties/test_enum_property.py | 4 +-
.../test_parser/test_properties/test_init.py | 21 ++--
.../test_properties/test_model_property.py | 9 +-
tests/test_utils.py | 2 +-
206 files changed, 1330 insertions(+), 1322 deletions(-)
create mode 100644 .changeset/drop_support_for_python_38.md
create mode 100644 .changeset/type_is_now_a_reserved_field_name.md
diff --git a/.changeset/drop_support_for_python_38.md b/.changeset/drop_support_for_python_38.md
new file mode 100644
index 000000000..ed9060c5c
--- /dev/null
+++ b/.changeset/drop_support_for_python_38.md
@@ -0,0 +1,8 @@
+---
+default: major
+---
+
+# Drop support for Python 3.8
+
+Python 3.8 is no longer supported. "New" 3.9 syntax, like generics on builtin collections, is used both in the generator
+and the generated code.
diff --git a/.changeset/type_is_now_a_reserved_field_name.md b/.changeset/type_is_now_a_reserved_field_name.md
new file mode 100644
index 000000000..f804f0f51
--- /dev/null
+++ b/.changeset/type_is_now_a_reserved_field_name.md
@@ -0,0 +1,8 @@
+---
+default: major
+---
+
+# `type` is now a reserved field name
+
+Because `type` is used in type annotations now, it is no longer a valid field name. Fields which were previously named
+`type` will be renamed to `type_`.
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
index 34543fdf2..055ecd17f 100644
--- a/.github/workflows/checks.yml
+++ b/.github/workflows/checks.yml
@@ -11,7 +11,7 @@ jobs:
test:
strategy:
matrix:
- python: [ "3.8", "3.9", "3.10", "3.11", "3.12", "3.13" ]
+ python: [ "3.9", "3.10", "3.11", "3.12", "3.13" ]
os: [ ubuntu-latest, macos-latest, windows-latest ]
runs-on: ${{ matrix.os }}
steps:
@@ -131,7 +131,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5.3.0
with:
- python-version: "3.8"
+ python-version: "3.9"
- name: Get Python Version
id: get_python_version
run: echo "python_version=$(python --version)" >> $GITHUB_OUTPUT
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 52b67100a..194f26dcc 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -41,7 +41,7 @@ To request a feature:
### Setting up a Dev Environment
1. Make sure you have [PDM](https://pdm-project.org) installed and up to date.
-2. Make sure you have a supported Python version (e.g. 3.8) installed.
+2. Make sure you have a supported Python version (e.g. 3.13) installed.
3. Use `pdm install` in the project directory to create a virtual environment with the relevant dependencies.
### Writing tests
diff --git a/end_to_end_tests/custom-templates-golden-record/my_test_api_client/api/__init__.py b/end_to_end_tests/custom-templates-golden-record/my_test_api_client/api/__init__.py
index 79a699a1e..69973bee2 100644
--- a/end_to_end_tests/custom-templates-golden-record/my_test_api_client/api/__init__.py
+++ b/end_to_end_tests/custom-templates-golden-record/my_test_api_client/api/__init__.py
@@ -1,7 +1,5 @@
"""Contains methods for accessing the API"""
-from typing import Type
-
from .bodies import BodiesEndpoints
from .config import ConfigEndpoints
from .default import DefaultEndpoints
@@ -19,53 +17,53 @@
class MyTestApiClientApi:
@classmethod
- def bodies(cls) -> Type[BodiesEndpoints]:
+ def bodies(cls) -> type[BodiesEndpoints]:
return BodiesEndpoints
@classmethod
- def tests(cls) -> Type[TestsEndpoints]:
+ def tests(cls) -> type[TestsEndpoints]:
return TestsEndpoints
@classmethod
- def defaults(cls) -> Type[DefaultsEndpoints]:
+ def defaults(cls) -> type[DefaultsEndpoints]:
return DefaultsEndpoints
@classmethod
- def enums(cls) -> Type[EnumsEndpoints]:
+ def enums(cls) -> type[EnumsEndpoints]:
return EnumsEndpoints
@classmethod
- def responses(cls) -> Type[ResponsesEndpoints]:
+ def responses(cls) -> type[ResponsesEndpoints]:
return ResponsesEndpoints
@classmethod
- def default(cls) -> Type[DefaultEndpoints]:
+ def default(cls) -> type[DefaultEndpoints]:
return DefaultEndpoints
@classmethod
- def parameters(cls) -> Type[ParametersEndpoints]:
+ def parameters(cls) -> type[ParametersEndpoints]:
return ParametersEndpoints
@classmethod
- def tag1(cls) -> Type[Tag1Endpoints]:
+ def tag1(cls) -> type[Tag1Endpoints]:
return Tag1Endpoints
@classmethod
- def location(cls) -> Type[LocationEndpoints]:
+ def location(cls) -> type[LocationEndpoints]:
return LocationEndpoints
@classmethod
- def true_(cls) -> Type[True_Endpoints]:
+ def true_(cls) -> type[True_Endpoints]:
return True_Endpoints
@classmethod
- def naming(cls) -> Type[NamingEndpoints]:
+ def naming(cls) -> type[NamingEndpoints]:
return NamingEndpoints
@classmethod
- def parameter_references(cls) -> Type[ParameterReferencesEndpoints]:
+ def parameter_references(cls) -> type[ParameterReferencesEndpoints]:
return ParameterReferencesEndpoints
@classmethod
- def config(cls) -> Type[ConfigEndpoints]:
+ def config(cls) -> type[ConfigEndpoints]:
return ConfigEndpoints
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/bodies/json_like.py b/end_to_end_tests/golden-record/my_test_api_client/api/bodies/json_like.py
index 646279c98..626bacfa6 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/bodies/json_like.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/bodies/json_like.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -12,10 +12,10 @@
def _get_kwargs(
*,
body: JsonLikeBody,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/bodies/json-like",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/bodies/post_bodies_multiple.py b/end_to_end_tests/golden-record/my_test_api_client/api/bodies/post_bodies_multiple.py
index 136cd3b5b..84ec8eee0 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/bodies/post_bodies_multiple.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/bodies/post_bodies_multiple.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -19,10 +19,10 @@ def _get_kwargs(
PostBodiesMultipleDataBody,
PostBodiesMultipleFilesBody,
],
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/bodies/multiple",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/bodies/refs.py b/end_to_end_tests/golden-record/my_test_api_client/api/bodies/refs.py
index 20eb25160..a79cf178a 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/bodies/refs.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/bodies/refs.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -12,10 +12,10 @@
def _get_kwargs(
*,
body: AModel,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/bodies/refs",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/config/content_type_override.py b/end_to_end_tests/golden-record/my_test_api_client/api/config/content_type_override.py
index 29d4ed7c3..2bd74aac4 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/config/content_type_override.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/config/content_type_override.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union, cast
+from typing import Any, Optional, Union, cast
import httpx
@@ -11,10 +11,10 @@
def _get_kwargs(
*,
body: str,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/config/content-type-override",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/default/get_common_parameters.py b/end_to_end_tests/golden-record/my_test_api_client/api/default/get_common_parameters.py
index 7bf48a0f8..7de222f55 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/default/get_common_parameters.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/default/get_common_parameters.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -11,14 +11,14 @@
def _get_kwargs(
*,
common: Union[Unset, str] = UNSET,
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
params["common"] = common
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/common_parameters",
"params": params,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/default/get_models_allof.py b/end_to_end_tests/golden-record/my_test_api_client/api/default/get_models_allof.py
index 1d2fa73a8..9d837acd6 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/default/get_models_allof.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/default/get_models_allof.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -9,8 +9,8 @@
from ...types import Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/models/allof",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/default/get_models_oneof_with_required_const.py b/end_to_end_tests/golden-record/my_test_api_client/api/default/get_models_oneof_with_required_const.py
index 85be98c28..85f68fb7c 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/default/get_models_oneof_with_required_const.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/default/get_models_oneof_with_required_const.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -14,8 +14,8 @@
from ...types import Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/models/oneof-with-required-const",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/default/post_common_parameters.py b/end_to_end_tests/golden-record/my_test_api_client/api/default/post_common_parameters.py
index 8fc836ad3..5bd941c69 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/default/post_common_parameters.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/default/post_common_parameters.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -11,14 +11,14 @@
def _get_kwargs(
*,
common: Union[Unset, str] = UNSET,
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
params["common"] = common
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/common_parameters",
"params": params,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/default/reserved_parameters.py b/end_to_end_tests/golden-record/my_test_api_client/api/default/reserved_parameters.py
index ec2f3fc3c..fe7adf04c 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/default/reserved_parameters.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/default/reserved_parameters.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -12,8 +12,8 @@ def _get_kwargs(
*,
client_query: str,
url_query: str,
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
params["client"] = client_query
@@ -21,7 +21,7 @@ def _get_kwargs(
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/naming/reserved-parameters",
"params": params,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/defaults/defaults_tests_defaults_post.py b/end_to_end_tests/golden-record/my_test_api_client/api/defaults/defaults_tests_defaults_post.py
index 12ac54947..ffc9b535e 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/defaults/defaults_tests_defaults_post.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/defaults/defaults_tests_defaults_post.py
@@ -1,6 +1,6 @@
import datetime
from http import HTTPStatus
-from typing import Any, Dict, List, Optional, Union
+from typing import Any, Optional, Union
import httpx
from dateutil.parser import isoparse
@@ -22,14 +22,14 @@ def _get_kwargs(
float_with_int: float = 3.0,
int_prop: int = 7,
boolean_prop: bool = False,
- list_prop: List[AnEnum],
+ list_prop: list[AnEnum],
union_prop: Union[float, str] = "not a float",
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
enum_prop: AnEnum,
model_prop: "ModelWithUnionProperty",
required_model_prop: "ModelWithUnionProperty",
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
params["string_prop"] = string_prop
@@ -77,7 +77,7 @@ def _get_kwargs(
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/defaults",
"params": params,
@@ -123,7 +123,7 @@ def sync_detailed(
float_with_int: float = 3.0,
int_prop: int = 7,
boolean_prop: bool = False,
- list_prop: List[AnEnum],
+ list_prop: list[AnEnum],
union_prop: Union[float, str] = "not a float",
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
enum_prop: AnEnum,
@@ -140,7 +140,7 @@ def sync_detailed(
float_with_int (float): Default: 3.0.
int_prop (int): Default: 7.
boolean_prop (bool): Default: False.
- list_prop (List[AnEnum]):
+ list_prop (list[AnEnum]):
union_prop (Union[float, str]): Default: 'not a float'.
union_prop_with_ref (Union[AnEnum, Unset, float]): Default: 0.6.
enum_prop (AnEnum): For testing Enums in all the ways they can be used
@@ -188,7 +188,7 @@ def sync(
float_with_int: float = 3.0,
int_prop: int = 7,
boolean_prop: bool = False,
- list_prop: List[AnEnum],
+ list_prop: list[AnEnum],
union_prop: Union[float, str] = "not a float",
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
enum_prop: AnEnum,
@@ -205,7 +205,7 @@ def sync(
float_with_int (float): Default: 3.0.
int_prop (int): Default: 7.
boolean_prop (bool): Default: False.
- list_prop (List[AnEnum]):
+ list_prop (list[AnEnum]):
union_prop (Union[float, str]): Default: 'not a float'.
union_prop_with_ref (Union[AnEnum, Unset, float]): Default: 0.6.
enum_prop (AnEnum): For testing Enums in all the ways they can be used
@@ -248,7 +248,7 @@ async def asyncio_detailed(
float_with_int: float = 3.0,
int_prop: int = 7,
boolean_prop: bool = False,
- list_prop: List[AnEnum],
+ list_prop: list[AnEnum],
union_prop: Union[float, str] = "not a float",
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
enum_prop: AnEnum,
@@ -265,7 +265,7 @@ async def asyncio_detailed(
float_with_int (float): Default: 3.0.
int_prop (int): Default: 7.
boolean_prop (bool): Default: False.
- list_prop (List[AnEnum]):
+ list_prop (list[AnEnum]):
union_prop (Union[float, str]): Default: 'not a float'.
union_prop_with_ref (Union[AnEnum, Unset, float]): Default: 0.6.
enum_prop (AnEnum): For testing Enums in all the ways they can be used
@@ -311,7 +311,7 @@ async def asyncio(
float_with_int: float = 3.0,
int_prop: int = 7,
boolean_prop: bool = False,
- list_prop: List[AnEnum],
+ list_prop: list[AnEnum],
union_prop: Union[float, str] = "not a float",
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
enum_prop: AnEnum,
@@ -328,7 +328,7 @@ async def asyncio(
float_with_int (float): Default: 3.0.
int_prop (int): Default: 7.
boolean_prop (bool): Default: False.
- list_prop (List[AnEnum]):
+ list_prop (list[AnEnum]):
union_prop (Union[float, str]): Default: 'not a float'.
union_prop_with_ref (Union[AnEnum, Unset, float]): Default: 0.6.
enum_prop (AnEnum): For testing Enums in all the ways they can be used
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/enums/bool_enum_tests_bool_enum_post.py b/end_to_end_tests/golden-record/my_test_api_client/api/enums/bool_enum_tests_bool_enum_post.py
index 851cdf385..52385855c 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/enums/bool_enum_tests_bool_enum_post.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/enums/bool_enum_tests_bool_enum_post.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -11,14 +11,14 @@
def _get_kwargs(
*,
bool_enum: bool,
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
params["bool_enum"] = bool_enum
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/enum/bool",
"params": params,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/enums/int_enum_tests_int_enum_post.py b/end_to_end_tests/golden-record/my_test_api_client/api/enums/int_enum_tests_int_enum_post.py
index f7c403771..26c3729fe 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/enums/int_enum_tests_int_enum_post.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/enums/int_enum_tests_int_enum_post.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -12,15 +12,15 @@
def _get_kwargs(
*,
int_enum: AnIntEnum,
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
json_int_enum = int_enum.value
params["int_enum"] = json_int_enum
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/enum/int",
"params": params,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_header_types.py b/end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_header_types.py
index 140bb3780..ad9428a72 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_header_types.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_header_types.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -18,8 +18,8 @@ def _get_kwargs(
integer_header: Union[Unset, int] = UNSET,
int_enum_header: Union[Unset, GetLocationHeaderTypesIntEnumHeader] = UNSET,
string_enum_header: Union[Unset, GetLocationHeaderTypesStringEnumHeader] = UNSET,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
if not isinstance(boolean_header, Unset):
headers["Boolean-Header"] = "true" if boolean_header else "false"
@@ -38,7 +38,7 @@ def _get_kwargs(
if not isinstance(string_enum_header, Unset):
headers["String-Enum-Header"] = str(string_enum_header)
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/location/header/types",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_query_optionality.py b/end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_query_optionality.py
index fcbc8213a..e28e37a36 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_query_optionality.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_query_optionality.py
@@ -1,6 +1,6 @@
import datetime
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -15,8 +15,8 @@ def _get_kwargs(
null_required: Union[None, datetime.datetime],
null_not_required: Union[None, Unset, datetime.datetime] = UNSET,
not_null_not_required: Union[Unset, datetime.datetime] = UNSET,
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
json_not_null_required = not_null_required.isoformat()
params["not_null_required"] = json_not_null_required
@@ -44,7 +44,7 @@ def _get_kwargs(
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/location/query/optionality",
"params": params,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/naming/hyphen_in_path.py b/end_to_end_tests/golden-record/my_test_api_client/api/naming/hyphen_in_path.py
index a94062b1b..a0caba2d6 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/naming/hyphen_in_path.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/naming/hyphen_in_path.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -10,8 +10,8 @@
def _get_kwargs(
hyphen_in_path: str,
-) -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+) -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": f"/naming/{hyphen_in_path}",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/naming/mixed_case.py b/end_to_end_tests/golden-record/my_test_api_client/api/naming/mixed_case.py
index ece16e492..7df2d318f 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/naming/mixed_case.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/naming/mixed_case.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -13,8 +13,8 @@ def _get_kwargs(
*,
mixed_case: str,
mixedCase: str,
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
params["mixed_case"] = mixed_case
@@ -22,7 +22,7 @@ def _get_kwargs(
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/naming/mixed-case",
"params": params,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/naming/post_naming_property_conflict_with_import.py b/end_to_end_tests/golden-record/my_test_api_client/api/naming/post_naming_property_conflict_with_import.py
index 083bdd12d..3bb8b698b 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/naming/post_naming_property_conflict_with_import.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/naming/post_naming_property_conflict_with_import.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -15,10 +15,10 @@
def _get_kwargs(
*,
body: PostNamingPropertyConflictWithImportBody,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/naming/property-conflict-with-import",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/parameter_references/get_parameter_references_path_param.py b/end_to_end_tests/golden-record/my_test_api_client/api/parameter_references/get_parameter_references_path_param.py
index 3d8c6ad36..e7a8e2712 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/parameter_references/get_parameter_references_path_param.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/parameter_references/get_parameter_references_path_param.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -15,8 +15,8 @@ def _get_kwargs(
integer_param: Union[Unset, int] = 0,
header_param: Union[None, Unset, str] = UNSET,
cookie_param: Union[Unset, str] = UNSET,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
if not isinstance(header_param, Unset):
headers["header param"] = header_param
@@ -24,7 +24,7 @@ def _get_kwargs(
if cookie_param is not UNSET:
cookies["cookie param"] = cookie_param
- params: Dict[str, Any] = {}
+ params: dict[str, Any] = {}
params["string param"] = string_param
@@ -32,7 +32,7 @@ def _get_kwargs(
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": f"/parameter-references/{path_param}",
"params": params,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/parameters/delete_common_parameters_overriding_param.py b/end_to_end_tests/golden-record/my_test_api_client/api/parameters/delete_common_parameters_overriding_param.py
index b842b8834..704996107 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/parameters/delete_common_parameters_overriding_param.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/parameters/delete_common_parameters_overriding_param.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -12,14 +12,14 @@ def _get_kwargs(
param_path: str,
*,
param_query: Union[Unset, str] = UNSET,
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
params["param"] = param_query
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "delete",
"url": f"/common_parameters_overriding/{param_path}",
"params": params,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/parameters/get_common_parameters_overriding_param.py b/end_to_end_tests/golden-record/my_test_api_client/api/parameters/get_common_parameters_overriding_param.py
index 5dc4aa7ec..b6efbba9b 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/parameters/get_common_parameters_overriding_param.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/parameters/get_common_parameters_overriding_param.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -12,14 +12,14 @@ def _get_kwargs(
param_path: str,
*,
param_query: str = "overridden_in_GET",
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
params["param"] = param_query
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": f"/common_parameters_overriding/{param_path}",
"params": params,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/parameters/get_same_name_multiple_locations_param.py b/end_to_end_tests/golden-record/my_test_api_client/api/parameters/get_same_name_multiple_locations_param.py
index 834875ff7..6a7ed7fd5 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/parameters/get_same_name_multiple_locations_param.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/parameters/get_same_name_multiple_locations_param.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -14,8 +14,8 @@ def _get_kwargs(
param_query: Union[Unset, str] = UNSET,
param_header: Union[Unset, str] = UNSET,
param_cookie: Union[Unset, str] = UNSET,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
if not isinstance(param_header, Unset):
headers["param"] = param_header
@@ -23,13 +23,13 @@ def _get_kwargs(
if param_cookie is not UNSET:
cookies["param"] = param_cookie
- params: Dict[str, Any] = {}
+ params: dict[str, Any] = {}
params["param"] = param_query
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": f"/same-name-multiple-locations/{param_path}",
"params": params,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/parameters/multiple_path_parameters.py b/end_to_end_tests/golden-record/my_test_api_client/api/parameters/multiple_path_parameters.py
index 22f476963..44345aa26 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/parameters/multiple_path_parameters.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/parameters/multiple_path_parameters.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -13,8 +13,8 @@ def _get_kwargs(
param2: int,
param1: str,
param3: int,
-) -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+) -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": f"/multiple-path-parameters/{param4}/something/{param2}/{param1}/{param3}",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/responses/post_responses_unions_simple_before_complex.py b/end_to_end_tests/golden-record/my_test_api_client/api/responses/post_responses_unions_simple_before_complex.py
index 97bc5922a..cf0599306 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/responses/post_responses_unions_simple_before_complex.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/responses/post_responses_unions_simple_before_complex.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -11,8 +11,8 @@
from ...types import Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/responses/unions/simple_before_complex",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/responses/text_response.py b/end_to_end_tests/golden-record/my_test_api_client/api/responses/text_response.py
index cc4dd9531..057ceb2de 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/responses/text_response.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/responses/text_response.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -8,8 +8,8 @@
from ...types import Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/responses/text",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tag1/get_tag_with_number.py b/end_to_end_tests/golden-record/my_test_api_client/api/tag1/get_tag_with_number.py
index c6756b522..62631355f 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tag1/get_tag_with_number.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tag1/get_tag_with_number.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -8,8 +8,8 @@
from ...types import Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/tag_with_number",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/callback_test.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/callback_test.py
index 30ed5aa7f..0852815d2 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/callback_test.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/callback_test.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -13,10 +13,10 @@
def _get_kwargs(
*,
body: AModel,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/tests/callback",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/description_with_backslash.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/description_with_backslash.py
index 4cfc8e5a5..e7cd44f70 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/description_with_backslash.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/description_with_backslash.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -8,8 +8,8 @@
from ...types import Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/tests/description-with-backslash",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_booleans.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_booleans.py
index 53cb6598d..147eed3a7 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_booleans.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_booleans.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, List, Optional, Union, cast
+from typing import Any, Optional, Union, cast
import httpx
@@ -8,8 +8,8 @@
from ...types import Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/tests/basic_lists/booleans",
}
@@ -17,9 +17,9 @@ def _get_kwargs() -> Dict[str, Any]:
return _kwargs
-def _parse_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Optional[List[bool]]:
+def _parse_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Optional[list[bool]]:
if response.status_code == 200:
- response_200 = cast(List[bool], response.json())
+ response_200 = cast(list[bool], response.json())
return response_200
if client.raise_on_unexpected_status:
@@ -28,7 +28,7 @@ def _parse_response(*, client: Union[AuthenticatedClient, Client], response: htt
return None
-def _build_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Response[List[bool]]:
+def _build_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Response[list[bool]]:
return Response(
status_code=HTTPStatus(response.status_code),
content=response.content,
@@ -40,7 +40,7 @@ def _build_response(*, client: Union[AuthenticatedClient, Client], response: htt
def sync_detailed(
*,
client: Union[AuthenticatedClient, Client],
-) -> Response[List[bool]]:
+) -> Response[list[bool]]:
"""Get Basic List Of Booleans
Get a list of booleans
@@ -50,7 +50,7 @@ def sync_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[List[bool]]
+ Response[list[bool]]
"""
kwargs = _get_kwargs()
@@ -65,7 +65,7 @@ def sync_detailed(
def sync(
*,
client: Union[AuthenticatedClient, Client],
-) -> Optional[List[bool]]:
+) -> Optional[list[bool]]:
"""Get Basic List Of Booleans
Get a list of booleans
@@ -75,7 +75,7 @@ def sync(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- List[bool]
+ list[bool]
"""
return sync_detailed(
@@ -86,7 +86,7 @@ def sync(
async def asyncio_detailed(
*,
client: Union[AuthenticatedClient, Client],
-) -> Response[List[bool]]:
+) -> Response[list[bool]]:
"""Get Basic List Of Booleans
Get a list of booleans
@@ -96,7 +96,7 @@ async def asyncio_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[List[bool]]
+ Response[list[bool]]
"""
kwargs = _get_kwargs()
@@ -109,7 +109,7 @@ async def asyncio_detailed(
async def asyncio(
*,
client: Union[AuthenticatedClient, Client],
-) -> Optional[List[bool]]:
+) -> Optional[list[bool]]:
"""Get Basic List Of Booleans
Get a list of booleans
@@ -119,7 +119,7 @@ async def asyncio(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- List[bool]
+ list[bool]
"""
return (
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_floats.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_floats.py
index 7d1f71559..02b3abb1f 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_floats.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_floats.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, List, Optional, Union, cast
+from typing import Any, Optional, Union, cast
import httpx
@@ -8,8 +8,8 @@
from ...types import Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/tests/basic_lists/floats",
}
@@ -17,9 +17,9 @@ def _get_kwargs() -> Dict[str, Any]:
return _kwargs
-def _parse_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Optional[List[float]]:
+def _parse_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Optional[list[float]]:
if response.status_code == 200:
- response_200 = cast(List[float], response.json())
+ response_200 = cast(list[float], response.json())
return response_200
if client.raise_on_unexpected_status:
@@ -28,7 +28,7 @@ def _parse_response(*, client: Union[AuthenticatedClient, Client], response: htt
return None
-def _build_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Response[List[float]]:
+def _build_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Response[list[float]]:
return Response(
status_code=HTTPStatus(response.status_code),
content=response.content,
@@ -40,7 +40,7 @@ def _build_response(*, client: Union[AuthenticatedClient, Client], response: htt
def sync_detailed(
*,
client: Union[AuthenticatedClient, Client],
-) -> Response[List[float]]:
+) -> Response[list[float]]:
"""Get Basic List Of Floats
Get a list of floats
@@ -50,7 +50,7 @@ def sync_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[List[float]]
+ Response[list[float]]
"""
kwargs = _get_kwargs()
@@ -65,7 +65,7 @@ def sync_detailed(
def sync(
*,
client: Union[AuthenticatedClient, Client],
-) -> Optional[List[float]]:
+) -> Optional[list[float]]:
"""Get Basic List Of Floats
Get a list of floats
@@ -75,7 +75,7 @@ def sync(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- List[float]
+ list[float]
"""
return sync_detailed(
@@ -86,7 +86,7 @@ def sync(
async def asyncio_detailed(
*,
client: Union[AuthenticatedClient, Client],
-) -> Response[List[float]]:
+) -> Response[list[float]]:
"""Get Basic List Of Floats
Get a list of floats
@@ -96,7 +96,7 @@ async def asyncio_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[List[float]]
+ Response[list[float]]
"""
kwargs = _get_kwargs()
@@ -109,7 +109,7 @@ async def asyncio_detailed(
async def asyncio(
*,
client: Union[AuthenticatedClient, Client],
-) -> Optional[List[float]]:
+) -> Optional[list[float]]:
"""Get Basic List Of Floats
Get a list of floats
@@ -119,7 +119,7 @@ async def asyncio(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- List[float]
+ list[float]
"""
return (
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_integers.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_integers.py
index 14d978288..e71537363 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_integers.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_integers.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, List, Optional, Union, cast
+from typing import Any, Optional, Union, cast
import httpx
@@ -8,8 +8,8 @@
from ...types import Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/tests/basic_lists/integers",
}
@@ -17,9 +17,9 @@ def _get_kwargs() -> Dict[str, Any]:
return _kwargs
-def _parse_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Optional[List[int]]:
+def _parse_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Optional[list[int]]:
if response.status_code == 200:
- response_200 = cast(List[int], response.json())
+ response_200 = cast(list[int], response.json())
return response_200
if client.raise_on_unexpected_status:
@@ -28,7 +28,7 @@ def _parse_response(*, client: Union[AuthenticatedClient, Client], response: htt
return None
-def _build_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Response[List[int]]:
+def _build_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Response[list[int]]:
return Response(
status_code=HTTPStatus(response.status_code),
content=response.content,
@@ -40,7 +40,7 @@ def _build_response(*, client: Union[AuthenticatedClient, Client], response: htt
def sync_detailed(
*,
client: Union[AuthenticatedClient, Client],
-) -> Response[List[int]]:
+) -> Response[list[int]]:
"""Get Basic List Of Integers
Get a list of integers
@@ -50,7 +50,7 @@ def sync_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[List[int]]
+ Response[list[int]]
"""
kwargs = _get_kwargs()
@@ -65,7 +65,7 @@ def sync_detailed(
def sync(
*,
client: Union[AuthenticatedClient, Client],
-) -> Optional[List[int]]:
+) -> Optional[list[int]]:
"""Get Basic List Of Integers
Get a list of integers
@@ -75,7 +75,7 @@ def sync(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- List[int]
+ list[int]
"""
return sync_detailed(
@@ -86,7 +86,7 @@ def sync(
async def asyncio_detailed(
*,
client: Union[AuthenticatedClient, Client],
-) -> Response[List[int]]:
+) -> Response[list[int]]:
"""Get Basic List Of Integers
Get a list of integers
@@ -96,7 +96,7 @@ async def asyncio_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[List[int]]
+ Response[list[int]]
"""
kwargs = _get_kwargs()
@@ -109,7 +109,7 @@ async def asyncio_detailed(
async def asyncio(
*,
client: Union[AuthenticatedClient, Client],
-) -> Optional[List[int]]:
+) -> Optional[list[int]]:
"""Get Basic List Of Integers
Get a list of integers
@@ -119,7 +119,7 @@ async def asyncio(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- List[int]
+ list[int]
"""
return (
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_strings.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_strings.py
index 61b2bc3f5..70f153829 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_strings.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_basic_list_of_strings.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, List, Optional, Union, cast
+from typing import Any, Optional, Union, cast
import httpx
@@ -8,8 +8,8 @@
from ...types import Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/tests/basic_lists/strings",
}
@@ -17,9 +17,9 @@ def _get_kwargs() -> Dict[str, Any]:
return _kwargs
-def _parse_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Optional[List[str]]:
+def _parse_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Optional[list[str]]:
if response.status_code == 200:
- response_200 = cast(List[str], response.json())
+ response_200 = cast(list[str], response.json())
return response_200
if client.raise_on_unexpected_status:
@@ -28,7 +28,7 @@ def _parse_response(*, client: Union[AuthenticatedClient, Client], response: htt
return None
-def _build_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Response[List[str]]:
+def _build_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Response[list[str]]:
return Response(
status_code=HTTPStatus(response.status_code),
content=response.content,
@@ -40,7 +40,7 @@ def _build_response(*, client: Union[AuthenticatedClient, Client], response: htt
def sync_detailed(
*,
client: Union[AuthenticatedClient, Client],
-) -> Response[List[str]]:
+) -> Response[list[str]]:
"""Get Basic List Of Strings
Get a list of strings
@@ -50,7 +50,7 @@ def sync_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[List[str]]
+ Response[list[str]]
"""
kwargs = _get_kwargs()
@@ -65,7 +65,7 @@ def sync_detailed(
def sync(
*,
client: Union[AuthenticatedClient, Client],
-) -> Optional[List[str]]:
+) -> Optional[list[str]]:
"""Get Basic List Of Strings
Get a list of strings
@@ -75,7 +75,7 @@ def sync(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- List[str]
+ list[str]
"""
return sync_detailed(
@@ -86,7 +86,7 @@ def sync(
async def asyncio_detailed(
*,
client: Union[AuthenticatedClient, Client],
-) -> Response[List[str]]:
+) -> Response[list[str]]:
"""Get Basic List Of Strings
Get a list of strings
@@ -96,7 +96,7 @@ async def asyncio_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[List[str]]
+ Response[list[str]]
"""
kwargs = _get_kwargs()
@@ -109,7 +109,7 @@ async def asyncio_detailed(
async def asyncio(
*,
client: Union[AuthenticatedClient, Client],
-) -> Optional[List[str]]:
+) -> Optional[list[str]]:
"""Get Basic List Of Strings
Get a list of strings
@@ -119,7 +119,7 @@ async def asyncio(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- List[str]
+ list[str]
"""
return (
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_user_list.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_user_list.py
index 444657982..a708cf71d 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_user_list.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/get_user_list.py
@@ -1,6 +1,6 @@
import datetime
from http import HTTPStatus
-from typing import Any, Dict, List, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -15,12 +15,12 @@
def _get_kwargs(
*,
- an_enum_value: List[AnEnum],
- an_enum_value_with_null: List[Union[AnEnumWithNull, None]],
- an_enum_value_with_only_null: List[None],
+ an_enum_value: list[AnEnum],
+ an_enum_value_with_null: list[Union[AnEnumWithNull, None]],
+ an_enum_value_with_only_null: list[None],
some_date: Union[datetime.date, datetime.datetime],
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
json_an_enum_value = []
for an_enum_value_item_data in an_enum_value:
@@ -54,7 +54,7 @@ def _get_kwargs(
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/tests/",
"params": params,
@@ -65,7 +65,7 @@ def _get_kwargs(
def _parse_response(
*, client: Union[AuthenticatedClient, Client], response: httpx.Response
-) -> Optional[Union[HTTPValidationError, List["AModel"]]]:
+) -> Optional[Union[HTTPValidationError, list["AModel"]]]:
if response.status_code == 200:
response_200 = []
_response_200 = response.json()
@@ -91,7 +91,7 @@ def _parse_response(
def _build_response(
*, client: Union[AuthenticatedClient, Client], response: httpx.Response
-) -> Response[Union[HTTPValidationError, List["AModel"]]]:
+) -> Response[Union[HTTPValidationError, list["AModel"]]]:
return Response(
status_code=HTTPStatus(response.status_code),
content=response.content,
@@ -103,19 +103,19 @@ def _build_response(
def sync_detailed(
*,
client: Union[AuthenticatedClient, Client],
- an_enum_value: List[AnEnum],
- an_enum_value_with_null: List[Union[AnEnumWithNull, None]],
- an_enum_value_with_only_null: List[None],
+ an_enum_value: list[AnEnum],
+ an_enum_value_with_null: list[Union[AnEnumWithNull, None]],
+ an_enum_value_with_only_null: list[None],
some_date: Union[datetime.date, datetime.datetime],
-) -> Response[Union[HTTPValidationError, List["AModel"]]]:
+) -> Response[Union[HTTPValidationError, list["AModel"]]]:
"""Get List
Get a list of things
Args:
- an_enum_value (List[AnEnum]):
- an_enum_value_with_null (List[Union[AnEnumWithNull, None]]):
- an_enum_value_with_only_null (List[None]):
+ an_enum_value (list[AnEnum]):
+ an_enum_value_with_null (list[Union[AnEnumWithNull, None]]):
+ an_enum_value_with_only_null (list[None]):
some_date (Union[datetime.date, datetime.datetime]):
Raises:
@@ -123,7 +123,7 @@ def sync_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[Union[HTTPValidationError, List['AModel']]]
+ Response[Union[HTTPValidationError, list['AModel']]]
"""
kwargs = _get_kwargs(
@@ -143,19 +143,19 @@ def sync_detailed(
def sync(
*,
client: Union[AuthenticatedClient, Client],
- an_enum_value: List[AnEnum],
- an_enum_value_with_null: List[Union[AnEnumWithNull, None]],
- an_enum_value_with_only_null: List[None],
+ an_enum_value: list[AnEnum],
+ an_enum_value_with_null: list[Union[AnEnumWithNull, None]],
+ an_enum_value_with_only_null: list[None],
some_date: Union[datetime.date, datetime.datetime],
-) -> Optional[Union[HTTPValidationError, List["AModel"]]]:
+) -> Optional[Union[HTTPValidationError, list["AModel"]]]:
"""Get List
Get a list of things
Args:
- an_enum_value (List[AnEnum]):
- an_enum_value_with_null (List[Union[AnEnumWithNull, None]]):
- an_enum_value_with_only_null (List[None]):
+ an_enum_value (list[AnEnum]):
+ an_enum_value_with_null (list[Union[AnEnumWithNull, None]]):
+ an_enum_value_with_only_null (list[None]):
some_date (Union[datetime.date, datetime.datetime]):
Raises:
@@ -163,7 +163,7 @@ def sync(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Union[HTTPValidationError, List['AModel']]
+ Union[HTTPValidationError, list['AModel']]
"""
return sync_detailed(
@@ -178,19 +178,19 @@ def sync(
async def asyncio_detailed(
*,
client: Union[AuthenticatedClient, Client],
- an_enum_value: List[AnEnum],
- an_enum_value_with_null: List[Union[AnEnumWithNull, None]],
- an_enum_value_with_only_null: List[None],
+ an_enum_value: list[AnEnum],
+ an_enum_value_with_null: list[Union[AnEnumWithNull, None]],
+ an_enum_value_with_only_null: list[None],
some_date: Union[datetime.date, datetime.datetime],
-) -> Response[Union[HTTPValidationError, List["AModel"]]]:
+) -> Response[Union[HTTPValidationError, list["AModel"]]]:
"""Get List
Get a list of things
Args:
- an_enum_value (List[AnEnum]):
- an_enum_value_with_null (List[Union[AnEnumWithNull, None]]):
- an_enum_value_with_only_null (List[None]):
+ an_enum_value (list[AnEnum]):
+ an_enum_value_with_null (list[Union[AnEnumWithNull, None]]):
+ an_enum_value_with_only_null (list[None]):
some_date (Union[datetime.date, datetime.datetime]):
Raises:
@@ -198,7 +198,7 @@ async def asyncio_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[Union[HTTPValidationError, List['AModel']]]
+ Response[Union[HTTPValidationError, list['AModel']]]
"""
kwargs = _get_kwargs(
@@ -216,19 +216,19 @@ async def asyncio_detailed(
async def asyncio(
*,
client: Union[AuthenticatedClient, Client],
- an_enum_value: List[AnEnum],
- an_enum_value_with_null: List[Union[AnEnumWithNull, None]],
- an_enum_value_with_only_null: List[None],
+ an_enum_value: list[AnEnum],
+ an_enum_value_with_null: list[Union[AnEnumWithNull, None]],
+ an_enum_value_with_only_null: list[None],
some_date: Union[datetime.date, datetime.datetime],
-) -> Optional[Union[HTTPValidationError, List["AModel"]]]:
+) -> Optional[Union[HTTPValidationError, list["AModel"]]]:
"""Get List
Get a list of things
Args:
- an_enum_value (List[AnEnum]):
- an_enum_value_with_null (List[Union[AnEnumWithNull, None]]):
- an_enum_value_with_only_null (List[None]):
+ an_enum_value (list[AnEnum]):
+ an_enum_value_with_null (list[Union[AnEnumWithNull, None]]):
+ an_enum_value_with_only_null (list[None]):
some_date (Union[datetime.date, datetime.datetime]):
Raises:
@@ -236,7 +236,7 @@ async def asyncio(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Union[HTTPValidationError, List['AModel']]
+ Union[HTTPValidationError, list['AModel']]
"""
return (
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/json_body_tests_json_body_post.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/json_body_tests_json_body_post.py
index b9b17aeac..f33a23dc7 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/json_body_tests_json_body_post.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/json_body_tests_json_body_post.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -13,10 +13,10 @@
def _get_kwargs(
*,
body: AModel,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/tests/json_body",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/no_response_tests_no_response_get.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/no_response_tests_no_response_get.py
index f78e06eed..586947f49 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/no_response_tests_no_response_get.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/no_response_tests_no_response_get.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -8,8 +8,8 @@
from ...types import Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/tests/no_response",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/octet_stream_tests_octet_stream_get.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/octet_stream_tests_octet_stream_get.py
index 4810d5ebc..efb0f4ae5 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/octet_stream_tests_octet_stream_get.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/octet_stream_tests_octet_stream_get.py
@@ -1,6 +1,6 @@
from http import HTTPStatus
from io import BytesIO
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -9,8 +9,8 @@
from ...types import File, Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/tests/octet_stream",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/octet_stream_tests_octet_stream_post.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/octet_stream_tests_octet_stream_post.py
index c7faeb15f..ea0cbd65a 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/octet_stream_tests_octet_stream_post.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/octet_stream_tests_octet_stream_post.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union, cast
+from typing import Any, Optional, Union, cast
import httpx
@@ -12,10 +12,10 @@
def _get_kwargs(
*,
body: File,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/tests/octet_stream",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/post_form_data.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/post_form_data.py
index a2e7232c2..ec65d0363 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/post_form_data.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/post_form_data.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -12,10 +12,10 @@
def _get_kwargs(
*,
body: AFormData,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/tests/post_form_data",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/post_form_data_inline.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/post_form_data_inline.py
index 290e6efdb..bc5ad7cc4 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/post_form_data_inline.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/post_form_data_inline.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -12,10 +12,10 @@
def _get_kwargs(
*,
body: PostFormDataInlineBody,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/tests/post_form_data_inline",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/post_tests_json_body_string.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/post_tests_json_body_string.py
index bc80281c9..ba40de26f 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/post_tests_json_body_string.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/post_tests_json_body_string.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union, cast
+from typing import Any, Optional, Union, cast
import httpx
@@ -12,10 +12,10 @@
def _get_kwargs(
*,
body: str,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/tests/json_body/string",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/test_inline_objects.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/test_inline_objects.py
index 07c16c748..287ea4a1a 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/test_inline_objects.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/test_inline_objects.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -13,10 +13,10 @@
def _get_kwargs(
*,
body: TestInlineObjectsBody,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/tests/inline_objects",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/token_with_cookie_auth_token_with_cookie_get.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/token_with_cookie_auth_token_with_cookie_get.py
index e71ee24e9..22ac00650 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/token_with_cookie_auth_token_with_cookie_get.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/token_with_cookie_auth_token_with_cookie_get.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -11,11 +11,11 @@
def _get_kwargs(
*,
my_token: str,
-) -> Dict[str, Any]:
+) -> dict[str, Any]:
cookies = {}
cookies["MyToken"] = my_token
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/auth/token_with_cookie",
"cookies": cookies,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/unsupported_content_tests_unsupported_content_get.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/unsupported_content_tests_unsupported_content_get.py
index e22ed5125..61e8434e6 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/unsupported_content_tests_unsupported_content_get.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/unsupported_content_tests_unsupported_content_get.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -8,8 +8,8 @@
from ...types import Response
-def _get_kwargs() -> Dict[str, Any]:
- _kwargs: Dict[str, Any] = {
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/tests/unsupported_content",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/upload_file_tests_upload_post.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/upload_file_tests_upload_post.py
index 88b305101..9f1864ec3 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/upload_file_tests_upload_post.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/upload_file_tests_upload_post.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -13,10 +13,10 @@
def _get_kwargs(
*,
body: BodyUploadFileTestsUploadPost,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/tests/upload",
}
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tests/upload_multiple_files_tests_upload_post.py b/end_to_end_tests/golden-record/my_test_api_client/api/tests/upload_multiple_files_tests_upload_post.py
index 098ae7a13..3f8edc817 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/tests/upload_multiple_files_tests_upload_post.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tests/upload_multiple_files_tests_upload_post.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, List, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -11,11 +11,11 @@
def _get_kwargs(
*,
- body: List[File],
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+ body: list[File],
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/tests/upload/multiple",
}
@@ -62,14 +62,14 @@ def _build_response(
def sync_detailed(
*,
client: Union[AuthenticatedClient, Client],
- body: List[File],
+ body: list[File],
) -> Response[Union[Any, HTTPValidationError]]:
"""Upload multiple files
Upload several files in the same request
Args:
- body (List[File]):
+ body (list[File]):
Raises:
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -93,14 +93,14 @@ def sync_detailed(
def sync(
*,
client: Union[AuthenticatedClient, Client],
- body: List[File],
+ body: list[File],
) -> Optional[Union[Any, HTTPValidationError]]:
"""Upload multiple files
Upload several files in the same request
Args:
- body (List[File]):
+ body (list[File]):
Raises:
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -119,14 +119,14 @@ def sync(
async def asyncio_detailed(
*,
client: Union[AuthenticatedClient, Client],
- body: List[File],
+ body: list[File],
) -> Response[Union[Any, HTTPValidationError]]:
"""Upload multiple files
Upload several files in the same request
Args:
- body (List[File]):
+ body (list[File]):
Raises:
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -148,14 +148,14 @@ async def asyncio_detailed(
async def asyncio(
*,
client: Union[AuthenticatedClient, Client],
- body: List[File],
+ body: list[File],
) -> Optional[Union[Any, HTTPValidationError]]:
"""Upload multiple files
Upload several files in the same request
Args:
- body (List[File]):
+ body (list[File]):
Raises:
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/true_/false_.py b/end_to_end_tests/golden-record/my_test_api_client/api/true_/false_.py
index 891485f62..b46550153 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/api/true_/false_.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/true_/false_.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -11,14 +11,14 @@
def _get_kwargs(
*,
import_: str,
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
params["import"] = import_
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/naming/keywords",
"params": params,
diff --git a/end_to_end_tests/golden-record/my_test_api_client/client.py b/end_to_end_tests/golden-record/my_test_api_client/client.py
index 0f6d15e84..e80446f10 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/client.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/client.py
@@ -1,5 +1,5 @@
import ssl
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
from attrs import define, evolve, field
@@ -36,16 +36,16 @@ class Client:
raise_on_unexpected_status: bool = field(default=False, kw_only=True)
_base_url: str = field(alias="base_url")
- _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
- _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
+ _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
+ _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True, alias="timeout")
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(default=True, kw_only=True, alias="verify_ssl")
_follow_redirects: bool = field(default=False, kw_only=True, alias="follow_redirects")
- _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
+ _httpx_args: dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
_client: Optional[httpx.Client] = field(default=None, init=False)
_async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
- def with_headers(self, headers: Dict[str, str]) -> "Client":
+ def with_headers(self, headers: dict[str, str]) -> "Client":
"""Get a new client matching this one with additional headers"""
if self._client is not None:
self._client.headers.update(headers)
@@ -53,7 +53,7 @@ def with_headers(self, headers: Dict[str, str]) -> "Client":
self._async_client.headers.update(headers)
return evolve(self, headers={**self._headers, **headers})
- def with_cookies(self, cookies: Dict[str, str]) -> "Client":
+ def with_cookies(self, cookies: dict[str, str]) -> "Client":
"""Get a new client matching this one with additional cookies"""
if self._client is not None:
self._client.cookies.update(cookies)
@@ -166,12 +166,12 @@ class AuthenticatedClient:
raise_on_unexpected_status: bool = field(default=False, kw_only=True)
_base_url: str = field(alias="base_url")
- _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
- _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
+ _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
+ _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True, alias="timeout")
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(default=True, kw_only=True, alias="verify_ssl")
_follow_redirects: bool = field(default=False, kw_only=True, alias="follow_redirects")
- _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
+ _httpx_args: dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
_client: Optional[httpx.Client] = field(default=None, init=False)
_async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
@@ -179,7 +179,7 @@ class AuthenticatedClient:
prefix: str = "Bearer"
auth_header_name: str = "Authorization"
- def with_headers(self, headers: Dict[str, str]) -> "AuthenticatedClient":
+ def with_headers(self, headers: dict[str, str]) -> "AuthenticatedClient":
"""Get a new client matching this one with additional headers"""
if self._client is not None:
self._client.headers.update(headers)
@@ -187,7 +187,7 @@ def with_headers(self, headers: Dict[str, str]) -> "AuthenticatedClient":
self._async_client.headers.update(headers)
return evolve(self, headers={**self._headers, **headers})
- def with_cookies(self, cookies: Dict[str, str]) -> "AuthenticatedClient":
+ def with_cookies(self, cookies: dict[str, str]) -> "AuthenticatedClient":
"""Get a new client matching this one with additional cookies"""
if self._client is not None:
self._client.cookies.update(cookies)
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/a_discriminated_union_type_1.py b/end_to_end_tests/golden-record/my_test_api_client/models/a_discriminated_union_type_1.py
index cb1184b18..efdee8d2b 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/a_discriminated_union_type_1.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/a_discriminated_union_type_1.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@ class ADiscriminatedUnionType1:
"""
model_type: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
model_type = self.model_type
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if model_type is not UNSET:
@@ -30,7 +30,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
model_type = d.pop("modelType", UNSET)
@@ -42,7 +42,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return a_discriminated_union_type_1
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/a_discriminated_union_type_2.py b/end_to_end_tests/golden-record/my_test_api_client/models/a_discriminated_union_type_2.py
index 734f3bef4..02f4870e6 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/a_discriminated_union_type_2.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/a_discriminated_union_type_2.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@ class ADiscriminatedUnionType2:
"""
model_type: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
model_type = self.model_type
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if model_type is not UNSET:
@@ -30,7 +30,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
model_type = d.pop("modelType", UNSET)
@@ -42,7 +42,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return a_discriminated_union_type_2
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/a_form_data.py b/end_to_end_tests/golden-record/my_test_api_client/models/a_form_data.py
index a4c5cd8a7..12c57c3bc 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/a_form_data.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/a_form_data.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -18,14 +18,14 @@ class AFormData:
an_required_field: str
an_optional_field: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
an_required_field = self.an_required_field
an_optional_field = self.an_optional_field
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
@@ -38,7 +38,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
an_required_field = d.pop("an_required_field")
@@ -53,7 +53,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return a_form_data
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/a_model.py b/end_to_end_tests/golden-record/my_test_api_client/models/a_model.py
index a14400c9d..5a81e6365 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/a_model.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/a_model.py
@@ -1,5 +1,5 @@
import datetime
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union, cast
+from typing import TYPE_CHECKING, Any, TypeVar, Union, cast
from uuid import UUID
from attrs import define as _attrs_define
@@ -38,7 +38,7 @@ class AModel:
nullable_model (Union['ModelWithUnionProperty', None]):
any_value (Union[Unset, Any]): Default: 'default'.
an_optional_allof_enum (Union[Unset, AnAllOfEnum]):
- nested_list_of_enums (Union[Unset, List[List[DifferentEnum]]]):
+ nested_list_of_enums (Union[Unset, list[list[DifferentEnum]]]):
a_not_required_date (Union[Unset, datetime.date]):
a_not_required_uuid (Union[Unset, UUID]):
attr_1_leading_digit (Union[Unset, str]):
@@ -66,7 +66,7 @@ class AModel:
a_nullable_uuid: Union[None, UUID] = UUID("07EF8B4D-AA09-4FFA-898D-C710796AFF41")
any_value: Union[Unset, Any] = "default"
an_optional_allof_enum: Union[Unset, AnAllOfEnum] = UNSET
- nested_list_of_enums: Union[Unset, List[List[DifferentEnum]]] = UNSET
+ nested_list_of_enums: Union[Unset, list[list[DifferentEnum]]] = UNSET
a_not_required_date: Union[Unset, datetime.date] = UNSET
a_not_required_uuid: Union[Unset, UUID] = UNSET
attr_1_leading_digit: Union[Unset, str] = UNSET
@@ -78,7 +78,7 @@ class AModel:
not_required_model: Union[Unset, "ModelWithUnionProperty"] = UNSET
not_required_nullable_model: Union["ModelWithUnionProperty", None, Unset] = UNSET
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
from ..models.free_form_model import FreeFormModel
from ..models.model_with_union_property import ModelWithUnionProperty
@@ -113,7 +113,7 @@ def to_dict(self) -> Dict[str, Any]:
required_not_nullable = self.required_not_nullable
- one_of_models: Union[Any, Dict[str, Any]]
+ one_of_models: Union[Any, dict[str, Any]]
if isinstance(self.one_of_models, FreeFormModel):
one_of_models = self.one_of_models.to_dict()
elif isinstance(self.one_of_models, ModelWithUnionProperty):
@@ -121,7 +121,7 @@ def to_dict(self) -> Dict[str, Any]:
else:
one_of_models = self.one_of_models
- nullable_one_of_models: Union[Dict[str, Any], None]
+ nullable_one_of_models: Union[None, dict[str, Any]]
if isinstance(self.nullable_one_of_models, FreeFormModel):
nullable_one_of_models = self.nullable_one_of_models.to_dict()
elif isinstance(self.nullable_one_of_models, ModelWithUnionProperty):
@@ -131,7 +131,7 @@ def to_dict(self) -> Dict[str, Any]:
model = self.model.to_dict()
- nullable_model: Union[Dict[str, Any], None]
+ nullable_model: Union[None, dict[str, Any]]
if isinstance(self.nullable_model, ModelWithUnionProperty):
nullable_model = self.nullable_model.to_dict()
else:
@@ -143,7 +143,7 @@ def to_dict(self) -> Dict[str, Any]:
if not isinstance(self.an_optional_allof_enum, Unset):
an_optional_allof_enum = self.an_optional_allof_enum.value
- nested_list_of_enums: Union[Unset, List[List[str]]] = UNSET
+ nested_list_of_enums: Union[Unset, list[list[str]]] = UNSET
if not isinstance(self.nested_list_of_enums, Unset):
nested_list_of_enums = []
for nested_list_of_enums_item_data in self.nested_list_of_enums:
@@ -174,7 +174,7 @@ def to_dict(self) -> Dict[str, Any]:
not_required_not_nullable = self.not_required_not_nullable
- not_required_one_of_models: Union[Dict[str, Any], Unset]
+ not_required_one_of_models: Union[Unset, dict[str, Any]]
if isinstance(self.not_required_one_of_models, Unset):
not_required_one_of_models = UNSET
elif isinstance(self.not_required_one_of_models, FreeFormModel):
@@ -182,7 +182,7 @@ def to_dict(self) -> Dict[str, Any]:
else:
not_required_one_of_models = self.not_required_one_of_models.to_dict()
- not_required_nullable_one_of_models: Union[Dict[str, Any], None, Unset, str]
+ not_required_nullable_one_of_models: Union[None, Unset, dict[str, Any], str]
if isinstance(self.not_required_nullable_one_of_models, Unset):
not_required_nullable_one_of_models = UNSET
elif isinstance(self.not_required_nullable_one_of_models, FreeFormModel):
@@ -192,11 +192,11 @@ def to_dict(self) -> Dict[str, Any]:
else:
not_required_nullable_one_of_models = self.not_required_nullable_one_of_models
- not_required_model: Union[Unset, Dict[str, Any]] = UNSET
+ not_required_model: Union[Unset, dict[str, Any]] = UNSET
if not isinstance(self.not_required_model, Unset):
not_required_model = self.not_required_model.to_dict()
- not_required_nullable_model: Union[Dict[str, Any], None, Unset]
+ not_required_nullable_model: Union[None, Unset, dict[str, Any]]
if isinstance(self.not_required_nullable_model, Unset):
not_required_nullable_model = UNSET
elif isinstance(self.not_required_nullable_model, ModelWithUnionProperty):
@@ -204,7 +204,7 @@ def to_dict(self) -> Dict[str, Any]:
else:
not_required_nullable_model = self.not_required_nullable_model
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(
{
"an_enum_value": an_enum_value,
@@ -252,7 +252,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.free_form_model import FreeFormModel
from ..models.model_with_union_property import ModelWithUnionProperty
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/a_model_with_properties_reference_that_are_not_object.py b/end_to_end_tests/golden-record/my_test_api_client/models/a_model_with_properties_reference_that_are_not_object.py
index 88ffd349f..c1a905195 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/a_model_with_properties_reference_that_are_not_object.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/a_model_with_properties_reference_that_are_not_object.py
@@ -1,6 +1,6 @@
import datetime
from io import BytesIO
-from typing import Any, Dict, List, Type, TypeVar, cast
+from typing import Any, TypeVar, cast
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,26 +16,26 @@
class AModelWithPropertiesReferenceThatAreNotObject:
"""
Attributes:
- enum_properties_ref (List[AnEnum]):
- str_properties_ref (List[str]):
- date_properties_ref (List[datetime.date]):
- datetime_properties_ref (List[datetime.datetime]):
- int32_properties_ref (List[int]):
- int64_properties_ref (List[int]):
- float_properties_ref (List[float]):
- double_properties_ref (List[float]):
- file_properties_ref (List[File]):
- bytestream_properties_ref (List[str]):
- enum_properties (List[AnEnum]):
- str_properties (List[str]):
- date_properties (List[datetime.date]):
- datetime_properties (List[datetime.datetime]):
- int32_properties (List[int]):
- int64_properties (List[int]):
- float_properties (List[float]):
- double_properties (List[float]):
- file_properties (List[File]):
- bytestream_properties (List[str]):
+ enum_properties_ref (list[AnEnum]):
+ str_properties_ref (list[str]):
+ date_properties_ref (list[datetime.date]):
+ datetime_properties_ref (list[datetime.datetime]):
+ int32_properties_ref (list[int]):
+ int64_properties_ref (list[int]):
+ float_properties_ref (list[float]):
+ double_properties_ref (list[float]):
+ file_properties_ref (list[File]):
+ bytestream_properties_ref (list[str]):
+ enum_properties (list[AnEnum]):
+ str_properties (list[str]):
+ date_properties (list[datetime.date]):
+ datetime_properties (list[datetime.datetime]):
+ int32_properties (list[int]):
+ int64_properties (list[int]):
+ float_properties (list[float]):
+ double_properties (list[float]):
+ file_properties (list[File]):
+ bytestream_properties (list[str]):
enum_property_ref (AnEnum): For testing Enums in all the ways they can be used
str_property_ref (str):
date_property_ref (datetime.date):
@@ -48,26 +48,26 @@ class AModelWithPropertiesReferenceThatAreNotObject:
bytestream_property_ref (str):
"""
- enum_properties_ref: List[AnEnum]
- str_properties_ref: List[str]
- date_properties_ref: List[datetime.date]
- datetime_properties_ref: List[datetime.datetime]
- int32_properties_ref: List[int]
- int64_properties_ref: List[int]
- float_properties_ref: List[float]
- double_properties_ref: List[float]
- file_properties_ref: List[File]
- bytestream_properties_ref: List[str]
- enum_properties: List[AnEnum]
- str_properties: List[str]
- date_properties: List[datetime.date]
- datetime_properties: List[datetime.datetime]
- int32_properties: List[int]
- int64_properties: List[int]
- float_properties: List[float]
- double_properties: List[float]
- file_properties: List[File]
- bytestream_properties: List[str]
+ enum_properties_ref: list[AnEnum]
+ str_properties_ref: list[str]
+ date_properties_ref: list[datetime.date]
+ datetime_properties_ref: list[datetime.datetime]
+ int32_properties_ref: list[int]
+ int64_properties_ref: list[int]
+ float_properties_ref: list[float]
+ double_properties_ref: list[float]
+ file_properties_ref: list[File]
+ bytestream_properties_ref: list[str]
+ enum_properties: list[AnEnum]
+ str_properties: list[str]
+ date_properties: list[datetime.date]
+ datetime_properties: list[datetime.datetime]
+ int32_properties: list[int]
+ int64_properties: list[int]
+ float_properties: list[float]
+ double_properties: list[float]
+ file_properties: list[File]
+ bytestream_properties: list[str]
enum_property_ref: AnEnum
str_property_ref: str
date_property_ref: datetime.date
@@ -78,9 +78,9 @@ class AModelWithPropertiesReferenceThatAreNotObject:
double_property_ref: float
file_property_ref: File
bytestream_property_ref: str
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
enum_properties_ref = []
for componentsschemas_an_other_array_of_enum_item_data in self.enum_properties_ref:
componentsschemas_an_other_array_of_enum_item = componentsschemas_an_other_array_of_enum_item_data.value
@@ -173,7 +173,7 @@ def to_dict(self) -> Dict[str, Any]:
bytestream_property_ref = self.bytestream_property_ref
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
@@ -213,7 +213,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
enum_properties_ref = []
_enum_properties_ref = d.pop("enum_properties_ref")
@@ -222,7 +222,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
enum_properties_ref.append(componentsschemas_an_other_array_of_enum_item)
- str_properties_ref = cast(List[str], d.pop("str_properties_ref"))
+ str_properties_ref = cast(list[str], d.pop("str_properties_ref"))
date_properties_ref = []
_date_properties_ref = d.pop("date_properties_ref")
@@ -242,13 +242,13 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
datetime_properties_ref.append(componentsschemas_an_other_array_of_date_time_item)
- int32_properties_ref = cast(List[int], d.pop("int32_properties_ref"))
+ int32_properties_ref = cast(list[int], d.pop("int32_properties_ref"))
- int64_properties_ref = cast(List[int], d.pop("int64_properties_ref"))
+ int64_properties_ref = cast(list[int], d.pop("int64_properties_ref"))
- float_properties_ref = cast(List[float], d.pop("float_properties_ref"))
+ float_properties_ref = cast(list[float], d.pop("float_properties_ref"))
- double_properties_ref = cast(List[float], d.pop("double_properties_ref"))
+ double_properties_ref = cast(list[float], d.pop("double_properties_ref"))
file_properties_ref = []
_file_properties_ref = d.pop("file_properties_ref")
@@ -259,7 +259,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
file_properties_ref.append(componentsschemas_an_other_array_of_file_item)
- bytestream_properties_ref = cast(List[str], d.pop("bytestream_properties_ref"))
+ bytestream_properties_ref = cast(list[str], d.pop("bytestream_properties_ref"))
enum_properties = []
_enum_properties = d.pop("enum_properties")
@@ -268,7 +268,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
enum_properties.append(componentsschemas_an_array_of_enum_item)
- str_properties = cast(List[str], d.pop("str_properties"))
+ str_properties = cast(list[str], d.pop("str_properties"))
date_properties = []
_date_properties = d.pop("date_properties")
@@ -284,13 +284,13 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
datetime_properties.append(componentsschemas_an_array_of_date_time_item)
- int32_properties = cast(List[int], d.pop("int32_properties"))
+ int32_properties = cast(list[int], d.pop("int32_properties"))
- int64_properties = cast(List[int], d.pop("int64_properties"))
+ int64_properties = cast(list[int], d.pop("int64_properties"))
- float_properties = cast(List[float], d.pop("float_properties"))
+ float_properties = cast(list[float], d.pop("float_properties"))
- double_properties = cast(List[float], d.pop("double_properties"))
+ double_properties = cast(list[float], d.pop("double_properties"))
file_properties = []
_file_properties = d.pop("file_properties")
@@ -301,7 +301,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
file_properties.append(componentsschemas_an_array_of_file_item)
- bytestream_properties = cast(List[str], d.pop("bytestream_properties"))
+ bytestream_properties = cast(list[str], d.pop("bytestream_properties"))
enum_property_ref = AnEnum(d.pop("enum_property_ref"))
@@ -360,7 +360,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return a_model_with_properties_reference_that_are_not_object
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/all_of_has_properties_but_no_type.py b/end_to_end_tests/golden-record/my_test_api_client/models/all_of_has_properties_but_no_type.py
index 245a1b04a..6a39f4951 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/all_of_has_properties_but_no_type.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/all_of_has_properties_but_no_type.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -14,42 +14,42 @@ class AllOfHasPropertiesButNoType:
"""
Attributes:
a_sub_property (Union[Unset, str]):
- type (Union[Unset, str]):
+ type_ (Union[Unset, str]):
type_enum (Union[Unset, AllOfHasPropertiesButNoTypeTypeEnum]):
"""
a_sub_property: Union[Unset, str] = UNSET
- type: Union[Unset, str] = UNSET
+ type_: Union[Unset, str] = UNSET
type_enum: Union[Unset, AllOfHasPropertiesButNoTypeTypeEnum] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a_sub_property = self.a_sub_property
- type = self.type
+ type_ = self.type_
type_enum: Union[Unset, int] = UNSET
if not isinstance(self.type_enum, Unset):
type_enum = self.type_enum.value
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if a_sub_property is not UNSET:
field_dict["a_sub_property"] = a_sub_property
- if type is not UNSET:
- field_dict["type"] = type
+ if type_ is not UNSET:
+ field_dict["type"] = type_
if type_enum is not UNSET:
field_dict["type_enum"] = type_enum
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
a_sub_property = d.pop("a_sub_property", UNSET)
- type = d.pop("type", UNSET)
+ type_ = d.pop("type", UNSET)
_type_enum = d.pop("type_enum", UNSET)
type_enum: Union[Unset, AllOfHasPropertiesButNoTypeTypeEnum]
@@ -60,7 +60,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
all_of_has_properties_but_no_type = cls(
a_sub_property=a_sub_property,
- type=type,
+ type_=type_,
type_enum=type_enum,
)
@@ -68,7 +68,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return all_of_has_properties_but_no_type
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/all_of_sub_model.py b/end_to_end_tests/golden-record/my_test_api_client/models/all_of_sub_model.py
index 550b9b9c4..dfb672ce1 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/all_of_sub_model.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/all_of_sub_model.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -14,42 +14,42 @@ class AllOfSubModel:
"""
Attributes:
a_sub_property (Union[Unset, str]):
- type (Union[Unset, str]):
+ type_ (Union[Unset, str]):
type_enum (Union[Unset, AllOfSubModelTypeEnum]):
"""
a_sub_property: Union[Unset, str] = UNSET
- type: Union[Unset, str] = UNSET
+ type_: Union[Unset, str] = UNSET
type_enum: Union[Unset, AllOfSubModelTypeEnum] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a_sub_property = self.a_sub_property
- type = self.type
+ type_ = self.type_
type_enum: Union[Unset, int] = UNSET
if not isinstance(self.type_enum, Unset):
type_enum = self.type_enum.value
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if a_sub_property is not UNSET:
field_dict["a_sub_property"] = a_sub_property
- if type is not UNSET:
- field_dict["type"] = type
+ if type_ is not UNSET:
+ field_dict["type"] = type_
if type_enum is not UNSET:
field_dict["type_enum"] = type_enum
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
a_sub_property = d.pop("a_sub_property", UNSET)
- type = d.pop("type", UNSET)
+ type_ = d.pop("type", UNSET)
_type_enum = d.pop("type_enum", UNSET)
type_enum: Union[Unset, AllOfSubModelTypeEnum]
@@ -60,7 +60,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
all_of_sub_model = cls(
a_sub_property=a_sub_property,
- type=type,
+ type_=type_,
type_enum=type_enum,
)
@@ -68,7 +68,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return all_of_sub_model
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_a_item.py b/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_a_item.py
index b7792fefc..02e9cfa4b 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_a_item.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_a_item.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union
+from typing import TYPE_CHECKING, Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,14 +16,14 @@
class AnArrayWithACircularRefInItemsObjectAItem:
"""
Attributes:
- circular (Union[Unset, List['AnArrayWithACircularRefInItemsObjectBItem']]):
+ circular (Union[Unset, list['AnArrayWithACircularRefInItemsObjectBItem']]):
"""
- circular: Union[Unset, List["AnArrayWithACircularRefInItemsObjectBItem"]] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ circular: Union[Unset, list["AnArrayWithACircularRefInItemsObjectBItem"]] = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- circular: Union[Unset, List[Dict[str, Any]]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ circular: Union[Unset, list[dict[str, Any]]] = UNSET
if not isinstance(self.circular, Unset):
circular = []
for componentsschemas_an_array_with_a_circular_ref_in_items_object_b_item_data in self.circular:
@@ -32,7 +32,7 @@ def to_dict(self) -> Dict[str, Any]:
)
circular.append(componentsschemas_an_array_with_a_circular_ref_in_items_object_b_item)
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if circular is not UNSET:
@@ -41,7 +41,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.an_array_with_a_circular_ref_in_items_object_b_item import (
AnArrayWithACircularRefInItemsObjectBItem,
)
@@ -66,7 +66,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return an_array_with_a_circular_ref_in_items_object_a_item
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_additional_properties_a_item.py b/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_additional_properties_a_item.py
index c505553b6..c72c0160a 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_additional_properties_a_item.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_additional_properties_a_item.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar
+from typing import TYPE_CHECKING, Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@
class AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem:
""" """
- additional_properties: Dict[str, List["AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem"]] = (
+ additional_properties: dict[str, list["AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem"]] = (
_attrs_field(init=False, factory=dict)
)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = []
for (
@@ -35,7 +35,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.an_array_with_a_circular_ref_in_items_object_additional_properties_b_item import (
AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem,
)
@@ -68,14 +68,14 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return an_array_with_a_circular_ref_in_items_object_additional_properties_a_item
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
- def __getitem__(self, key: str) -> List["AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem"]:
+ def __getitem__(self, key: str) -> list["AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem"]:
return self.additional_properties[key]
def __setitem__(
- self, key: str, value: List["AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem"]
+ self, key: str, value: list["AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem"]
) -> None:
self.additional_properties[key] = value
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_additional_properties_b_item.py b/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_additional_properties_b_item.py
index 9d2dc9827..7ffb50a16 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_additional_properties_b_item.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_additional_properties_b_item.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar
+from typing import TYPE_CHECKING, Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@
class AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem:
""" """
- additional_properties: Dict[str, List["AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem"]] = (
+ additional_properties: dict[str, list["AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem"]] = (
_attrs_field(init=False, factory=dict)
)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = []
for (
@@ -35,7 +35,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.an_array_with_a_circular_ref_in_items_object_additional_properties_a_item import (
AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem,
)
@@ -68,14 +68,14 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return an_array_with_a_circular_ref_in_items_object_additional_properties_b_item
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
- def __getitem__(self, key: str) -> List["AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem"]:
+ def __getitem__(self, key: str) -> list["AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem"]:
return self.additional_properties[key]
def __setitem__(
- self, key: str, value: List["AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem"]
+ self, key: str, value: list["AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem"]
) -> None:
self.additional_properties[key] = value
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_b_item.py b/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_b_item.py
index 622d5d999..6d5e83a65 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_b_item.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_circular_ref_in_items_object_b_item.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union
+from typing import TYPE_CHECKING, Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,14 +16,14 @@
class AnArrayWithACircularRefInItemsObjectBItem:
"""
Attributes:
- circular (Union[Unset, List['AnArrayWithACircularRefInItemsObjectAItem']]):
+ circular (Union[Unset, list['AnArrayWithACircularRefInItemsObjectAItem']]):
"""
- circular: Union[Unset, List["AnArrayWithACircularRefInItemsObjectAItem"]] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ circular: Union[Unset, list["AnArrayWithACircularRefInItemsObjectAItem"]] = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- circular: Union[Unset, List[Dict[str, Any]]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ circular: Union[Unset, list[dict[str, Any]]] = UNSET
if not isinstance(self.circular, Unset):
circular = []
for componentsschemas_an_array_with_a_circular_ref_in_items_object_a_item_data in self.circular:
@@ -32,7 +32,7 @@ def to_dict(self) -> Dict[str, Any]:
)
circular.append(componentsschemas_an_array_with_a_circular_ref_in_items_object_a_item)
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if circular is not UNSET:
@@ -41,7 +41,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.an_array_with_a_circular_ref_in_items_object_a_item import (
AnArrayWithACircularRefInItemsObjectAItem,
)
@@ -66,7 +66,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return an_array_with_a_circular_ref_in_items_object_b_item
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_recursive_ref_in_items_object_additional_properties_item.py b/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_recursive_ref_in_items_object_additional_properties_item.py
index e19cfc052..14dc6ba26 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_recursive_ref_in_items_object_additional_properties_item.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_recursive_ref_in_items_object_additional_properties_item.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -10,12 +10,12 @@
class AnArrayWithARecursiveRefInItemsObjectAdditionalPropertiesItem:
""" """
- additional_properties: Dict[str, List["AnArrayWithARecursiveRefInItemsObjectAdditionalPropertiesItem"]] = (
+ additional_properties: dict[str, list["AnArrayWithARecursiveRefInItemsObjectAdditionalPropertiesItem"]] = (
_attrs_field(init=False, factory=dict)
)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = []
for componentsschemas_an_array_with_a_recursive_ref_in_items_object_additional_properties_item_data in prop:
@@ -27,7 +27,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
an_array_with_a_recursive_ref_in_items_object_additional_properties_item = cls()
@@ -56,14 +56,14 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return an_array_with_a_recursive_ref_in_items_object_additional_properties_item
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
- def __getitem__(self, key: str) -> List["AnArrayWithARecursiveRefInItemsObjectAdditionalPropertiesItem"]:
+ def __getitem__(self, key: str) -> list["AnArrayWithARecursiveRefInItemsObjectAdditionalPropertiesItem"]:
return self.additional_properties[key]
def __setitem__(
- self, key: str, value: List["AnArrayWithARecursiveRefInItemsObjectAdditionalPropertiesItem"]
+ self, key: str, value: list["AnArrayWithARecursiveRefInItemsObjectAdditionalPropertiesItem"]
) -> None:
self.additional_properties[key] = value
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_recursive_ref_in_items_object_item.py b/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_recursive_ref_in_items_object_item.py
index 6b12b9b5d..c8629e83d 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_recursive_ref_in_items_object_item.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/an_array_with_a_recursive_ref_in_items_object_item.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -12,14 +12,14 @@
class AnArrayWithARecursiveRefInItemsObjectItem:
"""
Attributes:
- recursive (Union[Unset, List['AnArrayWithARecursiveRefInItemsObjectItem']]):
+ recursive (Union[Unset, list['AnArrayWithARecursiveRefInItemsObjectItem']]):
"""
- recursive: Union[Unset, List["AnArrayWithARecursiveRefInItemsObjectItem"]] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ recursive: Union[Unset, list["AnArrayWithARecursiveRefInItemsObjectItem"]] = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- recursive: Union[Unset, List[Dict[str, Any]]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ recursive: Union[Unset, list[dict[str, Any]]] = UNSET
if not isinstance(self.recursive, Unset):
recursive = []
for componentsschemas_an_array_with_a_recursive_ref_in_items_object_item_data in self.recursive:
@@ -28,7 +28,7 @@ def to_dict(self) -> Dict[str, Any]:
)
recursive.append(componentsschemas_an_array_with_a_recursive_ref_in_items_object_item)
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if recursive is not UNSET:
@@ -37,7 +37,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
recursive = []
_recursive = d.pop("recursive", UNSET)
@@ -58,7 +58,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return an_array_with_a_recursive_ref_in_items_object_item
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/another_all_of_sub_model.py b/end_to_end_tests/golden-record/my_test_api_client/models/another_all_of_sub_model.py
index fde2bb6f8..df2d9b2cd 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/another_all_of_sub_model.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/another_all_of_sub_model.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -15,49 +15,49 @@ class AnotherAllOfSubModel:
"""
Attributes:
another_sub_property (Union[Unset, str]):
- type (Union[Unset, AnotherAllOfSubModelType]):
+ type_ (Union[Unset, AnotherAllOfSubModelType]):
type_enum (Union[Unset, AnotherAllOfSubModelTypeEnum]):
"""
another_sub_property: Union[Unset, str] = UNSET
- type: Union[Unset, AnotherAllOfSubModelType] = UNSET
+ type_: Union[Unset, AnotherAllOfSubModelType] = UNSET
type_enum: Union[Unset, AnotherAllOfSubModelTypeEnum] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
another_sub_property = self.another_sub_property
- type: Union[Unset, str] = UNSET
- if not isinstance(self.type, Unset):
- type = self.type.value
+ type_: Union[Unset, str] = UNSET
+ if not isinstance(self.type_, Unset):
+ type_ = self.type_.value
type_enum: Union[Unset, int] = UNSET
if not isinstance(self.type_enum, Unset):
type_enum = self.type_enum.value
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if another_sub_property is not UNSET:
field_dict["another_sub_property"] = another_sub_property
- if type is not UNSET:
- field_dict["type"] = type
+ if type_ is not UNSET:
+ field_dict["type"] = type_
if type_enum is not UNSET:
field_dict["type_enum"] = type_enum
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
another_sub_property = d.pop("another_sub_property", UNSET)
- _type = d.pop("type", UNSET)
- type: Union[Unset, AnotherAllOfSubModelType]
- if isinstance(_type, Unset):
- type = UNSET
+ _type_ = d.pop("type", UNSET)
+ type_: Union[Unset, AnotherAllOfSubModelType]
+ if isinstance(_type_, Unset):
+ type_ = UNSET
else:
- type = AnotherAllOfSubModelType(_type)
+ type_ = AnotherAllOfSubModelType(_type_)
_type_enum = d.pop("type_enum", UNSET)
type_enum: Union[Unset, AnotherAllOfSubModelTypeEnum]
@@ -68,7 +68,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
another_all_of_sub_model = cls(
another_sub_property=another_sub_property,
- type=type,
+ type_=type_,
type_enum=type_enum,
)
@@ -76,7 +76,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return another_all_of_sub_model
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post.py b/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post.py
index d7fbbf835..1c255cfcb 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post.py
@@ -1,7 +1,7 @@
import datetime
import json
from io import BytesIO
-from typing import TYPE_CHECKING, Any, Dict, List, Tuple, Type, TypeVar, Union, cast
+from typing import TYPE_CHECKING, Any, TypeVar, Union, cast
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -41,8 +41,8 @@ class BodyUploadFileTestsUploadPost:
a_date (Union[Unset, datetime.date]):
some_number (Union[Unset, float]):
some_nullable_number (Union[None, Unset, float]):
- some_int_array (Union[Unset, List[Union[None, int]]]):
- some_array (Union[List['AFormData'], None, Unset]):
+ some_int_array (Union[Unset, list[Union[None, int]]]):
+ some_array (Union[None, Unset, list['AFormData']]):
some_optional_object (Union[Unset, BodyUploadFileTestsUploadPostSomeOptionalObject]):
some_enum (Union[Unset, DifferentEnum]): An enumeration.
"""
@@ -57,15 +57,15 @@ class BodyUploadFileTestsUploadPost:
a_date: Union[Unset, datetime.date] = UNSET
some_number: Union[Unset, float] = UNSET
some_nullable_number: Union[None, Unset, float] = UNSET
- some_int_array: Union[Unset, List[Union[None, int]]] = UNSET
- some_array: Union[List["AFormData"], None, Unset] = UNSET
+ some_int_array: Union[Unset, list[Union[None, int]]] = UNSET
+ some_array: Union[None, Unset, list["AFormData"]] = UNSET
some_optional_object: Union[Unset, "BodyUploadFileTestsUploadPostSomeOptionalObject"] = UNSET
some_enum: Union[Unset, DifferentEnum] = UNSET
- additional_properties: Dict[str, "BodyUploadFileTestsUploadPostAdditionalProperty"] = _attrs_field(
+ additional_properties: dict[str, "BodyUploadFileTestsUploadPostAdditionalProperty"] = _attrs_field(
init=False, factory=dict
)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
from ..models.body_upload_file_tests_upload_post_some_nullable_object import (
BodyUploadFileTestsUploadPostSomeNullableObject,
)
@@ -76,7 +76,7 @@ def to_dict(self) -> Dict[str, Any]:
some_object = self.some_object.to_dict()
- some_nullable_object: Union[Dict[str, Any], None]
+ some_nullable_object: Union[None, dict[str, Any]]
if isinstance(self.some_nullable_object, BodyUploadFileTestsUploadPostSomeNullableObject):
some_nullable_object = self.some_nullable_object.to_dict()
else:
@@ -104,7 +104,7 @@ def to_dict(self) -> Dict[str, Any]:
else:
some_nullable_number = self.some_nullable_number
- some_int_array: Union[Unset, List[Union[None, int]]] = UNSET
+ some_int_array: Union[Unset, list[Union[None, int]]] = UNSET
if not isinstance(self.some_int_array, Unset):
some_int_array = []
for some_int_array_item_data in self.some_int_array:
@@ -112,7 +112,7 @@ def to_dict(self) -> Dict[str, Any]:
some_int_array_item = some_int_array_item_data
some_int_array.append(some_int_array_item)
- some_array: Union[List[Dict[str, Any]], None, Unset]
+ some_array: Union[None, Unset, list[dict[str, Any]]]
if isinstance(self.some_array, Unset):
some_array = UNSET
elif isinstance(self.some_array, list):
@@ -124,7 +124,7 @@ def to_dict(self) -> Dict[str, Any]:
else:
some_array = self.some_array
- some_optional_object: Union[Unset, Dict[str, Any]] = UNSET
+ some_optional_object: Union[Unset, dict[str, Any]] = UNSET
if not isinstance(self.some_optional_object, Unset):
some_optional_object = self.some_optional_object.to_dict()
@@ -132,7 +132,7 @@ def to_dict(self) -> Dict[str, Any]:
if not isinstance(self.some_enum, Unset):
some_enum = self.some_enum.value
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = prop.to_dict()
field_dict.update(
@@ -166,14 +166,14 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
- def to_multipart(self) -> Dict[str, Any]:
+ def to_multipart(self) -> dict[str, Any]:
some_file = self.some_file.to_tuple()
some_required_number = (None, str(self.some_required_number).encode(), "text/plain")
some_object = (None, json.dumps(self.some_object.to_dict()).encode(), "application/json")
- some_nullable_object: Tuple[None, bytes, str]
+ some_nullable_object: tuple[None, bytes, str]
if isinstance(self.some_nullable_object, BodyUploadFileTestsUploadPostSomeNullableObject):
some_nullable_object = (None, json.dumps(self.some_nullable_object.to_dict()).encode(), "application/json")
@@ -204,7 +204,7 @@ def to_multipart(self) -> Dict[str, Any]:
else (None, str(self.some_number).encode(), "text/plain")
)
- some_nullable_number: Union[Tuple[None, bytes, str], Unset]
+ some_nullable_number: Union[Unset, tuple[None, bytes, str]]
if isinstance(self.some_nullable_number, Unset):
some_nullable_number = UNSET
@@ -213,7 +213,7 @@ def to_multipart(self) -> Dict[str, Any]:
else:
some_nullable_number = (None, str(self.some_nullable_number).encode(), "text/plain")
- some_int_array: Union[Unset, Tuple[None, bytes, str]] = UNSET
+ some_int_array: Union[Unset, tuple[None, bytes, str]] = UNSET
if not isinstance(self.some_int_array, Unset):
_temp_some_int_array = []
for some_int_array_item_data in self.some_int_array:
@@ -222,7 +222,7 @@ def to_multipart(self) -> Dict[str, Any]:
_temp_some_int_array.append(some_int_array_item)
some_int_array = (None, json.dumps(_temp_some_int_array).encode(), "application/json")
- some_array: Union[Tuple[None, bytes, str], Unset]
+ some_array: Union[Unset, tuple[None, bytes, str]]
if isinstance(self.some_array, Unset):
some_array = UNSET
@@ -235,15 +235,15 @@ def to_multipart(self) -> Dict[str, Any]:
else:
some_array = (None, str(self.some_array).encode(), "text/plain")
- some_optional_object: Union[Unset, Tuple[None, bytes, str]] = UNSET
+ some_optional_object: Union[Unset, tuple[None, bytes, str]] = UNSET
if not isinstance(self.some_optional_object, Unset):
some_optional_object = (None, json.dumps(self.some_optional_object.to_dict()).encode(), "application/json")
- some_enum: Union[Unset, Tuple[None, bytes, str]] = UNSET
+ some_enum: Union[Unset, tuple[None, bytes, str]] = UNSET
if not isinstance(self.some_enum, Unset):
some_enum = (None, str(self.some_enum.value).encode(), "text/plain")
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = (None, json.dumps(prop.to_dict()).encode(), "application/json")
field_dict.update(
@@ -278,7 +278,7 @@ def to_multipart(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.a_form_data import AFormData
from ..models.body_upload_file_tests_upload_post_additional_property import (
BodyUploadFileTestsUploadPostAdditionalProperty,
@@ -360,7 +360,7 @@ def _parse_some_int_array_item(data: object) -> Union[None, int]:
some_int_array.append(some_int_array_item)
- def _parse_some_array(data: object) -> Union[List["AFormData"], None, Unset]:
+ def _parse_some_array(data: object) -> Union[None, Unset, list["AFormData"]]:
if data is None:
return data
if isinstance(data, Unset):
@@ -378,7 +378,7 @@ def _parse_some_array(data: object) -> Union[List["AFormData"], None, Unset]:
return some_array_type_0
except: # noqa: E722
pass
- return cast(Union[List["AFormData"], None, Unset], data)
+ return cast(Union[None, Unset, list["AFormData"]], data)
some_array = _parse_some_array(d.pop("some_array", UNSET))
@@ -423,7 +423,7 @@ def _parse_some_array(data: object) -> Union[List["AFormData"], None, Unset]:
return body_upload_file_tests_upload_post
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> "BodyUploadFileTestsUploadPostAdditionalProperty":
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_additional_property.py b/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_additional_property.py
index f855d9c61..47dde1338 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_additional_property.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_additional_property.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@ class BodyUploadFileTestsUploadPostAdditionalProperty:
"""
foo: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
foo = self.foo
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if foo is not UNSET:
@@ -30,7 +30,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
foo = d.pop("foo", UNSET)
@@ -42,7 +42,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return body_upload_file_tests_upload_post_additional_property
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_some_nullable_object.py b/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_some_nullable_object.py
index 9762b7efa..817dfd789 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_some_nullable_object.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_some_nullable_object.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@ class BodyUploadFileTestsUploadPostSomeNullableObject:
"""
bar: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
bar = self.bar
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if bar is not UNSET:
@@ -30,7 +30,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
bar = d.pop("bar", UNSET)
@@ -42,7 +42,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return body_upload_file_tests_upload_post_some_nullable_object
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_some_object.py b/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_some_object.py
index 25c2c0a6a..a074bb86f 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_some_object.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_some_object.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,14 +16,14 @@ class BodyUploadFileTestsUploadPostSomeObject:
num: float
text: str
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
num = self.num
text = self.text
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
@@ -35,7 +35,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
num = d.pop("num")
@@ -50,7 +50,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return body_upload_file_tests_upload_post_some_object
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_some_optional_object.py b/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_some_optional_object.py
index 711b34e63..e0ba4b364 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_some_optional_object.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/body_upload_file_tests_upload_post_some_optional_object.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -14,12 +14,12 @@ class BodyUploadFileTestsUploadPostSomeOptionalObject:
"""
foo: str
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
foo = self.foo
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
@@ -30,7 +30,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
foo = d.pop("foo")
@@ -42,7 +42,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return body_upload_file_tests_upload_post_some_optional_object
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/extended.py b/end_to_end_tests/golden-record/my_test_api_client/models/extended.py
index 324513d3a..ffd6406c7 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/extended.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/extended.py
@@ -1,5 +1,5 @@
import datetime
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union, cast
+from typing import TYPE_CHECKING, Any, TypeVar, Union, cast
from uuid import UUID
from attrs import define as _attrs_define
@@ -38,7 +38,7 @@ class Extended:
nullable_model (Union['ModelWithUnionProperty', None]):
any_value (Union[Unset, Any]): Default: 'default'.
an_optional_allof_enum (Union[Unset, AnAllOfEnum]):
- nested_list_of_enums (Union[Unset, List[List[DifferentEnum]]]):
+ nested_list_of_enums (Union[Unset, list[list[DifferentEnum]]]):
a_not_required_date (Union[Unset, datetime.date]):
a_not_required_uuid (Union[Unset, UUID]):
attr_1_leading_digit (Union[Unset, str]):
@@ -67,7 +67,7 @@ class Extended:
a_nullable_uuid: Union[None, UUID] = UUID("07EF8B4D-AA09-4FFA-898D-C710796AFF41")
any_value: Union[Unset, Any] = "default"
an_optional_allof_enum: Union[Unset, AnAllOfEnum] = UNSET
- nested_list_of_enums: Union[Unset, List[List[DifferentEnum]]] = UNSET
+ nested_list_of_enums: Union[Unset, list[list[DifferentEnum]]] = UNSET
a_not_required_date: Union[Unset, datetime.date] = UNSET
a_not_required_uuid: Union[Unset, UUID] = UNSET
attr_1_leading_digit: Union[Unset, str] = UNSET
@@ -79,9 +79,9 @@ class Extended:
not_required_model: Union[Unset, "ModelWithUnionProperty"] = UNSET
not_required_nullable_model: Union["ModelWithUnionProperty", None, Unset] = UNSET
from_extended: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
from ..models.free_form_model import FreeFormModel
from ..models.model_with_union_property import ModelWithUnionProperty
@@ -116,7 +116,7 @@ def to_dict(self) -> Dict[str, Any]:
required_not_nullable = self.required_not_nullable
- one_of_models: Union[Any, Dict[str, Any]]
+ one_of_models: Union[Any, dict[str, Any]]
if isinstance(self.one_of_models, FreeFormModel):
one_of_models = self.one_of_models.to_dict()
elif isinstance(self.one_of_models, ModelWithUnionProperty):
@@ -124,7 +124,7 @@ def to_dict(self) -> Dict[str, Any]:
else:
one_of_models = self.one_of_models
- nullable_one_of_models: Union[Dict[str, Any], None]
+ nullable_one_of_models: Union[None, dict[str, Any]]
if isinstance(self.nullable_one_of_models, FreeFormModel):
nullable_one_of_models = self.nullable_one_of_models.to_dict()
elif isinstance(self.nullable_one_of_models, ModelWithUnionProperty):
@@ -134,7 +134,7 @@ def to_dict(self) -> Dict[str, Any]:
model = self.model.to_dict()
- nullable_model: Union[Dict[str, Any], None]
+ nullable_model: Union[None, dict[str, Any]]
if isinstance(self.nullable_model, ModelWithUnionProperty):
nullable_model = self.nullable_model.to_dict()
else:
@@ -146,7 +146,7 @@ def to_dict(self) -> Dict[str, Any]:
if not isinstance(self.an_optional_allof_enum, Unset):
an_optional_allof_enum = self.an_optional_allof_enum.value
- nested_list_of_enums: Union[Unset, List[List[str]]] = UNSET
+ nested_list_of_enums: Union[Unset, list[list[str]]] = UNSET
if not isinstance(self.nested_list_of_enums, Unset):
nested_list_of_enums = []
for nested_list_of_enums_item_data in self.nested_list_of_enums:
@@ -177,7 +177,7 @@ def to_dict(self) -> Dict[str, Any]:
not_required_not_nullable = self.not_required_not_nullable
- not_required_one_of_models: Union[Dict[str, Any], Unset]
+ not_required_one_of_models: Union[Unset, dict[str, Any]]
if isinstance(self.not_required_one_of_models, Unset):
not_required_one_of_models = UNSET
elif isinstance(self.not_required_one_of_models, FreeFormModel):
@@ -185,7 +185,7 @@ def to_dict(self) -> Dict[str, Any]:
else:
not_required_one_of_models = self.not_required_one_of_models.to_dict()
- not_required_nullable_one_of_models: Union[Dict[str, Any], None, Unset, str]
+ not_required_nullable_one_of_models: Union[None, Unset, dict[str, Any], str]
if isinstance(self.not_required_nullable_one_of_models, Unset):
not_required_nullable_one_of_models = UNSET
elif isinstance(self.not_required_nullable_one_of_models, FreeFormModel):
@@ -195,11 +195,11 @@ def to_dict(self) -> Dict[str, Any]:
else:
not_required_nullable_one_of_models = self.not_required_nullable_one_of_models
- not_required_model: Union[Unset, Dict[str, Any]] = UNSET
+ not_required_model: Union[Unset, dict[str, Any]] = UNSET
if not isinstance(self.not_required_model, Unset):
not_required_model = self.not_required_model.to_dict()
- not_required_nullable_model: Union[Dict[str, Any], None, Unset]
+ not_required_nullable_model: Union[None, Unset, dict[str, Any]]
if isinstance(self.not_required_nullable_model, Unset):
not_required_nullable_model = UNSET
elif isinstance(self.not_required_nullable_model, ModelWithUnionProperty):
@@ -209,7 +209,7 @@ def to_dict(self) -> Dict[str, Any]:
from_extended = self.from_extended
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
@@ -260,7 +260,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.free_form_model import FreeFormModel
from ..models.model_with_union_property import ModelWithUnionProperty
@@ -548,7 +548,7 @@ def _parse_not_required_nullable_model(data: object) -> Union["ModelWithUnionPro
return extended
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/free_form_model.py b/end_to_end_tests/golden-record/my_test_api_client/models/free_form_model.py
index f757b10ae..10770503b 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/free_form_model.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/free_form_model.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -10,16 +10,16 @@
class FreeFormModel:
""" """
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
free_form_model = cls()
@@ -27,7 +27,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return free_form_model
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/get_models_allof_response_200.py b/end_to_end_tests/golden-record/my_test_api_client/models/get_models_allof_response_200.py
index 2662dc1f4..5e24734e3 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/get_models_allof_response_200.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/get_models_allof_response_200.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union
+from typing import TYPE_CHECKING, Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -25,22 +25,22 @@ class GetModelsAllofResponse200:
aliased: Union[Unset, "AModel"] = UNSET
extended: Union[Unset, "Extended"] = UNSET
model: Union[Unset, "AModel"] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- aliased: Union[Unset, Dict[str, Any]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ aliased: Union[Unset, dict[str, Any]] = UNSET
if not isinstance(self.aliased, Unset):
aliased = self.aliased.to_dict()
- extended: Union[Unset, Dict[str, Any]] = UNSET
+ extended: Union[Unset, dict[str, Any]] = UNSET
if not isinstance(self.extended, Unset):
extended = self.extended.to_dict()
- model: Union[Unset, Dict[str, Any]] = UNSET
+ model: Union[Unset, dict[str, Any]] = UNSET
if not isinstance(self.model, Unset):
model = self.model.to_dict()
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if aliased is not UNSET:
@@ -53,7 +53,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.a_model import AModel
from ..models.extended import Extended
@@ -89,7 +89,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return get_models_allof_response_200
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/get_models_oneof_with_required_const_response_200_type_0.py b/end_to_end_tests/golden-record/my_test_api_client/models/get_models_oneof_with_required_const_response_200_type_0.py
index 972e1c765..18c1e9e64 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/get_models_oneof_with_required_const_response_200_type_0.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/get_models_oneof_with_required_const_response_200_type_0.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Literal, Type, TypeVar, Union, cast
+from typing import Any, Literal, TypeVar, Union, cast
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -12,24 +12,24 @@
class GetModelsOneofWithRequiredConstResponse200Type0:
"""
Attributes:
- type (Literal['alpha']):
+ type_ (Literal['alpha']):
color (Union[Unset, str]):
"""
- type: Literal["alpha"]
+ type_: Literal["alpha"]
color: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- type = self.type
+ def to_dict(self) -> dict[str, Any]:
+ type_ = self.type_
color = self.color
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
- "type": type,
+ "type": type_,
}
)
if color is not UNSET:
@@ -38,16 +38,16 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
- type = cast(Literal["alpha"], d.pop("type"))
- if type != "alpha":
- raise ValueError(f"type must match const 'alpha', got '{type}'")
+ type_ = cast(Literal["alpha"], d.pop("type"))
+ if type_ != "alpha":
+ raise ValueError(f"type must match const 'alpha', got '{type_}'")
color = d.pop("color", UNSET)
get_models_oneof_with_required_const_response_200_type_0 = cls(
- type=type,
+ type_=type_,
color=color,
)
@@ -55,7 +55,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return get_models_oneof_with_required_const_response_200_type_0
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/get_models_oneof_with_required_const_response_200_type_1.py b/end_to_end_tests/golden-record/my_test_api_client/models/get_models_oneof_with_required_const_response_200_type_1.py
index 4596c3cc4..b1df54c32 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/get_models_oneof_with_required_const_response_200_type_1.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/get_models_oneof_with_required_const_response_200_type_1.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Literal, Type, TypeVar, Union, cast
+from typing import Any, Literal, TypeVar, Union, cast
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -12,24 +12,24 @@
class GetModelsOneofWithRequiredConstResponse200Type1:
"""
Attributes:
- type (Literal['beta']):
+ type_ (Literal['beta']):
texture (Union[Unset, str]):
"""
- type: Literal["beta"]
+ type_: Literal["beta"]
texture: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- type = self.type
+ def to_dict(self) -> dict[str, Any]:
+ type_ = self.type_
texture = self.texture
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
- "type": type,
+ "type": type_,
}
)
if texture is not UNSET:
@@ -38,16 +38,16 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
- type = cast(Literal["beta"], d.pop("type"))
- if type != "beta":
- raise ValueError(f"type must match const 'beta', got '{type}'")
+ type_ = cast(Literal["beta"], d.pop("type"))
+ if type_ != "beta":
+ raise ValueError(f"type must match const 'beta', got '{type_}'")
texture = d.pop("texture", UNSET)
get_models_oneof_with_required_const_response_200_type_1 = cls(
- type=type,
+ type_=type_,
texture=texture,
)
@@ -55,7 +55,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return get_models_oneof_with_required_const_response_200_type_1
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/http_validation_error.py b/end_to_end_tests/golden-record/my_test_api_client/models/http_validation_error.py
index 1f04c29d0..a423c6d2f 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/http_validation_error.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/http_validation_error.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union
+from typing import TYPE_CHECKING, Any, TypeVar, Union
from attrs import define as _attrs_define
@@ -15,20 +15,20 @@
class HTTPValidationError:
"""
Attributes:
- detail (Union[Unset, List['ValidationError']]):
+ detail (Union[Unset, list['ValidationError']]):
"""
- detail: Union[Unset, List["ValidationError"]] = UNSET
+ detail: Union[Unset, list["ValidationError"]] = UNSET
- def to_dict(self) -> Dict[str, Any]:
- detail: Union[Unset, List[Dict[str, Any]]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ detail: Union[Unset, list[dict[str, Any]]] = UNSET
if not isinstance(self.detail, Unset):
detail = []
for detail_item_data in self.detail:
detail_item = detail_item_data.to_dict()
detail.append(detail_item)
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update({})
if detail is not UNSET:
field_dict["detail"] = detail
@@ -36,7 +36,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.validation_error import ValidationError
d = src_dict.copy()
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/import_.py b/end_to_end_tests/golden-record/my_test_api_client/models/import_.py
index 85cc594e7..79788bf80 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/import_.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/import_.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -10,16 +10,16 @@
class Import:
""" """
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
import_ = cls()
@@ -27,7 +27,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return import_
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/json_like_body.py b/end_to_end_tests/golden-record/my_test_api_client/models/json_like_body.py
index 623dcd848..bb4a31010 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/json_like_body.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/json_like_body.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@ class JsonLikeBody:
"""
a: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a = self.a
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if a is not UNSET:
@@ -30,7 +30,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
a = d.pop("a", UNSET)
@@ -42,7 +42,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return json_like_body
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/mixed_case_response_200.py b/end_to_end_tests/golden-record/my_test_api_client/models/mixed_case_response_200.py
index 21bdd918d..adb74459d 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/mixed_case_response_200.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/mixed_case_response_200.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -18,14 +18,14 @@ class MixedCaseResponse200:
mixed_case: Union[Unset, str] = UNSET
mixedCase: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
mixed_case = self.mixed_case
mixedCase = self.mixedCase
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if mixed_case is not UNSET:
@@ -36,7 +36,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
mixed_case = d.pop("mixed_case", UNSET)
@@ -51,7 +51,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return mixed_case_response_200
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_from_all_of.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_from_all_of.py
index 6414b790d..a9fb59976 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_from_all_of.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_from_all_of.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -15,23 +15,23 @@ class ModelFromAllOf:
"""
Attributes:
a_sub_property (Union[Unset, str]):
- type (Union[Unset, AnotherAllOfSubModelType]):
+ type_ (Union[Unset, AnotherAllOfSubModelType]):
type_enum (Union[Unset, AnotherAllOfSubModelTypeEnum]):
another_sub_property (Union[Unset, str]):
"""
a_sub_property: Union[Unset, str] = UNSET
- type: Union[Unset, AnotherAllOfSubModelType] = UNSET
+ type_: Union[Unset, AnotherAllOfSubModelType] = UNSET
type_enum: Union[Unset, AnotherAllOfSubModelTypeEnum] = UNSET
another_sub_property: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a_sub_property = self.a_sub_property
- type: Union[Unset, str] = UNSET
- if not isinstance(self.type, Unset):
- type = self.type.value
+ type_: Union[Unset, str] = UNSET
+ if not isinstance(self.type_, Unset):
+ type_ = self.type_.value
type_enum: Union[Unset, int] = UNSET
if not isinstance(self.type_enum, Unset):
@@ -39,13 +39,13 @@ def to_dict(self) -> Dict[str, Any]:
another_sub_property = self.another_sub_property
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if a_sub_property is not UNSET:
field_dict["a_sub_property"] = a_sub_property
- if type is not UNSET:
- field_dict["type"] = type
+ if type_ is not UNSET:
+ field_dict["type"] = type_
if type_enum is not UNSET:
field_dict["type_enum"] = type_enum
if another_sub_property is not UNSET:
@@ -54,16 +54,16 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
a_sub_property = d.pop("a_sub_property", UNSET)
- _type = d.pop("type", UNSET)
- type: Union[Unset, AnotherAllOfSubModelType]
- if isinstance(_type, Unset):
- type = UNSET
+ _type_ = d.pop("type", UNSET)
+ type_: Union[Unset, AnotherAllOfSubModelType]
+ if isinstance(_type_, Unset):
+ type_ = UNSET
else:
- type = AnotherAllOfSubModelType(_type)
+ type_ = AnotherAllOfSubModelType(_type_)
_type_enum = d.pop("type_enum", UNSET)
type_enum: Union[Unset, AnotherAllOfSubModelTypeEnum]
@@ -76,7 +76,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
model_from_all_of = cls(
a_sub_property=a_sub_property,
- type=type,
+ type_=type_,
type_enum=type_enum,
another_sub_property=another_sub_property,
)
@@ -85,7 +85,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_from_all_of
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_name.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_name.py
index 2a86db3a2..6f4eefc36 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_name.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_name.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -10,16 +10,16 @@
class ModelName:
""" """
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
model_name = cls()
@@ -27,7 +27,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_name
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_reference_with_periods.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_reference_with_periods.py
index a5ff5d211..004ed9b20 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_reference_with_periods.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_reference_with_periods.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -10,16 +10,16 @@
class ModelReferenceWithPeriods:
"""A Model with periods in its reference"""
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
model_reference_with_periods = cls()
@@ -27,7 +27,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_reference_with_periods
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined.py
index 761a43e54..a0cdb4f6a 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union
+from typing import TYPE_CHECKING, Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -22,14 +22,14 @@ class ModelWithAdditionalPropertiesInlined:
"""
a_number: Union[Unset, float] = UNSET
- additional_properties: Dict[str, "ModelWithAdditionalPropertiesInlinedAdditionalProperty"] = _attrs_field(
+ additional_properties: dict[str, "ModelWithAdditionalPropertiesInlinedAdditionalProperty"] = _attrs_field(
init=False, factory=dict
)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a_number = self.a_number
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = prop.to_dict()
field_dict.update({})
@@ -39,7 +39,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.model_with_additional_properties_inlined_additional_property import (
ModelWithAdditionalPropertiesInlinedAdditionalProperty,
)
@@ -61,7 +61,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_additional_properties_inlined
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> "ModelWithAdditionalPropertiesInlinedAdditionalProperty":
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined_additional_property.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined_additional_property.py
index e06a94bfc..3bfffaf2c 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined_additional_property.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined_additional_property.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@ class ModelWithAdditionalPropertiesInlinedAdditionalProperty:
"""
extra_props_prop: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
extra_props_prop = self.extra_props_prop
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if extra_props_prop is not UNSET:
@@ -30,7 +30,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
extra_props_prop = d.pop("extra_props_prop", UNSET)
@@ -42,7 +42,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_additional_properties_inlined_additional_property
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_refed.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_refed.py
index b2500f68c..0b80a0076 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_refed.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_refed.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -12,17 +12,17 @@
class ModelWithAdditionalPropertiesRefed:
""" """
- additional_properties: Dict[str, AnEnum] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, AnEnum] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = prop.value
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
model_with_additional_properties_refed = cls()
@@ -36,7 +36,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_additional_properties_refed
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> AnEnum:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties.py
index 6e669914a..f71fe7c1e 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union, cast
+from typing import TYPE_CHECKING, Any, TypeVar, Union, cast
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,16 +16,16 @@
class ModelWithAnyJsonProperties:
""" """
- additional_properties: Dict[
- str, Union["ModelWithAnyJsonPropertiesAdditionalPropertyType0", List[str], bool, float, int, str]
+ additional_properties: dict[
+ str, Union["ModelWithAnyJsonPropertiesAdditionalPropertyType0", bool, float, int, list[str], str]
] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
from ..models.model_with_any_json_properties_additional_property_type_0 import (
ModelWithAnyJsonPropertiesAdditionalPropertyType0,
)
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
if isinstance(prop, ModelWithAnyJsonPropertiesAdditionalPropertyType0):
field_dict[prop_name] = prop.to_dict()
@@ -38,7 +38,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.model_with_any_json_properties_additional_property_type_0 import (
ModelWithAnyJsonPropertiesAdditionalPropertyType0,
)
@@ -51,7 +51,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
def _parse_additional_property(
data: object,
- ) -> Union["ModelWithAnyJsonPropertiesAdditionalPropertyType0", List[str], bool, float, int, str]:
+ ) -> Union["ModelWithAnyJsonPropertiesAdditionalPropertyType0", bool, float, int, list[str], str]:
try:
if not isinstance(data, dict):
raise TypeError()
@@ -63,13 +63,13 @@ def _parse_additional_property(
try:
if not isinstance(data, list):
raise TypeError()
- additional_property_type_1 = cast(List[str], data)
+ additional_property_type_1 = cast(list[str], data)
return additional_property_type_1
except: # noqa: E722
pass
return cast(
- Union["ModelWithAnyJsonPropertiesAdditionalPropertyType0", List[str], bool, float, int, str], data
+ Union["ModelWithAnyJsonPropertiesAdditionalPropertyType0", bool, float, int, list[str], str], data
)
additional_property = _parse_additional_property(prop_dict)
@@ -80,18 +80,18 @@ def _parse_additional_property(
return model_with_any_json_properties
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(
self, key: str
- ) -> Union["ModelWithAnyJsonPropertiesAdditionalPropertyType0", List[str], bool, float, int, str]:
+ ) -> Union["ModelWithAnyJsonPropertiesAdditionalPropertyType0", bool, float, int, list[str], str]:
return self.additional_properties[key]
def __setitem__(
self,
key: str,
- value: Union["ModelWithAnyJsonPropertiesAdditionalPropertyType0", List[str], bool, float, int, str],
+ value: Union["ModelWithAnyJsonPropertiesAdditionalPropertyType0", bool, float, int, list[str], str],
) -> None:
self.additional_properties[key] = value
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties_additional_property_type_0.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties_additional_property_type_0.py
index 6ae70905e..65993e8be 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties_additional_property_type_0.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties_additional_property_type_0.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -10,16 +10,16 @@
class ModelWithAnyJsonPropertiesAdditionalPropertyType0:
""" """
- additional_properties: Dict[str, str] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, str] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
model_with_any_json_properties_additional_property_type_0 = cls()
@@ -27,7 +27,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_any_json_properties_additional_property_type_0
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> str:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_backslash_in_description.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_backslash_in_description.py
index 5de43ddb9..0b5dfc3b5 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_backslash_in_description.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_backslash_in_description.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -12,16 +12,16 @@ class ModelWithBackslashInDescription:
"""
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
model_with_backslash_in_description = cls()
@@ -29,7 +29,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_backslash_in_description
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_a.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_a.py
index 73cfb1287..3253c520b 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_a.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_a.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union
+from typing import TYPE_CHECKING, Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -20,14 +20,14 @@ class ModelWithCircularRefA:
"""
circular: Union[Unset, "ModelWithCircularRefB"] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- circular: Union[Unset, Dict[str, Any]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ circular: Union[Unset, dict[str, Any]] = UNSET
if not isinstance(self.circular, Unset):
circular = self.circular.to_dict()
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if circular is not UNSET:
@@ -36,7 +36,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.model_with_circular_ref_b import ModelWithCircularRefB
d = src_dict.copy()
@@ -55,7 +55,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_circular_ref_a
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_b.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_b.py
index 0628d89ae..89c3a064c 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_b.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_b.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union
+from typing import TYPE_CHECKING, Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -20,14 +20,14 @@ class ModelWithCircularRefB:
"""
circular: Union[Unset, "ModelWithCircularRefA"] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- circular: Union[Unset, Dict[str, Any]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ circular: Union[Unset, dict[str, Any]] = UNSET
if not isinstance(self.circular, Unset):
circular = self.circular.to_dict()
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if circular is not UNSET:
@@ -36,7 +36,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.model_with_circular_ref_a import ModelWithCircularRefA
d = src_dict.copy()
@@ -55,7 +55,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_circular_ref_b
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_in_additional_properties_a.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_in_additional_properties_a.py
index 4f1d59c57..32cb687c7 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_in_additional_properties_a.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_in_additional_properties_a.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar
+from typing import TYPE_CHECKING, Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -14,19 +14,19 @@
class ModelWithCircularRefInAdditionalPropertiesA:
""" """
- additional_properties: Dict[str, "ModelWithCircularRefInAdditionalPropertiesB"] = _attrs_field(
+ additional_properties: dict[str, "ModelWithCircularRefInAdditionalPropertiesB"] = _attrs_field(
init=False, factory=dict
)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = prop.to_dict()
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.model_with_circular_ref_in_additional_properties_b import (
ModelWithCircularRefInAdditionalPropertiesB,
)
@@ -44,7 +44,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_circular_ref_in_additional_properties_a
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> "ModelWithCircularRefInAdditionalPropertiesB":
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_in_additional_properties_b.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_in_additional_properties_b.py
index 3f55584e5..d134a94b9 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_in_additional_properties_b.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_circular_ref_in_additional_properties_b.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar
+from typing import TYPE_CHECKING, Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -14,19 +14,19 @@
class ModelWithCircularRefInAdditionalPropertiesB:
""" """
- additional_properties: Dict[str, "ModelWithCircularRefInAdditionalPropertiesA"] = _attrs_field(
+ additional_properties: dict[str, "ModelWithCircularRefInAdditionalPropertiesA"] = _attrs_field(
init=False, factory=dict
)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = prop.to_dict()
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.model_with_circular_ref_in_additional_properties_a import (
ModelWithCircularRefInAdditionalPropertiesA,
)
@@ -44,7 +44,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_circular_ref_in_additional_properties_b
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> "ModelWithCircularRefInAdditionalPropertiesA":
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_date_time_property.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_date_time_property.py
index 658b2352d..f503af00a 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_date_time_property.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_date_time_property.py
@@ -1,5 +1,5 @@
import datetime
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -18,14 +18,14 @@ class ModelWithDateTimeProperty:
"""
datetime_: Union[Unset, datetime.datetime] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
datetime_: Union[Unset, str] = UNSET
if not isinstance(self.datetime_, Unset):
datetime_ = self.datetime_.isoformat()
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if datetime_ is not UNSET:
@@ -34,7 +34,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
_datetime_ = d.pop("datetime", UNSET)
datetime_: Union[Unset, datetime.datetime]
@@ -51,7 +51,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_date_time_property
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_discriminated_union.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_discriminated_union.py
index e03a6e698..93a3535db 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_discriminated_union.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_discriminated_union.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union, cast
+from typing import TYPE_CHECKING, Any, TypeVar, Union, cast
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -21,13 +21,13 @@ class ModelWithDiscriminatedUnion:
"""
discriminated_union: Union["ADiscriminatedUnionType1", "ADiscriminatedUnionType2", None, Unset] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
from ..models.a_discriminated_union_type_1 import ADiscriminatedUnionType1
from ..models.a_discriminated_union_type_2 import ADiscriminatedUnionType2
- discriminated_union: Union[Dict[str, Any], None, Unset]
+ discriminated_union: Union[None, Unset, dict[str, Any]]
if isinstance(self.discriminated_union, Unset):
discriminated_union = UNSET
elif isinstance(self.discriminated_union, ADiscriminatedUnionType1):
@@ -37,7 +37,7 @@ def to_dict(self) -> Dict[str, Any]:
else:
discriminated_union = self.discriminated_union
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if discriminated_union is not UNSET:
@@ -46,7 +46,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.a_discriminated_union_type_1 import ADiscriminatedUnionType1
from ..models.a_discriminated_union_type_2 import ADiscriminatedUnionType2
@@ -87,7 +87,7 @@ def _parse_discriminated_union(
return model_with_discriminated_union
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_merged_properties.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_merged_properties.py
index bcf1efa88..765d107d8 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_merged_properties.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_merged_properties.py
@@ -1,5 +1,5 @@
import datetime
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -28,9 +28,9 @@ class ModelWithMergedProperties:
string_to_date: Union[Unset, datetime.date] = UNSET
number_to_int: Union[Unset, int] = UNSET
any_to_string: Union[Unset, str] = "x"
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
simple_string = self.simple_string
string_to_enum: Union[Unset, str] = UNSET
@@ -45,7 +45,7 @@ def to_dict(self) -> Dict[str, Any]:
any_to_string = self.any_to_string
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if simple_string is not UNSET:
@@ -62,7 +62,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
simple_string = d.pop("simpleString", UNSET)
@@ -96,7 +96,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_merged_properties
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_no_properties.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_no_properties.py
index 506239f32..24e718e6d 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_no_properties.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_no_properties.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
@@ -9,13 +9,13 @@
class ModelWithNoProperties:
""" """
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
model_with_no_properties = cls()
return model_with_no_properties
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_primitive_additional_properties.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_primitive_additional_properties.py
index 94afa7653..db13972e9 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_primitive_additional_properties.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_primitive_additional_properties.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union
+from typing import TYPE_CHECKING, Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -22,14 +22,14 @@ class ModelWithPrimitiveAdditionalProperties:
"""
a_date_holder: Union[Unset, "ModelWithPrimitiveAdditionalPropertiesADateHolder"] = UNSET
- additional_properties: Dict[str, str] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, str] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- a_date_holder: Union[Unset, Dict[str, Any]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ a_date_holder: Union[Unset, dict[str, Any]] = UNSET
if not isinstance(self.a_date_holder, Unset):
a_date_holder = self.a_date_holder.to_dict()
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if a_date_holder is not UNSET:
@@ -38,7 +38,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.model_with_primitive_additional_properties_a_date_holder import (
ModelWithPrimitiveAdditionalPropertiesADateHolder,
)
@@ -59,7 +59,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_primitive_additional_properties
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> str:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_primitive_additional_properties_a_date_holder.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_primitive_additional_properties_a_date_holder.py
index b9920fc60..f53f968ac 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_primitive_additional_properties_a_date_holder.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_primitive_additional_properties_a_date_holder.py
@@ -1,5 +1,5 @@
import datetime
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -12,17 +12,17 @@
class ModelWithPrimitiveAdditionalPropertiesADateHolder:
""" """
- additional_properties: Dict[str, datetime.datetime] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, datetime.datetime] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = prop.isoformat()
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
model_with_primitive_additional_properties_a_date_holder = cls()
@@ -36,7 +36,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_primitive_additional_properties_a_date_holder
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> datetime.datetime:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_property_ref.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_property_ref.py
index f54afdee8..d8ef017e0 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_property_ref.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_property_ref.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union
+from typing import TYPE_CHECKING, Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -20,14 +20,14 @@ class ModelWithPropertyRef:
"""
inner: Union[Unset, "ModelName"] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- inner: Union[Unset, Dict[str, Any]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ inner: Union[Unset, dict[str, Any]] = UNSET
if not isinstance(self.inner, Unset):
inner = self.inner.to_dict()
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if inner is not UNSET:
@@ -36,7 +36,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.model_name import ModelName
d = src_dict.copy()
@@ -55,7 +55,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_property_ref
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_recursive_ref.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_recursive_ref.py
index 578bca7e0..f7370d6f1 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_recursive_ref.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_recursive_ref.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,14 +16,14 @@ class ModelWithRecursiveRef:
"""
recursive: Union[Unset, "ModelWithRecursiveRef"] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- recursive: Union[Unset, Dict[str, Any]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ recursive: Union[Unset, dict[str, Any]] = UNSET
if not isinstance(self.recursive, Unset):
recursive = self.recursive.to_dict()
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if recursive is not UNSET:
@@ -32,7 +32,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
_recursive = d.pop("recursive", UNSET)
recursive: Union[Unset, ModelWithRecursiveRef]
@@ -49,7 +49,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_recursive_ref
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_recursive_ref_in_additional_properties.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_recursive_ref_in_additional_properties.py
index 2ed2526f5..961b82697 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_recursive_ref_in_additional_properties.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_recursive_ref_in_additional_properties.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -10,19 +10,19 @@
class ModelWithRecursiveRefInAdditionalProperties:
""" """
- additional_properties: Dict[str, "ModelWithRecursiveRefInAdditionalProperties"] = _attrs_field(
+ additional_properties: dict[str, "ModelWithRecursiveRefInAdditionalProperties"] = _attrs_field(
init=False, factory=dict
)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = prop.to_dict()
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
model_with_recursive_ref_in_additional_properties = cls()
@@ -36,7 +36,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_recursive_ref_in_additional_properties
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> "ModelWithRecursiveRefInAdditionalProperties":
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property.py
index 890010b78..e818fc69b 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
@@ -18,7 +18,7 @@ class ModelWithUnionProperty:
a_property: Union[AnEnum, AnIntEnum, Unset] = UNSET
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a_property: Union[Unset, int, str]
if isinstance(self.a_property, Unset):
a_property = UNSET
@@ -27,7 +27,7 @@ def to_dict(self) -> Dict[str, Any]:
else:
a_property = self.a_property.value
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update({})
if a_property is not UNSET:
field_dict["a_property"] = a_property
@@ -35,7 +35,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
def _parse_a_property(data: object) -> Union[AnEnum, AnIntEnum, Unset]:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined.py
index 2a832e21a..659496eb6 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, Type, TypeVar, Union
+from typing import TYPE_CHECKING, Any, TypeVar, Union
from attrs import define as _attrs_define
@@ -21,10 +21,10 @@ class ModelWithUnionPropertyInlined:
fruit: Union["ModelWithUnionPropertyInlinedFruitType0", "ModelWithUnionPropertyInlinedFruitType1", Unset] = UNSET
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
from ..models.model_with_union_property_inlined_fruit_type_0 import ModelWithUnionPropertyInlinedFruitType0
- fruit: Union[Dict[str, Any], Unset]
+ fruit: Union[Unset, dict[str, Any]]
if isinstance(self.fruit, Unset):
fruit = UNSET
elif isinstance(self.fruit, ModelWithUnionPropertyInlinedFruitType0):
@@ -32,7 +32,7 @@ def to_dict(self) -> Dict[str, Any]:
else:
fruit = self.fruit.to_dict()
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update({})
if fruit is not UNSET:
field_dict["fruit"] = fruit
@@ -40,7 +40,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.model_with_union_property_inlined_fruit_type_0 import ModelWithUnionPropertyInlinedFruitType0
from ..models.model_with_union_property_inlined_fruit_type_1 import ModelWithUnionPropertyInlinedFruitType1
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_type_0.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_type_0.py
index b0f25360a..4678b4cef 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_type_0.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_type_0.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@ class ModelWithUnionPropertyInlinedFruitType0:
"""
apples: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
apples = self.apples
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if apples is not UNSET:
@@ -30,7 +30,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
apples = d.pop("apples", UNSET)
@@ -42,7 +42,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_union_property_inlined_fruit_type_0
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_type_1.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_type_1.py
index 1a32f2445..d70e54234 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_type_1.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_type_1.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@ class ModelWithUnionPropertyInlinedFruitType1:
"""
bananas: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
bananas = self.bananas
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if bananas is not UNSET:
@@ -30,7 +30,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
bananas = d.pop("bananas", UNSET)
@@ -42,7 +42,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return model_with_union_property_inlined_fruit_type_1
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/none.py b/end_to_end_tests/golden-record/my_test_api_client/models/none.py
index 3510497bf..23cb7d679 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/none.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/none.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -10,16 +10,16 @@
class None_:
""" """
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
none = cls()
@@ -27,7 +27,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return none
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/post_bodies_multiple_data_body.py b/end_to_end_tests/golden-record/my_test_api_client/models/post_bodies_multiple_data_body.py
index adc78cd6f..ba36efef2 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/post_bodies_multiple_data_body.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/post_bodies_multiple_data_body.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@ class PostBodiesMultipleDataBody:
"""
a: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a = self.a
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if a is not UNSET:
@@ -30,7 +30,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
a = d.pop("a", UNSET)
@@ -42,7 +42,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return post_bodies_multiple_data_body
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/post_bodies_multiple_files_body.py b/end_to_end_tests/golden-record/my_test_api_client/models/post_bodies_multiple_files_body.py
index c81dc7636..188abf39e 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/post_bodies_multiple_files_body.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/post_bodies_multiple_files_body.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@ class PostBodiesMultipleFilesBody:
"""
a: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a = self.a
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if a is not UNSET:
@@ -29,10 +29,10 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
- def to_multipart(self) -> Dict[str, Any]:
+ def to_multipart(self) -> dict[str, Any]:
a = self.a if isinstance(self.a, Unset) else (None, str(self.a).encode(), "text/plain")
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = (None, str(prop).encode(), "text/plain")
@@ -43,7 +43,7 @@ def to_multipart(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
a = d.pop("a", UNSET)
@@ -55,7 +55,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return post_bodies_multiple_files_body
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/post_bodies_multiple_json_body.py b/end_to_end_tests/golden-record/my_test_api_client/models/post_bodies_multiple_json_body.py
index 88e5ec6f9..f4e7ffaa6 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/post_bodies_multiple_json_body.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/post_bodies_multiple_json_body.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,12 +16,12 @@ class PostBodiesMultipleJsonBody:
"""
a: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a = self.a
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if a is not UNSET:
@@ -30,7 +30,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
a = d.pop("a", UNSET)
@@ -42,7 +42,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return post_bodies_multiple_json_body
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/post_form_data_inline_body.py b/end_to_end_tests/golden-record/my_test_api_client/models/post_form_data_inline_body.py
index 08a7bbc3a..07c3b2648 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/post_form_data_inline_body.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/post_form_data_inline_body.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -18,14 +18,14 @@ class PostFormDataInlineBody:
a_required_field: str
an_optional_field: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a_required_field = self.a_required_field
an_optional_field = self.an_optional_field
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
@@ -38,7 +38,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
a_required_field = d.pop("a_required_field")
@@ -53,7 +53,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return post_form_data_inline_body
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/post_naming_property_conflict_with_import_body.py b/end_to_end_tests/golden-record/my_test_api_client/models/post_naming_property_conflict_with_import_body.py
index ed2f8efa1..100e84dc9 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/post_naming_property_conflict_with_import_body.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/post_naming_property_conflict_with_import_body.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -18,14 +18,14 @@ class PostNamingPropertyConflictWithImportBody:
field: Union[Unset, str] = UNSET
define: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
field = self.field
define = self.define
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if field is not UNSET:
@@ -36,7 +36,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
field = d.pop("Field", UNSET)
@@ -51,7 +51,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return post_naming_property_conflict_with_import_body
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/post_naming_property_conflict_with_import_response_200.py b/end_to_end_tests/golden-record/my_test_api_client/models/post_naming_property_conflict_with_import_response_200.py
index 9bdd79a02..91c550749 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/post_naming_property_conflict_with_import_response_200.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/post_naming_property_conflict_with_import_response_200.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -18,14 +18,14 @@ class PostNamingPropertyConflictWithImportResponse200:
field: Union[Unset, str] = UNSET
define: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
field = self.field
define = self.define
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if field is not UNSET:
@@ -36,7 +36,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
field = d.pop("Field", UNSET)
@@ -51,7 +51,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return post_naming_property_conflict_with_import_response_200
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/post_responses_unions_simple_before_complex_response_200.py b/end_to_end_tests/golden-record/my_test_api_client/models/post_responses_unions_simple_before_complex_response_200.py
index 0b6a29243..9962f552c 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/post_responses_unions_simple_before_complex_response_200.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/post_responses_unions_simple_before_complex_response_200.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union, cast
+from typing import TYPE_CHECKING, Any, TypeVar, Union, cast
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -20,20 +20,20 @@ class PostResponsesUnionsSimpleBeforeComplexResponse200:
"""
a: Union["PostResponsesUnionsSimpleBeforeComplexResponse200AType1", str]
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
from ..models.post_responses_unions_simple_before_complex_response_200a_type_1 import (
PostResponsesUnionsSimpleBeforeComplexResponse200AType1,
)
- a: Union[Dict[str, Any], str]
+ a: Union[dict[str, Any], str]
if isinstance(self.a, PostResponsesUnionsSimpleBeforeComplexResponse200AType1):
a = self.a.to_dict()
else:
a = self.a
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
@@ -44,7 +44,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.post_responses_unions_simple_before_complex_response_200a_type_1 import (
PostResponsesUnionsSimpleBeforeComplexResponse200AType1,
)
@@ -72,7 +72,7 @@ def _parse_a(data: object) -> Union["PostResponsesUnionsSimpleBeforeComplexRespo
return post_responses_unions_simple_before_complex_response_200
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/post_responses_unions_simple_before_complex_response_200a_type_1.py b/end_to_end_tests/golden-record/my_test_api_client/models/post_responses_unions_simple_before_complex_response_200a_type_1.py
index 601d17cf8..5e8ef0207 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/post_responses_unions_simple_before_complex_response_200a_type_1.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/post_responses_unions_simple_before_complex_response_200a_type_1.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -10,16 +10,16 @@
class PostResponsesUnionsSimpleBeforeComplexResponse200AType1:
""" """
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- field_dict: Dict[str, Any] = {}
+ def to_dict(self) -> dict[str, Any]:
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
post_responses_unions_simple_before_complex_response_200a_type_1 = cls()
@@ -27,7 +27,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return post_responses_unions_simple_before_complex_response_200a_type_1
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/test_inline_objects_body.py b/end_to_end_tests/golden-record/my_test_api_client/models/test_inline_objects_body.py
index 8c1843b41..721011eed 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/test_inline_objects_body.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/test_inline_objects_body.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
@@ -16,10 +16,10 @@ class TestInlineObjectsBody:
a_property: Union[Unset, str] = UNSET
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a_property = self.a_property
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update({})
if a_property is not UNSET:
field_dict["a_property"] = a_property
@@ -27,7 +27,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
a_property = d.pop("a_property", UNSET)
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/test_inline_objects_response_200.py b/end_to_end_tests/golden-record/my_test_api_client/models/test_inline_objects_response_200.py
index 6a0ade77f..2cf353587 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/test_inline_objects_response_200.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/test_inline_objects_response_200.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
@@ -16,10 +16,10 @@ class TestInlineObjectsResponse200:
a_property: Union[Unset, str] = UNSET
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a_property = self.a_property
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update({})
if a_property is not UNSET:
field_dict["a_property"] = a_property
@@ -27,7 +27,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
a_property = d.pop("a_property", UNSET)
diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/validation_error.py b/end_to_end_tests/golden-record/my_test_api_client/models/validation_error.py
index 6ff5d4790..112808e62 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/models/validation_error.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/models/validation_error.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, cast
+from typing import Any, TypeVar, cast
from attrs import define as _attrs_define
@@ -9,46 +9,46 @@
class ValidationError:
"""
Attributes:
- loc (List[str]):
+ loc (list[str]):
msg (str):
- type (str):
+ type_ (str):
"""
- loc: List[str]
+ loc: list[str]
msg: str
- type: str
+ type_: str
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
loc = self.loc
msg = self.msg
- type = self.type
+ type_ = self.type_
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(
{
"loc": loc,
"msg": msg,
- "type": type,
+ "type": type_,
}
)
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
- loc = cast(List[str], d.pop("loc"))
+ loc = cast(list[str], d.pop("loc"))
msg = d.pop("msg")
- type = d.pop("type")
+ type_ = d.pop("type")
validation_error = cls(
loc=loc,
msg=msg,
- type=type,
+ type_=type_,
)
return validation_error
diff --git a/end_to_end_tests/golden-record/my_test_api_client/types.py b/end_to_end_tests/golden-record/my_test_api_client/types.py
index 21fac106f..fc557103e 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/types.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/types.py
@@ -1,7 +1,8 @@
"""Contains some shared types for properties"""
+from collections.abc import MutableMapping
from http import HTTPStatus
-from typing import BinaryIO, Generic, Literal, MutableMapping, Optional, Tuple, TypeVar
+from typing import BinaryIO, Generic, Literal, Optional, TypeVar
from attrs import define
@@ -13,7 +14,7 @@ def __bool__(self) -> Literal[False]:
UNSET: Unset = Unset()
-FileJsonType = Tuple[Optional[str], BinaryIO, Optional[str]]
+FileJsonType = tuple[Optional[str], BinaryIO, Optional[str]]
@define
diff --git a/end_to_end_tests/golden-record/pyproject.toml b/end_to_end_tests/golden-record/pyproject.toml
index 526beacf6..d4d3f8766 100644
--- a/end_to_end_tests/golden-record/pyproject.toml
+++ b/end_to_end_tests/golden-record/pyproject.toml
@@ -11,7 +11,7 @@ include = ["CHANGELOG.md", "my_test_api_client/py.typed"]
[tool.poetry.dependencies]
-python = "^3.8"
+python = "^3.9"
httpx = ">=0.20.0,<0.28.0"
attrs = ">=21.3.0"
python-dateutil = "^2.8.0"
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/enums/bool_enum_tests_bool_enum_post.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/enums/bool_enum_tests_bool_enum_post.py
index 851cdf385..52385855c 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/enums/bool_enum_tests_bool_enum_post.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/enums/bool_enum_tests_bool_enum_post.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -11,14 +11,14 @@
def _get_kwargs(
*,
bool_enum: bool,
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
params["bool_enum"] = bool_enum
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/enum/bool",
"params": params,
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/enums/int_enum_tests_int_enum_post.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/enums/int_enum_tests_int_enum_post.py
index 5f9f7f8e5..af4c4ca22 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/enums/int_enum_tests_int_enum_post.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/enums/int_enum_tests_int_enum_post.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -12,15 +12,15 @@
def _get_kwargs(
*,
int_enum: AnIntEnum,
-) -> Dict[str, Any]:
- params: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ params: dict[str, Any] = {}
json_int_enum: int = int_enum
params["int_enum"] = json_int_enum
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/enum/int",
"params": params,
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/tests/get_user_list.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/tests/get_user_list.py
index ab60a4610..00bc801d9 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/tests/get_user_list.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/tests/get_user_list.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, List, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -17,20 +17,20 @@
def _get_kwargs(
*,
- an_enum_value: List[AnEnum],
- an_enum_value_with_null: List[Union[AnEnumWithNull, None]],
- an_enum_value_with_only_null: List[None],
+ an_enum_value: list[AnEnum],
+ an_enum_value_with_null: list[Union[AnEnumWithNull, None]],
+ an_enum_value_with_only_null: list[None],
int_enum_header: Union[Unset, GetUserListIntEnumHeader] = UNSET,
string_enum_header: Union[Unset, GetUserListStringEnumHeader] = UNSET,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
if not isinstance(int_enum_header, Unset):
headers["Int-Enum-Header"] = str(int_enum_header)
if not isinstance(string_enum_header, Unset):
headers["String-Enum-Header"] = str(string_enum_header)
- params: Dict[str, Any] = {}
+ params: dict[str, Any] = {}
json_an_enum_value = []
for an_enum_value_item_data in an_enum_value:
@@ -56,7 +56,7 @@ def _get_kwargs(
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "get",
"url": "/tests/",
"params": params,
@@ -68,7 +68,7 @@ def _get_kwargs(
def _parse_response(
*, client: Union[AuthenticatedClient, Client], response: httpx.Response
-) -> Optional[List["AModel"]]:
+) -> Optional[list["AModel"]]:
if response.status_code == 200:
response_200 = []
_response_200 = response.json()
@@ -86,7 +86,7 @@ def _parse_response(
def _build_response(
*, client: Union[AuthenticatedClient, Client], response: httpx.Response
-) -> Response[List["AModel"]]:
+) -> Response[list["AModel"]]:
return Response(
status_code=HTTPStatus(response.status_code),
content=response.content,
@@ -98,20 +98,20 @@ def _build_response(
def sync_detailed(
*,
client: Union[AuthenticatedClient, Client],
- an_enum_value: List[AnEnum],
- an_enum_value_with_null: List[Union[AnEnumWithNull, None]],
- an_enum_value_with_only_null: List[None],
+ an_enum_value: list[AnEnum],
+ an_enum_value_with_null: list[Union[AnEnumWithNull, None]],
+ an_enum_value_with_only_null: list[None],
int_enum_header: Union[Unset, GetUserListIntEnumHeader] = UNSET,
string_enum_header: Union[Unset, GetUserListStringEnumHeader] = UNSET,
-) -> Response[List["AModel"]]:
+) -> Response[list["AModel"]]:
"""Get List
Get a list of things
Args:
- an_enum_value (List[AnEnum]):
- an_enum_value_with_null (List[Union[AnEnumWithNull, None]]):
- an_enum_value_with_only_null (List[None]):
+ an_enum_value (list[AnEnum]):
+ an_enum_value_with_null (list[Union[AnEnumWithNull, None]]):
+ an_enum_value_with_only_null (list[None]):
int_enum_header (Union[Unset, GetUserListIntEnumHeader]):
string_enum_header (Union[Unset, GetUserListStringEnumHeader]):
@@ -120,7 +120,7 @@ def sync_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[List['AModel']]
+ Response[list['AModel']]
"""
kwargs = _get_kwargs(
@@ -141,20 +141,20 @@ def sync_detailed(
def sync(
*,
client: Union[AuthenticatedClient, Client],
- an_enum_value: List[AnEnum],
- an_enum_value_with_null: List[Union[AnEnumWithNull, None]],
- an_enum_value_with_only_null: List[None],
+ an_enum_value: list[AnEnum],
+ an_enum_value_with_null: list[Union[AnEnumWithNull, None]],
+ an_enum_value_with_only_null: list[None],
int_enum_header: Union[Unset, GetUserListIntEnumHeader] = UNSET,
string_enum_header: Union[Unset, GetUserListStringEnumHeader] = UNSET,
-) -> Optional[List["AModel"]]:
+) -> Optional[list["AModel"]]:
"""Get List
Get a list of things
Args:
- an_enum_value (List[AnEnum]):
- an_enum_value_with_null (List[Union[AnEnumWithNull, None]]):
- an_enum_value_with_only_null (List[None]):
+ an_enum_value (list[AnEnum]):
+ an_enum_value_with_null (list[Union[AnEnumWithNull, None]]):
+ an_enum_value_with_only_null (list[None]):
int_enum_header (Union[Unset, GetUserListIntEnumHeader]):
string_enum_header (Union[Unset, GetUserListStringEnumHeader]):
@@ -163,7 +163,7 @@ def sync(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- List['AModel']
+ list['AModel']
"""
return sync_detailed(
@@ -179,20 +179,20 @@ def sync(
async def asyncio_detailed(
*,
client: Union[AuthenticatedClient, Client],
- an_enum_value: List[AnEnum],
- an_enum_value_with_null: List[Union[AnEnumWithNull, None]],
- an_enum_value_with_only_null: List[None],
+ an_enum_value: list[AnEnum],
+ an_enum_value_with_null: list[Union[AnEnumWithNull, None]],
+ an_enum_value_with_only_null: list[None],
int_enum_header: Union[Unset, GetUserListIntEnumHeader] = UNSET,
string_enum_header: Union[Unset, GetUserListStringEnumHeader] = UNSET,
-) -> Response[List["AModel"]]:
+) -> Response[list["AModel"]]:
"""Get List
Get a list of things
Args:
- an_enum_value (List[AnEnum]):
- an_enum_value_with_null (List[Union[AnEnumWithNull, None]]):
- an_enum_value_with_only_null (List[None]):
+ an_enum_value (list[AnEnum]):
+ an_enum_value_with_null (list[Union[AnEnumWithNull, None]]):
+ an_enum_value_with_only_null (list[None]):
int_enum_header (Union[Unset, GetUserListIntEnumHeader]):
string_enum_header (Union[Unset, GetUserListStringEnumHeader]):
@@ -201,7 +201,7 @@ async def asyncio_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[List['AModel']]
+ Response[list['AModel']]
"""
kwargs = _get_kwargs(
@@ -220,20 +220,20 @@ async def asyncio_detailed(
async def asyncio(
*,
client: Union[AuthenticatedClient, Client],
- an_enum_value: List[AnEnum],
- an_enum_value_with_null: List[Union[AnEnumWithNull, None]],
- an_enum_value_with_only_null: List[None],
+ an_enum_value: list[AnEnum],
+ an_enum_value_with_null: list[Union[AnEnumWithNull, None]],
+ an_enum_value_with_only_null: list[None],
int_enum_header: Union[Unset, GetUserListIntEnumHeader] = UNSET,
string_enum_header: Union[Unset, GetUserListStringEnumHeader] = UNSET,
-) -> Optional[List["AModel"]]:
+) -> Optional[list["AModel"]]:
"""Get List
Get a list of things
Args:
- an_enum_value (List[AnEnum]):
- an_enum_value_with_null (List[Union[AnEnumWithNull, None]]):
- an_enum_value_with_only_null (List[None]):
+ an_enum_value (list[AnEnum]):
+ an_enum_value_with_null (list[Union[AnEnumWithNull, None]]):
+ an_enum_value_with_only_null (list[None]):
int_enum_header (Union[Unset, GetUserListIntEnumHeader]):
string_enum_header (Union[Unset, GetUserListStringEnumHeader]):
@@ -242,7 +242,7 @@ async def asyncio(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- List['AModel']
+ list['AModel']
"""
return (
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/tests/post_user_list.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/tests/post_user_list.py
index 3cbdeddf8..82df1a8f8 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/tests/post_user_list.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/api/tests/post_user_list.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, List, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -13,10 +13,10 @@
def _get_kwargs(
*,
body: PostUserListBody,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/tests/",
}
@@ -31,7 +31,7 @@ def _get_kwargs(
def _parse_response(
*, client: Union[AuthenticatedClient, Client], response: httpx.Response
-) -> Optional[List["AModel"]]:
+) -> Optional[list["AModel"]]:
if response.status_code == 200:
response_200 = []
_response_200 = response.json()
@@ -49,7 +49,7 @@ def _parse_response(
def _build_response(
*, client: Union[AuthenticatedClient, Client], response: httpx.Response
-) -> Response[List["AModel"]]:
+) -> Response[list["AModel"]]:
return Response(
status_code=HTTPStatus(response.status_code),
content=response.content,
@@ -62,7 +62,7 @@ def sync_detailed(
*,
client: Union[AuthenticatedClient, Client],
body: PostUserListBody,
-) -> Response[List["AModel"]]:
+) -> Response[list["AModel"]]:
"""Post List
Post a list of things
@@ -75,7 +75,7 @@ def sync_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[List['AModel']]
+ Response[list['AModel']]
"""
kwargs = _get_kwargs(
@@ -93,7 +93,7 @@ def sync(
*,
client: Union[AuthenticatedClient, Client],
body: PostUserListBody,
-) -> Optional[List["AModel"]]:
+) -> Optional[list["AModel"]]:
"""Post List
Post a list of things
@@ -106,7 +106,7 @@ def sync(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- List['AModel']
+ list['AModel']
"""
return sync_detailed(
@@ -119,7 +119,7 @@ async def asyncio_detailed(
*,
client: Union[AuthenticatedClient, Client],
body: PostUserListBody,
-) -> Response[List["AModel"]]:
+) -> Response[list["AModel"]]:
"""Post List
Post a list of things
@@ -132,7 +132,7 @@ async def asyncio_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[List['AModel']]
+ Response[list['AModel']]
"""
kwargs = _get_kwargs(
@@ -148,7 +148,7 @@ async def asyncio(
*,
client: Union[AuthenticatedClient, Client],
body: PostUserListBody,
-) -> Optional[List["AModel"]]:
+) -> Optional[list["AModel"]]:
"""Post List
Post a list of things
@@ -161,7 +161,7 @@ async def asyncio(
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- List['AModel']
+ list['AModel']
"""
return (
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/client.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/client.py
index 0f6d15e84..e80446f10 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/client.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/client.py
@@ -1,5 +1,5 @@
import ssl
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
from attrs import define, evolve, field
@@ -36,16 +36,16 @@ class Client:
raise_on_unexpected_status: bool = field(default=False, kw_only=True)
_base_url: str = field(alias="base_url")
- _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
- _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
+ _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
+ _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True, alias="timeout")
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(default=True, kw_only=True, alias="verify_ssl")
_follow_redirects: bool = field(default=False, kw_only=True, alias="follow_redirects")
- _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
+ _httpx_args: dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
_client: Optional[httpx.Client] = field(default=None, init=False)
_async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
- def with_headers(self, headers: Dict[str, str]) -> "Client":
+ def with_headers(self, headers: dict[str, str]) -> "Client":
"""Get a new client matching this one with additional headers"""
if self._client is not None:
self._client.headers.update(headers)
@@ -53,7 +53,7 @@ def with_headers(self, headers: Dict[str, str]) -> "Client":
self._async_client.headers.update(headers)
return evolve(self, headers={**self._headers, **headers})
- def with_cookies(self, cookies: Dict[str, str]) -> "Client":
+ def with_cookies(self, cookies: dict[str, str]) -> "Client":
"""Get a new client matching this one with additional cookies"""
if self._client is not None:
self._client.cookies.update(cookies)
@@ -166,12 +166,12 @@ class AuthenticatedClient:
raise_on_unexpected_status: bool = field(default=False, kw_only=True)
_base_url: str = field(alias="base_url")
- _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
- _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
+ _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
+ _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True, alias="timeout")
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(default=True, kw_only=True, alias="verify_ssl")
_follow_redirects: bool = field(default=False, kw_only=True, alias="follow_redirects")
- _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
+ _httpx_args: dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
_client: Optional[httpx.Client] = field(default=None, init=False)
_async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
@@ -179,7 +179,7 @@ class AuthenticatedClient:
prefix: str = "Bearer"
auth_header_name: str = "Authorization"
- def with_headers(self, headers: Dict[str, str]) -> "AuthenticatedClient":
+ def with_headers(self, headers: dict[str, str]) -> "AuthenticatedClient":
"""Get a new client matching this one with additional headers"""
if self._client is not None:
self._client.headers.update(headers)
@@ -187,7 +187,7 @@ def with_headers(self, headers: Dict[str, str]) -> "AuthenticatedClient":
self._async_client.headers.update(headers)
return evolve(self, headers={**self._headers, **headers})
- def with_cookies(self, cookies: Dict[str, str]) -> "AuthenticatedClient":
+ def with_cookies(self, cookies: dict[str, str]) -> "AuthenticatedClient":
"""Get a new client matching this one with additional cookies"""
if self._client is not None:
self._client.cookies.update(cookies)
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/a_model.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/a_model.py
index e05fdaa6d..7050c1a3c 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/a_model.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/a_model.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
@@ -19,16 +19,16 @@ class AModel:
an_allof_enum_with_overridden_default (AnAllOfEnum): Default: 'overridden_default'.
any_value (Union[Unset, Any]):
an_optional_allof_enum (Union[Unset, AnAllOfEnum]):
- nested_list_of_enums (Union[Unset, List[List[DifferentEnum]]]):
+ nested_list_of_enums (Union[Unset, list[list[DifferentEnum]]]):
"""
an_enum_value: AnEnum
an_allof_enum_with_overridden_default: AnAllOfEnum = "overridden_default"
any_value: Union[Unset, Any] = UNSET
an_optional_allof_enum: Union[Unset, AnAllOfEnum] = UNSET
- nested_list_of_enums: Union[Unset, List[List[DifferentEnum]]] = UNSET
+ nested_list_of_enums: Union[Unset, list[list[DifferentEnum]]] = UNSET
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
an_enum_value: str = self.an_enum_value
an_allof_enum_with_overridden_default: str = self.an_allof_enum_with_overridden_default
@@ -39,7 +39,7 @@ def to_dict(self) -> Dict[str, Any]:
if not isinstance(self.an_optional_allof_enum, Unset):
an_optional_allof_enum = self.an_optional_allof_enum
- nested_list_of_enums: Union[Unset, List[List[str]]] = UNSET
+ nested_list_of_enums: Union[Unset, list[list[str]]] = UNSET
if not isinstance(self.nested_list_of_enums, Unset):
nested_list_of_enums = []
for nested_list_of_enums_item_data in self.nested_list_of_enums:
@@ -50,7 +50,7 @@ def to_dict(self) -> Dict[str, Any]:
nested_list_of_enums.append(nested_list_of_enums_item)
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(
{
"an_enum_value": an_enum_value,
@@ -67,7 +67,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
an_enum_value = check_an_enum(d.pop("an_enum_value"))
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_all_of_enum.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_all_of_enum.py
index e238b15a9..3455e04d0 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_all_of_enum.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_all_of_enum.py
@@ -1,8 +1,8 @@
-from typing import Literal, Set, cast
+from typing import Literal, cast
AnAllOfEnum = Literal["a_default", "bar", "foo", "overridden_default"]
-AN_ALL_OF_ENUM_VALUES: Set[AnAllOfEnum] = {
+AN_ALL_OF_ENUM_VALUES: set[AnAllOfEnum] = {
"a_default",
"bar",
"foo",
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_enum.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_enum.py
index 608b22fc4..27b5c45f9 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_enum.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_enum.py
@@ -1,8 +1,8 @@
-from typing import Literal, Set, cast
+from typing import Literal, cast
AnEnum = Literal["FIRST_VALUE", "SECOND_VALUE"]
-AN_ENUM_VALUES: Set[AnEnum] = {
+AN_ENUM_VALUES: set[AnEnum] = {
"FIRST_VALUE",
"SECOND_VALUE",
}
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_enum_with_null.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_enum_with_null.py
index 1519ec27c..4203876de 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_enum_with_null.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_enum_with_null.py
@@ -1,8 +1,8 @@
-from typing import Literal, Set, cast
+from typing import Literal, cast
AnEnumWithNull = Literal["FIRST_VALUE", "SECOND_VALUE"]
-AN_ENUM_WITH_NULL_VALUES: Set[AnEnumWithNull] = {
+AN_ENUM_WITH_NULL_VALUES: set[AnEnumWithNull] = {
"FIRST_VALUE",
"SECOND_VALUE",
}
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_int_enum.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_int_enum.py
index a3c1108ea..9d0abd942 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_int_enum.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/an_int_enum.py
@@ -1,8 +1,8 @@
-from typing import Literal, Set, cast
+from typing import Literal, cast
AnIntEnum = Literal[-1, 1, 2]
-AN_INT_ENUM_VALUES: Set[AnIntEnum] = {
+AN_INT_ENUM_VALUES: set[AnIntEnum] = {
-1,
1,
2,
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/different_enum.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/different_enum.py
index d40045c50..e672a9821 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/different_enum.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/different_enum.py
@@ -1,8 +1,8 @@
-from typing import Literal, Set, cast
+from typing import Literal, cast
DifferentEnum = Literal["DIFFERENT", "OTHER"]
-DIFFERENT_ENUM_VALUES: Set[DifferentEnum] = {
+DIFFERENT_ENUM_VALUES: set[DifferentEnum] = {
"DIFFERENT",
"OTHER",
}
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/get_user_list_int_enum_header.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/get_user_list_int_enum_header.py
index 50e8114ae..845d6c2a0 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/get_user_list_int_enum_header.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/get_user_list_int_enum_header.py
@@ -1,8 +1,8 @@
-from typing import Literal, Set, cast
+from typing import Literal, cast
GetUserListIntEnumHeader = Literal[1, 2, 3]
-GET_USER_LIST_INT_ENUM_HEADER_VALUES: Set[GetUserListIntEnumHeader] = {
+GET_USER_LIST_INT_ENUM_HEADER_VALUES: set[GetUserListIntEnumHeader] = {
1,
2,
3,
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/get_user_list_string_enum_header.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/get_user_list_string_enum_header.py
index d73cea6a6..55dbbad62 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/get_user_list_string_enum_header.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/get_user_list_string_enum_header.py
@@ -1,8 +1,8 @@
-from typing import Literal, Set, cast
+from typing import Literal, cast
GetUserListStringEnumHeader = Literal["one", "three", "two"]
-GET_USER_LIST_STRING_ENUM_HEADER_VALUES: Set[GetUserListStringEnumHeader] = {
+GET_USER_LIST_STRING_ENUM_HEADER_VALUES: set[GetUserListStringEnumHeader] = {
"one",
"three",
"two",
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/post_user_list_body.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/post_user_list_body.py
index e61cb4183..5566f1b3b 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/post_user_list_body.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/models/post_user_list_body.py
@@ -1,5 +1,5 @@
import json
-from typing import Any, Dict, List, Tuple, Type, TypeVar, Union, cast
+from typing import Any, TypeVar, Union, cast
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -17,31 +17,31 @@
class PostUserListBody:
"""
Attributes:
- an_enum_value (Union[Unset, List[AnEnum]]):
- an_enum_value_with_null (Union[Unset, List[Union[AnEnumWithNull, None]]]):
- an_enum_value_with_only_null (Union[Unset, List[None]]):
+ an_enum_value (Union[Unset, list[AnEnum]]):
+ an_enum_value_with_null (Union[Unset, list[Union[AnEnumWithNull, None]]]):
+ an_enum_value_with_only_null (Union[Unset, list[None]]):
an_allof_enum_with_overridden_default (Union[Unset, AnAllOfEnum]): Default: 'overridden_default'.
an_optional_allof_enum (Union[Unset, AnAllOfEnum]):
- nested_list_of_enums (Union[Unset, List[List[DifferentEnum]]]):
+ nested_list_of_enums (Union[Unset, list[list[DifferentEnum]]]):
"""
- an_enum_value: Union[Unset, List[AnEnum]] = UNSET
- an_enum_value_with_null: Union[Unset, List[Union[AnEnumWithNull, None]]] = UNSET
- an_enum_value_with_only_null: Union[Unset, List[None]] = UNSET
+ an_enum_value: Union[Unset, list[AnEnum]] = UNSET
+ an_enum_value_with_null: Union[Unset, list[Union[AnEnumWithNull, None]]] = UNSET
+ an_enum_value_with_only_null: Union[Unset, list[None]] = UNSET
an_allof_enum_with_overridden_default: Union[Unset, AnAllOfEnum] = "overridden_default"
an_optional_allof_enum: Union[Unset, AnAllOfEnum] = UNSET
- nested_list_of_enums: Union[Unset, List[List[DifferentEnum]]] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ nested_list_of_enums: Union[Unset, list[list[DifferentEnum]]] = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- an_enum_value: Union[Unset, List[str]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ an_enum_value: Union[Unset, list[str]] = UNSET
if not isinstance(self.an_enum_value, Unset):
an_enum_value = []
for an_enum_value_item_data in self.an_enum_value:
an_enum_value_item: str = an_enum_value_item_data
an_enum_value.append(an_enum_value_item)
- an_enum_value_with_null: Union[Unset, List[Union[None, str]]] = UNSET
+ an_enum_value_with_null: Union[Unset, list[Union[None, str]]] = UNSET
if not isinstance(self.an_enum_value_with_null, Unset):
an_enum_value_with_null = []
for an_enum_value_with_null_item_data in self.an_enum_value_with_null:
@@ -52,7 +52,7 @@ def to_dict(self) -> Dict[str, Any]:
an_enum_value_with_null_item = an_enum_value_with_null_item_data
an_enum_value_with_null.append(an_enum_value_with_null_item)
- an_enum_value_with_only_null: Union[Unset, List[None]] = UNSET
+ an_enum_value_with_only_null: Union[Unset, list[None]] = UNSET
if not isinstance(self.an_enum_value_with_only_null, Unset):
an_enum_value_with_only_null = self.an_enum_value_with_only_null
@@ -64,7 +64,7 @@ def to_dict(self) -> Dict[str, Any]:
if not isinstance(self.an_optional_allof_enum, Unset):
an_optional_allof_enum = self.an_optional_allof_enum
- nested_list_of_enums: Union[Unset, List[List[str]]] = UNSET
+ nested_list_of_enums: Union[Unset, list[list[str]]] = UNSET
if not isinstance(self.nested_list_of_enums, Unset):
nested_list_of_enums = []
for nested_list_of_enums_item_data in self.nested_list_of_enums:
@@ -75,7 +75,7 @@ def to_dict(self) -> Dict[str, Any]:
nested_list_of_enums.append(nested_list_of_enums_item)
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if an_enum_value is not UNSET:
@@ -93,8 +93,8 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
- def to_multipart(self) -> Dict[str, Any]:
- an_enum_value: Union[Unset, Tuple[None, bytes, str]] = UNSET
+ def to_multipart(self) -> dict[str, Any]:
+ an_enum_value: Union[Unset, tuple[None, bytes, str]] = UNSET
if not isinstance(self.an_enum_value, Unset):
_temp_an_enum_value = []
for an_enum_value_item_data in self.an_enum_value:
@@ -102,7 +102,7 @@ def to_multipart(self) -> Dict[str, Any]:
_temp_an_enum_value.append(an_enum_value_item)
an_enum_value = (None, json.dumps(_temp_an_enum_value).encode(), "application/json")
- an_enum_value_with_null: Union[Unset, Tuple[None, bytes, str]] = UNSET
+ an_enum_value_with_null: Union[Unset, tuple[None, bytes, str]] = UNSET
if not isinstance(self.an_enum_value_with_null, Unset):
_temp_an_enum_value_with_null = []
for an_enum_value_with_null_item_data in self.an_enum_value_with_null:
@@ -114,7 +114,7 @@ def to_multipart(self) -> Dict[str, Any]:
_temp_an_enum_value_with_null.append(an_enum_value_with_null_item)
an_enum_value_with_null = (None, json.dumps(_temp_an_enum_value_with_null).encode(), "application/json")
- an_enum_value_with_only_null: Union[Unset, Tuple[None, bytes, str]] = UNSET
+ an_enum_value_with_only_null: Union[Unset, tuple[None, bytes, str]] = UNSET
if not isinstance(self.an_enum_value_with_only_null, Unset):
_temp_an_enum_value_with_only_null = self.an_enum_value_with_only_null
an_enum_value_with_only_null = (
@@ -123,7 +123,7 @@ def to_multipart(self) -> Dict[str, Any]:
"application/json",
)
- an_allof_enum_with_overridden_default: Union[Unset, Tuple[None, bytes, str]] = UNSET
+ an_allof_enum_with_overridden_default: Union[Unset, tuple[None, bytes, str]] = UNSET
if not isinstance(self.an_allof_enum_with_overridden_default, Unset):
an_allof_enum_with_overridden_default = (
None,
@@ -131,11 +131,11 @@ def to_multipart(self) -> Dict[str, Any]:
"text/plain",
)
- an_optional_allof_enum: Union[Unset, Tuple[None, bytes, str]] = UNSET
+ an_optional_allof_enum: Union[Unset, tuple[None, bytes, str]] = UNSET
if not isinstance(self.an_optional_allof_enum, Unset):
an_optional_allof_enum = (None, str(self.an_optional_allof_enum).encode(), "text/plain")
- nested_list_of_enums: Union[Unset, Tuple[None, bytes, str]] = UNSET
+ nested_list_of_enums: Union[Unset, tuple[None, bytes, str]] = UNSET
if not isinstance(self.nested_list_of_enums, Unset):
_temp_nested_list_of_enums = []
for nested_list_of_enums_item_data in self.nested_list_of_enums:
@@ -147,7 +147,7 @@ def to_multipart(self) -> Dict[str, Any]:
_temp_nested_list_of_enums.append(nested_list_of_enums_item)
nested_list_of_enums = (None, json.dumps(_temp_nested_list_of_enums).encode(), "application/json")
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = (None, str(prop).encode(), "text/plain")
@@ -168,7 +168,7 @@ def to_multipart(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
an_enum_value = []
_an_enum_value = d.pop("an_enum_value", UNSET)
@@ -198,7 +198,7 @@ def _parse_an_enum_value_with_null_item(data: object) -> Union[AnEnumWithNull, N
an_enum_value_with_null.append(an_enum_value_with_null_item)
- an_enum_value_with_only_null = cast(List[None], d.pop("an_enum_value_with_only_null", UNSET))
+ an_enum_value_with_only_null = cast(list[None], d.pop("an_enum_value_with_only_null", UNSET))
_an_allof_enum_with_overridden_default = d.pop("an_allof_enum_with_overridden_default", UNSET)
an_allof_enum_with_overridden_default: Union[Unset, AnAllOfEnum]
@@ -239,7 +239,7 @@ def _parse_an_enum_value_with_null_item(data: object) -> Union[AnEnumWithNull, N
return post_user_list_body
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/types.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/types.py
index 21fac106f..fc557103e 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/types.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/types.py
@@ -1,7 +1,8 @@
"""Contains some shared types for properties"""
+from collections.abc import MutableMapping
from http import HTTPStatus
-from typing import BinaryIO, Generic, Literal, MutableMapping, Optional, Tuple, TypeVar
+from typing import BinaryIO, Generic, Literal, Optional, TypeVar
from attrs import define
@@ -13,7 +14,7 @@ def __bool__(self) -> Literal[False]:
UNSET: Unset = Unset()
-FileJsonType = Tuple[Optional[str], BinaryIO, Optional[str]]
+FileJsonType = tuple[Optional[str], BinaryIO, Optional[str]]
@define
diff --git a/end_to_end_tests/literal-enums-golden-record/pyproject.toml b/end_to_end_tests/literal-enums-golden-record/pyproject.toml
index d32c2d72c..367eff6ab 100644
--- a/end_to_end_tests/literal-enums-golden-record/pyproject.toml
+++ b/end_to_end_tests/literal-enums-golden-record/pyproject.toml
@@ -11,7 +11,7 @@ include = ["CHANGELOG.md", "my_enum_api_client/py.typed"]
[tool.poetry.dependencies]
-python = "^3.8"
+python = "^3.9"
httpx = ">=0.20.0,<0.28.0"
attrs = ">=21.3.0"
python-dateutil = "^2.8.0"
diff --git a/end_to_end_tests/metadata_snapshots/pdm.pyproject.toml b/end_to_end_tests/metadata_snapshots/pdm.pyproject.toml
index fddcea97f..c33a4cd48 100644
--- a/end_to_end_tests/metadata_snapshots/pdm.pyproject.toml
+++ b/end_to_end_tests/metadata_snapshots/pdm.pyproject.toml
@@ -4,7 +4,7 @@ version = "0.1.0"
description = "A client library for accessing Test 3.1 Features"
authors = []
readme = "README.md"
-requires-python = ">=3.8,<4.0"
+requires-python = ">=3.9,<4.0"
dependencies = [
"httpx>=0.20.0,<0.28.0",
"attrs>=21.3.0",
diff --git a/end_to_end_tests/metadata_snapshots/poetry.pyproject.toml b/end_to_end_tests/metadata_snapshots/poetry.pyproject.toml
index f9a1becf8..889052b61 100644
--- a/end_to_end_tests/metadata_snapshots/poetry.pyproject.toml
+++ b/end_to_end_tests/metadata_snapshots/poetry.pyproject.toml
@@ -11,7 +11,7 @@ include = ["CHANGELOG.md", "test_3_1_features_client/py.typed"]
[tool.poetry.dependencies]
-python = "^3.8"
+python = "^3.9"
httpx = ">=0.20.0,<0.28.0"
attrs = ">=21.3.0"
python-dateutil = "^2.8.0"
diff --git a/end_to_end_tests/metadata_snapshots/setup.py b/end_to_end_tests/metadata_snapshots/setup.py
index 6350b8c4c..55642b4cd 100644
--- a/end_to_end_tests/metadata_snapshots/setup.py
+++ b/end_to_end_tests/metadata_snapshots/setup.py
@@ -12,7 +12,7 @@
long_description=long_description,
long_description_content_type="text/markdown",
packages=find_packages(),
- python_requires=">=3.8, <4",
+ python_requires=">=3.9, <4",
install_requires=["httpx >= 0.20.0, < 0.28.0", "attrs >= 21.3.0", "python-dateutil >= 2.8.0, < 3"],
package_data={"test_3_1_features_client": ["py.typed"]},
)
diff --git a/end_to_end_tests/test-3-1-golden-record/pyproject.toml b/end_to_end_tests/test-3-1-golden-record/pyproject.toml
index f9a1becf8..889052b61 100644
--- a/end_to_end_tests/test-3-1-golden-record/pyproject.toml
+++ b/end_to_end_tests/test-3-1-golden-record/pyproject.toml
@@ -11,7 +11,7 @@ include = ["CHANGELOG.md", "test_3_1_features_client/py.typed"]
[tool.poetry.dependencies]
-python = "^3.8"
+python = "^3.9"
httpx = ">=0.20.0,<0.28.0"
attrs = ">=21.3.0"
python-dateutil = "^2.8.0"
diff --git a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/api/const/post_const_path.py b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/api/const/post_const_path.py
index 9a8181e26..0d05b8189 100644
--- a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/api/const/post_const_path.py
+++ b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/api/const/post_const_path.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Literal, Optional, Union, cast
+from typing import Any, Literal, Optional, Union, cast
import httpx
@@ -15,10 +15,10 @@ def _get_kwargs(
body: PostConstPathBody,
required_query: Literal["this always goes in the query"],
optional_query: Union[Literal["this sometimes goes in the query"], Unset] = UNSET,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- params: Dict[str, Any] = {}
+ params: dict[str, Any] = {}
params["required query"] = required_query
@@ -26,7 +26,7 @@ def _get_kwargs(
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": f"/const/{path}",
"params": params,
diff --git a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/api/prefix_items/post_prefix_items.py b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/api/prefix_items/post_prefix_items.py
index 03afbcb0e..f12d53f18 100644
--- a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/api/prefix_items/post_prefix_items.py
+++ b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/api/prefix_items/post_prefix_items.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union, cast
+from typing import Any, Optional, Union, cast
import httpx
@@ -12,10 +12,10 @@
def _get_kwargs(
*,
body: PostPrefixItemsBody,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/prefixItems",
}
diff --git a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/client.py b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/client.py
index 0f6d15e84..e80446f10 100644
--- a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/client.py
+++ b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/client.py
@@ -1,5 +1,5 @@
import ssl
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
from attrs import define, evolve, field
@@ -36,16 +36,16 @@ class Client:
raise_on_unexpected_status: bool = field(default=False, kw_only=True)
_base_url: str = field(alias="base_url")
- _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
- _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
+ _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
+ _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True, alias="timeout")
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(default=True, kw_only=True, alias="verify_ssl")
_follow_redirects: bool = field(default=False, kw_only=True, alias="follow_redirects")
- _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
+ _httpx_args: dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
_client: Optional[httpx.Client] = field(default=None, init=False)
_async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
- def with_headers(self, headers: Dict[str, str]) -> "Client":
+ def with_headers(self, headers: dict[str, str]) -> "Client":
"""Get a new client matching this one with additional headers"""
if self._client is not None:
self._client.headers.update(headers)
@@ -53,7 +53,7 @@ def with_headers(self, headers: Dict[str, str]) -> "Client":
self._async_client.headers.update(headers)
return evolve(self, headers={**self._headers, **headers})
- def with_cookies(self, cookies: Dict[str, str]) -> "Client":
+ def with_cookies(self, cookies: dict[str, str]) -> "Client":
"""Get a new client matching this one with additional cookies"""
if self._client is not None:
self._client.cookies.update(cookies)
@@ -166,12 +166,12 @@ class AuthenticatedClient:
raise_on_unexpected_status: bool = field(default=False, kw_only=True)
_base_url: str = field(alias="base_url")
- _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
- _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
+ _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
+ _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True, alias="timeout")
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(default=True, kw_only=True, alias="verify_ssl")
_follow_redirects: bool = field(default=False, kw_only=True, alias="follow_redirects")
- _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
+ _httpx_args: dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
_client: Optional[httpx.Client] = field(default=None, init=False)
_async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
@@ -179,7 +179,7 @@ class AuthenticatedClient:
prefix: str = "Bearer"
auth_header_name: str = "Authorization"
- def with_headers(self, headers: Dict[str, str]) -> "AuthenticatedClient":
+ def with_headers(self, headers: dict[str, str]) -> "AuthenticatedClient":
"""Get a new client matching this one with additional headers"""
if self._client is not None:
self._client.headers.update(headers)
@@ -187,7 +187,7 @@ def with_headers(self, headers: Dict[str, str]) -> "AuthenticatedClient":
self._async_client.headers.update(headers)
return evolve(self, headers={**self._headers, **headers})
- def with_cookies(self, cookies: Dict[str, str]) -> "AuthenticatedClient":
+ def with_cookies(self, cookies: dict[str, str]) -> "AuthenticatedClient":
"""Get a new client matching this one with additional cookies"""
if self._client is not None:
self._client.cookies.update(cookies)
diff --git a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/models/post_const_path_body.py b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/models/post_const_path_body.py
index 9ac2f9102..15734903c 100644
--- a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/models/post_const_path_body.py
+++ b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/models/post_const_path_body.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Literal, Type, TypeVar, Union, cast
+from typing import Any, Literal, TypeVar, Union, cast
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -20,9 +20,9 @@ class PostConstPathBody:
required: Literal["this always goes in the body"]
nullable: Union[Literal["this or null goes in the body"], None]
optional: Union[Literal["this sometimes goes in the body"], Unset] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
required = self.required
nullable: Union[Literal["this or null goes in the body"], None]
@@ -30,7 +30,7 @@ def to_dict(self) -> Dict[str, Any]:
optional = self.optional
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
@@ -44,7 +44,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
required = cast(Literal["this always goes in the body"], d.pop("required"))
if required != "this always goes in the body":
@@ -77,7 +77,7 @@ def _parse_nullable(data: object) -> Union[Literal["this or null goes in the bod
return post_const_path_body
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/models/post_prefix_items_body.py b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/models/post_prefix_items_body.py
index f3edd841d..a578b3091 100644
--- a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/models/post_prefix_items_body.py
+++ b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/models/post_prefix_items_body.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Literal, Type, TypeVar, Union, cast
+from typing import Any, Literal, TypeVar, Union, cast
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -12,16 +12,16 @@
class PostPrefixItemsBody:
"""
Attributes:
- prefix_items_and_items (Union[Unset, List[Union[Literal['prefix'], float, str]]]):
- prefix_items_only (Union[Unset, List[Union[float, str]]]):
+ prefix_items_and_items (Union[Unset, list[Union[Literal['prefix'], float, str]]]):
+ prefix_items_only (Union[Unset, list[Union[float, str]]]):
"""
- prefix_items_and_items: Union[Unset, List[Union[Literal["prefix"], float, str]]] = UNSET
- prefix_items_only: Union[Unset, List[Union[float, str]]] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ prefix_items_and_items: Union[Unset, list[Union[Literal["prefix"], float, str]]] = UNSET
+ prefix_items_only: Union[Unset, list[Union[float, str]]] = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- prefix_items_and_items: Union[Unset, List[Union[Literal["prefix"], float, str]]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ prefix_items_and_items: Union[Unset, list[Union[Literal["prefix"], float, str]]] = UNSET
if not isinstance(self.prefix_items_and_items, Unset):
prefix_items_and_items = []
for prefix_items_and_items_item_data in self.prefix_items_and_items:
@@ -29,7 +29,7 @@ def to_dict(self) -> Dict[str, Any]:
prefix_items_and_items_item = prefix_items_and_items_item_data
prefix_items_and_items.append(prefix_items_and_items_item)
- prefix_items_only: Union[Unset, List[Union[float, str]]] = UNSET
+ prefix_items_only: Union[Unset, list[Union[float, str]]] = UNSET
if not isinstance(self.prefix_items_only, Unset):
prefix_items_only = []
for prefix_items_only_item_data in self.prefix_items_only:
@@ -37,7 +37,7 @@ def to_dict(self) -> Dict[str, Any]:
prefix_items_only_item = prefix_items_only_item_data
prefix_items_only.append(prefix_items_only_item)
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if prefix_items_and_items is not UNSET:
@@ -48,7 +48,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
prefix_items_and_items = []
_prefix_items_and_items = d.pop("prefixItemsAndItems", UNSET)
@@ -87,7 +87,7 @@ def _parse_prefix_items_only_item(data: object) -> Union[float, str]:
return post_prefix_items_body
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/types.py b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/types.py
index 21fac106f..fc557103e 100644
--- a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/types.py
+++ b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/types.py
@@ -1,7 +1,8 @@
"""Contains some shared types for properties"""
+from collections.abc import MutableMapping
from http import HTTPStatus
-from typing import BinaryIO, Generic, Literal, MutableMapping, Optional, Tuple, TypeVar
+from typing import BinaryIO, Generic, Literal, Optional, TypeVar
from attrs import define
@@ -13,7 +14,7 @@ def __bool__(self) -> Literal[False]:
UNSET: Unset = Unset()
-FileJsonType = Tuple[Optional[str], BinaryIO, Optional[str]]
+FileJsonType = tuple[Optional[str], BinaryIO, Optional[str]]
@define
diff --git a/end_to_end_tests/test_custom_templates/api_init.py.jinja b/end_to_end_tests/test_custom_templates/api_init.py.jinja
index 0c5720bf2..78e473147 100644
--- a/end_to_end_tests/test_custom_templates/api_init.py.jinja
+++ b/end_to_end_tests/test_custom_templates/api_init.py.jinja
@@ -1,6 +1,5 @@
""" Contains methods for accessing the API """
-from typing import Type
{% for tag in endpoint_collections_by_tag.keys() %}
from .{{ tag }} import {{ class_name(tag) }}Endpoints
{% endfor %}
@@ -8,6 +7,6 @@ from .{{ tag }} import {{ class_name(tag) }}Endpoints
class {{ class_name(package_name) }}Api:
{% for tag in endpoint_collections_by_tag.keys() %}
@classmethod
- def {{ tag }}(cls) -> Type[{{ class_name(tag) }}Endpoints]:
+ def {{ tag }}(cls) -> type[{{ class_name(tag) }}Endpoints]:
return {{ class_name(tag) }}Endpoints
{% endfor %}
diff --git a/end_to_end_tests/test_end_to_end.py b/end_to_end_tests/test_end_to_end.py
index a448a0698..2452c3acd 100644
--- a/end_to_end_tests/test_end_to_end.py
+++ b/end_to_end_tests/test_end_to_end.py
@@ -1,7 +1,7 @@
import shutil
from filecmp import cmpfiles, dircmp
from pathlib import Path
-from typing import Dict, List, Optional, Set
+from typing import Optional
import pytest
from click.testing import Result
@@ -13,9 +13,9 @@
def _compare_directories(
record: Path,
test_subject: Path,
- expected_differences: Dict[Path, str],
- expected_missing: Optional[Set[str]] = None,
- ignore: List[str] = None,
+ expected_differences: dict[Path, str],
+ expected_missing: Optional[set[str]] = None,
+ ignore: list[str] = None,
depth=0,
):
"""
@@ -78,11 +78,11 @@ def _compare_directories(
def run_e2e_test(
openapi_document: str,
- extra_args: List[str],
- expected_differences: Optional[Dict[Path, str]] = None,
+ extra_args: list[str],
+ expected_differences: Optional[dict[Path, str]] = None,
golden_record_path: str = "golden-record",
output_path: str = "my-test-api-client",
- expected_missing: Optional[Set[str]] = None,
+ expected_missing: Optional[set[str]] = None,
) -> Result:
output_path = Path.cwd() / output_path
shutil.rmtree(output_path, ignore_errors=True)
@@ -107,12 +107,12 @@ def run_e2e_test(
return result
-def generate(extra_args: Optional[List[str]], openapi_document: str) -> Result:
+def generate(extra_args: Optional[list[str]], openapi_document: str) -> Result:
"""Generate a client from an OpenAPI document and return the path to the generated code"""
_run_command("generate", extra_args, openapi_document)
-def _run_command(command: str, extra_args: Optional[List[str]] = None, openapi_document: Optional[str] = None, url: Optional[str] = None, config_path: Optional[Path] = None) -> Result:
+def _run_command(command: str, extra_args: Optional[list[str]] = None, openapi_document: Optional[str] = None, url: Optional[str] = None, config_path: Optional[Path] = None) -> Result:
"""Generate a client from an OpenAPI document and return the path to the generated code"""
runner = CliRunner()
if openapi_document is not None:
diff --git a/integration-tests/integration_tests/api/body/post_body_multipart.py b/integration-tests/integration_tests/api/body/post_body_multipart.py
index bfef23f2e..13c943ad7 100644
--- a/integration-tests/integration_tests/api/body/post_body_multipart.py
+++ b/integration-tests/integration_tests/api/body/post_body_multipart.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -14,10 +14,10 @@
def _get_kwargs(
*,
body: PostBodyMultipartBody,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/body/multipart",
}
diff --git a/integration-tests/integration_tests/api/parameters/post_parameters_header.py b/integration-tests/integration_tests/api/parameters/post_parameters_header.py
index 90858f9bb..0981585cc 100644
--- a/integration-tests/integration_tests/api/parameters/post_parameters_header.py
+++ b/integration-tests/integration_tests/api/parameters/post_parameters_header.py
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
@@ -16,8 +16,8 @@ def _get_kwargs(
string_header: str,
number_header: float,
integer_header: int,
-) -> Dict[str, Any]:
- headers: Dict[str, Any] = {}
+) -> dict[str, Any]:
+ headers: dict[str, Any] = {}
headers["Boolean-Header"] = "true" if boolean_header else "false"
headers["String-Header"] = string_header
@@ -26,7 +26,7 @@ def _get_kwargs(
headers["Integer-Header"] = str(integer_header)
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "post",
"url": "/parameters/header",
}
diff --git a/integration-tests/integration_tests/client.py b/integration-tests/integration_tests/client.py
index 0f6d15e84..e80446f10 100644
--- a/integration-tests/integration_tests/client.py
+++ b/integration-tests/integration_tests/client.py
@@ -1,5 +1,5 @@
import ssl
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
import httpx
from attrs import define, evolve, field
@@ -36,16 +36,16 @@ class Client:
raise_on_unexpected_status: bool = field(default=False, kw_only=True)
_base_url: str = field(alias="base_url")
- _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
- _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
+ _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
+ _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True, alias="timeout")
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(default=True, kw_only=True, alias="verify_ssl")
_follow_redirects: bool = field(default=False, kw_only=True, alias="follow_redirects")
- _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
+ _httpx_args: dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
_client: Optional[httpx.Client] = field(default=None, init=False)
_async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
- def with_headers(self, headers: Dict[str, str]) -> "Client":
+ def with_headers(self, headers: dict[str, str]) -> "Client":
"""Get a new client matching this one with additional headers"""
if self._client is not None:
self._client.headers.update(headers)
@@ -53,7 +53,7 @@ def with_headers(self, headers: Dict[str, str]) -> "Client":
self._async_client.headers.update(headers)
return evolve(self, headers={**self._headers, **headers})
- def with_cookies(self, cookies: Dict[str, str]) -> "Client":
+ def with_cookies(self, cookies: dict[str, str]) -> "Client":
"""Get a new client matching this one with additional cookies"""
if self._client is not None:
self._client.cookies.update(cookies)
@@ -166,12 +166,12 @@ class AuthenticatedClient:
raise_on_unexpected_status: bool = field(default=False, kw_only=True)
_base_url: str = field(alias="base_url")
- _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
- _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
+ _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
+ _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True, alias="timeout")
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(default=True, kw_only=True, alias="verify_ssl")
_follow_redirects: bool = field(default=False, kw_only=True, alias="follow_redirects")
- _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
+ _httpx_args: dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
_client: Optional[httpx.Client] = field(default=None, init=False)
_async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
@@ -179,7 +179,7 @@ class AuthenticatedClient:
prefix: str = "Bearer"
auth_header_name: str = "Authorization"
- def with_headers(self, headers: Dict[str, str]) -> "AuthenticatedClient":
+ def with_headers(self, headers: dict[str, str]) -> "AuthenticatedClient":
"""Get a new client matching this one with additional headers"""
if self._client is not None:
self._client.headers.update(headers)
@@ -187,7 +187,7 @@ def with_headers(self, headers: Dict[str, str]) -> "AuthenticatedClient":
self._async_client.headers.update(headers)
return evolve(self, headers={**self._headers, **headers})
- def with_cookies(self, cookies: Dict[str, str]) -> "AuthenticatedClient":
+ def with_cookies(self, cookies: dict[str, str]) -> "AuthenticatedClient":
"""Get a new client matching this one with additional cookies"""
if self._client is not None:
self._client.cookies.update(cookies)
diff --git a/integration-tests/integration_tests/models/post_body_multipart_body.py b/integration-tests/integration_tests/models/post_body_multipart_body.py
index f0272a34e..13174200d 100644
--- a/integration-tests/integration_tests/models/post_body_multipart_body.py
+++ b/integration-tests/integration_tests/models/post_body_multipart_body.py
@@ -1,5 +1,5 @@
from io import BytesIO
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -22,16 +22,16 @@ class PostBodyMultipartBody:
a_string: str
file: File
description: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a_string = self.a_string
file = self.file.to_tuple()
description = self.description
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
@@ -44,7 +44,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
- def to_multipart(self) -> Dict[str, Any]:
+ def to_multipart(self) -> dict[str, Any]:
a_string = (None, str(self.a_string).encode(), "text/plain")
file = self.file.to_tuple()
@@ -55,7 +55,7 @@ def to_multipart(self) -> Dict[str, Any]:
else (None, str(self.description).encode(), "text/plain")
)
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
field_dict[prop_name] = (None, str(prop).encode(), "text/plain")
@@ -71,7 +71,7 @@ def to_multipart(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
a_string = d.pop("a_string")
@@ -89,7 +89,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return post_body_multipart_body
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/integration-tests/integration_tests/models/post_body_multipart_response_200.py b/integration-tests/integration_tests/models/post_body_multipart_response_200.py
index 79359ec41..65f38c082 100644
--- a/integration-tests/integration_tests/models/post_body_multipart_response_200.py
+++ b/integration-tests/integration_tests/models/post_body_multipart_response_200.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -22,9 +22,9 @@ class PostBodyMultipartResponse200:
description: str
file_name: str
file_content_type: str
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
a_string = self.a_string
file_data = self.file_data
@@ -35,7 +35,7 @@ def to_dict(self) -> Dict[str, Any]:
file_content_type = self.file_content_type
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
@@ -50,7 +50,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
a_string = d.pop("a_string")
@@ -74,7 +74,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return post_body_multipart_response_200
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/integration-tests/integration_tests/models/post_parameters_header_response_200.py b/integration-tests/integration_tests/models/post_parameters_header_response_200.py
index 03e688ba1..ff44f5644 100644
--- a/integration-tests/integration_tests/models/post_parameters_header_response_200.py
+++ b/integration-tests/integration_tests/models/post_parameters_header_response_200.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar
+from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -20,9 +20,9 @@ class PostParametersHeaderResponse200:
string: str
number: float
integer: int
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
boolean = self.boolean
string = self.string
@@ -31,7 +31,7 @@ def to_dict(self) -> Dict[str, Any]:
integer = self.integer
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update(
{
@@ -45,7 +45,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
boolean = d.pop("boolean")
@@ -66,7 +66,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return post_parameters_header_response_200
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/integration-tests/integration_tests/models/problem.py b/integration-tests/integration_tests/models/problem.py
index bde5b6d37..f61f42b5d 100644
--- a/integration-tests/integration_tests/models/problem.py
+++ b/integration-tests/integration_tests/models/problem.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Type, TypeVar, Union
+from typing import Any, TypeVar, Union
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -18,14 +18,14 @@ class Problem:
parameter_name: Union[Unset, str] = UNSET
description: Union[Unset, str] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
parameter_name = self.parameter_name
description = self.description
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if parameter_name is not UNSET:
@@ -36,7 +36,7 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
d = src_dict.copy()
parameter_name = d.pop("parameter_name", UNSET)
@@ -51,7 +51,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return problem
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/integration-tests/integration_tests/models/public_error.py b/integration-tests/integration_tests/models/public_error.py
index 993bd8ad3..5e9d53c26 100644
--- a/integration-tests/integration_tests/models/public_error.py
+++ b/integration-tests/integration_tests/models/public_error.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union, cast
+from typing import TYPE_CHECKING, Any, TypeVar, Union, cast
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -16,39 +16,39 @@
class PublicError:
"""
Attributes:
- errors (Union[Unset, List[str]]):
- extra_parameters (Union[Unset, List[str]]):
- invalid_parameters (Union[Unset, List['Problem']]):
- missing_parameters (Union[Unset, List[str]]):
+ errors (Union[Unset, list[str]]):
+ extra_parameters (Union[Unset, list[str]]):
+ invalid_parameters (Union[Unset, list['Problem']]):
+ missing_parameters (Union[Unset, list[str]]):
"""
- errors: Union[Unset, List[str]] = UNSET
- extra_parameters: Union[Unset, List[str]] = UNSET
- invalid_parameters: Union[Unset, List["Problem"]] = UNSET
- missing_parameters: Union[Unset, List[str]] = UNSET
- additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
+ errors: Union[Unset, list[str]] = UNSET
+ extra_parameters: Union[Unset, list[str]] = UNSET
+ invalid_parameters: Union[Unset, list["Problem"]] = UNSET
+ missing_parameters: Union[Unset, list[str]] = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
- def to_dict(self) -> Dict[str, Any]:
- errors: Union[Unset, List[str]] = UNSET
+ def to_dict(self) -> dict[str, Any]:
+ errors: Union[Unset, list[str]] = UNSET
if not isinstance(self.errors, Unset):
errors = self.errors
- extra_parameters: Union[Unset, List[str]] = UNSET
+ extra_parameters: Union[Unset, list[str]] = UNSET
if not isinstance(self.extra_parameters, Unset):
extra_parameters = self.extra_parameters
- invalid_parameters: Union[Unset, List[Dict[str, Any]]] = UNSET
+ invalid_parameters: Union[Unset, list[dict[str, Any]]] = UNSET
if not isinstance(self.invalid_parameters, Unset):
invalid_parameters = []
for invalid_parameters_item_data in self.invalid_parameters:
invalid_parameters_item = invalid_parameters_item_data.to_dict()
invalid_parameters.append(invalid_parameters_item)
- missing_parameters: Union[Unset, List[str]] = UNSET
+ missing_parameters: Union[Unset, list[str]] = UNSET
if not isinstance(self.missing_parameters, Unset):
missing_parameters = self.missing_parameters
- field_dict: Dict[str, Any] = {}
+ field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if errors is not UNSET:
@@ -63,13 +63,13 @@ def to_dict(self) -> Dict[str, Any]:
return field_dict
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
from ..models.problem import Problem
d = src_dict.copy()
- errors = cast(List[str], d.pop("errors", UNSET))
+ errors = cast(list[str], d.pop("errors", UNSET))
- extra_parameters = cast(List[str], d.pop("extra_parameters", UNSET))
+ extra_parameters = cast(list[str], d.pop("extra_parameters", UNSET))
invalid_parameters = []
_invalid_parameters = d.pop("invalid_parameters", UNSET)
@@ -78,7 +78,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
invalid_parameters.append(invalid_parameters_item)
- missing_parameters = cast(List[str], d.pop("missing_parameters", UNSET))
+ missing_parameters = cast(list[str], d.pop("missing_parameters", UNSET))
public_error = cls(
errors=errors,
@@ -91,7 +91,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
return public_error
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
diff --git a/integration-tests/integration_tests/types.py b/integration-tests/integration_tests/types.py
index 21fac106f..fc557103e 100644
--- a/integration-tests/integration_tests/types.py
+++ b/integration-tests/integration_tests/types.py
@@ -1,7 +1,8 @@
"""Contains some shared types for properties"""
+from collections.abc import MutableMapping
from http import HTTPStatus
-from typing import BinaryIO, Generic, Literal, MutableMapping, Optional, Tuple, TypeVar
+from typing import BinaryIO, Generic, Literal, Optional, TypeVar
from attrs import define
@@ -13,7 +14,7 @@ def __bool__(self) -> Literal[False]:
UNSET: Unset = Unset()
-FileJsonType = Tuple[Optional[str], BinaryIO, Optional[str]]
+FileJsonType = tuple[Optional[str], BinaryIO, Optional[str]]
@define
diff --git a/openapi_python_client/__init__.py b/openapi_python_client/__init__.py
index f2cfb40ec..2225d2008 100644
--- a/openapi_python_client/__init__.py
+++ b/openapi_python_client/__init__.py
@@ -4,10 +4,11 @@
import mimetypes
import shutil
import subprocess
+from collections.abc import Sequence
from importlib.metadata import version
from pathlib import Path
from subprocess import CalledProcessError
-from typing import Any, Dict, List, Optional, Sequence, Union
+from typing import Any, Optional, Union
import httpcore
import httpx
@@ -101,7 +102,7 @@ def __init__(
openapi=self.openapi,
endpoint_collections_by_tag=self.openapi.endpoint_collections_by_tag,
)
- self.errors: List[GeneratorError] = []
+ self.errors: list[GeneratorError] = []
def build(self) -> Sequence[GeneratorError]:
"""Create the project from templates"""
@@ -147,8 +148,8 @@ def _run_command(self, cmd: str) -> None:
)
)
- def _get_errors(self) -> List[GeneratorError]:
- errors: List[GeneratorError] = []
+ def _get_errors(self) -> list[GeneratorError]:
+ errors: list[GeneratorError] = []
for collection in self.openapi.endpoint_collections_by_tag.values():
errors.extend(collection.parse_errors)
errors.extend(self.openapi.errors)
@@ -325,7 +326,7 @@ def generate(
return project.build()
-def _load_yaml_or_json(data: bytes, content_type: Optional[str]) -> Union[Dict[str, Any], GeneratorError]:
+def _load_yaml_or_json(data: bytes, content_type: Optional[str]) -> Union[dict[str, Any], GeneratorError]:
if content_type == "application/json":
try:
return json.loads(data.decode())
@@ -339,7 +340,7 @@ def _load_yaml_or_json(data: bytes, content_type: Optional[str]) -> Union[Dict[s
return GeneratorError(header=f"Invalid YAML from provided source: {err}")
-def _get_document(*, source: Union[str, Path], timeout: int) -> Union[Dict[str, Any], GeneratorError]:
+def _get_document(*, source: Union[str, Path], timeout: int) -> Union[dict[str, Any], GeneratorError]:
yaml_bytes: bytes
content_type: Optional[str]
if isinstance(source, str):
diff --git a/openapi_python_client/cli.py b/openapi_python_client/cli.py
index e8fd50f9e..20c8c9d0a 100644
--- a/openapi_python_client/cli.py
+++ b/openapi_python_client/cli.py
@@ -1,7 +1,8 @@
import codecs
+from collections.abc import Sequence
from pathlib import Path
from pprint import pformat
-from typing import Optional, Sequence, Union
+from typing import Optional, Union
import typer
diff --git a/openapi_python_client/config.py b/openapi_python_client/config.py
index 6625bda1f..c7f5d8ad9 100644
--- a/openapi_python_client/config.py
+++ b/openapi_python_client/config.py
@@ -2,7 +2,7 @@
import mimetypes
from enum import Enum
from pathlib import Path
-from typing import Dict, List, Optional, Union
+from typing import Optional, Union
from attr import define
from pydantic import BaseModel
@@ -34,13 +34,13 @@ class ConfigFile(BaseModel):
See https://github.com/openapi-generators/openapi-python-client#configuration
"""
- class_overrides: Optional[Dict[str, ClassOverride]] = None
- content_type_overrides: Optional[Dict[str, str]] = None
+ class_overrides: Optional[dict[str, ClassOverride]] = None
+ content_type_overrides: Optional[dict[str, str]] = None
project_name_override: Optional[str] = None
package_name_override: Optional[str] = None
package_version_override: Optional[str] = None
use_path_prefixes_for_title_model_names: bool = True
- post_hooks: Optional[List[str]] = None
+ post_hooks: Optional[list[str]] = None
field_prefix: str = "field_"
http_timeout: int = 5
literal_enums: bool = False
@@ -63,18 +63,18 @@ class Config:
"""Contains all the config values for the generator, from files, defaults, and CLI arguments."""
meta_type: MetaType
- class_overrides: Dict[str, ClassOverride]
+ class_overrides: dict[str, ClassOverride]
project_name_override: Optional[str]
package_name_override: Optional[str]
package_version_override: Optional[str]
use_path_prefixes_for_title_model_names: bool
- post_hooks: List[str]
+ post_hooks: list[str]
field_prefix: str
http_timeout: int
literal_enums: bool
document_source: Union[Path, str]
file_encoding: str
- content_type_overrides: Dict[str, str]
+ content_type_overrides: dict[str, str]
overwrite: bool
output_path: Optional[Path]
diff --git a/openapi_python_client/parser/bodies.py b/openapi_python_client/parser/bodies.py
index 8515ad7cc..c51966412 100644
--- a/openapi_python_client/parser/bodies.py
+++ b/openapi_python_client/parser/bodies.py
@@ -1,5 +1,5 @@
import sys
-from typing import Dict, List, Tuple, Union
+from typing import Union
import attr
@@ -44,10 +44,10 @@ def body_from_data(
*,
data: oai.Operation,
schemas: Schemas,
- request_bodies: Dict[str, Union[oai.RequestBody, oai.Reference]],
+ request_bodies: dict[str, Union[oai.RequestBody, oai.Reference]],
config: Config,
endpoint_name: str,
-) -> Tuple[List[Union[Body, ParseError]], Schemas]:
+) -> tuple[list[Union[Body, ParseError]], Schemas]:
"""Adds form or JSON body to Endpoint if included in data"""
body = _resolve_reference(data.request_body, request_bodies)
if isinstance(body, ParseError):
@@ -55,7 +55,7 @@ def body_from_data(
if body is None:
return [], schemas
- bodies: List[Union[Body, ParseError]] = []
+ bodies: list[Union[Body, ParseError]] = []
body_content = body.content
prefix_type_names = len(body_content) > 1
@@ -131,7 +131,7 @@ def body_from_data(
def _resolve_reference(
- body: Union[oai.RequestBody, oai.Reference, None], request_bodies: Dict[str, Union[oai.RequestBody, oai.Reference]]
+ body: Union[oai.RequestBody, oai.Reference, None], request_bodies: dict[str, Union[oai.RequestBody, oai.Reference]]
) -> Union[oai.RequestBody, ParseError, None]:
if body is None:
return None
diff --git a/openapi_python_client/parser/openapi.py b/openapi_python_client/parser/openapi.py
index acc8998cd..43e63c434 100644
--- a/openapi_python_client/parser/openapi.py
+++ b/openapi_python_client/parser/openapi.py
@@ -1,8 +1,9 @@
import re
+from collections.abc import Iterator
from copy import deepcopy
from dataclasses import dataclass, field
from http import HTTPStatus
-from typing import Any, Dict, Iterator, List, Optional, Protocol, Set, Tuple, Union
+from typing import Any, Optional, Protocol, Union
from pydantic import ValidationError
@@ -40,20 +41,20 @@ class EndpointCollection:
"""A bunch of endpoints grouped under a tag that will become a module"""
tag: str
- endpoints: List["Endpoint"] = field(default_factory=list)
- parse_errors: List[ParseError] = field(default_factory=list)
+ endpoints: list["Endpoint"] = field(default_factory=list)
+ parse_errors: list[ParseError] = field(default_factory=list)
@staticmethod
def from_data(
*,
- data: Dict[str, oai.PathItem],
+ data: dict[str, oai.PathItem],
schemas: Schemas,
parameters: Parameters,
- request_bodies: Dict[str, Union[oai.RequestBody, oai.Reference]],
+ request_bodies: dict[str, Union[oai.RequestBody, oai.Reference]],
config: Config,
- ) -> Tuple[Dict[utils.PythonIdentifier, "EndpointCollection"], Schemas, Parameters]:
+ ) -> tuple[dict[utils.PythonIdentifier, "EndpointCollection"], Schemas, Parameters]:
"""Parse the openapi paths data to get EndpointCollections by tag"""
- endpoints_by_tag: Dict[utils.PythonIdentifier, EndpointCollection] = {}
+ endpoints_by_tag: dict[utils.PythonIdentifier, EndpointCollection] = {}
methods = ["get", "put", "post", "delete", "options", "head", "patch", "trace"]
@@ -117,7 +118,7 @@ class RequestBodyParser(Protocol):
def __call__(
self, *, body: oai.RequestBody, schemas: Schemas, parent_name: str, config: Config
- ) -> Tuple[Union[Property, PropertyError, None], Schemas]: ... # pragma: no cover
+ ) -> tuple[Union[Property, PropertyError, None], Schemas]: ... # pragma: no cover
@dataclass
@@ -133,19 +134,19 @@ class Endpoint:
requires_security: bool
tag: str
summary: Optional[str] = ""
- relative_imports: Set[str] = field(default_factory=set)
- query_parameters: List[Property] = field(default_factory=list)
- path_parameters: List[Property] = field(default_factory=list)
- header_parameters: List[Property] = field(default_factory=list)
- cookie_parameters: List[Property] = field(default_factory=list)
- responses: List[Response] = field(default_factory=list)
- bodies: List[Body] = field(default_factory=list)
- errors: List[ParseError] = field(default_factory=list)
+ relative_imports: set[str] = field(default_factory=set)
+ query_parameters: list[Property] = field(default_factory=list)
+ path_parameters: list[Property] = field(default_factory=list)
+ header_parameters: list[Property] = field(default_factory=list)
+ cookie_parameters: list[Property] = field(default_factory=list)
+ responses: list[Response] = field(default_factory=list)
+ bodies: list[Body] = field(default_factory=list)
+ errors: list[ParseError] = field(default_factory=list)
@staticmethod
def _add_responses(
*, endpoint: "Endpoint", data: oai.Responses, schemas: Schemas, config: Config
- ) -> Tuple["Endpoint", Schemas]:
+ ) -> tuple["Endpoint", Schemas]:
endpoint = deepcopy(endpoint)
for code, response_data in data.items():
status_code: HTTPStatus
@@ -197,7 +198,7 @@ def add_parameters(
schemas: Schemas,
parameters: Parameters,
config: Config,
- ) -> Tuple[Union["Endpoint", ParseError], Schemas, Parameters]:
+ ) -> tuple[Union["Endpoint", ParseError], Schemas, Parameters]:
"""Process the defined `parameters` for an Endpoint.
Any existing parameters will be ignored, so earlier instances of a parameter take precedence. PathItem
@@ -226,8 +227,8 @@ def add_parameters(
endpoint = deepcopy(endpoint)
- unique_parameters: Set[Tuple[str, oai.ParameterLocation]] = set()
- parameters_by_location: Dict[str, List[Property]] = {
+ unique_parameters: set[tuple[str, oai.ParameterLocation]] = set()
+ parameters_by_location: dict[str, list[Property]] = {
oai.ParameterLocation.QUERY: endpoint.query_parameters,
oai.ParameterLocation.PATH: endpoint.path_parameters,
oai.ParameterLocation.HEADER: endpoint.header_parameters,
@@ -304,7 +305,7 @@ def _check_parameters_for_conflicts(
self,
*,
config: Config,
- previously_modified_params: Optional[Set[Tuple[oai.ParameterLocation, str]]] = None,
+ previously_modified_params: Optional[set[tuple[oai.ParameterLocation, str]]] = None,
) -> Union["Endpoint", ParseError]:
"""Check for conflicting parameters
@@ -316,7 +317,7 @@ def _check_parameters_for_conflicts(
unique python_name.
"""
modified_params = previously_modified_params or set()
- used_python_names: Dict[PythonIdentifier, Tuple[oai.ParameterLocation, Property]] = {}
+ used_python_names: dict[PythonIdentifier, tuple[oai.ParameterLocation, Property]] = {}
reserved_names = ["client", "url"]
for parameter in self.iter_all_parameters():
location, prop = parameter
@@ -395,9 +396,9 @@ def from_data(
tag: str,
schemas: Schemas,
parameters: Parameters,
- request_bodies: Dict[str, Union[oai.RequestBody, oai.Reference]],
+ request_bodies: dict[str, Union[oai.RequestBody, oai.Reference]],
config: Config,
- ) -> Tuple[Union["Endpoint", ParseError], Schemas, Parameters]:
+ ) -> tuple[Union["Endpoint", ParseError], Schemas, Parameters]:
"""Construct an endpoint from the OpenAPI data"""
if data.operationId is None:
@@ -461,15 +462,15 @@ def response_type(self) -> str:
return self.responses[0].prop.get_type_string(quoted=False)
return f"Union[{', '.join(types)}]"
- def iter_all_parameters(self) -> Iterator[Tuple[oai.ParameterLocation, Property]]:
+ def iter_all_parameters(self) -> Iterator[tuple[oai.ParameterLocation, Property]]:
"""Iterate through all the parameters of this endpoint"""
yield from ((oai.ParameterLocation.PATH, param) for param in self.path_parameters)
yield from ((oai.ParameterLocation.QUERY, param) for param in self.query_parameters)
yield from ((oai.ParameterLocation.HEADER, param) for param in self.header_parameters)
yield from ((oai.ParameterLocation.COOKIE, param) for param in self.cookie_parameters)
- def list_all_parameters(self) -> List[Property]:
- """Return a List of all the parameters of this endpoint"""
+ def list_all_parameters(self) -> list[Property]:
+ """Return a list of all the parameters of this endpoint"""
return (
self.path_parameters
+ self.query_parameters
@@ -487,12 +488,12 @@ class GeneratorData:
description: Optional[str]
version: str
models: Iterator[ModelProperty]
- errors: List[ParseError]
- endpoint_collections_by_tag: Dict[utils.PythonIdentifier, EndpointCollection]
+ errors: list[ParseError]
+ endpoint_collections_by_tag: dict[utils.PythonIdentifier, EndpointCollection]
enums: Iterator[Union[EnumProperty, LiteralEnumProperty]]
@staticmethod
- def from_dict(data: Dict[str, Any], *, config: Config) -> Union["GeneratorData", GeneratorError]:
+ def from_dict(data: dict[str, Any], *, config: Config) -> Union["GeneratorData", GeneratorError]:
"""Create an OpenAPI from dict"""
try:
openapi = oai.OpenAPI.model_validate(data)
diff --git a/openapi_python_client/parser/properties/__init__.py b/openapi_python_client/parser/properties/__init__.py
index 94c6e3d08..e202d9cf5 100644
--- a/openapi_python_client/parser/properties/__init__.py
+++ b/openapi_python_client/parser/properties/__init__.py
@@ -14,7 +14,7 @@
"property_from_data",
]
-from typing import Iterable
+from collections.abc import Iterable
from attrs import evolve
diff --git a/openapi_python_client/parser/properties/enum_property.py b/openapi_python_client/parser/properties/enum_property.py
index 29609864f..fc7f20bd9 100644
--- a/openapi_python_client/parser/properties/enum_property.py
+++ b/openapi_python_client/parser/properties/enum_property.py
@@ -2,7 +2,7 @@
__all__ = ["EnumProperty", "ValueType"]
-from typing import Any, ClassVar, List, Union, cast
+from typing import Any, ClassVar, Union, cast
from attr import evolve
from attrs import define
@@ -99,7 +99,7 @@ def build( # noqa: PLR0911
if value_type not in (str, int):
return PropertyError(header=f"Unsupported enum type {value_type}", data=data), schemas
value_list = cast(
- Union[List[int], List[str]], unchecked_value_list
+ Union[list[int], list[str]], unchecked_value_list
) # We checked this with all the value_types stuff
if len(value_list) < len(enum): # Only one of the values was None, that becomes a union
diff --git a/openapi_python_client/parser/properties/list_property.py b/openapi_python_client/parser/properties/list_property.py
index 47a52cda3..bf0756fe3 100644
--- a/openapi_python_client/parser/properties/list_property.py
+++ b/openapi_python_client/parser/properties/list_property.py
@@ -106,10 +106,10 @@ def convert_value(self, value: Any) -> Value | None | PropertyError:
return None # pragma: no cover
def get_base_type_string(self, *, quoted: bool = False) -> str:
- return f"List[{self.inner_property.get_type_string(quoted=not self.inner_property.is_base_type)}]"
+ return f"list[{self.inner_property.get_type_string(quoted=not self.inner_property.is_base_type)}]"
def get_base_json_type_string(self, *, quoted: bool = False) -> str:
- return f"List[{self.inner_property.get_type_string(json=True, quoted=not self.inner_property.is_base_type)}]"
+ return f"list[{self.inner_property.get_type_string(json=True, quoted=not self.inner_property.is_base_type)}]"
def get_instance_type_string(self) -> str:
"""Get a string representation of runtime type that should be used for `isinstance` checks"""
@@ -125,7 +125,7 @@ def get_imports(self, *, prefix: str) -> set[str]:
"""
imports = super().get_imports(prefix=prefix)
imports.update(self.inner_property.get_imports(prefix=prefix))
- imports.add("from typing import cast, List")
+ imports.add("from typing import cast")
return imports
def get_lazy_imports(self, *, prefix: str) -> set[str]:
@@ -151,7 +151,7 @@ def get_type_string(
if json:
type_string = self.get_base_json_type_string()
elif multipart:
- type_string = "Tuple[None, bytes, str]"
+ type_string = "tuple[None, bytes, str]"
else:
type_string = self.get_base_type_string()
diff --git a/openapi_python_client/parser/properties/literal_enum_property.py b/openapi_python_client/parser/properties/literal_enum_property.py
index c305a9a41..669b62f58 100644
--- a/openapi_python_client/parser/properties/literal_enum_property.py
+++ b/openapi_python_client/parser/properties/literal_enum_property.py
@@ -2,7 +2,7 @@
__all__ = ["LiteralEnumProperty"]
-from typing import Any, ClassVar, List, Union, cast
+from typing import Any, ClassVar, Union, cast
from attr import evolve
from attrs import define
@@ -98,7 +98,7 @@ def build( # noqa: PLR0911
if value_type not in (str, int):
return PropertyError(header=f"Unsupported enum type {value_type}", data=data), schemas
value_list = cast(
- Union[List[int], List[str]], unchecked_value_list
+ Union[list[int], list[str]], unchecked_value_list
) # We checked this with all the value_types stuff
if len(value_list) < len(enum): # Only one of the values was None, that becomes a union
diff --git a/openapi_python_client/parser/properties/model_property.py b/openapi_python_client/parser/properties/model_property.py
index 0dc13be54..762624501 100644
--- a/openapi_python_client/parser/properties/model_property.py
+++ b/openapi_python_client/parser/properties/model_property.py
@@ -32,7 +32,7 @@ class ModelProperty(PropertyProtocol):
relative_imports: set[str] | None
lazy_imports: set[str] | None
additional_properties: Property | None
- _json_type_string: ClassVar[str] = "Dict[str, Any]"
+ _json_type_string: ClassVar[str] = "dict[str, Any]"
template: ClassVar[str] = "model_property.py.jinja"
json_is_dict: ClassVar[bool] = True
@@ -154,7 +154,6 @@ def get_imports(self, *, prefix: str) -> set[str]:
imports = super().get_imports(prefix=prefix)
imports.update(
{
- "from typing import Dict",
"from typing import cast",
}
)
@@ -203,7 +202,7 @@ def get_type_string(
if json:
type_string = self.get_base_json_type_string()
elif multipart:
- type_string = "Tuple[None, bytes, str]"
+ type_string = "tuple[None, bytes, str]"
else:
type_string = self.get_base_type_string()
diff --git a/openapi_python_client/parser/properties/protocol.py b/openapi_python_client/parser/properties/protocol.py
index c9555949d..9a5b51828 100644
--- a/openapi_python_client/parser/properties/protocol.py
+++ b/openapi_python_client/parser/properties/protocol.py
@@ -116,7 +116,7 @@ def get_type_string(
if json:
type_string = self.get_base_json_type_string(quoted=quoted)
elif multipart:
- type_string = "Tuple[None, bytes, str]"
+ type_string = "tuple[None, bytes, str]"
else:
type_string = self.get_base_type_string(quoted=quoted)
diff --git a/openapi_python_client/parser/properties/schemas.py b/openapi_python_client/parser/properties/schemas.py
index dad89a572..ce0b3d35d 100644
--- a/openapi_python_client/parser/properties/schemas.py
+++ b/openapi_python_client/parser/properties/schemas.py
@@ -10,7 +10,7 @@
"parameter_from_data",
]
-from typing import TYPE_CHECKING, Dict, List, NewType, Set, Tuple, Union, cast
+from typing import TYPE_CHECKING, NewType, Union, cast
from urllib.parse import urlparse
from attrs import define, evolve, field
@@ -76,13 +76,13 @@ def from_string(*, string: str, config: Config) -> "Class":
class Schemas:
"""Structure for containing all defined, shareable, and reusable schemas (attr classes and Enums)"""
- classes_by_reference: Dict[ReferencePath, Property] = field(factory=dict)
- dependencies: Dict[ReferencePath, Set[Union[ReferencePath, ClassName]]] = field(factory=dict)
- classes_by_name: Dict[ClassName, Property] = field(factory=dict)
- models_to_process: List[ModelProperty] = field(factory=list)
- errors: List[ParseError] = field(factory=list)
+ classes_by_reference: dict[ReferencePath, Property] = field(factory=dict)
+ dependencies: dict[ReferencePath, set[Union[ReferencePath, ClassName]]] = field(factory=dict)
+ classes_by_name: dict[ClassName, Property] = field(factory=dict)
+ models_to_process: list[ModelProperty] = field(factory=list)
+ errors: list[ParseError] = field(factory=list)
- def add_dependencies(self, ref_path: ReferencePath, roots: Set[Union[ReferencePath, ClassName]]) -> None:
+ def add_dependencies(self, ref_path: ReferencePath, roots: set[Union[ReferencePath, ClassName]]) -> None:
"""Record new dependencies on the given ReferencePath
Args:
@@ -143,9 +143,9 @@ def update_schemas_with_data(
class Parameters:
"""Structure for containing all defined, shareable, and reusable parameters"""
- classes_by_reference: Dict[ReferencePath, Parameter] = field(factory=dict)
- classes_by_name: Dict[ClassName, Parameter] = field(factory=dict)
- errors: List[ParseError] = field(factory=list)
+ classes_by_reference: dict[ReferencePath, Parameter] = field(factory=dict)
+ classes_by_name: dict[ClassName, Parameter] = field(factory=dict)
+ errors: list[ParseError] = field(factory=list)
def parameter_from_data(
@@ -154,7 +154,7 @@ def parameter_from_data(
data: Union[oai.Reference, oai.Parameter],
parameters: Parameters,
config: Config,
-) -> Tuple[Union[Parameter, ParameterError], Parameters]:
+) -> tuple[Union[Parameter, ParameterError], Parameters]:
"""Generates parameters from an OpenAPI Parameter spec."""
if isinstance(data, oai.Reference):
diff --git a/openapi_python_client/parser/responses.py b/openapi_python_client/parser/responses.py
index 32412fd35..d313f81ad 100644
--- a/openapi_python_client/parser/responses.py
+++ b/openapi_python_client/parser/responses.py
@@ -1,7 +1,7 @@
__all__ = ["Response", "response_from_data"]
from http import HTTPStatus
-from typing import Optional, Tuple, TypedDict, Union
+from typing import Optional, TypedDict, Union
from attrs import define
@@ -86,7 +86,7 @@ def response_from_data(
schemas: Schemas,
parent_name: str,
config: Config,
-) -> Tuple[Union[Response, ParseError], Schemas]:
+) -> tuple[Union[Response, ParseError], Schemas]:
"""Generate a Response from the OpenAPI dictionary representation of it"""
response_name = f"response_{status_code}"
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/callback.py b/openapi_python_client/schema/openapi_schema_pydantic/callback.py
index 22426d925..f4593cc8d 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/callback.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/callback.py
@@ -1,11 +1,11 @@
-from typing import TYPE_CHECKING, Dict
+from typing import TYPE_CHECKING
if TYPE_CHECKING: # pragma: no cover
from .path_item import PathItem
else:
PathItem = "PathItem"
-Callback = Dict[str, PathItem]
+Callback = dict[str, PathItem]
"""
A map of possible out-of band callbacks related to the parent operation.
Each value in the map is a [Path Item Object](#pathItemObject)
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/components.py b/openapi_python_client/schema/openapi_schema_pydantic/components.py
index f366a2ec8..4ff5f9edc 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/components.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/components.py
@@ -1,4 +1,4 @@
-from typing import Dict, Optional, Union
+from typing import Optional, Union
from pydantic import BaseModel, ConfigDict
@@ -25,15 +25,15 @@ class Components(BaseModel):
- https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#componentsObject
"""
- schemas: Optional[Dict[str, Union[Schema, Reference]]] = None
- responses: Optional[Dict[str, Union[Response, Reference]]] = None
- parameters: Optional[Dict[str, Union[Parameter, Reference]]] = None
- examples: Optional[Dict[str, Union[Example, Reference]]] = None
- requestBodies: Optional[Dict[str, Union[RequestBody, Reference]]] = None
- headers: Optional[Dict[str, Union[Header, Reference]]] = None
- securitySchemes: Optional[Dict[str, Union[SecurityScheme, Reference]]] = None
- links: Optional[Dict[str, Union[Link, Reference]]] = None
- callbacks: Optional[Dict[str, Union[Callback, Reference]]] = None
+ schemas: Optional[dict[str, Union[Schema, Reference]]] = None
+ responses: Optional[dict[str, Union[Response, Reference]]] = None
+ parameters: Optional[dict[str, Union[Parameter, Reference]]] = None
+ examples: Optional[dict[str, Union[Example, Reference]]] = None
+ requestBodies: Optional[dict[str, Union[RequestBody, Reference]]] = None
+ headers: Optional[dict[str, Union[Header, Reference]]] = None
+ securitySchemes: Optional[dict[str, Union[SecurityScheme, Reference]]] = None
+ links: Optional[dict[str, Union[Link, Reference]]] = None
+ callbacks: Optional[dict[str, Union[Callback, Reference]]] = None
model_config = ConfigDict(
extra="allow",
json_schema_extra={
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/discriminator.py b/openapi_python_client/schema/openapi_schema_pydantic/discriminator.py
index 95161d07a..9f36773ba 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/discriminator.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/discriminator.py
@@ -1,4 +1,4 @@
-from typing import Dict, Optional
+from typing import Optional
from pydantic import BaseModel, ConfigDict
@@ -19,7 +19,7 @@ class Discriminator(BaseModel):
"""
propertyName: str
- mapping: Optional[Dict[str, str]] = None
+ mapping: Optional[dict[str, str]] = None
model_config = ConfigDict(
extra="allow",
json_schema_extra={
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/encoding.py b/openapi_python_client/schema/openapi_schema_pydantic/encoding.py
index b7434c50c..78190363b 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/encoding.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/encoding.py
@@ -1,4 +1,4 @@
-from typing import TYPE_CHECKING, Dict, Optional, Union
+from typing import TYPE_CHECKING, Optional, Union
from pydantic import BaseModel, ConfigDict
@@ -19,7 +19,7 @@ class Encoding(BaseModel):
"""
contentType: Optional[str] = None
- headers: Optional[Dict[str, Union[Header, Reference]]] = None
+ headers: Optional[dict[str, Union[Header, Reference]]] = None
style: Optional[str] = None
explode: bool = False
allowReserved: bool = False
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/link.py b/openapi_python_client/schema/openapi_schema_pydantic/link.py
index 9f823c4a2..69cdf29c0 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/link.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/link.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, Optional
+from typing import Any, Optional
from pydantic import BaseModel, ConfigDict
@@ -25,7 +25,7 @@ class Link(BaseModel):
operationRef: Optional[str] = None
operationId: Optional[str] = None
- parameters: Optional[Dict[str, Any]] = None
+ parameters: Optional[dict[str, Any]] = None
requestBody: Optional[Any] = None
description: Optional[str] = None
server: Optional[Server] = None
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/media_type.py b/openapi_python_client/schema/openapi_schema_pydantic/media_type.py
index 1bda99560..1e4d33b6d 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/media_type.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/media_type.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
from pydantic import BaseModel, ConfigDict, Field
@@ -18,8 +18,8 @@ class MediaType(BaseModel):
media_type_schema: Optional[Union[Reference, Schema]] = Field(default=None, alias="schema")
example: Optional[Any] = None
- examples: Optional[Dict[str, Union[Example, Reference]]] = None
- encoding: Optional[Dict[str, Encoding]] = None
+ examples: Optional[dict[str, Union[Example, Reference]]] = None
+ encoding: Optional[dict[str, Encoding]] = None
model_config = ConfigDict(
extra="allow",
populate_by_name=True,
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/oauth_flow.py b/openapi_python_client/schema/openapi_schema_pydantic/oauth_flow.py
index c7485814f..16e366090 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/oauth_flow.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/oauth_flow.py
@@ -1,4 +1,4 @@
-from typing import Dict, Optional
+from typing import Optional
from pydantic import BaseModel, ConfigDict
@@ -15,7 +15,7 @@ class OAuthFlow(BaseModel):
authorizationUrl: Optional[str] = None
tokenUrl: Optional[str] = None
refreshUrl: Optional[str] = None
- scopes: Dict[str, str]
+ scopes: dict[str, str]
model_config = ConfigDict(
extra="allow",
json_schema_extra={
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/open_api.py b/openapi_python_client/schema/openapi_schema_pydantic/open_api.py
index 6a1b5ae12..4282cfeb5 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/open_api.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/open_api.py
@@ -1,4 +1,4 @@
-from typing import List, Optional
+from typing import Optional
from pydantic import BaseModel, ConfigDict, field_validator
@@ -25,11 +25,11 @@ class OpenAPI(BaseModel):
"""
info: Info
- servers: List[Server] = [Server(url="/")]
+ servers: list[Server] = [Server(url="/")]
paths: Paths
components: Optional[Components] = None
- security: Optional[List[SecurityRequirement]] = None
- tags: Optional[List[Tag]] = None
+ security: Optional[list[SecurityRequirement]] = None
+ tags: Optional[list[Tag]] = None
externalDocs: Optional[ExternalDocumentation] = None
openapi: str
model_config = ConfigDict(extra="allow")
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/operation.py b/openapi_python_client/schema/openapi_schema_pydantic/operation.py
index 41f5e7100..2976e73bf 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/operation.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/operation.py
@@ -1,4 +1,4 @@
-from typing import Dict, List, Optional, Union
+from typing import Optional, Union
from pydantic import BaseModel, ConfigDict, Field
@@ -24,19 +24,19 @@ class Operation(BaseModel):
- https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operationObject
"""
- tags: Optional[List[str]] = None
+ tags: Optional[list[str]] = None
summary: Optional[str] = None
description: Optional[str] = None
externalDocs: Optional[ExternalDocumentation] = None
operationId: Optional[str] = None
- parameters: Optional[List[Union[Parameter, Reference]]] = None
+ parameters: Optional[list[Union[Parameter, Reference]]] = None
request_body: Optional[Union[RequestBody, Reference]] = Field(None, alias="requestBody")
responses: Responses
- callbacks: Optional[Dict[str, Callback]] = None
+ callbacks: Optional[dict[str, Callback]] = None
deprecated: bool = False
- security: Optional[List[SecurityRequirement]] = None
- servers: Optional[List[Server]] = None
+ security: Optional[list[SecurityRequirement]] = None
+ servers: Optional[list[Server]] = None
model_config = ConfigDict(
extra="allow",
json_schema_extra={
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/parameter.py b/openapi_python_client/schema/openapi_schema_pydantic/parameter.py
index 25ba819f1..a46301026 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/parameter.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/parameter.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, Optional, Union
+from typing import Any, Optional, Union
from pydantic import BaseModel, ConfigDict, Field
@@ -32,8 +32,8 @@ class Parameter(BaseModel):
allowReserved: bool = False
param_schema: Optional[Union[Reference, Schema]] = Field(default=None, alias="schema")
example: Optional[Any] = None
- examples: Optional[Dict[str, Union[Example, Reference]]] = None
- content: Optional[Dict[str, MediaType]] = None
+ examples: Optional[dict[str, Union[Example, Reference]]] = None
+ content: Optional[dict[str, MediaType]] = None
model_config = ConfigDict(
extra="allow",
populate_by_name=True,
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/path_item.py b/openapi_python_client/schema/openapi_schema_pydantic/path_item.py
index 36edee0e3..2c68c88b8 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/path_item.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/path_item.py
@@ -1,4 +1,4 @@
-from typing import List, Optional, Union
+from typing import Optional, Union
from pydantic import BaseModel, ConfigDict, Field
@@ -30,8 +30,8 @@ class PathItem(BaseModel):
head: Optional["Operation"] = None
patch: Optional["Operation"] = None
trace: Optional["Operation"] = None
- servers: Optional[List[Server]] = None
- parameters: Optional[List[Union[Parameter, Reference]]] = None
+ servers: Optional[list[Server]] = None
+ parameters: Optional[list[Union[Parameter, Reference]]] = None
model_config = ConfigDict(
extra="allow",
populate_by_name=True,
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/paths.py b/openapi_python_client/schema/openapi_schema_pydantic/paths.py
index d61ea7b18..86c1dfd19 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/paths.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/paths.py
@@ -1,8 +1,6 @@
-from typing import Dict
-
from .path_item import PathItem
-Paths = Dict[str, PathItem]
+Paths = dict[str, PathItem]
"""
Holds the relative paths to the individual endpoints and their operations.
The path is appended to the URL from the [`Server Object`](#serverObject) in order to construct the full URL.
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/request_body.py b/openapi_python_client/schema/openapi_schema_pydantic/request_body.py
index 6b1847215..feaa0c8ea 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/request_body.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/request_body.py
@@ -1,4 +1,4 @@
-from typing import Dict, Optional
+from typing import Optional
from pydantic import BaseModel, ConfigDict
@@ -14,7 +14,7 @@ class RequestBody(BaseModel):
"""
description: Optional[str] = None
- content: Dict[str, MediaType]
+ content: dict[str, MediaType]
required: bool = False
model_config = ConfigDict(
extra="allow",
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/response.py b/openapi_python_client/schema/openapi_schema_pydantic/response.py
index a7c5d08ec..5f5ac73bf 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/response.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/response.py
@@ -1,4 +1,4 @@
-from typing import Dict, Optional, Union
+from typing import Optional, Union
from pydantic import BaseModel, ConfigDict
@@ -19,9 +19,9 @@ class Response(BaseModel):
"""
description: str
- headers: Optional[Dict[str, Union[Header, Reference]]] = None
- content: Optional[Dict[str, MediaType]] = None
- links: Optional[Dict[str, Union[Link, Reference]]] = None
+ headers: Optional[dict[str, Union[Header, Reference]]] = None
+ content: Optional[dict[str, MediaType]] = None
+ links: Optional[dict[str, Union[Link, Reference]]] = None
model_config = ConfigDict(
extra="allow",
json_schema_extra={
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/responses.py b/openapi_python_client/schema/openapi_schema_pydantic/responses.py
index 53306ae1c..17ddc13fe 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/responses.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/responses.py
@@ -1,9 +1,9 @@
-from typing import Dict, Union
+from typing import Union
from .reference import Reference
from .response import Response
-Responses = Dict[str, Union[Response, Reference]]
+Responses = dict[str, Union[Response, Reference]]
"""
A container for the expected responses of an operation.
The container maps a HTTP response code to the expected response.
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/schema.py b/openapi_python_client/schema/openapi_schema_pydantic/schema.py
index d42ccc6ad..486664d5d 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/schema.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/schema.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, List, Optional, Union
+from typing import Any, Optional, Union
from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictFloat, StrictInt, StrictStr, model_validator
@@ -34,17 +34,17 @@ class Schema(BaseModel):
uniqueItems: Optional[bool] = None
maxProperties: Optional[int] = Field(default=None, ge=0)
minProperties: Optional[int] = Field(default=None, ge=0)
- required: Optional[List[str]] = Field(default=None)
- enum: Union[None, List[Any]] = Field(default=None, min_length=1)
+ required: Optional[list[str]] = Field(default=None)
+ enum: Union[None, list[Any]] = Field(default=None, min_length=1)
const: Union[None, StrictStr, StrictInt, StrictFloat, StrictBool] = None
- type: Union[DataType, List[DataType], None] = Field(default=None)
- allOf: List[Union[Reference, "Schema"]] = Field(default_factory=list)
- oneOf: List[Union[Reference, "Schema"]] = Field(default_factory=list)
- anyOf: List[Union[Reference, "Schema"]] = Field(default_factory=list)
+ type: Union[DataType, list[DataType], None] = Field(default=None)
+ allOf: list[Union[Reference, "Schema"]] = Field(default_factory=list)
+ oneOf: list[Union[Reference, "Schema"]] = Field(default_factory=list)
+ anyOf: list[Union[Reference, "Schema"]] = Field(default_factory=list)
schema_not: Optional[Union[Reference, "Schema"]] = Field(default=None, alias="not")
items: Optional[Union[Reference, "Schema"]] = None
- prefixItems: Optional[List[Union[Reference, "Schema"]]] = Field(default_factory=list)
- properties: Optional[Dict[str, Union[Reference, "Schema"]]] = None
+ prefixItems: Optional[list[Union[Reference, "Schema"]]] = Field(default_factory=list)
+ properties: Optional[dict[str, Union[Reference, "Schema"]]] = None
additionalProperties: Optional[Union[bool, Reference, "Schema"]] = None
description: Optional[str] = None
schema_format: Optional[str] = Field(default=None, alias="format")
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/security_requirement.py b/openapi_python_client/schema/openapi_schema_pydantic/security_requirement.py
index b3cca3b08..58a487dc7 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/security_requirement.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/security_requirement.py
@@ -1,6 +1,4 @@
-from typing import Dict, List
-
-SecurityRequirement = Dict[str, List[str]]
+SecurityRequirement = dict[str, list[str]]
"""
Lists the required security schemes to execute this operation.
The name used for each property MUST correspond to a security scheme declared in the
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/server.py b/openapi_python_client/schema/openapi_schema_pydantic/server.py
index d573a93fe..6bc21766c 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/server.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/server.py
@@ -1,4 +1,4 @@
-from typing import Dict, Optional
+from typing import Optional
from pydantic import BaseModel, ConfigDict
@@ -15,7 +15,7 @@ class Server(BaseModel):
url: str
description: Optional[str] = None
- variables: Optional[Dict[str, ServerVariable]] = None
+ variables: Optional[dict[str, ServerVariable]] = None
model_config = ConfigDict(
extra="allow",
json_schema_extra={
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/server_variable.py b/openapi_python_client/schema/openapi_schema_pydantic/server_variable.py
index 3b63c9ad2..8a869c40e 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/server_variable.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/server_variable.py
@@ -1,4 +1,4 @@
-from typing import List, Optional
+from typing import Optional
from pydantic import BaseModel, ConfigDict
@@ -11,7 +11,7 @@ class ServerVariable(BaseModel):
- https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#serverVariableObject
"""
- enum: Optional[List[str]] = None
+ enum: Optional[list[str]] = None
default: str
description: Optional[str] = None
model_config = ConfigDict(extra="allow")
diff --git a/openapi_python_client/templates/client.py.jinja b/openapi_python_client/templates/client.py.jinja
index 4f224e6e8..aee6096e9 100644
--- a/openapi_python_client/templates/client.py.jinja
+++ b/openapi_python_client/templates/client.py.jinja
@@ -1,5 +1,5 @@
import ssl
-from typing import Any, Dict, Union, Optional
+from typing import Any, Union, Optional
from attrs import define, field, evolve
import httpx
@@ -38,17 +38,17 @@ class Client:
{% macro attributes() %}
raise_on_unexpected_status: bool = field(default=False, kw_only=True)
_base_url: str = field(alias="base_url")
- _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
- _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
+ _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
+ _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True, alias="timeout")
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(default=True, kw_only=True, alias="verify_ssl")
_follow_redirects: bool = field(default=False, kw_only=True, alias="follow_redirects")
- _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
+ _httpx_args: dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
_client: Optional[httpx.Client] = field(default=None, init=False)
_async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
{% endmacro %}{{ attributes() }}
{% macro builders(self) %}
- def with_headers(self, headers: Dict[str, str]) -> "{{ self }}":
+ def with_headers(self, headers: dict[str, str]) -> "{{ self }}":
"""Get a new client matching this one with additional headers"""
if self._client is not None:
self._client.headers.update(headers)
@@ -56,7 +56,7 @@ class Client:
self._async_client.headers.update(headers)
return evolve(self, headers={**self._headers, **headers})
- def with_cookies(self, cookies: Dict[str, str]) -> "{{ self }}":
+ def with_cookies(self, cookies: dict[str, str]) -> "{{ self }}":
"""Get a new client matching this one with additional cookies"""
if self._client is not None:
self._client.cookies.update(cookies)
diff --git a/openapi_python_client/templates/endpoint_macros.py.jinja b/openapi_python_client/templates/endpoint_macros.py.jinja
index 79ca33d57..2da580af4 100644
--- a/openapi_python_client/templates/endpoint_macros.py.jinja
+++ b/openapi_python_client/templates/endpoint_macros.py.jinja
@@ -3,7 +3,7 @@
{% macro header_params(endpoint) %}
{% if endpoint.header_parameters or endpoint.bodies | length > 0 %}
-headers: Dict[str, Any] = {}
+headers: dict[str, Any] = {}
{% if endpoint.header_parameters %}
{% for parameter in endpoint.header_parameters %}
{% import "property_templates/" + parameter.template as param_template %}
@@ -37,7 +37,7 @@ if {{ parameter.python_name }} is not UNSET:
{% macro query_params(endpoint) %}
{% if endpoint.query_parameters %}
-params: Dict[str, Any] = {}
+params: dict[str, Any] = {}
{% for property in endpoint.query_parameters %}
{% set destination = property.python_name %}
diff --git a/openapi_python_client/templates/endpoint_module.py.jinja b/openapi_python_client/templates/endpoint_module.py.jinja
index d89f09367..35090614c 100644
--- a/openapi_python_client/templates/endpoint_module.py.jinja
+++ b/openapi_python_client/templates/endpoint_module.py.jinja
@@ -1,5 +1,5 @@
from http import HTTPStatus
-from typing import Any, Dict, List, Optional, Union, cast
+from typing import Any, Optional, Union, cast
import httpx
@@ -19,14 +19,14 @@ from ... import errors
def _get_kwargs(
{{ arguments(endpoint, include_client=False) | indent(4) }}
-) -> Dict[str, Any]:
+) -> dict[str, Any]:
{{ header_params(endpoint) | indent(4) }}
{{ cookie_params(endpoint) | indent(4) }}
{{ query_params(endpoint) | indent(4) }}
- _kwargs: Dict[str, Any] = {
+ _kwargs: dict[str, Any] = {
"method": "{{ endpoint.method }}",
{% if endpoint.path_parameters %}
"url": "{{ endpoint.path }}".format(
diff --git a/openapi_python_client/templates/literal_enum.py.jinja b/openapi_python_client/templates/literal_enum.py.jinja
index df993adb7..72207efa3 100644
--- a/openapi_python_client/templates/literal_enum.py.jinja
+++ b/openapi_python_client/templates/literal_enum.py.jinja
@@ -1,8 +1,8 @@
-from typing import Literal, Set, cast
+from typing import Literal, cast
{{ enum.class_info.name }} = Literal{{ "%r" | format(enum.values|list|sort) }}
-{{ enum.get_class_name_snake_case() | upper }}_VALUES: Set[{{ enum.class_info.name }}] = { {% for v in enum.values|list|sort %}{{"%r"|format(v)}}, {% endfor %} }
+{{ enum.get_class_name_snake_case() | upper }}_VALUES: set[{{ enum.class_info.name }}] = { {% for v in enum.values|list|sort %}{{"%r"|format(v)}}, {% endfor %} }
def check_{{ enum.get_class_name_snake_case() }}(value: {{ enum.get_instance_type_string() }}) -> {{ enum.class_info.name}}:
if value in {{ enum.get_class_name_snake_case() | upper }}_VALUES:
diff --git a/openapi_python_client/templates/model.py.jinja b/openapi_python_client/templates/model.py.jinja
index 012201426..739f68962 100644
--- a/openapi_python_client/templates/model.py.jinja
+++ b/openapi_python_client/templates/model.py.jinja
@@ -1,9 +1,4 @@
-from typing import Any, Dict, Type, TypeVar, Tuple, Optional, BinaryIO, TextIO, TYPE_CHECKING
-
-{% if model.additional_properties %}
-from typing import List
-
-{% endif %}
+from typing import Any, TypeVar, Optional, BinaryIO, TextIO, TYPE_CHECKING
from attrs import define as _attrs_define
from attrs import field as _attrs_field
@@ -74,7 +69,7 @@ class {{ class_name }}:
{% endif %}
{% endfor %}
{% if model.additional_properties %}
- additional_properties: Dict[str, {{ additional_property_type }}] = _attrs_field(init=False, factory=dict)
+ additional_properties: dict[str, {{ additional_property_type }}] = _attrs_field(init=False, factory=dict)
{% endif %}
{% macro _to_dict(multipart=False) %}
@@ -90,7 +85,7 @@ class {{ class_name }}:
{% endfor %}
-field_dict: Dict[str, Any] = {}
+field_dict: dict[str, Any] = {}
{% if model.additional_properties %}
{% import "property_templates/" + model.additional_properties.template as prop_template %}
{% if multipart %}
@@ -122,19 +117,19 @@ if {{ property.python_name }} is not UNSET:
return field_dict
{% endmacro %}
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
{% for lazy_import in model.lazy_imports %}
{{ lazy_import }}
{% endfor %}
{{ _to_dict() | indent(8) }}
{% if model.is_multipart_body %}
- def to_multipart(self) -> Dict[str, Any]:
+ def to_multipart(self) -> dict[str, Any]:
{{ _to_dict(multipart=True) | indent(8) }}
{% endif %}
@classmethod
- def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
+ def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
{% for lazy_import in model.lazy_imports %}
{{ lazy_import }}
{% endfor %}
@@ -188,7 +183,7 @@ return field_dict
{% if model.additional_properties %}
@property
- def additional_keys(self) -> List[str]:
+ def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> {{ additional_property_type }}:
diff --git a/openapi_python_client/templates/property_templates/enum_property.py.jinja b/openapi_python_client/templates/property_templates/enum_property.py.jinja
index ea9b66a51..c46538eac 100644
--- a/openapi_python_client/templates/property_templates/enum_property.py.jinja
+++ b/openapi_python_client/templates/property_templates/enum_property.py.jinja
@@ -24,7 +24,7 @@ if not isinstance({{ source }}, Unset):
{% macro transform_multipart(property, source, destination) %}
{% set transformed = "(None, str(" + source + ".value" + ").encode(), \"text/plain\")" %}
-{% set type_string = "Union[Unset, Tuple[None, bytes, str]]" %}
+{% set type_string = "Union[Unset, tuple[None, bytes, str]]" %}
{% if property.required %}
{{ destination }} = {{ transformed }}
{%- else %}
diff --git a/openapi_python_client/templates/property_templates/list_property.py.jinja b/openapi_python_client/templates/property_templates/list_property.py.jinja
index c827b6d54..94a9c6d65 100644
--- a/openapi_python_client/templates/property_templates/list_property.py.jinja
+++ b/openapi_python_client/templates/property_templates/list_property.py.jinja
@@ -54,7 +54,7 @@ if not isinstance({{ source }}, Unset):
{% macro transform_multipart(property, source, destination) %}
{% set inner_property = property.inner_property %}
-{% set type_string = "Union[Unset, Tuple[None, bytes, str]]" %}
+{% set type_string = "Union[Unset, tuple[None, bytes, str]]" %}
{% if property.required %}
{{ _transform(property, source, destination, True, "to_dict") }}
{% else %}
diff --git a/openapi_python_client/templates/property_templates/literal_enum_property.py.jinja b/openapi_python_client/templates/property_templates/literal_enum_property.py.jinja
index 680ebfabe..1506284d7 100644
--- a/openapi_python_client/templates/property_templates/literal_enum_property.py.jinja
+++ b/openapi_python_client/templates/property_templates/literal_enum_property.py.jinja
@@ -23,7 +23,7 @@ if not isinstance({{ source }}, Unset):
{% macro transform_multipart(property, source, destination) %}
{% set transformed = "(None, str(" + source + ").encode(), \"text/plain\")" %}
-{% set type_string = "Union[Unset, Tuple[None, bytes, str]]" %}
+{% set type_string = "Union[Unset, tuple[None, bytes, str]]" %}
{% if property.required %}
{{ destination }} = {{ transformed }}
{%- else %}
diff --git a/openapi_python_client/templates/pyproject.toml.jinja b/openapi_python_client/templates/pyproject.toml.jinja
index 7f68d58e5..e480f6729 100644
--- a/openapi_python_client/templates/pyproject.toml.jinja
+++ b/openapi_python_client/templates/pyproject.toml.jinja
@@ -9,7 +9,7 @@ version = "{{ package_version }}"
description = "{{ package_description }}"
authors = []
readme = "README.md"
-{% if pdm %}requires-python = ">=3.8,<4.0"{% endif %}
+{% if pdm %}requires-python = ">=3.9,<4.0"{% endif %}
{% if poetry %}
packages = [
{include = "{{ package_name }}"},
@@ -30,7 +30,7 @@ distribution = true
{% if poetry %}
[tool.poetry.dependencies]
-python = "^3.8"
+python = "^3.9"
httpx = ">=0.20.0,<0.28.0"
attrs = ">=21.3.0"
python-dateutil = "^2.8.0"
diff --git a/openapi_python_client/templates/setup.py.jinja b/openapi_python_client/templates/setup.py.jinja
index 87c0cc063..e577c28b9 100644
--- a/openapi_python_client/templates/setup.py.jinja
+++ b/openapi_python_client/templates/setup.py.jinja
@@ -12,7 +12,7 @@ setup(
long_description=long_description,
long_description_content_type="text/markdown",
packages=find_packages(),
- python_requires=">=3.8, <4",
+ python_requires=">=3.9, <4",
install_requires=["httpx >= 0.20.0, < 0.28.0", "attrs >= 21.3.0", "python-dateutil >= 2.8.0, < 3"],
package_data={"{{ package_name }}": ["py.typed"]},
)
diff --git a/openapi_python_client/templates/types.py.jinja b/openapi_python_client/templates/types.py.jinja
index cc151acb3..65e87af47 100644
--- a/openapi_python_client/templates/types.py.jinja
+++ b/openapi_python_client/templates/types.py.jinja
@@ -1,6 +1,8 @@
""" Contains some shared types for properties """
+
+from collections.abc import MutableMapping
from http import HTTPStatus
-from typing import Any, BinaryIO, Generic, MutableMapping, Optional, Tuple, TypeVar, Literal
+from typing import BinaryIO, Generic, Optional, TypeVar, Literal
from attrs import define
@@ -13,7 +15,7 @@ class Unset:
UNSET: Unset = Unset()
{# Used as `FileProperty._json_type_string` #}
-FileJsonType = Tuple[Optional[str], BinaryIO, Optional[str]]
+FileJsonType = tuple[Optional[str], BinaryIO, Optional[str]]
@define
diff --git a/openapi_python_client/utils.py b/openapi_python_client/utils.py
index 22a7bcfa8..15e8c9eec 100644
--- a/openapi_python_client/utils.py
+++ b/openapi_python_client/utils.py
@@ -57,7 +57,6 @@ def split_words(value: str) -> list[str]:
RESERVED_WORDS = (set(dir(builtins)) | {"self", "true", "false", "datetime"}) - {
- "type",
"id",
}
diff --git a/pdm.lock b/pdm.lock
index 6aca0368e..13dafbd8d 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -5,10 +5,10 @@
groups = ["default", "dev"]
strategy = ["inherit_metadata"]
lock_version = "4.5.0"
-content_hash = "sha256:b73d22dbc5f83e955263b2941d1ec9b6ef27a6487f3d274afd8e70f27e10c696"
+content_hash = "sha256:54c7ff6db9dfa230f551918c71b6a59a51203d8f8dd3a53af8034c46a8eafd82"
[[metadata.targets]]
-requires_python = ">=3.8.1,<4.0"
+requires_python = "~=3.9"
[[package]]
name = "annotated-types"
@@ -750,7 +750,7 @@ files = [
[[package]]
name = "rich"
-version = "13.9.4"
+version = "13.9.2"
requires_python = ">=3.8.0"
summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
groups = ["default"]
@@ -760,8 +760,8 @@ dependencies = [
"typing-extensions<5.0,>=4.0.0; python_version < \"3.11\"",
]
files = [
- {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"},
- {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"},
+ {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"},
+ {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"},
]
[[package]]
@@ -949,7 +949,7 @@ files = [
[[package]]
name = "typer"
-version = "0.13.0"
+version = "0.12.5"
requires_python = ">=3.7"
summary = "Typer, build great CLIs. Easy to code. Based on Python type hints."
groups = ["default"]
@@ -960,8 +960,8 @@ dependencies = [
"typing-extensions>=3.7.4.3",
]
files = [
- {file = "typer-0.13.0-py3-none-any.whl", hash = "sha256:d85fe0b777b2517cc99c8055ed735452f2659cd45e451507c76f48ce5c1d00e2"},
- {file = "typer-0.13.0.tar.gz", hash = "sha256:f1c7198347939361eec90139ffa0fd8b3df3a2259d5852a0f7400e476d95985c"},
+ {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"},
+ {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"},
]
[[package]]
diff --git a/pyproject.toml b/pyproject.toml
index 68d7f18d3..cd94cefdd 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -3,7 +3,7 @@ authors = [
{ name = "Dylan Anthony", email = "contact@dylananthony.com" },
]
license = { text = "MIT" }
-requires-python = ">=3.8.1,<4.0"
+requires-python = ">=3.9,<4.0"
dependencies = [
"jinja2>=3.0.0,<4.0.0",
"typer>0.6,<0.14",
@@ -30,7 +30,6 @@ classifiers = [
"License :: OSI Approved :: MIT License",
"Intended Audience :: Developers",
"Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
diff --git a/tests/test_parser/test_properties/test_enum_property.py b/tests/test_parser/test_properties/test_enum_property.py
index 21b183f8e..282298aaf 100644
--- a/tests/test_parser/test_properties/test_enum_property.py
+++ b/tests/test_parser/test_properties/test_enum_property.py
@@ -1,4 +1,4 @@
-from typing import Type, Union
+from typing import Union
import pytest
@@ -8,7 +8,7 @@
from openapi_python_client.parser.properties import LiteralEnumProperty, Schemas
from openapi_python_client.parser.properties.enum_property import EnumProperty
-PropertyClass = Union[Type[EnumProperty], Type[LiteralEnumProperty]]
+PropertyClass = Union[type[EnumProperty], type[LiteralEnumProperty]]
@pytest.fixture(params=[EnumProperty, LiteralEnumProperty])
diff --git a/tests/test_parser/test_properties/test_init.py b/tests/test_parser/test_properties/test_init.py
index f56bf065d..918defcdb 100644
--- a/tests/test_parser/test_properties/test_init.py
+++ b/tests/test_parser/test_properties/test_init.py
@@ -129,13 +129,13 @@ def test_is_base_type(self, list_property_factory):
@pytest.mark.parametrize("quoted", (True, False))
def test_get_base_json_type_string_base_inner(self, list_property_factory, quoted):
p = list_property_factory()
- assert p.get_base_json_type_string(quoted=quoted) == "List[str]"
+ assert p.get_base_json_type_string(quoted=quoted) == "list[str]"
@pytest.mark.parametrize("quoted", (True, False))
def test_get_base_json_type_string_model_inner(self, list_property_factory, model_property_factory, quoted):
m = model_property_factory()
p = list_property_factory(inner_property=m)
- assert p.get_base_json_type_string(quoted=quoted) == "List[Dict[str, Any]]"
+ assert p.get_base_json_type_string(quoted=quoted) == "list[dict[str, Any]]"
def test_get_lazy_import_base_inner(self, list_property_factory):
p = list_property_factory()
@@ -149,8 +149,8 @@ def test_get_lazy_import_model_inner(self, list_property_factory, model_property
@pytest.mark.parametrize(
"required, expected",
(
- (True, "List[str]"),
- (False, "Union[Unset, List[str]]"),
+ (True, "list[str]"),
+ (False, "Union[Unset, list[str]]"),
),
)
def test_get_type_string_base_inner(self, list_property_factory, required, expected):
@@ -161,8 +161,8 @@ def test_get_type_string_base_inner(self, list_property_factory, required, expec
@pytest.mark.parametrize(
"required, expected",
(
- (True, "List['MyClass']"),
- (False, "Union[Unset, List['MyClass']]"),
+ (True, "list['MyClass']"),
+ (False, "Union[Unset, list['MyClass']]"),
),
)
def test_get_type_string_model_inner(self, list_property_factory, model_property_factory, required, expected):
@@ -174,8 +174,8 @@ def test_get_type_string_model_inner(self, list_property_factory, model_property
@pytest.mark.parametrize(
"quoted,expected",
[
- (False, "List[str]"),
- (True, "List[str]"),
+ (False, "list[str]"),
+ (True, "list[str]"),
],
)
def test_get_base_type_string_base_inner(self, list_property_factory, quoted, expected):
@@ -185,8 +185,8 @@ def test_get_base_type_string_base_inner(self, list_property_factory, quoted, ex
@pytest.mark.parametrize(
"quoted,expected",
[
- (False, "List['MyClass']"),
- (True, "List['MyClass']"),
+ (False, "list['MyClass']"),
+ (True, "list['MyClass']"),
],
)
def test_get_base_type_string_model_inner(self, list_property_factory, model_property_factory, quoted, expected):
@@ -202,7 +202,6 @@ def test_get_type_imports(self, list_property_factory, date_time_property_factor
"import datetime",
"from typing import cast",
"from dateutil.parser import isoparse",
- "from typing import cast, List",
}
if not required:
expected |= {
diff --git a/tests/test_parser/test_properties/test_model_property.py b/tests/test_parser/test_properties/test_model_property.py
index 8adc88e39..a51fd984b 100644
--- a/tests/test_parser/test_properties/test_model_property.py
+++ b/tests/test_parser/test_properties/test_model_property.py
@@ -19,12 +19,12 @@ class TestModelProperty:
(False, True, False, False, "MyClass"),
(True, False, False, False, "MyClass"),
(True, True, False, False, "MyClass"),
- (False, True, True, False, "Dict[str, Any]"),
+ (False, True, True, False, "dict[str, Any]"),
(False, False, False, True, "Union[Unset, 'MyClass']"),
(False, True, False, True, "'MyClass'"),
(True, False, False, True, "'MyClass'"),
(True, True, False, True, "'MyClass'"),
- (False, True, True, True, "Dict[str, Any]"),
+ (False, True, True, True, "dict[str, Any]"),
],
)
def test_get_type_string(self, no_optional, required, json, expected, model_property_factory, quoted):
@@ -40,7 +40,6 @@ def test_get_imports(self, model_property_factory):
assert prop.get_imports(prefix="..") == {
"from typing import Union",
"from ..types import UNSET, Unset",
- "from typing import Dict",
"from typing import cast",
}
@@ -719,8 +718,8 @@ def test_set_relative_imports(model_property_factory):
from openapi_python_client.parser.properties import Class
class_info = Class("ClassName", module_name="module_name")
- relative_imports = {"from typing import List", f"from ..models.{class_info.module_name} import {class_info.name}"}
+ relative_imports = {f"from ..models.{class_info.module_name} import {class_info.name}"}
model_property = model_property_factory(class_info=class_info, relative_imports=relative_imports)
- assert model_property.relative_imports == {"from typing import List"}
+ assert model_property.relative_imports == set()
diff --git a/tests/test_utils.py b/tests/test_utils.py
index e7dccf9a8..fafa61805 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -99,7 +99,7 @@ def test_no_string_escapes():
("int", "int_"),
("dict", "dict_"),
("not_reserved", "not_reserved"),
- ("type", "type"),
+ ("type", "type_"),
("id", "id"),
("None", "None_"),
],
From 7aac7c512688fdbcd0b548600ecd56580d05a254 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sat, 23 Nov 2024 02:01:27 +0000
Subject: [PATCH 04/18] chore(deps): update pypa/gh-action-pypi-publish action
to v1.12.2 (#1155)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
|
[pypa/gh-action-pypi-publish](https://redirect.github.com/pypa/gh-action-pypi-publish)
| action | minor | `v1.10.3` -> `v1.12.2` |
---
### Release Notes
pypa/gh-action-pypi-publish
(pypa/gh-action-pypi-publish)
###
[`v1.12.2`](https://redirect.github.com/pypa/gh-action-pypi-publish/releases/tag/v1.12.2)
[Compare
Source](https://redirect.github.com/pypa/gh-action-pypi-publish/compare/v1.12.1...v1.12.2)
#### 🐛 What's Fixed
The fix for signing legacy zip sdists turned out to be incomplete, so
[@woodruffw](https://redirect.github.com/woodruffw)[💰](https://redirect.github.com/sponsors/woodruffw)
promptly produced another follow-up that updated `pypi-attestations`
from v0.0.13 to v0.0.15 in
[#297](https://redirect.github.com/pypa/gh-action-pypi-publish/issues/297).
This is the only change since the previous release.
**🪞 Full Diff**:
https://github.com/pypa/gh-action-pypi-publish/compare/v1.12.1...v1.12.2
**🧔♂️ Release Manager:**
[@webknjaz](https://redirect.github.com/sponsors/webknjaz)
[🇺🇦](https://stand-with-ukraine.pp.ua)
###
[`v1.12.1`](https://redirect.github.com/pypa/gh-action-pypi-publish/compare/v1.12.0...v1.12.1)
[Compare
Source](https://redirect.github.com/pypa/gh-action-pypi-publish/compare/v1.12.0...v1.12.1)
###
[`v1.12.0`](https://redirect.github.com/pypa/gh-action-pypi-publish/releases/tag/v1.12.0)
[Compare
Source](https://redirect.github.com/pypa/gh-action-pypi-publish/compare/v1.11.0...v1.12.0)
##### ⚡️ Why Should You Update?
This is a minor version bump, but it does not add any new user-facing
interfaces. Still, I felt like it should not be a patch-release: this
update brings *significant changes* to the action invocation and
internal release process.
Previously, each invocation of [`pypi-publish`][pypi-publish] required
building a container image in the invoking CI job. This was inefficient
and added about 30 seconds to the publishing jobs at their startup just
to build the container.
I wanted to improve this for over three years
([#58](https://redirect.github.com/pypa/gh-action-pypi-publish/issues/58))
and a little over half a year ago
[@br3ndonland](https://redirect.github.com/br3ndonland)[💰](https://redirect.github.com/sponsors/br3ndonland)
stepped up and offered a very comprehensive solution to the limitation I
was hoping to overcome:
[#230](https://redirect.github.com/pypa/gh-action-pypi-publish/issues/230).
Going forward, I'm going to pre-build per-version containers prior to
cutting each release. And the action invocations will just pull the
image from GitHub Container registry.
**🪞 Full Diff**:
https://github.com/pypa/gh-action-pypi-publish/compare/v1.11.0...v1.12.0
**🧔♂️ Release Manager:** [@webknjaz
🇺🇦](https://redirect.github.com/sponsors/webknjaz)
[`pypi-publish`]:
https://redirect.github.com/marketplace/actions/pypi-publish
###
[`v1.11.0`](https://redirect.github.com/pypa/gh-action-pypi-publish/releases/tag/v1.11.0)
[Compare
Source](https://redirect.github.com/pypa/gh-action-pypi-publish/compare/v1.10.3...v1.11.0)
#### 🔏 Helping you become a trusted supply chain link 🔗
Two months ago, in
[v1.10.0](https://redirect.github.com/pypa/gh-action-pypi-publish/releases/tag/v1.10.0),
[@woodruffw](https://redirect.github.com/woodruffw)[💰](https://redirect.github.com/sponsors/woodruffw)
integrated support for generating and uploading [PEP 740] digital
attestations that can be used as provenance objects when analyzing
dependency chains for the integrity.
To make sure it works well, it was implemented as an opt-in, so a
relatively small subset of projects was able to try it out, and a few
issues have been determined and fixed during this time.
That changes today! This version changes the feature toggle to [“on by
default”](https://redirect.github.com/marketplace/actions/pypi-publish#generating-and-uploading-attestations).
This means that from now on, every project making use of Trusted
Publishing will start producing and publishing digital attestations
without having to do any modifications to how they use this action.
[@woodruffw](https://redirect.github.com/woodruffw)[💰](https://redirect.github.com/sponsors/woodruffw)
flipped the respective toggle in
[#277](https://redirect.github.com/pypa/gh-action-pypi-publish/issues/277)
with the possibility to opt-out.
#### 🛠️ Internal Dependencies
[@woodruffw](https://redirect.github.com/woodruffw)[💰](https://redirect.github.com/sponsors/woodruffw)
bumped `sigstore` to v3.5.1 and `pypi-attestations` to v0.0.13 in lock
files via
[#276](https://redirect.github.com/pypa/gh-action-pypi-publish/issues/276).
**🪞 Full Diff**:
https://github.com/pypa/gh-action-pypi-publish/compare/v1.10.3...v1.11.0
**🧔♂️ Release Manager:** [@webknjaz
🇺🇦](https://redirect.github.com/sponsors/webknjaz)
**🙏 Special Thanks** to William for working on improving the supply
chain provenance in the ecosystem! The overall effort is tracked
@[https://github.com/pypi/warehouse/issues/15871](https://redirect.github.com/pypi/warehouse/issues/15871)/15871.
[PEP 740]: https://peps.python.org/pep-0740/
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/openapi-generators/openapi-python-client).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
.github/workflows/release.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index bd34b1c41..f054ed2a3 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -18,6 +18,6 @@ jobs:
- name: Build
run: hatchling build
- name: Push to PyPI
- uses: pypa/gh-action-pypi-publish@v1.10.3
+ uses: pypa/gh-action-pypi-publish@v1.12.2
with:
attestations: true
From 861ef5622f10fc96d240dc9becb0edf94e61446c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sat, 23 Nov 2024 02:07:49 +0000
Subject: [PATCH 05/18] feat: Support Ruff 0.8 (#1169)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://docs.astral.sh/ruff)
([source](https://redirect.github.com/astral-sh/ruff),
[changelog](https://redirect.github.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `>=0.2,<0.8` -> `>=0.2,<0.9` |
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
---
### Release Notes
astral-sh/ruff (ruff)
###
[`v0.8.0`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#080)
[Compare
Source](https://redirect.github.com/astral-sh/ruff/compare/0.7.4...0.8.0)
Check out the [blog post](https://astral.sh/blog/ruff-v0.8.0) for a
migration guide and overview of the changes!
##### Breaking changes
See also, the "Remapped rules" section which may result in disabled
rules.
- **Default to Python 3.9**
Ruff now defaults to Python 3.9 instead of 3.8 if no explicit Python
version is configured using
[`ruff.target-version`](https://docs.astral.sh/ruff/settings/#target-version)
or
[`project.requires-python`](https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#python-requires)
([#13896](https://redirect.github.com/astral-sh/ruff/pull/13896))
- **Changed location of `pydoclint` diagnostics**
[`pydoclint`](https://docs.astral.sh/ruff/rules/#pydoclint-doc)
diagnostics now point to the first-line of the problematic docstring.
Previously, this was not the case.
If you've opted into these preview rules but have them suppressed using
[`noqa`](https://docs.astral.sh/ruff/linter/#error-suppression) comments
in
some places, this change may mean that you need to move the `noqa`
suppression
comments. Most users should be unaffected by this change.
- **Use XDG (i.e. `~/.local/bin`) instead of the Cargo home directory in
the standalone installer**
Previously, Ruff's installer used `$CARGO_HOME` or `~/.cargo/bin` for
its target install directory. Now, Ruff will be installed into
`$XDG_BIN_HOME`, `$XDG_DATA_HOME/../bin`, or `~/.local/bin` (in that
order).
This change is only relevant to users of the standalone Ruff installer
(using the shell or PowerShell script). If you installed Ruff using uv
or pip, you should be unaffected.
- **Changes to the line width calculation**
Ruff now uses a new version of the
[unicode-width](https://redirect.github.com/unicode-rs/unicode-width)
Rust crate to calculate the line width. In very rare cases, this may
lead to lines containing Unicode characters being reformatted, or being
considered too long when they were not before
([`E501`](https://docs.astral.sh/ruff/rules/line-too-long/)).
##### Removed Rules
The following deprecated rules have been removed:
-
[`missing-type-self`](https://docs.astral.sh/ruff/rules/missing-type-self/)
(`ANN101`)
-
[`missing-type-cls`](https://docs.astral.sh/ruff/rules/missing-type-cls/)
(`ANN102`)
- [`syntax-error`](https://docs.astral.sh/ruff/rules/syntax-error/)
(`E999`)
-
[`pytest-missing-fixture-name-underscore`](https://docs.astral.sh/ruff/rules/pytest-missing-fixture-name-underscore/)
(`PT004`)
-
[`pytest-incorrect-fixture-name-underscore`](https://docs.astral.sh/ruff/rules/pytest-incorrect-fixture-name-underscore/)
(`PT005`)
-
[`unpacked-list-comprehension`](https://docs.astral.sh/ruff/rules/unpacked-list-comprehension/)
(`UP027`)
##### Remapped rules
The following rules have been remapped to new rule codes:
-
[`flake8-type-checking`](https://docs.astral.sh/ruff/rules/#flake8-type-checking-tc):
`TCH` to `TC`
##### Stabilization
The following rules have been stabilized and are no longer in preview:
-
[`builtin-import-shadowing`](https://docs.astral.sh/ruff/rules/builtin-import-shadowing/)
(`A004`)
-
[`mutable-contextvar-default`](https://docs.astral.sh/ruff/rules/mutable-contextvar-default/)
(`B039`)
-
[`fast-api-redundant-response-model`](https://docs.astral.sh/ruff/rules/fast-api-redundant-response-model/)
(`FAST001`)
-
[`fast-api-non-annotated-dependency`](https://docs.astral.sh/ruff/rules/fast-api-non-annotated-dependency/)
(`FAST002`)
-
[`dict-index-missing-items`](https://docs.astral.sh/ruff/rules/dict-index-missing-items/)
(`PLC0206`)
-
[`pep484-style-positional-only-argument`](https://docs.astral.sh/ruff/rules/pep484-style-positional-only-argument/)
(`PYI063`)
-
[`redundant-final-literal`](https://docs.astral.sh/ruff/rules/redundant-final-literal/)
(`PYI064`)
-
[`bad-version-info-order`](https://docs.astral.sh/ruff/rules/bad-version-info-order/)
(`PYI066`)
-
[`parenthesize-chained-operators`](https://docs.astral.sh/ruff/rules/parenthesize-chained-operators/)
(`RUF021`)
-
[`unsorted-dunder-all`](https://docs.astral.sh/ruff/rules/unsorted-dunder-all/)
(`RUF022`)
-
[`unsorted-dunder-slots`](https://docs.astral.sh/ruff/rules/unsorted-dunder-slots/)
(`RUF023`)
-
[`assert-with-print-message`](https://docs.astral.sh/ruff/rules/assert-with-print-message/)
(`RUF030`)
-
[`unnecessary-default-type-args`](https://docs.astral.sh/ruff/rules/unnecessary-default-type-args/)
(`UP043`)
The following behaviors have been stabilized:
-
[`ambiguous-variable-name`](https://docs.astral.sh/ruff/rules/ambiguous-variable-name/)
(`E741`): Violations in stub files are now ignored. Stub authors
typically don't control variable names.
-
[`printf-string-formatting`](https://docs.astral.sh/ruff/rules/printf-string-formatting/)
(`UP031`): Report all `printf`-like usages even if no autofix is
available
The following fixes have been stabilized:
-
[`zip-instead-of-pairwise`](https://docs.astral.sh/ruff/rules/zip-instead-of-pairwise/)
(`RUF007`)
##### Preview features
- \[`flake8-datetimez`] Exempt `min.time()` and `max.time()` (`DTZ901`)
([#14394](https://redirect.github.com/astral-sh/ruff/pull/14394))
- \[`flake8-pie`] Mark fix as unsafe if the following statement is a
string literal (`PIE790`)
([#14393](https://redirect.github.com/astral-sh/ruff/pull/14393))
- \[`flake8-pyi`] New rule `redundant-none-literal` (`PYI061`)
([#14316](https://redirect.github.com/astral-sh/ruff/pull/14316))
- \[`flake8-pyi`] Add autofix for `redundant-numeric-union` (`PYI041`)
([#14273](https://redirect.github.com/astral-sh/ruff/pull/14273))
- \[`ruff`] New rule `map-int-version-parsing` (`RUF048`)
([#14373](https://redirect.github.com/astral-sh/ruff/pull/14373))
- \[`ruff`] New rule `redundant-bool-literal` (`RUF038`)
([#14319](https://redirect.github.com/astral-sh/ruff/pull/14319))
- \[`ruff`] New rule `unraw-re-pattern` (`RUF039`)
([#14446](https://redirect.github.com/astral-sh/ruff/pull/14446))
- \[`pycodestyle`] Exempt `pytest.importorskip()` calls (`E402`)
([#14474](https://redirect.github.com/astral-sh/ruff/pull/14474))
- \[`pylint`] Autofix suggests using sets when possible (`PLR1714`)
([#14372](https://redirect.github.com/astral-sh/ruff/pull/14372))
##### Rule changes
-
[`invalid-pyproject-toml`](https://docs.astral.sh/ruff/rules/invalid-pyproject-toml/)
(`RUF200`): Updated to reflect the provisionally accepted [PEP
639](https://peps.python.org/pep-0639/).
- \[`flake8-pyi`] Avoid panic in unfixable case (`PYI041`)
([#14402](https://redirect.github.com/astral-sh/ruff/pull/14402))
- \[`flake8-type-checking`] Correctly handle quotes in subscript
expression when generating an autofix
([#14371](https://redirect.github.com/astral-sh/ruff/pull/14371))
- \[`pylint`] Suggest correct autofix for `__contains__` (`PLC2801`)
([#14424](https://redirect.github.com/astral-sh/ruff/pull/14424))
##### Configuration
- Ruff now emits a warning instead of an error when a configuration
[`ignore`](https://docs.astral.sh/ruff/settings/#lint_ignore)s a rule
that has been removed
([#14435](https://redirect.github.com/astral-sh/ruff/pull/14435))
- Ruff now validates that `lint.flake8-import-conventions.aliases` only
uses valid module names and aliases
([#14477](https://redirect.github.com/astral-sh/ruff/pull/14477))
###
[`v0.7.4`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#074)
[Compare
Source](https://redirect.github.com/astral-sh/ruff/compare/0.7.3...0.7.4)
##### Preview features
- \[`flake8-datetimez`] Detect usages of `datetime.max`/`datetime.min`
(`DTZ901`)
([#14288](https://redirect.github.com/astral-sh/ruff/pull/14288))
- \[`flake8-logging`] Implement `root-logger-calls` (`LOG015`)
([#14302](https://redirect.github.com/astral-sh/ruff/pull/14302))
- \[`flake8-no-pep420`] Detect empty implicit namespace packages
(`INP001`)
([#14236](https://redirect.github.com/astral-sh/ruff/pull/14236))
- \[`flake8-pyi`] Add "replace with `Self`" fix (`PYI019`)
([#14238](https://redirect.github.com/astral-sh/ruff/pull/14238))
- \[`perflint`] Implement quick-fix for `manual-list-comprehension`
(`PERF401`)
([#13919](https://redirect.github.com/astral-sh/ruff/pull/13919))
- \[`pylint`] Implement `shallow-copy-environ` (`W1507`)
([#14241](https://redirect.github.com/astral-sh/ruff/pull/14241))
- \[`ruff`] Implement `none-not-at-end-of-union` (`RUF036`)
([#14314](https://redirect.github.com/astral-sh/ruff/pull/14314))
- \[`ruff`] Implementation `unsafe-markup-call` from `flake8-markupsafe`
plugin (`RUF035`)
([#14224](https://redirect.github.com/astral-sh/ruff/pull/14224))
- \[`ruff`] Report problems for `attrs` dataclasses (`RUF008`, `RUF009`)
([#14327](https://redirect.github.com/astral-sh/ruff/pull/14327))
##### Rule changes
- \[`flake8-boolean-trap`] Exclude dunder methods that define operators
(`FBT001`)
([#14203](https://redirect.github.com/astral-sh/ruff/pull/14203))
- \[`flake8-pyi`] Add "replace with `Self`" fix (`PYI034`)
([#14217](https://redirect.github.com/astral-sh/ruff/pull/14217))
- \[`flake8-pyi`] Always autofix `duplicate-union-members` (`PYI016`)
([#14270](https://redirect.github.com/astral-sh/ruff/pull/14270))
- \[`flake8-pyi`] Improve autofix for nested and mixed type unions for
`unnecessary-type-union` (`PYI055`)
([#14272](https://redirect.github.com/astral-sh/ruff/pull/14272))
- \[`flake8-pyi`] Mark fix as unsafe when type annotation contains
comments for `duplicate-literal-member` (`PYI062`)
([#14268](https://redirect.github.com/astral-sh/ruff/pull/14268))
##### Server
- Use the current working directory to resolve settings from
`ruff.configuration`
([#14352](https://redirect.github.com/astral-sh/ruff/pull/14352))
##### Bug fixes
- Avoid conflicts between `PLC014` (`useless-import-alias`) and `I002`
(`missing-required-import`) by considering `lint.isort.required-imports`
for `PLC014`
([#14287](https://redirect.github.com/astral-sh/ruff/pull/14287))
- \[`flake8-type-checking`] Skip quoting annotation if it becomes
invalid syntax (`TCH001`)
- \[`flake8-pyi`] Avoid using `typing.Self` in stub files pre-Python
3.11 (`PYI034`)
([#14230](https://redirect.github.com/astral-sh/ruff/pull/14230))
- \[`flake8-pytest-style`] Flag `pytest.raises` call with keyword
argument `expected_exception` (`PT011`)
([#14298](https://redirect.github.com/astral-sh/ruff/pull/14298))
- \[`flake8-simplify`] Infer "unknown" truthiness for literal iterables
whose items are all unpacks (`SIM222`)
([#14263](https://redirect.github.com/astral-sh/ruff/pull/14263))
- \[`flake8-type-checking`] Fix false positives for `typing.Annotated`
(`TCH001`)
([#14311](https://redirect.github.com/astral-sh/ruff/pull/14311))
- \[`pylint`] Allow `await` at the top-level scope of a notebook
(`PLE1142`)
([#14225](https://redirect.github.com/astral-sh/ruff/pull/14225))
- \[`pylint`] Fix miscellaneous issues in `await-outside-async`
detection (`PLE1142`)
([#14218](https://redirect.github.com/astral-sh/ruff/pull/14218))
- \[`pyupgrade`] Avoid applying PEP 646 rewrites in invalid contexts
(`UP044`)
([#14234](https://redirect.github.com/astral-sh/ruff/pull/14234))
- \[`pyupgrade`] Detect permutations in redundant open modes (`UP015`)
([#14255](https://redirect.github.com/astral-sh/ruff/pull/14255))
- \[`refurb`] Avoid triggering `hardcoded-string-charset` for reordered
sets (`FURB156`)
([#14233](https://redirect.github.com/astral-sh/ruff/pull/14233))
- \[`refurb`] Further special cases added to
`verbose-decimal-constructor` (`FURB157`)
([#14216](https://redirect.github.com/astral-sh/ruff/pull/14216))
- \[`refurb`] Use `UserString` instead of non-existent `UserStr`
(`FURB189`)
([#14209](https://redirect.github.com/astral-sh/ruff/pull/14209))
- \[`ruff`] Avoid treating lowercase letters as `# noqa` codes
(`RUF100`)
([#14229](https://redirect.github.com/astral-sh/ruff/pull/14229))
- \[`ruff`] Do not report when `Optional` has no type arguments
(`RUF013`)
([#14181](https://redirect.github.com/astral-sh/ruff/pull/14181))
##### Documentation
- Add "Notebook behavior" section for `F704`, `PLE1142`
([#14266](https://redirect.github.com/astral-sh/ruff/pull/14266))
- Document comment policy around fix safety
([#14300](https://redirect.github.com/astral-sh/ruff/pull/14300))
###
[`v0.7.3`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#073)
[Compare
Source](https://redirect.github.com/astral-sh/ruff/compare/0.7.2...0.7.3)
##### Preview features
- Formatter: Disallow single-line implicit concatenated strings
([#13928](https://redirect.github.com/astral-sh/ruff/pull/13928))
- \[`flake8-pyi`] Include all Python file types for `PYI006` and
`PYI066`
([#14059](https://redirect.github.com/astral-sh/ruff/pull/14059))
- \[`flake8-simplify`] Implement `split-of-static-string` (`SIM905`)
([#14008](https://redirect.github.com/astral-sh/ruff/pull/14008))
- \[`refurb`] Implement `subclass-builtin` (`FURB189`)
([#14105](https://redirect.github.com/astral-sh/ruff/pull/14105))
- \[`ruff`] Improve diagnostic messages and docs (`RUF031`, `RUF032`,
`RUF034`)
([#14068](https://redirect.github.com/astral-sh/ruff/pull/14068))
##### Rule changes
- Detect items that hash to same value in duplicate sets (`B033`,
`PLC0208`)
([#14064](https://redirect.github.com/astral-sh/ruff/pull/14064))
- \[`eradicate`] Better detection of IntelliJ language injection
comments (`ERA001`)
([#14094](https://redirect.github.com/astral-sh/ruff/pull/14094))
- \[`flake8-pyi`] Add autofix for `docstring-in-stub` (`PYI021`)
([#14150](https://redirect.github.com/astral-sh/ruff/pull/14150))
- \[`flake8-pyi`] Update `duplicate-literal-member` (`PYI062`) to alawys
provide an autofix
([#14188](https://redirect.github.com/astral-sh/ruff/pull/14188))
- \[`pyflakes`] Detect items that hash to same value in duplicate
dictionaries (`F601`)
([#14065](https://redirect.github.com/astral-sh/ruff/pull/14065))
- \[`ruff`] Fix false positive for decorators (`RUF028`)
([#14061](https://redirect.github.com/astral-sh/ruff/pull/14061))
##### Bug fixes
- Avoid parsing joint rule codes as distinct codes in `# noqa`
([#12809](https://redirect.github.com/astral-sh/ruff/pull/12809))
- \[`eradicate`] ignore `# language=` in commented-out-code rule
(ERA001)
([#14069](https://redirect.github.com/astral-sh/ruff/pull/14069))
- \[`flake8-bugbear`] - do not run `mutable-argument-default` on stubs
(`B006`)
([#14058](https://redirect.github.com/astral-sh/ruff/pull/14058))
- \[`flake8-builtins`] Skip lambda expressions in
`builtin-argument-shadowing (A002)`
([#14144](https://redirect.github.com/astral-sh/ruff/pull/14144))
- \[`flake8-comprehension`] Also remove trailing comma while fixing
`C409` and `C419`
([#14097](https://redirect.github.com/astral-sh/ruff/pull/14097))
- \[`flake8-simplify`] Allow `open` without context manager in `return`
statement (`SIM115`)
([#14066](https://redirect.github.com/astral-sh/ruff/pull/14066))
- \[`pylint`] Respect hash-equivalent literals in `iteration-over-set`
(`PLC0208`)
([#14063](https://redirect.github.com/astral-sh/ruff/pull/14063))
- \[`pylint`] Update known dunder methods for Python 3.13 (`PLW3201`)
([#14146](https://redirect.github.com/astral-sh/ruff/pull/14146))
- \[`pyupgrade`] - ignore kwarg unpacking for `UP044`
([#14053](https://redirect.github.com/astral-sh/ruff/pull/14053))
- \[`refurb`] Parse more exotic decimal strings in
`verbose-decimal-constructor` (`FURB157`)
([#14098](https://redirect.github.com/astral-sh/ruff/pull/14098))
##### Documentation
- Add links to missing related options within rule documentations
([#13971](https://redirect.github.com/astral-sh/ruff/pull/13971))
- Add rule short code to mkdocs tags to allow searching via rule codes
([#14040](https://redirect.github.com/astral-sh/ruff/pull/14040))
###
[`v0.7.2`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#072)
[Compare
Source](https://redirect.github.com/astral-sh/ruff/compare/0.7.1...0.7.2)
##### Preview features
- Fix formatting of single with-item with trailing comment
([#14005](https://redirect.github.com/astral-sh/ruff/pull/14005))
- \[`pyupgrade`] Add PEP 646 `Unpack` conversion to `*` with fix
(`UP044`)
([#13988](https://redirect.github.com/astral-sh/ruff/pull/13988))
##### Rule changes
- Regenerate `known_stdlibs.rs` with stdlibs 2024.10.25
([#13963](https://redirect.github.com/astral-sh/ruff/pull/13963))
- \[`flake8-no-pep420`] Skip namespace package enforcement for PEP 723
scripts (`INP001`)
([#13974](https://redirect.github.com/astral-sh/ruff/pull/13974))
##### Server
- Fix server panic when undoing an edit
([#14010](https://redirect.github.com/astral-sh/ruff/pull/14010))
##### Bug fixes
- Fix issues in discovering ruff in pip build environments
([#13881](https://redirect.github.com/astral-sh/ruff/pull/13881))
- \[`flake8-type-checking`] Fix false positive for
`singledispatchmethod` (`TCH003`)
([#13941](https://redirect.github.com/astral-sh/ruff/pull/13941))
- \[`flake8-type-checking`] Treat return type of `singledispatch` as
runtime-required (`TCH003`)
([#13957](https://redirect.github.com/astral-sh/ruff/pull/13957))
##### Documentation
- \[`flake8-simplify`] Include caveats of enabling
`if-else-block-instead-of-if-exp` (`SIM108`)
([#14019](https://redirect.github.com/astral-sh/ruff/pull/14019))
###
[`v0.7.1`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#071)
[Compare
Source](https://redirect.github.com/astral-sh/ruff/compare/0.7.0...0.7.1)
##### Preview features
- Fix `E221` and `E222` to flag missing or extra whitespace around `==`
operator
([#13890](https://redirect.github.com/astral-sh/ruff/pull/13890))
- Formatter: Alternate quotes for strings inside f-strings in preview
([#13860](https://redirect.github.com/astral-sh/ruff/pull/13860))
- Formatter: Join implicit concatenated strings when they fit on a line
([#13663](https://redirect.github.com/astral-sh/ruff/pull/13663))
- \[`pylint`] Restrict `iteration-over-set` to only work on sets of
literals (`PLC0208`)
([#13731](https://redirect.github.com/astral-sh/ruff/pull/13731))
##### Rule changes
- \[`flake8-type-checking`] Support auto-quoting when annotations
contain quotes
([#11811](https://redirect.github.com/astral-sh/ruff/pull/11811))
##### Server
- Avoid indexing the workspace for single-file mode
([#13770](https://redirect.github.com/astral-sh/ruff/pull/13770))
##### Bug fixes
- Make `ARG002` compatible with `EM101` when raising
`NotImplementedError`
([#13714](https://redirect.github.com/astral-sh/ruff/pull/13714))
##### Other changes
- Introduce more Docker tags for Ruff (similar to uv)
([#13274](https://redirect.github.com/astral-sh/ruff/pull/13274))
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/openapi-generators/openapi-python-client).
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Dylan Anthony
---
.../golden-record/my_test_api_client/types.py | 2 +-
.../my_enum_api_client/types.py | 2 +-
.../test_3_1_features_client/types.py | 2 +-
integration-tests/integration_tests/types.py | 2 +-
openapi_python_client/parser/errors.py | 2 +-
.../parser/properties/__init__.py | 2 +-
.../parser/properties/schemas.py | 8 ++--
openapi_python_client/schema/__init__.py | 4 +-
.../openapi_schema_pydantic/__init__.py | 4 +-
.../templates/types.py.jinja | 2 +-
pdm.lock | 40 +++++++++----------
pyproject.toml | 2 +-
12 files changed, 36 insertions(+), 36 deletions(-)
diff --git a/end_to_end_tests/golden-record/my_test_api_client/types.py b/end_to_end_tests/golden-record/my_test_api_client/types.py
index fc557103e..b9ed58b8a 100644
--- a/end_to_end_tests/golden-record/my_test_api_client/types.py
+++ b/end_to_end_tests/golden-record/my_test_api_client/types.py
@@ -43,4 +43,4 @@ class Response(Generic[T]):
parsed: Optional[T]
-__all__ = ["File", "Response", "FileJsonType", "Unset", "UNSET"]
+__all__ = ["UNSET", "File", "FileJsonType", "Response", "Unset"]
diff --git a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/types.py b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/types.py
index fc557103e..b9ed58b8a 100644
--- a/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/types.py
+++ b/end_to_end_tests/literal-enums-golden-record/my_enum_api_client/types.py
@@ -43,4 +43,4 @@ class Response(Generic[T]):
parsed: Optional[T]
-__all__ = ["File", "Response", "FileJsonType", "Unset", "UNSET"]
+__all__ = ["UNSET", "File", "FileJsonType", "Response", "Unset"]
diff --git a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/types.py b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/types.py
index fc557103e..b9ed58b8a 100644
--- a/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/types.py
+++ b/end_to_end_tests/test-3-1-golden-record/test_3_1_features_client/types.py
@@ -43,4 +43,4 @@ class Response(Generic[T]):
parsed: Optional[T]
-__all__ = ["File", "Response", "FileJsonType", "Unset", "UNSET"]
+__all__ = ["UNSET", "File", "FileJsonType", "Response", "Unset"]
diff --git a/integration-tests/integration_tests/types.py b/integration-tests/integration_tests/types.py
index fc557103e..b9ed58b8a 100644
--- a/integration-tests/integration_tests/types.py
+++ b/integration-tests/integration_tests/types.py
@@ -43,4 +43,4 @@ class Response(Generic[T]):
parsed: Optional[T]
-__all__ = ["File", "Response", "FileJsonType", "Unset", "UNSET"]
+__all__ = ["UNSET", "File", "FileJsonType", "Response", "Unset"]
diff --git a/openapi_python_client/parser/errors.py b/openapi_python_client/parser/errors.py
index 76a795b24..36322f0cf 100644
--- a/openapi_python_client/parser/errors.py
+++ b/openapi_python_client/parser/errors.py
@@ -2,7 +2,7 @@
from enum import Enum
from typing import Optional
-__all__ = ["ErrorLevel", "GeneratorError", "ParseError", "PropertyError", "ParameterError"]
+__all__ = ["ErrorLevel", "GeneratorError", "ParameterError", "ParseError", "PropertyError"]
from pydantic import BaseModel
diff --git a/openapi_python_client/parser/properties/__init__.py b/openapi_python_client/parser/properties/__init__.py
index e202d9cf5..ba667347b 100644
--- a/openapi_python_client/parser/properties/__init__.py
+++ b/openapi_python_client/parser/properties/__init__.py
@@ -9,8 +9,8 @@
"Parameters",
"Property",
"Schemas",
- "build_schemas",
"build_parameters",
+ "build_schemas",
"property_from_data",
]
diff --git a/openapi_python_client/parser/properties/schemas.py b/openapi_python_client/parser/properties/schemas.py
index ce0b3d35d..177a86924 100644
--- a/openapi_python_client/parser/properties/schemas.py
+++ b/openapi_python_client/parser/properties/schemas.py
@@ -1,13 +1,13 @@
__all__ = [
"Class",
- "Schemas",
"Parameters",
"ReferencePath",
+ "Schemas",
+ "parameter_from_data",
+ "parameter_from_reference",
"parse_reference_path",
- "update_schemas_with_data",
"update_parameters_with_data",
- "parameter_from_reference",
- "parameter_from_data",
+ "update_schemas_with_data",
]
from typing import TYPE_CHECKING, NewType, Union, cast
diff --git a/openapi_python_client/schema/__init__.py b/openapi_python_client/schema/__init__.py
index d3de0e493..21a90f5fb 100644
--- a/openapi_python_client/schema/__init__.py
+++ b/openapi_python_client/schema/__init__.py
@@ -1,12 +1,12 @@
__all__ = [
+ "DataType",
"MediaType",
"OpenAPI",
"Operation",
"Parameter",
+ "Parameter",
"ParameterLocation",
- "DataType",
"PathItem",
- "Parameter",
"Reference",
"RequestBody",
"Response",
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/__init__.py b/openapi_python_client/schema/openapi_schema_pydantic/__init__.py
index 6b02446a8..6a59ec89d 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/__init__.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/__init__.py
@@ -7,6 +7,8 @@
"""
__all__ = [
+ "XML",
+ "Callback",
"Components",
"Contact",
"Discriminator",
@@ -35,8 +37,6 @@
"Server",
"ServerVariable",
"Tag",
- "XML",
- "Callback",
]
diff --git a/openapi_python_client/templates/types.py.jinja b/openapi_python_client/templates/types.py.jinja
index 65e87af47..6e0d6206c 100644
--- a/openapi_python_client/templates/types.py.jinja
+++ b/openapi_python_client/templates/types.py.jinja
@@ -44,4 +44,4 @@ class Response(Generic[T]):
parsed: Optional[T]
-__all__ = ["File", "Response", "FileJsonType", "Unset", "UNSET"]
+__all__ = ["UNSET", "File", "FileJsonType", "Response", "Unset"]
diff --git a/pdm.lock b/pdm.lock
index 13dafbd8d..0a3abb28e 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -5,7 +5,7 @@
groups = ["default", "dev"]
strategy = ["inherit_metadata"]
lock_version = "4.5.0"
-content_hash = "sha256:54c7ff6db9dfa230f551918c71b6a59a51203d8f8dd3a53af8034c46a8eafd82"
+content_hash = "sha256:13d6563797ad56820f75db246dfd37fd324b51adb7ffdc63c436d716f9b9ebf9"
[[metadata.targets]]
requires_python = "~=3.9"
@@ -845,29 +845,29 @@ files = [
[[package]]
name = "ruff"
-version = "0.7.0"
+version = "0.8.0"
requires_python = ">=3.7"
summary = "An extremely fast Python linter and code formatter, written in Rust."
groups = ["default"]
files = [
- {file = "ruff-0.7.0-py3-none-linux_armv6l.whl", hash = "sha256:0cdf20c2b6ff98e37df47b2b0bd3a34aaa155f59a11182c1303cce79be715628"},
- {file = "ruff-0.7.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:496494d350c7fdeb36ca4ef1c9f21d80d182423718782222c29b3e72b3512737"},
- {file = "ruff-0.7.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:214b88498684e20b6b2b8852c01d50f0651f3cc6118dfa113b4def9f14faaf06"},
- {file = "ruff-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630fce3fefe9844e91ea5bbf7ceadab4f9981f42b704fae011bb8efcaf5d84be"},
- {file = "ruff-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:211d877674e9373d4bb0f1c80f97a0201c61bcd1e9d045b6e9726adc42c156aa"},
- {file = "ruff-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194d6c46c98c73949a106425ed40a576f52291c12bc21399eb8f13a0f7073495"},
- {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:82c2579b82b9973a110fab281860403b397c08c403de92de19568f32f7178598"},
- {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9af971fe85dcd5eaed8f585ddbc6bdbe8c217fb8fcf510ea6bca5bdfff56040e"},
- {file = "ruff-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b641c7f16939b7d24b7bfc0be4102c56562a18281f84f635604e8a6989948914"},
- {file = "ruff-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d71672336e46b34e0c90a790afeac8a31954fd42872c1f6adaea1dff76fd44f9"},
- {file = "ruff-0.7.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ab7d98c7eed355166f367597e513a6c82408df4181a937628dbec79abb2a1fe4"},
- {file = "ruff-0.7.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1eb54986f770f49edb14f71d33312d79e00e629a57387382200b1ef12d6a4ef9"},
- {file = "ruff-0.7.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:dc452ba6f2bb9cf8726a84aa877061a2462afe9ae0ea1d411c53d226661c601d"},
- {file = "ruff-0.7.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4b406c2dce5be9bad59f2de26139a86017a517e6bcd2688da515481c05a2cb11"},
- {file = "ruff-0.7.0-py3-none-win32.whl", hash = "sha256:f6c968509f767776f524a8430426539587d5ec5c662f6addb6aa25bc2e8195ec"},
- {file = "ruff-0.7.0-py3-none-win_amd64.whl", hash = "sha256:ff4aabfbaaba880e85d394603b9e75d32b0693152e16fa659a3064a85df7fce2"},
- {file = "ruff-0.7.0-py3-none-win_arm64.whl", hash = "sha256:10842f69c245e78d6adec7e1db0a7d9ddc2fff0621d730e61657b64fa36f207e"},
- {file = "ruff-0.7.0.tar.gz", hash = "sha256:47a86360cf62d9cd53ebfb0b5eb0e882193fc191c6d717e8bef4462bc3b9ea2b"},
+ {file = "ruff-0.8.0-py3-none-linux_armv6l.whl", hash = "sha256:fcb1bf2cc6706adae9d79c8d86478677e3bbd4ced796ccad106fd4776d395fea"},
+ {file = "ruff-0.8.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:295bb4c02d58ff2ef4378a1870c20af30723013f441c9d1637a008baaf928c8b"},
+ {file = "ruff-0.8.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7b1f1c76b47c18fa92ee78b60d2d20d7e866c55ee603e7d19c1e991fad933a9a"},
+ {file = "ruff-0.8.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb0d4f250a7711b67ad513fde67e8870109e5ce590a801c3722580fe98c33a99"},
+ {file = "ruff-0.8.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e55cce9aa93c5d0d4e3937e47b169035c7e91c8655b0974e61bb79cf398d49c"},
+ {file = "ruff-0.8.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f4cd64916d8e732ce6b87f3f5296a8942d285bbbc161acee7fe561134af64f9"},
+ {file = "ruff-0.8.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c5c1466be2a2ebdf7c5450dd5d980cc87c8ba6976fb82582fea18823da6fa362"},
+ {file = "ruff-0.8.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2dabfd05b96b7b8f2da00d53c514eea842bff83e41e1cceb08ae1966254a51df"},
+ {file = "ruff-0.8.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:facebdfe5a5af6b1588a1d26d170635ead6892d0e314477e80256ef4a8470cf3"},
+ {file = "ruff-0.8.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87a8e86bae0dbd749c815211ca11e3a7bd559b9710746c559ed63106d382bd9c"},
+ {file = "ruff-0.8.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:85e654f0ded7befe2d61eeaf3d3b1e4ef3894469cd664ffa85006c7720f1e4a2"},
+ {file = "ruff-0.8.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:83a55679c4cb449fa527b8497cadf54f076603cc36779b2170b24f704171ce70"},
+ {file = "ruff-0.8.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:812e2052121634cf13cd6fddf0c1871d0ead1aad40a1a258753c04c18bb71bbd"},
+ {file = "ruff-0.8.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:780d5d8523c04202184405e60c98d7595bdb498c3c6abba3b6d4cdf2ca2af426"},
+ {file = "ruff-0.8.0-py3-none-win32.whl", hash = "sha256:5fdb6efecc3eb60bba5819679466471fd7d13c53487df7248d6e27146e985468"},
+ {file = "ruff-0.8.0-py3-none-win_amd64.whl", hash = "sha256:582891c57b96228d146725975fbb942e1f30a0c4ba19722e692ca3eb25cc9b4f"},
+ {file = "ruff-0.8.0-py3-none-win_arm64.whl", hash = "sha256:ba93e6294e9a737cd726b74b09a6972e36bb511f9a102f1d9a7e1ce94dd206a6"},
+ {file = "ruff-0.8.0.tar.gz", hash = "sha256:a7ccfe6331bf8c8dad715753e157457faf7351c2b69f62f32c165c2dbcbacd44"},
]
[[package]]
diff --git a/pyproject.toml b/pyproject.toml
index cd94cefdd..417d7a356 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -14,7 +14,7 @@ dependencies = [
"python-dateutil>=2.8.1,<3.0.0",
"httpx>=0.20.0,<0.28.0",
"ruamel.yaml>=0.18.6,<0.19.0",
- "ruff>=0.2,<0.8",
+ "ruff>=0.2,<0.9",
"typing-extensions>=4.8.0,<5.0.0",
]
name = "openapi-python-client"
From 72f3f5a054fba7f40a222bbccd94f52ca052be5a Mon Sep 17 00:00:00 2001
From: "knope-bot[bot]" <152252888+knope-bot[bot]@users.noreply.github.com>
Date: Mon, 9 Dec 2024 10:41:00 -0700
Subject: [PATCH 06/18] Release 0.22.0 (#1170)
> [!IMPORTANT]
> Merging this pull request will create this release
## Breaking Changes
### Drop support for Python 3.8
Python 3.8 is no longer supported. "New" 3.9 syntax, like generics on
builtin collections, is used both in the generator
and the generated code.
### `type` is now a reserved field name
Because `type` is used in type annotations now, it is no longer a valid
field name. Fields which were previously named
`type` will be renamed to `type_`.
## Features
- Support Ruff 0.8 (#1169)
Co-authored-by: knope-bot[bot] <152252888+knope-bot[bot]@users.noreply.github.com>
---
.changeset/drop_support_for_python_38.md | 8 --------
.../type_is_now_a_reserved_field_name.md | 8 --------
CHANGELOG.md | 18 ++++++++++++++++++
pyproject.toml | 2 +-
4 files changed, 19 insertions(+), 17 deletions(-)
delete mode 100644 .changeset/drop_support_for_python_38.md
delete mode 100644 .changeset/type_is_now_a_reserved_field_name.md
diff --git a/.changeset/drop_support_for_python_38.md b/.changeset/drop_support_for_python_38.md
deleted file mode 100644
index ed9060c5c..000000000
--- a/.changeset/drop_support_for_python_38.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-default: major
----
-
-# Drop support for Python 3.8
-
-Python 3.8 is no longer supported. "New" 3.9 syntax, like generics on builtin collections, is used both in the generator
-and the generated code.
diff --git a/.changeset/type_is_now_a_reserved_field_name.md b/.changeset/type_is_now_a_reserved_field_name.md
deleted file mode 100644
index f804f0f51..000000000
--- a/.changeset/type_is_now_a_reserved_field_name.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-default: major
----
-
-# `type` is now a reserved field name
-
-Because `type` is used in type annotations now, it is no longer a valid field name. Fields which were previously named
-`type` will be renamed to `type_`.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1c20dd597..2acc64b1e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,24 @@ Programmatic usage of this project (e.g., importing it as a Python module) and t
The 0.x prefix used in versions for this project is to indicate that breaking changes are expected frequently (several times a year). Breaking changes will increment the minor number, all other changes will increment the patch number. You can track the progress toward 1.0 [here](https://github.com/openapi-generators/openapi-python-client/projects/2).
+## 0.22.0 (2024-11-23)
+
+### Breaking Changes
+
+#### Drop support for Python 3.8
+
+Python 3.8 is no longer supported. "New" 3.9 syntax, like generics on builtin collections, is used both in the generator
+and the generated code.
+
+#### `type` is now a reserved field name
+
+Because `type` is used in type annotations now, it is no longer a valid field name. Fields which were previously named
+`type` will be renamed to `type_`.
+
+### Features
+
+- Support Ruff 0.8 (#1169)
+
## 0.21.7 (2024-10-28)
### Fixes
diff --git a/pyproject.toml b/pyproject.toml
index 417d7a356..12a7e7914 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -18,7 +18,7 @@ dependencies = [
"typing-extensions>=4.8.0,<5.0.0",
]
name = "openapi-python-client"
-version = "0.21.7"
+version = "0.22.0"
description = "Generate modern Python clients from OpenAPI"
keywords = [
"OpenAPI",
From 9220217115aee4a05bd1f294efc980f979db3ee0 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 9 Dec 2024 10:53:55 -0700
Subject: [PATCH 07/18] chore(deps): update pypa/gh-action-pypi-publish action
to v1.12.3 (#1177)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
|
[pypa/gh-action-pypi-publish](https://redirect.github.com/pypa/gh-action-pypi-publish)
| action | patch | `v1.12.2` -> `v1.12.3` |
---
### Release Notes
pypa/gh-action-pypi-publish
(pypa/gh-action-pypi-publish)
###
[`v1.12.3`](https://redirect.github.com/pypa/gh-action-pypi-publish/compare/v1.12.2...v1.12.3)
[Compare
Source](https://redirect.github.com/pypa/gh-action-pypi-publish/compare/v1.12.2...v1.12.3)
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/openapi-generators/openapi-python-client).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
.github/workflows/release.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index f054ed2a3..78c3e09da 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -18,6 +18,6 @@ jobs:
- name: Build
run: hatchling build
- name: Push to PyPI
- uses: pypa/gh-action-pypi-publish@v1.12.2
+ uses: pypa/gh-action-pypi-publish@v1.12.3
with:
attestations: true
From 3a5459e4dab65e637a0ae4bf72585bbb6246f538 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 24 Dec 2024 13:45:48 -0700
Subject: [PATCH 08/18] chore(deps): update actions/upload-artifact action to
v4.5.0 (#1178)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
|
[actions/upload-artifact](https://redirect.github.com/actions/upload-artifact)
| action | minor | `v4.4.3` -> `v4.5.0` |
---
### Release Notes
actions/upload-artifact (actions/upload-artifact)
###
[`v4.5.0`](https://redirect.github.com/actions/upload-artifact/compare/v4.4.3...v4.5.0)
[Compare
Source](https://redirect.github.com/actions/upload-artifact/compare/v4.4.3...v4.5.0)
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/openapi-generators/openapi-python-client).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
.github/workflows/checks.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
index 055ecd17f..3bcadaab8 100644
--- a/.github/workflows/checks.yml
+++ b/.github/workflows/checks.yml
@@ -64,7 +64,7 @@ jobs:
if: matrix.os == 'ubuntu-latest'
- name: Store coverage report
- uses: actions/upload-artifact@v4.4.3
+ uses: actions/upload-artifact@v4.5.0
if: matrix.os == 'ubuntu-latest'
with:
name: coverage-${{ matrix.python }}
@@ -107,7 +107,7 @@ jobs:
.venv/bin/python -m coverage report --fail-under=100
- name: Upload HTML report if check failed.
- uses: actions/upload-artifact@v4.4.3
+ uses: actions/upload-artifact@v4.5.0
with:
name: html-report
path: htmlcov
From 800a7151efcea8c40489fbf25b104c49d88983f9 Mon Sep 17 00:00:00 2001
From: Victorien <65306057+Viicos@users.noreply.github.com>
Date: Tue, 24 Dec 2024 22:06:49 +0100
Subject: [PATCH 09/18] Properly rebuild Pydantic models if necessary (#1176)
This is the alternative approach I mentioned in
https://github.com/openapi-generators/openapi-python-client/pull/1171#issuecomment-2518106994.
Instead of trying to rebuild the models in their respective modules
(which requires weird patterns, such as unused imports or importing
after the model is defined), we set `defer_build` to `True` for every
model where we know a forward reference will fail to resolve (so that we
don't try to build a model if we know it will fail).
I added comments each time to justify the use of `defer_build`, but
unfortunately this isn't always straightforward (e.g. sometimes you
makes use of a model as annotation which itself has `defer_build` set;
in this case we also want to defer build. Another case is when making
use of the `Callback` type alias; it isn't directly visible but it uses
an unresolvable forward reference).
Ultimately, in the module's `__init__.py`, we call `model_rebuild` on
all the necessary models. I know this isn't ideal as well, as you need
to manually check for every exported model here if the build was
successful.
This library is a clear example that inter-dependent types across
different modules is challenging, and Pydantic does not make it easy. We
are trying to think about ways to simplify the process.
Note that on top of fixing things for Pydantic 2.10, this also ensures
every model is successfully built when the `openapi_schema_pydantic`
module is imported. Currently on `main` (with Pydantic 2.9.2), some
models such as `Components` are not built. While this can still work in
some cases, it is advised not to do so (when `Components` is going to be
instantiated, Pydantic will implicitly try to rebuild it if it wasn't
already. However, we use the namespace where the instantiation call
happened to rebuilt it, so depending on _where_ you first instantiate
the model, this can lead to a failed model rebuild and thus a runtime
exception).
---
A note on `model_rebuild`: you can either provide an explicit namespace:
```python
PathItem.model_rebuild(_types_namespace={Operation: "Operation", "Header": Header})
```
Or let `model_rebuild` use the namespace where it was called (in our
case, all the imports are available, so it works).
---------
Co-authored-by: Dylan Anthony
Co-authored-by: Dylan Anthony <43723790+dbanty@users.noreply.github.com>
---
...ly_rebuild_pydantic_models_if_necessary.md | 10 +
.../openapi_schema_pydantic/__init__.py | 11 +
.../openapi_schema_pydantic/components.py | 2 +
.../openapi_schema_pydantic/encoding.py | 6 +-
.../schema/openapi_schema_pydantic/header.py | 2 +
.../openapi_schema_pydantic/media_type.py | 2 +
.../openapi_schema_pydantic/open_api.py | 12 +-
.../openapi_schema_pydantic/operation.py | 10 +-
.../openapi_schema_pydantic/parameter.py | 2 +
.../openapi_schema_pydantic/path_item.py | 13 +-
.../openapi_schema_pydantic/request_body.py | 2 +
.../openapi_schema_pydantic/response.py | 2 +
.../schema/openapi_schema_pydantic/schema.py | 5 +-
pdm.lock | 189 +++++++++---------
14 files changed, 143 insertions(+), 125 deletions(-)
create mode 100644 .changeset/properly_rebuild_pydantic_models_if_necessary.md
diff --git a/.changeset/properly_rebuild_pydantic_models_if_necessary.md b/.changeset/properly_rebuild_pydantic_models_if_necessary.md
new file mode 100644
index 000000000..28f892e43
--- /dev/null
+++ b/.changeset/properly_rebuild_pydantic_models_if_necessary.md
@@ -0,0 +1,10 @@
+---
+default: patch
+---
+
+# Fix compatibility with Pydantic 2.10+
+
+#1176 by @Viicos
+
+Set `defer_build` to models that we know will fail to build, and call `model_rebuild`
+in the `__init__.py` file.
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/__init__.py b/openapi_python_client/schema/openapi_schema_pydantic/__init__.py
index 6a59ec89d..b61cefc66 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/__init__.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/__init__.py
@@ -70,3 +70,14 @@
from .server_variable import ServerVariable
from .tag import Tag
from .xml import XML
+
+PathItem.model_rebuild()
+Operation.model_rebuild()
+Components.model_rebuild()
+Encoding.model_rebuild()
+MediaType.model_rebuild()
+OpenAPI.model_rebuild()
+Parameter.model_rebuild()
+Header.model_rebuild()
+RequestBody.model_rebuild()
+Response.model_rebuild()
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/components.py b/openapi_python_client/schema/openapi_schema_pydantic/components.py
index 4ff5f9edc..babe26265 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/components.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/components.py
@@ -35,6 +35,8 @@ class Components(BaseModel):
links: Optional[dict[str, Union[Link, Reference]]] = None
callbacks: Optional[dict[str, Union[Callback, Reference]]] = None
model_config = ConfigDict(
+ # `Callback` contains an unresolvable forward reference, will rebuild in `__init__.py`:
+ defer_build=True,
extra="allow",
json_schema_extra={
"examples": [
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/encoding.py b/openapi_python_client/schema/openapi_schema_pydantic/encoding.py
index 78190363b..ebf6295dc 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/encoding.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/encoding.py
@@ -6,8 +6,6 @@
if TYPE_CHECKING: # pragma: no cover
from .header import Header
-else:
- Header = "Header"
class Encoding(BaseModel):
@@ -19,11 +17,13 @@ class Encoding(BaseModel):
"""
contentType: Optional[str] = None
- headers: Optional[dict[str, Union[Header, Reference]]] = None
+ headers: Optional[dict[str, Union["Header", Reference]]] = None
style: Optional[str] = None
explode: bool = False
allowReserved: bool = False
model_config = ConfigDict(
+ # `Header` is an unresolvable forward reference, will rebuild in `__init__.py`:
+ defer_build=True,
extra="allow",
json_schema_extra={
"examples": [
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/header.py b/openapi_python_client/schema/openapi_schema_pydantic/header.py
index 3223c199b..2deb6f390 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/header.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/header.py
@@ -21,6 +21,8 @@ class Header(Parameter):
name: str = Field(default="")
param_in: ParameterLocation = Field(default=ParameterLocation.HEADER, alias="in")
model_config = ConfigDict(
+ # `Parameter` is not build yet, will rebuild in `__init__.py`:
+ defer_build=True,
extra="allow",
populate_by_name=True,
json_schema_extra={
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/media_type.py b/openapi_python_client/schema/openapi_schema_pydantic/media_type.py
index 1e4d33b6d..95f9ede14 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/media_type.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/media_type.py
@@ -21,6 +21,8 @@ class MediaType(BaseModel):
examples: Optional[dict[str, Union[Example, Reference]]] = None
encoding: Optional[dict[str, Encoding]] = None
model_config = ConfigDict(
+ # `Encoding` is not build yet, will rebuild in `__init__.py`:
+ defer_build=True,
extra="allow",
populate_by_name=True,
json_schema_extra={
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/open_api.py b/openapi_python_client/schema/openapi_schema_pydantic/open_api.py
index 4282cfeb5..e66ea942c 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/open_api.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/open_api.py
@@ -5,9 +5,6 @@
from .components import Components
from .external_documentation import ExternalDocumentation
from .info import Info
-
-# Required to update forward ref after object creation
-from .path_item import PathItem # noqa: F401
from .paths import Paths
from .security_requirement import SecurityRequirement
from .server import Server
@@ -32,7 +29,11 @@ class OpenAPI(BaseModel):
tags: Optional[list[Tag]] = None
externalDocs: Optional[ExternalDocumentation] = None
openapi: str
- model_config = ConfigDict(extra="allow")
+ model_config = ConfigDict(
+ # `Components` is not build yet, will rebuild in `__init__.py`:
+ defer_build=True,
+ extra="allow",
+ )
@field_validator("openapi")
@classmethod
@@ -46,6 +47,3 @@ def check_openapi_version(cls, value: str) -> str:
if int(parts[1]) > 1:
raise ValueError(f"Only OpenAPI versions 3.1.* are supported, got {value}")
return value
-
-
-OpenAPI.model_rebuild()
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/operation.py b/openapi_python_client/schema/openapi_schema_pydantic/operation.py
index 2976e73bf..ebf5e1faa 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/operation.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/operation.py
@@ -4,11 +4,7 @@
from .callback import Callback
from .external_documentation import ExternalDocumentation
-from .header import Header # noqa: F401
from .parameter import Parameter
-
-# Required to update forward ref after object creation, as this is not imported yet
-from .path_item import PathItem # noqa: F401
from .reference import Reference
from .request_body import RequestBody
from .responses import Responses
@@ -38,6 +34,8 @@ class Operation(BaseModel):
security: Optional[list[SecurityRequirement]] = None
servers: Optional[list[Server]] = None
model_config = ConfigDict(
+ # `Callback` contains an unresolvable forward reference, will rebuild in `__init__.py`:
+ defer_build=True,
extra="allow",
json_schema_extra={
"examples": [
@@ -89,7 +87,3 @@ class Operation(BaseModel):
]
},
)
-
-
-# PathItem in Callback uses Operation, so we need to update forward refs due to circular dependency
-Operation.model_rebuild()
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/parameter.py b/openapi_python_client/schema/openapi_schema_pydantic/parameter.py
index a46301026..6f6fe9342 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/parameter.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/parameter.py
@@ -35,6 +35,8 @@ class Parameter(BaseModel):
examples: Optional[dict[str, Union[Example, Reference]]] = None
content: Optional[dict[str, MediaType]] = None
model_config = ConfigDict(
+ # `MediaType` is not build yet, will rebuild in `__init__.py`:
+ defer_build=True,
extra="allow",
populate_by_name=True,
json_schema_extra={
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/path_item.py b/openapi_python_client/schema/openapi_schema_pydantic/path_item.py
index 2c68c88b8..8c1eab6ea 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/path_item.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/path_item.py
@@ -1,4 +1,4 @@
-from typing import Optional, Union
+from typing import TYPE_CHECKING, Optional, Union
from pydantic import BaseModel, ConfigDict, Field
@@ -6,6 +6,9 @@
from .reference import Reference
from .server import Server
+if TYPE_CHECKING:
+ from .operation import Operation # pragma: no cover
+
class PathItem(BaseModel):
"""
@@ -33,6 +36,8 @@ class PathItem(BaseModel):
servers: Optional[list[Server]] = None
parameters: Optional[list[Union[Parameter, Reference]]] = None
model_config = ConfigDict(
+ # `Operation` is an unresolvable forward reference, will rebuild in `__init__.py`:
+ defer_build=True,
extra="allow",
populate_by_name=True,
json_schema_extra={
@@ -69,9 +74,3 @@ class PathItem(BaseModel):
]
},
)
-
-
-# Operation uses PathItem via Callback, so we need late import and to update forward refs due to circular dependency
-from .operation import Operation # noqa: E402
-
-PathItem.model_rebuild()
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/request_body.py b/openapi_python_client/schema/openapi_schema_pydantic/request_body.py
index feaa0c8ea..8cd9bb527 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/request_body.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/request_body.py
@@ -17,6 +17,8 @@ class RequestBody(BaseModel):
content: dict[str, MediaType]
required: bool = False
model_config = ConfigDict(
+ # `MediaType` is not build yet, will rebuild in `__init__.py`:
+ defer_build=True,
extra="allow",
json_schema_extra={
"examples": [
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/response.py b/openapi_python_client/schema/openapi_schema_pydantic/response.py
index 5f5ac73bf..b7ec0d357 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/response.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/response.py
@@ -23,6 +23,8 @@ class Response(BaseModel):
content: Optional[dict[str, MediaType]] = None
links: Optional[dict[str, Union[Link, Reference]]] = None
model_config = ConfigDict(
+ # `MediaType` is not build yet, will rebuild in `__init__.py`:
+ defer_build=True,
extra="allow",
json_schema_extra={
"examples": [
diff --git a/openapi_python_client/schema/openapi_schema_pydantic/schema.py b/openapi_python_client/schema/openapi_schema_pydantic/schema.py
index 486664d5d..99c64eb51 100644
--- a/openapi_python_client/schema/openapi_schema_pydantic/schema.py
+++ b/openapi_python_client/schema/openapi_schema_pydantic/schema.py
@@ -43,7 +43,7 @@ class Schema(BaseModel):
anyOf: list[Union[Reference, "Schema"]] = Field(default_factory=list)
schema_not: Optional[Union[Reference, "Schema"]] = Field(default=None, alias="not")
items: Optional[Union[Reference, "Schema"]] = None
- prefixItems: Optional[list[Union[Reference, "Schema"]]] = Field(default_factory=list)
+ prefixItems: list[Union[Reference, "Schema"]] = Field(default_factory=list)
properties: Optional[dict[str, Union[Reference, "Schema"]]] = None
additionalProperties: Optional[Union[bool, Reference, "Schema"]] = None
description: Optional[str] = None
@@ -206,6 +206,3 @@ def handle_nullable(self) -> "Schema":
self.oneOf = [Schema(type=DataType.NULL), Schema(allOf=self.allOf)]
self.allOf = []
return self
-
-
-Schema.model_rebuild()
diff --git a/pdm.lock b/pdm.lock
index 0a3abb28e..38426df57 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -548,24 +548,23 @@ files = [
[[package]]
name = "pydantic"
-version = "2.9.2"
+version = "2.10.4"
requires_python = ">=3.8"
summary = "Data validation using Python type hints"
groups = ["default"]
dependencies = [
"annotated-types>=0.6.0",
- "pydantic-core==2.23.4",
- "typing-extensions>=4.12.2; python_version >= \"3.13\"",
- "typing-extensions>=4.6.1; python_version < \"3.13\"",
+ "pydantic-core==2.27.2",
+ "typing-extensions>=4.12.2",
]
files = [
- {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"},
- {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"},
+ {file = "pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d"},
+ {file = "pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06"},
]
[[package]]
name = "pydantic-core"
-version = "2.23.4"
+version = "2.27.2"
requires_python = ">=3.8"
summary = "Core functionality for Pydantic validation and serialization"
groups = ["default"]
@@ -573,95 +572,93 @@ dependencies = [
"typing-extensions!=4.7.0,>=4.6.0",
]
files = [
- {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"},
- {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"},
- {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"},
- {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"},
- {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"},
- {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"},
- {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"},
- {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"},
- {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"},
- {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"},
- {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"},
- {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"},
- {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"},
- {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"},
- {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"},
- {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"},
- {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"},
- {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"},
- {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"},
- {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"},
- {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"},
- {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"},
- {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"},
- {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"},
- {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"},
- {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"},
- {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"},
- {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"},
- {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"},
- {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"},
- {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"},
- {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"},
- {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"},
- {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"},
- {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"},
- {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"},
- {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"},
- {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"},
- {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"},
- {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"},
- {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"},
- {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"},
- {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"},
- {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"},
- {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"},
- {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"},
- {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"},
- {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"},
- {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"},
- {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"},
- {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"},
- {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"},
- {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"},
- {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"},
- {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"},
- {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"},
- {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"},
- {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"},
- {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"},
- {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"},
- {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"},
- {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"},
- {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"},
- {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"},
- {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"},
- {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"},
- {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"},
- {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"},
- {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"},
- {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"},
- {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"},
- {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"},
- {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"},
+ {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"},
+ {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"},
+ {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"},
+ {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"},
+ {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"},
+ {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"},
+ {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"},
+ {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"},
+ {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"},
+ {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"},
+ {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"},
+ {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"},
+ {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"},
+ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"},
+ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"},
+ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"},
+ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"},
+ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"},
+ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"},
+ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"},
+ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"},
+ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"},
+ {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"},
]
[[package]]
From cd6853080c6d6cc6ae43abb579ae29582d7147d4 Mon Sep 17 00:00:00 2001
From: Dylan Anthony <43723790+dbanty@users.noreply.github.com>
Date: Tue, 24 Dec 2024 14:51:14 -0700
Subject: [PATCH 10/18] ci: Test minimum dependencies in CI (#1182)
This way, when we upgrade the upper limit of a dependency (and the
version we test for most of the time), we don't accidentally break our
listed minimum version.
---------
Co-authored-by: Dylan Anthony
---
.github/workflows/checks.yml | 45 +-
pdm.lock | 112 ++--
pdm.minimal.lock | 953 +++++++++++++++++++++++++++++++++++
pyproject.toml | 8 +-
4 files changed, 1028 insertions(+), 90 deletions(-)
create mode 100644 pdm.minimal.lock
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
index 3bcadaab8..0a1cf6055 100644
--- a/.github/workflows/checks.yml
+++ b/.github/workflows/checks.yml
@@ -51,15 +51,11 @@ jobs:
- name: Run pytest without coverage
if: matrix.os != 'ubuntu-latest'
run: pdm test
- env:
- TASKIPY: true
- name: Run pytest with coverage
if: matrix.os == 'ubuntu-latest'
run: pdm test_with_coverage
- env:
- TASKIPY: true
-
+
- run: mv .coverage .coverage.${{ matrix.python }}
if: matrix.os == 'ubuntu-latest'
@@ -72,6 +68,45 @@ jobs:
if-no-files-found: error
include-hidden-files: true
+ test_min_deps:
+ strategy:
+ matrix:
+ os: [ ubuntu-latest, macos-latest, windows-latest ]
+ runs-on: ${{ matrix.os }}
+ steps:
+ - uses: actions/checkout@v4.2.2
+ - name: Set up Python
+ uses: actions/setup-python@v5.3.0
+ with:
+ python-version: "3.9"
+
+ - name: Get Python Version
+ id: get_python_version
+ run: echo "python_version=$(python --version)" >> $GITHUB_OUTPUT
+ shell: bash
+
+ - name: Cache dependencies
+ uses: actions/cache@v4
+ with:
+ path: .venv
+ key: ${{ runner.os }}-${{ steps.get_python_version.outputs.python_version }}-min-dependencies-${{ hashFiles('**/pdm.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ steps.get_python_version.outputs.python_version }}-min-dependencies
+ - name: Install PDM
+ run: pip install pdm
+
+ - name: Install minimum dependencies
+ run: pdm install -L pdm.minimal.lock
+
+ - name: Run mypy
+ run: pdm mypy --show-error-codes
+
+ - name: Lint
+ run: pdm run ruff check .
+
+ - name: Run unit tests only # snapshots are expected to fail
+ run: pdm unit_test
+
coverage:
name: Combine & check coverage
needs: test
diff --git a/pdm.lock b/pdm.lock
index 38426df57..d03ea5918 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -5,7 +5,7 @@
groups = ["default", "dev"]
strategy = ["inherit_metadata"]
lock_version = "4.5.0"
-content_hash = "sha256:13d6563797ad56820f75db246dfd37fd324b51adb7ffdc63c436d716f9b9ebf9"
+content_hash = "sha256:50f45ddc1fe2529d12869f3f378bf09b25166e6c66cdf84f1c32db1cbe43ff8c"
[[metadata.targets]]
requires_python = "~=3.9"
@@ -87,6 +87,7 @@ version = "0.4.6"
requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
summary = "Cross-platform colored terminal text."
groups = ["default", "dev"]
+marker = "sys_platform == \"win32\" or platform_system == \"Windows\""
files = [
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
@@ -439,21 +440,9 @@ files = [
{file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
]
-[[package]]
-name = "mslex"
-version = "1.3.0"
-requires_python = ">=3.5"
-summary = "shlex for windows"
-groups = ["dev"]
-marker = "sys_platform == \"win32\""
-files = [
- {file = "mslex-1.3.0-py3-none-any.whl", hash = "sha256:c7074b347201b3466fc077c5692fbce9b5f62a63a51f537a53fbbd02eff2eea4"},
- {file = "mslex-1.3.0.tar.gz", hash = "sha256:641c887d1d3db610eee2af37a8e5abda3f70b3006cdfd2d0d29dc0d1ae28a85d"},
-]
-
[[package]]
name = "mypy"
-version = "1.12.1"
+version = "1.14.0"
requires_python = ">=3.8"
summary = "Optional static typing for Python"
groups = ["dev"]
@@ -463,38 +452,33 @@ dependencies = [
"typing-extensions>=4.6.0",
]
files = [
- {file = "mypy-1.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3d7d4371829184e22fda4015278fbfdef0327a4b955a483012bd2d423a788801"},
- {file = "mypy-1.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f59f1dfbf497d473201356966e353ef09d4daec48caeacc0254db8ef633a28a5"},
- {file = "mypy-1.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b947097fae68004b8328c55161ac9db7d3566abfef72d9d41b47a021c2fba6b1"},
- {file = "mypy-1.12.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96af62050971c5241afb4701c15189ea9507db89ad07794a4ee7b4e092dc0627"},
- {file = "mypy-1.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:d90da248f4c2dba6c44ddcfea94bb361e491962f05f41990ff24dbd09969ce20"},
- {file = "mypy-1.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1230048fec1380faf240be6385e709c8570604d2d27ec6ca7e573e3bc09c3735"},
- {file = "mypy-1.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:02dcfe270c6ea13338210908f8cadc8d31af0f04cee8ca996438fe6a97b4ec66"},
- {file = "mypy-1.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5a437c9102a6a252d9e3a63edc191a3aed5f2fcb786d614722ee3f4472e33f6"},
- {file = "mypy-1.12.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:186e0c8346efc027ee1f9acf5ca734425fc4f7dc2b60144f0fbe27cc19dc7931"},
- {file = "mypy-1.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:673ba1140a478b50e6d265c03391702fa11a5c5aff3f54d69a62a48da32cb811"},
- {file = "mypy-1.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9fb83a7be97c498176fb7486cafbb81decccaef1ac339d837c377b0ce3743a7f"},
- {file = "mypy-1.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:389e307e333879c571029d5b93932cf838b811d3f5395ed1ad05086b52148fb0"},
- {file = "mypy-1.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94b2048a95a21f7a9ebc9fbd075a4fcd310410d078aa0228dbbad7f71335e042"},
- {file = "mypy-1.12.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ee5932370ccf7ebf83f79d1c157a5929d7ea36313027b0d70a488493dc1b179"},
- {file = "mypy-1.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:19bf51f87a295e7ab2894f1d8167622b063492d754e69c3c2fed6563268cb42a"},
- {file = "mypy-1.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d34167d43613ffb1d6c6cdc0cc043bb106cac0aa5d6a4171f77ab92a3c758bcc"},
- {file = "mypy-1.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:427878aa54f2e2c5d8db31fa9010c599ed9f994b3b49e64ae9cd9990c40bd635"},
- {file = "mypy-1.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5fcde63ea2c9f69d6be859a1e6dd35955e87fa81de95bc240143cf00de1f7f81"},
- {file = "mypy-1.12.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d54d840f6c052929f4a3d2aab2066af0f45a020b085fe0e40d4583db52aab4e4"},
- {file = "mypy-1.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:20db6eb1ca3d1de8ece00033b12f793f1ea9da767334b7e8c626a4872090cf02"},
- {file = "mypy-1.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b16fe09f9c741d85a2e3b14a5257a27a4f4886c171d562bc5a5e90d8591906b8"},
- {file = "mypy-1.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0dcc1e843d58f444fce19da4cce5bd35c282d4bde232acdeca8279523087088a"},
- {file = "mypy-1.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e10ba7de5c616e44ad21005fa13450cd0de7caaa303a626147d45307492e4f2d"},
- {file = "mypy-1.12.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e6fe449223fa59fbee351db32283838a8fee8059e0028e9e6494a03802b4004"},
- {file = "mypy-1.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:dc6e2a2195a290a7fd5bac3e60b586d77fc88e986eba7feced8b778c373f9afe"},
- {file = "mypy-1.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:de5b2a8988b4e1269a98beaf0e7cc71b510d050dce80c343b53b4955fff45f19"},
- {file = "mypy-1.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:843826966f1d65925e8b50d2b483065c51fc16dc5d72647e0236aae51dc8d77e"},
- {file = "mypy-1.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fe20f89da41a95e14c34b1ddb09c80262edcc295ad891f22cc4b60013e8f78d"},
- {file = "mypy-1.12.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8135ffec02121a75f75dc97c81af7c14aa4ae0dda277132cfcd6abcd21551bfd"},
- {file = "mypy-1.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:a7b76fa83260824300cc4834a3ab93180db19876bce59af921467fd03e692810"},
- {file = "mypy-1.12.1-py3-none-any.whl", hash = "sha256:ce561a09e3bb9863ab77edf29ae3a50e65685ad74bba1431278185b7e5d5486e"},
- {file = "mypy-1.12.1.tar.gz", hash = "sha256:f5b3936f7a6d0e8280c9bdef94c7ce4847f5cdfc258fbb2c29a8c1711e8bb96d"},
+ {file = "mypy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e971c1c667007f9f2b397ffa80fa8e1e0adccff336e5e77e74cb5f22868bee87"},
+ {file = "mypy-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e86aaeaa3221a278c66d3d673b297232947d873773d61ca3ee0e28b2ff027179"},
+ {file = "mypy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1628c5c3ce823d296e41e2984ff88c5861499041cb416a8809615d0c1f41740e"},
+ {file = "mypy-1.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7fadb29b77fc14a0dd81304ed73c828c3e5cde0016c7e668a86a3e0dfc9f3af3"},
+ {file = "mypy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:3fa76988dc760da377c1e5069200a50d9eaaccf34f4ea18428a3337034ab5a44"},
+ {file = "mypy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6e73c8a154eed31db3445fe28f63ad2d97b674b911c00191416cf7f6459fd49a"},
+ {file = "mypy-1.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:273e70fcb2e38c5405a188425aa60b984ffdcef65d6c746ea5813024b68c73dc"},
+ {file = "mypy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1daca283d732943731a6a9f20fdbcaa927f160bc51602b1d4ef880a6fb252015"},
+ {file = "mypy-1.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7e68047bedb04c1c25bba9901ea46ff60d5eaac2d71b1f2161f33107e2b368eb"},
+ {file = "mypy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:7a52f26b9c9b1664a60d87675f3bae00b5c7f2806e0c2800545a32c325920bcc"},
+ {file = "mypy-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d5326ab70a6db8e856d59ad4cb72741124950cbbf32e7b70e30166ba7bbf61dd"},
+ {file = "mypy-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bf4ec4980bec1e0e24e5075f449d014011527ae0055884c7e3abc6a99cd2c7f1"},
+ {file = "mypy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:390dfb898239c25289495500f12fa73aa7f24a4c6d90ccdc165762462b998d63"},
+ {file = "mypy-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e026d55ddcd76e29e87865c08cbe2d0104e2b3153a523c529de584759379d3d"},
+ {file = "mypy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:585ed36031d0b3ee362e5107ef449a8b5dfd4e9c90ccbe36414ee405ee6b32ba"},
+ {file = "mypy-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9f6f4c0b27401d14c483c622bc5105eff3911634d576bbdf6695b9a7c1ba741"},
+ {file = "mypy-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b2280cedcb312c7a79f5001ae5325582d0d339bce684e4a529069d0e7ca1e7"},
+ {file = "mypy-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:342de51c48bab326bfc77ce056ba08c076d82ce4f5a86621f972ed39970f94d8"},
+ {file = "mypy-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00df23b42e533e02a6f0055e54de9a6ed491cd8b7ea738647364fd3a39ea7efc"},
+ {file = "mypy-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:e8c8387e5d9dff80e7daf961df357c80e694e942d9755f3ad77d69b0957b8e3f"},
+ {file = "mypy-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14117b9da3305b39860d0aa34b8f1ff74d209a368829a584eb77524389a9c13e"},
+ {file = "mypy-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af98c5a958f9c37404bd4eef2f920b94874507e146ed6ee559f185b8809c44cc"},
+ {file = "mypy-1.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b343a1d3989547024377c2ba0dca9c74a2428ad6ed24283c213af8dbb0710b"},
+ {file = "mypy-1.14.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cdb5563c1726c85fb201be383168f8c866032db95e1095600806625b3a648cb7"},
+ {file = "mypy-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:74e925649c1ee0a79aa7448baf2668d81cc287dc5782cff6a04ee93f40fb8d3f"},
+ {file = "mypy-1.14.0-py3-none-any.whl", hash = "sha256:2238d7f93fc4027ed1efc944507683df3ba406445a2b6c96e79666a045aadfab"},
+ {file = "mypy-1.14.0.tar.gz", hash = "sha256:822dbd184d4a9804df5a7d5335a68cf7662930e70b8c1bc976645d1509f9a9d6"},
]
[[package]]
@@ -530,22 +514,6 @@ files = [
{file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
]
-[[package]]
-name = "psutil"
-version = "5.9.8"
-requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
-summary = "Cross-platform lib for process and system monitoring in Python."
-groups = ["dev"]
-files = [
- {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"},
- {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"},
- {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"},
- {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"},
- {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"},
- {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"},
- {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"},
-]
-
[[package]]
name = "pydantic"
version = "2.10.4"
@@ -914,31 +882,13 @@ files = [
{file = "syrupy-4.7.2.tar.gz", hash = "sha256:ea45e099f242de1bb53018c238f408a5bb6c82007bc687aefcbeaa0e1c2e935a"},
]
-[[package]]
-name = "taskipy"
-version = "1.13.0"
-requires_python = "<4.0,>=3.6"
-summary = "tasks runner for python projects"
-groups = ["dev"]
-dependencies = [
- "colorama<0.5.0,>=0.4.4",
- "mslex<2.0.0,>=1.1.0; sys_platform == \"win32\"",
- "psutil<6.0.0,>=5.7.2",
- "tomli<2.0.0,>=1.2.3; python_version >= \"3.6\" and python_version < \"3.7\"",
- "tomli<3.0.0,>=2.0.1; python_version ~= \"3.7\"",
-]
-files = [
- {file = "taskipy-1.13.0-py3-none-any.whl", hash = "sha256:56f42b7e508d9aed2c7b6365f8d3dab62dbd0c768c1ab606c819da4fc38421f7"},
- {file = "taskipy-1.13.0.tar.gz", hash = "sha256:2b52f0257958fed151f1340f7de93fcf0848f7a358ad62ba05c31c2ca04f89fe"},
-]
-
[[package]]
name = "tomli"
version = "2.0.2"
requires_python = ">=3.8"
summary = "A lil' TOML parser"
groups = ["dev"]
-marker = "python_version < \"4.0\""
+marker = "python_version < \"3.11\""
files = [
{file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"},
{file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"},
diff --git a/pdm.minimal.lock b/pdm.minimal.lock
new file mode 100644
index 000000000..f8ee42188
--- /dev/null
+++ b/pdm.minimal.lock
@@ -0,0 +1,953 @@
+# This file is @generated by PDM.
+# It is not intended for manual editing.
+
+[metadata]
+groups = ["default", "dev"]
+strategy = ["direct_minimal_versions", "inherit_metadata"]
+lock_version = "4.5.0"
+content_hash = "sha256:50f45ddc1fe2529d12869f3f378bf09b25166e6c66cdf84f1c32db1cbe43ff8c"
+
+[[metadata.targets]]
+requires_python = "~=3.9"
+
+[[package]]
+name = "annotated-types"
+version = "0.7.0"
+requires_python = ">=3.8"
+summary = "Reusable constraint types to use with typing.Annotated"
+groups = ["default"]
+dependencies = [
+ "typing-extensions>=4.0.0; python_version < \"3.9\"",
+]
+files = [
+ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
+ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
+]
+
+[[package]]
+name = "anyio"
+version = "3.7.1"
+requires_python = ">=3.7"
+summary = "High level compatibility layer for multiple asynchronous event loop implementations"
+groups = ["default"]
+dependencies = [
+ "exceptiongroup; python_version < \"3.11\"",
+ "idna>=2.8",
+ "sniffio>=1.1",
+ "typing-extensions; python_version < \"3.8\"",
+]
+files = [
+ {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"},
+ {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"},
+]
+
+[[package]]
+name = "attrs"
+version = "21.3.0"
+requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+summary = "Classes Without Boilerplate"
+groups = ["default"]
+files = [
+ {file = "attrs-21.3.0-py2.py3-none-any.whl", hash = "sha256:8f7335278dedd26b58c38e006338242cc0977f06d51579b2b8b87b9b33bff66c"},
+ {file = "attrs-21.3.0.tar.gz", hash = "sha256:50f3c9b216dc9021042f71b392859a773b904ce1a029077f58f6598272432045"},
+]
+
+[[package]]
+name = "certifi"
+version = "2024.12.14"
+requires_python = ">=3.6"
+summary = "Python package for providing Mozilla's CA Bundle."
+groups = ["default"]
+files = [
+ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"},
+ {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"},
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.1"
+requires_python = ">=3.7"
+summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+groups = ["default"]
+files = [
+ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"},
+ {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
+ {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
+]
+
+[[package]]
+name = "click"
+version = "8.1.8"
+requires_python = ">=3.7"
+summary = "Composable command line interface toolkit"
+groups = ["default"]
+dependencies = [
+ "colorama; platform_system == \"Windows\"",
+ "importlib-metadata; python_version < \"3.8\"",
+]
+files = [
+ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
+ {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.3"
+requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+summary = "Cross-platform colored terminal text."
+groups = ["default", "dev"]
+marker = "sys_platform == \"win32\" or platform_system == \"Windows\""
+files = [
+ {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"},
+ {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"},
+]
+
+[[package]]
+name = "coverage"
+version = "7.6.9"
+requires_python = ">=3.9"
+summary = "Code coverage measurement for Python"
+groups = ["dev"]
+files = [
+ {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"},
+ {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"},
+ {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"},
+ {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"},
+ {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"},
+ {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"},
+ {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"},
+ {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"},
+ {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"},
+ {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"},
+ {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"},
+ {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"},
+ {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"},
+ {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"},
+ {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"},
+ {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"},
+ {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"},
+ {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"},
+ {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"},
+ {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"},
+ {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"},
+ {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"},
+ {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"},
+ {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"},
+ {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"},
+ {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"},
+ {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"},
+ {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"},
+ {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"},
+ {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"},
+ {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"},
+ {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"},
+ {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"},
+ {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"},
+ {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"},
+ {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"},
+ {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"},
+ {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"},
+ {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"},
+ {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"},
+ {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"},
+ {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"},
+ {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"},
+ {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"},
+ {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"},
+ {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"},
+ {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"},
+ {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"},
+ {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"},
+ {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"},
+ {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"},
+ {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"},
+ {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"},
+ {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"},
+ {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"},
+ {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"},
+ {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"},
+ {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"},
+ {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"},
+ {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"},
+ {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"},
+ {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"},
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.2.2"
+requires_python = ">=3.7"
+summary = "Backport of PEP 654 (exception groups)"
+groups = ["default", "dev"]
+marker = "python_version < \"3.11\""
+files = [
+ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"},
+ {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"},
+]
+
+[[package]]
+name = "execnet"
+version = "2.1.1"
+requires_python = ">=3.8"
+summary = "execnet: rapid multi-Python deployment"
+groups = ["dev"]
+files = [
+ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"},
+ {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"},
+]
+
+[[package]]
+name = "h11"
+version = "0.12.0"
+requires_python = ">=3.6"
+summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
+groups = ["default"]
+files = [
+ {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"},
+ {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"},
+]
+
+[[package]]
+name = "httpcore"
+version = "0.13.7"
+requires_python = ">=3.6"
+summary = "A minimal low-level HTTP client."
+groups = ["default"]
+dependencies = [
+ "anyio==3.*",
+ "h11<0.13,>=0.11",
+ "sniffio==1.*",
+]
+files = [
+ {file = "httpcore-0.13.7-py3-none-any.whl", hash = "sha256:369aa481b014cf046f7067fddd67d00560f2f00426e79569d99cb11245134af0"},
+ {file = "httpcore-0.13.7.tar.gz", hash = "sha256:036f960468759e633574d7c121afba48af6419615d36ab8ede979f1ad6276fa3"},
+]
+
+[[package]]
+name = "httpx"
+version = "0.20.0"
+requires_python = ">=3.6"
+summary = "The next generation HTTP client."
+groups = ["default"]
+dependencies = [
+ "async-generator; python_version < \"3.7\"",
+ "certifi",
+ "charset-normalizer",
+ "httpcore<0.14.0,>=0.13.3",
+ "rfc3986[idna2008]<2,>=1.3",
+ "sniffio",
+]
+files = [
+ {file = "httpx-0.20.0-py3-none-any.whl", hash = "sha256:33af5aad9bdc82ef1fc89219c1e36f5693bf9cd0ebe330884df563445682c0f8"},
+ {file = "httpx-0.20.0.tar.gz", hash = "sha256:09606d630f070d07f9ff28104fbcea429ea0014c1e89ac90b4d8de8286c40e7b"},
+]
+
+[[package]]
+name = "idna"
+version = "3.10"
+requires_python = ">=3.6"
+summary = "Internationalized Domain Names in Applications (IDNA)"
+groups = ["default"]
+files = [
+ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
+ {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.0.0"
+requires_python = ">=3.7"
+summary = "brain-dead simple config-ini parsing"
+groups = ["dev"]
+files = [
+ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
+ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
+]
+
+[[package]]
+name = "jinja2"
+version = "3.0.0"
+requires_python = ">=3.6"
+summary = "A very fast and expressive template engine."
+groups = ["default"]
+dependencies = [
+ "MarkupSafe>=2.0.0rc2",
+]
+files = [
+ {file = "Jinja2-3.0.0-py3-none-any.whl", hash = "sha256:2f2de5285cf37f33d33ecd4a9080b75c87cd0c1994d5a9c6df17131ea1f049c6"},
+ {file = "Jinja2-3.0.0.tar.gz", hash = "sha256:ea8d7dd814ce9df6de6a761ec7f1cac98afe305b8cdc4aaae4e114b8d8ce24c5"},
+]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.2"
+requires_python = ">=3.9"
+summary = "Safely add untrusted strings to HTML/XML markup."
+groups = ["default"]
+files = [
+ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"},
+ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
+]
+
+[[package]]
+name = "mypy"
+version = "1.13.0"
+requires_python = ">=3.8"
+summary = "Optional static typing for Python"
+groups = ["dev"]
+dependencies = [
+ "mypy-extensions>=1.0.0",
+ "tomli>=1.1.0; python_version < \"3.11\"",
+ "typing-extensions>=4.6.0",
+]
+files = [
+ {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"},
+ {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"},
+ {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"},
+ {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"},
+ {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"},
+ {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"},
+ {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"},
+ {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"},
+ {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"},
+ {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"},
+ {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"},
+ {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"},
+ {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"},
+ {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"},
+ {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"},
+ {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"},
+ {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"},
+ {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"},
+ {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"},
+ {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"},
+ {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"},
+ {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"},
+ {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"},
+ {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"},
+ {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"},
+ {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"},
+ {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"},
+]
+
+[[package]]
+name = "mypy-extensions"
+version = "1.0.0"
+requires_python = ">=3.5"
+summary = "Type system extensions for programs checked with the mypy type checker."
+groups = ["dev"]
+files = [
+ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
+ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
+]
+
+[[package]]
+name = "packaging"
+version = "24.2"
+requires_python = ">=3.8"
+summary = "Core utilities for Python packages"
+groups = ["dev"]
+files = [
+ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
+ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
+]
+
+[[package]]
+name = "pluggy"
+version = "1.5.0"
+requires_python = ">=3.8"
+summary = "plugin and hook calling mechanisms for python"
+groups = ["dev"]
+files = [
+ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
+ {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
+]
+
+[[package]]
+name = "py"
+version = "1.11.0"
+requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+summary = "library with cross-python path, ini-parsing, io, code, log facilities"
+groups = ["dev"]
+files = [
+ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
+ {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
+]
+
+[[package]]
+name = "pydantic"
+version = "2.1.1"
+requires_python = ">=3.7"
+summary = "Data validation using Python type hints"
+groups = ["default"]
+dependencies = [
+ "annotated-types>=0.4.0",
+ "pydantic-core==2.4.0",
+ "typing-extensions>=4.6.1",
+]
+files = [
+ {file = "pydantic-2.1.1-py3-none-any.whl", hash = "sha256:43bdbf359d6304c57afda15c2b95797295b702948082d4c23851ce752f21da70"},
+ {file = "pydantic-2.1.1.tar.gz", hash = "sha256:22d63db5ce4831afd16e7c58b3192d3faf8f79154980d9397d9867254310ba4b"},
+]
+
+[[package]]
+name = "pydantic-core"
+version = "2.4.0"
+requires_python = ">=3.7"
+summary = ""
+groups = ["default"]
+dependencies = [
+ "typing-extensions!=4.7.0,>=4.6.0",
+]
+files = [
+ {file = "pydantic_core-2.4.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:2ca4687dd996bde7f3c420def450797feeb20dcee2b9687023e3323c73fc14a2"},
+ {file = "pydantic_core-2.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:782fced7d61469fd1231b184a80e4f2fa7ad54cd7173834651a453f96f29d673"},
+ {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6213b471b68146af97b8551294e59e7392c2117e28ffad9c557c65087f4baee3"},
+ {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63797499a219d8e81eb4e0c42222d0a4c8ec896f5c76751d4258af95de41fdf1"},
+ {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_armv7l.whl", hash = "sha256:0455876d575a35defc4da7e0a199596d6c773e20d3d42fa1fc29f6aa640369ed"},
+ {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:8c938c96294d983dcf419b54dba2d21056959c22911d41788efbf949a29ae30d"},
+ {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_s390x.whl", hash = "sha256:878a5017d93e776c379af4e7b20f173c82594d94fa073059bcc546789ad50bf8"},
+ {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:69159afc2f2dc43285725f16143bc5df3c853bc1cb7df6021fce7ef1c69e8171"},
+ {file = "pydantic_core-2.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54df7df399b777c1fd144f541c95d351b3aa110535a6810a6a569905d106b6f3"},
+ {file = "pydantic_core-2.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e412607ca89a0ced10758dfb8f9adcc365ce4c1c377e637c01989a75e9a9ec8a"},
+ {file = "pydantic_core-2.4.0-cp310-none-win32.whl", hash = "sha256:853f103e2b9a58832fdd08a587a51de8b552ae90e1a5d167f316b7eabf8d7dde"},
+ {file = "pydantic_core-2.4.0-cp310-none-win_amd64.whl", hash = "sha256:3ba2c9c94a9176f6321a879c8b864d7c5b12d34f549a4c216c72ce213d7d953c"},
+ {file = "pydantic_core-2.4.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:a8b7acd04896e8f161e1500dc5f218017db05c1d322f054e89cbd089ce5d0071"},
+ {file = "pydantic_core-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16468bd074fa4567592d3255bf25528ed41e6b616d69bf07096bdb5b66f947d1"},
+ {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cba5ad5eef02c86a1f3da00544cbc59a510d596b27566479a7cd4d91c6187a11"},
+ {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7206e41e04b443016e930e01685bab7a308113c0b251b3f906942c8d4b48fcb"},
+ {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_armv7l.whl", hash = "sha256:c1375025f0bfc9155286ebae8eecc65e33e494c90025cda69e247c3ccd2bab00"},
+ {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_ppc64le.whl", hash = "sha256:3534118289e33130ed3f1cc487002e8d09b9f359be48b02e9cd3de58ce58fba9"},
+ {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_s390x.whl", hash = "sha256:94d2b36a74623caab262bf95f0e365c2c058396082bd9d6a9e825657d0c1e7fa"},
+ {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:af24ad4fbaa5e4a2000beae0c3b7fd1c78d7819ab90f9370a1cfd8998e3f8a3c"},
+ {file = "pydantic_core-2.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bf10963d8aed8bbe0165b41797c9463d4c5c8788ae6a77c68427569be6bead41"},
+ {file = "pydantic_core-2.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68199ada7c310ddb8c76efbb606a0de656b40899388a7498954f423e03fc38be"},
+ {file = "pydantic_core-2.4.0-cp311-none-win32.whl", hash = "sha256:6f855bcc96ed3dd56da7373cfcc9dcbabbc2073cac7f65c185772d08884790ce"},
+ {file = "pydantic_core-2.4.0-cp311-none-win_amd64.whl", hash = "sha256:de39eb3bab93a99ddda1ac1b9aa331b944d8bcc4aa9141148f7fd8ee0299dafc"},
+ {file = "pydantic_core-2.4.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:f773b39780323a0499b53ebd91a28ad11cde6705605d98d999dfa08624caf064"},
+ {file = "pydantic_core-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a297c0d6c61963c5c3726840677b798ca5b7dfc71bc9c02b9a4af11d23236008"},
+ {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:546064c55264156b973b5e65e5fafbe5e62390902ce3cf6b4005765505e8ff56"},
+ {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36ba9e728588588f0196deaf6751b9222492331b5552f865a8ff120869d372e0"},
+ {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_armv7l.whl", hash = "sha256:57a53a75010c635b3ad6499e7721eaa3b450e03f6862afe2dbef9c8f66e46ec8"},
+ {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_ppc64le.whl", hash = "sha256:4b262bbc13022f2097c48a21adcc360a81d83dc1d854c11b94953cd46d7d3c07"},
+ {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_s390x.whl", hash = "sha256:01947ad728f426fa07fcb26457ebf90ce29320259938414bc0edd1476e75addb"},
+ {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b2799c2eaf182769889761d4fb4d78b82bc47dae833799fedbf69fc7de306faa"},
+ {file = "pydantic_core-2.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a08fd490ba36d1fbb2cd5dcdcfb9f3892deb93bd53456724389135712b5fc735"},
+ {file = "pydantic_core-2.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1e8a7c62d15a5c4b307271e4252d76ebb981d6251c6ecea4daf203ef0179ea4f"},
+ {file = "pydantic_core-2.4.0-cp312-none-win32.whl", hash = "sha256:9206c14a67c38de7b916e486ae280017cf394fa4b1aa95cfe88621a4e1d79725"},
+ {file = "pydantic_core-2.4.0-cp312-none-win_amd64.whl", hash = "sha256:884235507549a6b2d3c4113fb1877ae263109e787d9e0eb25c35982ab28d0399"},
+ {file = "pydantic_core-2.4.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:867d3eea954bea807cabba83cfc939c889a18576d66d197c60025b15269d7cc0"},
+ {file = "pydantic_core-2.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:664402ef0c238a7f8a46efb101789d5f2275600fb18114446efec83cfadb5b66"},
+ {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64e8012ad60a5f0da09ed48725e6e923d1be25f2f091a640af6079f874663813"},
+ {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac2b680de398f293b68183317432b3d67ab3faeba216aec18de0c395cb5e3060"},
+ {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_armv7l.whl", hash = "sha256:8efc1be43b036c2b6bcfb1451df24ee0ddcf69c31351003daf2699ed93f5687b"},
+ {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:d93aedbc4614cc21b9ab0d0c4ccd7143354c1f7cffbbe96ae5216ad21d1b21b5"},
+ {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_s390x.whl", hash = "sha256:af788b64e13d52fc3600a68b16d31fa8d8573e3ff2fc9a38f8a60b8d94d1f012"},
+ {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97c6349c81cee2e69ef59eba6e6c08c5936e6b01c2d50b9e4ac152217845ae09"},
+ {file = "pydantic_core-2.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc086ddb6dc654a15deeed1d1f2bcb1cb924ebd70df9dca738af19f64229b06c"},
+ {file = "pydantic_core-2.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e953353180bec330c3b830891d260b6f8e576e2d18db3c78d314e56bb2276066"},
+ {file = "pydantic_core-2.4.0-cp39-none-win32.whl", hash = "sha256:6feb4b64d11d5420e517910d60a907d08d846cacaf4e029668725cd21d16743c"},
+ {file = "pydantic_core-2.4.0-cp39-none-win_amd64.whl", hash = "sha256:153a61ac4030fa019b70b31fb7986461119230d3ba0ab661c757cfea652f4332"},
+ {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:3fcf529382b282a30b466bd7af05be28e22aa620e016135ac414f14e1ee6b9e1"},
+ {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2edef05b63d82568b877002dc4cb5cc18f8929b59077120192df1e03e0c633f8"},
+ {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da055a1b0bfa8041bb2ff586b2cb0353ed03944a3472186a02cc44a557a0e661"},
+ {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:77dadc764cf7c5405e04866181c5bd94a447372a9763e473abb63d1dfe9b7387"},
+ {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a4ea23b07f29487a7bef2a869f68c7ee0e05424d81375ce3d3de829314c6b5ec"},
+ {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:382f0baa044d674ad59455a5eff83d7965572b745cc72df35c52c2ce8c731d37"},
+ {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:08f89697625e453421401c7f661b9d1eb4c9e4c0a12fd256eeb55b06994ac6af"},
+ {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:efff8b6761a1f6e45cebd1b7a6406eb2723d2d5710ff0d1b624fe11313693989"},
+ {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32a1e0352558cd7ccc014ffe818c7d87b15ec6145875e2cc5fa4bb7351a1033d"},
+ {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a027f41c5008571314861744d83aff75a34cf3a07022e0be32b214a5bc93f7f1"},
+ {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1927f0e15d190f11f0b8344373731e28fd774c6d676d8a6cfadc95c77214a48b"},
+ {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7aa82d483d5fb867d4fb10a138ffd57b0f1644e99f2f4f336e48790ada9ada5e"},
+ {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b85778308bf945e9b33ac604e6793df9b07933108d20bdf53811bc7c2798a4af"},
+ {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3ded19dcaefe2f6706d81e0db787b59095f4ad0fbadce1edffdf092294c8a23f"},
+ {file = "pydantic_core-2.4.0.tar.gz", hash = "sha256:ec3473c9789cc00c7260d840c3db2c16dbfc816ca70ec87a00cddfa3e1a1cdd5"},
+]
+
+[[package]]
+name = "pytest"
+version = "8.0.1"
+requires_python = ">=3.8"
+summary = "pytest: simple powerful testing with Python"
+groups = ["dev"]
+dependencies = [
+ "colorama; sys_platform == \"win32\"",
+ "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"",
+ "iniconfig",
+ "packaging",
+ "pluggy<2.0,>=1.3.0",
+ "tomli>=1.0.0; python_version < \"3.11\"",
+]
+files = [
+ {file = "pytest-8.0.1-py3-none-any.whl", hash = "sha256:3e4f16fe1c0a9dc9d9389161c127c3edc5d810c38d6793042fb81d9f48a59fca"},
+ {file = "pytest-8.0.1.tar.gz", hash = "sha256:267f6563751877d772019b13aacbe4e860d73fe8f651f28112e9ac37de7513ae"},
+]
+
+[[package]]
+name = "pytest-cov"
+version = "0.6"
+summary = "py.test plugin for coverage reporting with support for both centralised and distributed testing"
+groups = ["dev"]
+dependencies = [
+ "coverage>=3.3.1",
+ "py>=1.2.2",
+ "pytest-xdist>=1.2",
+]
+files = [
+ {file = "pytest-cov-0.6.tar.gz", hash = "sha256:ab095420d1845bfb8998e6aa3072141da3b0c97a34475574752bbcf04edbac85"},
+]
+
+[[package]]
+name = "pytest-mock"
+version = "3.1.0"
+requires_python = ">=3.5"
+summary = "Thin-wrapper around the mock package for easier use with pytest"
+groups = ["dev"]
+dependencies = [
+ "pytest>=2.7",
+]
+files = [
+ {file = "pytest-mock-3.1.0.tar.gz", hash = "sha256:ce610831cedeff5331f4e2fc453a5dd65384303f680ab34bee2c6533855b431c"},
+ {file = "pytest_mock-3.1.0-py2.py3-none-any.whl", hash = "sha256:997729451dfc36b851a9accf675488c7020beccda15e11c75632ee3d1b1ccd71"},
+]
+
+[[package]]
+name = "pytest-xdist"
+version = "3.6.1"
+requires_python = ">=3.8"
+summary = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs"
+groups = ["dev"]
+dependencies = [
+ "execnet>=2.1",
+ "pytest>=7.0.0",
+]
+files = [
+ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"},
+ {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"},
+]
+
+[[package]]
+name = "python-dateutil"
+version = "2.8.1"
+requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+summary = "Extensions to the standard Python datetime module"
+groups = ["default"]
+dependencies = [
+ "six>=1.5",
+]
+files = [
+ {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"},
+ {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"},
+]
+
+[[package]]
+name = "python-multipart"
+version = "0.0.1"
+summary = "A streaming multipart parser for Python"
+groups = ["dev"]
+files = [
+ {file = "python-multipart-0.0.1.tar.gz", hash = "sha256:ae940d053341378e53937d6e7f2081d26b4435dbd53dcd901be73ef3d6ff70be"},
+]
+
+[[package]]
+name = "rfc3986"
+version = "1.5.0"
+summary = "Validating URI References per RFC 3986"
+groups = ["default"]
+files = [
+ {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"},
+ {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"},
+]
+
+[[package]]
+name = "rfc3986"
+version = "1.5.0"
+extras = ["idna2008"]
+summary = "Validating URI References per RFC 3986"
+groups = ["default"]
+dependencies = [
+ "idna",
+ "rfc3986==1.5.0",
+]
+files = [
+ {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"},
+ {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"},
+]
+
+[[package]]
+name = "ruamel-yaml"
+version = "0.18.6"
+requires_python = ">=3.7"
+summary = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order"
+groups = ["default", "dev"]
+dependencies = [
+ "ruamel-yaml-clib>=0.2.7; platform_python_implementation == \"CPython\" and python_version < \"3.13\"",
+]
+files = [
+ {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"},
+ {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"},
+]
+
+[[package]]
+name = "ruamel-yaml-clib"
+version = "0.2.12"
+requires_python = ">=3.9"
+summary = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml"
+groups = ["default", "dev"]
+marker = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""
+files = [
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a52d48f4e7bf9005e8f0a89209bf9a73f7190ddf0489eee5eb51377385f59f2a"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bc5f1e1c28e966d61d2519f2a3d451ba989f9ea0f2307de7bc45baa526de9e45"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a0e060aace4c24dcaf71023bbd7d42674e3b230f7e7b97317baf1e953e5b519"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2c59aa6170b990d8d2719323e628aaf36f3bfbc1c26279c0eeeb24d05d2d11c7"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b"},
+ {file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"},
+]
+
+[[package]]
+name = "ruamel-yaml-string"
+version = "0.1.1"
+requires_python = ">=3"
+summary = "add dump_to_string/dumps method that returns YAML document as string"
+groups = ["dev"]
+dependencies = [
+ "ruamel-yaml>=0.17.17",
+]
+files = [
+ {file = "ruamel.yaml.string-0.1.1-py3-none-any.whl", hash = "sha256:eb146bcb42b116216638034a434e9cf3ae2a5d3933aa37183a9854b5f3ff42de"},
+ {file = "ruamel.yaml.string-0.1.1.tar.gz", hash = "sha256:7a7aedcc055d45c004d38b756f58474ebefb106851f4ce56ce58415709784350"},
+]
+
+[[package]]
+name = "ruff"
+version = "0.2.0"
+requires_python = ">=3.7"
+summary = "An extremely fast Python linter and code formatter, written in Rust."
+groups = ["default"]
+files = [
+ {file = "ruff-0.2.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:638ea3294f800d18bae84a492cb5a245c8d29c90d19a91d8e338937a4c27fca0"},
+ {file = "ruff-0.2.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3ff35433fcf4dff6d610738712152df6b7d92351a1bde8e00bd405b08b3d5759"},
+ {file = "ruff-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf9faafbdcf4f53917019f2c230766da437d4fd5caecd12ddb68bb6a17d74399"},
+ {file = "ruff-0.2.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8153a3e4128ed770871c47545f1ae7b055023e0c222ff72a759f5a341ee06483"},
+ {file = "ruff-0.2.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8a75a98ae989a27090e9c51f763990ad5bbc92d20626d54e9701c7fe597f399"},
+ {file = "ruff-0.2.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:87057dd2fdde297130ff99553be8549ca38a2965871462a97394c22ed2dfc19d"},
+ {file = "ruff-0.2.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d232f99d3ab00094ebaf88e0fb7a8ccacaa54cc7fa3b8993d9627a11e6aed7a"},
+ {file = "ruff-0.2.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d3c641f95f435fc6754b05591774a17df41648f0daf3de0d75ad3d9f099ab92"},
+ {file = "ruff-0.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3826fb34c144ef1e171b323ed6ae9146ab76d109960addca730756dc19dc7b22"},
+ {file = "ruff-0.2.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:eceab7d85d09321b4de18b62d38710cf296cb49e98979960a59c6b9307c18cfe"},
+ {file = "ruff-0.2.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:30ad74687e1f4a9ff8e513b20b82ccadb6bd796fe5697f1e417189c5cde6be3e"},
+ {file = "ruff-0.2.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a7e3818698f8460bd0f8d4322bbe99db8327e9bc2c93c789d3159f5b335f47da"},
+ {file = "ruff-0.2.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:edf23041242c48b0d8295214783ef543847ef29e8226d9f69bf96592dba82a83"},
+ {file = "ruff-0.2.0-py3-none-win32.whl", hash = "sha256:e155147199c2714ff52385b760fe242bb99ea64b240a9ffbd6a5918eb1268843"},
+ {file = "ruff-0.2.0-py3-none-win_amd64.whl", hash = "sha256:ba918e01cdd21e81b07555564f40d307b0caafa9a7a65742e98ff244f5035c59"},
+ {file = "ruff-0.2.0-py3-none-win_arm64.whl", hash = "sha256:3fbaff1ba9564a2c5943f8f38bc221f04bac687cc7485e45237579fee7ccda79"},
+ {file = "ruff-0.2.0.tar.gz", hash = "sha256:63856b91837606c673537d2889989733d7dffde553828d3b0f0bacfa6def54be"},
+]
+
+[[package]]
+name = "shellingham"
+version = "1.3.2"
+requires_python = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6"
+summary = "Tool to Detect Surrounding Shell"
+groups = ["default"]
+files = [
+ {file = "shellingham-1.3.2-py2.py3-none-any.whl", hash = "sha256:7f6206ae169dc1a03af8a138681b3f962ae61cc93ade84d0585cca3aaf770044"},
+ {file = "shellingham-1.3.2.tar.gz", hash = "sha256:576c1982bea0ba82fb46c36feb951319d7f42214a82634233f58b40d858a751e"},
+]
+
+[[package]]
+name = "six"
+version = "1.17.0"
+requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+summary = "Python 2 and 3 compatibility utilities"
+groups = ["default"]
+files = [
+ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
+ {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
+]
+
+[[package]]
+name = "sniffio"
+version = "1.3.1"
+requires_python = ">=3.7"
+summary = "Sniff out which async library your code is running under"
+groups = ["default"]
+files = [
+ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
+ {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
+]
+
+[[package]]
+name = "syrupy"
+version = "4.6.1"
+requires_python = ">=3.8.1,<4"
+summary = "Pytest Snapshot Test Utility"
+groups = ["dev"]
+dependencies = [
+ "pytest<9.0.0,>=7.0.0",
+]
+files = [
+ {file = "syrupy-4.6.1-py3-none-any.whl", hash = "sha256:203e52f9cb9fa749cf683f29bd68f02c16c3bc7e7e5fe8f2fc59bdfe488ce133"},
+ {file = "syrupy-4.6.1.tar.gz", hash = "sha256:37a835c9ce7857eeef86d62145885e10b3cb9615bc6abeb4ce404b3f18e1bb36"},
+]
+
+[[package]]
+name = "tomli"
+version = "2.2.1"
+requires_python = ">=3.8"
+summary = "A lil' TOML parser"
+groups = ["dev"]
+marker = "python_version < \"3.11\""
+files = [
+ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
+ {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"},
+ {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"},
+ {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"},
+ {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"},
+ {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"},
+ {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"},
+ {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"},
+ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
+ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
+]
+
+[[package]]
+name = "typer"
+version = "0.6.1"
+requires_python = ">=3.6"
+summary = "Typer, build great CLIs. Easy to code. Based on Python type hints."
+groups = ["default"]
+dependencies = [
+ "click<9.0.0,>=7.1.1",
+]
+files = [
+ {file = "typer-0.6.1-py3-none-any.whl", hash = "sha256:54b19e5df18654070a82f8c2aa1da456a4ac16a2a83e6dcd9f170e291c56338e"},
+ {file = "typer-0.6.1.tar.gz", hash = "sha256:2d5720a5e63f73eaf31edaa15f6ab87f35f0690f8ca233017d7d23d743a91d73"},
+]
+
+[[package]]
+name = "types-certifi"
+version = "2020.4.0"
+summary = "Typing stubs for certifi"
+groups = ["dev"]
+files = [
+ {file = "types-certifi-2020.4.0.tar.gz", hash = "sha256:787d1a0c7897a1c658f8f7958ae57141b3fff13acb866e5bcd31cfb45037546f"},
+ {file = "types_certifi-2020.4.0-py3-none-any.whl", hash = "sha256:0ffdbe451d3b02f6d2cfd87bcfb2f086a4ff1fa76a35d51cfc3771e261d7a8fd"},
+]
+
+[[package]]
+name = "types-python-dateutil"
+version = "2.8.0"
+summary = "Typing stubs for python-dateutil"
+groups = ["dev"]
+files = [
+ {file = "types-python-dateutil-2.8.0.tar.gz", hash = "sha256:540c6c53c3a52433d7088254e3afdc3f6c86b5ae452aaa1b796c26d01c9fd73c"},
+ {file = "types_python_dateutil-2.8.0-py3-none-any.whl", hash = "sha256:9954d87dc982344bb2aad73a7fe505bdca72f89088ef653c4c40f52649183437"},
+]
+
+[[package]]
+name = "types-pyyaml"
+version = "6.0.3"
+summary = "Typing stubs for PyYAML"
+groups = ["dev"]
+files = [
+ {file = "types-PyYAML-6.0.3.tar.gz", hash = "sha256:6ea4eefa8579e0ce022f785a62de2bcd647fad4a81df5cf946fd67e4b059920b"},
+ {file = "types_PyYAML-6.0.3-py3-none-any.whl", hash = "sha256:8b50294b55a9db89498cdc5a65b1b4545112b6cd1cf4465bd693d828b0282a17"},
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.8.0"
+requires_python = ">=3.8"
+summary = "Backported and Experimental Type Hints for Python 3.8+"
+groups = ["default", "dev"]
+files = [
+ {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"},
+ {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"},
+]
diff --git a/pyproject.toml b/pyproject.toml
index 12a7e7914..0743b347f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -87,10 +87,9 @@ junit_family = "xunit2"
[tool.pdm.dev-dependencies]
dev = [
- "pytest",
- "pytest-mock",
- "mypy",
- "taskipy",
+ "pytest>8",
+ "pytest-mock>3",
+ "mypy>=1.13",
"pytest-cov",
"python-multipart",
"types-PyYAML<7.0.0,>=6.0.3",
@@ -116,6 +115,7 @@ regen = {composite = ["regen_e2e", "regen_integration"]}
e2e = "pytest openapi_python_client end_to_end_tests/test_end_to_end.py"
re = {composite = ["regen_e2e", "e2e --snapshot-update"]}
regen_e2e = "python -m end_to_end_tests.regen_golden_record"
+unit_test = "pytest tests"
[tool.pdm.scripts.test]
cmd = "pytest tests end_to_end_tests/test_end_to_end.py --basetemp=tests/tmp"
From 233ac6623378fb9415dc4a2a828340dcc9366b5b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 24 Dec 2024 21:58:30 +0000
Subject: [PATCH 11/18] fix: Support Typer 0.14 and 0.15 (#1173)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [typer](https://redirect.github.com/fastapi/typer)
([changelog](https://typer.tiangolo.com/release-notes/)) | `>0.6,<0.14`
-> `>0.6,<0.16` |
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
---
### Release Notes
fastapi/typer (typer)
###
[`v0.15.0`](https://redirect.github.com/fastapi/typer/releases/tag/0.15.0)
[Compare
Source](https://redirect.github.com/fastapi/typer/compare/0.14.0...0.15.0)
##### Features
- ✨ Add support for extending typer apps without passing a name, add
commands to the top level. PR
[#1037](https://redirect.github.com/fastapi/typer/pull/1037) by
[@patrick91](https://redirect.github.com/patrick91).
- New docs: [One File Per
Command](https://typer.tiangolo.com/tutorial/one-file-per-command/).
##### Internal
- ⬆ Bump mkdocs-material from 9.5.46 to 9.5.47. PR
[#1070](https://redirect.github.com/fastapi/typer/pull/1070) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump ruff from 0.8.0 to 0.8.1. PR
[#1066](https://redirect.github.com/fastapi/typer/pull/1066) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
###
[`v0.14.0`](https://redirect.github.com/fastapi/typer/releases/tag/0.14.0)
[Compare
Source](https://redirect.github.com/fastapi/typer/compare/0.13.1...0.14.0)
##### Breaking Changes
- 🔥 Remove auto naming of groups added via `add_typer` based on the
group's callback function name. PR
[#1052](https://redirect.github.com/fastapi/typer/pull/1052) by
[@patrick91](https://redirect.github.com/patrick91).
Before, it was supported to infer the name of a command group from the
callback function name in the sub-app, so, in this code:
```python
import typer
app = typer.Typer()
users_app = typer.Typer()
app.add_typer(users_app)
@users_app.callback()
def users(): # <-- This was the inferred command group name
"""
Manage users in the app.
"""
@users_app.command()
def create(name: str):
print(f"Creating user: {name}")
```
...the command group would be named `users`, based on the name of the
function `def users()`.
Now you need to set it explicitly:
```python
import typer
app = typer.Typer()
users_app = typer.Typer()
app.add_typer(users_app, name="users") # <-- Explicitly set the command group name
@users_app.callback()
def users():
"""
Manage users in the app.
"""
@users_app.command()
def create(name: str):
print(f"Creating user: {name}")
```
Updated docs [SubCommand Name and
Help](https://typer.tiangolo.com/tutorial/subcommands/name-and-help/).
**Note**: this change will enable important features in the next
release. 🤩
##### Internal
- ⬆ Bump pypa/gh-action-pypi-publish from 1.10.3 to 1.12.2. PR
[#1043](https://redirect.github.com/fastapi/typer/pull/1043) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump mkdocs-material from 9.5.44 to 9.5.46. PR
[#1062](https://redirect.github.com/fastapi/typer/pull/1062) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump ruff from 0.7.4 to 0.8.0. PR
[#1059](https://redirect.github.com/fastapi/typer/pull/1059) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump astral-sh/setup-uv from 3 to 4. PR
[#1061](https://redirect.github.com/fastapi/typer/pull/1061) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#1053](https://redirect.github.com/fastapi/typer/pull/1053) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
###
[`v0.13.1`](https://redirect.github.com/fastapi/typer/releases/tag/0.13.1)
[Compare
Source](https://redirect.github.com/fastapi/typer/compare/0.13.0...0.13.1)
##### Features
- ✨ Remove Rich tags when showing completion text. PR
[#877](https://redirect.github.com/fastapi/typer/pull/877) by
[@svlandeg](https://redirect.github.com/svlandeg).
- ✨ Render Rich markup as HTML in Markdown docs. PR
[#847](https://redirect.github.com/fastapi/typer/pull/847) by
[@svlandeg](https://redirect.github.com/svlandeg).
- ✨ Support cp850 encoding for auto-completion in PowerShell. PR
[#808](https://redirect.github.com/fastapi/typer/pull/808) by
[@svlandeg](https://redirect.github.com/svlandeg).
- ✨ Allow gettext translation of help message. PR
[#886](https://redirect.github.com/fastapi/typer/pull/886) by
[@svlandeg](https://redirect.github.com/svlandeg).
##### Refactors
- 🐛 Fix printing HTML from Rich output. PR
[#1055](https://redirect.github.com/fastapi/typer/pull/1055) by
[@tiangolo](https://redirect.github.com/tiangolo).
##### Docs
- 📝 Update markdown includes to use the new simpler format. PR
[#1054](https://redirect.github.com/fastapi/typer/pull/1054) by
[@tiangolo](https://redirect.github.com/tiangolo).
##### Internal
- ⬆ Bump ruff from 0.7.3 to 0.7.4. PR
[#1051](https://redirect.github.com/fastapi/typer/pull/1051) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#1047](https://redirect.github.com/fastapi/typer/pull/1047) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- ⬆ Bump ruff from 0.7.2 to 0.7.3. PR
[#1046](https://redirect.github.com/fastapi/typer/pull/1046) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump tiangolo/latest-changes from 0.3.1 to 0.3.2. PR
[#1044](https://redirect.github.com/fastapi/typer/pull/1044) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Update pytest-cov requirement from <6.0.0,>=2.10.0 to
>=2.10.0,<7.0.0. PR
[#1033](https://redirect.github.com/fastapi/typer/pull/1033) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
###
[`v0.13.0`](https://redirect.github.com/fastapi/typer/releases/tag/0.13.0)
[Compare
Source](https://redirect.github.com/fastapi/typer/compare/0.12.5...0.13.0)
##### Features
- ✨ Handle `KeyboardInterrupt` separately from other exceptions. PR
[#1039](https://redirect.github.com/fastapi/typer/pull/1039) by
[@patrick91](https://redirect.github.com/patrick91).
- ✨ Update `launch` to not print anything when opening urls. PR
[#1035](https://redirect.github.com/fastapi/typer/pull/1035) by
[@patrick91](https://redirect.github.com/patrick91).
- ✨ Show help items in order of definition. PR
[#944](https://redirect.github.com/fastapi/typer/pull/944) by
[@svlandeg](https://redirect.github.com/svlandeg).
##### Fixes
- 🐛 Fix equality check for custom classes. PR
[#979](https://redirect.github.com/fastapi/typer/pull/979) by
[@AryazE](https://redirect.github.com/AryazE).
- 🐛 Allow colon in zsh autocomplete values and descriptions. PR
[#988](https://redirect.github.com/fastapi/typer/pull/988) by
[@snapbug](https://redirect.github.com/snapbug).
##### Refactors
- 🗑️ Deprecate support for `is_flag` and `flag_value` parameters. PR
[#987](https://redirect.github.com/fastapi/typer/pull/987) by
[@svlandeg](https://redirect.github.com/svlandeg).
- 🔥 Remove unused functionality from `_typing.py` file. PR
[#805](https://redirect.github.com/fastapi/typer/pull/805) by
[@ivantodorovich](https://redirect.github.com/ivantodorovich).
- ✏️ Fix typo in function name `_make_rich_text`. PR
[#959](https://redirect.github.com/fastapi/typer/pull/959) by
[@svlandeg](https://redirect.github.com/svlandeg).
##### Internal
- ✅ Only run completion installation tests when the env var
`_TYPER_RUN_INSTALL_COMPLETION_TESTS` is set. PR
[#995](https://redirect.github.com/fastapi/typer/pull/995) by
[@svlandeg](https://redirect.github.com/svlandeg).
- 📝 Update the docstring of the `_make_rich_text` method. PR
[#972](https://redirect.github.com/fastapi/typer/pull/972) by
[@svlandeg](https://redirect.github.com/svlandeg).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#1040](https://redirect.github.com/fastapi/typer/pull/1040) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- ⬆ Bump mkdocs-material from 9.5.42 to 9.5.44. PR
[#1042](https://redirect.github.com/fastapi/typer/pull/1042) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump ruff from 0.7.1 to 0.7.2. PR
[#1038](https://redirect.github.com/fastapi/typer/pull/1038) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump mkdocs-macros-plugin from 1.3.6 to 1.3.7. PR
[#1031](https://redirect.github.com/fastapi/typer/pull/1031) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#1032](https://redirect.github.com/fastapi/typer/pull/1032) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- ⬆ Bump ruff from 0.7.0 to 0.7.1. PR
[#1029](https://redirect.github.com/fastapi/typer/pull/1029) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump pillow from 10.4.0 to 11.0.0. PR
[#1023](https://redirect.github.com/fastapi/typer/pull/1023) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump mkdocs-material from 9.5.35 to 9.5.42. PR
[#1027](https://redirect.github.com/fastapi/typer/pull/1027) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump ruff from 0.6.5 to 0.7.0. PR
[#1026](https://redirect.github.com/fastapi/typer/pull/1026) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump mkdocs-macros-plugin from 1.2.0 to 1.3.6. PR
[#1025](https://redirect.github.com/fastapi/typer/pull/1025) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Update pre-commit requirement from <4.0.0,>=2.17.0 to
>=2.17.0,<5.0.0. PR
[#1012](https://redirect.github.com/fastapi/typer/pull/1012) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump pypa/gh-action-pypi-publish from 1.10.1 to 1.10.3. PR
[#1009](https://redirect.github.com/fastapi/typer/pull/1009) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#1001](https://redirect.github.com/fastapi/typer/pull/1001) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- 👷 Update Deploy docs CI to use uv. PR
[#1021](https://redirect.github.com/fastapi/typer/pull/1021) by
[@tiangolo](https://redirect.github.com/tiangolo).
- 👷 Fix smokeshow, checkout files on CI. PR
[#1020](https://redirect.github.com/fastapi/typer/pull/1020) by
[@tiangolo](https://redirect.github.com/tiangolo).
- 👷 Use uv in CI. PR
[#1019](https://redirect.github.com/fastapi/typer/pull/1019) by
[@tiangolo](https://redirect.github.com/tiangolo).
- 👷 Update `labeler.yml`. PR
[#1014](https://redirect.github.com/fastapi/typer/pull/1014) by
[@tiangolo](https://redirect.github.com/tiangolo).
- 👷 Update worfkow deploy-docs-notify URL. PR
[#1011](https://redirect.github.com/fastapi/typer/pull/1011) by
[@tiangolo](https://redirect.github.com/tiangolo).
- 👷 Upgrade Cloudflare GitHub Action. PR
[#1010](https://redirect.github.com/fastapi/typer/pull/1010) by
[@tiangolo](https://redirect.github.com/tiangolo).
- ⬆ Bump mkdocs-macros-plugin from 1.0.5 to 1.2.0. PR
[#992](https://redirect.github.com/fastapi/typer/pull/992) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump ruff from 0.6.4 to 0.6.5. PR
[#991](https://redirect.github.com/fastapi/typer/pull/991) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump mkdocs-material from 9.5.34 to 9.5.35. PR
[#996](https://redirect.github.com/fastapi/typer/pull/996) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#993](https://redirect.github.com/fastapi/typer/pull/993) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#982](https://redirect.github.com/fastapi/typer/pull/982) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- ⬆ Bump tiangolo/issue-manager from 0.5.0 to 0.5.1. PR
[#980](https://redirect.github.com/fastapi/typer/pull/980) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- 👷 Update `issue-manager.yml`. PR
[#978](https://redirect.github.com/fastapi/typer/pull/978) by
[@tiangolo](https://redirect.github.com/tiangolo).
- ⬆ Bump ruff from 0.6.3 to 0.6.4. PR
[#975](https://redirect.github.com/fastapi/typer/pull/975) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump mkdocs-material from 9.5.33 to 9.5.34. PR
[#963](https://redirect.github.com/fastapi/typer/pull/963) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ Bump pypa/gh-action-pypi-publish from 1.9.0 to 1.10.1. PR
[#973](https://redirect.github.com/fastapi/typer/pull/973) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#966](https://redirect.github.com/fastapi/typer/pull/966) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- 💚 Set `include-hidden-files` to `True` when using the
`upload-artifact` GH action. PR
[#967](https://redirect.github.com/fastapi/typer/pull/967) by
[@svlandeg](https://redirect.github.com/svlandeg).
- ⬆ Bump ruff from 0.6.1 to 0.6.3. PR
[#961](https://redirect.github.com/fastapi/typer/pull/961) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. PR
[#689](https://redirect.github.com/fastapi/typer/pull/689) by
[@pre-commit-ci\[bot\]](https://redirect.github.com/apps/pre-commit-ci).
- ⬆ Bump ruff from 0.2.0 to 0.6.1. PR
[#938](https://redirect.github.com/fastapi/typer/pull/938) by
[@dependabot\[bot\]](https://redirect.github.com/apps/dependabot).
- 👷 Update `latest-changes` GitHub Action. PR
[#955](https://redirect.github.com/fastapi/typer/pull/955) by
[@tiangolo](https://redirect.github.com/tiangolo).
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/openapi-generators/openapi-python-client).
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Dylan Anthony
---
openapi_python_client/cli.py | 4 ++--
pdm.lock | 20 ++++++++++----------
pyproject.toml | 2 +-
3 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/openapi_python_client/cli.py b/openapi_python_client/cli.py
index 20c8c9d0a..92d91f943 100644
--- a/openapi_python_client/cli.py
+++ b/openapi_python_client/cli.py
@@ -10,7 +10,7 @@
from openapi_python_client.config import Config, ConfigFile
from openapi_python_client.parser.errors import ErrorLevel, GeneratorError, ParseError
-app = typer.Typer()
+app = typer.Typer(name="openapi-python-client")
def _version_callback(value: bool) -> None:
@@ -63,7 +63,7 @@ def _process_config(
# noinspection PyUnusedLocal
-@app.callback(name="openapi-python-client")
+@app.callback()
def cli(
version: bool = typer.Option(False, "--version", callback=_version_callback, help="Print the version and exit"),
) -> None:
diff --git a/pdm.lock b/pdm.lock
index d03ea5918..6300e615b 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -5,7 +5,7 @@
groups = ["default", "dev"]
strategy = ["inherit_metadata"]
lock_version = "4.5.0"
-content_hash = "sha256:50f45ddc1fe2529d12869f3f378bf09b25166e6c66cdf84f1c32db1cbe43ff8c"
+content_hash = "sha256:5c2c6084144a3d3852afea2855c6c32e7e93adcac2d3406b1371654490489cfd"
[[metadata.targets]]
requires_python = "~=3.9"
@@ -68,7 +68,7 @@ files = [
[[package]]
name = "click"
-version = "8.1.7"
+version = "8.1.8"
requires_python = ">=3.7"
summary = "Composable command line interface toolkit"
groups = ["default"]
@@ -77,8 +77,8 @@ dependencies = [
"importlib-metadata; python_version < \"3.8\"",
]
files = [
- {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
- {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
+ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
+ {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
]
[[package]]
@@ -715,7 +715,7 @@ files = [
[[package]]
name = "rich"
-version = "13.9.2"
+version = "13.9.4"
requires_python = ">=3.8.0"
summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
groups = ["default"]
@@ -725,8 +725,8 @@ dependencies = [
"typing-extensions<5.0,>=4.0.0; python_version < \"3.11\"",
]
files = [
- {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"},
- {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"},
+ {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"},
+ {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"},
]
[[package]]
@@ -896,7 +896,7 @@ files = [
[[package]]
name = "typer"
-version = "0.12.5"
+version = "0.15.1"
requires_python = ">=3.7"
summary = "Typer, build great CLIs. Easy to code. Based on Python type hints."
groups = ["default"]
@@ -907,8 +907,8 @@ dependencies = [
"typing-extensions>=3.7.4.3",
]
files = [
- {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"},
- {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"},
+ {file = "typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847"},
+ {file = "typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a"},
]
[[package]]
diff --git a/pyproject.toml b/pyproject.toml
index 0743b347f..7a7e5ade0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -6,7 +6,7 @@ license = { text = "MIT" }
requires-python = ">=3.9,<4.0"
dependencies = [
"jinja2>=3.0.0,<4.0.0",
- "typer>0.6,<0.14",
+ "typer>0.6,<0.16",
"colorama>=0.4.3; sys_platform == \"win32\"",
"shellingham>=1.3.2,<2.0.0",
"pydantic>=2.1.1,<3.0.0",
From 46b7523cfcc62a30b236547117b27ddb48e99179 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 24 Dec 2024 22:09:25 +0000
Subject: [PATCH 12/18] feat: Support httpx 0.28 (#1172)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [httpx](https://redirect.github.com/encode/httpx)
([changelog](https://redirect.github.com/encode/httpx/blob/master/CHANGELOG.md))
| `>=0.20.0,<0.28.0` -> `>=0.20.0,<0.29.0` |
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
| [httpx](https://redirect.github.com/encode/httpx)
([changelog](https://redirect.github.com/encode/httpx/blob/master/CHANGELOG.md))
| `>= 0.20.0, < 0.28.0` -> `>=0.20.0, <0.29.0` |
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
---
### Release Notes
encode/httpx (httpx)
###
[`v0.28.1`](https://redirect.github.com/encode/httpx/blob/HEAD/CHANGELOG.md#0281-6th-December-2024)
[Compare
Source](https://redirect.github.com/encode/httpx/compare/0.28.0...0.28.1)
- Fix SSL case where `verify=False` together with client side
certificates.
###
[`v0.28.0`](https://redirect.github.com/encode/httpx/blob/HEAD/CHANGELOG.md#0280-28th-November-2024)
[Compare
Source](https://redirect.github.com/encode/httpx/compare/0.27.2...0.28.0)
The 0.28 release includes a limited set of deprecations.
**Deprecations**:
We are working towards a simplified SSL configuration API.
*For users of the standard `verify=True` or `verify=False` cases, or
`verify=` case this should require no changes. The
following cases have been deprecated...*
- The `verify` argument as a string argument is now deprecated and will
raise warnings.
- The `cert` argument is now deprecated and will raise warnings.
Our revised [SSL documentation](docs/advanced/ssl.md) covers how to
implement the same behaviour with a more constrained API.
**The following changes are also included**:
- The deprecated `proxies` argument has now been removed.
- The deprecated `app` argument has now been removed.
- JSON request bodies use a compact representation.
([#3363](https://redirect.github.com/encode/httpx/issues/3363))
- Review URL percent escape sets, based on WHATWG spec.
([#3371](https://redirect.github.com/encode/httpx/issues/3371),
[#3373](https://redirect.github.com/encode/httpx/issues/3373))
- Ensure `certifi` and `httpcore` are only imported if required.
([#3377](https://redirect.github.com/encode/httpx/issues/3377))
- Treat `socks5h` as a valid proxy scheme.
([#3178](https://redirect.github.com/encode/httpx/issues/3178))
- Cleanup `Request()` method signature in line with `client.request()`
and `httpx.request()`.
([#3378](https://redirect.github.com/encode/httpx/issues/3378))
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/openapi-generators/openapi-python-client).
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Dylan Anthony
---
end_to_end_tests/golden-record/pyproject.toml | 2 +-
.../pyproject.toml | 2 +-
.../metadata_snapshots/pdm.pyproject.toml | 2 +-
.../metadata_snapshots/poetry.pyproject.toml | 2 +-
end_to_end_tests/metadata_snapshots/setup.py | 2 +-
.../test-3-1-golden-record/pyproject.toml | 2 +-
integration-tests/pdm.lock | 21 ++++++-------
integration-tests/pyproject.toml | 2 +-
.../templates/pyproject.toml.jinja | 4 +--
.../templates/setup.py.jinja | 2 +-
pdm.lock | 31 +++++++++----------
pyproject.toml | 2 +-
12 files changed, 36 insertions(+), 38 deletions(-)
diff --git a/end_to_end_tests/golden-record/pyproject.toml b/end_to_end_tests/golden-record/pyproject.toml
index d4d3f8766..072129021 100644
--- a/end_to_end_tests/golden-record/pyproject.toml
+++ b/end_to_end_tests/golden-record/pyproject.toml
@@ -12,7 +12,7 @@ include = ["CHANGELOG.md", "my_test_api_client/py.typed"]
[tool.poetry.dependencies]
python = "^3.9"
-httpx = ">=0.20.0,<0.28.0"
+httpx = ">=0.20.0,<0.29.0"
attrs = ">=21.3.0"
python-dateutil = "^2.8.0"
diff --git a/end_to_end_tests/literal-enums-golden-record/pyproject.toml b/end_to_end_tests/literal-enums-golden-record/pyproject.toml
index 367eff6ab..3a2ce20f6 100644
--- a/end_to_end_tests/literal-enums-golden-record/pyproject.toml
+++ b/end_to_end_tests/literal-enums-golden-record/pyproject.toml
@@ -12,7 +12,7 @@ include = ["CHANGELOG.md", "my_enum_api_client/py.typed"]
[tool.poetry.dependencies]
python = "^3.9"
-httpx = ">=0.20.0,<0.28.0"
+httpx = ">=0.20.0,<0.29.0"
attrs = ">=21.3.0"
python-dateutil = "^2.8.0"
diff --git a/end_to_end_tests/metadata_snapshots/pdm.pyproject.toml b/end_to_end_tests/metadata_snapshots/pdm.pyproject.toml
index c33a4cd48..573cc6ebd 100644
--- a/end_to_end_tests/metadata_snapshots/pdm.pyproject.toml
+++ b/end_to_end_tests/metadata_snapshots/pdm.pyproject.toml
@@ -6,7 +6,7 @@ authors = []
readme = "README.md"
requires-python = ">=3.9,<4.0"
dependencies = [
- "httpx>=0.20.0,<0.28.0",
+ "httpx>=0.20.0,<0.29.0",
"attrs>=21.3.0",
"python-dateutil>=2.8.0",
]
diff --git a/end_to_end_tests/metadata_snapshots/poetry.pyproject.toml b/end_to_end_tests/metadata_snapshots/poetry.pyproject.toml
index 889052b61..a2c1df4e8 100644
--- a/end_to_end_tests/metadata_snapshots/poetry.pyproject.toml
+++ b/end_to_end_tests/metadata_snapshots/poetry.pyproject.toml
@@ -12,7 +12,7 @@ include = ["CHANGELOG.md", "test_3_1_features_client/py.typed"]
[tool.poetry.dependencies]
python = "^3.9"
-httpx = ">=0.20.0,<0.28.0"
+httpx = ">=0.20.0,<0.29.0"
attrs = ">=21.3.0"
python-dateutil = "^2.8.0"
diff --git a/end_to_end_tests/metadata_snapshots/setup.py b/end_to_end_tests/metadata_snapshots/setup.py
index 55642b4cd..a10df7dc1 100644
--- a/end_to_end_tests/metadata_snapshots/setup.py
+++ b/end_to_end_tests/metadata_snapshots/setup.py
@@ -13,6 +13,6 @@
long_description_content_type="text/markdown",
packages=find_packages(),
python_requires=">=3.9, <4",
- install_requires=["httpx >= 0.20.0, < 0.28.0", "attrs >= 21.3.0", "python-dateutil >= 2.8.0, < 3"],
+ install_requires=["httpx >= 0.20.0, < 0.29.0", "attrs >= 21.3.0", "python-dateutil >= 2.8.0, < 3"],
package_data={"test_3_1_features_client": ["py.typed"]},
)
diff --git a/end_to_end_tests/test-3-1-golden-record/pyproject.toml b/end_to_end_tests/test-3-1-golden-record/pyproject.toml
index 889052b61..a2c1df4e8 100644
--- a/end_to_end_tests/test-3-1-golden-record/pyproject.toml
+++ b/end_to_end_tests/test-3-1-golden-record/pyproject.toml
@@ -12,7 +12,7 @@ include = ["CHANGELOG.md", "test_3_1_features_client/py.typed"]
[tool.poetry.dependencies]
python = "^3.9"
-httpx = ">=0.20.0,<0.28.0"
+httpx = ">=0.20.0,<0.29.0"
attrs = ">=21.3.0"
python-dateutil = "^2.8.0"
diff --git a/integration-tests/pdm.lock b/integration-tests/pdm.lock
index 6ace3d70a..6b182a3d5 100644
--- a/integration-tests/pdm.lock
+++ b/integration-tests/pdm.lock
@@ -5,7 +5,7 @@
groups = ["default", "dev"]
strategy = ["inherit_metadata"]
lock_version = "4.5.0"
-content_hash = "sha256:23d53455c7fb390a7c1f417cee321de488e65815e6420ae5968172119fac835d"
+content_hash = "sha256:a8195ab20cd4be2c783402cc1a2fd155d4eb5e8a855e3e1eb2dd171e039d7b3e"
[[metadata.targets]]
requires_python = "~=3.8"
@@ -43,13 +43,13 @@ files = [
[[package]]
name = "certifi"
-version = "2024.8.30"
+version = "2024.12.14"
requires_python = ">=3.6"
summary = "Python package for providing Mozilla's CA Bundle."
groups = ["default"]
files = [
- {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"},
- {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"},
+ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"},
+ {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"},
]
[[package]]
@@ -92,7 +92,7 @@ files = [
[[package]]
name = "httpcore"
-version = "1.0.6"
+version = "1.0.7"
requires_python = ">=3.8"
summary = "A minimal low-level HTTP client."
groups = ["default"]
@@ -101,13 +101,13 @@ dependencies = [
"h11<0.15,>=0.13",
]
files = [
- {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"},
- {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"},
+ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"},
+ {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"},
]
[[package]]
name = "httpx"
-version = "0.27.2"
+version = "0.28.1"
requires_python = ">=3.8"
summary = "The next generation HTTP client."
groups = ["default"]
@@ -116,11 +116,10 @@ dependencies = [
"certifi",
"httpcore==1.*",
"idna",
- "sniffio",
]
files = [
- {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"},
- {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"},
+ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"},
+ {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"},
]
[[package]]
diff --git a/integration-tests/pyproject.toml b/integration-tests/pyproject.toml
index 67b0d7f52..307e9e936 100644
--- a/integration-tests/pyproject.toml
+++ b/integration-tests/pyproject.toml
@@ -5,7 +5,7 @@ description = "A client library for accessing OpenAPI Test Server"
authors = []
readme = "README.md"
dependencies = [
- "httpx>=0.20.0,<0.28.0",
+ "httpx>=0.20.0,<0.29.0",
"attrs>=21.3.0",
"python-dateutil>=2.8.0",
]
diff --git a/openapi_python_client/templates/pyproject.toml.jinja b/openapi_python_client/templates/pyproject.toml.jinja
index e480f6729..ca5c5e139 100644
--- a/openapi_python_client/templates/pyproject.toml.jinja
+++ b/openapi_python_client/templates/pyproject.toml.jinja
@@ -19,7 +19,7 @@ include = ["CHANGELOG.md", "{{ package_name }}/py.typed"]
{% if pdm %}
dependencies = [
- "httpx>=0.20.0,<0.28.0",
+ "httpx>=0.20.0,<0.29.0",
"attrs>=21.3.0",
"python-dateutil>=2.8.0",
]
@@ -31,7 +31,7 @@ distribution = true
[tool.poetry.dependencies]
python = "^3.9"
-httpx = ">=0.20.0,<0.28.0"
+httpx = ">=0.20.0,<0.29.0"
attrs = ">=21.3.0"
python-dateutil = "^2.8.0"
{% endif %}
diff --git a/openapi_python_client/templates/setup.py.jinja b/openapi_python_client/templates/setup.py.jinja
index e577c28b9..b4954654d 100644
--- a/openapi_python_client/templates/setup.py.jinja
+++ b/openapi_python_client/templates/setup.py.jinja
@@ -13,6 +13,6 @@ setup(
long_description_content_type="text/markdown",
packages=find_packages(),
python_requires=">=3.9, <4",
- install_requires=["httpx >= 0.20.0, < 0.28.0", "attrs >= 21.3.0", "python-dateutil >= 2.8.0, < 3"],
+ install_requires=["httpx >= 0.20.0, < 0.29.0", "attrs >= 21.3.0", "python-dateutil >= 2.8.0, < 3"],
package_data={"{{ package_name }}": ["py.typed"]},
)
diff --git a/pdm.lock b/pdm.lock
index 6300e615b..eeaa08acf 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -5,7 +5,7 @@
groups = ["default", "dev"]
strategy = ["inherit_metadata"]
lock_version = "4.5.0"
-content_hash = "sha256:5c2c6084144a3d3852afea2855c6c32e7e93adcac2d3406b1371654490489cfd"
+content_hash = "sha256:e946f3f6822637eec7d5b7779a2bb990055ff957c219ec45a145851c224eef3f"
[[metadata.targets]]
requires_python = "~=3.9"
@@ -26,19 +26,19 @@ files = [
[[package]]
name = "anyio"
-version = "4.5.2"
-requires_python = ">=3.8"
+version = "4.7.0"
+requires_python = ">=3.9"
summary = "High level compatibility layer for multiple asynchronous event loop implementations"
groups = ["default"]
dependencies = [
"exceptiongroup>=1.0.2; python_version < \"3.11\"",
"idna>=2.8",
"sniffio>=1.1",
- "typing-extensions>=4.1; python_version < \"3.11\"",
+ "typing-extensions>=4.5; python_version < \"3.13\"",
]
files = [
- {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"},
- {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"},
+ {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"},
+ {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"},
]
[[package]]
@@ -57,13 +57,13 @@ files = [
[[package]]
name = "certifi"
-version = "2024.8.30"
+version = "2024.12.14"
requires_python = ">=3.6"
summary = "Python package for providing Mozilla's CA Bundle."
groups = ["default"]
files = [
- {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"},
- {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"},
+ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"},
+ {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"},
]
[[package]]
@@ -288,7 +288,7 @@ files = [
[[package]]
name = "httpcore"
-version = "1.0.6"
+version = "1.0.7"
requires_python = ">=3.8"
summary = "A minimal low-level HTTP client."
groups = ["default"]
@@ -297,13 +297,13 @@ dependencies = [
"h11<0.15,>=0.13",
]
files = [
- {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"},
- {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"},
+ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"},
+ {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"},
]
[[package]]
name = "httpx"
-version = "0.27.2"
+version = "0.28.1"
requires_python = ">=3.8"
summary = "The next generation HTTP client."
groups = ["default"]
@@ -312,11 +312,10 @@ dependencies = [
"certifi",
"httpcore==1.*",
"idna",
- "sniffio",
]
files = [
- {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"},
- {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"},
+ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"},
+ {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"},
]
[[package]]
diff --git a/pyproject.toml b/pyproject.toml
index 7a7e5ade0..a311d020d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -12,7 +12,7 @@ dependencies = [
"pydantic>=2.1.1,<3.0.0",
"attrs>=21.3.0",
"python-dateutil>=2.8.1,<3.0.0",
- "httpx>=0.20.0,<0.28.0",
+ "httpx>=0.20.0,<0.29.0",
"ruamel.yaml>=0.18.6,<0.19.0",
"ruff>=0.2,<0.9",
"typing-extensions>=4.8.0,<5.0.0",
From 36164194d78bc288db0e136c936325f5b445bdba Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 24 Dec 2024 15:18:05 -0700
Subject: [PATCH 13/18] chore(deps): lock file maintenance (#1152)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |
🔧 This Pull Request updates lock files to use the latest dependency
versions.
---
### Configuration
📅 **Schedule**: Branch creation - "before 4am on monday" (UTC),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Enabled.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.
👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/openapi-generators/openapi-python-client).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
integration-tests/pdm.lock | 133 ++++----
pdm.lock | 630 +++++++++++++++++++------------------
2 files changed, 406 insertions(+), 357 deletions(-)
diff --git a/integration-tests/pdm.lock b/integration-tests/pdm.lock
index 6b182a3d5..f1501375a 100644
--- a/integration-tests/pdm.lock
+++ b/integration-tests/pdm.lock
@@ -29,16 +29,13 @@ files = [
[[package]]
name = "attrs"
-version = "24.2.0"
-requires_python = ">=3.7"
+version = "24.3.0"
+requires_python = ">=3.8"
summary = "Classes Without Boilerplate"
groups = ["default"]
-dependencies = [
- "importlib-metadata; python_version < \"3.8\"",
-]
files = [
- {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"},
- {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"},
+ {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"},
+ {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"},
]
[[package]]
@@ -146,7 +143,7 @@ files = [
[[package]]
name = "mypy"
-version = "1.12.1"
+version = "1.14.0"
requires_python = ">=3.8"
summary = "Optional static typing for Python"
groups = ["dev"]
@@ -156,38 +153,38 @@ dependencies = [
"typing-extensions>=4.6.0",
]
files = [
- {file = "mypy-1.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3d7d4371829184e22fda4015278fbfdef0327a4b955a483012bd2d423a788801"},
- {file = "mypy-1.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f59f1dfbf497d473201356966e353ef09d4daec48caeacc0254db8ef633a28a5"},
- {file = "mypy-1.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b947097fae68004b8328c55161ac9db7d3566abfef72d9d41b47a021c2fba6b1"},
- {file = "mypy-1.12.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96af62050971c5241afb4701c15189ea9507db89ad07794a4ee7b4e092dc0627"},
- {file = "mypy-1.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:d90da248f4c2dba6c44ddcfea94bb361e491962f05f41990ff24dbd09969ce20"},
- {file = "mypy-1.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1230048fec1380faf240be6385e709c8570604d2d27ec6ca7e573e3bc09c3735"},
- {file = "mypy-1.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:02dcfe270c6ea13338210908f8cadc8d31af0f04cee8ca996438fe6a97b4ec66"},
- {file = "mypy-1.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5a437c9102a6a252d9e3a63edc191a3aed5f2fcb786d614722ee3f4472e33f6"},
- {file = "mypy-1.12.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:186e0c8346efc027ee1f9acf5ca734425fc4f7dc2b60144f0fbe27cc19dc7931"},
- {file = "mypy-1.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:673ba1140a478b50e6d265c03391702fa11a5c5aff3f54d69a62a48da32cb811"},
- {file = "mypy-1.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9fb83a7be97c498176fb7486cafbb81decccaef1ac339d837c377b0ce3743a7f"},
- {file = "mypy-1.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:389e307e333879c571029d5b93932cf838b811d3f5395ed1ad05086b52148fb0"},
- {file = "mypy-1.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94b2048a95a21f7a9ebc9fbd075a4fcd310410d078aa0228dbbad7f71335e042"},
- {file = "mypy-1.12.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ee5932370ccf7ebf83f79d1c157a5929d7ea36313027b0d70a488493dc1b179"},
- {file = "mypy-1.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:19bf51f87a295e7ab2894f1d8167622b063492d754e69c3c2fed6563268cb42a"},
- {file = "mypy-1.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d34167d43613ffb1d6c6cdc0cc043bb106cac0aa5d6a4171f77ab92a3c758bcc"},
- {file = "mypy-1.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:427878aa54f2e2c5d8db31fa9010c599ed9f994b3b49e64ae9cd9990c40bd635"},
- {file = "mypy-1.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5fcde63ea2c9f69d6be859a1e6dd35955e87fa81de95bc240143cf00de1f7f81"},
- {file = "mypy-1.12.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d54d840f6c052929f4a3d2aab2066af0f45a020b085fe0e40d4583db52aab4e4"},
- {file = "mypy-1.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:20db6eb1ca3d1de8ece00033b12f793f1ea9da767334b7e8c626a4872090cf02"},
- {file = "mypy-1.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b16fe09f9c741d85a2e3b14a5257a27a4f4886c171d562bc5a5e90d8591906b8"},
- {file = "mypy-1.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0dcc1e843d58f444fce19da4cce5bd35c282d4bde232acdeca8279523087088a"},
- {file = "mypy-1.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e10ba7de5c616e44ad21005fa13450cd0de7caaa303a626147d45307492e4f2d"},
- {file = "mypy-1.12.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e6fe449223fa59fbee351db32283838a8fee8059e0028e9e6494a03802b4004"},
- {file = "mypy-1.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:dc6e2a2195a290a7fd5bac3e60b586d77fc88e986eba7feced8b778c373f9afe"},
- {file = "mypy-1.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:de5b2a8988b4e1269a98beaf0e7cc71b510d050dce80c343b53b4955fff45f19"},
- {file = "mypy-1.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:843826966f1d65925e8b50d2b483065c51fc16dc5d72647e0236aae51dc8d77e"},
- {file = "mypy-1.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fe20f89da41a95e14c34b1ddb09c80262edcc295ad891f22cc4b60013e8f78d"},
- {file = "mypy-1.12.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8135ffec02121a75f75dc97c81af7c14aa4ae0dda277132cfcd6abcd21551bfd"},
- {file = "mypy-1.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:a7b76fa83260824300cc4834a3ab93180db19876bce59af921467fd03e692810"},
- {file = "mypy-1.12.1-py3-none-any.whl", hash = "sha256:ce561a09e3bb9863ab77edf29ae3a50e65685ad74bba1431278185b7e5d5486e"},
- {file = "mypy-1.12.1.tar.gz", hash = "sha256:f5b3936f7a6d0e8280c9bdef94c7ce4847f5cdfc258fbb2c29a8c1711e8bb96d"},
+ {file = "mypy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e971c1c667007f9f2b397ffa80fa8e1e0adccff336e5e77e74cb5f22868bee87"},
+ {file = "mypy-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e86aaeaa3221a278c66d3d673b297232947d873773d61ca3ee0e28b2ff027179"},
+ {file = "mypy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1628c5c3ce823d296e41e2984ff88c5861499041cb416a8809615d0c1f41740e"},
+ {file = "mypy-1.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7fadb29b77fc14a0dd81304ed73c828c3e5cde0016c7e668a86a3e0dfc9f3af3"},
+ {file = "mypy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:3fa76988dc760da377c1e5069200a50d9eaaccf34f4ea18428a3337034ab5a44"},
+ {file = "mypy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6e73c8a154eed31db3445fe28f63ad2d97b674b911c00191416cf7f6459fd49a"},
+ {file = "mypy-1.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:273e70fcb2e38c5405a188425aa60b984ffdcef65d6c746ea5813024b68c73dc"},
+ {file = "mypy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1daca283d732943731a6a9f20fdbcaa927f160bc51602b1d4ef880a6fb252015"},
+ {file = "mypy-1.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7e68047bedb04c1c25bba9901ea46ff60d5eaac2d71b1f2161f33107e2b368eb"},
+ {file = "mypy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:7a52f26b9c9b1664a60d87675f3bae00b5c7f2806e0c2800545a32c325920bcc"},
+ {file = "mypy-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d5326ab70a6db8e856d59ad4cb72741124950cbbf32e7b70e30166ba7bbf61dd"},
+ {file = "mypy-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bf4ec4980bec1e0e24e5075f449d014011527ae0055884c7e3abc6a99cd2c7f1"},
+ {file = "mypy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:390dfb898239c25289495500f12fa73aa7f24a4c6d90ccdc165762462b998d63"},
+ {file = "mypy-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e026d55ddcd76e29e87865c08cbe2d0104e2b3153a523c529de584759379d3d"},
+ {file = "mypy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:585ed36031d0b3ee362e5107ef449a8b5dfd4e9c90ccbe36414ee405ee6b32ba"},
+ {file = "mypy-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9f6f4c0b27401d14c483c622bc5105eff3911634d576bbdf6695b9a7c1ba741"},
+ {file = "mypy-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b2280cedcb312c7a79f5001ae5325582d0d339bce684e4a529069d0e7ca1e7"},
+ {file = "mypy-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:342de51c48bab326bfc77ce056ba08c076d82ce4f5a86621f972ed39970f94d8"},
+ {file = "mypy-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00df23b42e533e02a6f0055e54de9a6ed491cd8b7ea738647364fd3a39ea7efc"},
+ {file = "mypy-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:e8c8387e5d9dff80e7daf961df357c80e694e942d9755f3ad77d69b0957b8e3f"},
+ {file = "mypy-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b16738b1d80ec4334654e89e798eb705ac0c36c8a5c4798496cd3623aa02286"},
+ {file = "mypy-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10065fcebb7c66df04b05fc799a854b1ae24d9963c8bb27e9064a9bdb43aa8ad"},
+ {file = "mypy-1.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fbb7d683fa6bdecaa106e8368aa973ecc0ddb79a9eaeb4b821591ecd07e9e03c"},
+ {file = "mypy-1.14.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3498cb55448dc5533e438cd13d6ddd28654559c8c4d1fd4b5ca57a31b81bac01"},
+ {file = "mypy-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:c7b243408ea43755f3a21a0a08e5c5ae30eddb4c58a80f415ca6b118816e60aa"},
+ {file = "mypy-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14117b9da3305b39860d0aa34b8f1ff74d209a368829a584eb77524389a9c13e"},
+ {file = "mypy-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af98c5a958f9c37404bd4eef2f920b94874507e146ed6ee559f185b8809c44cc"},
+ {file = "mypy-1.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b343a1d3989547024377c2ba0dca9c74a2428ad6ed24283c213af8dbb0710b"},
+ {file = "mypy-1.14.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cdb5563c1726c85fb201be383168f8c866032db95e1095600806625b3a648cb7"},
+ {file = "mypy-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:74e925649c1ee0a79aa7448baf2668d81cc287dc5782cff6a04ee93f40fb8d3f"},
+ {file = "mypy-1.14.0-py3-none-any.whl", hash = "sha256:2238d7f93fc4027ed1efc944507683df3ba406445a2b6c96e79666a045aadfab"},
+ {file = "mypy-1.14.0.tar.gz", hash = "sha256:822dbd184d4a9804df5a7d5335a68cf7662930e70b8c1bc976645d1509f9a9d6"},
]
[[package]]
@@ -203,13 +200,13 @@ files = [
[[package]]
name = "packaging"
-version = "24.1"
+version = "24.2"
requires_python = ">=3.8"
summary = "Core utilities for Python packages"
groups = ["dev"]
files = [
- {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"},
- {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"},
+ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
+ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
]
[[package]]
@@ -225,7 +222,7 @@ files = [
[[package]]
name = "pytest"
-version = "8.3.3"
+version = "8.3.4"
requires_python = ">=3.8"
summary = "pytest: simple powerful testing with Python"
groups = ["dev"]
@@ -238,8 +235,8 @@ dependencies = [
"tomli>=1; python_version < \"3.11\"",
]
files = [
- {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"},
- {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"},
+ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"},
+ {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"},
]
[[package]]
@@ -272,13 +269,13 @@ files = [
[[package]]
name = "six"
-version = "1.16.0"
-requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+version = "1.17.0"
+requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
summary = "Python 2 and 3 compatibility utilities"
groups = ["default"]
files = [
- {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
- {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
+ {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
]
[[package]]
@@ -294,14 +291,44 @@ files = [
[[package]]
name = "tomli"
-version = "2.0.2"
+version = "2.2.1"
requires_python = ">=3.8"
summary = "A lil' TOML parser"
groups = ["dev"]
marker = "python_version < \"3.11\""
files = [
- {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"},
- {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"},
+ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
+ {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"},
+ {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"},
+ {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"},
+ {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"},
+ {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"},
+ {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"},
+ {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"},
+ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
+ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
]
[[package]]
diff --git a/pdm.lock b/pdm.lock
index eeaa08acf..2fec84c1e 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -43,16 +43,13 @@ files = [
[[package]]
name = "attrs"
-version = "24.2.0"
-requires_python = ">=3.7"
+version = "24.3.0"
+requires_python = ">=3.8"
summary = "Classes Without Boilerplate"
groups = ["default"]
-dependencies = [
- "importlib-metadata; python_version < \"3.8\"",
-]
files = [
- {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"},
- {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"},
+ {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"},
+ {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"},
]
[[package]]
@@ -95,169 +92,149 @@ files = [
[[package]]
name = "coverage"
-version = "7.6.1"
-requires_python = ">=3.8"
+version = "7.6.9"
+requires_python = ">=3.9"
summary = "Code coverage measurement for Python"
groups = ["dev"]
files = [
- {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"},
- {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"},
- {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"},
- {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"},
- {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"},
- {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"},
- {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"},
- {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"},
- {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"},
- {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"},
- {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"},
- {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"},
- {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"},
- {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"},
- {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"},
- {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"},
- {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"},
- {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"},
- {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"},
- {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"},
- {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"},
- {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"},
- {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"},
- {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"},
- {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"},
- {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"},
- {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"},
- {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"},
- {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"},
- {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"},
- {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"},
- {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"},
- {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"},
- {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"},
- {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"},
- {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"},
- {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"},
- {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"},
- {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"},
- {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"},
- {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"},
- {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"},
- {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"},
- {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"},
- {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"},
- {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"},
- {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"},
- {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"},
- {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"},
- {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"},
- {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"},
- {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"},
- {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"},
- {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"},
- {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"},
- {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"},
- {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"},
- {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"},
- {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"},
- {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"},
- {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"},
- {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"},
- {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"},
- {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"},
- {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"},
- {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"},
- {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"},
- {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"},
- {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"},
- {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"},
- {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"},
- {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"},
+ {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"},
+ {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"},
+ {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"},
+ {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"},
+ {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"},
+ {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"},
+ {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"},
+ {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"},
+ {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"},
+ {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"},
+ {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"},
+ {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"},
+ {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"},
+ {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"},
+ {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"},
+ {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"},
+ {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"},
+ {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"},
+ {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"},
+ {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"},
+ {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"},
+ {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"},
+ {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"},
+ {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"},
+ {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"},
+ {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"},
+ {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"},
+ {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"},
+ {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"},
+ {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"},
+ {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"},
+ {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"},
+ {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"},
+ {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"},
+ {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"},
+ {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"},
+ {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"},
+ {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"},
+ {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"},
+ {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"},
+ {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"},
+ {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"},
+ {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"},
+ {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"},
+ {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"},
+ {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"},
+ {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"},
+ {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"},
+ {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"},
+ {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"},
+ {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"},
+ {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"},
+ {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"},
+ {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"},
+ {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"},
+ {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"},
+ {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"},
+ {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"},
+ {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"},
+ {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"},
+ {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"},
+ {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"},
]
[[package]]
name = "coverage"
-version = "7.6.1"
+version = "7.6.9"
extras = ["toml"]
-requires_python = ">=3.8"
+requires_python = ">=3.9"
summary = "Code coverage measurement for Python"
groups = ["dev"]
dependencies = [
- "coverage==7.6.1",
+ "coverage==7.6.9",
"tomli; python_full_version <= \"3.11.0a6\"",
]
files = [
- {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"},
- {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"},
- {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"},
- {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"},
- {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"},
- {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"},
- {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"},
- {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"},
- {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"},
- {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"},
- {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"},
- {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"},
- {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"},
- {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"},
- {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"},
- {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"},
- {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"},
- {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"},
- {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"},
- {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"},
- {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"},
- {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"},
- {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"},
- {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"},
- {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"},
- {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"},
- {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"},
- {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"},
- {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"},
- {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"},
- {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"},
- {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"},
- {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"},
- {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"},
- {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"},
- {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"},
- {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"},
- {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"},
- {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"},
- {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"},
- {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"},
- {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"},
- {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"},
- {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"},
- {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"},
- {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"},
- {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"},
- {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"},
- {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"},
- {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"},
- {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"},
- {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"},
- {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"},
- {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"},
- {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"},
- {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"},
- {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"},
- {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"},
- {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"},
- {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"},
- {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"},
- {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"},
- {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"},
- {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"},
- {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"},
- {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"},
- {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"},
- {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"},
- {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"},
- {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"},
- {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"},
- {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"},
+ {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"},
+ {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"},
+ {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"},
+ {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"},
+ {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"},
+ {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"},
+ {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"},
+ {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"},
+ {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"},
+ {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"},
+ {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"},
+ {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"},
+ {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"},
+ {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"},
+ {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"},
+ {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"},
+ {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"},
+ {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"},
+ {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"},
+ {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"},
+ {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"},
+ {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"},
+ {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"},
+ {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"},
+ {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"},
+ {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"},
+ {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"},
+ {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"},
+ {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"},
+ {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"},
+ {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"},
+ {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"},
+ {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"},
+ {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"},
+ {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"},
+ {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"},
+ {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"},
+ {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"},
+ {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"},
+ {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"},
+ {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"},
+ {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"},
+ {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"},
+ {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"},
+ {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"},
+ {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"},
+ {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"},
+ {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"},
+ {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"},
+ {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"},
+ {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"},
+ {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"},
+ {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"},
+ {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"},
+ {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"},
+ {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"},
+ {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"},
+ {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"},
+ {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"},
+ {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"},
+ {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"},
+ {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"},
]
[[package]]
@@ -342,7 +319,7 @@ files = [
[[package]]
name = "jinja2"
-version = "3.1.4"
+version = "3.1.5"
requires_python = ">=3.7"
summary = "A very fast and expressive template engine."
groups = ["default"]
@@ -350,8 +327,8 @@ dependencies = [
"MarkupSafe>=2.0",
]
files = [
- {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
- {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
+ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"},
+ {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"},
]
[[package]]
@@ -370,62 +347,72 @@ files = [
[[package]]
name = "markupsafe"
-version = "2.1.5"
-requires_python = ">=3.7"
+version = "3.0.2"
+requires_python = ">=3.9"
summary = "Safely add untrusted strings to HTML/XML markup."
groups = ["default"]
files = [
- {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"},
- {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"},
+ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
]
[[package]]
@@ -493,13 +480,13 @@ files = [
[[package]]
name = "packaging"
-version = "24.1"
+version = "24.2"
requires_python = ">=3.8"
summary = "Core utilities for Python packages"
groups = ["dev"]
files = [
- {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"},
- {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"},
+ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
+ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
]
[[package]]
@@ -641,7 +628,7 @@ files = [
[[package]]
name = "pytest"
-version = "8.3.3"
+version = "8.3.4"
requires_python = ">=3.8"
summary = "pytest: simple powerful testing with Python"
groups = ["dev"]
@@ -654,23 +641,23 @@ dependencies = [
"tomli>=1; python_version < \"3.11\"",
]
files = [
- {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"},
- {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"},
+ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"},
+ {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"},
]
[[package]]
name = "pytest-cov"
-version = "5.0.0"
-requires_python = ">=3.8"
+version = "6.0.0"
+requires_python = ">=3.9"
summary = "Pytest plugin for measuring coverage."
groups = ["dev"]
dependencies = [
- "coverage[toml]>=5.2.1",
+ "coverage[toml]>=7.5",
"pytest>=4.6",
]
files = [
- {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"},
- {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"},
+ {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"},
+ {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"},
]
[[package]]
@@ -703,13 +690,13 @@ files = [
[[package]]
name = "python-multipart"
-version = "0.0.12"
+version = "0.0.20"
requires_python = ">=3.8"
summary = "A streaming multipart parser for Python"
groups = ["dev"]
files = [
- {file = "python_multipart-0.0.12-py3-none-any.whl", hash = "sha256:43dcf96cf65888a9cd3423544dd0d75ac10f7aa0c3c28a175bbcd00c9ce1aebf"},
- {file = "python_multipart-0.0.12.tar.gz", hash = "sha256:045e1f98d719c1ce085ed7f7e1ef9d8ccc8c02ba02b5566d5f7521410ced58cb"},
+ {file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"},
+ {file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"},
]
[[package]]
@@ -744,53 +731,58 @@ files = [
[[package]]
name = "ruamel-yaml-clib"
-version = "0.2.8"
-requires_python = ">=3.6"
+version = "0.2.12"
+requires_python = ">=3.9"
summary = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml"
groups = ["default", "dev"]
marker = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""
files = [
- {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"},
- {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"},
- {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"},
- {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"},
- {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"},
- {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"},
- {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"},
- {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"},
- {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"},
- {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"},
- {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"},
- {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"},
- {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"},
- {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"},
- {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"},
- {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"},
- {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"},
- {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"},
- {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"},
- {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"},
- {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"},
- {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"},
- {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"},
- {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"},
- {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"},
- {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"},
- {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"},
- {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"},
- {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"},
- {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"},
- {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"},
- {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"},
- {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"},
- {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"},
- {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"},
- {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"},
- {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"},
- {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"},
- {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"},
- {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"},
- {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a52d48f4e7bf9005e8f0a89209bf9a73f7190ddf0489eee5eb51377385f59f2a"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da"},
+ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4"},
+ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5"},
+ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6"},
+ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bc5f1e1c28e966d61d2519f2a3d451ba989f9ea0f2307de7bc45baa526de9e45"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a0e060aace4c24dcaf71023bbd7d42674e3b230f7e7b97317baf1e953e5b519"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2c59aa6170b990d8d2719323e628aaf36f3bfbc1c26279c0eeeb24d05d2d11c7"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12"},
+ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b"},
+ {file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"},
]
[[package]]
@@ -809,29 +801,29 @@ files = [
[[package]]
name = "ruff"
-version = "0.8.0"
+version = "0.8.4"
requires_python = ">=3.7"
summary = "An extremely fast Python linter and code formatter, written in Rust."
groups = ["default"]
files = [
- {file = "ruff-0.8.0-py3-none-linux_armv6l.whl", hash = "sha256:fcb1bf2cc6706adae9d79c8d86478677e3bbd4ced796ccad106fd4776d395fea"},
- {file = "ruff-0.8.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:295bb4c02d58ff2ef4378a1870c20af30723013f441c9d1637a008baaf928c8b"},
- {file = "ruff-0.8.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7b1f1c76b47c18fa92ee78b60d2d20d7e866c55ee603e7d19c1e991fad933a9a"},
- {file = "ruff-0.8.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb0d4f250a7711b67ad513fde67e8870109e5ce590a801c3722580fe98c33a99"},
- {file = "ruff-0.8.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e55cce9aa93c5d0d4e3937e47b169035c7e91c8655b0974e61bb79cf398d49c"},
- {file = "ruff-0.8.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f4cd64916d8e732ce6b87f3f5296a8942d285bbbc161acee7fe561134af64f9"},
- {file = "ruff-0.8.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c5c1466be2a2ebdf7c5450dd5d980cc87c8ba6976fb82582fea18823da6fa362"},
- {file = "ruff-0.8.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2dabfd05b96b7b8f2da00d53c514eea842bff83e41e1cceb08ae1966254a51df"},
- {file = "ruff-0.8.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:facebdfe5a5af6b1588a1d26d170635ead6892d0e314477e80256ef4a8470cf3"},
- {file = "ruff-0.8.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87a8e86bae0dbd749c815211ca11e3a7bd559b9710746c559ed63106d382bd9c"},
- {file = "ruff-0.8.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:85e654f0ded7befe2d61eeaf3d3b1e4ef3894469cd664ffa85006c7720f1e4a2"},
- {file = "ruff-0.8.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:83a55679c4cb449fa527b8497cadf54f076603cc36779b2170b24f704171ce70"},
- {file = "ruff-0.8.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:812e2052121634cf13cd6fddf0c1871d0ead1aad40a1a258753c04c18bb71bbd"},
- {file = "ruff-0.8.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:780d5d8523c04202184405e60c98d7595bdb498c3c6abba3b6d4cdf2ca2af426"},
- {file = "ruff-0.8.0-py3-none-win32.whl", hash = "sha256:5fdb6efecc3eb60bba5819679466471fd7d13c53487df7248d6e27146e985468"},
- {file = "ruff-0.8.0-py3-none-win_amd64.whl", hash = "sha256:582891c57b96228d146725975fbb942e1f30a0c4ba19722e692ca3eb25cc9b4f"},
- {file = "ruff-0.8.0-py3-none-win_arm64.whl", hash = "sha256:ba93e6294e9a737cd726b74b09a6972e36bb511f9a102f1d9a7e1ce94dd206a6"},
- {file = "ruff-0.8.0.tar.gz", hash = "sha256:a7ccfe6331bf8c8dad715753e157457faf7351c2b69f62f32c165c2dbcbacd44"},
+ {file = "ruff-0.8.4-py3-none-linux_armv6l.whl", hash = "sha256:58072f0c06080276804c6a4e21a9045a706584a958e644353603d36ca1eb8a60"},
+ {file = "ruff-0.8.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ffb60904651c00a1e0b8df594591770018a0f04587f7deeb3838344fe3adabac"},
+ {file = "ruff-0.8.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ddf5d654ac0d44389f6bf05cee4caeefc3132a64b58ea46738111d687352296"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e248b1f0fa2749edd3350a2a342b67b43a2627434c059a063418e3d375cfe643"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf197b98ed86e417412ee3b6c893f44c8864f816451441483253d5ff22c0e81e"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c41319b85faa3aadd4d30cb1cffdd9ac6b89704ff79f7664b853785b48eccdf3"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9f8402b7c4f96463f135e936d9ab77b65711fcd5d72e5d67597b543bbb43cf3f"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e56b3baa9c23d324ead112a4fdf20db9a3f8f29eeabff1355114dd96014604"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:736272574e97157f7edbbb43b1d046125fce9e7d8d583d5d65d0c9bf2c15addf"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fe710ab6061592521f902fca7ebcb9fabd27bc7c57c764298b1c1f15fff720"},
+ {file = "ruff-0.8.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:13e9ec6d6b55f6da412d59953d65d66e760d583dd3c1c72bf1f26435b5bfdbae"},
+ {file = "ruff-0.8.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:97d9aefef725348ad77d6db98b726cfdb075a40b936c7984088804dfd38268a7"},
+ {file = "ruff-0.8.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ab78e33325a6f5374e04c2ab924a3367d69a0da36f8c9cb6b894a62017506111"},
+ {file = "ruff-0.8.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8ef06f66f4a05c3ddbc9121a8b0cecccd92c5bf3dd43b5472ffe40b8ca10f0f8"},
+ {file = "ruff-0.8.4-py3-none-win32.whl", hash = "sha256:552fb6d861320958ca5e15f28b20a3d071aa83b93caee33a87b471f99a6c0835"},
+ {file = "ruff-0.8.4-py3-none-win_amd64.whl", hash = "sha256:f21a1143776f8656d7f364bd264a9d60f01b7f52243fbe90e7670c0dfe0cf65d"},
+ {file = "ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08"},
+ {file = "ruff-0.8.4.tar.gz", hash = "sha256:0d5f89f254836799af1615798caa5f80b7f935d7a670fad66c5007928e57ace8"},
]
[[package]]
@@ -847,13 +839,13 @@ files = [
[[package]]
name = "six"
-version = "1.16.0"
-requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+version = "1.17.0"
+requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
summary = "Python 2 and 3 compatibility utilities"
groups = ["default"]
files = [
- {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
- {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
+ {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
]
[[package]]
@@ -869,7 +861,7 @@ files = [
[[package]]
name = "syrupy"
-version = "4.7.2"
+version = "4.8.0"
requires_python = ">=3.8.1"
summary = "Pytest Snapshot Test Utility"
groups = ["dev"]
@@ -877,20 +869,50 @@ dependencies = [
"pytest<9.0.0,>=7.0.0",
]
files = [
- {file = "syrupy-4.7.2-py3-none-any.whl", hash = "sha256:eae7ba6be5aed190237caa93be288e97ca1eec5ca58760e4818972a10c4acc64"},
- {file = "syrupy-4.7.2.tar.gz", hash = "sha256:ea45e099f242de1bb53018c238f408a5bb6c82007bc687aefcbeaa0e1c2e935a"},
+ {file = "syrupy-4.8.0-py3-none-any.whl", hash = "sha256:544f4ec6306f4b1c460fdab48fd60b2c7fe54a6c0a8243aeea15f9ad9c638c3f"},
+ {file = "syrupy-4.8.0.tar.gz", hash = "sha256:648f0e9303aaa8387c8365d7314784c09a6bab0a407455c6a01d6a4f5c6a8ede"},
]
[[package]]
name = "tomli"
-version = "2.0.2"
+version = "2.2.1"
requires_python = ">=3.8"
summary = "A lil' TOML parser"
groups = ["dev"]
marker = "python_version < \"3.11\""
files = [
- {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"},
- {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"},
+ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
+ {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"},
+ {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"},
+ {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"},
+ {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"},
+ {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"},
+ {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"},
+ {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"},
+ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
+ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
]
[[package]]
@@ -922,24 +944,24 @@ files = [
[[package]]
name = "types-python-dateutil"
-version = "2.9.0.20241003"
+version = "2.9.0.20241206"
requires_python = ">=3.8"
summary = "Typing stubs for python-dateutil"
groups = ["dev"]
files = [
- {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"},
- {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"},
+ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"},
+ {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"},
]
[[package]]
name = "types-pyyaml"
-version = "6.0.12.20240917"
+version = "6.0.12.20241221"
requires_python = ">=3.8"
summary = "Typing stubs for PyYAML"
groups = ["dev"]
files = [
- {file = "types-PyYAML-6.0.12.20240917.tar.gz", hash = "sha256:d1405a86f9576682234ef83bcb4e6fff7c9305c8b1fbad5e0bcd4f7dbdc9c587"},
- {file = "types_PyYAML-6.0.12.20240917-py3-none-any.whl", hash = "sha256:392b267f1c0fe6022952462bf5d6523f31e37f6cea49b14cee7ad634b6301570"},
+ {file = "types_PyYAML-6.0.12.20241221-py3-none-any.whl", hash = "sha256:0657a4ff8411a030a2116a196e8e008ea679696b5b1a8e1a6aa8ebb737b34688"},
+ {file = "types_pyyaml-6.0.12.20241221.tar.gz", hash = "sha256:4f149aa893ff6a46889a30af4c794b23833014c469cc57cbc3ad77498a58996f"},
]
[[package]]
From ee27f3197e5de360e4781af630d832aeac4757d3 Mon Sep 17 00:00:00 2001
From: Dylan Anthony <43723790+dbanty@users.noreply.github.com>
Date: Tue, 24 Dec 2024 15:57:10 -0700
Subject: [PATCH 14/18] Don't fully delete output directories (#1183)
Closes #1105
Co-authored-by: Dylan Anthony
---
.changeset/delete_fewer_files_with_overwrite.md | 13 +++++++++++++
end_to_end_tests/test_end_to_end.py | 6 +++---
integration-tests/.gitignore | 2 +-
integration-tests/integration_tests/py.typed | 1 +
integration-tests/pyproject.toml | 2 +-
openapi_python_client/__init__.py | 10 +++++-----
pyproject.toml | 2 +-
7 files changed, 25 insertions(+), 11 deletions(-)
create mode 100644 .changeset/delete_fewer_files_with_overwrite.md
create mode 100644 integration-tests/integration_tests/py.typed
diff --git a/.changeset/delete_fewer_files_with_overwrite.md b/.changeset/delete_fewer_files_with_overwrite.md
new file mode 100644
index 000000000..c2e273a39
--- /dev/null
+++ b/.changeset/delete_fewer_files_with_overwrite.md
@@ -0,0 +1,13 @@
+---
+default: major
+---
+
+# Delete fewer files with `--overwrite`
+
+`--overwrite` will no longer delete the entire output directory before regenerating. Instead, it will only delete
+specific, known directories within that directory. Right now, that is only the generated `models` and `api` directories.
+
+Other generated files, like `README.md`, will be overwritten. Extra files and directories outside of those listed above
+will be left untouched, so you can any extra modules or files around while still updating `pyproject.toml` automatically.
+
+Closes #1105.
diff --git a/end_to_end_tests/test_end_to_end.py b/end_to_end_tests/test_end_to_end.py
index 2452c3acd..124b801d2 100644
--- a/end_to_end_tests/test_end_to_end.py
+++ b/end_to_end_tests/test_end_to_end.py
@@ -13,7 +13,7 @@
def _compare_directories(
record: Path,
test_subject: Path,
- expected_differences: dict[Path, str],
+ expected_differences: Optional[dict[Path, str]] = None,
expected_missing: Optional[set[str]] = None,
ignore: list[str] = None,
depth=0,
@@ -298,11 +298,11 @@ def test_update_integration_tests():
config_path = source_path / "config.yaml"
_run_command(
"generate",
- extra_args=["--meta=none", "--overwrite", f"--output-path={source_path / 'integration_tests'}"],
+ extra_args=["--overwrite", "--meta=pdm", f"--output-path={temp_dir}"],
url=url,
config_path=config_path
)
- _compare_directories(temp_dir, source_path, expected_differences={})
+ _compare_directories(source_path, temp_dir, ignore=["pyproject.toml"])
import mypy.api
out, err, status = mypy.api.run([str(temp_dir), "--strict"])
diff --git a/integration-tests/.gitignore b/integration-tests/.gitignore
index ed29cb977..79a2c3d73 100644
--- a/integration-tests/.gitignore
+++ b/integration-tests/.gitignore
@@ -20,4 +20,4 @@ dmypy.json
.idea/
/coverage.xml
-/.coverage
\ No newline at end of file
+/.coverage
diff --git a/integration-tests/integration_tests/py.typed b/integration-tests/integration_tests/py.typed
new file mode 100644
index 000000000..1aad32711
--- /dev/null
+++ b/integration-tests/integration_tests/py.typed
@@ -0,0 +1 @@
+# Marker file for PEP 561
\ No newline at end of file
diff --git a/integration-tests/pyproject.toml b/integration-tests/pyproject.toml
index 307e9e936..9eaacea87 100644
--- a/integration-tests/pyproject.toml
+++ b/integration-tests/pyproject.toml
@@ -4,12 +4,12 @@ version = "0.0.1"
description = "A client library for accessing OpenAPI Test Server"
authors = []
readme = "README.md"
+requires-python = ">=3.9,<4.0"
dependencies = [
"httpx>=0.20.0,<0.29.0",
"attrs>=21.3.0",
"python-dateutil>=2.8.0",
]
-requires-python = ">=3.8,<4.0"
[tool.pdm]
distribution = true
diff --git a/openapi_python_client/__init__.py b/openapi_python_client/__init__.py
index 2225d2008..af6944ae4 100644
--- a/openapi_python_client/__init__.py
+++ b/openapi_python_client/__init__.py
@@ -108,13 +108,11 @@ def build(self) -> Sequence[GeneratorError]:
"""Create the project from templates"""
print(f"Generating {self.project_dir}")
- if self.config.overwrite:
- shutil.rmtree(self.project_dir, ignore_errors=True)
-
try:
self.project_dir.mkdir()
except FileExistsError:
- return [GeneratorError(detail="Directory already exists. Delete it or use the --overwrite option.")]
+ if not self.config.overwrite:
+ return [GeneratorError(detail="Directory already exists. Delete it or use the --overwrite option.")]
self._create_package()
self._build_metadata()
self._build_models()
@@ -158,7 +156,7 @@ def _get_errors(self) -> list[GeneratorError]:
def _create_package(self) -> None:
if self.package_dir != self.project_dir:
- self.package_dir.mkdir()
+ self.package_dir.mkdir(exist_ok=True)
# Package __init__.py
package_init = self.package_dir / "__init__.py"
@@ -214,6 +212,7 @@ def _build_setup_py(self) -> None:
def _build_models(self) -> None:
# Generate models
models_dir = self.package_dir / "models"
+ shutil.rmtree(models_dir, ignore_errors=True)
models_dir.mkdir()
models_init = models_dir / "__init__.py"
imports = []
@@ -259,6 +258,7 @@ def _build_api(self) -> None:
# Generate endpoints
api_dir = self.package_dir / "api"
+ shutil.rmtree(api_dir, ignore_errors=True)
api_dir.mkdir()
api_init_path = api_dir / "__init__.py"
api_init_template = self.env.get_template("api_init.py.jinja")
diff --git a/pyproject.toml b/pyproject.toml
index a311d020d..4e7c63010 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -130,7 +130,7 @@ composite = ["test --cov openapi_python_client tests --cov-report=term-missing"]
[tool.pdm.scripts.regen_integration]
shell = """
-openapi-python-client generate --overwrite --url https://raw.githubusercontent.com/openapi-generators/openapi-test-server/main/openapi.json --config integration-tests/config.yaml --meta none --output-path integration-tests/integration_tests \
+openapi-python-client generate --overwrite --url https://raw.githubusercontent.com/openapi-generators/openapi-test-server/main/openapi.json --config integration-tests/config.yaml --meta pdm --output-path integration-tests \
"""
[build-system]
From 7225f0e536697c88f624c678d627484d854c74b1 Mon Sep 17 00:00:00 2001
From: Dylan Anthony <43723790+dbanty@users.noreply.github.com>
Date: Tue, 24 Dec 2024 16:04:47 -0700
Subject: [PATCH 15/18] Fix minimum attrs version (#1184)
Closes #1084
Co-authored-by: Dylan Anthony
---
.changeset/fix_minimum_attrs_version.md | 10 ++++++++++
end_to_end_tests/golden-record/pyproject.toml | 2 +-
.../literal-enums-golden-record/pyproject.toml | 2 +-
end_to_end_tests/metadata_snapshots/pdm.pyproject.toml | 2 +-
.../metadata_snapshots/poetry.pyproject.toml | 2 +-
end_to_end_tests/metadata_snapshots/setup.py | 2 +-
end_to_end_tests/test-3-1-golden-record/pyproject.toml | 2 +-
integration-tests/pyproject.toml | 2 +-
openapi_python_client/templates/pyproject.toml.jinja | 4 ++--
openapi_python_client/templates/setup.py.jinja | 2 +-
pdm.lock | 2 +-
pdm.minimal.lock | 10 +++++-----
pyproject.toml | 2 +-
13 files changed, 27 insertions(+), 17 deletions(-)
create mode 100644 .changeset/fix_minimum_attrs_version.md
diff --git a/.changeset/fix_minimum_attrs_version.md b/.changeset/fix_minimum_attrs_version.md
new file mode 100644
index 000000000..1d8fe623b
--- /dev/null
+++ b/.changeset/fix_minimum_attrs_version.md
@@ -0,0 +1,10 @@
+---
+default: patch
+---
+
+# Fix minimum `attrs` version
+
+The minimum `attrs` dependency version was incorrectly set to 21.3.0. This has been corrected to 22.2.0, the minimum
+supported version since `openapi-python-client` 0.19.1.
+
+Closes #1084, thanks @astralblue!
diff --git a/end_to_end_tests/golden-record/pyproject.toml b/end_to_end_tests/golden-record/pyproject.toml
index 072129021..feca06dbd 100644
--- a/end_to_end_tests/golden-record/pyproject.toml
+++ b/end_to_end_tests/golden-record/pyproject.toml
@@ -13,7 +13,7 @@ include = ["CHANGELOG.md", "my_test_api_client/py.typed"]
[tool.poetry.dependencies]
python = "^3.9"
httpx = ">=0.20.0,<0.29.0"
-attrs = ">=21.3.0"
+attrs = ">=22.2.0"
python-dateutil = "^2.8.0"
[build-system]
diff --git a/end_to_end_tests/literal-enums-golden-record/pyproject.toml b/end_to_end_tests/literal-enums-golden-record/pyproject.toml
index 3a2ce20f6..2c4d6b4e3 100644
--- a/end_to_end_tests/literal-enums-golden-record/pyproject.toml
+++ b/end_to_end_tests/literal-enums-golden-record/pyproject.toml
@@ -13,7 +13,7 @@ include = ["CHANGELOG.md", "my_enum_api_client/py.typed"]
[tool.poetry.dependencies]
python = "^3.9"
httpx = ">=0.20.0,<0.29.0"
-attrs = ">=21.3.0"
+attrs = ">=22.2.0"
python-dateutil = "^2.8.0"
[build-system]
diff --git a/end_to_end_tests/metadata_snapshots/pdm.pyproject.toml b/end_to_end_tests/metadata_snapshots/pdm.pyproject.toml
index 573cc6ebd..c1f8a2a2b 100644
--- a/end_to_end_tests/metadata_snapshots/pdm.pyproject.toml
+++ b/end_to_end_tests/metadata_snapshots/pdm.pyproject.toml
@@ -7,7 +7,7 @@ readme = "README.md"
requires-python = ">=3.9,<4.0"
dependencies = [
"httpx>=0.20.0,<0.29.0",
- "attrs>=21.3.0",
+ "attrs>=22.2.0",
"python-dateutil>=2.8.0",
]
diff --git a/end_to_end_tests/metadata_snapshots/poetry.pyproject.toml b/end_to_end_tests/metadata_snapshots/poetry.pyproject.toml
index a2c1df4e8..2e8cd6c04 100644
--- a/end_to_end_tests/metadata_snapshots/poetry.pyproject.toml
+++ b/end_to_end_tests/metadata_snapshots/poetry.pyproject.toml
@@ -13,7 +13,7 @@ include = ["CHANGELOG.md", "test_3_1_features_client/py.typed"]
[tool.poetry.dependencies]
python = "^3.9"
httpx = ">=0.20.0,<0.29.0"
-attrs = ">=21.3.0"
+attrs = ">=22.2.0"
python-dateutil = "^2.8.0"
[build-system]
diff --git a/end_to_end_tests/metadata_snapshots/setup.py b/end_to_end_tests/metadata_snapshots/setup.py
index a10df7dc1..6c7a58b97 100644
--- a/end_to_end_tests/metadata_snapshots/setup.py
+++ b/end_to_end_tests/metadata_snapshots/setup.py
@@ -13,6 +13,6 @@
long_description_content_type="text/markdown",
packages=find_packages(),
python_requires=">=3.9, <4",
- install_requires=["httpx >= 0.20.0, < 0.29.0", "attrs >= 21.3.0", "python-dateutil >= 2.8.0, < 3"],
+ install_requires=["httpx >= 0.20.0, < 0.29.0", "attrs >= 22.2.0", "python-dateutil >= 2.8.0, < 3"],
package_data={"test_3_1_features_client": ["py.typed"]},
)
diff --git a/end_to_end_tests/test-3-1-golden-record/pyproject.toml b/end_to_end_tests/test-3-1-golden-record/pyproject.toml
index a2c1df4e8..2e8cd6c04 100644
--- a/end_to_end_tests/test-3-1-golden-record/pyproject.toml
+++ b/end_to_end_tests/test-3-1-golden-record/pyproject.toml
@@ -13,7 +13,7 @@ include = ["CHANGELOG.md", "test_3_1_features_client/py.typed"]
[tool.poetry.dependencies]
python = "^3.9"
httpx = ">=0.20.0,<0.29.0"
-attrs = ">=21.3.0"
+attrs = ">=22.2.0"
python-dateutil = "^2.8.0"
[build-system]
diff --git a/integration-tests/pyproject.toml b/integration-tests/pyproject.toml
index 9eaacea87..cbcff74c6 100644
--- a/integration-tests/pyproject.toml
+++ b/integration-tests/pyproject.toml
@@ -7,7 +7,7 @@ readme = "README.md"
requires-python = ">=3.9,<4.0"
dependencies = [
"httpx>=0.20.0,<0.29.0",
- "attrs>=21.3.0",
+ "attrs>=22.2.0",
"python-dateutil>=2.8.0",
]
diff --git a/openapi_python_client/templates/pyproject.toml.jinja b/openapi_python_client/templates/pyproject.toml.jinja
index ca5c5e139..e9344b436 100644
--- a/openapi_python_client/templates/pyproject.toml.jinja
+++ b/openapi_python_client/templates/pyproject.toml.jinja
@@ -20,7 +20,7 @@ include = ["CHANGELOG.md", "{{ package_name }}/py.typed"]
{% if pdm %}
dependencies = [
"httpx>=0.20.0,<0.29.0",
- "attrs>=21.3.0",
+ "attrs>=22.2.0",
"python-dateutil>=2.8.0",
]
@@ -32,7 +32,7 @@ distribution = true
[tool.poetry.dependencies]
python = "^3.9"
httpx = ">=0.20.0,<0.29.0"
-attrs = ">=21.3.0"
+attrs = ">=22.2.0"
python-dateutil = "^2.8.0"
{% endif %}
diff --git a/openapi_python_client/templates/setup.py.jinja b/openapi_python_client/templates/setup.py.jinja
index b4954654d..c7c1a5a94 100644
--- a/openapi_python_client/templates/setup.py.jinja
+++ b/openapi_python_client/templates/setup.py.jinja
@@ -13,6 +13,6 @@ setup(
long_description_content_type="text/markdown",
packages=find_packages(),
python_requires=">=3.9, <4",
- install_requires=["httpx >= 0.20.0, < 0.29.0", "attrs >= 21.3.0", "python-dateutil >= 2.8.0, < 3"],
+ install_requires=["httpx >= 0.20.0, < 0.29.0", "attrs >= 22.2.0", "python-dateutil >= 2.8.0, < 3"],
package_data={"{{ package_name }}": ["py.typed"]},
)
diff --git a/pdm.lock b/pdm.lock
index 2fec84c1e..cdcfded1f 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -5,7 +5,7 @@
groups = ["default", "dev"]
strategy = ["inherit_metadata"]
lock_version = "4.5.0"
-content_hash = "sha256:e946f3f6822637eec7d5b7779a2bb990055ff957c219ec45a145851c224eef3f"
+content_hash = "sha256:7f8035cfb12eec0bca9053eb34cc6b70a1cfbf464921c1abb3ae3c3e63cfeab4"
[[metadata.targets]]
requires_python = "~=3.9"
diff --git a/pdm.minimal.lock b/pdm.minimal.lock
index f8ee42188..8b9ef2698 100644
--- a/pdm.minimal.lock
+++ b/pdm.minimal.lock
@@ -5,7 +5,7 @@
groups = ["default", "dev"]
strategy = ["direct_minimal_versions", "inherit_metadata"]
lock_version = "4.5.0"
-content_hash = "sha256:50f45ddc1fe2529d12869f3f378bf09b25166e6c66cdf84f1c32db1cbe43ff8c"
+content_hash = "sha256:7f8035cfb12eec0bca9053eb34cc6b70a1cfbf464921c1abb3ae3c3e63cfeab4"
[[metadata.targets]]
requires_python = "~=3.9"
@@ -43,13 +43,13 @@ files = [
[[package]]
name = "attrs"
-version = "21.3.0"
-requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "22.2.0"
+requires_python = ">=3.6"
summary = "Classes Without Boilerplate"
groups = ["default"]
files = [
- {file = "attrs-21.3.0-py2.py3-none-any.whl", hash = "sha256:8f7335278dedd26b58c38e006338242cc0977f06d51579b2b8b87b9b33bff66c"},
- {file = "attrs-21.3.0.tar.gz", hash = "sha256:50f3c9b216dc9021042f71b392859a773b904ce1a029077f58f6598272432045"},
+ {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"},
+ {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"},
]
[[package]]
diff --git a/pyproject.toml b/pyproject.toml
index 4e7c63010..a9d5481c2 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -10,7 +10,7 @@ dependencies = [
"colorama>=0.4.3; sys_platform == \"win32\"",
"shellingham>=1.3.2,<2.0.0",
"pydantic>=2.1.1,<3.0.0",
- "attrs>=21.3.0",
+ "attrs>=22.2.0",
"python-dateutil>=2.8.1,<3.0.0",
"httpx>=0.20.0,<0.29.0",
"ruamel.yaml>=0.18.6,<0.19.0",
From 88b3be192bc5c5cc8b84d6cfff1d3350ec29acbe Mon Sep 17 00:00:00 2001
From: Paulo Costa
Date: Tue, 24 Dec 2024 20:31:48 -0300
Subject: [PATCH 16/18] Support multiple tags in each endpoint (#687)
Currently when an endpoint has multiple tags, the first tag is used and
everything else is ignored.
This PR modifies it so endpoints with multiple tags are added to each of
the tags.
Yes, this results in repeated code :sweat_smile:, but works beautifully
and functions can now be found anywhere we expect them to be.
---------
Co-authored-by: Dylan Anthony
Co-authored-by: Dylan Anthony <43723790+dbanty@users.noreply.github.com>
---
.../add_generate_all_tags_config_option.md | 8 ++
README.md | 10 ++
.../__snapshots__/test_end_to_end.ambr | 14 +++
end_to_end_tests/baseline_openapi_3.0.json | 4 +-
end_to_end_tests/baseline_openapi_3.1.yaml | 4 +-
end_to_end_tests/config.yml | 1 +
.../my_test_api_client/api/__init__.py | 5 +
.../my_test_api_client/api/tag2/__init__.py | 11 ++
.../bad-status-code.yaml | 14 +++
.../my_test_api_client/api/tag2/__init__.py | 0
.../api/tag2/get_tag_with_number.py | 77 ++++++++++++
openapi_python_client/config.py | 3 +
openapi_python_client/parser/openapi.py | 32 +++--
tests/test_parser/test_openapi.py | 112 ++----------------
14 files changed, 175 insertions(+), 120 deletions(-)
create mode 100644 .changeset/add_generate_all_tags_config_option.md
create mode 100644 end_to_end_tests/custom-templates-golden-record/my_test_api_client/api/tag2/__init__.py
create mode 100644 end_to_end_tests/documents_with_errors/bad-status-code.yaml
create mode 100644 end_to_end_tests/golden-record/my_test_api_client/api/tag2/__init__.py
create mode 100644 end_to_end_tests/golden-record/my_test_api_client/api/tag2/get_tag_with_number.py
diff --git a/.changeset/add_generate_all_tags_config_option.md b/.changeset/add_generate_all_tags_config_option.md
new file mode 100644
index 000000000..fb74b9fb0
--- /dev/null
+++ b/.changeset/add_generate_all_tags_config_option.md
@@ -0,0 +1,8 @@
+---
+default: minor
+---
+
+# Add `generate_all_tags` config option
+
+You can now, optionally, generate **duplicate** endpoint functions/modules using _every_ tag for an endpoint,
+not just the first one, by setting `generate_all_tags: true` in your configuration file.
diff --git a/README.md b/README.md
index 871f3a296..a184be377 100644
--- a/README.md
+++ b/README.md
@@ -108,6 +108,16 @@ literal_enums: true
This is especially useful if enum values, when transformed to their Python names, end up conflicting due to case sensitivity or special symbols.
+### generate_all_tags
+
+`openapi-python-client` generates module names within the `api` module based on the OpenAPI `tags` of each endpoint.
+By default, only the _first_ tag is generated. If you want to generate **duplicate** endpoint functions using _every_ tag
+listed, you can enable this option:
+
+```yaml
+generate_all_tags: true
+```
+
### project_name_override and package_name_override
Used to change the name of generated client library project/package. If the project name is changed but an override for the package name
diff --git a/end_to_end_tests/__snapshots__/test_end_to_end.ambr b/end_to_end_tests/__snapshots__/test_end_to_end.ambr
index c87445ffb..525f8baf2 100644
--- a/end_to_end_tests/__snapshots__/test_end_to_end.ambr
+++ b/end_to_end_tests/__snapshots__/test_end_to_end.ambr
@@ -1,4 +1,18 @@
# serializer version: 1
+# name: test_documents_with_errors[bad-status-code]
+ '''
+ Generating /test-documents-with-errors
+ Warning(s) encountered while generating. Client was generated, but some pieces may be missing
+
+ WARNING parsing GET / within default.
+
+ Invalid response status code abcdef (not a valid HTTP status code), response will be omitted from generated client
+
+
+ If you believe this was a mistake or this tool is missing a feature you need, please open an issue at https://github.com/openapi-generators/openapi-python-client/issues/new/choose
+
+ '''
+# ---
# name: test_documents_with_errors[circular-body-ref]
'''
Generating /test-documents-with-errors
diff --git a/end_to_end_tests/baseline_openapi_3.0.json b/end_to_end_tests/baseline_openapi_3.0.json
index 22a786a4f..dc2092dfe 100644
--- a/end_to_end_tests/baseline_openapi_3.0.json
+++ b/end_to_end_tests/baseline_openapi_3.0.json
@@ -1149,9 +1149,7 @@
},
"/tag_with_number": {
"get": {
- "tags": [
- "1"
- ],
+ "tags": ["1", "2"],
"responses": {
"200": {
"description": "Success"
diff --git a/end_to_end_tests/baseline_openapi_3.1.yaml b/end_to_end_tests/baseline_openapi_3.1.yaml
index a19e46ce3..42d5b7384 100644
--- a/end_to_end_tests/baseline_openapi_3.1.yaml
+++ b/end_to_end_tests/baseline_openapi_3.1.yaml
@@ -1141,9 +1141,7 @@ info:
},
"/tag_with_number": {
"get": {
- "tags": [
- "1"
- ],
+ "tags": ["1", "2"],
"responses": {
"200": {
"description": "Success"
diff --git a/end_to_end_tests/config.yml b/end_to_end_tests/config.yml
index 64e58439a..a813deddd 100644
--- a/end_to_end_tests/config.yml
+++ b/end_to_end_tests/config.yml
@@ -11,3 +11,4 @@ class_overrides:
field_prefix: attr_
content_type_overrides:
openapi/python/client: application/json
+generate_all_tags: true
diff --git a/end_to_end_tests/custom-templates-golden-record/my_test_api_client/api/__init__.py b/end_to_end_tests/custom-templates-golden-record/my_test_api_client/api/__init__.py
index 69973bee2..d1102fa1a 100644
--- a/end_to_end_tests/custom-templates-golden-record/my_test_api_client/api/__init__.py
+++ b/end_to_end_tests/custom-templates-golden-record/my_test_api_client/api/__init__.py
@@ -11,6 +11,7 @@
from .parameters import ParametersEndpoints
from .responses import ResponsesEndpoints
from .tag1 import Tag1Endpoints
+from .tag2 import Tag2Endpoints
from .tests import TestsEndpoints
from .true_ import True_Endpoints
@@ -48,6 +49,10 @@ def parameters(cls) -> type[ParametersEndpoints]:
def tag1(cls) -> type[Tag1Endpoints]:
return Tag1Endpoints
+ @classmethod
+ def tag2(cls) -> type[Tag2Endpoints]:
+ return Tag2Endpoints
+
@classmethod
def location(cls) -> type[LocationEndpoints]:
return LocationEndpoints
diff --git a/end_to_end_tests/custom-templates-golden-record/my_test_api_client/api/tag2/__init__.py b/end_to_end_tests/custom-templates-golden-record/my_test_api_client/api/tag2/__init__.py
new file mode 100644
index 000000000..65edddf25
--- /dev/null
+++ b/end_to_end_tests/custom-templates-golden-record/my_test_api_client/api/tag2/__init__.py
@@ -0,0 +1,11 @@
+"""Contains methods for accessing the API Endpoints"""
+
+import types
+
+from . import get_tag_with_number
+
+
+class Tag2Endpoints:
+ @classmethod
+ def get_tag_with_number(cls) -> types.ModuleType:
+ return get_tag_with_number
diff --git a/end_to_end_tests/documents_with_errors/bad-status-code.yaml b/end_to_end_tests/documents_with_errors/bad-status-code.yaml
new file mode 100644
index 000000000..17c3ab2cf
--- /dev/null
+++ b/end_to_end_tests/documents_with_errors/bad-status-code.yaml
@@ -0,0 +1,14 @@
+openapi: "3.1.0"
+info:
+ title: "There's something wrong with me"
+ version: "0.1.0"
+paths:
+ "/":
+ get:
+ responses:
+ "abcdef":
+ description: "Successful Response"
+ content:
+ "application/json":
+ schema:
+ const: "Why have a fixed response? I dunno"
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tag2/__init__.py b/end_to_end_tests/golden-record/my_test_api_client/api/tag2/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/tag2/get_tag_with_number.py b/end_to_end_tests/golden-record/my_test_api_client/api/tag2/get_tag_with_number.py
new file mode 100644
index 000000000..62631355f
--- /dev/null
+++ b/end_to_end_tests/golden-record/my_test_api_client/api/tag2/get_tag_with_number.py
@@ -0,0 +1,77 @@
+from http import HTTPStatus
+from typing import Any, Optional, Union
+
+import httpx
+
+from ... import errors
+from ...client import AuthenticatedClient, Client
+from ...types import Response
+
+
+def _get_kwargs() -> dict[str, Any]:
+ _kwargs: dict[str, Any] = {
+ "method": "get",
+ "url": "/tag_with_number",
+ }
+
+ return _kwargs
+
+
+def _parse_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Optional[Any]:
+ if response.status_code == 200:
+ return None
+ if client.raise_on_unexpected_status:
+ raise errors.UnexpectedStatus(response.status_code, response.content)
+ else:
+ return None
+
+
+def _build_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Response[Any]:
+ return Response(
+ status_code=HTTPStatus(response.status_code),
+ content=response.content,
+ headers=response.headers,
+ parsed=_parse_response(client=client, response=response),
+ )
+
+
+def sync_detailed(
+ *,
+ client: Union[AuthenticatedClient, Client],
+) -> Response[Any]:
+ """
+ Raises:
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
+
+ Returns:
+ Response[Any]
+ """
+
+ kwargs = _get_kwargs()
+
+ response = client.get_httpx_client().request(
+ **kwargs,
+ )
+
+ return _build_response(client=client, response=response)
+
+
+async def asyncio_detailed(
+ *,
+ client: Union[AuthenticatedClient, Client],
+) -> Response[Any]:
+ """
+ Raises:
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
+
+ Returns:
+ Response[Any]
+ """
+
+ kwargs = _get_kwargs()
+
+ response = await client.get_async_httpx_client().request(**kwargs)
+
+ return _build_response(client=client, response=response)
diff --git a/openapi_python_client/config.py b/openapi_python_client/config.py
index c7f5d8ad9..9cc002d12 100644
--- a/openapi_python_client/config.py
+++ b/openapi_python_client/config.py
@@ -42,6 +42,7 @@ class ConfigFile(BaseModel):
use_path_prefixes_for_title_model_names: bool = True
post_hooks: Optional[list[str]] = None
field_prefix: str = "field_"
+ generate_all_tags: bool = False
http_timeout: int = 5
literal_enums: bool = False
@@ -70,6 +71,7 @@ class Config:
use_path_prefixes_for_title_model_names: bool
post_hooks: list[str]
field_prefix: str
+ generate_all_tags: bool
http_timeout: int
literal_enums: bool
document_source: Union[Path, str]
@@ -110,6 +112,7 @@ def from_sources(
use_path_prefixes_for_title_model_names=config_file.use_path_prefixes_for_title_model_names,
post_hooks=post_hooks,
field_prefix=config_file.field_prefix,
+ generate_all_tags=config_file.generate_all_tags,
http_timeout=config_file.http_timeout,
literal_enums=config_file.literal_enums,
document_source=document_source,
diff --git a/openapi_python_client/parser/openapi.py b/openapi_python_client/parser/openapi.py
index 43e63c434..117b2ee30 100644
--- a/openapi_python_client/parser/openapi.py
+++ b/openapi_python_client/parser/openapi.py
@@ -63,13 +63,18 @@ def from_data(
operation: Optional[oai.Operation] = getattr(path_data, method)
if operation is None:
continue
- tag = utils.PythonIdentifier(value=(operation.tags or ["default"])[0], prefix="tag")
- collection = endpoints_by_tag.setdefault(tag, EndpointCollection(tag=tag))
+
+ tags = [utils.PythonIdentifier(value=tag, prefix="tag") for tag in operation.tags or ["default"]]
+ if not config.generate_all_tags:
+ tags = tags[:1]
+
+ collections = [endpoints_by_tag.setdefault(tag, EndpointCollection(tag=tag)) for tag in tags]
+
endpoint, schemas, parameters = Endpoint.from_data(
data=operation,
path=path,
method=method,
- tag=tag,
+ tags=tags,
schemas=schemas,
parameters=parameters,
request_bodies=request_bodies,
@@ -87,15 +92,16 @@ def from_data(
if not isinstance(endpoint, ParseError):
endpoint = Endpoint.sort_parameters(endpoint=endpoint)
if isinstance(endpoint, ParseError):
- endpoint.header = (
- f"WARNING parsing {method.upper()} {path} within {tag}. Endpoint will not be generated."
- )
- collection.parse_errors.append(endpoint)
+ endpoint.header = f"WARNING parsing {method.upper()} {path} within {'/'.join(tags)}. Endpoint will not be generated."
+ for collection in collections:
+ collection.parse_errors.append(endpoint)
continue
for error in endpoint.errors:
- error.header = f"WARNING parsing {method.upper()} {path} within {tag}."
- collection.parse_errors.append(error)
- collection.endpoints.append(endpoint)
+ error.header = f"WARNING parsing {method.upper()} {path} within {'/'.join(tags)}."
+ for collection in collections:
+ collection.parse_errors.append(error)
+ for collection in collections:
+ collection.endpoints.append(endpoint)
return endpoints_by_tag, schemas, parameters
@@ -132,7 +138,7 @@ class Endpoint:
description: Optional[str]
name: str
requires_security: bool
- tag: str
+ tags: list[PythonIdentifier]
summary: Optional[str] = ""
relative_imports: set[str] = field(default_factory=set)
query_parameters: list[Property] = field(default_factory=list)
@@ -393,7 +399,7 @@ def from_data(
data: oai.Operation,
path: str,
method: str,
- tag: str,
+ tags: list[PythonIdentifier],
schemas: Schemas,
parameters: Parameters,
request_bodies: dict[str, Union[oai.RequestBody, oai.Reference]],
@@ -413,7 +419,7 @@ def from_data(
description=utils.remove_string_escapes(data.description) if data.description else "",
name=name,
requires_security=bool(data.security),
- tag=tag,
+ tags=tags,
)
result, schemas, parameters = Endpoint.add_parameters(
diff --git a/tests/test_parser/test_openapi.py b/tests/test_parser/test_openapi.py
index 6eeadcd78..57a07070b 100644
--- a/tests/test_parser/test_openapi.py
+++ b/tests/test_parser/test_openapi.py
@@ -67,7 +67,7 @@ def make_endpoint(self):
description=None,
name="name",
requires_security=False,
- tag="tag",
+ tags=["tag"],
relative_imports={"import_3"},
)
@@ -472,7 +472,7 @@ def test_from_data_bad_params(self, mocker, config):
data=data,
path=path,
method=method,
- tag="default",
+ tags=["default"],
schemas=initial_schemas,
parameters=parameters,
config=config,
@@ -507,7 +507,7 @@ def test_from_data_bad_responses(self, mocker, config):
data=data,
path=path,
method=method,
- tag="default",
+ tags=["default"],
schemas=initial_schemas,
parameters=initial_parameters,
config=config,
@@ -547,7 +547,7 @@ def test_from_data_standard(self, mocker, config):
data=data,
path=path,
method=method,
- tag="default",
+ tags=["default"],
schemas=initial_schemas,
parameters=initial_parameters,
config=config,
@@ -562,7 +562,7 @@ def test_from_data_standard(self, mocker, config):
summary="",
name=data.operationId,
requires_security=True,
- tag="default",
+ tags=["default"],
),
data=data,
schemas=initial_schemas,
@@ -598,7 +598,7 @@ def test_from_data_no_operation_id(self, mocker, config):
data=data,
path=path,
method=method,
- tag="default",
+ tags=["default"],
schemas=schemas,
parameters=parameters,
config=config,
@@ -613,7 +613,7 @@ def test_from_data_no_operation_id(self, mocker, config):
summary="",
name="get_path_with_param",
requires_security=True,
- tag="default",
+ tags=["default"],
),
data=data,
schemas=schemas,
@@ -652,7 +652,7 @@ def test_from_data_no_security(self, mocker, config):
data=data,
path=path,
method=method,
- tag="a",
+ tags=["a"],
schemas=schemas,
parameters=parameters,
config=config,
@@ -667,7 +667,7 @@ def test_from_data_no_security(self, mocker, config):
summary="",
name=data.operationId,
requires_security=False,
- tag="a",
+ tags=["a"],
),
data=data,
parameters=parameters,
@@ -695,7 +695,7 @@ def test_from_data_some_bad_bodies(self, config):
schemas=Schemas(),
config=config,
parameters=Parameters(),
- tag="tag",
+ tags=["tag"],
path="/",
method="get",
request_bodies={},
@@ -718,7 +718,7 @@ def test_from_data_all_bodies_bad(self, config):
schemas=Schemas(),
config=config,
parameters=Parameters(),
- tag="tag",
+ tags=["tag"],
path="/",
method="get",
request_bodies={},
@@ -790,93 +790,3 @@ def test_from_data_overrides_path_item_params_with_operation_params(self, config
)
collection: EndpointCollection = collections["default"]
assert isinstance(collection.endpoints[0].query_parameters[0], IntProperty)
-
- def test_from_data_errors(self, mocker, config):
- from openapi_python_client.parser.openapi import ParseError
-
- path_1_put = oai.Operation.model_construct()
- path_1_post = oai.Operation.model_construct(tags=["tag_2", "tag_3"])
- path_2_get = oai.Operation.model_construct()
- data = {
- "path_1": oai.PathItem.model_construct(post=path_1_post, put=path_1_put),
- "path_2": oai.PathItem.model_construct(get=path_2_get),
- }
- schemas_1 = mocker.MagicMock()
- schemas_2 = mocker.MagicMock()
- schemas_3 = mocker.MagicMock()
- parameters_1 = mocker.MagicMock()
- parameters_2 = mocker.MagicMock()
- parameters_3 = mocker.MagicMock()
- mocker.patch.object(
- Endpoint,
- "from_data",
- side_effect=[
- (ParseError(data="1"), schemas_1, parameters_1),
- (ParseError(data="2"), schemas_2, parameters_2),
- (mocker.MagicMock(errors=[ParseError(data="3")], path="path_2"), schemas_3, parameters_3),
- ],
- )
- schemas = mocker.MagicMock()
- parameters = mocker.MagicMock()
-
- result, result_schemas, result_parameters = EndpointCollection.from_data(
- data=data,
- schemas=schemas,
- config=config,
- parameters=parameters,
- request_bodies={},
- )
-
- assert result["default"].parse_errors[0].data == "1"
- assert result["default"].parse_errors[1].data == "3"
- assert result["tag_2"].parse_errors[0].data == "2"
- assert result_schemas == schemas_3
-
- def test_from_data_tags_snake_case_sanitizer(self, mocker, config):
- from openapi_python_client.parser.openapi import Endpoint, EndpointCollection
-
- path_1_put = oai.Operation.model_construct()
- path_1_post = oai.Operation.model_construct(tags=["AMF Subscription Info (Document)", "tag_3"])
- path_2_get = oai.Operation.model_construct(tags=["3. ABC"])
- data = {
- "path_1": oai.PathItem.model_construct(post=path_1_post, put=path_1_put),
- "path_2": oai.PathItem.model_construct(get=path_2_get),
- }
- endpoint_1 = mocker.MagicMock(autospec=Endpoint, tag="default", relative_imports={"1", "2"}, path="path_1")
- endpoint_2 = mocker.MagicMock(
- autospec=Endpoint, tag="AMFSubscriptionInfo (Document)", relative_imports={"2"}, path="path_1"
- )
- endpoint_3 = mocker.MagicMock(autospec=Endpoint, tag="default", relative_imports={"2", "3"}, path="path_2")
- schemas_1 = mocker.MagicMock()
- schemas_2 = mocker.MagicMock()
- schemas_3 = mocker.MagicMock()
- parameters_1 = mocker.MagicMock()
- parameters_2 = mocker.MagicMock()
- parameters_3 = mocker.MagicMock()
- mocker.patch.object(
- Endpoint,
- "from_data",
- side_effect=[
- (endpoint_1, schemas_1, parameters_1),
- (endpoint_2, schemas_2, parameters_2),
- (endpoint_3, schemas_3, parameters_3),
- ],
- )
- schemas = mocker.MagicMock()
- parameters = mocker.MagicMock()
-
- result = EndpointCollection.from_data(
- data=data, schemas=schemas, parameters=parameters, config=config, request_bodies={}
- )
-
- assert result == (
- {
- "default": EndpointCollection("default", endpoints=[endpoint_1]),
- "amf_subscription_info_document": EndpointCollection(
- "amf_subscription_info_document", endpoints=[endpoint_2]
- ),
- "tag3_abc": EndpointCollection("tag3_abc", endpoints=[endpoint_3]),
- },
- schemas_3,
- parameters_3,
- )
From 99ae3a93877116fced970b2a25e33913035ac400 Mon Sep 17 00:00:00 2001
From: "knope-bot[bot]" <152252888+knope-bot[bot]@users.noreply.github.com>
Date: Tue, 24 Dec 2024 16:46:54 -0700
Subject: [PATCH 17/18] Release 0.23.0 (#1181)
> [!IMPORTANT]
> Merging this pull request will create this release
## Breaking Changes
### Delete fewer files with `--overwrite`
`--overwrite` will no longer delete the entire output directory before
regenerating. Instead, it will only delete
specific, known directories within that directory. Right now, that is
only the generated `models` and `api` directories.
Other generated files, like `README.md`, will be overwritten. Extra
files and directories outside of those listed above
will be left untouched, so you can any extra modules or files around
while still updating `pyproject.toml` automatically.
Closes #1105.
## Features
- Support httpx 0.28 (#1172)
### Add `generate_all_tags` config option
You can now, optionally, generate **duplicate** endpoint
functions/modules using _every_ tag for an endpoint,
not just the first one, by setting `generate_all_tags: true` in your
configuration file.
## Fixes
- Support Typer 0.14 and 0.15 (#1173)
### Fix minimum `attrs` version
The minimum `attrs` dependency version was incorrectly set to 21.3.0.
This has been corrected to 22.2.0, the minimum
supported version since `openapi-python-client` 0.19.1.
Closes #1084, thanks @astralblue!
### Fix compatibility with Pydantic 2.10+
#1176 by @Viicos
Set `defer_build` to models that we know will fail to build, and call
`model_rebuild`
in the `__init__.py` file.
Co-authored-by: knope-bot[bot] <152252888+knope-bot[bot]@users.noreply.github.com>
---
.../add_generate_all_tags_config_option.md | 8 ----
.../delete_fewer_files_with_overwrite.md | 13 ------
.changeset/fix_minimum_attrs_version.md | 10 -----
...ly_rebuild_pydantic_models_if_necessary.md | 10 -----
CHANGELOG.md | 41 +++++++++++++++++++
pyproject.toml | 2 +-
6 files changed, 42 insertions(+), 42 deletions(-)
delete mode 100644 .changeset/add_generate_all_tags_config_option.md
delete mode 100644 .changeset/delete_fewer_files_with_overwrite.md
delete mode 100644 .changeset/fix_minimum_attrs_version.md
delete mode 100644 .changeset/properly_rebuild_pydantic_models_if_necessary.md
diff --git a/.changeset/add_generate_all_tags_config_option.md b/.changeset/add_generate_all_tags_config_option.md
deleted file mode 100644
index fb74b9fb0..000000000
--- a/.changeset/add_generate_all_tags_config_option.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-default: minor
----
-
-# Add `generate_all_tags` config option
-
-You can now, optionally, generate **duplicate** endpoint functions/modules using _every_ tag for an endpoint,
-not just the first one, by setting `generate_all_tags: true` in your configuration file.
diff --git a/.changeset/delete_fewer_files_with_overwrite.md b/.changeset/delete_fewer_files_with_overwrite.md
deleted file mode 100644
index c2e273a39..000000000
--- a/.changeset/delete_fewer_files_with_overwrite.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-default: major
----
-
-# Delete fewer files with `--overwrite`
-
-`--overwrite` will no longer delete the entire output directory before regenerating. Instead, it will only delete
-specific, known directories within that directory. Right now, that is only the generated `models` and `api` directories.
-
-Other generated files, like `README.md`, will be overwritten. Extra files and directories outside of those listed above
-will be left untouched, so you can any extra modules or files around while still updating `pyproject.toml` automatically.
-
-Closes #1105.
diff --git a/.changeset/fix_minimum_attrs_version.md b/.changeset/fix_minimum_attrs_version.md
deleted file mode 100644
index 1d8fe623b..000000000
--- a/.changeset/fix_minimum_attrs_version.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-default: patch
----
-
-# Fix minimum `attrs` version
-
-The minimum `attrs` dependency version was incorrectly set to 21.3.0. This has been corrected to 22.2.0, the minimum
-supported version since `openapi-python-client` 0.19.1.
-
-Closes #1084, thanks @astralblue!
diff --git a/.changeset/properly_rebuild_pydantic_models_if_necessary.md b/.changeset/properly_rebuild_pydantic_models_if_necessary.md
deleted file mode 100644
index 28f892e43..000000000
--- a/.changeset/properly_rebuild_pydantic_models_if_necessary.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-default: patch
----
-
-# Fix compatibility with Pydantic 2.10+
-
-#1176 by @Viicos
-
-Set `defer_build` to models that we know will fail to build, and call `model_rebuild`
-in the `__init__.py` file.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2acc64b1e..6569f30fb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,47 @@ Programmatic usage of this project (e.g., importing it as a Python module) and t
The 0.x prefix used in versions for this project is to indicate that breaking changes are expected frequently (several times a year). Breaking changes will increment the minor number, all other changes will increment the patch number. You can track the progress toward 1.0 [here](https://github.com/openapi-generators/openapi-python-client/projects/2).
+## 0.23.0 (2024-12-24)
+
+### Breaking Changes
+
+#### Delete fewer files with `--overwrite`
+
+`--overwrite` will no longer delete the entire output directory before regenerating. Instead, it will only delete
+specific, known directories within that directory. Right now, that is only the generated `models` and `api` directories.
+
+Other generated files, like `README.md`, will be overwritten. Extra files and directories outside of those listed above
+will be left untouched, so you can any extra modules or files around while still updating `pyproject.toml` automatically.
+
+Closes #1105.
+
+### Features
+
+- Support httpx 0.28 (#1172)
+
+#### Add `generate_all_tags` config option
+
+You can now, optionally, generate **duplicate** endpoint functions/modules using _every_ tag for an endpoint,
+not just the first one, by setting `generate_all_tags: true` in your configuration file.
+
+### Fixes
+
+- Support Typer 0.14 and 0.15 (#1173)
+
+#### Fix minimum `attrs` version
+
+The minimum `attrs` dependency version was incorrectly set to 21.3.0. This has been corrected to 22.2.0, the minimum
+supported version since `openapi-python-client` 0.19.1.
+
+Closes #1084, thanks @astralblue!
+
+#### Fix compatibility with Pydantic 2.10+
+
+##1176 by @Viicos
+
+Set `defer_build` to models that we know will fail to build, and call `model_rebuild`
+in the `__init__.py` file.
+
## 0.22.0 (2024-11-23)
### Breaking Changes
diff --git a/pyproject.toml b/pyproject.toml
index a9d5481c2..4966e5f55 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -18,7 +18,7 @@ dependencies = [
"typing-extensions>=4.8.0,<5.0.0",
]
name = "openapi-python-client"
-version = "0.22.0"
+version = "0.23.0"
description = "Generate modern Python clients from OpenAPI"
keywords = [
"OpenAPI",
From 718e9aaa743550d31f4e7db14de10cb3c91d36bc Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 30 Dec 2024 10:17:52 -0700
Subject: [PATCH 18/18] chore(deps): lock file maintenance (#1185)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |
🔧 This Pull Request updates lock files to use the latest dependency
versions.
---
### Configuration
📅 **Schedule**: Branch creation - "before 4am on monday" (UTC),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Enabled.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.
👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/openapi-generators/openapi-python-client).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
integration-tests/pdm.lock | 27 ++--
pdm.lock | 254 ++++++++++++++++++-------------------
2 files changed, 138 insertions(+), 143 deletions(-)
diff --git a/integration-tests/pdm.lock b/integration-tests/pdm.lock
index f1501375a..a854a988f 100644
--- a/integration-tests/pdm.lock
+++ b/integration-tests/pdm.lock
@@ -5,26 +5,26 @@
groups = ["default", "dev"]
strategy = ["inherit_metadata"]
lock_version = "4.5.0"
-content_hash = "sha256:a8195ab20cd4be2c783402cc1a2fd155d4eb5e8a855e3e1eb2dd171e039d7b3e"
+content_hash = "sha256:a575c5fc1f04f52530c52becbcc2f40498a54612d0eeeaddf6701fe5336986ac"
[[metadata.targets]]
-requires_python = "~=3.8"
+requires_python = "~=3.9"
[[package]]
name = "anyio"
-version = "4.5.2"
-requires_python = ">=3.8"
+version = "4.7.0"
+requires_python = ">=3.9"
summary = "High level compatibility layer for multiple asynchronous event loop implementations"
groups = ["default"]
dependencies = [
"exceptiongroup>=1.0.2; python_version < \"3.11\"",
"idna>=2.8",
"sniffio>=1.1",
- "typing-extensions>=4.1; python_version < \"3.11\"",
+ "typing-extensions>=4.5; python_version < \"3.13\"",
]
files = [
- {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"},
- {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"},
+ {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"},
+ {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"},
]
[[package]]
@@ -173,11 +173,6 @@ files = [
{file = "mypy-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:342de51c48bab326bfc77ce056ba08c076d82ce4f5a86621f972ed39970f94d8"},
{file = "mypy-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00df23b42e533e02a6f0055e54de9a6ed491cd8b7ea738647364fd3a39ea7efc"},
{file = "mypy-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:e8c8387e5d9dff80e7daf961df357c80e694e942d9755f3ad77d69b0957b8e3f"},
- {file = "mypy-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b16738b1d80ec4334654e89e798eb705ac0c36c8a5c4798496cd3623aa02286"},
- {file = "mypy-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10065fcebb7c66df04b05fc799a854b1ae24d9963c8bb27e9064a9bdb43aa8ad"},
- {file = "mypy-1.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fbb7d683fa6bdecaa106e8368aa973ecc0ddb79a9eaeb4b821591ecd07e9e03c"},
- {file = "mypy-1.14.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3498cb55448dc5533e438cd13d6ddd28654559c8c4d1fd4b5ca57a31b81bac01"},
- {file = "mypy-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:c7b243408ea43755f3a21a0a08e5c5ae30eddb4c58a80f415ca6b118816e60aa"},
{file = "mypy-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14117b9da3305b39860d0aa34b8f1ff74d209a368829a584eb77524389a9c13e"},
{file = "mypy-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af98c5a958f9c37404bd4eef2f920b94874507e146ed6ee559f185b8809c44cc"},
{file = "mypy-1.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b343a1d3989547024377c2ba0dca9c74a2428ad6ed24283c213af8dbb0710b"},
@@ -241,16 +236,16 @@ files = [
[[package]]
name = "pytest-asyncio"
-version = "0.24.0"
-requires_python = ">=3.8"
+version = "0.25.0"
+requires_python = ">=3.9"
summary = "Pytest support for asyncio"
groups = ["dev"]
dependencies = [
"pytest<9,>=8.2",
]
files = [
- {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"},
- {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"},
+ {file = "pytest_asyncio-0.25.0-py3-none-any.whl", hash = "sha256:db5432d18eac6b7e28b46dcd9b69921b55c3b1086e85febfe04e70b18d9e81b3"},
+ {file = "pytest_asyncio-0.25.0.tar.gz", hash = "sha256:8c0610303c9e0442a5db8604505fc0f545456ba1528824842b37b4a626cbf609"},
]
[[package]]
diff --git a/pdm.lock b/pdm.lock
index cdcfded1f..2697fff68 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -92,149 +92,149 @@ files = [
[[package]]
name = "coverage"
-version = "7.6.9"
+version = "7.6.10"
requires_python = ">=3.9"
summary = "Code coverage measurement for Python"
groups = ["dev"]
files = [
- {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"},
- {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"},
- {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"},
- {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"},
- {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"},
- {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"},
- {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"},
- {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"},
- {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"},
- {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"},
- {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"},
- {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"},
- {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"},
- {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"},
- {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"},
- {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"},
- {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"},
- {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"},
- {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"},
- {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"},
- {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"},
- {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"},
- {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"},
- {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"},
- {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"},
- {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"},
- {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"},
- {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"},
- {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"},
- {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"},
- {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"},
- {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"},
- {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"},
- {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"},
- {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"},
- {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"},
- {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"},
- {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"},
- {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"},
- {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"},
- {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"},
- {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"},
- {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"},
- {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"},
- {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"},
- {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"},
- {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"},
- {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"},
- {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"},
- {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"},
- {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"},
- {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"},
- {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"},
- {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"},
- {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"},
- {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"},
- {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"},
- {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"},
- {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"},
- {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"},
- {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"},
- {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"},
+ {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"},
+ {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"},
+ {file = "coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a"},
+ {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165"},
+ {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988"},
+ {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5"},
+ {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3"},
+ {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5"},
+ {file = "coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244"},
+ {file = "coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e"},
+ {file = "coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3"},
+ {file = "coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43"},
+ {file = "coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132"},
+ {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f"},
+ {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994"},
+ {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99"},
+ {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd"},
+ {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377"},
+ {file = "coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8"},
+ {file = "coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609"},
+ {file = "coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853"},
+ {file = "coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078"},
+ {file = "coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0"},
+ {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50"},
+ {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022"},
+ {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b"},
+ {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0"},
+ {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852"},
+ {file = "coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359"},
+ {file = "coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247"},
+ {file = "coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9"},
+ {file = "coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b"},
+ {file = "coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690"},
+ {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18"},
+ {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c"},
+ {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd"},
+ {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e"},
+ {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694"},
+ {file = "coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6"},
+ {file = "coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e"},
+ {file = "coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe"},
+ {file = "coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273"},
+ {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8"},
+ {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098"},
+ {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb"},
+ {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0"},
+ {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf"},
+ {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2"},
+ {file = "coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312"},
+ {file = "coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d"},
+ {file = "coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a"},
+ {file = "coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27"},
+ {file = "coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4"},
+ {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f"},
+ {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25"},
+ {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315"},
+ {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90"},
+ {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d"},
+ {file = "coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18"},
+ {file = "coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59"},
+ {file = "coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"},
+ {file = "coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23"},
]
[[package]]
name = "coverage"
-version = "7.6.9"
+version = "7.6.10"
extras = ["toml"]
requires_python = ">=3.9"
summary = "Code coverage measurement for Python"
groups = ["dev"]
dependencies = [
- "coverage==7.6.9",
+ "coverage==7.6.10",
"tomli; python_full_version <= \"3.11.0a6\"",
]
files = [
- {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"},
- {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"},
- {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"},
- {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"},
- {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"},
- {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"},
- {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"},
- {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"},
- {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"},
- {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"},
- {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"},
- {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"},
- {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"},
- {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"},
- {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"},
- {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"},
- {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"},
- {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"},
- {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"},
- {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"},
- {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"},
- {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"},
- {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"},
- {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"},
- {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"},
- {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"},
- {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"},
- {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"},
- {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"},
- {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"},
- {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"},
- {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"},
- {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"},
- {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"},
- {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"},
- {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"},
- {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"},
- {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"},
- {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"},
- {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"},
- {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"},
- {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"},
- {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"},
- {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"},
- {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"},
- {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"},
- {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"},
- {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"},
- {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"},
- {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"},
- {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"},
- {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"},
- {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"},
- {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"},
- {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"},
- {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"},
- {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"},
- {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"},
- {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"},
- {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"},
- {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"},
- {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"},
+ {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"},
+ {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"},
+ {file = "coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a"},
+ {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165"},
+ {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988"},
+ {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5"},
+ {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3"},
+ {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5"},
+ {file = "coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244"},
+ {file = "coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e"},
+ {file = "coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3"},
+ {file = "coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43"},
+ {file = "coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132"},
+ {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f"},
+ {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994"},
+ {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99"},
+ {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd"},
+ {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377"},
+ {file = "coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8"},
+ {file = "coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609"},
+ {file = "coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853"},
+ {file = "coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078"},
+ {file = "coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0"},
+ {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50"},
+ {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022"},
+ {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b"},
+ {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0"},
+ {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852"},
+ {file = "coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359"},
+ {file = "coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247"},
+ {file = "coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9"},
+ {file = "coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b"},
+ {file = "coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690"},
+ {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18"},
+ {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c"},
+ {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd"},
+ {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e"},
+ {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694"},
+ {file = "coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6"},
+ {file = "coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e"},
+ {file = "coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe"},
+ {file = "coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273"},
+ {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8"},
+ {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098"},
+ {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb"},
+ {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0"},
+ {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf"},
+ {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2"},
+ {file = "coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312"},
+ {file = "coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d"},
+ {file = "coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a"},
+ {file = "coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27"},
+ {file = "coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4"},
+ {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f"},
+ {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25"},
+ {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315"},
+ {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90"},
+ {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d"},
+ {file = "coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18"},
+ {file = "coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59"},
+ {file = "coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"},
+ {file = "coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23"},
]
[[package]]