pyopenapi-gen 0.18.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.18.0 → pyopenapi_gen-0.20.0}/.gitignore +3 -1
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/CHANGELOG.md +32 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/PKG-INFO +1 -1
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/coverage.xml +49 -45
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/pyproject.toml +2 -2
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/__init__.py +1 -1
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/utils.py +5 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py +6 -3
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_dataclass_serialization.py +194 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/end_to_end/test_dataclass_serialization_e2e.py +60 -49
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.bandit +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.cursor/mcp.json +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.cursor/rules/architecture.mdc +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.cursor/rules/coding-conventions.mdc +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.cursor/rules/project-goal.mdc +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.cursor/rules/testing.mdc +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/BRANCH_PROTECTION.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/CLAUDE_CONFIGURATION.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/CODEOWNERS +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/dependabot.yml +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/ci.yml +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/claude-auto-approve.yml +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/claude-review-trigger.yml +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/claude.yml +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/pr-checks.yml +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/production-release.yml.backup +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/promote-to-staging.yml +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/semantic-release.yml +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/staging-publish.yml +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/testpypi-publish.yml +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.python-version +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.vscode/settings.json +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/CLAUDE.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/CONTRIBUTING.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/LICENSE +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/Makefile +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/README.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/README.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/architecture.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/endpoint_visitor.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/helpers.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/ir_models.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/line_writer.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/loader.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/model_visitor.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/release-automation.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/render_context.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/unified_type_resolution.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/input/business_swagger.json +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/input/minimal_swagger.json +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/input/minimal_syntax_test.json +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/input/test_name_collision_spec.json +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/mkdocs.yml +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/poetry.lock +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/scripts/sync_version_to_init.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/scripts/validate_version_sync.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/__main__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/cli.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/CLAUDE.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/file_manager.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/import_collector.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/render_context.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/CLAUDE.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/auth/base.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/auth/plugins.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/exceptions.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/http_status_codes.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/http_transport.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/loader.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/post_processor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/request_body.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/parameters/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/parameters/parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/responses/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/responses/parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/schemas/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/schemas/extractor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/pagination.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/existing_schema.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/type_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/context.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/cycle_helpers.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/all_of_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/any_of_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/array_items_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/one_of_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/properties_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/schema_finalizer.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/schema_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/transformers/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/unified_cycle_detection.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/postprocess_manager.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/schemas.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/streaming_helpers.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/telemetry.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/warning_collector.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/code_writer.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/documentation_writer.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/line_writer.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/python_construct_renderer.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core_package_template/README.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emit/models_emitter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/CLAUDE.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/client_emitter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/core_emitter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/docs_emitter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/endpoints_emitter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/models_emitter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/generator/CLAUDE.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/generator/client_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/CLAUDE.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/endpoint_utils.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_cleaner.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_helper.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/array_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/composition_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/finalizer.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/named_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/object_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/primitive_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/url_utils.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/http_types.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/ir.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/py.typed +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/CLAUDE.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/contracts/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/contracts/protocols.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/contracts/types.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/reference_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/response_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/schema_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/services/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/services/type_service.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/strategies/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/strategies/response_strategy.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/CLAUDE.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/client_visitor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/docs_visitor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/overload_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/request_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/signature_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/url_args_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/processors/import_analyzer.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/exception_visitor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/alias_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/dataclass_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/enum_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/model_visitor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/visitor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/api/test_programmatic_api.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/auth/auth_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/auth/test_auth_base.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/auth/test_auth_plugins.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/cli/cli_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_backup_diff.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_edge_cases.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_edge_cases_comprehensive.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_internal_utils.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/cli/test_http_pagination_cli.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/context_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/test_core_import_path.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/test_file_manager.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/test_import_collector.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/test_render_context.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/test_render_context_imports.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/test_render_context_relative_paths.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/core_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/loader/parameters/test_inline_enum_array_params.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/loader/test_extractor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/loader/test_top_level_enum_extraction.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_cyclic_properties.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_direct_cycle.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_existing_schema.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_list_response.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_missing_ref.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_new_schema.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_stripped_suffix.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/keywords_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_all_of_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_any_of_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_array_items_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_one_of_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_properties_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/parsing_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_context.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_cycle_detection.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_cycle_helpers.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_improved_schema_naming.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_logging.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_ref_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_schema_finalizer.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_schema_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_schema_parser_list_response.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_type_parser.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_detect_circular_imports.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_edge_cases_integration.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_edge_cases_systematic.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_exceptions_module.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_forward_references.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_http_transport.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_import_resolution.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_ir.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_ir_schema.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_extensive.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_invalid_refs.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_malformed.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_media_types.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_pagination.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_parsing_context.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_protocol_defaults.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_schema_parser_specific_case.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_schemas.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_simple_self_ref_check.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_streaming_helpers.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_telemetry.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_telemetry_client.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_utils.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_warning_collector.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_code_writer.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_documentation_writer.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_line_writer.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_python_construct_renderer_json_wizard.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/writers/writers_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/emitters_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_client_emitter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_docs_emitter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_duplicate_operations.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_endpoints_emitter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_list_response_generation.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_models_emitter.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/examples/test_developer_experience_demo.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/generation/generation_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/generation/test_external_core_package.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/specs/minimal_addmessage_like.json +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/test_addmessage_like_issues.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/test_agent_include_parameter_typing.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/test_message_batch_response_issue.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_array_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_endpoint_utils.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_endpoint_utils_extended.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_get_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_named_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_named_type_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_object_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_put_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_type_cleaner.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_type_helper.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_url_utils.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_utils_helpers.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/integration/test_generated_code_structure.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/integrations/integrations_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_business_swagger_message_type.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_end_to_end_business_swagger.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_end_to_end_petstore.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_name_collisions.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/specs/response_unwrapping_spec.yaml +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/test_analysis_overview.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/test_init.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_business_swagger_integration.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_contracts_types.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_missing_imports_bug.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_reference_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_response_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_response_strategy.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_response_strategy_simplified.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_schema_resolver.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_schema_resolver_enums.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_type_service.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/generators_analysis.md +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_dataclass_integration.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_docstring_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_match_case_response.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_overload_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_request_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_response_handler_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_response_handler_generator_strategy.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_signature_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_url_args_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/test_import_analyzer.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/test_import_analyzer.py.bak +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/test_parameter_processor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/test_endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_alias_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_dataclass_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_dataclass_generator_json_wizard.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_enum_generator.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_json_value_integration.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_json_value_wrapper.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/test_client_visitor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/test_model_visitor.py +0 -0
- {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/test_visitor.py +0 -0
|
@@ -1,6 +1,38 @@
|
|
|
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
|
+
|
|
23
|
+
## v0.19.0 (2025-10-18)
|
|
24
|
+
|
|
25
|
+
### Chores
|
|
26
|
+
|
|
27
|
+
- **release**: Sync __init__.py version [skip ci]
|
|
28
|
+
([`4938f48`](https://github.com/mindhiveoy/pyopenapi_gen/commit/4938f4840650dc56573ca3294d782f74ea89dc65))
|
|
29
|
+
|
|
30
|
+
### Features
|
|
31
|
+
|
|
32
|
+
- **codegen**: Integrate DataclassSerializer for request body serialization
|
|
33
|
+
([`0b5b01f`](https://github.com/mindhiveoy/pyopenapi_gen/commit/0b5b01f3e7a5a1d7d57298088bf2543920517855))
|
|
34
|
+
|
|
35
|
+
|
|
4
36
|
## v0.18.0 (2025-10-14)
|
|
5
37
|
|
|
6
38
|
### Bug Fixes
|
|
@@ -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">
|
|
@@ -6005,7 +6008,7 @@
|
|
|
6005
6008
|
</class>
|
|
6006
6009
|
</classes>
|
|
6007
6010
|
</package>
|
|
6008
|
-
<package name="pyopenapi_gen.visit.endpoint.generators" line-rate="0.
|
|
6011
|
+
<package name="pyopenapi_gen.visit.endpoint.generators" line-rate="0.8881" branch-rate="0" complexity="0">
|
|
6009
6012
|
<classes>
|
|
6010
6013
|
<class name="__init__.py" filename="pyopenapi_gen/visit/endpoint/generators/__init__.py" complexity="0" line-rate="1" branch-rate="0">
|
|
6011
6014
|
<methods/>
|
|
@@ -6082,7 +6085,7 @@
|
|
|
6082
6085
|
<line number="123" hits="1"/>
|
|
6083
6086
|
</lines>
|
|
6084
6087
|
</class>
|
|
6085
|
-
<class name="endpoint_method_generator.py" filename="pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py" complexity="0" line-rate="0.
|
|
6088
|
+
<class name="endpoint_method_generator.py" filename="pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py" complexity="0" line-rate="0.9291" branch-rate="0">
|
|
6086
6089
|
<methods/>
|
|
6087
6090
|
<lines>
|
|
6088
6091
|
<line number="1" hits="1"/>
|
|
@@ -6152,30 +6155,28 @@
|
|
|
6152
6155
|
<line number="127" hits="1"/>
|
|
6153
6156
|
<line number="131" hits="1"/>
|
|
6154
6157
|
<line number="134" hits="1"/>
|
|
6155
|
-
<line number="
|
|
6158
|
+
<line number="137" hits="1"/>
|
|
6156
6159
|
<line number="138" hits="1"/>
|
|
6157
|
-
<line number="139" hits="1"/>
|
|
6158
|
-
<line number="140" hits="1"/>
|
|
6159
6160
|
<line number="141" hits="1"/>
|
|
6160
6161
|
<line number="142" hits="1"/>
|
|
6161
6162
|
<line number="143" hits="1"/>
|
|
6162
6163
|
<line number="144" hits="1"/>
|
|
6163
6164
|
<line number="145" hits="1"/>
|
|
6164
6165
|
<line number="146" hits="1"/>
|
|
6166
|
+
<line number="147" hits="1"/>
|
|
6167
|
+
<line number="148" hits="1"/>
|
|
6165
6168
|
<line number="149" hits="1"/>
|
|
6166
|
-
<line number="
|
|
6169
|
+
<line number="152" hits="1"/>
|
|
6167
6170
|
<line number="153" hits="1"/>
|
|
6168
|
-
<line number="155" hits="1"/>
|
|
6169
6171
|
<line number="156" hits="1"/>
|
|
6170
|
-
<line number="
|
|
6171
|
-
<line number="
|
|
6172
|
-
<line number="
|
|
6173
|
-
<line number="
|
|
6172
|
+
<line number="158" hits="1"/>
|
|
6173
|
+
<line number="159" hits="1"/>
|
|
6174
|
+
<line number="160" hits="1"/>
|
|
6175
|
+
<line number="164" hits="1"/>
|
|
6174
6176
|
<line number="165" hits="1"/>
|
|
6175
|
-
<line number="
|
|
6177
|
+
<line number="166" hits="1"/>
|
|
6178
|
+
<line number="168" hits="1"/>
|
|
6176
6179
|
<line number="170" hits="1"/>
|
|
6177
|
-
<line number="171" hits="1"/>
|
|
6178
|
-
<line number="172" hits="1"/>
|
|
6179
6180
|
<line number="173" hits="1"/>
|
|
6180
6181
|
<line number="174" hits="1"/>
|
|
6181
6182
|
<line number="175" hits="1"/>
|
|
@@ -6193,24 +6194,27 @@
|
|
|
6193
6194
|
<line number="187" hits="1"/>
|
|
6194
6195
|
<line number="188" hits="1"/>
|
|
6195
6196
|
<line number="189" hits="1"/>
|
|
6196
|
-
<line number="
|
|
6197
|
-
<line number="
|
|
6198
|
-
<line number="
|
|
6197
|
+
<line number="190" hits="1"/>
|
|
6198
|
+
<line number="191" hits="1"/>
|
|
6199
|
+
<line number="192" hits="1"/>
|
|
6199
6200
|
<line number="194" hits="0"/>
|
|
6200
6201
|
<line number="195" hits="0"/>
|
|
6201
6202
|
<line number="196" hits="0"/>
|
|
6202
6203
|
<line number="197" hits="0"/>
|
|
6203
6204
|
<line number="198" hits="0"/>
|
|
6204
6205
|
<line number="199" hits="0"/>
|
|
6205
|
-
<line number="
|
|
6206
|
+
<line number="200" hits="0"/>
|
|
6207
|
+
<line number="201" hits="0"/>
|
|
6208
|
+
<line number="202" hits="0"/>
|
|
6206
6209
|
<line number="204" hits="1"/>
|
|
6207
|
-
<line number="205" hits="1"/>
|
|
6208
|
-
<line number="206" hits="1"/>
|
|
6209
6210
|
<line number="207" hits="1"/>
|
|
6210
6211
|
<line number="208" hits="1"/>
|
|
6212
|
+
<line number="209" hits="1"/>
|
|
6213
|
+
<line number="210" hits="1"/>
|
|
6211
6214
|
<line number="211" hits="1"/>
|
|
6212
|
-
<line number="
|
|
6213
|
-
<line number="
|
|
6215
|
+
<line number="214" hits="1"/>
|
|
6216
|
+
<line number="216" hits="1"/>
|
|
6217
|
+
<line number="218" hits="1"/>
|
|
6214
6218
|
</lines>
|
|
6215
6219
|
</class>
|
|
6216
6220
|
<class name="overload_generator.py" filename="pyopenapi_gen/visit/endpoint/generators/overload_generator.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)
|
|
@@ -130,6 +130,9 @@ class EndpointMethodGenerator:
|
|
|
130
130
|
|
|
131
131
|
writer = CodeWriter()
|
|
132
132
|
|
|
133
|
+
# Import DataclassSerializer for automatic conversion
|
|
134
|
+
context.add_import(f"{context.core_package_name}.utils", "DataclassSerializer")
|
|
135
|
+
|
|
133
136
|
# Generate implementation signature (accepts all content-type parameters as optional)
|
|
134
137
|
impl_sig = self.overload_generator.generate_implementation_signature(op, context, response_strategy)
|
|
135
138
|
writer.write_block(impl_sig)
|
|
@@ -168,7 +171,7 @@ class EndpointMethodGenerator:
|
|
|
168
171
|
|
|
169
172
|
# Generate request call for this content type
|
|
170
173
|
if content_type == "application/json":
|
|
171
|
-
writer.write_line(f"json_body = {param_info['name']}")
|
|
174
|
+
writer.write_line(f"json_body = DataclassSerializer.serialize({param_info['name']})")
|
|
172
175
|
writer.write_line("response = await self._transport.request(")
|
|
173
176
|
writer.indent()
|
|
174
177
|
writer.write_line(f'"{op.method.value.upper()}", url,')
|
|
@@ -178,7 +181,7 @@ class EndpointMethodGenerator:
|
|
|
178
181
|
writer.dedent()
|
|
179
182
|
writer.write_line(")")
|
|
180
183
|
elif content_type == "multipart/form-data":
|
|
181
|
-
writer.write_line(f"files_data = {param_info['name']}")
|
|
184
|
+
writer.write_line(f"files_data = DataclassSerializer.serialize({param_info['name']})")
|
|
182
185
|
writer.write_line("response = await self._transport.request(")
|
|
183
186
|
writer.indent()
|
|
184
187
|
writer.write_line(f'"{op.method.value.upper()}", url,')
|
|
@@ -188,7 +191,7 @@ class EndpointMethodGenerator:
|
|
|
188
191
|
writer.dedent()
|
|
189
192
|
writer.write_line(")")
|
|
190
193
|
else:
|
|
191
|
-
writer.write_line(f"data = {param_info['name']}")
|
|
194
|
+
writer.write_line(f"data = DataclassSerializer.serialize({param_info['name']})")
|
|
192
195
|
writer.write_line("response = await self._transport.request(")
|
|
193
196
|
writer.indent()
|
|
194
197
|
writer.write_line(f'"{op.method.value.upper()}", url,')
|
|
@@ -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."""
|