pyopenapi-gen 0.20.1__tar.gz → 0.21.1__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.
Potentially problematic release.
This version of pyopenapi-gen might be problematic. Click here for more details.
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/CHANGELOG.md +82 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/PKG-INFO +1 -1
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/coverage.xml +83 -62
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/pyproject.toml +2 -2
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/__init__.py +1 -1
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/utils.py +21 -2
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/generators/url_args_generator.py +28 -4
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_utils.py +245 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/emitters/test_endpoints_emitter.py +3 -3
- pyopenapi_gen-0.21.1/tests/integration/test_field_mapping_e2e.py +146 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/generators/test_url_args_generator.py +285 -5
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.bandit +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.cursor/mcp.json +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.cursor/rules/architecture.mdc +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.cursor/rules/coding-conventions.mdc +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.cursor/rules/project-goal.mdc +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.cursor/rules/testing.mdc +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/BRANCH_PROTECTION.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/CLAUDE_CONFIGURATION.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/CODEOWNERS +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/dependabot.yml +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/workflows/ci.yml +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/workflows/claude-auto-approve.yml +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/workflows/claude-review-trigger.yml +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/workflows/claude.yml +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/workflows/pr-checks.yml +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/workflows/production-release.yml.backup +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/workflows/promote-to-staging.yml +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/workflows/semantic-release.yml +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/workflows/staging-publish.yml +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.github/workflows/testpypi-publish.yml +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.gitignore +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.python-version +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/.vscode/settings.json +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/CONTRIBUTING.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/LICENSE +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/Makefile +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/README.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/docs/README.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/docs/architecture.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/docs/endpoint_visitor.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/docs/helpers.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/docs/ir_models.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/docs/line_writer.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/docs/loader.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/docs/model_visitor.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/docs/release-automation.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/docs/render_context.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/docs/unified_type_resolution.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/input/business_swagger.json +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/input/minimal_swagger.json +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/input/minimal_syntax_test.json +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/input/test_name_collision_spec.json +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/mkdocs.yml +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/poetry.lock +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/scripts/sync_version_to_init.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/scripts/validate_version_sync.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/__main__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/cli.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/context/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/context/file_manager.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/context/import_collector.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/context/render_context.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/auth/base.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/auth/plugins.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/exceptions.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/http_status_codes.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/http_transport.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/loader/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/loader/loader.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/loader/operations/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/loader/operations/parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/loader/operations/post_processor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/loader/operations/request_body.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/loader/parameters/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/loader/parameters/parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/loader/responses/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/loader/responses/parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/loader/schemas/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/loader/schemas/extractor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/pagination.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/common/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/existing_schema.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/common/type_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/context.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/cycle_helpers.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/keywords/all_of_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/keywords/any_of_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/keywords/array_items_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/keywords/one_of_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/keywords/properties_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/schema_finalizer.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/schema_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/transformers/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/parsing/unified_cycle_detection.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/postprocess_manager.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/schemas.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/streaming_helpers.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/telemetry.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/warning_collector.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/writers/code_writer.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/writers/documentation_writer.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/writers/line_writer.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core/writers/python_construct_renderer.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/core_package_template/README.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/emit/models_emitter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/emitters/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/emitters/client_emitter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/emitters/core_emitter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/emitters/docs_emitter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/emitters/endpoints_emitter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/emitters/exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/emitters/models_emitter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/generator/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/generator/client_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/endpoint_utils.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/type_cleaner.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/type_helper.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/type_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/type_resolution/array_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/type_resolution/composition_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/type_resolution/finalizer.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/type_resolution/named_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/type_resolution/object_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/type_resolution/primitive_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/type_resolution/resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/helpers/url_utils.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/http_types.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/ir.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/py.typed +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/contracts/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/contracts/protocols.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/contracts/types.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/resolvers/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/resolvers/reference_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/resolvers/response_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/resolvers/schema_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/services/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/services/type_service.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/strategies/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/types/strategies/response_strategy.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/client_visitor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/docs_visitor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/generators/overload_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/generators/request_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/generators/signature_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/processors/import_analyzer.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/exception_visitor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/model/alias_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/model/dataclass_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/model/enum_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/model/model_visitor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/src/pyopenapi_gen/visit/visitor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/api/test_programmatic_api.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/auth/auth_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/auth/test_auth_base.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/auth/test_auth_plugins.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/cli/cli_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/cli/test_cli_backup_diff.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/cli/test_cli_edge_cases.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/cli/test_cli_edge_cases_comprehensive.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/cli/test_cli_internal_utils.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/cli/test_http_pagination_cli.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/context/context_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/context/test_core_import_path.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/context/test_file_manager.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/context/test_import_collector.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/context/test_render_context.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/context/test_render_context_imports.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/context/test_render_context_relative_paths.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/core_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/loader/parameters/test_inline_enum_array_params.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/loader/test_extractor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/loader/test_top_level_enum_extraction.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/common/ref_resolution/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/common/ref_resolution/helpers/test_cyclic_properties.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/common/ref_resolution/helpers/test_direct_cycle.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/common/ref_resolution/helpers/test_existing_schema.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/common/ref_resolution/helpers/test_list_response.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/common/ref_resolution/helpers/test_missing_ref.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/common/ref_resolution/helpers/test_new_schema.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/common/ref_resolution/helpers/test_stripped_suffix.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/keywords/keywords_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/keywords/test_all_of_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/keywords/test_any_of_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/keywords/test_array_items_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/keywords/test_one_of_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/keywords/test_properties_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/parsing_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/test_context.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/test_cycle_detection.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/test_cycle_helpers.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/test_improved_schema_naming.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/test_inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/test_inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/test_logging.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/test_ref_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/test_schema_finalizer.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/test_schema_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/test_schema_parser_list_response.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/parsing/test_type_parser.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_dataclass_serialization.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_detect_circular_imports.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_edge_cases_integration.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_edge_cases_systematic.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_exceptions_module.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_forward_references.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_http_transport.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_import_resolution.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_ir.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_ir_schema.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_loader.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_loader_extensive.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_loader_invalid_refs.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_loader_malformed.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_loader_media_types.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_pagination.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_parsing_context.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_protocol_defaults.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_schema_parser_specific_case.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_schemas.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_simple_self_ref_check.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_streaming_helpers.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_telemetry.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_telemetry_client.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/test_warning_collector.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/writers/test_code_writer.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/writers/test_documentation_writer.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/writers/test_line_writer.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/writers/test_python_construct_renderer_json_wizard.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/core/writers/writers_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/emitters/emitters_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/emitters/test_client_emitter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/emitters/test_docs_emitter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/emitters/test_duplicate_operations.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/emitters/test_exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/emitters/test_list_response_generation.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/emitters/test_models_emitter.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/end_to_end/test_dataclass_serialization_e2e.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/examples/test_developer_experience_demo.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/generation/generation_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/generation/test_external_core_package.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/generation_issues/specs/minimal_addmessage_like.json +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/generation_issues/test_addmessage_like_issues.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/generation_issues/test_agent_include_parameter_typing.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/generation_issues/test_message_batch_response_issue.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/generation_issues/test_overload_naming_issues.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/test_array_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/test_endpoint_utils.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/test_endpoint_utils_extended.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/test_get_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/test_named_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/test_named_type_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/test_object_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/test_put_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/test_type_cleaner.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/test_type_helper.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/test_url_utils.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/helpers/test_utils_helpers.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/integration/test_generated_code_structure.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/integrations/integrations_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/integrations/test_business_swagger_message_type.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/integrations/test_end_to_end_business_swagger.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/integrations/test_end_to_end_petstore.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/integrations/test_name_collisions.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/specs/response_unwrapping_spec.yaml +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/test_analysis_overview.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/test_init.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/types/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/types/test_business_swagger_integration.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/types/test_contracts_types.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/types/test_missing_imports_bug.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/types/test_reference_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/types/test_response_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/types/test_response_strategy.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/types/test_response_strategy_simplified.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/types/test_schema_resolver.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/types/test_schema_resolver_enums.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/types/test_type_service.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/generators/generators_analysis.md +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/generators/test_dataclass_integration.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/generators/test_docstring_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/generators/test_endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/generators/test_match_case_response.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/generators/test_overload_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/generators/test_request_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/generators/test_response_handler_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/generators/test_response_handler_generator_strategy.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/generators/test_signature_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/processors/test_import_analyzer.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/processors/test_import_analyzer.py.bak +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/processors/test_parameter_processor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/endpoint/test_endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/model/test_alias_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/model/test_dataclass_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/model/test_dataclass_generator_json_wizard.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/model/test_enum_generator.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/model/test_json_value_integration.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/model/test_json_value_wrapper.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/test_client_visitor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/test_model_visitor.py +0 -0
- {pyopenapi_gen-0.20.1 → pyopenapi_gen-0.21.1}/tests/visit/test_visitor.py +0 -0
|
@@ -1,6 +1,88 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
## v0.21.1 (2025-10-24)
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
- **codegen**: Fix enum parameter serialization in query, header, and path parameters
|
|
9
|
+
([`be5391f`](https://github.com/mindhiveoy/pyopenapi_gen/commit/be5391ff9fde14a1826aa217c077b06a0f832f8c))
|
|
10
|
+
|
|
11
|
+
Implement consistent parameter serialization using DataclassSerializer.serialize() for query,
|
|
12
|
+
header, and path parameters to handle enum-to-string conversion correctly.
|
|
13
|
+
|
|
14
|
+
Technical changes: - _write_query_params() now wraps all parameter values in
|
|
15
|
+
DataclassSerializer.serialize() - _write_header_params() now wraps all parameter values in
|
|
16
|
+
DataclassSerializer.serialize() - generate_url_and_args() serializes path params before f-string
|
|
17
|
+
interpolation - Added context.add_import() calls to ensure DataclassSerializer is imported in
|
|
18
|
+
generated code
|
|
19
|
+
|
|
20
|
+
Implementation approach: Query/header parameters use DataclassSerializer.serialize() in dict
|
|
21
|
+
construction: Required: "{param}": DataclassSerializer.serialize(param_var)
|
|
22
|
+
|
|
23
|
+
Optional: **{{"{param}": DataclassSerializer.serialize(param_var)} if param_var is not None else {}}
|
|
24
|
+
|
|
25
|
+
Path parameters are serialized before URL construction to prevent enum objects in f-strings (would
|
|
26
|
+
produce "EnumType.VALUE" instead of "value"): param_var = DataclassSerializer.serialize(param_var)
|
|
27
|
+
|
|
28
|
+
Breaking changes: None API changes: None (generated code behavior corrected to match intended
|
|
29
|
+
design)
|
|
30
|
+
|
|
31
|
+
Test coverage: - 5 new TDD tests validate enum serialization for all parameter types - All 1360
|
|
32
|
+
tests passing with 88.43% coverage - Integration tests confirm correct mypy validation and runtime
|
|
33
|
+
behavior
|
|
34
|
+
|
|
35
|
+
Fixes issue where enum parameters (e.g., DocumentStatus.INDEXED) were passed directly to httpx
|
|
36
|
+
instead of being converted to their string values ("indexed"), causing incorrect API calls.
|
|
37
|
+
|
|
38
|
+
Related: business_swagger.json list_documents endpoint with status parameter
|
|
39
|
+
|
|
40
|
+
### Chores
|
|
41
|
+
|
|
42
|
+
- **release**: Sync __init__.py version [skip ci]
|
|
43
|
+
([`823dc4e`](https://github.com/mindhiveoy/pyopenapi_gen/commit/823dc4e7083f17df7323aeebd9a400fd9d7aca5d))
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
## v0.21.0 (2025-10-23)
|
|
47
|
+
|
|
48
|
+
### Bug Fixes
|
|
49
|
+
|
|
50
|
+
- **serialization**: Respect BaseSchema field mappings in DataclassSerializer
|
|
51
|
+
([`ef5d365`](https://github.com/mindhiveoy/pyopenapi_gen/commit/ef5d3656008417bbae17e6370e33e7b0c12cefd6))
|
|
52
|
+
|
|
53
|
+
BREAKING CHANGE: DataclassSerializer now correctly maps Python snake_case field names to API
|
|
54
|
+
camelCase field names when serializing BaseSchema instances.
|
|
55
|
+
|
|
56
|
+
Problem: DataclassSerializer.serialize() was using Python field names (snake_case) directly as
|
|
57
|
+
dictionary keys, ignoring the field name mappings defined in
|
|
58
|
+
BaseSchema.Meta.key_transform_with_load. This caused API requests to send incorrect field names,
|
|
59
|
+
breaking communication with camelCase APIs.
|
|
60
|
+
|
|
61
|
+
Solution: Modified DataclassSerializer._serialize_with_tracking() to detect BaseSchema instances and
|
|
62
|
+
use their to_dict() method, which properly handles field name mapping. Falls back to original
|
|
63
|
+
behavior for plain dataclasses to maintain backwards compatibility.
|
|
64
|
+
|
|
65
|
+
Changes: - Updated DataclassSerializer._serialize_with_tracking() in core/utils.py - Added 5
|
|
66
|
+
comprehensive unit tests for field mapping scenarios - Added 2 end-to-end integration tests with
|
|
67
|
+
business_swagger.json - All existing tests pass with 88.42% coverage (exceeds 85% requirement)
|
|
68
|
+
|
|
69
|
+
Example: Before: {"data_source_id": "123"} ❌
|
|
70
|
+
|
|
71
|
+
After: {"dataSourceId": "123"} ✅
|
|
72
|
+
|
|
73
|
+
Fixes critical bug affecting all generated clients with camelCase APIs.
|
|
74
|
+
|
|
75
|
+
### Chores
|
|
76
|
+
|
|
77
|
+
- **release**: Sync __init__.py version [skip ci]
|
|
78
|
+
([`446d496`](https://github.com/mindhiveoy/pyopenapi_gen/commit/446d4963a1e8428da7b6476088104aac599dae8f))
|
|
79
|
+
|
|
80
|
+
### Breaking Changes
|
|
81
|
+
|
|
82
|
+
- **serialization**: Dataclassserializer now correctly maps Python snake_case field names to API
|
|
83
|
+
camelCase field names when serializing BaseSchema instances.
|
|
84
|
+
|
|
85
|
+
|
|
4
86
|
## v0.20.1 (2025-10-21)
|
|
5
87
|
|
|
6
88
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyopenapi-gen
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.21.1
|
|
4
4
|
Summary: Modern, async-first Python client generator for OpenAPI specifications with advanced cycle detection and unified type resolution
|
|
5
5
|
Project-URL: Homepage, https://github.com/your-org/pyopenapi-gen
|
|
6
6
|
Project-URL: Documentation, https://github.com/your-org/pyopenapi-gen/blob/main/README.md
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<?xml version="1.0" ?>
|
|
2
|
-
<coverage version="7.10.7" timestamp="
|
|
2
|
+
<coverage version="7.10.7" timestamp="1761323025794" lines-valid="6528" lines-covered="5773" line-rate="0.8843" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
|
|
3
3
|
<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.10.7 -->
|
|
4
4
|
<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
|
|
5
5
|
<sources>
|
|
@@ -652,7 +652,7 @@
|
|
|
652
652
|
</class>
|
|
653
653
|
</classes>
|
|
654
654
|
</package>
|
|
655
|
-
<package name="pyopenapi_gen.core" line-rate="0.
|
|
655
|
+
<package name="pyopenapi_gen.core" line-rate="0.836" branch-rate="0" complexity="0">
|
|
656
656
|
<classes>
|
|
657
657
|
<class name="__init__.py" filename="pyopenapi_gen/core/__init__.py" complexity="0" line-rate="1" branch-rate="0">
|
|
658
658
|
<methods/>
|
|
@@ -1053,7 +1053,7 @@
|
|
|
1053
1053
|
<line number="69" hits="1"/>
|
|
1054
1054
|
</lines>
|
|
1055
1055
|
</class>
|
|
1056
|
-
<class name="utils.py" filename="pyopenapi_gen/core/utils.py" complexity="0" line-rate="0.
|
|
1056
|
+
<class name="utils.py" filename="pyopenapi_gen/core/utils.py" complexity="0" line-rate="0.9392" branch-rate="0">
|
|
1057
1057
|
<methods/>
|
|
1058
1058
|
<lines>
|
|
1059
1059
|
<line number="6" hits="1"/>
|
|
@@ -1173,59 +1173,70 @@
|
|
|
1173
1173
|
<line number="313" hits="1"/>
|
|
1174
1174
|
<line number="320" hits="1"/>
|
|
1175
1175
|
<line number="321" hits="1"/>
|
|
1176
|
-
<line number="339" hits="1"/>
|
|
1177
1176
|
<line number="341" hits="1"/>
|
|
1178
|
-
<line number="
|
|
1177
|
+
<line number="343" hits="1"/>
|
|
1179
1178
|
<line number="344" hits="1"/>
|
|
1180
|
-
<line number="
|
|
1181
|
-
<line number="
|
|
1182
|
-
<line number="
|
|
1183
|
-
<line number="
|
|
1179
|
+
<line number="346" hits="1"/>
|
|
1180
|
+
<line number="349" hits="1"/>
|
|
1181
|
+
<line number="350" hits="1"/>
|
|
1182
|
+
<line number="353" hits="1"/>
|
|
1184
1183
|
<line number="354" hits="1"/>
|
|
1185
|
-
<line number="
|
|
1186
|
-
<line number="
|
|
1187
|
-
<line number="
|
|
1188
|
-
<line number="
|
|
1189
|
-
<line number="
|
|
1190
|
-
<line number="
|
|
1191
|
-
<line number="
|
|
1192
|
-
<line number="368" hits="1"/>
|
|
1193
|
-
<line number="369" hits="1"/>
|
|
1184
|
+
<line number="356" hits="1"/>
|
|
1185
|
+
<line number="357" hits="1"/>
|
|
1186
|
+
<line number="358" hits="0"/>
|
|
1187
|
+
<line number="361" hits="1"/>
|
|
1188
|
+
<line number="362" hits="1"/>
|
|
1189
|
+
<line number="365" hits="1"/>
|
|
1190
|
+
<line number="366" hits="1"/>
|
|
1194
1191
|
<line number="370" hits="1"/>
|
|
1195
1192
|
<line number="371" hits="1"/>
|
|
1196
1193
|
<line number="372" hits="1"/>
|
|
1197
1194
|
<line number="374" hits="1"/>
|
|
1198
|
-
<line number="375" hits="1"/>
|
|
1199
1195
|
<line number="376" hits="1"/>
|
|
1200
1196
|
<line number="377" hits="1"/>
|
|
1201
1197
|
<line number="378" hits="1"/>
|
|
1198
|
+
<line number="379" hits="1"/>
|
|
1202
1199
|
<line number="380" hits="1"/>
|
|
1200
|
+
<line number="381" hits="1"/>
|
|
1203
1201
|
<line number="383" hits="1"/>
|
|
1204
|
-
<line number="
|
|
1202
|
+
<line number="386" hits="1"/>
|
|
1205
1203
|
<line number="387" hits="1"/>
|
|
1206
1204
|
<line number="388" hits="1"/>
|
|
1207
1205
|
<line number="389" hits="1"/>
|
|
1208
1206
|
<line number="390" hits="1"/>
|
|
1209
1207
|
<line number="391" hits="1"/>
|
|
1210
|
-
<line number="392" hits="1"/>
|
|
1211
1208
|
<line number="393" hits="1"/>
|
|
1209
|
+
<line number="394" hits="1"/>
|
|
1210
|
+
<line number="395" hits="1"/>
|
|
1212
1211
|
<line number="396" hits="1"/>
|
|
1213
1212
|
<line number="397" hits="1"/>
|
|
1214
|
-
<line number="
|
|
1213
|
+
<line number="399" hits="1"/>
|
|
1215
1214
|
<line number="402" hits="1"/>
|
|
1216
1215
|
<line number="403" hits="1"/>
|
|
1217
|
-
<line number="404" hits="1"/>
|
|
1218
|
-
<line number="405" hits="1"/>
|
|
1219
1216
|
<line number="406" hits="1"/>
|
|
1220
1217
|
<line number="407" hits="1"/>
|
|
1221
1218
|
<line number="408" hits="1"/>
|
|
1222
1219
|
<line number="409" hits="1"/>
|
|
1223
1220
|
<line number="410" hits="1"/>
|
|
1224
1221
|
<line number="411" hits="1"/>
|
|
1225
|
-
<line number="
|
|
1226
|
-
<line number="
|
|
1227
|
-
<line number="
|
|
1228
|
-
<line number="419" hits="
|
|
1222
|
+
<line number="412" hits="1"/>
|
|
1223
|
+
<line number="415" hits="1"/>
|
|
1224
|
+
<line number="416" hits="1"/>
|
|
1225
|
+
<line number="419" hits="1"/>
|
|
1226
|
+
<line number="421" hits="1"/>
|
|
1227
|
+
<line number="422" hits="1"/>
|
|
1228
|
+
<line number="423" hits="1"/>
|
|
1229
|
+
<line number="424" hits="1"/>
|
|
1230
|
+
<line number="425" hits="1"/>
|
|
1231
|
+
<line number="426" hits="1"/>
|
|
1232
|
+
<line number="427" hits="1"/>
|
|
1233
|
+
<line number="428" hits="1"/>
|
|
1234
|
+
<line number="429" hits="1"/>
|
|
1235
|
+
<line number="430" hits="1"/>
|
|
1236
|
+
<line number="432" hits="1"/>
|
|
1237
|
+
<line number="435" hits="0"/>
|
|
1238
|
+
<line number="436" hits="0"/>
|
|
1239
|
+
<line number="438" hits="0"/>
|
|
1229
1240
|
</lines>
|
|
1230
1241
|
</class>
|
|
1231
1242
|
<class name="warning_collector.py" filename="pyopenapi_gen/core/warning_collector.py" complexity="0" line-rate="1" branch-rate="0">
|
|
@@ -6008,7 +6019,7 @@
|
|
|
6008
6019
|
</class>
|
|
6009
6020
|
</classes>
|
|
6010
6021
|
</package>
|
|
6011
|
-
<package name="pyopenapi_gen.visit.endpoint.generators" line-rate="0.
|
|
6022
|
+
<package name="pyopenapi_gen.visit.endpoint.generators" line-rate="0.89" branch-rate="0" complexity="0">
|
|
6012
6023
|
<classes>
|
|
6013
6024
|
<class name="__init__.py" filename="pyopenapi_gen/visit/endpoint/generators/__init__.py" complexity="0" line-rate="1" branch-rate="0">
|
|
6014
6025
|
<methods/>
|
|
@@ -6658,7 +6669,7 @@
|
|
|
6658
6669
|
<line number="83" hits="1"/>
|
|
6659
6670
|
</lines>
|
|
6660
6671
|
</class>
|
|
6661
|
-
<class name="url_args_generator.py" filename="pyopenapi_gen/visit/endpoint/generators/url_args_generator.py" complexity="0" line-rate="0.
|
|
6672
|
+
<class name="url_args_generator.py" filename="pyopenapi_gen/visit/endpoint/generators/url_args_generator.py" complexity="0" line-rate="0.9895" branch-rate="0">
|
|
6662
6673
|
<methods/>
|
|
6663
6674
|
<lines>
|
|
6664
6675
|
<line number="5" hits="1"/>
|
|
@@ -6678,74 +6689,84 @@
|
|
|
6678
6689
|
<line number="41" hits="1"/>
|
|
6679
6690
|
<line number="42" hits="1"/>
|
|
6680
6691
|
<line number="44" hits="0"/>
|
|
6681
|
-
<line number="46" hits="1"/>
|
|
6682
6692
|
<line number="47" hits="1"/>
|
|
6683
|
-
<line number="48" hits="1"/>
|
|
6684
6693
|
<line number="49" hits="1"/>
|
|
6694
|
+
<line number="50" hits="1"/>
|
|
6685
6695
|
<line number="51" hits="1"/>
|
|
6686
6696
|
<line number="52" hits="1"/>
|
|
6697
|
+
<line number="54" hits="1"/>
|
|
6687
6698
|
<line number="55" hits="1"/>
|
|
6688
6699
|
<line number="60" hits="1"/>
|
|
6689
|
-
<line number="
|
|
6690
|
-
<line number="
|
|
6691
|
-
<line number="
|
|
6692
|
-
<line number="73" hits="1"/>
|
|
6693
|
-
<line number="74" hits="1"/>
|
|
6700
|
+
<line number="65" hits="1"/>
|
|
6701
|
+
<line number="72" hits="1"/>
|
|
6702
|
+
<line number="75" hits="1"/>
|
|
6694
6703
|
<line number="76" hits="1"/>
|
|
6695
|
-
<line number="
|
|
6704
|
+
<line number="78" hits="1"/>
|
|
6705
|
+
<line number="79" hits="1"/>
|
|
6696
6706
|
<line number="82" hits="1"/>
|
|
6697
|
-
<line number="
|
|
6707
|
+
<line number="83" hits="1"/>
|
|
6708
|
+
<line number="85" hits="1"/>
|
|
6709
|
+
<line number="86" hits="1"/>
|
|
6710
|
+
<line number="93" hits="1"/>
|
|
6698
6711
|
<line number="98" hits="1"/>
|
|
6699
|
-
<line number="99" hits="1"/>
|
|
6700
|
-
<line number="100" hits="1"/>
|
|
6701
|
-
<line number="104" hits="1"/>
|
|
6702
|
-
<line number="105" hits="1"/>
|
|
6703
|
-
<line number="106" hits="1"/>
|
|
6704
|
-
<line number="107" hits="1"/>
|
|
6705
|
-
<line number="108" hits="1"/>
|
|
6706
|
-
<line number="110" hits="1"/>
|
|
6707
|
-
<line number="112" hits="1"/>
|
|
6708
6712
|
<line number="113" hits="1"/>
|
|
6713
|
+
<line number="114" hits="1"/>
|
|
6709
6714
|
<line number="116" hits="1"/>
|
|
6710
6715
|
<line number="117" hits="1"/>
|
|
6711
6716
|
<line number="118" hits="1"/>
|
|
6712
6717
|
<line number="119" hits="1"/>
|
|
6713
6718
|
<line number="120" hits="1"/>
|
|
6714
6719
|
<line number="122" hits="1"/>
|
|
6720
|
+
<line number="123" hits="1"/>
|
|
6715
6721
|
<line number="124" hits="1"/>
|
|
6716
|
-
<line number="
|
|
6722
|
+
<line number="128" hits="1"/>
|
|
6717
6723
|
<line number="129" hits="1"/>
|
|
6724
|
+
<line number="130" hits="1"/>
|
|
6718
6725
|
<line number="131" hits="1"/>
|
|
6719
|
-
<line number="
|
|
6726
|
+
<line number="132" hits="1"/>
|
|
6720
6727
|
<line number="134" hits="1"/>
|
|
6721
|
-
<line number="135" hits="1"/>
|
|
6722
6728
|
<line number="136" hits="1"/>
|
|
6723
6729
|
<line number="137" hits="1"/>
|
|
6724
|
-
<line number="
|
|
6730
|
+
<line number="140" hits="1"/>
|
|
6731
|
+
<line number="141" hits="1"/>
|
|
6725
6732
|
<line number="142" hits="1"/>
|
|
6733
|
+
<line number="143" hits="1"/>
|
|
6734
|
+
<line number="144" hits="1"/>
|
|
6726
6735
|
<line number="146" hits="1"/>
|
|
6727
|
-
<line number="147" hits="1"/>
|
|
6728
6736
|
<line number="148" hits="1"/>
|
|
6729
6737
|
<line number="149" hits="1"/>
|
|
6730
|
-
<line number="150" hits="1"/>
|
|
6731
|
-
<line number="151" hits="1"/>
|
|
6732
|
-
<line number="152" hits="1"/>
|
|
6733
6738
|
<line number="153" hits="1"/>
|
|
6734
6739
|
<line number="155" hits="1"/>
|
|
6740
|
+
<line number="157" hits="1"/>
|
|
6741
|
+
<line number="158" hits="1"/>
|
|
6735
6742
|
<line number="159" hits="1"/>
|
|
6736
6743
|
<line number="160" hits="1"/>
|
|
6737
6744
|
<line number="161" hits="1"/>
|
|
6738
6745
|
<line number="162" hits="1"/>
|
|
6739
|
-
<line number="
|
|
6740
|
-
<line number="
|
|
6741
|
-
<line number="
|
|
6746
|
+
<line number="166" hits="1"/>
|
|
6747
|
+
<line number="170" hits="1"/>
|
|
6748
|
+
<line number="171" hits="1"/>
|
|
6749
|
+
<line number="172" hits="1"/>
|
|
6742
6750
|
<line number="173" hits="1"/>
|
|
6743
6751
|
<line number="174" hits="1"/>
|
|
6744
6752
|
<line number="175" hits="1"/>
|
|
6745
|
-
<line number="
|
|
6746
|
-
<line number="
|
|
6747
|
-
<line number="
|
|
6753
|
+
<line number="176" hits="1"/>
|
|
6754
|
+
<line number="177" hits="1"/>
|
|
6755
|
+
<line number="179" hits="1"/>
|
|
6748
6756
|
<line number="183" hits="1"/>
|
|
6757
|
+
<line number="184" hits="1"/>
|
|
6758
|
+
<line number="185" hits="1"/>
|
|
6759
|
+
<line number="186" hits="1"/>
|
|
6760
|
+
<line number="189" hits="1"/>
|
|
6761
|
+
<line number="192" hits="1"/>
|
|
6762
|
+
<line number="193" hits="1"/>
|
|
6763
|
+
<line number="197" hits="1"/>
|
|
6764
|
+
<line number="198" hits="1"/>
|
|
6765
|
+
<line number="199" hits="1"/>
|
|
6766
|
+
<line number="202" hits="1"/>
|
|
6767
|
+
<line number="204" hits="1"/>
|
|
6768
|
+
<line number="205" hits="1"/>
|
|
6769
|
+
<line number="207" hits="1"/>
|
|
6749
6770
|
</lines>
|
|
6750
6771
|
</class>
|
|
6751
6772
|
</classes>
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyopenapi-gen"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.21.1"
|
|
8
8
|
description = "Modern, async-first Python client generator for OpenAPI specifications with advanced cycle detection and unified type resolution"
|
|
9
9
|
authors = [{ name = "Mindhive Oy", email = "contact@mindhive.fi" }]
|
|
10
10
|
maintainers = [{ name = "Ville Venäläinen | Mindhive Oy", email = "ville@mindhive.fi" }]
|
|
@@ -140,7 +140,7 @@ pyopenapi-gen = "pyopenapi_gen.cli:app"
|
|
|
140
140
|
|
|
141
141
|
[tool.commitizen]
|
|
142
142
|
name = "cz_conventional_commits"
|
|
143
|
-
version = "0.
|
|
143
|
+
version = "0.21.1"
|
|
144
144
|
version_files = [
|
|
145
145
|
"pyproject.toml:version",
|
|
146
146
|
"src/pyopenapi_gen/__init__.py:__version__"
|
|
@@ -50,7 +50,7 @@ __all__ = [
|
|
|
50
50
|
]
|
|
51
51
|
|
|
52
52
|
# Semantic version of the generator core – automatically managed by semantic-release.
|
|
53
|
-
__version__: str = "0.
|
|
53
|
+
__version__: str = "0.21.1"
|
|
54
54
|
|
|
55
55
|
# ---------------------------------------------------------------------------
|
|
56
56
|
# Lazy-loading and autocompletion support (This part remains)
|
|
@@ -328,10 +328,12 @@ class DataclassSerializer:
|
|
|
328
328
|
The serialized object with dataclasses converted to dictionaries.
|
|
329
329
|
|
|
330
330
|
Handles:
|
|
331
|
-
-
|
|
331
|
+
- BaseSchema instances: Uses to_dict() method with field name mapping (e.g., snake_case -> camelCase)
|
|
332
|
+
- Regular dataclass instances: Converted to dictionaries using field names
|
|
332
333
|
- Lists: Recursively serialize each item
|
|
333
334
|
- Dictionaries: Recursively serialize values
|
|
334
335
|
- datetime: Convert to ISO format string
|
|
336
|
+
- Enums: Convert to their value
|
|
335
337
|
- Primitives: Return unchanged
|
|
336
338
|
- None values: Excluded from output
|
|
337
339
|
"""
|
|
@@ -363,7 +365,24 @@ class DataclassSerializer:
|
|
|
363
365
|
if isinstance(obj, Enum) and not isinstance(obj, type):
|
|
364
366
|
return obj.value
|
|
365
367
|
|
|
366
|
-
# Handle
|
|
368
|
+
# Handle BaseSchema instances (respects field name mappings)
|
|
369
|
+
# Check for BaseSchema by looking for both to_dict and _get_field_mappings methods
|
|
370
|
+
if hasattr(obj, "to_dict") and hasattr(obj, "_get_field_mappings") and callable(obj.to_dict):
|
|
371
|
+
visited.add(obj_id)
|
|
372
|
+
try:
|
|
373
|
+
# Use BaseSchema's to_dict() which handles field name mapping
|
|
374
|
+
result_dict = obj.to_dict(exclude_none=True)
|
|
375
|
+
# Recursively serialize nested objects in the result
|
|
376
|
+
serialized_result = {}
|
|
377
|
+
for key, value in result_dict.items():
|
|
378
|
+
serialized_value = DataclassSerializer._serialize_with_tracking(value, visited)
|
|
379
|
+
if serialized_value is not None:
|
|
380
|
+
serialized_result[key] = serialized_value
|
|
381
|
+
return serialized_result
|
|
382
|
+
finally:
|
|
383
|
+
visited.discard(obj_id)
|
|
384
|
+
|
|
385
|
+
# Handle regular dataclass instances (no field mapping)
|
|
367
386
|
if dataclasses.is_dataclass(obj) and not isinstance(obj, type):
|
|
368
387
|
visited.add(obj_id)
|
|
369
388
|
try:
|
|
@@ -43,17 +43,22 @@ class EndpointUrlArgsGenerator:
|
|
|
43
43
|
# writer.write_line("# No query parameters to write") # Optional: for clarity during debugging
|
|
44
44
|
return
|
|
45
45
|
|
|
46
|
+
# Import DataclassSerializer since we use it for parameter serialization
|
|
47
|
+
context.add_import(f"{context.core_package_name}.utils", "DataclassSerializer")
|
|
48
|
+
|
|
46
49
|
for i, p in enumerate(query_params_to_write):
|
|
47
50
|
param_var_name = NameSanitizer.sanitize_method_name(p["name"]) # Ensure name is sanitized
|
|
48
51
|
original_param_name = p["original_name"]
|
|
49
52
|
line_end = "," # Always add comma, let formatter handle final one if needed
|
|
50
53
|
|
|
51
54
|
if p.get("required", False):
|
|
52
|
-
writer.write_line(
|
|
55
|
+
writer.write_line(
|
|
56
|
+
f' "{original_param_name}": DataclassSerializer.serialize({param_var_name}){line_end}'
|
|
57
|
+
)
|
|
53
58
|
else:
|
|
54
59
|
# Using dict unpacking for conditional parameters
|
|
55
60
|
writer.write_line(
|
|
56
|
-
f' **({{"{original_param_name}": {param_var_name}}} '
|
|
61
|
+
f' **({{"{original_param_name}": DataclassSerializer.serialize({param_var_name})}} '
|
|
57
62
|
f"if {param_var_name} is not None else {{}}){line_end}"
|
|
58
63
|
)
|
|
59
64
|
|
|
@@ -66,6 +71,10 @@ class EndpointUrlArgsGenerator:
|
|
|
66
71
|
# if ordered_params is the sole source of truth for method params.
|
|
67
72
|
header_params_to_write = [p for p in ordered_params if p.get("param_in") == "header"]
|
|
68
73
|
|
|
74
|
+
# Import DataclassSerializer since we use it for parameter serialization
|
|
75
|
+
if header_params_to_write:
|
|
76
|
+
context.add_import(f"{context.core_package_name}.utils", "DataclassSerializer")
|
|
77
|
+
|
|
69
78
|
for p_info in header_params_to_write:
|
|
70
79
|
param_var_name = NameSanitizer.sanitize_method_name(
|
|
71
80
|
p_info["name"]
|
|
@@ -74,13 +83,15 @@ class EndpointUrlArgsGenerator:
|
|
|
74
83
|
line_end = ","
|
|
75
84
|
|
|
76
85
|
if p_info.get("required", False):
|
|
77
|
-
writer.write_line(
|
|
86
|
+
writer.write_line(
|
|
87
|
+
f' "{original_header_name}": DataclassSerializer.serialize({param_var_name}){line_end}'
|
|
88
|
+
)
|
|
78
89
|
else:
|
|
79
90
|
# Conditional inclusion for optional headers
|
|
80
91
|
# This assumes that if an optional header parameter is None, it should not be sent.
|
|
81
92
|
# If specific behavior (e.g. empty string) is needed for None, logic would adjust.
|
|
82
93
|
writer.write_line(
|
|
83
|
-
f' **({{"{original_header_name}": {param_var_name}}} '
|
|
94
|
+
f' **({{"{original_header_name}": DataclassSerializer.serialize({param_var_name})}} '
|
|
84
95
|
f"if {param_var_name} is not None else {{}}){line_end}"
|
|
85
96
|
)
|
|
86
97
|
|
|
@@ -95,6 +106,19 @@ class EndpointUrlArgsGenerator:
|
|
|
95
106
|
) -> bool:
|
|
96
107
|
"""Writes URL, query, and header parameters. Returns True if header params were written."""
|
|
97
108
|
# Main logic from EndpointMethodGenerator._write_url_and_args
|
|
109
|
+
|
|
110
|
+
# Serialize path parameters before URL construction
|
|
111
|
+
# This ensures enums, dates, and other complex types are converted to strings
|
|
112
|
+
# before f-string interpolation in the URL
|
|
113
|
+
path_params = [p for p in ordered_params if p.get("param_in") == "path"]
|
|
114
|
+
if path_params:
|
|
115
|
+
# Import DataclassSerializer since we use it for parameter serialization
|
|
116
|
+
context.add_import(f"{context.core_package_name}.utils", "DataclassSerializer")
|
|
117
|
+
for p in path_params:
|
|
118
|
+
param_var_name = NameSanitizer.sanitize_method_name(p["name"])
|
|
119
|
+
writer.write_line(f"{param_var_name} = DataclassSerializer.serialize({param_var_name})")
|
|
120
|
+
writer.write_line("") # Blank line after path param serialization
|
|
121
|
+
|
|
98
122
|
url_expr = self._build_url_with_path_vars(op.path)
|
|
99
123
|
writer.write_line(f"url = {url_expr}")
|
|
100
124
|
writer.write_line("") # Add a blank line for readability
|