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.
- {clientele-2.2.0 → clientele-2.2.2}/CHANGELOG.md +8 -0
- {clientele-2.2.0 → clientele-2.2.2}/PKG-INFO +1 -1
- {clientele-2.2.0 → clientele-2.2.2}/SECURITY.md +2 -2
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/generators/clients.py +1 -1
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/api_post_method.jinja2 +1 -1
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/base_clients.py +1 -1
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/basic/templates/client_py.jinja2 +0 -1
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/basic/writer.py +4 -1
- {clientele-2.2.0 → clientele-2.2.2}/clientele/http/httpx_backend.py +2 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/settings.py +1 -1
- {clientele-2.2.0 → clientele-2.2.2}/docs/CHANGELOG.md +8 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/install.md +1 -1
- {clientele-2.2.0 → clientele-2.2.2}/example_openapi_specs/best.json +40 -0
- {clientele-2.2.0 → clientele-2.2.2}/pyproject.toml +1 -1
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/client/MANIFEST.md +1 -1
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/client/MANIFEST.md +1 -1
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/client/MANIFEST.md +1 -1
- {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_api_client_singleton.py +53 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/async_test_client/MANIFEST.md +1 -1
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/async_test_client/client.py +11 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_basic_client/MANIFEST.md +2 -1
- 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
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_client/MANIFEST.md +1 -1
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_client/client.py +11 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/generators/framework/test_framework_generator_integration.py +24 -0
- {clientele-2.2.0 → clientele-2.2.2}/uv.lock +53 -46
- clientele-2.2.0/.claude/settings.local.json +0 -31
- {clientele-2.2.0 → clientele-2.2.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/.github/compatibility.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/.github/dependabot.yml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/.github/pull_request_template.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/.github/workflows/ci.yml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/.gitignore +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/CODE_OF_CONDUCT.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/CONTRIBUTING.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/CONTRIBUTORS.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/LICENSE +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/Makefile +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/PUBLISHING.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/README.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/api/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/api/client.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/api/config.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/api/exceptions.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/api/requests.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/api/stream/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/api/stream/parser.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/api/type_utils.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/cache/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/cache/backends.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/cache/decorator.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/cache/key_generator.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/cache/types.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/cli.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/README.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/generator.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/generators/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/generators/schemas.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/api_get_method.jinja2 +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/client_py.jinja2 +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/config_py.jinja2 +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/manifest.jinja2 +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/pyproject.toml.jinja2 +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/schema_class.jinja2 +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/schema_helpers.jinja2 +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/schema_root_model.jinja2 +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/schema_type_alias.jinja2 +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/schemas_py.jinja2 +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/writer.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/base.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/basic/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/basic/generator.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/basic/templates/config_py.jinja2 +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/basic/templates/manifest.jinja2 +0 -0
- /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
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/cicerone_compat.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/schema_utils.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/shared/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/shared/generators/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/shared/generators/schemas.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/generators/shared/utils.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/graphql/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/graphql/client.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/http/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/http/aiohttp_backend.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/http/backends.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/http/fake_backend.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/http/niquests_backend.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/http/requests_backend.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/http/response.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/http/status_codes.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/mypy.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/py.typed +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/retries/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/retries/decorators.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/schemas.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/testing.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/clientele/utils.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/CNAME +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-async.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-authentication.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-cache.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-configuration.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-direct-requests.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-examples.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-exceptions.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-graphql.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-http-backends.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-logging.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-overview.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-retries.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-stream.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/api-testing.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/clientele_generate.gif +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/clientele_header.png +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/favicon.png +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/index.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/injected-parameters.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/openapi-cli.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/server-django-ninja.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/server-drf.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/docs/server-fastapi.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/example_openapi_specs/complex_schemas.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/example_openapi_specs/issue_248.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/example_openapi_specs/simple.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/example_openapi_specs/test_303.yaml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/mkdocs.yml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/README.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/api.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/client/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/client/client.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/client/config.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/client/pyproject.toml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/client/schemas.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/example_project/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/example_project/settings.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/example_project/urls.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/manage.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_ninja/openapi.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/README.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/client/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/client/client.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/client/config.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/client/pyproject.toml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/client/schemas.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/example_project/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/example_project/settings.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/example_project/urls.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/manage.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/openapi.yaml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/apps.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/migrations/0001_initial.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/migrations/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/models.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/serializers.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/django_rest_framework/users/views.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/README.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/client/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/client/client.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/client/config.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/client/pyproject.toml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/client/schemas.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/main.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/server_examples/fastapi/openapi.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api/retries/test_retry.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api/stream/test_parser.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_api_client.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_api_client_logging.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_api_response_parser.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_api_typed_dict.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_direct_requests.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_requests.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_stream.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_stream_httpx.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api/test_type_utils.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/async_test_client/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/async_test_client/config.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/async_test_client/pyproject.toml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/async_test_client/schemas.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_basic_client/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_basic_client/client.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_basic_client/config.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_client/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_client/config.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_client/pyproject.toml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/api_clients/test_client/schemas.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/cache/fixtures.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/cache/test_backends.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/cache/test_decorator.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/cache/test_integration.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/cache/test_key_generator.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/callback_example.yaml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/complex_api.yaml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/README.md +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/api-with-examples.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/callback-example.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/link-example.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/non-oauth-scopes.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/petstore-expanded.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/petstore.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/tictactoe.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/uspto.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/openapi_examples/webhook-example.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/petstore_openapi3.yaml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/realworld/1password.yaml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/realworld/ably.yaml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/realworld/google.yaml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/realworld/medium.yaml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/realworld/spacetraders.yaml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/realworld/twilio.yaml +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/fixtures/regression/dep_query_alias.json +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/generators/framework/test_framework_generator_coverage.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/generators/integration_utils.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/generators/shared/__init__.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/generators/shared/test_utils.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/generators/shared/test_utils_coverage.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/generators/test_base.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/generators/test_base_and_basic_coverage.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/generators/test_cicerone_compat.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/generators/test_schemas_coverage.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/graphql/test_graphql_client.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/http/backends/test_aiohttp_backend.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/http/backends/test_backend_config.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/http/backends/test_fake_backend.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/http/backends/test_httpx_backend.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/http/backends/test_niquests_backend.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/http/backends/test_requests_backend.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/mypy/mypy_plugin_test_config.ini +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/mypy/test_mypy_plugin.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_additional_coverage.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_cli.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_cli_coverage.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_cli_full_coverage.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_complex_schemas.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_edge_case_coverage.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_fixture_schemas.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_generator_coverage.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_issue_248.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_nullable_fields.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_openapi_31_null_type.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_ref_handling.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_settings.py +0 -0
- {clientele-2.2.0 → clientele-2.2.2}/tests/test_testing_utilities.py +0 -0
- {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)).
|
|
@@ -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 =
|
|
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:
|
{clientele-2.2.0 → clientele-2.2.2}/clientele/generators/api/templates/api_post_method.jinja2
RENAMED
|
@@ -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 =
|
|
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:
|
|
@@ -2,7 +2,10 @@ import pathlib
|
|
|
2
2
|
|
|
3
3
|
import jinja2
|
|
4
4
|
|
|
5
|
-
templates = jinja2.Environment(
|
|
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,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)).
|
|
@@ -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",
|
|
@@ -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")
|
|
@@ -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
|
|
@@ -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.
|
|
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.
|
|
1064
|
-
source = { registry = "https://pypi.org/simple" }
|
|
1065
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1066
|
-
wheels = [
|
|
1067
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1068
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1069
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1070
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1071
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1072
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1073
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1074
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1075
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1076
|
-
{ url = "https://files.pythonhosted.org/packages/cc/
|
|
1077
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1078
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1079
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1080
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1081
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1082
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1083
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1084
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1085
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1086
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1087
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1088
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1089
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1090
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1091
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1092
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1093
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1094
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1095
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1096
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1097
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1098
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1099
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1100
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1101
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
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/
|
|
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/
|
|
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]
|