clientele 2.2.0__tar.gz → 2.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. {clientele-2.2.0 → clientele-2.2.2}/CHANGELOG.md +8 -0
  2. {clientele-2.2.0 → clientele-2.2.2}/PKG-INFO +1 -1
  3. {clientele-2.2.0 → clientele-2.2.2}/SECURITY.md +2 -2
  4. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/generators/clients.py +1 -1
  5. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/api_post_method.jinja2 +1 -1
  6. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/base_clients.py +1 -1
  7. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/basic/templates/client_py.jinja2 +0 -1
  8. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/basic/writer.py +4 -1
  9. {clientele-2.2.0 → clientele-2.2.2}/clientele/http/httpx_backend.py +2 -0
  10. {clientele-2.2.0 → clientele-2.2.2}/clientele/settings.py +1 -1
  11. {clientele-2.2.0 → clientele-2.2.2}/docs/CHANGELOG.md +8 -0
  12. {clientele-2.2.0 → clientele-2.2.2}/docs/install.md +1 -1
  13. {clientele-2.2.0 → clientele-2.2.2}/example_openapi_specs/best.json +40 -0
  14. {clientele-2.2.0 → clientele-2.2.2}/pyproject.toml +1 -1
  15. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/client/MANIFEST.md +1 -1
  16. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/client/MANIFEST.md +1 -1
  17. {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/client/MANIFEST.md +1 -1
  18. {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_api_client_singleton.py +53 -0
  19. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/async_test_client/MANIFEST.md +1 -1
  20. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/async_test_client/client.py +11 -0
  21. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_basic_client/MANIFEST.md +2 -1
  22. clientele-2.2.0/clientele/generators/basic/templates/schemas_py.jinja2 → clientele-2.2.2/tests/api_clients/test_basic_client/schemas.py +0 -1
  23. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_client/MANIFEST.md +1 -1
  24. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_client/client.py +11 -0
  25. {clientele-2.2.0 → clientele-2.2.2}/tests/generators/framework/test_framework_generator_integration.py +24 -0
  26. {clientele-2.2.0 → clientele-2.2.2}/uv.lock +53 -46
  27. clientele-2.2.0/.claude/settings.local.json +0 -31
  28. {clientele-2.2.0 → clientele-2.2.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  29. {clientele-2.2.0 → clientele-2.2.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  30. {clientele-2.2.0 → clientele-2.2.2}/.github/compatibility.json +0 -0
  31. {clientele-2.2.0 → clientele-2.2.2}/.github/dependabot.yml +0 -0
  32. {clientele-2.2.0 → clientele-2.2.2}/.github/pull_request_template.md +0 -0
  33. {clientele-2.2.0 → clientele-2.2.2}/.github/workflows/ci.yml +0 -0
  34. {clientele-2.2.0 → clientele-2.2.2}/.gitignore +0 -0
  35. {clientele-2.2.0 → clientele-2.2.2}/CODE_OF_CONDUCT.md +0 -0
  36. {clientele-2.2.0 → clientele-2.2.2}/CONTRIBUTING.md +0 -0
  37. {clientele-2.2.0 → clientele-2.2.2}/CONTRIBUTORS.md +0 -0
  38. {clientele-2.2.0 → clientele-2.2.2}/LICENSE +0 -0
  39. {clientele-2.2.0 → clientele-2.2.2}/Makefile +0 -0
  40. {clientele-2.2.0 → clientele-2.2.2}/PUBLISHING.md +0 -0
  41. {clientele-2.2.0 → clientele-2.2.2}/README.md +0 -0
  42. {clientele-2.2.0 → clientele-2.2.2}/clientele/__init__.py +0 -0
  43. {clientele-2.2.0 → clientele-2.2.2}/clientele/api/__init__.py +0 -0
  44. {clientele-2.2.0 → clientele-2.2.2}/clientele/api/client.py +0 -0
  45. {clientele-2.2.0 → clientele-2.2.2}/clientele/api/config.py +0 -0
  46. {clientele-2.2.0 → clientele-2.2.2}/clientele/api/exceptions.py +0 -0
  47. {clientele-2.2.0 → clientele-2.2.2}/clientele/api/requests.py +0 -0
  48. {clientele-2.2.0 → clientele-2.2.2}/clientele/api/stream/__init__.py +0 -0
  49. {clientele-2.2.0 → clientele-2.2.2}/clientele/api/stream/parser.py +0 -0
  50. {clientele-2.2.0 → clientele-2.2.2}/clientele/api/type_utils.py +0 -0
  51. {clientele-2.2.0 → clientele-2.2.2}/clientele/cache/__init__.py +0 -0
  52. {clientele-2.2.0 → clientele-2.2.2}/clientele/cache/backends.py +0 -0
  53. {clientele-2.2.0 → clientele-2.2.2}/clientele/cache/decorator.py +0 -0
  54. {clientele-2.2.0 → clientele-2.2.2}/clientele/cache/key_generator.py +0 -0
  55. {clientele-2.2.0 → clientele-2.2.2}/clientele/cache/types.py +0 -0
  56. {clientele-2.2.0 → clientele-2.2.2}/clientele/cli.py +0 -0
  57. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/README.md +0 -0
  58. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/__init__.py +0 -0
  59. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/__init__.py +0 -0
  60. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/generator.py +0 -0
  61. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/generators/__init__.py +0 -0
  62. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/generators/schemas.py +0 -0
  63. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/api_get_method.jinja2 +0 -0
  64. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/client_py.jinja2 +0 -0
  65. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/config_py.jinja2 +0 -0
  66. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/manifest.jinja2 +0 -0
  67. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/pyproject.toml.jinja2 +0 -0
  68. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/schema_class.jinja2 +0 -0
  69. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/schema_helpers.jinja2 +0 -0
  70. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/schema_root_model.jinja2 +0 -0
  71. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/schema_type_alias.jinja2 +0 -0
  72. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/schemas_py.jinja2 +0 -0
  73. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/writer.py +0 -0
  74. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/base.py +0 -0
  75. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/basic/__init__.py +0 -0
  76. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/basic/generator.py +0 -0
  77. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/basic/templates/config_py.jinja2 +0 -0
  78. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/basic/templates/manifest.jinja2 +0 -0
  79. /clientele-2.2.0/tests/api_clients/test_basic_client/schemas.py → /clientele-2.2.2/clientele/generators/basic/templates/schemas_py.jinja2 +0 -0
  80. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/cicerone_compat.py +0 -0
  81. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/schema_utils.py +0 -0
  82. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/shared/__init__.py +0 -0
  83. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/shared/generators/__init__.py +0 -0
  84. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/shared/generators/schemas.py +0 -0
  85. {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/shared/utils.py +0 -0
  86. {clientele-2.2.0 → clientele-2.2.2}/clientele/graphql/__init__.py +0 -0
  87. {clientele-2.2.0 → clientele-2.2.2}/clientele/graphql/client.py +0 -0
  88. {clientele-2.2.0 → clientele-2.2.2}/clientele/http/__init__.py +0 -0
  89. {clientele-2.2.0 → clientele-2.2.2}/clientele/http/aiohttp_backend.py +0 -0
  90. {clientele-2.2.0 → clientele-2.2.2}/clientele/http/backends.py +0 -0
  91. {clientele-2.2.0 → clientele-2.2.2}/clientele/http/fake_backend.py +0 -0
  92. {clientele-2.2.0 → clientele-2.2.2}/clientele/http/niquests_backend.py +0 -0
  93. {clientele-2.2.0 → clientele-2.2.2}/clientele/http/requests_backend.py +0 -0
  94. {clientele-2.2.0 → clientele-2.2.2}/clientele/http/response.py +0 -0
  95. {clientele-2.2.0 → clientele-2.2.2}/clientele/http/status_codes.py +0 -0
  96. {clientele-2.2.0 → clientele-2.2.2}/clientele/mypy.py +0 -0
  97. {clientele-2.2.0 → clientele-2.2.2}/clientele/py.typed +0 -0
  98. {clientele-2.2.0 → clientele-2.2.2}/clientele/retries/__init__.py +0 -0
  99. {clientele-2.2.0 → clientele-2.2.2}/clientele/retries/decorators.py +0 -0
  100. {clientele-2.2.0 → clientele-2.2.2}/clientele/schemas.py +0 -0
  101. {clientele-2.2.0 → clientele-2.2.2}/clientele/testing.py +0 -0
  102. {clientele-2.2.0 → clientele-2.2.2}/clientele/utils.py +0 -0
  103. {clientele-2.2.0 → clientele-2.2.2}/docs/CNAME +0 -0
  104. {clientele-2.2.0 → clientele-2.2.2}/docs/api-async.md +0 -0
  105. {clientele-2.2.0 → clientele-2.2.2}/docs/api-authentication.md +0 -0
  106. {clientele-2.2.0 → clientele-2.2.2}/docs/api-cache.md +0 -0
  107. {clientele-2.2.0 → clientele-2.2.2}/docs/api-configuration.md +0 -0
  108. {clientele-2.2.0 → clientele-2.2.2}/docs/api-direct-requests.md +0 -0
  109. {clientele-2.2.0 → clientele-2.2.2}/docs/api-examples.md +0 -0
  110. {clientele-2.2.0 → clientele-2.2.2}/docs/api-exceptions.md +0 -0
  111. {clientele-2.2.0 → clientele-2.2.2}/docs/api-graphql.md +0 -0
  112. {clientele-2.2.0 → clientele-2.2.2}/docs/api-http-backends.md +0 -0
  113. {clientele-2.2.0 → clientele-2.2.2}/docs/api-logging.md +0 -0
  114. {clientele-2.2.0 → clientele-2.2.2}/docs/api-overview.md +0 -0
  115. {clientele-2.2.0 → clientele-2.2.2}/docs/api-retries.md +0 -0
  116. {clientele-2.2.0 → clientele-2.2.2}/docs/api-stream.md +0 -0
  117. {clientele-2.2.0 → clientele-2.2.2}/docs/api-testing.md +0 -0
  118. {clientele-2.2.0 → clientele-2.2.2}/docs/clientele_generate.gif +0 -0
  119. {clientele-2.2.0 → clientele-2.2.2}/docs/clientele_header.png +0 -0
  120. {clientele-2.2.0 → clientele-2.2.2}/docs/favicon.png +0 -0
  121. {clientele-2.2.0 → clientele-2.2.2}/docs/index.md +0 -0
  122. {clientele-2.2.0 → clientele-2.2.2}/docs/injected-parameters.md +0 -0
  123. {clientele-2.2.0 → clientele-2.2.2}/docs/openapi-cli.md +0 -0
  124. {clientele-2.2.0 → clientele-2.2.2}/docs/server-django-ninja.md +0 -0
  125. {clientele-2.2.0 → clientele-2.2.2}/docs/server-drf.md +0 -0
  126. {clientele-2.2.0 → clientele-2.2.2}/docs/server-fastapi.md +0 -0
  127. {clientele-2.2.0 → clientele-2.2.2}/example_openapi_specs/complex_schemas.json +0 -0
  128. {clientele-2.2.0 → clientele-2.2.2}/example_openapi_specs/issue_248.json +0 -0
  129. {clientele-2.2.0 → clientele-2.2.2}/example_openapi_specs/simple.json +0 -0
  130. {clientele-2.2.0 → clientele-2.2.2}/example_openapi_specs/test_303.yaml +0 -0
  131. {clientele-2.2.0 → clientele-2.2.2}/mkdocs.yml +0 -0
  132. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/README.md +0 -0
  133. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/api.py +0 -0
  134. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/client/__init__.py +0 -0
  135. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/client/client.py +0 -0
  136. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/client/config.py +0 -0
  137. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/client/pyproject.toml +0 -0
  138. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/client/schemas.py +0 -0
  139. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/example_project/__init__.py +0 -0
  140. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/example_project/settings.py +0 -0
  141. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/example_project/urls.py +0 -0
  142. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/manage.py +0 -0
  143. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/openapi.json +0 -0
  144. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/README.md +0 -0
  145. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/client/__init__.py +0 -0
  146. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/client/client.py +0 -0
  147. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/client/config.py +0 -0
  148. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/client/pyproject.toml +0 -0
  149. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/client/schemas.py +0 -0
  150. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/example_project/__init__.py +0 -0
  151. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/example_project/settings.py +0 -0
  152. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/example_project/urls.py +0 -0
  153. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/manage.py +0 -0
  154. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/openapi.yaml +0 -0
  155. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/__init__.py +0 -0
  156. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/apps.py +0 -0
  157. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/migrations/0001_initial.py +0 -0
  158. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/migrations/__init__.py +0 -0
  159. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/models.py +0 -0
  160. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/serializers.py +0 -0
  161. {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/views.py +0 -0
  162. {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/README.md +0 -0
  163. {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/client/__init__.py +0 -0
  164. {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/client/client.py +0 -0
  165. {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/client/config.py +0 -0
  166. {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/client/pyproject.toml +0 -0
  167. {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/client/schemas.py +0 -0
  168. {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/main.py +0 -0
  169. {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/openapi.json +0 -0
  170. {clientele-2.2.0 → clientele-2.2.2}/tests/__init__.py +0 -0
  171. {clientele-2.2.0 → clientele-2.2.2}/tests/api/retries/test_retry.py +0 -0
  172. {clientele-2.2.0 → clientele-2.2.2}/tests/api/stream/test_parser.py +0 -0
  173. {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_api_client.py +0 -0
  174. {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_api_client_logging.py +0 -0
  175. {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_api_response_parser.py +0 -0
  176. {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_api_typed_dict.py +0 -0
  177. {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_direct_requests.py +0 -0
  178. {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_requests.py +0 -0
  179. {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_stream.py +0 -0
  180. {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_stream_httpx.py +0 -0
  181. {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_type_utils.py +0 -0
  182. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/async_test_client/__init__.py +0 -0
  183. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/async_test_client/config.py +0 -0
  184. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/async_test_client/pyproject.toml +0 -0
  185. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/async_test_client/schemas.py +0 -0
  186. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_basic_client/__init__.py +0 -0
  187. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_basic_client/client.py +0 -0
  188. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_basic_client/config.py +0 -0
  189. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_client/__init__.py +0 -0
  190. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_client/config.py +0 -0
  191. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_client/pyproject.toml +0 -0
  192. {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_client/schemas.py +0 -0
  193. {clientele-2.2.0 → clientele-2.2.2}/tests/cache/fixtures.py +0 -0
  194. {clientele-2.2.0 → clientele-2.2.2}/tests/cache/test_backends.py +0 -0
  195. {clientele-2.2.0 → clientele-2.2.2}/tests/cache/test_decorator.py +0 -0
  196. {clientele-2.2.0 → clientele-2.2.2}/tests/cache/test_integration.py +0 -0
  197. {clientele-2.2.0 → clientele-2.2.2}/tests/cache/test_key_generator.py +0 -0
  198. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/callback_example.yaml +0 -0
  199. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/complex_api.yaml +0 -0
  200. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/README.md +0 -0
  201. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/api-with-examples.json +0 -0
  202. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/callback-example.json +0 -0
  203. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/link-example.json +0 -0
  204. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/non-oauth-scopes.json +0 -0
  205. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/petstore-expanded.json +0 -0
  206. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/petstore.json +0 -0
  207. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/tictactoe.json +0 -0
  208. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/uspto.json +0 -0
  209. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/webhook-example.json +0 -0
  210. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/petstore_openapi3.yaml +0 -0
  211. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/realworld/1password.yaml +0 -0
  212. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/realworld/ably.yaml +0 -0
  213. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/realworld/google.yaml +0 -0
  214. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/realworld/medium.yaml +0 -0
  215. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/realworld/spacetraders.yaml +0 -0
  216. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/realworld/twilio.yaml +0 -0
  217. {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/regression/dep_query_alias.json +0 -0
  218. {clientele-2.2.0 → clientele-2.2.2}/tests/generators/framework/test_framework_generator_coverage.py +0 -0
  219. {clientele-2.2.0 → clientele-2.2.2}/tests/generators/integration_utils.py +0 -0
  220. {clientele-2.2.0 → clientele-2.2.2}/tests/generators/shared/__init__.py +0 -0
  221. {clientele-2.2.0 → clientele-2.2.2}/tests/generators/shared/test_utils.py +0 -0
  222. {clientele-2.2.0 → clientele-2.2.2}/tests/generators/shared/test_utils_coverage.py +0 -0
  223. {clientele-2.2.0 → clientele-2.2.2}/tests/generators/test_base.py +0 -0
  224. {clientele-2.2.0 → clientele-2.2.2}/tests/generators/test_base_and_basic_coverage.py +0 -0
  225. {clientele-2.2.0 → clientele-2.2.2}/tests/generators/test_cicerone_compat.py +0 -0
  226. {clientele-2.2.0 → clientele-2.2.2}/tests/generators/test_schemas_coverage.py +0 -0
  227. {clientele-2.2.0 → clientele-2.2.2}/tests/graphql/test_graphql_client.py +0 -0
  228. {clientele-2.2.0 → clientele-2.2.2}/tests/http/backends/test_aiohttp_backend.py +0 -0
  229. {clientele-2.2.0 → clientele-2.2.2}/tests/http/backends/test_backend_config.py +0 -0
  230. {clientele-2.2.0 → clientele-2.2.2}/tests/http/backends/test_fake_backend.py +0 -0
  231. {clientele-2.2.0 → clientele-2.2.2}/tests/http/backends/test_httpx_backend.py +0 -0
  232. {clientele-2.2.0 → clientele-2.2.2}/tests/http/backends/test_niquests_backend.py +0 -0
  233. {clientele-2.2.0 → clientele-2.2.2}/tests/http/backends/test_requests_backend.py +0 -0
  234. {clientele-2.2.0 → clientele-2.2.2}/tests/mypy/mypy_plugin_test_config.ini +0 -0
  235. {clientele-2.2.0 → clientele-2.2.2}/tests/mypy/test_mypy_plugin.py +0 -0
  236. {clientele-2.2.0 → clientele-2.2.2}/tests/test_additional_coverage.py +0 -0
  237. {clientele-2.2.0 → clientele-2.2.2}/tests/test_cli.py +0 -0
  238. {clientele-2.2.0 → clientele-2.2.2}/tests/test_cli_coverage.py +0 -0
  239. {clientele-2.2.0 → clientele-2.2.2}/tests/test_cli_full_coverage.py +0 -0
  240. {clientele-2.2.0 → clientele-2.2.2}/tests/test_complex_schemas.py +0 -0
  241. {clientele-2.2.0 → clientele-2.2.2}/tests/test_edge_case_coverage.py +0 -0
  242. {clientele-2.2.0 → clientele-2.2.2}/tests/test_fixture_schemas.py +0 -0
  243. {clientele-2.2.0 → clientele-2.2.2}/tests/test_generator_coverage.py +0 -0
  244. {clientele-2.2.0 → clientele-2.2.2}/tests/test_issue_248.py +0 -0
  245. {clientele-2.2.0 → clientele-2.2.2}/tests/test_nullable_fields.py +0 -0
  246. {clientele-2.2.0 → clientele-2.2.2}/tests/test_openapi_31_null_type.py +0 -0
  247. {clientele-2.2.0 → clientele-2.2.2}/tests/test_ref_handling.py +0 -0
  248. {clientele-2.2.0 → clientele-2.2.2}/tests/test_settings.py +0 -0
  249. {clientele-2.2.0 → clientele-2.2.2}/tests/test_testing_utilities.py +0 -0
  250. {clientele-2.2.0 → clientele-2.2.2}/tests/test_utils.py +0 -0
@@ -1,5 +1,13 @@
1
1
  # Change log
2
2
 
3
+ ## 2.2.2
4
+
5
+ - Fix `HttpxHTTPBackend.close()`/`aclose()` not resetting the client reference — a closed-but-non-None client was returned on subsequent requests, causing `RuntimeError: Cannot send a request, as the client has been closed`.
6
+
7
+ ## 2.2.1
8
+
9
+ - Fix POST/PUT/PATCH endpoints without a request body generating a required `data: None` parameter — the `data` parameter is now omitted entirely when the endpoint has no request body.
10
+
3
11
  ## 2.2.0
4
12
 
5
13
  - Support OpenAPI `default` and `const` in schema generation ([#247](https://github.com/phalt/clientele/pull/247)).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clientele
3
- Version: 2.2.0
3
+ Version: 2.2.2
4
4
  Summary: Clientele is a different way to build Python API Clients
5
5
  Project-URL: Homepage, https://clientele.dev
6
6
  Project-URL: Changelog, https://docs.clientele.dev/CHANGELOG/
@@ -4,8 +4,8 @@
4
4
 
5
5
  | Version | Supported |
6
6
  | --------------| ------------------ |
7
- | 2.2.0 | :white_check_mark: |
8
- | 2.1.0 or less | :x: |
7
+ | 2.2.2 | :white_check_mark: |
8
+ | 2.2.1 or less | :x: |
9
9
 
10
10
  ## Reporting a Vulnerability
11
11
 
@@ -111,7 +111,7 @@ class ClientsGenerator(base_clients.BaseClientsGenerator):
111
111
  api_url = utils.replace_path_parameters(url, function_arguments.param_name_map)
112
112
 
113
113
  if method in ["post", "put", "patch"] and not operation.get("requestBody"):
114
- data_class_name = "None"
114
+ data_class_name = None
115
115
  elif method in ["post", "put", "patch"]:
116
116
  data_class_name = self.generate_input_types(operation.get("requestBody", {}), func_name=func_name)
117
117
  else:
@@ -5,7 +5,7 @@
5
5
  {% else %}
6
6
  @client.{{method}}("{{api_url}}")
7
7
  {% endif %}
8
- {{asyncio and "async " or ""}}def {{func_name}}(result: {{response_types}}, data: {{data_class_name}}{% if function_arguments.get_required_args_as_string() %}, {{function_arguments.get_required_args_as_string()}}{% endif %}{% if function_arguments.get_optional_args_as_string() %}, {{function_arguments.get_optional_args_as_string()}}{% endif %}) -> {{response_types}}:
8
+ {{asyncio and "async " or ""}}def {{func_name}}(result: {{response_types}}{% if data_class_name %}, data: {{data_class_name}}{% endif %}{% if function_arguments.get_required_args_as_string() %}, {{function_arguments.get_required_args_as_string()}}{% endif %}{% if function_arguments.get_optional_args_as_string() %}, {{function_arguments.get_optional_args_as_string()}}{% endif %}) -> {{response_types}}:
9
9
  {% if summary or description or deprecated %}"""{% if summary %}{{summary}}{% endif %}{% if description %}
10
10
 
11
11
  {{description}}{% endif %}{% if deprecated %}
@@ -297,7 +297,7 @@ class BaseClientsGenerator:
297
297
  list(query_args.keys()), function_arguments.param_name_map
298
298
  )
299
299
  if method in ["post", "put", "patch"] and not operation.get("requestBody"):
300
- data_class_name = "None"
300
+ data_class_name = None
301
301
  elif method in ["post", "put", "patch"]:
302
302
  data_class_name = self.generate_input_types(operation.get("requestBody", {}), func_name=func_name)
303
303
  else:
@@ -8,7 +8,6 @@ from clientele import api
8
8
  {% if client_project_directory_path %}from {{client_project_directory_path}}.config import config
9
9
  {% else %}from .config import config
10
10
  {% endif %}
11
-
12
11
  client = api.APIClient(config=config)
13
12
 
14
13
  # Declare your API functions here.
@@ -2,7 +2,10 @@ import pathlib
2
2
 
3
3
  import jinja2
4
4
 
5
- templates = jinja2.Environment(loader=jinja2.PackageLoader("clientele", "generators/basic/templates/"))
5
+ templates = jinja2.Environment(
6
+ loader=jinja2.PackageLoader("clientele", "generators/basic/templates/"),
7
+ keep_trailing_newline=True,
8
+ )
6
9
 
7
10
 
8
11
  def write_to_schemas(content: str, output_dir: str) -> None:
@@ -124,11 +124,13 @@ class HttpxHTTPBackend(backends.HTTPBackend):
124
124
  """Close the synchronous httpx client."""
125
125
  if self._sync_client is not None:
126
126
  self._sync_client.close()
127
+ self._sync_client = None
127
128
 
128
129
  async def aclose(self) -> None:
129
130
  """Asynchronously close the async httpx client."""
130
131
  if self._async_client is not None:
131
132
  await self._async_client.aclose()
133
+ self._async_client = None
132
134
 
133
135
  def handle_sync_stream(
134
136
  self,
@@ -1,6 +1,6 @@
1
1
  import platform
2
2
 
3
- VERSION = "2.2.0"
3
+ VERSION = "2.2.2"
4
4
 
5
5
 
6
6
  def split_ver():
@@ -1,5 +1,13 @@
1
1
  # Change log
2
2
 
3
+ ## 2.2.2
4
+
5
+ - Fix `HttpxHTTPBackend.close()`/`aclose()` not resetting the client reference — a closed-but-non-None client was returned on subsequent requests, causing `RuntimeError: Cannot send a request, as the client has been closed`.
6
+
7
+ ## 2.2.1
8
+
9
+ - Fix POST/PUT/PATCH endpoints without a request body generating a required `data: None` parameter — the `data` parameter is now omitted entirely when the endpoint has no request body.
10
+
3
11
  ## 2.2.0
4
12
 
5
13
  - Support OpenAPI `default` and `const` in schema generation ([#247](https://github.com/phalt/clientele/pull/247)).
@@ -47,7 +47,7 @@ Once installed, you can run `clientele version` to confirm:
47
47
 
48
48
  ```sh
49
49
  > clientele version
50
- clientele 2.2.0
50
+ clientele 2.2.2
51
51
  ```
52
52
 
53
53
  ## Next steps
@@ -799,6 +799,46 @@
799
799
  }
800
800
  }
801
801
  },
802
+ "/post-without-body/{item_id}": {
803
+ "post": {
804
+ "summary": "Post Without Body",
805
+ "description": "A POST endpoint that has path and query parameters but no request body",
806
+ "operationId": "post_without_body",
807
+ "parameters": [
808
+ {
809
+ "name": "item_id",
810
+ "in": "path",
811
+ "required": true,
812
+ "schema": {
813
+ "type": "string",
814
+ "title": "Item ID"
815
+ }
816
+ },
817
+ {
818
+ "name": "force",
819
+ "in": "query",
820
+ "required": false,
821
+ "schema": {
822
+ "type": "boolean",
823
+ "default": false,
824
+ "title": "Force"
825
+ }
826
+ }
827
+ ],
828
+ "responses": {
829
+ "202": {
830
+ "description": "Accepted",
831
+ "content": {
832
+ "application/json": {
833
+ "schema": {
834
+ "$ref": "#/components/schemas/SimpleResponse"
835
+ }
836
+ }
837
+ }
838
+ }
839
+ }
840
+ }
841
+ },
802
842
  "/nullable-fields": {
803
843
  "post": {
804
844
  "summary": "Nullable Fields Request",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "clientele"
3
- version = "2.2.0"
3
+ version = "2.2.2"
4
4
  description = "Clientele is a different way to build Python API Clients"
5
5
  authors = [{ name = "Paul Hallett", email = "paulandrewhallett@gmail.com" }]
6
6
  license = { text = "MIT" }
@@ -16,7 +16,7 @@ uv add clientele
16
16
 
17
17
  API VERSION: 1.0.0
18
18
  OPENAPI VERSION: 3.1.0
19
- CLIENTELE VERSION: 2.2.0
19
+ CLIENTELE VERSION: 2.2.2
20
20
 
21
21
  Regenerate using this command:
22
22
 
@@ -16,7 +16,7 @@ uv add clientele
16
16
 
17
17
  API VERSION: 1.0.0
18
18
  OPENAPI VERSION: 3.0.3
19
- CLIENTELE VERSION: 2.2.0
19
+ CLIENTELE VERSION: 2.2.2
20
20
 
21
21
  Regenerate using this command:
22
22
 
@@ -16,7 +16,7 @@ uv add clientele
16
16
 
17
17
  API VERSION: 1.0.0
18
18
  OPENAPI VERSION: 3.1.0
19
- CLIENTELE VERSION: 2.2.0
19
+ CLIENTELE VERSION: 2.2.2
20
20
 
21
21
  Regenerate using this command:
22
22
 
@@ -91,6 +91,59 @@ async def test_aclose_method_works() -> None:
91
91
  assert client.config.http_backend is fake_backend
92
92
 
93
93
 
94
+ def test_sync_request_works_after_close() -> None:
95
+ """Test that sync requests work after close() by rebuilding the client."""
96
+ client = APIClient(base_url=BASE_URL)
97
+ fake_backend = configure_client_for_testing(client)
98
+ fake_backend.queue_response(
99
+ path="/users/1",
100
+ response_obj=ResponseFactory.ok(data={"id": 1, "name": "Ada"}),
101
+ )
102
+ fake_backend.queue_response(
103
+ path="/users/1",
104
+ response_obj=ResponseFactory.ok(data={"id": 1, "name": "Ada"}),
105
+ )
106
+
107
+ @client.get("/users/{user_id}")
108
+ def get_user(result: User, user_id: int) -> User:
109
+ return result
110
+
111
+ user = get_user(1)
112
+ assert user.id == 1
113
+
114
+ client.close()
115
+
116
+ user = get_user(1)
117
+ assert user.id == 1
118
+
119
+
120
+ @pytest.mark.asyncio
121
+ async def test_async_request_works_after_aclose() -> None:
122
+ """Test that async requests work after aclose() by rebuilding the client."""
123
+ client = APIClient(base_url=BASE_URL)
124
+ fake_backend = configure_client_for_testing(client)
125
+ fake_backend.queue_response(
126
+ path="/users/1",
127
+ response_obj=ResponseFactory.ok(data={"id": 1, "name": "Ada"}),
128
+ )
129
+ fake_backend.queue_response(
130
+ path="/users/1",
131
+ response_obj=ResponseFactory.ok(data={"id": 1, "name": "Ada"}),
132
+ )
133
+
134
+ @client.get("/users/{user_id}")
135
+ async def get_user(result: User, user_id: int) -> User:
136
+ return result
137
+
138
+ user = await get_user(1)
139
+ assert user.id == 1
140
+
141
+ await client.aclose()
142
+
143
+ user = await get_user(1)
144
+ assert user.id == 1
145
+
146
+
94
147
  def test_can_reconfigure_with_base_url() -> None:
95
148
  """Test that base_url can be reconfigured."""
96
149
  client = APIClient(base_url="whatever")
@@ -16,7 +16,7 @@ uv add clientele
16
16
 
17
17
  API VERSION: 0.1.0
18
18
  OPENAPI VERSION: 3.0.2
19
- CLIENTELE VERSION: 2.2.0
19
+ CLIENTELE VERSION: 2.2.2
20
20
 
21
21
  Regenerate using this command:
22
22
 
@@ -151,6 +151,17 @@ async def deprecated_endpoint_deprecated_endpoint_get(result: schemas.SimpleResp
151
151
  return result
152
152
 
153
153
 
154
+ @client.post("/post-without-body/{item_id}")
155
+ async def post_without_body(
156
+ result: schemas.SimpleResponse, item_id: str, force: typing.Optional[bool] = None
157
+ ) -> schemas.SimpleResponse:
158
+ """Post Without Body
159
+
160
+ A POST endpoint that has path and query parameters but no request body
161
+ """
162
+ return result
163
+
164
+
154
165
  @client.post("/nullable-fields", response_map={200: schemas.NullableFieldsResponse, 422: schemas.HTTPValidationError})
155
166
  async def nullable_fields_nullable_fields_post(
156
167
  result: schemas.HTTPValidationError | schemas.NullableFieldsResponse, data: schemas.NullableFieldsRequest
@@ -16,10 +16,11 @@ uv add clientele
16
16
 
17
17
  API VERSION:
18
18
  OPENAPI VERSION:
19
- CLIENTELE VERSION: 2.2.0
19
+ CLIENTELE VERSION: 2.2.2
20
20
 
21
21
  Regenerate using this command:
22
22
 
23
23
  ```sh
24
24
  clientele start-api -o tests/api_clients/test_basic_client/
25
25
  ```
26
+
@@ -5,7 +5,6 @@ API Client Schemas.
5
5
  from __future__ import annotations
6
6
 
7
7
  import typing # noqa
8
- import enum
9
8
 
10
9
  import pydantic # noqa
11
10
 
@@ -16,7 +16,7 @@ uv add clientele
16
16
 
17
17
  API VERSION: 0.1.0
18
18
  OPENAPI VERSION: 3.0.2
19
- CLIENTELE VERSION: 2.2.0
19
+ CLIENTELE VERSION: 2.2.2
20
20
 
21
21
  Regenerate using this command:
22
22
 
@@ -151,6 +151,17 @@ def deprecated_endpoint_deprecated_endpoint_get(result: schemas.SimpleResponse)
151
151
  return result
152
152
 
153
153
 
154
+ @client.post("/post-without-body/{item_id}")
155
+ def post_without_body(
156
+ result: schemas.SimpleResponse, item_id: str, force: typing.Optional[bool] = None
157
+ ) -> schemas.SimpleResponse:
158
+ """Post Without Body
159
+
160
+ A POST endpoint that has path and query parameters but no request body
161
+ """
162
+ return result
163
+
164
+
154
165
  @client.post("/nullable-fields", response_map={200: schemas.NullableFieldsResponse, 422: schemas.HTTPValidationError})
155
166
  def nullable_fields_nullable_fields_post(
156
167
  result: schemas.HTTPValidationError | schemas.NullableFieldsResponse, data: schemas.NullableFieldsRequest
@@ -124,6 +124,30 @@ def test_standard_generator_with_yaml_spec():
124
124
  assert (output_dir / "schemas.py").exists()
125
125
 
126
126
 
127
+ def test_post_without_request_body_omits_data_parameter():
128
+ """POST/PUT/PATCH endpoints without a request body must not generate a `data` parameter."""
129
+ spec = load_spec("best.json")
130
+ spec_path = get_spec_path("best.json")
131
+
132
+ with tempfile.TemporaryDirectory() as tmpdir:
133
+ output_dir = Path(tmpdir) / "no_body_client"
134
+
135
+ generator = APIGenerator(
136
+ spec=spec, asyncio=False, regen=True, output_dir=str(output_dir), url=None, file=str(spec_path)
137
+ )
138
+ generator.generate()
139
+
140
+ client_content = (output_dir / "client.py").read_text()
141
+ assert "def post_without_body(" in client_content
142
+ # Extract the full function signature (may span multiple lines until ->)
143
+ sig_start = client_content.index("def post_without_body(")
144
+ sig_end = client_content.index("->", sig_start)
145
+ signature = client_content[sig_start:sig_end]
146
+ assert "data:" not in signature, f"Unexpected 'data' parameter in: {signature}"
147
+ assert "item_id: str" in signature
148
+ assert "force:" in signature
149
+
150
+
127
151
  def test_standard_generator_creates_manifest():
128
152
  """Test that generator creates proper MANIFEST.md."""
129
153
  spec = load_spec("simple.json")
@@ -391,7 +391,7 @@ wheels = [
391
391
 
392
392
  [[package]]
393
393
  name = "clientele"
394
- version = "2.2.0"
394
+ version = "2.2.2"
395
395
  source = { editable = "." }
396
396
  dependencies = [
397
397
  { name = "httpx2" },
@@ -1060,45 +1060,52 @@ wheels = [
1060
1060
 
1061
1061
  [[package]]
1062
1062
  name = "httptools"
1063
- version = "0.7.1"
1064
- source = { registry = "https://pypi.org/simple" }
1065
- sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" }
1066
- wheels = [
1067
- { url = "https://files.pythonhosted.org/packages/c7/e5/c07e0bcf4ec8db8164e9f6738c048b2e66aabf30e7506f440c4cc6953f60/httptools-0.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:11d01b0ff1fe02c4c32d60af61a4d613b74fad069e47e06e9067758c01e9ac78", size = 204531, upload-time = "2025-10-10T03:54:20.887Z" },
1068
- { url = "https://files.pythonhosted.org/packages/7e/4f/35e3a63f863a659f92ffd92bef131f3e81cf849af26e6435b49bd9f6f751/httptools-0.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d86c1e5afdc479a6fdabf570be0d3eb791df0ae727e8dbc0259ed1249998d4", size = 109408, upload-time = "2025-10-10T03:54:22.455Z" },
1069
- { url = "https://files.pythonhosted.org/packages/f5/71/b0a9193641d9e2471ac541d3b1b869538a5fb6419d52fd2669fa9c79e4b8/httptools-0.7.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8c751014e13d88d2be5f5f14fc8b89612fcfa92a9cc480f2bc1598357a23a05", size = 440889, upload-time = "2025-10-10T03:54:23.753Z" },
1070
- { url = "https://files.pythonhosted.org/packages/eb/d9/2e34811397b76718750fea44658cb0205b84566e895192115252e008b152/httptools-0.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:654968cb6b6c77e37b832a9be3d3ecabb243bbe7a0b8f65fbc5b6b04c8fcabed", size = 440460, upload-time = "2025-10-10T03:54:25.313Z" },
1071
- { url = "https://files.pythonhosted.org/packages/01/3f/a04626ebeacc489866bb4d82362c0657b2262bef381d68310134be7f40bb/httptools-0.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b580968316348b474b020edf3988eecd5d6eec4634ee6561e72ae3a2a0e00a8a", size = 425267, upload-time = "2025-10-10T03:54:26.81Z" },
1072
- { url = "https://files.pythonhosted.org/packages/a5/99/adcd4f66614db627b587627c8ad6f4c55f18881549bab10ecf180562e7b9/httptools-0.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d496e2f5245319da9d764296e86c5bb6fcf0cf7a8806d3d000717a889c8c0b7b", size = 424429, upload-time = "2025-10-10T03:54:28.174Z" },
1073
- { url = "https://files.pythonhosted.org/packages/d5/72/ec8fc904a8fd30ba022dfa85f3bbc64c3c7cd75b669e24242c0658e22f3c/httptools-0.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cbf8317bfccf0fed3b5680c559d3459cccf1abe9039bfa159e62e391c7270568", size = 86173, upload-time = "2025-10-10T03:54:29.5Z" },
1074
- { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" },
1075
- { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" },
1076
- { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" },
1077
- { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" },
1078
- { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" },
1079
- { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" },
1080
- { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" },
1081
- { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" },
1082
- { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" },
1083
- { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" },
1084
- { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" },
1085
- { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" },
1086
- { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" },
1087
- { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" },
1088
- { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" },
1089
- { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" },
1090
- { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" },
1091
- { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" },
1092
- { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" },
1093
- { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" },
1094
- { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" },
1095
- { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" },
1096
- { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" },
1097
- { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" },
1098
- { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" },
1099
- { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" },
1100
- { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" },
1101
- { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" },
1063
+ version = "0.8.0"
1064
+ source = { registry = "https://pypi.org/simple" }
1065
+ sdist = { url = "https://files.pythonhosted.org/packages/43/e5/d471fcb0e14523fe1c3f4ba58ca52480e7bd70ad7109a3846bc75892f7fb/httptools-0.8.0.tar.gz", hash = "sha256:6b2a32f18d97e16e90827d7a819ffa8dbd8cc245fc4e1fa9d1095b54ef4bd999", size = 271342, upload-time = "2026-05-25T22:17:48.841Z" }
1066
+ wheels = [
1067
+ { url = "https://files.pythonhosted.org/packages/40/b9/be66eb0decd730d89b9c94f930e4b8d87787b05724bb84af98bfd825f72c/httptools-0.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bf3b6f807c8541503cecfbb8a8dffb385640d0d96102f3d112aa8740f9b7c826", size = 208805, upload-time = "2026-05-25T22:16:50.434Z" },
1068
+ { url = "https://files.pythonhosted.org/packages/9d/f7/b4d41eaae2869d31356bc4bbf546f44fae83ff298af0a043ca0625b06773/httptools-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da684f2e1aa2ee9bdcb083f3f3a68c5956750b375bc5df864d3a5f0c42a40b77", size = 113527, upload-time = "2026-05-25T22:16:51.672Z" },
1069
+ { url = "https://files.pythonhosted.org/packages/e6/e4/77487e14fc7be47180fd0eb4267c7486d0cc59b74031839a3daf8650136b/httptools-0.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6f21e2a3b0067bbe7f67e34cfd16276af556e5e52f4c7503be0cb5f90e905e4", size = 450035, upload-time = "2026-05-25T22:16:53.313Z" },
1070
+ { url = "https://files.pythonhosted.org/packages/da/72/5a8f787e323f56fbd86c32a4be92a86776e4cfe8b4317db999f452028362/httptools-0.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea897f0c729581ebf72131a438a7932d9b14efef72d75ada966700cac3caaeb", size = 451101, upload-time = "2026-05-25T22:16:54.696Z" },
1071
+ { url = "https://files.pythonhosted.org/packages/ed/41/b44a25560955197674b6744cb903664300e239235a5eaa69df0890d87054/httptools-0.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0d726cc107fceb7d45f978483b4b70dd8caa836f5914d3434bb18628eb73813", size = 436140, upload-time = "2026-05-25T22:16:56.239Z" },
1072
+ { url = "https://files.pythonhosted.org/packages/74/b0/054aac84c03d7e097bf4c605fb7e74eec3d65c0276adf64ee97f3a103ff5/httptools-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9878eb2785ba5eb70631ad269b37976f73d647955e26c91d490eb8a4edfda4ba", size = 437041, upload-time = "2026-05-25T22:16:57.716Z" },
1073
+ { url = "https://files.pythonhosted.org/packages/bb/e8/86b85bbc0ac7892232f1a99ab96a9aa71936984fa06adfc0afc83ca7789e/httptools-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:b205e5f5523fa039679da0dfe5a10132b2a4abeae6a86fdd1ddc035f7f836557", size = 90454, upload-time = "2026-05-25T22:16:58.871Z" },
1074
+ { url = "https://files.pythonhosted.org/packages/f8/d2/c3eedaef57de65c3cc5f8dc244cf12d09c84ad258a479055aad6db23206c/httptools-0.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed377e64805bdba4943c82717333f8f8603a13b09aff9cead2717c6c817fb168", size = 208428, upload-time = "2026-05-25T22:16:59.717Z" },
1075
+ { url = "https://files.pythonhosted.org/packages/f1/94/dfe435d90d0ef61ec0f2cc3d480eef78c59727c6c2ce039f433882f6131a/httptools-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9518c406d7b310f05adb1a37f80acabac40504a575d7c0da6d3e365c695ac20d", size = 113366, upload-time = "2026-05-25T22:17:00.795Z" },
1076
+ { url = "https://files.pythonhosted.org/packages/cc/d4/13025f1a56e615dcb331e0bbe2d9a1143212b58c263385fc5d2e558f5bac/httptools-0.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:57278e6fa0424c42a8a3e454828ab4f0aff27b40cddf9679579b98c6dce6a376", size = 464676, upload-time = "2026-05-25T22:17:02.014Z" },
1077
+ { url = "https://files.pythonhosted.org/packages/bf/95/4c1c26c0b985f8a3331682d802598f14e32dc41bf7509266eb2c04ad4801/httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbb8caadb2b742d293169d2b458b5c001ef70e3158704aa3d3ef9597624c5d1d", size = 464235, upload-time = "2026-05-25T22:17:03.109Z" },
1078
+ { url = "https://files.pythonhosted.org/packages/a2/82/6735be2b0ca527718c431cdb8e5f70c3862c0844a687df0f572c51e11497/httptools-0.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:52dd695b865fe96d9d2b16b64a895f3f57bf3cb064e8383cd3b5713a069e8085", size = 449809, upload-time = "2026-05-25T22:17:04.443Z" },
1079
+ { url = "https://files.pythonhosted.org/packages/b5/f9/5811c74f37a758c8a4aa3dc430375119d335947e883efc4664d8f3559a41/httptools-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20b4aac66ff65f7db06a375808b78f42a94970aa22e826b3cb2b43eb09174124", size = 452174, upload-time = "2026-05-25T22:17:05.476Z" },
1080
+ { url = "https://files.pythonhosted.org/packages/cc/94/97b75870dea07b71e3ec535cebe525b08d723152e4c7d13fa887e51f4de2/httptools-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a1b4c8e7a489a0d750d91894e9a8cdc295838f1924c0ca903ae993456fddec07", size = 90991, upload-time = "2026-05-25T22:17:06.75Z" },
1081
+ { url = "https://files.pythonhosted.org/packages/14/88/1d21a36da8f5cb0fa49eafd4b169eba5608d57e75bbcf61845cbc6243216/httptools-0.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:880490234c10f70a9830743097e8958d6e4b9f5a0ffc24515023afeef984054d", size = 208247, upload-time = "2026-05-25T22:17:07.843Z" },
1082
+ { url = "https://files.pythonhosted.org/packages/a5/42/cc4feea2945cb3051038f090c9b36bd5b8a9d7f5a894a506a8983e33fd1c/httptools-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5931891fb7b441b8a3853cf1b85c82c903defce084dd5f6771ca46e31bf862c5", size = 113064, upload-time = "2026-05-25T22:17:09.136Z" },
1083
+ { url = "https://files.pythonhosted.org/packages/e3/a6/febbb8b8db0f58b38e44ad6cb946e6a255ae49b55f2e8543408fb7501ccd/httptools-0.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b15fc622b0f869d19207c4089a501d9bcc63ca5e071ffdd2f03f922df882dcb2", size = 523851, upload-time = "2026-05-25T22:17:10.106Z" },
1084
+ { url = "https://files.pythonhosted.org/packages/b7/e4/f90a0df0b83beff265b7e3b65f2a4cefd95792d4be0ac3e16049f2acd3c2/httptools-0.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:425f83884fd6343828d8c565f046cb72b6d19063f6924093e11bcd8e1548cd09", size = 518842, upload-time = "2026-05-25T22:17:11.218Z" },
1085
+ { url = "https://files.pythonhosted.org/packages/9e/2d/0c9ac76dd2c893841fbf6498d6acec4f2442e1b7067f6e3e316a80e494e8/httptools-0.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ef7c3c97f4311c7be57e2986629df89d49cb434dbff78eafcd48c2bff986b15a", size = 501238, upload-time = "2026-05-25T22:17:12.728Z" },
1086
+ { url = "https://files.pythonhosted.org/packages/ca/42/906adc91ae3a5fa9c59c0a2f21c139725bd7e5b41ae6acd485cd14123ebf/httptools-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a1afd7c9fbff0d9f5d489c4ce2768bd09c84a46ddefc7161e6aa82ae35c85745", size = 509567, upload-time = "2026-05-25T22:17:13.842Z" },
1087
+ { url = "https://files.pythonhosted.org/packages/05/0b/4240efeb672751ee5b9b380cb0e3fdc050bc05f68adc7a8aefc4fcd9a69a/httptools-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd96f29b4bab1d42fa6e3d008711c75e0f79e94e06827330160e3a304227f150", size = 90918, upload-time = "2026-05-25T22:17:15.155Z" },
1088
+ { url = "https://files.pythonhosted.org/packages/5e/e5/8cfcabc5546e8022f168be28bcdaa128a240a0befdd03b59d558b4f18bd6/httptools-0.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:614ceea8ea606848bece2338ac03b3ce5324bcb4be8dc7d377ed708012fa4db8", size = 205148, upload-time = "2026-05-25T22:17:16.333Z" },
1089
+ { url = "https://files.pythonhosted.org/packages/2a/0e/0fb14848c19a686c8062ff9067c1a48793e3224b47bc5b201535b6036fce/httptools-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d689918c15a013c65ef52d9fd495d766893ab831a2c8d89f2ac5940a5df847c", size = 111368, upload-time = "2026-05-25T22:17:17.586Z" },
1090
+ { url = "https://files.pythonhosted.org/packages/2e/1b/46f1cecf06b9bbde8e4b8c88034ac7908989e5ff7a3a388ef38392949c1f/httptools-0.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eb3028cca2fc0a6d720e52ef61d8ebb62fcbfeb1de56874546d858d3f25a26b7", size = 486447, upload-time = "2026-05-25T22:17:18.564Z" },
1091
+ { url = "https://files.pythonhosted.org/packages/77/00/258bfc0837221f81d9725c45f9b948a6a6b2994a147a4fb66e85100c668f/httptools-0.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88bdd940f2b5d487b4d032c6afa5489a7dc4694410d43de3c38c4fb3af0dc45d", size = 482448, upload-time = "2026-05-25T22:17:19.912Z" },
1092
+ { url = "https://files.pythonhosted.org/packages/04/ab/d1cef3b5523f4d272a70f42a776c3169a2dddfe3a54de4b2ce4a36341528/httptools-0.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a43c9dd399758ccc0531acb0a3c4a6c299ee893ee9400e9c893b7bdcfae0681", size = 464460, upload-time = "2026-05-25T22:17:20.882Z" },
1093
+ { url = "https://files.pythonhosted.org/packages/ce/48/5d1d072442277bb2b3434e0e60690b8e8c23840ef7de8b6ea54040a536d3/httptools-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0770728beb05094c809b98e814edff5fef69d26ad7d21185f2f6d5884a0ba683", size = 471312, upload-time = "2026-05-25T22:17:22.085Z" },
1094
+ { url = "https://files.pythonhosted.org/packages/0d/66/b96623b27e51a68199ef4efdda0613cced9233fe3062ac74e50749c5ad37/httptools-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:7685df791fad561384bfb139e77fde27a1ffd93134e016f95a0db424ffbf77b1", size = 90117, upload-time = "2026-05-25T22:17:23.074Z" },
1095
+ { url = "https://files.pythonhosted.org/packages/1a/12/fa3fbf5f9517b273edea2dc982aa82a8c634091e67c590792b729017bc6f/httptools-0.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:de242a49b5d18e0a8776e654e9f6bf6d89f3875a5c35b425a0e7ce940feb3fd6", size = 206183, upload-time = "2026-05-25T22:17:24.004Z" },
1096
+ { url = "https://files.pythonhosted.org/packages/30/fc/5e7c4cb443370f2090a3aba0453a07384d29ff66b7435bb90e77e1037599/httptools-0.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:159e9ab5f701ccd42e555a12f1ad8ff69702910fc1c996cf2bb66e5fcb7a231b", size = 112079, upload-time = "2026-05-25T22:17:25.216Z" },
1097
+ { url = "https://files.pythonhosted.org/packages/ba/53/771bd891eb0f236f32145d6a1775777ec85745f3cc983a1f23d1a3b8ddfe/httptools-0.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c4a9f1707e4823d54dfec6c33fa3697d302aed536ed352a7ebb5a061ddb869d0", size = 481596, upload-time = "2026-05-25T22:17:26.186Z" },
1098
+ { url = "https://files.pythonhosted.org/packages/62/42/94e15bc68ce3d423243c45d7f1b0c7561f13844f97dc52ae23182fb65628/httptools-0.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d76ad7b951387e3632c8716a9bb03ac5b45c5f16119aa409db0459520887944e", size = 480865, upload-time = "2026-05-25T22:17:27.542Z" },
1099
+ { url = "https://files.pythonhosted.org/packages/1c/7c/fe2980fc03723272e30f135b62360b075f513dfe7cc73aef36c7f04012bd/httptools-0.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a3b7387147361c3fd47a0bde763c5c91b5b4cd4dc9989b8ece84ff436c99843b", size = 463189, upload-time = "2026-05-25T22:17:28.546Z" },
1100
+ { url = "https://files.pythonhosted.org/packages/15/1b/47fc5fff68acd1bfa20b4734059c9a06cadb88119dcd5258b5b0d21d91c8/httptools-0.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f256d6ce930c52ca1cb2a960b7da03548c454e7d28b06059ad41bfe789036ce0", size = 466610, upload-time = "2026-05-25T22:17:29.816Z" },
1101
+ { url = "https://files.pythonhosted.org/packages/60/bd/07b13c93ffd9bec9546e0d43f8e19378dd696dbd278511406bc07371ef1f/httptools-0.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:19d1ee275bb59ba2643ba9a3a1e51cc0c788caf2b8df506368e03f56fdd08527", size = 92705, upload-time = "2026-05-25T22:17:31.133Z" },
1102
+ { url = "https://files.pythonhosted.org/packages/fd/c4/121648f68ce066d7bd762d6b6d97e620847642d38d54f3d90ff11d947629/httptools-0.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:de1ed58a974e75d56560acc7e7fed01a454994429456f65209789992e41f2568", size = 215023, upload-time = "2026-05-25T22:17:32.401Z" },
1103
+ { url = "https://files.pythonhosted.org/packages/b9/b0/312a062ae741ae3e8baa8c8bf20be81b2e67337b259ab4349bebc7b6142e/httptools-0.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e93c227b595c6926c1acee96891dd9da4be338cfbe82e5cd3bb9d8dd7dc4ac0b", size = 117405, upload-time = "2026-05-25T22:17:33.742Z" },
1104
+ { url = "https://files.pythonhosted.org/packages/fc/37/fccd705f795386bb05bf413012fecff2a33e5aa8c2f069096de3e9fd8702/httptools-0.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2a021c3a8e65cc125390d72f59b968afca3bdcaff25bd67965e0a055a14946ca", size = 558497, upload-time = "2026-05-25T22:17:34.732Z" },
1105
+ { url = "https://files.pythonhosted.org/packages/bd/39/f172e8003576de35f5ba77ff417cf0e34429d35dc014deef15afa337a72c/httptools-0.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48774d39cbb70e2b1f71f88852a3087ae1d3a1eb80482bb48c13067ab080c14f", size = 571585, upload-time = "2026-05-25T22:17:35.813Z" },
1106
+ { url = "https://files.pythonhosted.org/packages/3e/b9/f5564760af99f3dbbf3f9104dc00e5da27e96cf433c6bdcf77617f70bf3f/httptools-0.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:88eead8ec8680a9f146c655bc88445a325bd7921cfd8194c7337e9467282427d", size = 543297, upload-time = "2026-05-25T22:17:37.08Z" },
1107
+ { url = "https://files.pythonhosted.org/packages/99/67/8d9f2c313618e161b82f3873188e7196126da1d6e29688df40eb3997c77a/httptools-0.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2c032fa028f46871ec7e1fc59fc15e8023eab3e6bbe6ece786a1611719a5d081", size = 539535, upload-time = "2026-05-25T22:17:38.032Z" },
1108
+ { url = "https://files.pythonhosted.org/packages/48/63/b906c01e53f50d432c0defe43ce52764a111dc1bdd028bafbeb54dcfd008/httptools-0.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:384c17174464c8e873398b7af24f0b1f44d992c820328413951a625323155d77", size = 108209, upload-time = "2026-05-25T22:17:39.473Z" },
1102
1109
  ]
1103
1110
 
1104
1111
  [[package]]
@@ -1160,7 +1167,7 @@ wheels = [
1160
1167
 
1161
1168
  [[package]]
1162
1169
  name = "ipython"
1163
- version = "8.38.0"
1170
+ version = "8.39.0"
1164
1171
  source = { registry = "https://pypi.org/simple" }
1165
1172
  dependencies = [
1166
1173
  { name = "colorama", marker = "sys_platform == 'win32'" },
@@ -1175,9 +1182,9 @@ dependencies = [
1175
1182
  { name = "traitlets" },
1176
1183
  { name = "typing-extensions", marker = "python_full_version < '3.12'" },
1177
1184
  ]
1178
- sdist = { url = "https://files.pythonhosted.org/packages/e5/61/1810830e8b93c72dcd3c0f150c80a00c3deb229562d9423807ec92c3a539/ipython-8.38.0.tar.gz", hash = "sha256:9cfea8c903ce0867cc2f23199ed8545eb741f3a69420bfcf3743ad1cec856d39", size = 5513996, upload-time = "2026-01-05T10:59:06.901Z" }
1185
+ sdist = { url = "https://files.pythonhosted.org/packages/40/18/f8598d287006885e7136451fdea0755af4ebcbfe342836f24deefaed1164/ipython-8.39.0.tar.gz", hash = "sha256:4110ae96012c379b8b6db898a07e186c40a2a1ef5d57a7fa83166047d9da7624", size = 5513971, upload-time = "2026-03-27T10:02:13.94Z" }
1179
1186
  wheels = [
1180
- { url = "https://files.pythonhosted.org/packages/9f/df/db59624f4c71b39717c423409950ac3f2c8b2ce4b0aac843112c7fb3f721/ipython-8.38.0-py3-none-any.whl", hash = "sha256:750162629d800ac65bb3b543a14e7a74b0e88063eac9b92124d4b2aa3f6d8e86", size = 831813, upload-time = "2026-01-05T10:59:04.239Z" },
1187
+ { url = "https://files.pythonhosted.org/packages/c0/56/4cc7fc9e9e3f38fd324f24f8afe0ad8bb5fa41283f37f1aaf9de0612c968/ipython-8.39.0-py3-none-any.whl", hash = "sha256:bb3c51c4fa8148ab1dea07a79584d1c854e234ea44aa1283bcb37bc75054651f", size = 831849, upload-time = "2026-03-27T10:02:07.846Z" },
1181
1188
  ]
1182
1189
 
1183
1190
  [[package]]
@@ -3084,16 +3091,16 @@ wheels = [
3084
3091
 
3085
3092
  [[package]]
3086
3093
  name = "uvicorn"
3087
- version = "0.41.0"
3094
+ version = "0.49.0"
3088
3095
  source = { registry = "https://pypi.org/simple" }
3089
3096
  dependencies = [
3090
3097
  { name = "click" },
3091
3098
  { name = "h11" },
3092
3099
  { name = "typing-extensions", marker = "python_full_version < '3.11'" },
3093
3100
  ]
3094
- sdist = { url = "https://files.pythonhosted.org/packages/32/ce/eeb58ae4ac36fe09e3842eb02e0eb676bf2c53ae062b98f1b2531673efdd/uvicorn-0.41.0.tar.gz", hash = "sha256:09d11cf7008da33113824ee5a1c6422d89fbc2ff476540d69a34c87fab8b571a", size = 82633, upload-time = "2026-02-16T23:07:24.1Z" }
3101
+ sdist = { url = "https://files.pythonhosted.org/packages/c4/1f/fa18009dea8469069cca78a4e877a008ab78f08b064bfc9ab891579077ff/uvicorn-0.49.0.tar.gz", hash = "sha256:ebf4271aa580d9de97f93192d4595176df6e91f9aae919ca73e4fc07df1e66a3", size = 91284, upload-time = "2026-06-03T22:01:30.448Z" }
3095
3102
  wheels = [
3096
- { url = "https://files.pythonhosted.org/packages/83/e4/d04a086285c20886c0daad0e026f250869201013d18f81d9ff5eada73a88/uvicorn-0.41.0-py3-none-any.whl", hash = "sha256:29e35b1d2c36a04b9e180d4007ede3bcb32a85fbdfd6c6aeb3f26839de088187", size = 68783, upload-time = "2026-02-16T23:07:22.357Z" },
3103
+ { url = "https://files.pythonhosted.org/packages/88/fa/e1388bbcf24ef3274f45c0c1c7b501fd14971037c1b6ee23610553307497/uvicorn-0.49.0-py3-none-any.whl", hash = "sha256:ba3d14c3ee7e41c6c654c46c9eb489d33213cdd30aa1696eab1374337c13f68f", size = 71376, upload-time = "2026-06-03T22:01:29.037Z" },
3097
3104
  ]
3098
3105
 
3099
3106
  [package.optional-dependencies]