pyopenapi-gen 0.20.0__tar.gz → 0.21.0__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.0 → pyopenapi_gen-0.21.0}/CHANGELOG.md +87 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/PKG-INFO +1 -1
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/coverage.xml +94 -81
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/pyproject.toml +2 -2
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/__init__.py +1 -1
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/utils.py +21 -2
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py +2 -2
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/generators/overload_generator.py +9 -2
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_utils.py +245 -0
- pyopenapi_gen-0.21.0/tests/generation_issues/test_overload_naming_issues.py +203 -0
- pyopenapi_gen-0.21.0/tests/integration/test_field_mapping_e2e.py +146 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/generators/test_endpoint_method_generator.py +61 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/generators/test_overload_generator.py +84 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.bandit +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.cursor/mcp.json +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.cursor/rules/architecture.mdc +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.cursor/rules/coding-conventions.mdc +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.cursor/rules/project-goal.mdc +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.cursor/rules/testing.mdc +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/BRANCH_PROTECTION.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/CLAUDE_CONFIGURATION.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/CODEOWNERS +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/dependabot.yml +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/workflows/ci.yml +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/workflows/claude-auto-approve.yml +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/workflows/claude-review-trigger.yml +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/workflows/claude.yml +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/workflows/pr-checks.yml +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/workflows/production-release.yml.backup +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/workflows/promote-to-staging.yml +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/workflows/semantic-release.yml +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/workflows/staging-publish.yml +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.github/workflows/testpypi-publish.yml +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.gitignore +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.python-version +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/.vscode/settings.json +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/CONTRIBUTING.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/LICENSE +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/Makefile +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/README.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/docs/README.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/docs/architecture.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/docs/endpoint_visitor.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/docs/helpers.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/docs/ir_models.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/docs/line_writer.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/docs/loader.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/docs/model_visitor.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/docs/release-automation.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/docs/render_context.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/docs/unified_type_resolution.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/input/business_swagger.json +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/input/minimal_swagger.json +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/input/minimal_syntax_test.json +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/input/test_name_collision_spec.json +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/mkdocs.yml +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/poetry.lock +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/scripts/sync_version_to_init.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/scripts/validate_version_sync.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/__main__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/cli.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/context/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/context/file_manager.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/context/import_collector.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/context/render_context.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/auth/base.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/auth/plugins.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/exceptions.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/http_status_codes.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/http_transport.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/loader/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/loader/loader.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/loader/operations/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/loader/operations/parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/loader/operations/post_processor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/loader/operations/request_body.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/loader/parameters/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/loader/parameters/parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/loader/responses/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/loader/responses/parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/loader/schemas/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/loader/schemas/extractor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/pagination.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/common/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/existing_schema.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/common/type_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/context.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/cycle_helpers.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/keywords/all_of_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/keywords/any_of_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/keywords/array_items_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/keywords/one_of_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/keywords/properties_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/schema_finalizer.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/schema_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/transformers/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/parsing/unified_cycle_detection.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/postprocess_manager.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/schemas.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/streaming_helpers.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/telemetry.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/warning_collector.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/writers/code_writer.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/writers/documentation_writer.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/writers/line_writer.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core/writers/python_construct_renderer.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/core_package_template/README.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/emit/models_emitter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/emitters/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/emitters/client_emitter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/emitters/core_emitter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/emitters/docs_emitter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/emitters/endpoints_emitter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/emitters/exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/emitters/models_emitter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/generator/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/generator/client_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/endpoint_utils.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/type_cleaner.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/type_helper.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/type_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/type_resolution/array_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/type_resolution/composition_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/type_resolution/finalizer.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/type_resolution/named_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/type_resolution/object_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/type_resolution/primitive_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/type_resolution/resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/helpers/url_utils.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/http_types.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/ir.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/py.typed +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/contracts/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/contracts/protocols.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/contracts/types.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/resolvers/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/resolvers/reference_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/resolvers/response_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/resolvers/schema_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/services/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/services/type_service.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/strategies/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/types/strategies/response_strategy.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/CLAUDE.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/client_visitor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/docs_visitor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/generators/request_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/generators/signature_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/generators/url_args_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/processors/import_analyzer.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/exception_visitor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/model/alias_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/model/dataclass_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/model/enum_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/model/model_visitor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/src/pyopenapi_gen/visit/visitor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/api/test_programmatic_api.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/auth/auth_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/auth/test_auth_base.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/auth/test_auth_plugins.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/cli/cli_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/cli/test_cli_backup_diff.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/cli/test_cli_edge_cases.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/cli/test_cli_edge_cases_comprehensive.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/cli/test_cli_internal_utils.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/cli/test_http_pagination_cli.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/context/context_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/context/test_core_import_path.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/context/test_file_manager.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/context/test_import_collector.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/context/test_render_context.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/context/test_render_context_imports.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/context/test_render_context_relative_paths.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/core_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/loader/parameters/test_inline_enum_array_params.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/loader/test_extractor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/loader/test_top_level_enum_extraction.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/common/ref_resolution/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/common/ref_resolution/helpers/test_cyclic_properties.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/common/ref_resolution/helpers/test_direct_cycle.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/common/ref_resolution/helpers/test_existing_schema.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/common/ref_resolution/helpers/test_list_response.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/common/ref_resolution/helpers/test_missing_ref.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/common/ref_resolution/helpers/test_new_schema.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/common/ref_resolution/helpers/test_stripped_suffix.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/keywords/keywords_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/keywords/test_all_of_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/keywords/test_any_of_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/keywords/test_array_items_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/keywords/test_one_of_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/keywords/test_properties_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/parsing_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/test_context.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/test_cycle_detection.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/test_cycle_helpers.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/test_improved_schema_naming.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/test_inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/test_inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/test_logging.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/test_ref_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/test_schema_finalizer.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/test_schema_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/test_schema_parser_list_response.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/parsing/test_type_parser.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_dataclass_serialization.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_detect_circular_imports.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_edge_cases_integration.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_edge_cases_systematic.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_exceptions_module.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_forward_references.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_http_transport.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_import_resolution.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_ir.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_ir_schema.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_loader.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_loader_extensive.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_loader_invalid_refs.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_loader_malformed.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_loader_media_types.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_pagination.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_parsing_context.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_protocol_defaults.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_schema_parser_specific_case.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_schemas.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_simple_self_ref_check.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_streaming_helpers.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_telemetry.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_telemetry_client.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/test_warning_collector.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/writers/test_code_writer.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/writers/test_documentation_writer.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/writers/test_line_writer.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/writers/test_python_construct_renderer_json_wizard.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/core/writers/writers_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/emitters/emitters_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/emitters/test_client_emitter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/emitters/test_docs_emitter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/emitters/test_duplicate_operations.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/emitters/test_endpoints_emitter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/emitters/test_exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/emitters/test_list_response_generation.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/emitters/test_models_emitter.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/end_to_end/test_dataclass_serialization_e2e.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/examples/test_developer_experience_demo.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/generation/generation_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/generation/test_external_core_package.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/generation_issues/specs/minimal_addmessage_like.json +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/generation_issues/test_addmessage_like_issues.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/generation_issues/test_agent_include_parameter_typing.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/generation_issues/test_message_batch_response_issue.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/test_array_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/test_endpoint_utils.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/test_endpoint_utils_extended.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/test_get_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/test_named_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/test_named_type_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/test_object_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/test_put_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/test_type_cleaner.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/test_type_helper.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/test_url_utils.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/helpers/test_utils_helpers.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/integration/test_generated_code_structure.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/integrations/integrations_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/integrations/test_business_swagger_message_type.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/integrations/test_end_to_end_business_swagger.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/integrations/test_end_to_end_petstore.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/integrations/test_name_collisions.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/specs/response_unwrapping_spec.yaml +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/test_analysis_overview.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/test_init.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/types/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/types/test_business_swagger_integration.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/types/test_contracts_types.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/types/test_missing_imports_bug.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/types/test_reference_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/types/test_response_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/types/test_response_strategy.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/types/test_response_strategy_simplified.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/types/test_schema_resolver.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/types/test_schema_resolver_enums.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/types/test_type_service.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/generators/generators_analysis.md +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/generators/test_dataclass_integration.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/generators/test_docstring_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/generators/test_match_case_response.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/generators/test_request_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/generators/test_response_handler_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/generators/test_response_handler_generator_strategy.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/generators/test_signature_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/generators/test_url_args_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/processors/test_import_analyzer.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/processors/test_import_analyzer.py.bak +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/processors/test_parameter_processor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/endpoint/test_endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/model/test_alias_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/model/test_dataclass_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/model/test_dataclass_generator_json_wizard.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/model/test_enum_generator.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/model/test_json_value_integration.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/model/test_json_value_wrapper.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/test_client_visitor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/test_model_visitor.py +0 -0
- {pyopenapi_gen-0.20.0 → pyopenapi_gen-0.21.0}/tests/visit/test_visitor.py +0 -0
|
@@ -1,6 +1,93 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
## v0.21.0 (2025-10-23)
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
- **serialization**: Respect BaseSchema field mappings in DataclassSerializer
|
|
9
|
+
([`ef5d365`](https://github.com/mindhiveoy/pyopenapi_gen/commit/ef5d3656008417bbae17e6370e33e7b0c12cefd6))
|
|
10
|
+
|
|
11
|
+
BREAKING CHANGE: DataclassSerializer now correctly maps Python snake_case field names to API
|
|
12
|
+
camelCase field names when serializing BaseSchema instances.
|
|
13
|
+
|
|
14
|
+
Problem: DataclassSerializer.serialize() was using Python field names (snake_case) directly as
|
|
15
|
+
dictionary keys, ignoring the field name mappings defined in
|
|
16
|
+
BaseSchema.Meta.key_transform_with_load. This caused API requests to send incorrect field names,
|
|
17
|
+
breaking communication with camelCase APIs.
|
|
18
|
+
|
|
19
|
+
Solution: Modified DataclassSerializer._serialize_with_tracking() to detect BaseSchema instances and
|
|
20
|
+
use their to_dict() method, which properly handles field name mapping. Falls back to original
|
|
21
|
+
behavior for plain dataclasses to maintain backwards compatibility.
|
|
22
|
+
|
|
23
|
+
Changes: - Updated DataclassSerializer._serialize_with_tracking() in core/utils.py - Added 5
|
|
24
|
+
comprehensive unit tests for field mapping scenarios - Added 2 end-to-end integration tests with
|
|
25
|
+
business_swagger.json - All existing tests pass with 88.42% coverage (exceeds 85% requirement)
|
|
26
|
+
|
|
27
|
+
Example: Before: {"data_source_id": "123"} ❌
|
|
28
|
+
|
|
29
|
+
After: {"dataSourceId": "123"} ✅
|
|
30
|
+
|
|
31
|
+
Fixes critical bug affecting all generated clients with camelCase APIs.
|
|
32
|
+
|
|
33
|
+
### Chores
|
|
34
|
+
|
|
35
|
+
- **release**: Sync __init__.py version [skip ci]
|
|
36
|
+
([`446d496`](https://github.com/mindhiveoy/pyopenapi_gen/commit/446d4963a1e8428da7b6476088104aac599dae8f))
|
|
37
|
+
|
|
38
|
+
### Breaking Changes
|
|
39
|
+
|
|
40
|
+
- **serialization**: Dataclassserializer now correctly maps Python snake_case field names to API
|
|
41
|
+
camelCase field names when serializing BaseSchema instances.
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
## v0.20.1 (2025-10-21)
|
|
45
|
+
|
|
46
|
+
### Bug Fixes
|
|
47
|
+
|
|
48
|
+
- **codegen**: Resolve method naming and file handling in overloaded endpoints
|
|
49
|
+
([`190e581`](https://github.com/mindhiveoy/pyopenapi_gen/commit/190e5819e99edf37d14722b075069851d03c4c3b))
|
|
50
|
+
|
|
51
|
+
This commit fixes two critical issues in code generation for operations with multiple content types
|
|
52
|
+
(overloaded methods):
|
|
53
|
+
|
|
54
|
+
1. **Method Naming**: Overloaded methods were using camelCase from OpenAPI operationId instead of
|
|
55
|
+
converting to Python's snake_case convention. - Fixed: Added NameSanitizer.sanitize_method_name()
|
|
56
|
+
in overload_generator.py - Example: updateDocument -> update_document
|
|
57
|
+
|
|
58
|
+
2. **File Upload Handling**: Multipart/form-data file uploads were incorrectly being passed through
|
|
59
|
+
DataclassSerializer.serialize(), which is designed for dataclass-to-dict conversion, not file I/O.
|
|
60
|
+
- Fixed: Pass file dict directly to httpx transport in endpoint_method_generator.py - Rationale:
|
|
61
|
+
httpx expects raw IO objects, not serialized data
|
|
62
|
+
|
|
63
|
+
Both issues only affected operations with multiple content types (JSON + multipart). Standard
|
|
64
|
+
single-content-type operations were unaffected.
|
|
65
|
+
|
|
66
|
+
Changes: - src/pyopenapi_gen/visit/endpoint/generators/overload_generator.py: Added NameSanitizer
|
|
67
|
+
import and method name sanitisation in two locations (overload signatures and implementation
|
|
68
|
+
signatures)
|
|
69
|
+
|
|
70
|
+
- src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py: Removed
|
|
71
|
+
DataclassSerializer.serialize() for file parameters in multipart handling, passing files directly
|
|
72
|
+
to transport
|
|
73
|
+
|
|
74
|
+
- tests/visit/endpoint/generators/test_overload_generator.py: Added unit tests for snake_case
|
|
75
|
+
conversion in overload and implementation signatures
|
|
76
|
+
|
|
77
|
+
- tests/visit/endpoint/generators/test_endpoint_method_generator.py: Added test for file handling
|
|
78
|
+
without serialisation
|
|
79
|
+
|
|
80
|
+
- tests/generation_issues/test_overload_naming_issues.py: Added integration tests verifying both
|
|
81
|
+
fixes in full code generation pipeline
|
|
82
|
+
|
|
83
|
+
All tests pass (1348 tests) with full quality checks (format, lint, typecheck, security).
|
|
84
|
+
|
|
85
|
+
### Chores
|
|
86
|
+
|
|
87
|
+
- **release**: Sync __init__.py version [skip ci]
|
|
88
|
+
([`8047e53`](https://github.com/mindhiveoy/pyopenapi_gen/commit/8047e53df11d8985d95f89dbf3b36046af1e6f1a))
|
|
89
|
+
|
|
90
|
+
|
|
4
91
|
## v0.20.0 (2025-10-19)
|
|
5
92
|
|
|
6
93
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyopenapi-gen
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.21.0
|
|
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="1761233680435" lines-valid="6518" lines-covered="5763" line-rate="0.8842" 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.8884" 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/>
|
|
@@ -6085,7 +6096,7 @@
|
|
|
6085
6096
|
<line number="123" hits="1"/>
|
|
6086
6097
|
</lines>
|
|
6087
6098
|
</class>
|
|
6088
|
-
<class name="endpoint_method_generator.py" filename="pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py" complexity="0" line-rate="0.
|
|
6099
|
+
<class name="endpoint_method_generator.py" filename="pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py" complexity="0" line-rate="0.9286" branch-rate="0">
|
|
6089
6100
|
<methods/>
|
|
6090
6101
|
<lines>
|
|
6091
6102
|
<line number="1" hits="1"/>
|
|
@@ -6188,7 +6199,6 @@
|
|
|
6188
6199
|
<line number="181" hits="1"/>
|
|
6189
6200
|
<line number="182" hits="1"/>
|
|
6190
6201
|
<line number="183" hits="1"/>
|
|
6191
|
-
<line number="184" hits="1"/>
|
|
6192
6202
|
<line number="185" hits="1"/>
|
|
6193
6203
|
<line number="186" hits="1"/>
|
|
6194
6204
|
<line number="187" hits="1"/>
|
|
@@ -6228,93 +6238,96 @@
|
|
|
6228
6238
|
<line number="10" hits="1"/>
|
|
6229
6239
|
<line number="11" hits="1"/>
|
|
6230
6240
|
<line number="12" hits="1"/>
|
|
6231
|
-
<line number="
|
|
6232
|
-
<line number="
|
|
6233
|
-
<line number="
|
|
6241
|
+
<line number="13" hits="1"/>
|
|
6242
|
+
<line number="15" hits="1"/>
|
|
6243
|
+
<line number="18" hits="1"/>
|
|
6234
6244
|
<line number="27" hits="1"/>
|
|
6235
6245
|
<line number="28" hits="1"/>
|
|
6236
6246
|
<line number="29" hits="1"/>
|
|
6237
6247
|
<line number="30" hits="1"/>
|
|
6238
|
-
<line number="
|
|
6239
|
-
<line number="
|
|
6248
|
+
<line number="31" hits="1"/>
|
|
6249
|
+
<line number="33" hits="1"/>
|
|
6240
6250
|
<line number="43" hits="1"/>
|
|
6241
6251
|
<line number="44" hits="1"/>
|
|
6242
|
-
<line number="
|
|
6243
|
-
<line number="
|
|
6252
|
+
<line number="45" hits="1"/>
|
|
6253
|
+
<line number="47" hits="1"/>
|
|
6244
6254
|
<line number="61" hits="1"/>
|
|
6245
|
-
<line number="
|
|
6255
|
+
<line number="62" hits="1"/>
|
|
6246
6256
|
<line number="65" hits="1"/>
|
|
6247
6257
|
<line number="66" hits="1"/>
|
|
6248
6258
|
<line number="67" hits="1"/>
|
|
6249
|
-
<line number="
|
|
6250
|
-
<line number="
|
|
6251
|
-
<line number="
|
|
6259
|
+
<line number="68" hits="1"/>
|
|
6260
|
+
<line number="70" hits="1"/>
|
|
6261
|
+
<line number="73" hits="1"/>
|
|
6252
6262
|
<line number="77" hits="1"/>
|
|
6253
6263
|
<line number="78" hits="1"/>
|
|
6254
|
-
<line number="
|
|
6255
|
-
<line number="
|
|
6256
|
-
<line number="
|
|
6257
|
-
<line number="
|
|
6258
|
-
<line number="
|
|
6259
|
-
<line number="
|
|
6260
|
-
<line number="
|
|
6264
|
+
<line number="79" hits="1"/>
|
|
6265
|
+
<line number="81" hits="1"/>
|
|
6266
|
+
<line number="83" hits="1"/>
|
|
6267
|
+
<line number="104" hits="1"/>
|
|
6268
|
+
<line number="107" hits="1"/>
|
|
6269
|
+
<line number="110" hits="1"/>
|
|
6270
|
+
<line number="113" hits="1"/>
|
|
6261
6271
|
<line number="116" hits="1"/>
|
|
6262
|
-
<line number="
|
|
6263
|
-
<line number="
|
|
6272
|
+
<line number="117" hits="1"/>
|
|
6273
|
+
<line number="119" hits="1"/>
|
|
6264
6274
|
<line number="121" hits="1"/>
|
|
6265
6275
|
<line number="122" hits="1"/>
|
|
6266
6276
|
<line number="123" hits="1"/>
|
|
6267
|
-
<line number="
|
|
6268
|
-
<line number="
|
|
6269
|
-
<line number="
|
|
6270
|
-
<line number="
|
|
6271
|
-
<line number="
|
|
6277
|
+
<line number="124" hits="1"/>
|
|
6278
|
+
<line number="127" hits="1"/>
|
|
6279
|
+
<line number="130" hits="1"/>
|
|
6280
|
+
<line number="133" hits="1"/>
|
|
6281
|
+
<line number="136" hits="1"/>
|
|
6272
6282
|
<line number="139" hits="1"/>
|
|
6273
|
-
<line number="140" hits="1"/>
|
|
6274
|
-
<line number="141" hits="1"/>
|
|
6275
6283
|
<line number="142" hits="1"/>
|
|
6276
6284
|
<line number="143" hits="1"/>
|
|
6285
|
+
<line number="144" hits="1"/>
|
|
6277
6286
|
<line number="145" hits="1"/>
|
|
6287
|
+
<line number="146" hits="1"/>
|
|
6278
6288
|
<line number="147" hits="1"/>
|
|
6279
|
-
<line number="
|
|
6280
|
-
<line number="
|
|
6281
|
-
<line number="
|
|
6282
|
-
<line number="
|
|
6283
|
-
<line number="
|
|
6284
|
-
<line number="
|
|
6289
|
+
<line number="149" hits="1"/>
|
|
6290
|
+
<line number="151" hits="1"/>
|
|
6291
|
+
<line number="163" hits="1"/>
|
|
6292
|
+
<line number="165" hits="1"/>
|
|
6293
|
+
<line number="168" hits="1"/>
|
|
6294
|
+
<line number="170" hits="1"/>
|
|
6285
6295
|
<line number="171" hits="1"/>
|
|
6286
6296
|
<line number="173" hits="1"/>
|
|
6287
6297
|
<line number="175" hits="1"/>
|
|
6298
|
+
<line number="177" hits="1"/>
|
|
6288
6299
|
<line number="179" hits="1"/>
|
|
6289
|
-
<line number="
|
|
6290
|
-
<line number="
|
|
6291
|
-
<line number="
|
|
6292
|
-
<line number="
|
|
6293
|
-
<line number="203" hits="1"/>
|
|
6300
|
+
<line number="183" hits="1"/>
|
|
6301
|
+
<line number="184" hits="1"/>
|
|
6302
|
+
<line number="186" hits="1"/>
|
|
6303
|
+
<line number="201" hits="1"/>
|
|
6294
6304
|
<line number="204" hits="1"/>
|
|
6295
|
-
<line number="
|
|
6305
|
+
<line number="207" hits="1"/>
|
|
6296
6306
|
<line number="208" hits="1"/>
|
|
6297
|
-
<line number="209" hits="1"/>
|
|
6298
6307
|
<line number="210" hits="1"/>
|
|
6299
|
-
<line number="
|
|
6308
|
+
<line number="212" hits="1"/>
|
|
6309
|
+
<line number="213" hits="1"/>
|
|
6300
6310
|
<line number="214" hits="1"/>
|
|
6301
|
-
<line number="
|
|
6311
|
+
<line number="215" hits="1"/>
|
|
6302
6312
|
<line number="218" hits="1"/>
|
|
6303
|
-
<line number="220" hits="1"/>
|
|
6304
6313
|
<line number="221" hits="1"/>
|
|
6314
|
+
<line number="222" hits="1"/>
|
|
6305
6315
|
<line number="224" hits="1"/>
|
|
6306
6316
|
<line number="225" hits="1"/>
|
|
6307
|
-
<line number="
|
|
6308
|
-
<line number="
|
|
6317
|
+
<line number="228" hits="1"/>
|
|
6318
|
+
<line number="229" hits="1"/>
|
|
6309
6319
|
<line number="230" hits="1"/>
|
|
6310
|
-
<line number="
|
|
6311
|
-
<line number="
|
|
6320
|
+
<line number="231" hits="1"/>
|
|
6321
|
+
<line number="234" hits="1"/>
|
|
6312
6322
|
<line number="237" hits="1"/>
|
|
6313
|
-
<line number="238" hits="1"/>
|
|
6314
|
-
<line number="239" hits="1"/>
|
|
6315
6323
|
<line number="240" hits="1"/>
|
|
6316
|
-
<line number="241" hits="1"/>
|
|
6317
6324
|
<line number="243" hits="1"/>
|
|
6325
|
+
<line number="244" hits="1"/>
|
|
6326
|
+
<line number="245" hits="1"/>
|
|
6327
|
+
<line number="246" hits="1"/>
|
|
6328
|
+
<line number="247" hits="1"/>
|
|
6329
|
+
<line number="248" hits="1"/>
|
|
6330
|
+
<line number="250" hits="1"/>
|
|
6318
6331
|
</lines>
|
|
6319
6332
|
</class>
|
|
6320
6333
|
<class name="request_generator.py" filename="pyopenapi_gen/visit/endpoint/generators/request_generator.py" complexity="0" line-rate="0.9535" branch-rate="0">
|
|
@@ -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.0"
|
|
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.0"
|
|
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.0"
|
|
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:
|
|
@@ -181,12 +181,12 @@ class EndpointMethodGenerator:
|
|
|
181
181
|
writer.dedent()
|
|
182
182
|
writer.write_line(")")
|
|
183
183
|
elif content_type == "multipart/form-data":
|
|
184
|
-
|
|
184
|
+
# Files dict is already in correct format for httpx - pass directly
|
|
185
185
|
writer.write_line("response = await self._transport.request(")
|
|
186
186
|
writer.indent()
|
|
187
187
|
writer.write_line(f'"{op.method.value.upper()}", url,')
|
|
188
188
|
writer.write_line("params=None,")
|
|
189
|
-
writer.write_line("files=
|
|
189
|
+
writer.write_line(f"files={param_info['name']},")
|
|
190
190
|
writer.write_line("headers=None")
|
|
191
191
|
writer.dedent()
|
|
192
192
|
writer.write_line(")")
|
|
@@ -6,6 +6,7 @@ from typing import Any
|
|
|
6
6
|
from pyopenapi_gen import IROperation
|
|
7
7
|
|
|
8
8
|
from ....context.render_context import RenderContext
|
|
9
|
+
from ....core.utils import NameSanitizer
|
|
9
10
|
from ....core.writers.code_writer import CodeWriter
|
|
10
11
|
from ..processors.parameter_processor import EndpointParameterProcessor
|
|
11
12
|
from .docstring_generator import EndpointDocstringGenerator
|
|
@@ -134,9 +135,12 @@ class OverloadMethodGenerator:
|
|
|
134
135
|
# Get return type from response strategy
|
|
135
136
|
return_type = response_strategy.return_type
|
|
136
137
|
|
|
138
|
+
# Sanitize method name to snake_case
|
|
139
|
+
method_name = NameSanitizer.sanitize_method_name(op.operation_id)
|
|
140
|
+
|
|
137
141
|
# Write signature
|
|
138
142
|
params_str = ",\n ".join(param_parts)
|
|
139
|
-
writer.write_line(f"async def {
|
|
143
|
+
writer.write_line(f"async def {method_name}(")
|
|
140
144
|
writer.indent()
|
|
141
145
|
writer.write_line(params_str)
|
|
142
146
|
writer.dedent()
|
|
@@ -232,9 +236,12 @@ class OverloadMethodGenerator:
|
|
|
232
236
|
# Get return type
|
|
233
237
|
return_type = response_strategy.return_type
|
|
234
238
|
|
|
239
|
+
# Sanitize method name to snake_case
|
|
240
|
+
method_name = NameSanitizer.sanitize_method_name(op.operation_id)
|
|
241
|
+
|
|
235
242
|
# Write signature
|
|
236
243
|
params_str = ",\n ".join(param_parts)
|
|
237
|
-
writer.write_line(f"async def {
|
|
244
|
+
writer.write_line(f"async def {method_name}(")
|
|
238
245
|
writer.indent()
|
|
239
246
|
writer.write_line(params_str)
|
|
240
247
|
writer.dedent()
|