pyopenapi-gen 0.19.0__tar.gz → 0.20.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.19.0 → pyopenapi_gen-0.20.0}/.gitignore +3 -1
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/CHANGELOG.md +19 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/PKG-INFO +1 -1
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/coverage.xml +26 -23
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/pyproject.toml +2 -2
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/__init__.py +1 -1
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/utils.py +5 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_dataclass_serialization.py +194 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/end_to_end/test_dataclass_serialization_e2e.py +60 -49
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.bandit +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.cursor/mcp.json +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.cursor/rules/architecture.mdc +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.cursor/rules/coding-conventions.mdc +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.cursor/rules/project-goal.mdc +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.cursor/rules/testing.mdc +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/BRANCH_PROTECTION.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/CLAUDE_CONFIGURATION.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/CODEOWNERS +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/dependabot.yml +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/ci.yml +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/claude-auto-approve.yml +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/claude-review-trigger.yml +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/claude.yml +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/pr-checks.yml +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/production-release.yml.backup +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/promote-to-staging.yml +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/semantic-release.yml +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/staging-publish.yml +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/testpypi-publish.yml +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.python-version +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.vscode/settings.json +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/CLAUDE.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/CONTRIBUTING.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/LICENSE +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/Makefile +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/README.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/README.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/architecture.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/endpoint_visitor.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/helpers.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/ir_models.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/line_writer.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/loader.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/model_visitor.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/release-automation.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/render_context.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/unified_type_resolution.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/input/business_swagger.json +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/input/minimal_swagger.json +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/input/minimal_syntax_test.json +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/input/test_name_collision_spec.json +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/mkdocs.yml +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/poetry.lock +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/scripts/sync_version_to_init.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/scripts/validate_version_sync.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/__main__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/cli.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/CLAUDE.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/file_manager.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/import_collector.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/render_context.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/CLAUDE.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/auth/base.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/auth/plugins.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/exceptions.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/http_status_codes.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/http_transport.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/loader.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/post_processor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/request_body.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/parameters/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/parameters/parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/responses/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/responses/parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/schemas/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/schemas/extractor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/pagination.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/existing_schema.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/type_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/context.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/cycle_helpers.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/all_of_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/any_of_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/array_items_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/one_of_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/properties_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/schema_finalizer.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/schema_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/transformers/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/unified_cycle_detection.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/postprocess_manager.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/schemas.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/streaming_helpers.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/telemetry.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/warning_collector.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/code_writer.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/documentation_writer.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/line_writer.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/python_construct_renderer.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core_package_template/README.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emit/models_emitter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/CLAUDE.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/client_emitter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/core_emitter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/docs_emitter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/endpoints_emitter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/models_emitter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/generator/CLAUDE.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/generator/client_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/CLAUDE.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/endpoint_utils.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_cleaner.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_helper.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/array_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/composition_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/finalizer.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/named_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/object_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/primitive_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/url_utils.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/http_types.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/ir.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/py.typed +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/CLAUDE.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/contracts/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/contracts/protocols.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/contracts/types.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/reference_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/response_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/schema_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/services/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/services/type_service.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/strategies/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/strategies/response_strategy.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/CLAUDE.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/client_visitor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/docs_visitor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/overload_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/request_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/signature_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/url_args_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/processors/import_analyzer.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/exception_visitor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/alias_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/dataclass_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/enum_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/model_visitor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/visitor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/api/test_programmatic_api.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/auth/auth_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/auth/test_auth_base.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/auth/test_auth_plugins.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/cli/cli_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_backup_diff.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_edge_cases.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_edge_cases_comprehensive.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_internal_utils.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/cli/test_http_pagination_cli.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/context_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/test_core_import_path.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/test_file_manager.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/test_import_collector.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/test_render_context.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/test_render_context_imports.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/test_render_context_relative_paths.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/core_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/loader/parameters/test_inline_enum_array_params.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/loader/test_extractor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/loader/test_top_level_enum_extraction.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_cyclic_properties.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_direct_cycle.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_existing_schema.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_list_response.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_missing_ref.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_new_schema.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_stripped_suffix.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/keywords_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_all_of_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_any_of_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_array_items_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_one_of_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_properties_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/parsing_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_context.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_cycle_detection.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_cycle_helpers.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_improved_schema_naming.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_logging.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_ref_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_schema_finalizer.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_schema_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_schema_parser_list_response.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_type_parser.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_detect_circular_imports.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_edge_cases_integration.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_edge_cases_systematic.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_exceptions_module.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_forward_references.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_http_transport.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_import_resolution.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_ir.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_ir_schema.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_extensive.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_invalid_refs.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_malformed.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_media_types.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_pagination.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_parsing_context.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_protocol_defaults.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_schema_parser_specific_case.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_schemas.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_simple_self_ref_check.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_streaming_helpers.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_telemetry.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_telemetry_client.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_utils.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_warning_collector.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_code_writer.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_documentation_writer.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_line_writer.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_python_construct_renderer_json_wizard.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/writers/writers_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/emitters_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_client_emitter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_docs_emitter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_duplicate_operations.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_endpoints_emitter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_list_response_generation.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_models_emitter.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/examples/test_developer_experience_demo.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/generation/generation_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/generation/test_external_core_package.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/specs/minimal_addmessage_like.json +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/test_addmessage_like_issues.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/test_agent_include_parameter_typing.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/test_message_batch_response_issue.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_array_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_endpoint_utils.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_endpoint_utils_extended.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_get_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_named_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_named_type_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_object_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_put_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_type_cleaner.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_type_helper.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_url_utils.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_utils_helpers.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/integration/test_generated_code_structure.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/integrations/integrations_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_business_swagger_message_type.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_end_to_end_business_swagger.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_end_to_end_petstore.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_name_collisions.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/specs/response_unwrapping_spec.yaml +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/test_analysis_overview.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/test_init.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_business_swagger_integration.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_contracts_types.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_missing_imports_bug.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_reference_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_response_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_response_strategy.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_response_strategy_simplified.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_schema_resolver.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_schema_resolver_enums.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_type_service.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/generators_analysis.md +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_dataclass_integration.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_docstring_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_match_case_response.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_overload_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_request_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_response_handler_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_response_handler_generator_strategy.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_signature_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_url_args_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/test_import_analyzer.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/test_import_analyzer.py.bak +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/test_parameter_processor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/test_endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_alias_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_dataclass_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_dataclass_generator_json_wizard.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_enum_generator.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_json_value_integration.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_json_value_wrapper.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/test_client_visitor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/test_model_visitor.py +0 -0
- {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/test_visitor.py +0 -0
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
## v0.20.0 (2025-10-19)
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
- **serializer**: Handle enum instances in DataclassSerializer serialization
|
|
9
|
+
([`7eaf8ed`](https://github.com/mindhiveoy/pyopenapi_gen/commit/7eaf8ed07e6b975ecd33ec0c3a6e642f2f23e205))
|
|
10
|
+
|
|
11
|
+
### Chores
|
|
12
|
+
|
|
13
|
+
- **release**: Sync __init__.py version [skip ci]
|
|
14
|
+
([`53c6163`](https://github.com/mindhiveoy/pyopenapi_gen/commit/53c6163b7c536ee17b6bb3a5fb631ed1900a4520))
|
|
15
|
+
|
|
16
|
+
### Features
|
|
17
|
+
|
|
18
|
+
- **tests**: Add comprehensive tests for DataclassSerializer with enum support and nested
|
|
19
|
+
dataclasses
|
|
20
|
+
([`21de6af`](https://github.com/mindhiveoy/pyopenapi_gen/commit/21de6af2fdd33de6212863cc645ed426c6b1cd72))
|
|
21
|
+
|
|
22
|
+
|
|
4
23
|
## v0.19.0 (2025-10-18)
|
|
5
24
|
|
|
6
25
|
### Chores
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyopenapi-gen
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.20.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="1760875420300" lines-valid="6505" lines-covered="5750" line-rate="0.8839" 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.8327" 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.9353" branch-rate="0">
|
|
1057
1057
|
<methods/>
|
|
1058
1058
|
<lines>
|
|
1059
1059
|
<line number="6" hits="1"/>
|
|
@@ -1176,53 +1176,56 @@
|
|
|
1176
1176
|
<line number="339" hits="1"/>
|
|
1177
1177
|
<line number="341" hits="1"/>
|
|
1178
1178
|
<line number="342" hits="1"/>
|
|
1179
|
-
<line number="
|
|
1179
|
+
<line number="344" hits="1"/>
|
|
1180
1180
|
<line number="347" hits="1"/>
|
|
1181
|
-
<line number="
|
|
1181
|
+
<line number="348" hits="1"/>
|
|
1182
1182
|
<line number="351" hits="1"/>
|
|
1183
|
-
<line number="
|
|
1183
|
+
<line number="352" hits="1"/>
|
|
1184
1184
|
<line number="354" hits="1"/>
|
|
1185
|
-
<line number="355" hits="
|
|
1186
|
-
<line number="
|
|
1185
|
+
<line number="355" hits="1"/>
|
|
1186
|
+
<line number="356" hits="0"/>
|
|
1187
1187
|
<line number="359" hits="1"/>
|
|
1188
|
-
<line number="
|
|
1188
|
+
<line number="360" hits="1"/>
|
|
1189
1189
|
<line number="363" hits="1"/>
|
|
1190
1190
|
<line number="364" hits="1"/>
|
|
1191
|
-
<line number="365" hits="1"/>
|
|
1192
|
-
<line number="366" hits="1"/>
|
|
1193
1191
|
<line number="367" hits="1"/>
|
|
1192
|
+
<line number="368" hits="1"/>
|
|
1194
1193
|
<line number="369" hits="1"/>
|
|
1195
1194
|
<line number="370" hits="1"/>
|
|
1196
1195
|
<line number="371" hits="1"/>
|
|
1197
1196
|
<line number="372" hits="1"/>
|
|
1198
|
-
<line number="
|
|
1197
|
+
<line number="374" hits="1"/>
|
|
1199
1198
|
<line number="375" hits="1"/>
|
|
1199
|
+
<line number="376" hits="1"/>
|
|
1200
|
+
<line number="377" hits="1"/>
|
|
1200
1201
|
<line number="378" hits="1"/>
|
|
1201
|
-
<line number="
|
|
1202
|
-
<line number="382" hits="1"/>
|
|
1202
|
+
<line number="380" hits="1"/>
|
|
1203
1203
|
<line number="383" hits="1"/>
|
|
1204
1204
|
<line number="384" hits="1"/>
|
|
1205
|
-
<line number="385" hits="1"/>
|
|
1206
|
-
<line number="386" hits="1"/>
|
|
1207
1205
|
<line number="387" hits="1"/>
|
|
1208
1206
|
<line number="388" hits="1"/>
|
|
1207
|
+
<line number="389" hits="1"/>
|
|
1208
|
+
<line number="390" hits="1"/>
|
|
1209
1209
|
<line number="391" hits="1"/>
|
|
1210
1210
|
<line number="392" hits="1"/>
|
|
1211
|
-
<line number="
|
|
1211
|
+
<line number="393" hits="1"/>
|
|
1212
|
+
<line number="396" hits="1"/>
|
|
1212
1213
|
<line number="397" hits="1"/>
|
|
1213
|
-
<line number="398" hits="1"/>
|
|
1214
|
-
<line number="399" hits="1"/>
|
|
1215
1214
|
<line number="400" hits="1"/>
|
|
1216
|
-
<line number="401" hits="1"/>
|
|
1217
1215
|
<line number="402" hits="1"/>
|
|
1218
1216
|
<line number="403" hits="1"/>
|
|
1219
1217
|
<line number="404" hits="1"/>
|
|
1220
1218
|
<line number="405" hits="1"/>
|
|
1221
1219
|
<line number="406" hits="1"/>
|
|
1220
|
+
<line number="407" hits="1"/>
|
|
1222
1221
|
<line number="408" hits="1"/>
|
|
1223
|
-
<line number="
|
|
1224
|
-
<line number="
|
|
1225
|
-
<line number="
|
|
1222
|
+
<line number="409" hits="1"/>
|
|
1223
|
+
<line number="410" hits="1"/>
|
|
1224
|
+
<line number="411" hits="1"/>
|
|
1225
|
+
<line number="413" hits="1"/>
|
|
1226
|
+
<line number="416" hits="0"/>
|
|
1227
|
+
<line number="417" hits="0"/>
|
|
1228
|
+
<line number="419" hits="0"/>
|
|
1226
1229
|
</lines>
|
|
1227
1230
|
</class>
|
|
1228
1231
|
<class name="warning_collector.py" filename="pyopenapi_gen/core/warning_collector.py" complexity="0" line-rate="1" 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.20.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.20.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.20.0"
|
|
54
54
|
|
|
55
55
|
# ---------------------------------------------------------------------------
|
|
56
56
|
# Lazy-loading and autocompletion support (This part remains)
|
|
@@ -341,6 +341,7 @@ class DataclassSerializer:
|
|
|
341
341
|
@staticmethod
|
|
342
342
|
def _serialize_with_tracking(obj: Any, visited: Set[int]) -> Any:
|
|
343
343
|
"""Internal serialization method with circular reference tracking."""
|
|
344
|
+
from enum import Enum
|
|
344
345
|
|
|
345
346
|
# Handle None values by excluding them
|
|
346
347
|
if obj is None:
|
|
@@ -358,6 +359,10 @@ class DataclassSerializer:
|
|
|
358
359
|
if isinstance(obj, datetime):
|
|
359
360
|
return obj.isoformat()
|
|
360
361
|
|
|
362
|
+
# Handle enum instances
|
|
363
|
+
if isinstance(obj, Enum) and not isinstance(obj, type):
|
|
364
|
+
return obj.value
|
|
365
|
+
|
|
361
366
|
# Handle dataclass instances
|
|
362
367
|
if dataclasses.is_dataclass(obj) and not isinstance(obj, type):
|
|
363
368
|
visited.add(obj_id)
|
|
@@ -9,6 +9,7 @@ converted to dictionaries before being sent in HTTP requests.
|
|
|
9
9
|
|
|
10
10
|
import dataclasses
|
|
11
11
|
from datetime import datetime
|
|
12
|
+
from enum import Enum
|
|
12
13
|
from typing import Any, List, Optional
|
|
13
14
|
|
|
14
15
|
import pytest
|
|
@@ -53,6 +54,42 @@ class ComplexData:
|
|
|
53
54
|
optional_field: str | None = None
|
|
54
55
|
|
|
55
56
|
|
|
57
|
+
class Status(Enum):
|
|
58
|
+
"""Status enum for testing."""
|
|
59
|
+
|
|
60
|
+
PENDING = "pending"
|
|
61
|
+
ACTIVE = "active"
|
|
62
|
+
INACTIVE = "inactive"
|
|
63
|
+
COMPLETED = "completed"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class Priority(Enum):
|
|
67
|
+
"""Priority enum with integer values for testing."""
|
|
68
|
+
|
|
69
|
+
LOW = 1
|
|
70
|
+
MEDIUM = 2
|
|
71
|
+
HIGH = 3
|
|
72
|
+
CRITICAL = 4
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@dataclasses.dataclass
|
|
76
|
+
class Task:
|
|
77
|
+
"""Task dataclass with enum fields for testing."""
|
|
78
|
+
|
|
79
|
+
title: str
|
|
80
|
+
status: Status
|
|
81
|
+
priority: Priority
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@dataclasses.dataclass
|
|
85
|
+
class Project:
|
|
86
|
+
"""Project dataclass with nested enum-containing dataclass for testing."""
|
|
87
|
+
|
|
88
|
+
name: str
|
|
89
|
+
main_task: Task
|
|
90
|
+
backup_status: Status | None = None
|
|
91
|
+
|
|
92
|
+
|
|
56
93
|
class TestDataclassSerializer:
|
|
57
94
|
"""Test the DataclassSerializer utility that should be added to core.utils."""
|
|
58
95
|
|
|
@@ -229,6 +266,163 @@ class TestDataclassSerializer:
|
|
|
229
266
|
assert result == {}
|
|
230
267
|
assert isinstance(result, dict)
|
|
231
268
|
|
|
269
|
+
def test_serialize_enum_string_value__converts_to_value__returns_string(self) -> None:
|
|
270
|
+
"""
|
|
271
|
+
Scenario: Serialize an enum instance with string value
|
|
272
|
+
Expected Outcome: Returns the enum's underlying value (string)
|
|
273
|
+
"""
|
|
274
|
+
# Arrange
|
|
275
|
+
status = Status.ACTIVE
|
|
276
|
+
|
|
277
|
+
# Act
|
|
278
|
+
result = DataclassSerializer.serialize(status)
|
|
279
|
+
|
|
280
|
+
# Assert
|
|
281
|
+
assert result == "active"
|
|
282
|
+
assert isinstance(result, str)
|
|
283
|
+
|
|
284
|
+
def test_serialize_enum_integer_value__converts_to_value__returns_integer(self) -> None:
|
|
285
|
+
"""
|
|
286
|
+
Scenario: Serialize an enum instance with integer value
|
|
287
|
+
Expected Outcome: Returns the enum's underlying value (integer)
|
|
288
|
+
"""
|
|
289
|
+
# Arrange
|
|
290
|
+
priority = Priority.HIGH
|
|
291
|
+
|
|
292
|
+
# Act
|
|
293
|
+
result = DataclassSerializer.serialize(priority)
|
|
294
|
+
|
|
295
|
+
# Assert
|
|
296
|
+
assert result == 3
|
|
297
|
+
assert isinstance(result, int)
|
|
298
|
+
|
|
299
|
+
def test_serialize_dataclass_with_enum_fields__converts_enums_to_values__returns_proper_dict(self) -> None:
|
|
300
|
+
"""
|
|
301
|
+
Scenario: Serialize a dataclass containing enum fields
|
|
302
|
+
Expected Outcome: Enum fields are converted to their underlying values
|
|
303
|
+
"""
|
|
304
|
+
# Arrange
|
|
305
|
+
task = Task(title="Implement feature", status=Status.ACTIVE, priority=Priority.HIGH)
|
|
306
|
+
|
|
307
|
+
# Act
|
|
308
|
+
result = DataclassSerializer.serialize(task)
|
|
309
|
+
|
|
310
|
+
# Assert
|
|
311
|
+
expected = {"title": "Implement feature", "status": "active", "priority": 3}
|
|
312
|
+
assert result == expected
|
|
313
|
+
|
|
314
|
+
def test_serialize_nested_dataclass_with_enums__converts_recursively__returns_proper_structure(self) -> None:
|
|
315
|
+
"""
|
|
316
|
+
Scenario: Serialize nested dataclasses containing enum fields
|
|
317
|
+
Expected Outcome: All enum fields at all nesting levels are converted to values
|
|
318
|
+
"""
|
|
319
|
+
# Arrange
|
|
320
|
+
task = Task(title="Main task", status=Status.COMPLETED, priority=Priority.CRITICAL)
|
|
321
|
+
project = Project(name="API Project", main_task=task, backup_status=Status.PENDING)
|
|
322
|
+
|
|
323
|
+
# Act
|
|
324
|
+
result = DataclassSerializer.serialize(project)
|
|
325
|
+
|
|
326
|
+
# Assert
|
|
327
|
+
expected = {
|
|
328
|
+
"name": "API Project",
|
|
329
|
+
"main_task": {"title": "Main task", "status": "completed", "priority": 4},
|
|
330
|
+
"backup_status": "pending",
|
|
331
|
+
}
|
|
332
|
+
assert result == expected
|
|
333
|
+
|
|
334
|
+
def test_serialize_list_with_enum_values__converts_all_enums__returns_list_of_values(self) -> None:
|
|
335
|
+
"""
|
|
336
|
+
Scenario: Serialize a list containing enum instances
|
|
337
|
+
Expected Outcome: Each enum in the list is converted to its underlying value
|
|
338
|
+
"""
|
|
339
|
+
# Arrange
|
|
340
|
+
statuses = [Status.PENDING, Status.ACTIVE, Status.COMPLETED]
|
|
341
|
+
|
|
342
|
+
# Act
|
|
343
|
+
result = DataclassSerializer.serialize(statuses)
|
|
344
|
+
|
|
345
|
+
# Assert
|
|
346
|
+
expected = ["pending", "active", "completed"]
|
|
347
|
+
assert result == expected
|
|
348
|
+
|
|
349
|
+
def test_serialize_dict_with_enum_values__converts_enum_values__preserves_keys(self) -> None:
|
|
350
|
+
"""
|
|
351
|
+
Scenario: Serialize a dictionary with enum values
|
|
352
|
+
Expected Outcome: Enum values are converted while dictionary keys are preserved
|
|
353
|
+
"""
|
|
354
|
+
# Arrange
|
|
355
|
+
status_map = {"current": Status.ACTIVE, "previous": Status.PENDING, "target": Status.COMPLETED}
|
|
356
|
+
|
|
357
|
+
# Act
|
|
358
|
+
result = DataclassSerializer.serialize(status_map)
|
|
359
|
+
|
|
360
|
+
# Assert
|
|
361
|
+
expected = {"current": "active", "previous": "pending", "target": "completed"}
|
|
362
|
+
assert result == expected
|
|
363
|
+
|
|
364
|
+
def test_serialize_dataclass_with_optional_enum_none__excludes_none_value__returns_clean_dict(self) -> None:
|
|
365
|
+
"""
|
|
366
|
+
Scenario: Serialize a dataclass with optional enum field set to None
|
|
367
|
+
Expected Outcome: None enum field is excluded from the result
|
|
368
|
+
"""
|
|
369
|
+
# Arrange
|
|
370
|
+
task = Task(title="Simple task", status=Status.PENDING, priority=Priority.LOW)
|
|
371
|
+
project = Project(name="Simple project", main_task=task) # backup_status is None
|
|
372
|
+
|
|
373
|
+
# Act
|
|
374
|
+
result = DataclassSerializer.serialize(project)
|
|
375
|
+
|
|
376
|
+
# Assert
|
|
377
|
+
expected = {
|
|
378
|
+
"name": "Simple project",
|
|
379
|
+
"main_task": {"title": "Simple task", "status": "pending", "priority": 1},
|
|
380
|
+
}
|
|
381
|
+
assert result == expected
|
|
382
|
+
assert "backup_status" not in result
|
|
383
|
+
|
|
384
|
+
def test_serialize_mixed_dataclass_with_enums_and_complex_types__handles_all_types__returns_complete_dict(
|
|
385
|
+
self,
|
|
386
|
+
) -> None:
|
|
387
|
+
"""
|
|
388
|
+
Scenario: Serialize a dataclass containing enums, dates, lists, and nested structures
|
|
389
|
+
Expected Outcome: All types including enums are properly serialized
|
|
390
|
+
"""
|
|
391
|
+
|
|
392
|
+
# Arrange
|
|
393
|
+
@dataclasses.dataclass
|
|
394
|
+
class ComplexTask:
|
|
395
|
+
title: str
|
|
396
|
+
status: Status
|
|
397
|
+
priority: Priority
|
|
398
|
+
created_at: datetime
|
|
399
|
+
tags: List[str]
|
|
400
|
+
metadata: dict[str, Any]
|
|
401
|
+
|
|
402
|
+
created_at = datetime(2023, 6, 15, 9, 30, 0)
|
|
403
|
+
task = ComplexTask(
|
|
404
|
+
title="Complex task",
|
|
405
|
+
status=Status.ACTIVE,
|
|
406
|
+
priority=Priority.HIGH,
|
|
407
|
+
created_at=created_at,
|
|
408
|
+
tags=["urgent", "api"],
|
|
409
|
+
metadata={"version": "2.0", "retries": 3},
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
# Act
|
|
413
|
+
result = DataclassSerializer.serialize(task)
|
|
414
|
+
|
|
415
|
+
# Assert
|
|
416
|
+
expected = {
|
|
417
|
+
"title": "Complex task",
|
|
418
|
+
"status": "active",
|
|
419
|
+
"priority": 3,
|
|
420
|
+
"created_at": "2023-06-15T09:30:00",
|
|
421
|
+
"tags": ["urgent", "api"],
|
|
422
|
+
"metadata": {"version": "2.0", "retries": 3},
|
|
423
|
+
}
|
|
424
|
+
assert result == expected
|
|
425
|
+
|
|
232
426
|
|
|
233
427
|
class TestGeneratedClientDataclassIntegration:
|
|
234
428
|
"""Test that generated client code properly integrates dataclass serialization."""
|
{pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/end_to_end/test_dataclass_serialization_e2e.py
RENAMED
|
@@ -7,11 +7,9 @@ Expected Outcome: Generated endpoint methods include DataclassSerializer calls
|
|
|
7
7
|
and proper imports for seamless dataclass handling.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
from unittest.mock import MagicMock
|
|
11
|
-
|
|
12
10
|
from pyopenapi_gen.context.render_context import RenderContext
|
|
13
11
|
from pyopenapi_gen.http_types import HTTPMethod
|
|
14
|
-
from pyopenapi_gen.ir import IROperation, IRRequestBody, IRSchema
|
|
12
|
+
from pyopenapi_gen.ir import IROperation, IRRequestBody, IRResponse, IRSchema
|
|
15
13
|
from pyopenapi_gen.visit.endpoint.generators.endpoint_method_generator import EndpointMethodGenerator
|
|
16
14
|
|
|
17
15
|
|
|
@@ -20,10 +18,15 @@ class TestDataclassSerializationEndToEnd:
|
|
|
20
18
|
|
|
21
19
|
def test_generate_endpoint_with_json_body__includes_serializer__complete_method(self) -> None:
|
|
22
20
|
"""
|
|
23
|
-
Scenario: Generate complete endpoint method with JSON body parameter
|
|
21
|
+
Scenario: Generate complete endpoint method with JSON body parameter using real RenderContext
|
|
24
22
|
Expected Outcome: Generated code includes DataclassSerializer import and usage
|
|
25
23
|
"""
|
|
26
|
-
# Arrange
|
|
24
|
+
# Arrange - Use real RenderContext instead of mocks
|
|
25
|
+
context = RenderContext(
|
|
26
|
+
output_package_name="test_package",
|
|
27
|
+
core_package_name="test_package.core",
|
|
28
|
+
)
|
|
29
|
+
|
|
27
30
|
operation = IROperation(
|
|
28
31
|
operation_id="create_user",
|
|
29
32
|
summary="Create a new user",
|
|
@@ -37,27 +40,28 @@ class TestDataclassSerializationEndToEnd:
|
|
|
37
40
|
content={"application/json": IRSchema(type="CreateUserRequest", description="User creation data")},
|
|
38
41
|
required=True,
|
|
39
42
|
),
|
|
40
|
-
responses=[
|
|
43
|
+
responses=[
|
|
44
|
+
IRResponse(
|
|
45
|
+
status_code="201",
|
|
46
|
+
description="User created",
|
|
47
|
+
content={"application/json": IRSchema(type="User", description="Created user")},
|
|
48
|
+
)
|
|
49
|
+
],
|
|
41
50
|
)
|
|
42
51
|
|
|
43
|
-
# Mock render context
|
|
44
|
-
context = MagicMock(spec=RenderContext)
|
|
45
|
-
context.core_package_name = "test_core"
|
|
46
|
-
context.add_import = MagicMock()
|
|
47
|
-
context.add_typing_imports_for_type = MagicMock()
|
|
48
|
-
|
|
49
52
|
# Create generator
|
|
50
53
|
generator = EndpointMethodGenerator()
|
|
51
54
|
|
|
52
|
-
# Act
|
|
55
|
+
# Act - Generate code with real context
|
|
53
56
|
generated_code = generator.generate(operation, context)
|
|
54
57
|
|
|
55
|
-
# Assert
|
|
56
|
-
|
|
57
|
-
assert "DataclassSerializer.serialize" in generated_code
|
|
58
|
+
# Assert - Validate generated code structure
|
|
59
|
+
assert "DataclassSerializer.serialize" in generated_code, "Should include DataclassSerializer usage"
|
|
58
60
|
|
|
59
|
-
#
|
|
60
|
-
context.
|
|
61
|
+
# Verify import was registered in real context
|
|
62
|
+
imports = context.import_collector.imports
|
|
63
|
+
serializer_import_found = "DataclassSerializer" in imports.get("test_package.core.utils", set())
|
|
64
|
+
assert serializer_import_found, "DataclassSerializer import should be registered"
|
|
61
65
|
|
|
62
66
|
# Check that the generated code structure is correct
|
|
63
67
|
assert "async def create_user" in generated_code
|
|
@@ -75,10 +79,15 @@ class TestDataclassSerializationEndToEnd:
|
|
|
75
79
|
|
|
76
80
|
def test_generate_endpoint_without_body__no_serializer__clean_method(self) -> None:
|
|
77
81
|
"""
|
|
78
|
-
Scenario: Generate endpoint method without body parameter (GET request)
|
|
82
|
+
Scenario: Generate endpoint method without body parameter (GET request) using real RenderContext
|
|
79
83
|
Expected Outcome: Generated code does not include DataclassSerializer
|
|
80
84
|
"""
|
|
81
|
-
# Arrange
|
|
85
|
+
# Arrange - Use real RenderContext instead of mocks
|
|
86
|
+
context = RenderContext(
|
|
87
|
+
output_package_name="test_package",
|
|
88
|
+
core_package_name="test_package.core",
|
|
89
|
+
)
|
|
90
|
+
|
|
82
91
|
operation = IROperation(
|
|
83
92
|
operation_id="get_users",
|
|
84
93
|
summary="Get all users",
|
|
@@ -88,31 +97,28 @@ class TestDataclassSerializationEndToEnd:
|
|
|
88
97
|
tags=["users"],
|
|
89
98
|
parameters=[],
|
|
90
99
|
request_body=None,
|
|
91
|
-
responses=[
|
|
100
|
+
responses=[
|
|
101
|
+
IRResponse(
|
|
102
|
+
status_code="200",
|
|
103
|
+
description="Success",
|
|
104
|
+
content={"application/json": IRSchema(type="list[User]", description="List of users")},
|
|
105
|
+
)
|
|
106
|
+
],
|
|
92
107
|
)
|
|
93
108
|
|
|
94
|
-
# Mock render context
|
|
95
|
-
context = MagicMock(spec=RenderContext)
|
|
96
|
-
context.core_package_name = "test_core"
|
|
97
|
-
context.add_import = MagicMock()
|
|
98
|
-
context.add_typing_imports_for_type = MagicMock()
|
|
99
|
-
|
|
100
109
|
# Create generator
|
|
101
110
|
generator = EndpointMethodGenerator()
|
|
102
111
|
|
|
103
|
-
# Act
|
|
112
|
+
# Act - Generate code with real context
|
|
104
113
|
generated_code = generator.generate(operation, context)
|
|
105
114
|
|
|
106
|
-
# Assert
|
|
107
|
-
|
|
108
|
-
assert "DataclassSerializer" not in generated_code
|
|
115
|
+
# Assert - Validate generated code does NOT include serializer
|
|
116
|
+
assert "DataclassSerializer" not in generated_code, "GET requests should not use DataclassSerializer"
|
|
109
117
|
|
|
110
|
-
#
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
]
|
|
115
|
-
assert len(serializer_imports) == 0, "DataclassSerializer should not be imported for bodyless requests"
|
|
118
|
+
# Verify import was NOT registered in real context
|
|
119
|
+
imports = context.import_collector.imports
|
|
120
|
+
serializer_import_found = any("DataclassSerializer" in module_imports for module_imports in imports.values())
|
|
121
|
+
assert not serializer_import_found, "DataclassSerializer should not be imported for bodyless requests"
|
|
116
122
|
|
|
117
123
|
# Check basic structure
|
|
118
124
|
assert "async def get_users" in generated_code
|
|
@@ -120,10 +126,15 @@ class TestDataclassSerializationEndToEnd:
|
|
|
120
126
|
|
|
121
127
|
def test_generated_code_formatting__preserves_style__clean_output(self) -> None:
|
|
122
128
|
"""
|
|
123
|
-
Scenario: Verify that generated code with DataclassSerializer maintains proper formatting
|
|
129
|
+
Scenario: Verify that generated code with DataclassSerializer maintains proper formatting using real RenderContext
|
|
124
130
|
Expected Outcome: Generated code is properly formatted with correct indentation and structure
|
|
125
131
|
"""
|
|
126
|
-
# Arrange
|
|
132
|
+
# Arrange - Use real RenderContext instead of mocks
|
|
133
|
+
context = RenderContext(
|
|
134
|
+
output_package_name="test_package",
|
|
135
|
+
core_package_name="test_package.core",
|
|
136
|
+
)
|
|
137
|
+
|
|
127
138
|
operation = IROperation(
|
|
128
139
|
operation_id="update_user",
|
|
129
140
|
summary="Update a user",
|
|
@@ -137,26 +148,26 @@ class TestDataclassSerializationEndToEnd:
|
|
|
137
148
|
content={"application/json": IRSchema(type="UpdateUserRequest", description="User update data")},
|
|
138
149
|
required=True,
|
|
139
150
|
),
|
|
140
|
-
responses=[
|
|
151
|
+
responses=[
|
|
152
|
+
IRResponse(
|
|
153
|
+
status_code="200",
|
|
154
|
+
description="User updated",
|
|
155
|
+
content={"application/json": IRSchema(type="User", description="Updated user")},
|
|
156
|
+
)
|
|
157
|
+
],
|
|
141
158
|
)
|
|
142
159
|
|
|
143
|
-
context = MagicMock(spec=RenderContext)
|
|
144
|
-
context.core_package_name = "test_core"
|
|
145
|
-
context.add_import = MagicMock()
|
|
146
|
-
context.add_typing_imports_for_type = MagicMock()
|
|
147
|
-
|
|
148
160
|
generator = EndpointMethodGenerator()
|
|
149
161
|
|
|
150
|
-
# Act
|
|
162
|
+
# Act - Generate code with real context
|
|
151
163
|
generated_code = generator.generate(operation, context)
|
|
152
164
|
|
|
153
|
-
# Assert
|
|
154
|
-
# Check that the code is properly formatted
|
|
165
|
+
# Assert - Validate code formatting
|
|
155
166
|
lines = generated_code.split("\n")
|
|
156
167
|
|
|
157
168
|
# Find the json_body assignment line
|
|
158
169
|
json_body_lines = [line for line in lines if "json_body:" in line and "DataclassSerializer" in line]
|
|
159
|
-
assert len(json_body_lines) == 1
|
|
170
|
+
assert len(json_body_lines) == 1, f"Expected exactly one json_body assignment, got: {json_body_lines}"
|
|
160
171
|
|
|
161
172
|
json_body_line = json_body_lines[0]
|
|
162
173
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/production-release.yml.backup
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|