pyopenapi-gen 0.14.3__tar.gz → 0.16.1__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.14.3 → pyopenapi_gen-0.16.1}/.github/workflows/semantic-release.yml +33 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.gitignore +5 -1
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/CHANGELOG.md +181 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/CLAUDE.md +233 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/Makefile +7 -2
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/PKG-INFO +1 -1
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/coverage.xml +124 -103
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/input/business_swagger.json +420 -285
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/pyproject.toml +4 -4
- pyopenapi_gen-0.16.1/scripts/sync_version_to_init.py +139 -0
- pyopenapi_gen-0.16.1/scripts/validate_version_sync.py +152 -0
- pyopenapi_gen-0.16.1/src/pyopenapi_gen/__init__.py +223 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/loader/parameters/parser.py +3 -3
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/postprocess_manager.py +8 -8
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/telemetry.py +5 -3
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/resolvers/schema_resolver.py +21 -2
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/services/type_service.py +4 -0
- pyopenapi_gen-0.16.1/tests/api/test_programmatic_api.py +328 -0
- pyopenapi_gen-0.16.1/tests/types/test_missing_imports_bug.py +202 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/types/test_schema_resolver.py +32 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/test_model_visitor.py +5 -3
- pyopenapi_gen-0.14.3/src/pyopenapi_gen/__init__.py +0 -114
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.bandit +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.cursor/mcp.json +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.cursor/rules/architecture.mdc +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.cursor/rules/coding-conventions.mdc +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.cursor/rules/project-goal.mdc +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.cursor/rules/testing.mdc +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/BRANCH_PROTECTION.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/CLAUDE_CONFIGURATION.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/CODEOWNERS +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/dependabot.yml +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/workflows/ci.yml +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/workflows/claude-auto-approve.yml +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/workflows/claude-review-trigger.yml +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/workflows/claude.yml +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/workflows/pr-checks.yml +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/workflows/production-release.yml.backup +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/workflows/promote-to-staging.yml +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/workflows/staging-publish.yml +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.github/workflows/testpypi-publish.yml +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.python-version +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/.vscode/settings.json +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/CONTRIBUTING.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/LICENSE +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/README.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/docs/README.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/docs/architecture.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/docs/endpoint_visitor.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/docs/helpers.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/docs/ir_models.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/docs/line_writer.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/docs/loader.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/docs/model_visitor.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/docs/release-automation.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/docs/render_context.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/docs/unified_type_resolution.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/input/minimal_swagger.json +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/input/minimal_syntax_test.json +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/input/test_name_collision_spec.json +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/mkdocs.yml +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/poetry.lock +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/__main__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/cli.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/context/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/context/file_manager.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/context/import_collector.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/context/render_context.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/auth/base.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/auth/plugins.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/exceptions.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/http_status_codes.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/http_transport.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/loader/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/loader/loader.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/loader/operations/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/loader/operations/parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/loader/operations/post_processor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/loader/operations/request_body.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/loader/parameters/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/loader/responses/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/loader/responses/parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/loader/schemas/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/loader/schemas/extractor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/pagination.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/common/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/existing_schema.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/common/type_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/context.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/cycle_helpers.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/keywords/all_of_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/keywords/any_of_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/keywords/array_items_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/keywords/one_of_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/keywords/properties_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/schema_finalizer.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/schema_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/transformers/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/parsing/unified_cycle_detection.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/schemas.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/streaming_helpers.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/utils.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/warning_collector.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/writers/code_writer.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/writers/documentation_writer.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/writers/line_writer.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core/writers/python_construct_renderer.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/core_package_template/README.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/emit/models_emitter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/emitters/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/emitters/client_emitter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/emitters/core_emitter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/emitters/docs_emitter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/emitters/endpoints_emitter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/emitters/exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/emitters/models_emitter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/generator/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/generator/client_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/endpoint_utils.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/type_cleaner.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/type_helper.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/type_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/type_resolution/array_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/type_resolution/composition_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/type_resolution/finalizer.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/type_resolution/named_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/type_resolution/object_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/type_resolution/primitive_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/type_resolution/resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/helpers/url_utils.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/http_types.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/ir.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/py.typed +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/contracts/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/contracts/protocols.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/contracts/types.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/resolvers/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/resolvers/reference_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/resolvers/response_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/services/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/strategies/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/types/strategies/response_strategy.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/CLAUDE.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/client_visitor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/docs_visitor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/endpoint/generators/request_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/endpoint/generators/signature_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/endpoint/generators/url_args_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/endpoint/processors/import_analyzer.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/exception_visitor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/model/alias_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/model/dataclass_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/model/enum_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/model/model_visitor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/src/pyopenapi_gen/visit/visitor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/auth/auth_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/auth/test_auth_base.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/auth/test_auth_plugins.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/cli/cli_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/cli/test_cli_backup_diff.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/cli/test_cli_edge_cases.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/cli/test_cli_edge_cases_comprehensive.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/cli/test_cli_internal_utils.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/cli/test_http_pagination_cli.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/context/context_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/context/test_core_import_path.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/context/test_file_manager.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/context/test_import_collector.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/context/test_render_context.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/context/test_render_context_imports.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/context/test_render_context_relative_paths.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/core_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/loader/parameters/test_inline_enum_array_params.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/loader/test_extractor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/loader/test_top_level_enum_extraction.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/common/ref_resolution/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/common/ref_resolution/helpers/test_cyclic_properties.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/common/ref_resolution/helpers/test_direct_cycle.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/common/ref_resolution/helpers/test_existing_schema.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/common/ref_resolution/helpers/test_list_response.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/common/ref_resolution/helpers/test_missing_ref.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/common/ref_resolution/helpers/test_new_schema.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/common/ref_resolution/helpers/test_stripped_suffix.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/keywords/keywords_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/keywords/test_all_of_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/keywords/test_any_of_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/keywords/test_array_items_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/keywords/test_one_of_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/keywords/test_properties_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/parsing_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/test_context.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/test_cycle_detection.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/test_cycle_helpers.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/test_improved_schema_naming.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/test_inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/test_inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/test_logging.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/test_ref_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/test_schema_finalizer.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/test_schema_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/test_schema_parser_list_response.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/parsing/test_type_parser.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_dataclass_serialization.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_detect_circular_imports.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_edge_cases_integration.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_edge_cases_systematic.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_exceptions_module.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_forward_references.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_http_transport.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_import_resolution.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_ir.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_ir_schema.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_loader.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_loader_extensive.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_loader_invalid_refs.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_loader_malformed.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_loader_media_types.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_pagination.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_parsing_context.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_protocol_defaults.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_schema_parser_specific_case.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_schemas.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_simple_self_ref_check.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_streaming_helpers.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_telemetry.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_telemetry_client.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_utils.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/test_warning_collector.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/writers/test_code_writer.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/writers/test_documentation_writer.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/writers/test_line_writer.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/writers/test_python_construct_renderer_json_wizard.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/core/writers/writers_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/emitters/emitters_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/emitters/test_client_emitter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/emitters/test_docs_emitter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/emitters/test_duplicate_operations.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/emitters/test_endpoints_emitter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/emitters/test_exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/emitters/test_list_response_generation.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/emitters/test_models_emitter.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/end_to_end/test_dataclass_serialization_e2e.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/examples/test_developer_experience_demo.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/generation/generation_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/generation/test_external_core_package.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/generation_issues/specs/minimal_addmessage_like.json +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/generation_issues/test_addmessage_like_issues.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/generation_issues/test_agent_include_parameter_typing.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/generation_issues/test_message_batch_response_issue.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/test_array_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/test_endpoint_utils.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/test_endpoint_utils_extended.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/test_get_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/test_named_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/test_named_type_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/test_object_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/test_put_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/test_type_cleaner.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/test_type_helper.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/test_url_utils.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/helpers/test_utils_helpers.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/integration/test_generated_code_structure.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/integrations/integrations_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/integrations/test_business_swagger_message_type.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/integrations/test_end_to_end_business_swagger.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/integrations/test_end_to_end_petstore.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/integrations/test_name_collisions.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/specs/response_unwrapping_spec.yaml +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/test_analysis_overview.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/test_init.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/types/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/types/test_business_swagger_integration.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/types/test_contracts_types.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/types/test_reference_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/types/test_response_resolver.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/types/test_response_strategy.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/types/test_response_strategy_simplified.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/types/test_schema_resolver_enums.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/types/test_type_service.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/generators/generators_analysis.md +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/generators/test_dataclass_integration.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/generators/test_docstring_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/generators/test_endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/generators/test_match_case_response.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/generators/test_request_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/generators/test_response_handler_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/generators/test_response_handler_generator_strategy.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/generators/test_signature_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/generators/test_url_args_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/processors/test_import_analyzer.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/processors/test_import_analyzer.py.bak +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/processors/test_parameter_processor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/endpoint/test_endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/model/test_alias_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/model/test_dataclass_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/model/test_dataclass_generator_json_wizard.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/model/test_enum_generator.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/model/test_json_value_integration.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/model/test_json_value_wrapper.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/test_client_visitor.py +0 -0
- {pyopenapi_gen-0.14.3 → pyopenapi_gen-0.16.1}/tests/visit/test_visitor.py +0 -0
|
@@ -48,6 +48,12 @@ jobs:
|
|
|
48
48
|
run: |
|
|
49
49
|
poetry install --with dev
|
|
50
50
|
|
|
51
|
+
- name: Validate version synchronisation
|
|
52
|
+
run: |
|
|
53
|
+
echo "🔍 Checking that all version files are synchronised..."
|
|
54
|
+
poetry run python scripts/validate_version_sync.py
|
|
55
|
+
echo "✅ All version files are in sync"
|
|
56
|
+
|
|
51
57
|
- name: Run comprehensive quality checks
|
|
52
58
|
run: |
|
|
53
59
|
poetry run black --check src/ tests/
|
|
@@ -91,6 +97,33 @@ jobs:
|
|
|
91
97
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
92
98
|
poetry run semantic-release version --skip-build
|
|
93
99
|
|
|
100
|
+
- name: Sync version to __init__.py
|
|
101
|
+
if: steps.check_changes.outputs.release_worthy > 0 || github.event_name == 'workflow_dispatch'
|
|
102
|
+
env:
|
|
103
|
+
GH_TOKEN: ${{ secrets.SEMANTIC_RELEASE_TOKEN || secrets.GITHUB_TOKEN }}
|
|
104
|
+
run: |
|
|
105
|
+
echo "🔄 Syncing version from pyproject.toml to __init__.py..."
|
|
106
|
+
|
|
107
|
+
# Fetch latest to ensure we have the semantic-release commit
|
|
108
|
+
git fetch origin main
|
|
109
|
+
git reset --hard origin/main
|
|
110
|
+
|
|
111
|
+
# Run sync script
|
|
112
|
+
poetry run python scripts/sync_version_to_init.py
|
|
113
|
+
|
|
114
|
+
# Check if __init__.py was modified
|
|
115
|
+
if git diff --quiet src/pyopenapi_gen/__init__.py; then
|
|
116
|
+
echo "✅ __init__.py already in sync, no changes needed"
|
|
117
|
+
else
|
|
118
|
+
echo "📝 __init__.py was updated, creating follow-up commit..."
|
|
119
|
+
git config user.name "github-actions[bot]"
|
|
120
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
121
|
+
git add src/pyopenapi_gen/__init__.py
|
|
122
|
+
git commit -m "chore(release): sync __init__.py version [skip ci]"
|
|
123
|
+
git push origin main
|
|
124
|
+
echo "✅ Version sync complete and committed"
|
|
125
|
+
fi
|
|
126
|
+
|
|
94
127
|
- name: Build packages after version bump
|
|
95
128
|
if: steps.check_changes.outputs.release_worthy > 0 || github.event_name == 'workflow_dispatch'
|
|
96
129
|
run: |
|
|
@@ -1,6 +1,175 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
## v0.16.1 (2025-10-13)
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
- **version**: Manually sync __init__.py to 0.16.0 after failed workflow
|
|
9
|
+
([`7ee9090`](https://github.com/mindhiveoy/pyopenapi_gen/commit/7ee90902add14d93d471418b56514a8bcafd81cb))
|
|
10
|
+
|
|
11
|
+
The semantic-release workflow successfully created version 0.16.0 but failed when trying to push the
|
|
12
|
+
__init__.py sync due to the force-with-lease issue.
|
|
13
|
+
|
|
14
|
+
This commit manually syncs __init__.py to 0.16.0 to match pyproject.toml. Future releases will use
|
|
15
|
+
the new workflow logic with follow-up commits.
|
|
16
|
+
|
|
17
|
+
- **workflow**: Use follow-up commit instead of amending for version sync
|
|
18
|
+
([`96f2014`](https://github.com/mindhiveoy/pyopenapi_gen/commit/96f2014bb10ecbfbe3873db32ea6a5f8334542a2))
|
|
19
|
+
|
|
20
|
+
ISSUE: The git push --force-with-lease was failing with "stale info" because: 1. semantic-release
|
|
21
|
+
creates and pushes a commit 2. Our sync script tried to amend that commit 3. force-with-lease
|
|
22
|
+
detected remote had changed and rejected the push
|
|
23
|
+
|
|
24
|
+
SOLUTION: Changed strategy to use a follow-up commit instead of amending: 1. Fetch latest from
|
|
25
|
+
origin/main after semantic-release pushes 2. Reset --hard to origin/main to sync local state 3.
|
|
26
|
+
Run sync script to update __init__.py 4. If changed, create a NEW commit with [skip ci] flag 5.
|
|
27
|
+
Push normally (no force needed)
|
|
28
|
+
|
|
29
|
+
Benefits: - Safer: No force-pushing required - Cleaner: Normal git flow with proper commit sequence
|
|
30
|
+
- Prevents loops: [skip ci] prevents triggering another workflow run
|
|
31
|
+
|
|
32
|
+
This will result in two commits per release (semantic-release + sync) but is more reliable than
|
|
33
|
+
force-pushing.
|
|
34
|
+
|
|
35
|
+
Fixes: https://github.com/mindhiveoy/pyopenapi_gen/actions/runs/18461834318
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
## v0.16.0 (2025-10-13)
|
|
39
|
+
|
|
40
|
+
### Bug Fixes
|
|
41
|
+
|
|
42
|
+
- **api**: Improve type annotation for generate_client return type
|
|
43
|
+
([`f35d99c`](https://github.com/mindhiveoy/pyopenapi_gen/commit/f35d99c1d2233a20fdd1a69ef0a175ab902513c4))
|
|
44
|
+
|
|
45
|
+
- Change return type from List[Any] to List[Path] for better type safety - Add proper pathlib.Path
|
|
46
|
+
import to support the type annotation - Enhances IDE support and type checking for programmatic
|
|
47
|
+
API users
|
|
48
|
+
|
|
49
|
+
🤖 Generated with [Claude Code](https://claude.ai/code)
|
|
50
|
+
|
|
51
|
+
Co-authored-by: Ville Venäläinen <undefined@users.noreply.github.com>
|
|
52
|
+
|
|
53
|
+
- **api**: Update business_swagger.json descriptions and schemas
|
|
54
|
+
([`6496144`](https://github.com/mindhiveoy/pyopenapi_gen/commit/6496144200fb8dfb28275f0d111138107775fa29))
|
|
55
|
+
|
|
56
|
+
- **lint**: Correct import ordering in __init__.py for Ruff compliance
|
|
57
|
+
([`a159807`](https://github.com/mindhiveoy/pyopenapi_gen/commit/a159807fd1932206dd44c805629683998c88707f))
|
|
58
|
+
|
|
59
|
+
- **release**: Sync __init__.py version automatically in semantic-release workflow
|
|
60
|
+
([`7f28674`](https://github.com/mindhiveoy/pyopenapi_gen/commit/7f2867449be1b75b2fc4b7c04073fcad3320e865))
|
|
61
|
+
|
|
62
|
+
ISSUE: Semantic-release was updating pyproject.toml version but leaving __init__.py at the old
|
|
63
|
+
version, causing the version validation to fail.
|
|
64
|
+
|
|
65
|
+
SOLUTION: 1. Fixed immediate issue: Updated __init__.py to match pyproject.toml (0.15.0) 2. Added
|
|
66
|
+
automatic sync: Created scripts/sync_version_to_init.py to sync version from pyproject.toml to
|
|
67
|
+
__init__.py 3. Updated workflow: Added step after semantic-release version bump that runs the sync
|
|
68
|
+
script and amends the commit if __init__.py was updated
|
|
69
|
+
|
|
70
|
+
This ensures all version files stay synchronized after every semantic-release run.
|
|
71
|
+
|
|
72
|
+
Fixes: https://github.com/mindhiveoy/pyopenapi_gen/actions/runs/18461374998
|
|
73
|
+
|
|
74
|
+
- **security**: Address Bandit security warnings with proper logging and nosec annotations
|
|
75
|
+
([`f9b0ff3`](https://github.com/mindhiveoy/pyopenapi_gen/commit/f9b0ff3e73ebeaaed49fc631429835ee6e99a33c))
|
|
76
|
+
|
|
77
|
+
Fixed all Bandit security warnings: - Replace try-except-pass with proper exception logging in
|
|
78
|
+
parser.py - Replace try-except-pass with logging in telemetry.py - Add nosec B603 annotations to
|
|
79
|
+
all subprocess.run() calls with explanations - Add nosec B404 annotation to subprocess import with
|
|
80
|
+
justification
|
|
81
|
+
|
|
82
|
+
Changes: - parser.py: Log exceptions instead of silent pass for debugging - telemetry.py: Log
|
|
83
|
+
telemetry failures for debugging - postprocess_manager.py: Document all subprocess calls are safe
|
|
84
|
+
(hardcoded commands, no shell)
|
|
85
|
+
|
|
86
|
+
Bandit now reports zero issues (8 properly suppressed with nosec). All quality checks pass.
|
|
87
|
+
|
|
88
|
+
- **types**: Add binary format mapping to unified type resolver
|
|
89
|
+
([`ecba081`](https://github.com/mindhiveoy/pyopenapi_gen/commit/ecba081b37a217277ea61d58b30d1f0a7ac2e04d))
|
|
90
|
+
|
|
91
|
+
- Add 'binary' to format_mapping in OpenAPISchemaResolver._resolve_string() - Ensures string schemas
|
|
92
|
+
with format=binary resolve to bytes type - Adds comprehensive test coverage for binary format
|
|
93
|
+
resolution - Closes gap between legacy and unified type systems
|
|
94
|
+
|
|
95
|
+
Before: string fields with format=binary were typed as str
|
|
96
|
+
|
|
97
|
+
After: string fields with format=binary are correctly typed as bytes
|
|
98
|
+
|
|
99
|
+
### Features
|
|
100
|
+
|
|
101
|
+
- **api**: Add developer-friendly programmatic API with generate_client()
|
|
102
|
+
([`ec8ad0c`](https://github.com/mindhiveoy/pyopenapi_gen/commit/ec8ad0c7b166e9cb523a91d97f8639f050d940c3))
|
|
103
|
+
|
|
104
|
+
Add a clean, function-based API for programmatic usage alongside the existing CLI.
|
|
105
|
+
|
|
106
|
+
Key additions: - generate_client() convenience function for simple library usage - Export
|
|
107
|
+
ClientGenerator and GenerationError at package level - Comprehensive documentation with examples
|
|
108
|
+
in CLAUDE.md - Full test coverage with 9 new tests in tests/api/
|
|
109
|
+
|
|
110
|
+
Benefits: - Simple one-function API: generate_client(spec_path, project_root, output_package) - No
|
|
111
|
+
need to import from deep paths or understand internal structure - Proper error handling with
|
|
112
|
+
exported GenerationError exception - Fully backward compatible - all existing code continues to
|
|
113
|
+
work - Matches patterns from similar tools (openapi-python-client, datamodel-code-generator)
|
|
114
|
+
|
|
115
|
+
Documentation includes: - Basic usage examples - Advanced usage with error handling - Multi-client
|
|
116
|
+
generation scripts - Build system integration examples - Complete API reference
|
|
117
|
+
|
|
118
|
+
All tests pass (9 new + existing), type-safe (mypy strict), and quality checks pass.
|
|
119
|
+
|
|
120
|
+
### Refactoring
|
|
121
|
+
|
|
122
|
+
- **init**: Remove unused HTTPMethod enum and IR dataclasses
|
|
123
|
+
([`7b096ed`](https://github.com/mindhiveoy/pyopenapi_gen/commit/7b096ed321612823976a2e7b7a995d0aaf024312))
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
## v0.15.0 (2025-10-11)
|
|
127
|
+
|
|
128
|
+
### Bug Fixes
|
|
129
|
+
|
|
130
|
+
- **release**: Correct semantic-release configuration and sync version to 0.14.3
|
|
131
|
+
([`cfa0813`](https://github.com/mindhiveoy/pyopenapi_gen/commit/cfa081393657acfaa0a1c6a29243746748872b28))
|
|
132
|
+
|
|
133
|
+
Problem: - semantic-release v9 was configured with deprecated `version_pattern` syntax - This caused
|
|
134
|
+
__init__.py to not be automatically updated during releases - Version validation failed in CI
|
|
135
|
+
because __init__.py (0.10.2) != pyproject.toml (0.14.3)
|
|
136
|
+
|
|
137
|
+
Solution: - Updated semantic-release config to use `version_variables` (v9+ syntax) - Synced
|
|
138
|
+
__init__.py version to 0.14.3 to match pyproject.toml - Now semantic-release will automatically
|
|
139
|
+
update all version locations
|
|
140
|
+
|
|
141
|
+
Changes: - pyproject.toml: Changed version_pattern → version_variables -
|
|
142
|
+
src/pyopenapi_gen/__init__.py: Updated __version__ from 0.10.2 → 0.14.3
|
|
143
|
+
|
|
144
|
+
This ensures future releases automatically sync all version files.
|
|
145
|
+
|
|
146
|
+
- **types**: Correct self-import detection to avoid false positives with similar filenames
|
|
147
|
+
([`cfee36e`](https://github.com/mindhiveoy/pyopenapi_gen/commit/cfee36e4c8c57d84c0c1d967a7936c5daddf2197))
|
|
148
|
+
|
|
149
|
+
Problem: - Self-import check used .endswith() for filename comparison - This caused false positives
|
|
150
|
+
when one filename was a suffix of another - Example:
|
|
151
|
+
"vector_index_with_embedding_response_data.py".endswith("embedding_response_data.py") == True -
|
|
152
|
+
Result: Missing imports for forward referenced types, causing NameError at runtime
|
|
153
|
+
|
|
154
|
+
Solution: - Changed to exact basename comparison using os.path.basename() - Only files with
|
|
155
|
+
identical basenames are treated as self-imports - Added comprehensive regression tests covering: -
|
|
156
|
+
Similar module names (not self-imports) - Actual self-references (forward refs without imports) -
|
|
157
|
+
Exact filename matching requirements
|
|
158
|
+
|
|
159
|
+
Changes: - src/pyopenapi_gen/types/resolvers/schema_resolver.py: Fixed self-import detection logic -
|
|
160
|
+
tests/types/test_missing_imports_bug.py: Added 3 regression tests -
|
|
161
|
+
tests/visit/test_model_visitor.py: Updated test expectations for correct import behavior -
|
|
162
|
+
.gitignore: Added patterns to ignore bug report and analysis documents
|
|
163
|
+
|
|
164
|
+
Testing: - All 1309 tests pass - Verified with real business_swagger.json that previously failed -
|
|
165
|
+
Generated code now includes correct imports for cross-module references
|
|
166
|
+
|
|
167
|
+
### Features
|
|
168
|
+
|
|
169
|
+
- **versioning**: Add version synchronization validation script and integrate into quality checks
|
|
170
|
+
([`de2ecb8`](https://github.com/mindhiveoy/pyopenapi_gen/commit/de2ecb8c63711230e890bae1cf79f22d5594c551))
|
|
171
|
+
|
|
172
|
+
|
|
4
173
|
## v0.14.3 (2025-10-11)
|
|
5
174
|
|
|
6
175
|
### Bug Fixes
|
|
@@ -112,6 +281,11 @@ Technical context: - mypy --strict requires explicit types for union type assign
|
|
|
112
281
|
|
|
113
282
|
Resolves: mypy error "Incompatible types in assignment (expression has type...)"
|
|
114
283
|
|
|
284
|
+
### Chores
|
|
285
|
+
|
|
286
|
+
- Merge latest changes from main
|
|
287
|
+
([`44487cc`](https://github.com/mindhiveoy/pyopenapi_gen/commit/44487cce571920b5e2c34814c38cbab67b956097))
|
|
288
|
+
|
|
115
289
|
### Code Style
|
|
116
290
|
|
|
117
291
|
- **format**: Apply Black formatting to modernised type syntax changes
|
|
@@ -826,6 +1000,13 @@ All 1,265 tests now pass consistently across environments.
|
|
|
826
1000
|
testing still handled by pr-checks.yml for PRs - This unblocks PR merging while avoiding test
|
|
827
1001
|
duplication
|
|
828
1002
|
|
|
1003
|
+
- **ci**: Ensure Poetry is available in PATH for semantic-release build command
|
|
1004
|
+
([`0a68f6e`](https://github.com/mindhiveoy/pyopenapi_gen/commit/0a68f6e4ace7fb998c4ddec14c7cf67713d7ce73))
|
|
1005
|
+
|
|
1006
|
+
- Add explicit PATH setup for Poetry before semantic-release step - Add verification step to confirm
|
|
1007
|
+
Poetry availability - Fixes 'poetry: command not found' error in semantic release pipeline -
|
|
1008
|
+
Resolves build command failure preventing automated releases
|
|
1009
|
+
|
|
829
1010
|
- **ci**: Ensure Poetry is available in PATH for semantic-release build command
|
|
830
1011
|
([#46](https://github.com/mindhiveoy/pyopenapi_gen/pull/46),
|
|
831
1012
|
[`3734aac`](https://github.com/mindhiveoy/pyopenapi_gen/commit/3734aacb74eda746375c7d88c45715a1f18f33a1))
|
|
@@ -605,6 +605,239 @@ pyopenapi-gen api_v2.yaml --project-root . --output-package pyapis.v2 --core-pac
|
|
|
605
605
|
# └── v2/ # Second client
|
|
606
606
|
```
|
|
607
607
|
|
|
608
|
+
## Using as a Library (Programmatic API)
|
|
609
|
+
|
|
610
|
+
### Why Programmatic Usage?
|
|
611
|
+
The generator was designed to work both as a CLI tool and as a Python library. Programmatic usage enables integration with build systems, CI/CD pipelines, code generators, and custom tooling. You get the same powerful code generation capabilities with full Python API access.
|
|
612
|
+
|
|
613
|
+
### What Is the Programmatic API?
|
|
614
|
+
A simple, function-based API that wraps the internal `ClientGenerator` class, providing a clean entry point for library usage without requiring knowledge of internal structure.
|
|
615
|
+
|
|
616
|
+
### How to Use Programmatically
|
|
617
|
+
|
|
618
|
+
#### Basic Usage
|
|
619
|
+
```python
|
|
620
|
+
from pyopenapi_gen import generate_client
|
|
621
|
+
|
|
622
|
+
# Simple client generation
|
|
623
|
+
files = generate_client(
|
|
624
|
+
spec_path="input/openapi.yaml",
|
|
625
|
+
project_root=".",
|
|
626
|
+
output_package="pyapis.my_client"
|
|
627
|
+
)
|
|
628
|
+
|
|
629
|
+
print(f"Generated {len(files)} files")
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
#### Advanced Usage with All Options
|
|
633
|
+
```python
|
|
634
|
+
from pyopenapi_gen import generate_client, GenerationError
|
|
635
|
+
|
|
636
|
+
try:
|
|
637
|
+
files = generate_client(
|
|
638
|
+
spec_path="input/openapi.yaml",
|
|
639
|
+
project_root=".",
|
|
640
|
+
output_package="pyapis.my_client",
|
|
641
|
+
core_package="pyapis.core", # Optional shared core
|
|
642
|
+
force=True, # Overwrite without diff check
|
|
643
|
+
no_postprocess=False, # Run Black + mypy
|
|
644
|
+
verbose=True # Show progress
|
|
645
|
+
)
|
|
646
|
+
|
|
647
|
+
# Process generated files
|
|
648
|
+
for file_path in files:
|
|
649
|
+
print(f"Generated: {file_path}")
|
|
650
|
+
|
|
651
|
+
except GenerationError as e:
|
|
652
|
+
print(f"Generation failed: {e}")
|
|
653
|
+
# Handle error appropriately
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
#### Multi-Client Generation Script
|
|
657
|
+
```python
|
|
658
|
+
from pyopenapi_gen import generate_client
|
|
659
|
+
from pathlib import Path
|
|
660
|
+
|
|
661
|
+
# Configuration for multiple clients
|
|
662
|
+
clients = [
|
|
663
|
+
{
|
|
664
|
+
"spec": "api_v1.yaml",
|
|
665
|
+
"package": "pyapis.client_v1",
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
"spec": "api_v2.yaml",
|
|
669
|
+
"package": "pyapis.client_v2",
|
|
670
|
+
},
|
|
671
|
+
]
|
|
672
|
+
|
|
673
|
+
# Shared core package
|
|
674
|
+
core_package = "pyapis.core"
|
|
675
|
+
|
|
676
|
+
# Generate all clients
|
|
677
|
+
for client_config in clients:
|
|
678
|
+
print(f"Generating {client_config['package']}...")
|
|
679
|
+
|
|
680
|
+
generate_client(
|
|
681
|
+
spec_path=client_config["spec"],
|
|
682
|
+
project_root=".",
|
|
683
|
+
output_package=client_config["package"],
|
|
684
|
+
core_package=core_package,
|
|
685
|
+
force=True,
|
|
686
|
+
verbose=True
|
|
687
|
+
)
|
|
688
|
+
|
|
689
|
+
print("All clients generated successfully!")
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
#### Integration with Build Systems
|
|
693
|
+
```python
|
|
694
|
+
# Example: Custom build script
|
|
695
|
+
import sys
|
|
696
|
+
from pathlib import Path
|
|
697
|
+
from pyopenapi_gen import generate_client, GenerationError
|
|
698
|
+
|
|
699
|
+
def build_api_clients():
|
|
700
|
+
"""Generate all API clients as part of build process"""
|
|
701
|
+
|
|
702
|
+
specs_dir = Path("specs")
|
|
703
|
+
output_root = Path("src/pyapis")
|
|
704
|
+
|
|
705
|
+
# Find all OpenAPI specs
|
|
706
|
+
spec_files = list(specs_dir.glob("*.yaml")) + list(specs_dir.glob("*.json"))
|
|
707
|
+
|
|
708
|
+
if not spec_files:
|
|
709
|
+
print("No OpenAPI specs found in specs/")
|
|
710
|
+
return False
|
|
711
|
+
|
|
712
|
+
# Generate clients
|
|
713
|
+
for spec_file in spec_files:
|
|
714
|
+
client_name = spec_file.stem
|
|
715
|
+
package_name = f"pyapis.{client_name}"
|
|
716
|
+
|
|
717
|
+
print(f"Generating client for {spec_file.name}...")
|
|
718
|
+
|
|
719
|
+
try:
|
|
720
|
+
generate_client(
|
|
721
|
+
spec_path=str(spec_file),
|
|
722
|
+
project_root="src",
|
|
723
|
+
output_package=package_name,
|
|
724
|
+
core_package="pyapis.core",
|
|
725
|
+
force=True
|
|
726
|
+
)
|
|
727
|
+
except GenerationError as e:
|
|
728
|
+
print(f"Failed to generate {client_name}: {e}", file=sys.stderr)
|
|
729
|
+
return False
|
|
730
|
+
|
|
731
|
+
return True
|
|
732
|
+
|
|
733
|
+
if __name__ == "__main__":
|
|
734
|
+
success = build_api_clients()
|
|
735
|
+
sys.exit(0 if success else 1)
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
### API Reference
|
|
739
|
+
|
|
740
|
+
#### `generate_client()` Function
|
|
741
|
+
|
|
742
|
+
```python
|
|
743
|
+
def generate_client(
|
|
744
|
+
spec_path: str,
|
|
745
|
+
project_root: str,
|
|
746
|
+
output_package: str,
|
|
747
|
+
core_package: str | None = None,
|
|
748
|
+
force: bool = False,
|
|
749
|
+
no_postprocess: bool = False,
|
|
750
|
+
verbose: bool = False,
|
|
751
|
+
) -> List[Path]
|
|
752
|
+
```
|
|
753
|
+
|
|
754
|
+
**Parameters**:
|
|
755
|
+
- `spec_path`: Path to OpenAPI spec file (YAML or JSON)
|
|
756
|
+
- `project_root`: Root directory of your Python project
|
|
757
|
+
- `output_package`: Python package name (e.g., `'pyapis.my_client'`)
|
|
758
|
+
- `core_package`: Optional shared core package name (defaults to `{output_package}.core`)
|
|
759
|
+
- `force`: Skip diff check and overwrite existing output
|
|
760
|
+
- `no_postprocess`: Skip Black formatting and mypy type checking
|
|
761
|
+
- `verbose`: Print detailed progress information
|
|
762
|
+
|
|
763
|
+
**Returns**: List of `Path` objects for all generated files
|
|
764
|
+
|
|
765
|
+
**Raises**: `GenerationError` if generation fails
|
|
766
|
+
|
|
767
|
+
#### `ClientGenerator` Class (Advanced)
|
|
768
|
+
|
|
769
|
+
For advanced use cases requiring more control:
|
|
770
|
+
|
|
771
|
+
```python
|
|
772
|
+
from pyopenapi_gen import ClientGenerator, GenerationError
|
|
773
|
+
from pathlib import Path
|
|
774
|
+
|
|
775
|
+
# Create generator with custom settings
|
|
776
|
+
generator = ClientGenerator(verbose=True)
|
|
777
|
+
|
|
778
|
+
# Generate with full control
|
|
779
|
+
try:
|
|
780
|
+
files = generator.generate(
|
|
781
|
+
spec_path="openapi.yaml",
|
|
782
|
+
project_root=Path("."),
|
|
783
|
+
output_package="pyapis.my_client",
|
|
784
|
+
core_package="pyapis.core",
|
|
785
|
+
force=False,
|
|
786
|
+
no_postprocess=False
|
|
787
|
+
)
|
|
788
|
+
except GenerationError as e:
|
|
789
|
+
print(f"Generation failed: {e}")
|
|
790
|
+
```
|
|
791
|
+
|
|
792
|
+
#### `GenerationError` Exception
|
|
793
|
+
|
|
794
|
+
Raised when generation fails. Contains contextual information about the failure:
|
|
795
|
+
|
|
796
|
+
```python
|
|
797
|
+
from pyopenapi_gen import generate_client, GenerationError
|
|
798
|
+
|
|
799
|
+
try:
|
|
800
|
+
generate_client(
|
|
801
|
+
spec_path="invalid.yaml",
|
|
802
|
+
project_root=".",
|
|
803
|
+
output_package="test"
|
|
804
|
+
)
|
|
805
|
+
except GenerationError as e:
|
|
806
|
+
# Exception message includes context
|
|
807
|
+
print(f"Error: {e}")
|
|
808
|
+
# Typical causes:
|
|
809
|
+
# - Invalid OpenAPI specification
|
|
810
|
+
# - File I/O errors
|
|
811
|
+
# - Type checking failures
|
|
812
|
+
# - Invalid project structure
|
|
813
|
+
```
|
|
814
|
+
|
|
815
|
+
### Comparison: CLI vs Programmatic API
|
|
816
|
+
|
|
817
|
+
**CLI Usage**:
|
|
818
|
+
```bash
|
|
819
|
+
pyopenapi-gen input/openapi.yaml \
|
|
820
|
+
--project-root . \
|
|
821
|
+
--output-package pyapis.my_client \
|
|
822
|
+
--force \
|
|
823
|
+
--verbose
|
|
824
|
+
```
|
|
825
|
+
|
|
826
|
+
**Equivalent Programmatic Usage**:
|
|
827
|
+
```python
|
|
828
|
+
from pyopenapi_gen import generate_client
|
|
829
|
+
|
|
830
|
+
generate_client(
|
|
831
|
+
spec_path="input/openapi.yaml",
|
|
832
|
+
project_root=".",
|
|
833
|
+
output_package="pyapis.my_client",
|
|
834
|
+
force=True,
|
|
835
|
+
verbose=True
|
|
836
|
+
)
|
|
837
|
+
```
|
|
838
|
+
|
|
839
|
+
Both approaches use the same underlying implementation and produce identical results.
|
|
840
|
+
|
|
608
841
|
## Release Management & Semantic Versioning
|
|
609
842
|
|
|
610
843
|
### Automated Release Pipeline
|
|
@@ -66,11 +66,15 @@ security: deps
|
|
|
66
66
|
@echo "🔒 Running security checks..."
|
|
67
67
|
poetry run bandit -r src/ -c pyproject.toml -f json -o coverage_reports/bandit.json || poetry run bandit -r src/ -c pyproject.toml
|
|
68
68
|
|
|
69
|
+
version-check: deps
|
|
70
|
+
@echo "🔍 Validating version synchronisation..."
|
|
71
|
+
poetry run python scripts/validate_version_sync.py
|
|
72
|
+
|
|
69
73
|
# Combined quality commands
|
|
70
74
|
quality-fix: format lint-fix
|
|
71
75
|
@echo "✅ Auto-fixed all possible quality issues"
|
|
72
76
|
|
|
73
|
-
quality: format-check lint typecheck security
|
|
77
|
+
quality: format-check lint typecheck security version-check
|
|
74
78
|
@echo "✅ All quality checks passed"
|
|
75
79
|
|
|
76
80
|
# Testing commands
|
|
@@ -163,7 +167,7 @@ help:
|
|
|
163
167
|
@echo " clean - Clean all build artifacts and virtual environment"
|
|
164
168
|
@echo ""
|
|
165
169
|
@echo "Quality commands:"
|
|
166
|
-
@echo " quality - Run all quality checks (format, lint, typecheck, security)"
|
|
170
|
+
@echo " quality - Run all quality checks (format, lint, typecheck, security, version)"
|
|
167
171
|
@echo " quality-fix - Auto-fix formatting and linting issues"
|
|
168
172
|
@echo " format - Format code with Black"
|
|
169
173
|
@echo " format-check - Check code formatting"
|
|
@@ -171,6 +175,7 @@ help:
|
|
|
171
175
|
@echo " lint-fix - Auto-fix linting issues"
|
|
172
176
|
@echo " typecheck - Type check with mypy"
|
|
173
177
|
@echo " security - Security scan with Bandit"
|
|
178
|
+
@echo " version-check - Validate version synchronisation across files"
|
|
174
179
|
@echo ""
|
|
175
180
|
@echo "Testing commands:"
|
|
176
181
|
@echo " test - Run all tests with coverage (parallel, 85% required)"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyopenapi-gen
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.16.1
|
|
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
|