pyopenapi-gen 0.21.0__tar.gz → 0.22.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.21.0 → pyopenapi_gen-0.22.0}/CHANGELOG.md +333 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/CLAUDE.md +21 -4
- pyopenapi_gen-0.22.0/PKG-INFO +1139 -0
- pyopenapi_gen-0.22.0/README.md +1081 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/coverage.xml +729 -274
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/docs/README.md +2 -1
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/docs/architecture.md +34 -10
- pyopenapi_gen-0.22.0/docs/endpoint_visitor.md +159 -0
- pyopenapi_gen-0.22.0/docs/protocol_and_mock_generation.md +693 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/poetry.lock +50 -50
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/pyproject.toml +3 -3
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/__init__.py +1 -1
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/emitters/endpoints_emitter.py +18 -3
- pyopenapi_gen-0.22.0/src/pyopenapi_gen/emitters/mocks_emitter.py +185 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/generator/client_generator.py +15 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/client_visitor.py +253 -2
- pyopenapi_gen-0.22.0/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +292 -0
- pyopenapi_gen-0.22.0/src/pyopenapi_gen/visit/endpoint/generators/mock_generator.py +140 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/endpoint/generators/url_args_generator.py +28 -4
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/emitters/test_endpoints_emitter.py +11 -5
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/generation_issues/test_overload_naming_issues.py +2 -1
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/generators/test_url_args_generator.py +285 -5
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/test_endpoint_visitor.py +5 -2
- pyopenapi_gen-0.22.0/tests/visit/endpoint/test_protocol_mock_generation.py +374 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/test_client_visitor.py +14 -4
- pyopenapi_gen-0.21.0/PKG-INFO +0 -645
- pyopenapi_gen-0.21.0/README.md +0 -587
- pyopenapi_gen-0.21.0/docs/endpoint_visitor.md +0 -12
- pyopenapi_gen-0.21.0/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +0 -84
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.bandit +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.cursor/mcp.json +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.cursor/rules/architecture.mdc +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.cursor/rules/coding-conventions.mdc +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.cursor/rules/project-goal.mdc +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.cursor/rules/testing.mdc +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/BRANCH_PROTECTION.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/CLAUDE_CONFIGURATION.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/CODEOWNERS +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/dependabot.yml +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/workflows/ci.yml +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/workflows/claude-auto-approve.yml +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/workflows/claude-review-trigger.yml +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/workflows/claude.yml +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/workflows/pr-checks.yml +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/workflows/production-release.yml.backup +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/workflows/promote-to-staging.yml +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/workflows/semantic-release.yml +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/workflows/staging-publish.yml +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.github/workflows/testpypi-publish.yml +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.gitignore +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.python-version +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/.vscode/settings.json +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/CONTRIBUTING.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/LICENSE +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/Makefile +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/docs/helpers.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/docs/ir_models.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/docs/line_writer.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/docs/loader.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/docs/model_visitor.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/docs/release-automation.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/docs/render_context.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/docs/unified_type_resolution.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/input/business_swagger.json +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/input/minimal_swagger.json +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/input/minimal_syntax_test.json +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/input/test_name_collision_spec.json +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/mkdocs.yml +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/scripts/sync_version_to_init.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/scripts/validate_version_sync.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/__main__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/cli.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/context/CLAUDE.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/context/file_manager.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/context/import_collector.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/context/render_context.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/CLAUDE.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/auth/base.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/auth/plugins.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/exceptions.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/http_status_codes.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/http_transport.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/loader/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/loader/loader.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/loader/operations/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/loader/operations/parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/loader/operations/post_processor.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/loader/operations/request_body.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/loader/parameters/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/loader/parameters/parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/loader/responses/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/loader/responses/parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/loader/schemas/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/loader/schemas/extractor.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/pagination.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/common/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/existing_schema.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/common/type_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/context.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/cycle_helpers.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/keywords/all_of_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/keywords/any_of_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/keywords/array_items_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/keywords/one_of_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/keywords/properties_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/schema_finalizer.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/schema_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/transformers/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/parsing/unified_cycle_detection.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/postprocess_manager.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/schemas.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/streaming_helpers.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/telemetry.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/utils.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/warning_collector.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/writers/code_writer.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/writers/documentation_writer.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/writers/line_writer.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core/writers/python_construct_renderer.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/core_package_template/README.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/emit/models_emitter.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/emitters/CLAUDE.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/emitters/client_emitter.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/emitters/core_emitter.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/emitters/docs_emitter.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/emitters/exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/emitters/models_emitter.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/generator/CLAUDE.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/CLAUDE.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/endpoint_utils.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/type_cleaner.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/type_helper.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/type_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/type_resolution/array_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/type_resolution/composition_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/type_resolution/finalizer.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/type_resolution/named_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/type_resolution/object_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/type_resolution/primitive_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/type_resolution/resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/helpers/url_utils.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/http_types.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/ir.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/py.typed +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/CLAUDE.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/contracts/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/contracts/protocols.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/contracts/types.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/resolvers/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/resolvers/reference_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/resolvers/response_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/resolvers/schema_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/services/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/services/type_service.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/strategies/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/types/strategies/response_strategy.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/CLAUDE.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/docs_visitor.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/endpoint/generators/overload_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/endpoint/generators/request_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/endpoint/generators/signature_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/endpoint/processors/import_analyzer.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/exception_visitor.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/model/alias_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/model/dataclass_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/model/enum_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/model/model_visitor.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/src/pyopenapi_gen/visit/visitor.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/api/test_programmatic_api.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/auth/auth_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/auth/test_auth_base.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/auth/test_auth_plugins.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/cli/cli_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/cli/test_cli_backup_diff.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/cli/test_cli_edge_cases.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/cli/test_cli_edge_cases_comprehensive.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/cli/test_cli_internal_utils.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/cli/test_http_pagination_cli.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/context/context_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/context/test_core_import_path.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/context/test_file_manager.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/context/test_import_collector.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/context/test_render_context.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/context/test_render_context_imports.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/context/test_render_context_relative_paths.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/core_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/loader/parameters/test_inline_enum_array_params.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/loader/test_extractor.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/loader/test_top_level_enum_extraction.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/common/ref_resolution/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/common/ref_resolution/helpers/test_cyclic_properties.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/common/ref_resolution/helpers/test_direct_cycle.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/common/ref_resolution/helpers/test_existing_schema.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/common/ref_resolution/helpers/test_list_response.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/common/ref_resolution/helpers/test_missing_ref.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/common/ref_resolution/helpers/test_new_schema.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/common/ref_resolution/helpers/test_stripped_suffix.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/keywords/keywords_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/keywords/test_all_of_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/keywords/test_any_of_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/keywords/test_array_items_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/keywords/test_one_of_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/keywords/test_properties_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/parsing_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/test_context.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/test_cycle_detection.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/test_cycle_helpers.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/test_improved_schema_naming.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/test_inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/test_inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/test_logging.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/test_ref_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/test_schema_finalizer.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/test_schema_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/test_schema_parser_list_response.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/parsing/test_type_parser.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_dataclass_serialization.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_detect_circular_imports.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_edge_cases_integration.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_edge_cases_systematic.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_exceptions_module.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_forward_references.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_http_transport.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_import_resolution.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_ir.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_ir_schema.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_loader.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_loader_extensive.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_loader_invalid_refs.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_loader_malformed.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_loader_media_types.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_pagination.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_parsing_context.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_protocol_defaults.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_schema_parser_specific_case.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_schemas.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_simple_self_ref_check.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_streaming_helpers.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_telemetry.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_telemetry_client.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_utils.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/test_warning_collector.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/writers/test_code_writer.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/writers/test_documentation_writer.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/writers/test_line_writer.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/writers/test_python_construct_renderer_json_wizard.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/core/writers/writers_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/emitters/emitters_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/emitters/test_client_emitter.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/emitters/test_docs_emitter.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/emitters/test_duplicate_operations.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/emitters/test_exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/emitters/test_list_response_generation.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/emitters/test_models_emitter.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/end_to_end/test_dataclass_serialization_e2e.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/examples/test_developer_experience_demo.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/generation/generation_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/generation/test_external_core_package.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/generation_issues/specs/minimal_addmessage_like.json +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/generation_issues/test_addmessage_like_issues.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/generation_issues/test_agent_include_parameter_typing.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/generation_issues/test_message_batch_response_issue.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/test_array_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/test_endpoint_utils.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/test_endpoint_utils_extended.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/test_get_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/test_named_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/test_named_type_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/test_object_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/test_put_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/test_type_cleaner.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/test_type_helper.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/test_url_utils.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/helpers/test_utils_helpers.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/integration/test_field_mapping_e2e.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/integration/test_generated_code_structure.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/integrations/integrations_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/integrations/test_business_swagger_message_type.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/integrations/test_end_to_end_business_swagger.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/integrations/test_end_to_end_petstore.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/integrations/test_name_collisions.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/specs/response_unwrapping_spec.yaml +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/test_analysis_overview.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/test_init.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/types/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/types/test_business_swagger_integration.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/types/test_contracts_types.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/types/test_missing_imports_bug.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/types/test_reference_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/types/test_response_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/types/test_response_strategy.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/types/test_response_strategy_simplified.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/types/test_schema_resolver.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/types/test_schema_resolver_enums.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/types/test_type_service.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/generators/generators_analysis.md +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/generators/test_dataclass_integration.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/generators/test_docstring_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/generators/test_endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/generators/test_match_case_response.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/generators/test_overload_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/generators/test_request_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/generators/test_response_handler_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/generators/test_response_handler_generator_strategy.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/generators/test_signature_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/processors/test_import_analyzer.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/processors/test_import_analyzer.py.bak +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/endpoint/processors/test_parameter_processor.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/model/test_alias_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/model/test_dataclass_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/model/test_dataclass_generator_json_wizard.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/model/test_enum_generator.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/model/test_json_value_integration.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/model/test_json_value_wrapper.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/test_model_visitor.py +0 -0
- {pyopenapi_gen-0.21.0 → pyopenapi_gen-0.22.0}/tests/visit/test_visitor.py +0 -0
|
@@ -1,6 +1,339 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
## v0.22.0 (2025-10-27)
|
|
5
|
+
|
|
6
|
+
### Chores
|
|
7
|
+
|
|
8
|
+
- **release**: Sync __init__.py version [skip ci]
|
|
9
|
+
([`962813f`](https://github.com/mindhiveoy/pyopenapi_gen/commit/962813f26956b105f2ff6e470d80195343cfc95a))
|
|
10
|
+
|
|
11
|
+
### Documentation
|
|
12
|
+
|
|
13
|
+
- **architecture**: Update docs for Protocol and Mock generation
|
|
14
|
+
([`8574371`](https://github.com/mindhiveoy/pyopenapi_gen/commit/8574371565138dd4ebd59cc5822a813d152e7e26))
|
|
15
|
+
|
|
16
|
+
Update architecture documentation to include Protocol and Mock generation in the pipeline. Rewrite
|
|
17
|
+
endpoint_visitor documentation with Why→What→How structure.
|
|
18
|
+
|
|
19
|
+
Changes to docs/architecture.md: - Updated Core Components section to mention Protocol and Mock
|
|
20
|
+
generation - Added Protocol Generation description to Visitor System - Added MocksEmitter to
|
|
21
|
+
Emitter System - Updated architecture diagram to show Protocol and Mock generation nodes - Updated
|
|
22
|
+
Stage 2 (Visiting) to include Protocol and Mock generation steps - Removed "NEW" version markers
|
|
23
|
+
for unified type resolution
|
|
24
|
+
|
|
25
|
+
Changes to docs/endpoint_visitor.md: - Complete rewrite with Why→What→How structure - Added "Why
|
|
26
|
+
This Visitor?" section explaining purpose - Documented three key outputs: Implementation,
|
|
27
|
+
Protocol, Mock - Added Core Responsibilities section with detailed subsections - Documented key
|
|
28
|
+
methods (visit_IROperation, emit_endpoint_client_class, etc.) - Added code examples for Protocol
|
|
29
|
+
and Mock generation - Included Generated Structure section showing all three outputs - Added
|
|
30
|
+
Testing Benefits section
|
|
31
|
+
|
|
32
|
+
Changes to docs/README.md: - Added link to protocol_and_mock_generation.md guide - Updated Endpoint
|
|
33
|
+
Visitor description to mention Protocol and Mock support - Maintains consistent documentation
|
|
34
|
+
index
|
|
35
|
+
|
|
36
|
+
Changes to CLAUDE.md: - Added Testing Support subgraph to architecture diagram - Added Testing
|
|
37
|
+
Support section under Generated Client Features - Documented Protocol definitions, Mock helpers,
|
|
38
|
+
Compile-time validation - Added protocol_and_mock_generation.md to documentation index - Removed
|
|
39
|
+
"NEW" markers from all documentation references
|
|
40
|
+
|
|
41
|
+
Documentation standards applied: - Why→What→How structure throughout - Mermaid diagrams for complex
|
|
42
|
+
concepts - Progressive information architecture - Code examples with proper syntax - No version
|
|
43
|
+
history in content
|
|
44
|
+
|
|
45
|
+
Consistency improvements: - All docs now mention Protocol and Mock generation where relevant -
|
|
46
|
+
Architecture documentation aligns with implementation - Component docs reference supporting
|
|
47
|
+
components correctly - Documentation index is complete and accurate
|
|
48
|
+
|
|
49
|
+
Files: - docs/architecture.md (modified) - docs/endpoint_visitor.md (modified, complete rewrite) -
|
|
50
|
+
docs/README.md (modified) - CLAUDE.md (modified)
|
|
51
|
+
|
|
52
|
+
- **guides**: Add comprehensive Protocol and Mock generation guide
|
|
53
|
+
([`aea11da`](https://github.com/mindhiveoy/pyopenapi_gen/commit/aea11dac6c560100e0fc43befc97b3ef6c2069e6))
|
|
54
|
+
|
|
55
|
+
Add complete documentation guide for Protocol-based testing and mock helper classes.
|
|
56
|
+
|
|
57
|
+
Documentation structure (60+ sections): - Why Protocol and Mock generation exists - What gets
|
|
58
|
+
generated (Protocol, Implementation, Mocks) - How the generation pipeline works - Usage patterns
|
|
59
|
+
(Manual, Auto-Generated, Hybrid) - Dependency injection pattern examples - Compile-time validation
|
|
60
|
+
examples - Generated file structure - Implementation details and algorithms - Testing benefits -
|
|
61
|
+
Comparison with traditional mocking approaches - Advanced scenarios (stateful mocks, parametrised
|
|
62
|
+
behavior)
|
|
63
|
+
|
|
64
|
+
Key sections: 1. Why Protocol and Mock Generation? - Problem: Testing requires separation of
|
|
65
|
+
business logic from HTTP - Solution: Auto-generated structural contracts and mock helpers
|
|
66
|
+
|
|
67
|
+
2. What Gets Generated? - Protocol definitions with @runtime_checkable - Implementation classes
|
|
68
|
+
inheriting from Protocols - Mock helper classes with NotImplementedError stubs
|
|
69
|
+
|
|
70
|
+
3. How It Works - Generation pipeline with mermaid diagrams - Protocol extraction algorithm - Mock
|
|
71
|
+
generation algorithm
|
|
72
|
+
|
|
73
|
+
4. Usage Patterns - Manual Protocol implementation (full control) - Auto-generated mock helpers
|
|
74
|
+
(quick setup) - Hybrid auto-create with MockAPIClient (partial mocks)
|
|
75
|
+
|
|
76
|
+
5. Dependency Injection Pattern - Business logic accepting Protocol types - Production usage with
|
|
77
|
+
real clients - Test usage with mock clients
|
|
78
|
+
|
|
79
|
+
6. Compile-Time Validation - Protocol enforcement by mypy - Mock validation examples - API change
|
|
80
|
+
detection at compile time
|
|
81
|
+
|
|
82
|
+
Documentation approach: - Uses Why→What→How structure consistently - Includes mermaid diagrams for
|
|
83
|
+
complex flows - Provides complete code examples - Shows comparison with traditional approaches -
|
|
84
|
+
Focuses on practical developer experience - No version history markers
|
|
85
|
+
|
|
86
|
+
Technical accuracy: - All code examples are syntactically correct - Examples match generated code
|
|
87
|
+
structure - Algorithms documented match implementation - File paths and structures are accurate
|
|
88
|
+
|
|
89
|
+
Files: - docs/protocol_and_mock_generation.md (new, ~500 lines)
|
|
90
|
+
|
|
91
|
+
- **readme**: Update README with auto-generated mock helpers section
|
|
92
|
+
([`78225a6`](https://github.com/mindhiveoy/pyopenapi_gen/commit/78225a6b8dc16810c54da3bc9eaf4d1f042e4adf))
|
|
93
|
+
|
|
94
|
+
Update README with Auto-Generated Mock Helper Classes section documenting the mocks/ directory
|
|
95
|
+
structure and usage patterns.
|
|
96
|
+
|
|
97
|
+
Content added: - Auto-Generated Mock Helper Classes section (after Protocol-Based Design) -
|
|
98
|
+
Generated mocks/ directory structure diagram - Quick start examples for using mock helpers -
|
|
99
|
+
Hybrid auto-create pattern with MockAPIClient - NotImplementedError guidance message examples -
|
|
100
|
+
Comparison: Manual Protocol vs Auto-Generated mocks - When to use each approach
|
|
101
|
+
|
|
102
|
+
Documentation structure: 1. Generated Mocks Structure - Package layout with mocks/ and endpoints/
|
|
103
|
+
subdirectories
|
|
104
|
+
|
|
105
|
+
2. Quick Start with Auto-Generated Mocks - Inherit from MockXClient, override specific methods - Use
|
|
106
|
+
MockAPIClient with hybrid auto-create
|
|
107
|
+
|
|
108
|
+
3. Hybrid Auto-Create Pattern - Partial mock injection - Auto-creation for unimplemented endpoints
|
|
109
|
+
|
|
110
|
+
4. NotImplementedError Guidance - Example error messages with override instructions
|
|
111
|
+
|
|
112
|
+
5. Comparison Section - Manual Protocol implementation (full control) - Auto-generated helpers (less
|
|
113
|
+
boilerplate) - When to use each approach
|
|
114
|
+
|
|
115
|
+
Content placement: - Added after "Real-World Testing Example" (line ~870) - Before "Known
|
|
116
|
+
Limitations" section - Maintains logical flow from Protocol basics to mock helpers
|
|
117
|
+
|
|
118
|
+
Documentation cleanup: - Removed "New in v0.22+" version marker - Focus on what exists, not when it
|
|
119
|
+
was added - Follows "no history in guides" principle
|
|
120
|
+
|
|
121
|
+
Files: - README.md (modified, ~130 lines added)
|
|
122
|
+
|
|
123
|
+
### Features
|
|
124
|
+
|
|
125
|
+
- **emitters**: Add MocksEmitter for generating mocks/ package structure
|
|
126
|
+
([`824d377`](https://github.com/mindhiveoy/pyopenapi_gen/commit/824d377233d01b0d42af1f803d773785e5f1dc38))
|
|
127
|
+
|
|
128
|
+
Implement MocksEmitter to generate complete mocks/ directory structure with MockAPIClient and
|
|
129
|
+
tag-based mock classes.
|
|
130
|
+
|
|
131
|
+
Implementation details: - Add mocks_emitter.py with MocksEmitter class - Generate mocks/ package
|
|
132
|
+
with endpoints/ subdirectory - Create MockAPIClient with hybrid auto-create pattern - Generate
|
|
133
|
+
mock_{tag}.py files for each endpoint client - Create __init__.py files with proper exports -
|
|
134
|
+
Integrate with ClientGenerator orchestration
|
|
135
|
+
|
|
136
|
+
Package structure generated: ``` mocks/ ├── __init__.py # Exports MockAPIClient and all mocks ├──
|
|
137
|
+
mock_client.py # MockAPIClient with auto-create └── endpoints/ ├── __init__.py # Exports all
|
|
138
|
+
MockXClient classes ├── mock_users.py # MockUsersClient └── mock_orders.py # MockOrdersClient ```
|
|
139
|
+
|
|
140
|
+
Hybrid auto-create pattern: - MockAPIClient accepts optional endpoint client overrides -
|
|
141
|
+
Auto-creates mock instances for non-overridden endpoints - Allows partial mock injection for
|
|
142
|
+
targeted testing - Provides clear NotImplementedError when unimplemented methods are called
|
|
143
|
+
|
|
144
|
+
Integration changes: - Update endpoints_emitter.py to call generate_endpoint_protocol() - Modify
|
|
145
|
+
client_generator.py to orchestrate mocks generation - Ensure Protocol generation happens before
|
|
146
|
+
implementation generation - Add mocks/ to generated client package structure
|
|
147
|
+
|
|
148
|
+
Benefits: - Complete mocks/ package ready to use immediately after generation - Hybrid pattern
|
|
149
|
+
allows testing with minimal mock implementation - Clear separation between Protocol contracts and
|
|
150
|
+
mock helpers - Maintains consistency with endpoints/ structure
|
|
151
|
+
|
|
152
|
+
Files: - src/pyopenapi_gen/emitters/mocks_emitter.py (new) -
|
|
153
|
+
src/pyopenapi_gen/emitters/endpoints_emitter.py (modified) -
|
|
154
|
+
src/pyopenapi_gen/generator/client_generator.py (modified)
|
|
155
|
+
|
|
156
|
+
- **endpoints**: Add mock helper class generation with NotImplementedError stubs
|
|
157
|
+
([`63bbf51`](https://github.com/mindhiveoy/pyopenapi_gen/commit/63bbf51c38d3994aa3233b06237c05f71950a58b))
|
|
158
|
+
|
|
159
|
+
Implement mock helper class generation to create base classes for testing with helpful error
|
|
160
|
+
messages.
|
|
161
|
+
|
|
162
|
+
Implementation details: - Add mock_generator.py with MockGenerator class - Implement
|
|
163
|
+
generate_endpoint_mock_class() in EndpointVisitor - Generate NotImplementedError stubs for all
|
|
164
|
+
operation methods - Create helpful error messages with override examples - Add
|
|
165
|
+
generate_client_mock_class() in ClientVisitor for main client mock - Maintain signature
|
|
166
|
+
compatibility with Protocol contracts
|
|
167
|
+
|
|
168
|
+
Technical approach: - Reuse EndpointMethodGenerator signature extraction - Generate method stubs
|
|
169
|
+
with NotImplementedError and guidance messages - Include code examples in error messages showing
|
|
170
|
+
how to override - Ensure mock classes can be used as base classes for test inheritance - Support
|
|
171
|
+
both endpoint client mocks and main API client mock
|
|
172
|
+
|
|
173
|
+
Error message format: ```python raise NotImplementedError( "MockUsersClient.get_user() not
|
|
174
|
+
implemented.\n" "Override this method in your test:\n" " class
|
|
175
|
+
TestUsersClient(MockUsersClient):\n" " async def get_user(self, user_id: int) -> User:\n" " return
|
|
176
|
+
User(...)" ) ```
|
|
177
|
+
|
|
178
|
+
Benefits: - Reduces boilerplate in test code - Provides clear guidance when methods are called but
|
|
179
|
+
not implemented - Enables selective method override pattern - Maintains type compatibility with
|
|
180
|
+
Protocols
|
|
181
|
+
|
|
182
|
+
Files: - src/pyopenapi_gen/visit/endpoint/generators/mock_generator.py (new) -
|
|
183
|
+
src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py (modified) -
|
|
184
|
+
src/pyopenapi_gen/visit/client_visitor.py (modified)
|
|
185
|
+
|
|
186
|
+
- **endpoints**: Add Protocol generation for endpoint structural typing
|
|
187
|
+
([`1bf42d8`](https://github.com/mindhiveoy/pyopenapi_gen/commit/1bf42d84b063647aa2460b2b337601b0fb2d7d46))
|
|
188
|
+
|
|
189
|
+
Implement Protocol generation infrastructure to create @runtime_checkable Protocol classes for all
|
|
190
|
+
endpoint clients.
|
|
191
|
+
|
|
192
|
+
Implementation details: - Add protocol_helpers.py with ProtocolGenerator class - Implement
|
|
193
|
+
generate_endpoint_protocol() in EndpointVisitor - Extract method signatures from generated
|
|
194
|
+
implementation code - Handle @overload decorated methods with proper stub conversion - Convert
|
|
195
|
+
AsyncIterator methods to def signatures per PEP 544 - Add Protocol import management in
|
|
196
|
+
RenderContext
|
|
197
|
+
|
|
198
|
+
Technical approach: - Parse generated method code line-by-line to extract signatures - Detect
|
|
199
|
+
signature boundaries and multi-line parameter lists - Convert implementation signatures to
|
|
200
|
+
Protocol stubs (: → : ...) - Ensure Protocol classes use @runtime_checkable decorator - Generate
|
|
201
|
+
comprehensive Protocol docstrings
|
|
202
|
+
|
|
203
|
+
Benefits: - Enables structural typing and dependency injection - Provides compile-time validation
|
|
204
|
+
with mypy - Allows mock implementations to be type-checked against Protocol contracts - Zero
|
|
205
|
+
runtime overhead (Protocols are type-checking only)
|
|
206
|
+
|
|
207
|
+
Files: - src/pyopenapi_gen/visit/protocol_helpers.py (new) -
|
|
208
|
+
src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py (modified)
|
|
209
|
+
|
|
210
|
+
### Refactoring
|
|
211
|
+
|
|
212
|
+
- **visit**: Remove unused protocol_helpers module
|
|
213
|
+
([`2389fc9`](https://github.com/mindhiveoy/pyopenapi_gen/commit/2389fc9301461a754d169bc5c971dc833ee2a305))
|
|
214
|
+
|
|
215
|
+
Remove protocol_helpers.py which was never imported or used:
|
|
216
|
+
|
|
217
|
+
Technical changes: - Deleted src/pyopenapi_gen/visit/protocol_helpers.py (110 lines) - Removed
|
|
218
|
+
unused import from client_visitor.py - Removed unused import from endpoint_visitor.py - Removed
|
|
219
|
+
unused self.protocol_generator instantiation in both visitors
|
|
220
|
+
|
|
221
|
+
Analysis showed: - Module had 20% test coverage only because it was never imported -
|
|
222
|
+
ProtocolGenerator class was never instantiated or used - Protocol generation is now handled
|
|
223
|
+
directly in EndpointVisitor.generate_endpoint_protocol() - All 1368 tests pass after removal,
|
|
224
|
+
confirming code was truly unused
|
|
225
|
+
|
|
226
|
+
Impact: - Zero functional impact (code was never executed) - Cleaner codebase with no dead code -
|
|
227
|
+
Improved endpoint_visitor.py coverage from 99% to 100%
|
|
228
|
+
|
|
229
|
+
### Testing
|
|
230
|
+
|
|
231
|
+
- **endpoints**: Add comprehensive Protocol and Mock generation tests
|
|
232
|
+
([`2da2cfb`](https://github.com/mindhiveoy/pyopenapi_gen/commit/2da2cfbd1d3a47d11a0525e8d8972403588c2ac4))
|
|
233
|
+
|
|
234
|
+
Add 8 real contract tests validating Protocol and Mock generation without mock theatre:
|
|
235
|
+
|
|
236
|
+
Test implementation: - tests/visit/endpoint/test_protocol_mock_generation.py created - Uses real
|
|
237
|
+
IROperation, IRParameter, IRRequestBody, IRResponse, IRSchema objects - No mocking of internal
|
|
238
|
+
components (EndpointMethodGenerator, CodeWriter) - Validates actual generated code structure and
|
|
239
|
+
content
|
|
240
|
+
|
|
241
|
+
Test coverage: - TestProtocolGeneration: 3 tests for Protocol class generation - Single operation
|
|
242
|
+
with @runtime_checkable decorator - Multiple operations handling - Import registration validation
|
|
243
|
+
- TestMockGeneration: 3 tests for Mock class generation - NotImplementedError stub generation -
|
|
244
|
+
Multiple operations stub handling - Helpful docstring and override guidance -
|
|
245
|
+
TestProtocolAndImplementationIntegration: 2 integration tests - Complete Protocol + Implementation
|
|
246
|
+
generation - Proper __init__ with transport and base_url
|
|
247
|
+
|
|
248
|
+
Quality improvements: - Eliminates mock theatre from test suite - Provides real behavioral
|
|
249
|
+
validation - Clear "Scenario" and "Expected Outcome" documentation - All tests use real objects,
|
|
250
|
+
no mocks
|
|
251
|
+
|
|
252
|
+
Test results: - All 8 new tests passing - Total test count: 1368/1368 passing - Coverage maintained
|
|
253
|
+
at 89% (above 85% requirement) - endpoint_visitor.py now at 100% coverage
|
|
254
|
+
|
|
255
|
+
- **generation**: Add comprehensive tests for Protocol and Mock generation
|
|
256
|
+
([`89dbb20`](https://github.com/mindhiveoy/pyopenapi_gen/commit/89dbb205ac476510db1e894fa06887c1e71f9ec2))
|
|
257
|
+
|
|
258
|
+
Add comprehensive test coverage for Protocol generation, mock helper generation, and integration
|
|
259
|
+
with the generation pipeline.
|
|
260
|
+
|
|
261
|
+
Test coverage added: - Protocol generation from endpoint operations - Mock helper class generation
|
|
262
|
+
with NotImplementedError stubs - MocksEmitter package structure generation - Integration with
|
|
263
|
+
EndpointsEmitter - @overload method handling in Protocols - AsyncIterator conversion (async def →
|
|
264
|
+
def) - Error message formatting and content
|
|
265
|
+
|
|
266
|
+
Test files modified: - tests/visit/endpoint/test_endpoint_visitor.py -
|
|
267
|
+
test_generate_endpoint_protocol__creates_protocol_class() -
|
|
268
|
+
test_generate_endpoint_protocol__handles_overload_methods() -
|
|
269
|
+
test_generate_endpoint_mock_class__creates_mock_with_stubs()
|
|
270
|
+
|
|
271
|
+
- tests/visit/test_client_visitor.py -
|
|
272
|
+
test_generate_client_mock_class__creates_mock_with_auto_create()
|
|
273
|
+
|
|
274
|
+
- tests/emitters/test_endpoints_emitter.py - test_emit__generates_protocols_with_implementations()
|
|
275
|
+
|
|
276
|
+
- tests/generation_issues/test_overload_naming_issues.py - Updated to handle Protocol generation in
|
|
277
|
+
output
|
|
278
|
+
|
|
279
|
+
Testing approach: - Use IROperation fixtures to test generation - Verify generated code structure
|
|
280
|
+
and content - Check Protocol stub format (: ...) - Validate error message content and formatting -
|
|
281
|
+
Ensure type annotations are preserved - Test integration across emitter pipeline
|
|
282
|
+
|
|
283
|
+
Coverage maintained: - All new code paths covered - Edge cases tested (overload, AsyncIterator,
|
|
284
|
+
multi-line signatures) - Integration tests verify end-to-end generation - Maintains project's ≥85%
|
|
285
|
+
coverage requirement
|
|
286
|
+
|
|
287
|
+
Quality verification: - All 1360 tests passing - No type checking errors (mypy strict mode) - No
|
|
288
|
+
linting violations (ruff) - Proper formatting (black)
|
|
289
|
+
|
|
290
|
+
Files: - tests/visit/endpoint/test_endpoint_visitor.py (modified) -
|
|
291
|
+
tests/visit/test_client_visitor.py (modified) - tests/emitters/test_endpoints_emitter.py
|
|
292
|
+
(modified) - tests/generation_issues/test_overload_naming_issues.py (modified)
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
## v0.21.1 (2025-10-24)
|
|
296
|
+
|
|
297
|
+
### Bug Fixes
|
|
298
|
+
|
|
299
|
+
- **codegen**: Fix enum parameter serialization in query, header, and path parameters
|
|
300
|
+
([`be5391f`](https://github.com/mindhiveoy/pyopenapi_gen/commit/be5391ff9fde14a1826aa217c077b06a0f832f8c))
|
|
301
|
+
|
|
302
|
+
Implement consistent parameter serialization using DataclassSerializer.serialize() for query,
|
|
303
|
+
header, and path parameters to handle enum-to-string conversion correctly.
|
|
304
|
+
|
|
305
|
+
Technical changes: - _write_query_params() now wraps all parameter values in
|
|
306
|
+
DataclassSerializer.serialize() - _write_header_params() now wraps all parameter values in
|
|
307
|
+
DataclassSerializer.serialize() - generate_url_and_args() serializes path params before f-string
|
|
308
|
+
interpolation - Added context.add_import() calls to ensure DataclassSerializer is imported in
|
|
309
|
+
generated code
|
|
310
|
+
|
|
311
|
+
Implementation approach: Query/header parameters use DataclassSerializer.serialize() in dict
|
|
312
|
+
construction: Required: "{param}": DataclassSerializer.serialize(param_var)
|
|
313
|
+
|
|
314
|
+
Optional: **{{"{param}": DataclassSerializer.serialize(param_var)} if param_var is not None else {}}
|
|
315
|
+
|
|
316
|
+
Path parameters are serialized before URL construction to prevent enum objects in f-strings (would
|
|
317
|
+
produce "EnumType.VALUE" instead of "value"): param_var = DataclassSerializer.serialize(param_var)
|
|
318
|
+
|
|
319
|
+
Breaking changes: None API changes: None (generated code behavior corrected to match intended
|
|
320
|
+
design)
|
|
321
|
+
|
|
322
|
+
Test coverage: - 5 new TDD tests validate enum serialization for all parameter types - All 1360
|
|
323
|
+
tests passing with 88.43% coverage - Integration tests confirm correct mypy validation and runtime
|
|
324
|
+
behavior
|
|
325
|
+
|
|
326
|
+
Fixes issue where enum parameters (e.g., DocumentStatus.INDEXED) were passed directly to httpx
|
|
327
|
+
instead of being converted to their string values ("indexed"), causing incorrect API calls.
|
|
328
|
+
|
|
329
|
+
Related: business_swagger.json list_documents endpoint with status parameter
|
|
330
|
+
|
|
331
|
+
### Chores
|
|
332
|
+
|
|
333
|
+
- **release**: Sync __init__.py version [skip ci]
|
|
334
|
+
([`823dc4e`](https://github.com/mindhiveoy/pyopenapi_gen/commit/823dc4e7083f17df7323aeebd9a400fd9d7aca5d))
|
|
335
|
+
|
|
336
|
+
|
|
4
337
|
## v0.21.0 (2025-10-23)
|
|
5
338
|
|
|
6
339
|
### Bug Fixes
|
|
@@ -476,7 +476,12 @@ graph TB
|
|
|
476
476
|
J --> K[Error Handling]
|
|
477
477
|
K --> L[Streaming Support]
|
|
478
478
|
end
|
|
479
|
-
|
|
479
|
+
|
|
480
|
+
subgraph "Testing Support"
|
|
481
|
+
Q[Protocol Definitions] --> R[Mock Helpers]
|
|
482
|
+
R --> S[Dependency Injection]
|
|
483
|
+
end
|
|
484
|
+
|
|
480
485
|
subgraph "Developer Experience"
|
|
481
486
|
M[IDE Autocomplete] --> N[Type Checking]
|
|
482
487
|
N --> O[Rich Documentation]
|
|
@@ -522,6 +527,17 @@ graph TB
|
|
|
522
527
|
|
|
523
528
|
**How**: Implements auth plugins, async iterators, custom exception classes, and response processors.
|
|
524
529
|
|
|
530
|
+
#### Testing Support
|
|
531
|
+
**Why**: API clients need to be easily testable without HTTP mocking, and tests must stay in sync with API changes.
|
|
532
|
+
|
|
533
|
+
**What**:
|
|
534
|
+
- **Protocol Definitions**: `@runtime_checkable` Protocol classes for structural typing and dependency injection
|
|
535
|
+
- **Mock Helper Classes**: Pre-generated mock classes with NotImplementedError stubs
|
|
536
|
+
- **Compile-Time Validation**: mypy catches when mocks don't match API contracts
|
|
537
|
+
- **Hybrid Auto-Create**: MockAPIClient automatically creates mocks for all endpoints
|
|
538
|
+
|
|
539
|
+
**How**: Generates Protocol contracts alongside implementations, creates mock helpers in `mocks/` directory, enables test-driven development with type safety.
|
|
540
|
+
|
|
525
541
|
#### Production Ready
|
|
526
542
|
**Why**: Generated clients must work reliably in production environments without external dependencies.
|
|
527
543
|
|
|
@@ -541,10 +557,11 @@ graph TB
|
|
|
541
557
|
|
|
542
558
|
See `docs/` directory for detailed guides:
|
|
543
559
|
- `architecture.md` - System design and patterns
|
|
544
|
-
- `unified_type_resolution.md` -
|
|
545
|
-
- `
|
|
560
|
+
- `unified_type_resolution.md` - Unified type resolution system
|
|
561
|
+
- `protocol_and_mock_generation.md` - Protocol-based testing and mock generation
|
|
562
|
+
- `ir_models.md` - Intermediate representation details
|
|
546
563
|
- `model_visitor.md` - Model code generation
|
|
547
|
-
- `endpoint_visitor.md` - Endpoint code generation
|
|
564
|
+
- `endpoint_visitor.md` - Endpoint code generation with Protocol and Mock support
|
|
548
565
|
|
|
549
566
|
## Quick Start Examples
|
|
550
567
|
|