pyopenapi-gen 0.14.1__tar.gz → 0.14.2__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.
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/CHANGELOG.md +23 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/PKG-INFO +1 -1
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/coverage.xml +32 -32
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/pyproject.toml +2 -2
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/endpoints_emitter.py +12 -4
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_duplicate_operations.py +89 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.bandit +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.cursor/mcp.json +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.cursor/rules/architecture.mdc +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.cursor/rules/coding-conventions.mdc +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.cursor/rules/project-goal.mdc +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.cursor/rules/testing.mdc +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/BRANCH_PROTECTION.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/CLAUDE_CONFIGURATION.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/CODEOWNERS +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/dependabot.yml +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/ci.yml +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/claude-auto-approve.yml +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/claude-review-trigger.yml +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/claude.yml +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/pr-checks.yml +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/production-release.yml.backup +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/promote-to-staging.yml +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/semantic-release.yml +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/staging-publish.yml +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/testpypi-publish.yml +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.gitignore +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.python-version +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.vscode/settings.json +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/CONTRIBUTING.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/LICENSE +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/Makefile +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/README.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/README.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/architecture.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/endpoint_visitor.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/helpers.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/ir_models.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/line_writer.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/loader.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/model_visitor.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/release-automation.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/render_context.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/unified_type_resolution.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/input/business_swagger.json +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/input/minimal_swagger.json +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/input/minimal_syntax_test.json +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/input/test_name_collision_spec.json +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/mkdocs.yml +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/poetry.lock +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/__main__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/cli.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/context/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/context/file_manager.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/context/import_collector.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/context/render_context.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/auth/base.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/auth/plugins.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/exceptions.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/http_status_codes.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/http_transport.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/loader.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/operations/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/operations/parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/operations/post_processor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/operations/request_body.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/parameters/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/parameters/parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/responses/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/responses/parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/schemas/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/schemas/extractor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/pagination.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/existing_schema.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/type_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/context.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/cycle_helpers.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/all_of_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/any_of_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/array_items_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/one_of_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/properties_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/schema_finalizer.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/schema_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/transformers/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/unified_cycle_detection.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/postprocess_manager.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/schemas.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/streaming_helpers.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/telemetry.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/utils.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/warning_collector.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/writers/code_writer.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/writers/documentation_writer.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/writers/line_writer.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/writers/python_construct_renderer.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core_package_template/README.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emit/models_emitter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/client_emitter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/core_emitter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/docs_emitter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/models_emitter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/generator/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/generator/client_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/endpoint_utils.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_cleaner.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_helper.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/array_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/composition_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/finalizer.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/named_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/object_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/primitive_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/url_utils.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/http_types.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/ir.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/py.typed +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/contracts/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/contracts/protocols.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/contracts/types.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/resolvers/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/resolvers/reference_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/resolvers/response_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/resolvers/schema_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/services/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/services/type_service.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/strategies/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/strategies/response_strategy.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/client_visitor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/docs_visitor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/request_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/signature_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/url_args_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/processors/import_analyzer.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/exception_visitor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/model/alias_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/model/dataclass_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/model/enum_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/model/model_visitor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/visitor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/auth/auth_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/auth/test_auth_base.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/auth/test_auth_plugins.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/cli/cli_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/cli/test_cli_backup_diff.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/cli/test_cli_edge_cases.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/cli/test_cli_edge_cases_comprehensive.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/cli/test_cli_internal_utils.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/cli/test_http_pagination_cli.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/context/context_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/context/test_file_manager.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/context/test_import_collector.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/context/test_render_context.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/context/test_render_context_imports.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/context/test_render_context_relative_paths.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/core_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/loader/parameters/test_inline_enum_array_params.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/loader/test_extractor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/loader/test_top_level_enum_extraction.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_cyclic_properties.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_direct_cycle.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_existing_schema.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_list_response.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_missing_ref.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_new_schema.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_stripped_suffix.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/keywords_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/test_all_of_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/test_any_of_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/test_array_items_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/test_one_of_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/test_properties_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/parsing_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_context.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_cycle_detection.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_cycle_helpers.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_improved_schema_naming.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_logging.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_ref_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_schema_finalizer.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_schema_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_schema_parser_list_response.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_type_parser.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_dataclass_serialization.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_detect_circular_imports.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_edge_cases_integration.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_edge_cases_systematic.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_exceptions_module.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_forward_references.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_http_transport.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_import_resolution.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_ir.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_ir_schema.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_loader.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_loader_extensive.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_loader_invalid_refs.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_loader_malformed.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_loader_media_types.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_pagination.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_parsing_context.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_protocol_defaults.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_schema_parser_specific_case.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_schemas.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_simple_self_ref_check.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_streaming_helpers.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_telemetry.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_telemetry_client.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_utils.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_warning_collector.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/writers/test_code_writer.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/writers/test_documentation_writer.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/writers/test_line_writer.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/writers/test_python_construct_renderer_json_wizard.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/writers/writers_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/emitters_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_client_emitter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_docs_emitter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_endpoints_emitter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_list_response_generation.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_models_emitter.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/end_to_end/test_dataclass_serialization_e2e.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/examples/test_developer_experience_demo.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/generation/generation_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/generation/test_external_core_package.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/generation_issues/specs/minimal_addmessage_like.json +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/generation_issues/test_addmessage_like_issues.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/generation_issues/test_agent_include_parameter_typing.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/generation_issues/test_message_batch_response_issue.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_array_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_endpoint_utils.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_endpoint_utils_extended.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_get_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_named_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_named_type_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_object_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_put_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_type_cleaner.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_type_helper.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_url_utils.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_utils_helpers.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/integration/test_generated_code_structure.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/integrations/integrations_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/integrations/test_business_swagger_message_type.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/integrations/test_end_to_end_business_swagger.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/integrations/test_end_to_end_petstore.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/integrations/test_name_collisions.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/specs/response_unwrapping_spec.yaml +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/test_analysis_overview.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/test_init.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_business_swagger_integration.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_contracts_types.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_reference_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_response_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_response_strategy.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_response_strategy_simplified.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_schema_resolver.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_schema_resolver_enums.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_type_service.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/generators_analysis.md +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_dataclass_integration.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_docstring_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_match_case_response.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_request_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_response_handler_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_response_handler_generator_strategy.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_signature_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_url_args_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/processors/test_import_analyzer.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/processors/test_import_analyzer.py.bak +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/processors/test_parameter_processor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/test_endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/test_alias_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/test_dataclass_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/test_dataclass_generator_json_wizard.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/test_enum_generator.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/test_json_value_integration.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/test_json_value_wrapper.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/test_client_visitor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/test_model_visitor.py +0 -0
- {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/test_visitor.py +0 -0
@@ -1,6 +1,29 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
3
|
|
4
|
+
## v0.14.2 (2025-10-10)
|
5
|
+
|
6
|
+
### Bug Fixes
|
7
|
+
|
8
|
+
- **endpoints**: Prevent _2_2 suffix accumulation in multi-tag operations
|
9
|
+
([`89e500f`](https://github.com/mindhiveoy/pyopenapi_gen/commit/89e500f9c9963492454bc3177fabf872052baac5))
|
10
|
+
|
11
|
+
Operations with multiple tags previously accumulated duplicate suffixes (_2_2, _2_2_2) because the
|
12
|
+
same IROperation object was modified multiple times during per-tag deduplication.
|
13
|
+
|
14
|
+
**Root Cause:** When an operation has multiple tags (e.g., ["Users", "Admin", "Internal"]), the SAME
|
15
|
+
IROperation object reference was added to multiple tag group lists. The per-tag deduplication
|
16
|
+
modified the same object repeatedly, causing suffix accumulation.
|
17
|
+
|
18
|
+
**Solution:** - Implement global deduplication BEFORE tag grouping - New method:
|
19
|
+
_deduplicate_operation_ids_globally() - Called once before tag splitting - Ensures each operation
|
20
|
+
is renamed at most once - Removed per-tag deduplication call
|
21
|
+
|
22
|
+
**Testing:** - Existing test for single-tag duplicates still passes - New test verifies multi-tag
|
23
|
+
operations get consistent naming - Reproduction test confirms fix resolves _2_2 accumulation - All
|
24
|
+
1299 tests pass with 88.16% coverage
|
25
|
+
|
26
|
+
|
4
27
|
## v0.14.1 (2025-10-10)
|
5
28
|
|
6
29
|
### Bug Fixes
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: pyopenapi-gen
|
3
|
-
Version: 0.14.
|
3
|
+
Version: 0.14.2
|
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.6" timestamp="
|
2
|
+
<coverage version="7.10.6" timestamp="1760116700880" lines-valid="6285" lines-covered="5541" line-rate="0.8816" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
|
3
3
|
<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.10.6 -->
|
4
4
|
<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
|
5
5
|
<sources>
|
@@ -3575,70 +3575,63 @@
|
|
3575
3575
|
<line number="108" hits="1"/>
|
3576
3576
|
<line number="109" hits="1"/>
|
3577
3577
|
<line number="111" hits="1"/>
|
3578
|
-
<line number="118" hits="1"/>
|
3579
|
-
<line number="119" hits="1"/>
|
3580
|
-
<line number="120" hits="1"/>
|
3581
|
-
<line number="121" hits="1"/>
|
3582
3578
|
<line number="122" hits="1"/>
|
3583
3579
|
<line number="123" hits="1"/>
|
3584
3580
|
<line number="124" hits="1"/>
|
3581
|
+
<line number="125" hits="1"/>
|
3585
3582
|
<line number="126" hits="1"/>
|
3583
|
+
<line number="127" hits="1"/>
|
3586
3584
|
<line number="128" hits="1"/>
|
3587
|
-
<line number="
|
3585
|
+
<line number="130" hits="1"/>
|
3588
3586
|
<line number="132" hits="1"/>
|
3589
|
-
<line number="
|
3590
|
-
<line number="
|
3591
|
-
<line number="
|
3592
|
-
<line number="
|
3593
|
-
<line number="
|
3587
|
+
<line number="135" hits="1"/>
|
3588
|
+
<line number="136" hits="1"/>
|
3589
|
+
<line number="138" hits="1"/>
|
3590
|
+
<line number="141" hits="1"/>
|
3591
|
+
<line number="146" hits="1"/>
|
3592
|
+
<line number="147" hits="1"/>
|
3594
3593
|
<line number="148" hits="1"/>
|
3595
|
-
<line number="
|
3596
|
-
<line number="
|
3594
|
+
<line number="152" hits="1"/>
|
3595
|
+
<line number="153" hits="1"/>
|
3597
3596
|
<line number="154" hits="0"/>
|
3598
|
-
<line number="
|
3599
|
-
<line number="157" hits="1"/>
|
3600
|
-
<line number="159" hits="1"/>
|
3597
|
+
<line number="158" hits="0"/>
|
3601
3598
|
<line number="160" hits="1"/>
|
3602
3599
|
<line number="161" hits="1"/>
|
3603
|
-
<line number="162" hits="1"/>
|
3604
|
-
<line number="163" hits="1"/>
|
3605
|
-
<line number="164" hits="1"/>
|
3606
3600
|
<line number="165" hits="1"/>
|
3607
|
-
<line number="
|
3601
|
+
<line number="167" hits="1"/>
|
3608
3602
|
<line number="168" hits="1"/>
|
3609
3603
|
<line number="169" hits="1"/>
|
3604
|
+
<line number="170" hits="1"/>
|
3610
3605
|
<line number="171" hits="1"/>
|
3611
3606
|
<line number="172" hits="1"/>
|
3612
3607
|
<line number="173" hits="1"/>
|
3613
3608
|
<line number="174" hits="1"/>
|
3614
|
-
<line number="175" hits="1"/>
|
3615
3609
|
<line number="176" hits="1"/>
|
3616
|
-
<line number="
|
3610
|
+
<line number="177" hits="1"/>
|
3617
3611
|
<line number="179" hits="1"/>
|
3618
3612
|
<line number="180" hits="1"/>
|
3619
3613
|
<line number="181" hits="1"/>
|
3620
3614
|
<line number="182" hits="1"/>
|
3621
3615
|
<line number="183" hits="1"/>
|
3622
|
-
<line number="
|
3616
|
+
<line number="184" hits="1"/>
|
3623
3617
|
<line number="186" hits="1"/>
|
3618
|
+
<line number="187" hits="1"/>
|
3624
3619
|
<line number="188" hits="1"/>
|
3625
3620
|
<line number="189" hits="1"/>
|
3626
3621
|
<line number="190" hits="1"/>
|
3627
3622
|
<line number="191" hits="1"/>
|
3628
|
-
<line number="
|
3629
|
-
<line number="
|
3623
|
+
<line number="193" hits="1"/>
|
3624
|
+
<line number="194" hits="1"/>
|
3625
|
+
<line number="196" hits="1"/>
|
3630
3626
|
<line number="197" hits="1"/>
|
3627
|
+
<line number="198" hits="1"/>
|
3628
|
+
<line number="199" hits="1"/>
|
3631
3629
|
<line number="200" hits="1"/>
|
3632
|
-
<line number="201" hits="0"/>
|
3633
|
-
<line number="202" hits="1"/>
|
3634
3630
|
<line number="203" hits="1"/>
|
3635
|
-
<line number="205" hits="1"/>
|
3636
|
-
<line number="206" hits="1"/>
|
3637
|
-
<line number="207" hits="1"/>
|
3638
3631
|
<line number="208" hits="1"/>
|
3639
|
-
<line number="209" hits="
|
3632
|
+
<line number="209" hits="0"/>
|
3633
|
+
<line number="210" hits="1"/>
|
3640
3634
|
<line number="211" hits="1"/>
|
3641
|
-
<line number="212" hits="1"/>
|
3642
3635
|
<line number="213" hits="1"/>
|
3643
3636
|
<line number="214" hits="1"/>
|
3644
3637
|
<line number="215" hits="1"/>
|
@@ -3648,7 +3641,14 @@
|
|
3648
3641
|
<line number="220" hits="1"/>
|
3649
3642
|
<line number="221" hits="1"/>
|
3650
3643
|
<line number="222" hits="1"/>
|
3644
|
+
<line number="223" hits="1"/>
|
3651
3645
|
<line number="224" hits="1"/>
|
3646
|
+
<line number="225" hits="1"/>
|
3647
|
+
<line number="227" hits="1"/>
|
3648
|
+
<line number="228" hits="1"/>
|
3649
|
+
<line number="229" hits="1"/>
|
3650
|
+
<line number="230" hits="1"/>
|
3651
|
+
<line number="232" hits="1"/>
|
3652
3652
|
</lines>
|
3653
3653
|
</class>
|
3654
3654
|
<class name="exceptions_emitter.py" filename="pyopenapi_gen/emitters/exceptions_emitter.py" complexity="0" line-rate="0.9429" branch-rate="0">
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "pyopenapi-gen"
|
7
|
-
version = "0.14.
|
7
|
+
version = "0.14.2"
|
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.14.
|
143
|
+
version = "0.14.2"
|
144
144
|
version_files = [
|
145
145
|
"pyproject.toml:version",
|
146
146
|
"src/pyopenapi_gen/__init__.py:__version__"
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/endpoints_emitter.py
RENAMED
@@ -108,12 +108,16 @@ class EndpointsEmitter:
|
|
108
108
|
self.formatter = Formatter()
|
109
109
|
self.visitor: EndpointVisitor | None = None
|
110
110
|
|
111
|
-
def
|
111
|
+
def _deduplicate_operation_ids_globally(self, operations: List[IROperation]) -> None:
|
112
112
|
"""
|
113
|
-
Ensures all operations have unique method names
|
113
|
+
Ensures all operations have unique method names globally across all tags.
|
114
|
+
|
115
|
+
This prevents the bug where operations with multiple tags share the same
|
116
|
+
IROperation object reference, causing _deduplicate_operation_ids() to
|
117
|
+
modify the same object multiple times and accumulate _2_2 suffixes.
|
114
118
|
|
115
119
|
Args:
|
116
|
-
operations: List of operations
|
120
|
+
operations: List of all operations across all tags.
|
117
121
|
"""
|
118
122
|
seen_methods: dict[str, int] = {}
|
119
123
|
for op in operations:
|
@@ -156,6 +160,10 @@ class EndpointsEmitter:
|
|
156
160
|
if self.visitor is None:
|
157
161
|
self.visitor = EndpointVisitor(current_parsed_schemas) # Pass the (potentially defaulted) dict
|
158
162
|
|
163
|
+
# Deduplicate operation IDs globally BEFORE tag grouping to prevent
|
164
|
+
# multi-tag operations from accumulating _2_2 suffixes
|
165
|
+
self._deduplicate_operation_ids_globally(operations)
|
166
|
+
|
159
167
|
tag_key_to_ops: dict[str, List[IROperation]] = {}
|
160
168
|
tag_key_to_candidates: dict[str, List[str]] = {}
|
161
169
|
for op in operations:
|
@@ -194,7 +202,7 @@ class EndpointsEmitter:
|
|
194
202
|
# This will set current_file and reset+reinit import_collector's context
|
195
203
|
self.context.set_current_file(str(file_path))
|
196
204
|
|
197
|
-
|
205
|
+
# Deduplication now done globally before tag grouping (see above)
|
198
206
|
|
199
207
|
# EndpointVisitor must exist here due to check above
|
200
208
|
if self.visitor is None:
|
@@ -108,3 +108,92 @@ def test_endpoints_emitter__duplicate_operation_ids__generates_unique_method_nam
|
|
108
108
|
content = client_file.read_text()
|
109
109
|
assert "async def get_feedback" in content
|
110
110
|
assert "async def get_feedback_2" in content # Second method should have a suffix
|
111
|
+
|
112
|
+
|
113
|
+
def test_endpoints_emitter__multi_tag_duplicate_operation_ids__no_suffix_accumulation(
|
114
|
+
tmp_path: Path, mock_render_context: MagicMock
|
115
|
+
) -> None:
|
116
|
+
"""
|
117
|
+
Scenario:
|
118
|
+
EndpointsEmitter processes operations with duplicate IDs that have multiple tags.
|
119
|
+
Operations with multiple tags share the same IROperation object reference.
|
120
|
+
|
121
|
+
Expected Outcome:
|
122
|
+
Global deduplication should ensure each operation is renamed only ONCE,
|
123
|
+
preventing _2_2 suffix accumulation that occurred with per-tag deduplication.
|
124
|
+
|
125
|
+
Before fix: Multi-tag operations would get _2_2, _2_2_2 suffixes
|
126
|
+
After fix: Operations get at most _2 suffix, consistent across all tags
|
127
|
+
"""
|
128
|
+
# Create two operations with IDs that sanitize to the same name,
|
129
|
+
# both with multiple tags to trigger the bug
|
130
|
+
op1 = IROperation(
|
131
|
+
operation_id="get_user", # snake_case
|
132
|
+
method=HTTPMethod.GET,
|
133
|
+
path="/user/{id}",
|
134
|
+
parameters=[],
|
135
|
+
responses=[
|
136
|
+
IRResponse(
|
137
|
+
status_code="200",
|
138
|
+
description="Success",
|
139
|
+
content={"application/json": IRSchema(name="User", type="object")},
|
140
|
+
)
|
141
|
+
],
|
142
|
+
summary="Get user by ID",
|
143
|
+
description="Get user by ID",
|
144
|
+
tags=["Users", "Admin", "Internal"], # Multiple tags!
|
145
|
+
)
|
146
|
+
|
147
|
+
op2 = IROperation(
|
148
|
+
operation_id="getUser", # CamelCase - will sanitize to "get_user" (collision!)
|
149
|
+
method=HTTPMethod.GET,
|
150
|
+
path="/user",
|
151
|
+
parameters=[],
|
152
|
+
responses=[
|
153
|
+
IRResponse(
|
154
|
+
status_code="200",
|
155
|
+
description="Success",
|
156
|
+
content={"application/json": IRSchema(name="UserList", type="object")},
|
157
|
+
)
|
158
|
+
],
|
159
|
+
summary="List users",
|
160
|
+
description="List all users",
|
161
|
+
tags=["Users", "Admin", "Internal"], # Same tags!
|
162
|
+
)
|
163
|
+
|
164
|
+
# Create spec
|
165
|
+
spec = IRSpec(
|
166
|
+
title="Test API",
|
167
|
+
version="1.0.0",
|
168
|
+
schemas={},
|
169
|
+
operations=[op1, op2],
|
170
|
+
servers=[],
|
171
|
+
)
|
172
|
+
|
173
|
+
# Generate client code
|
174
|
+
out_dir: Path = tmp_path / "out"
|
175
|
+
mock_render_context.parsed_schemas = spec.schemas
|
176
|
+
|
177
|
+
emitter = EndpointsEmitter(context=mock_render_context)
|
178
|
+
emitter.emit(spec.operations, str(out_dir))
|
179
|
+
|
180
|
+
# Verify: After global deduplication, the second operation should be renamed to get_user_2
|
181
|
+
# IMPORTANT: The operation_id should be consistent across ALL tag files
|
182
|
+
assert op2.operation_id == "getUser_2", f"Expected 'getUser_2', got '{op2.operation_id}'"
|
183
|
+
|
184
|
+
# Verify NO _2_2 suffix accumulation (the bug we're fixing)
|
185
|
+
assert "_2_2" not in op2.operation_id, f"Bug still present: {op2.operation_id} contains _2_2 suffix"
|
186
|
+
assert "_3" not in op2.operation_id, f"Bug still present: {op2.operation_id} contains _3 suffix"
|
187
|
+
|
188
|
+
# Check all tag files to ensure consistent naming
|
189
|
+
for tag in ["users", "admin", "internal"]:
|
190
|
+
client_file: Path = out_dir / "endpoints" / f"{tag}.py"
|
191
|
+
assert client_file.exists(), f"Missing file for tag '{tag}'"
|
192
|
+
|
193
|
+
content = client_file.read_text()
|
194
|
+
# Both files should have both methods with the same names
|
195
|
+
assert "async def get_user" in content, f"Missing get_user in {tag}"
|
196
|
+
assert "async def get_user_2" in content, f"Missing get_user_2 in {tag}"
|
197
|
+
|
198
|
+
# Ensure NO _2_2 suffixes appear in ANY file
|
199
|
+
assert "_2_2" not in content, f"File {tag}.py contains _2_2 suffix (bug present)"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/production-release.yml.backup
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/operations/__init__.py
RENAMED
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/operations/parser.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/parameters/__init__.py
RENAMED
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/parameters/parser.py
RENAMED
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/responses/__init__.py
RENAMED
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/responses/parser.py
RENAMED
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/schemas/__init__.py
RENAMED
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/schemas/extractor.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/type_parser.py
RENAMED
File without changes
|
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/cycle_helpers.py
RENAMED
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/schema_finalizer.py
RENAMED
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/schema_parser.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/writers/documentation_writer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core_package_template/README.md
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|