pyopenapi-gen 0.8.7__tar.gz → 0.10.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.
- pyopenapi_gen-0.10.1/.bandit +22 -0
- pyopenapi_gen-0.10.1/.github/workflows/ci.yml +23 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/workflows/claude-auto-approve.yml +62 -23
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/workflows/claude.yml +15 -7
- pyopenapi_gen-0.10.1/.github/workflows/semantic-release.yml +304 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/workflows/staging-publish.yml +2 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/workflows/testpypi-publish.yml +7 -3
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.gitignore +4 -1
- pyopenapi_gen-0.10.1/.python-version +1 -0
- pyopenapi_gen-0.10.1/CHANGELOG.md +1277 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/CLAUDE.md +128 -15
- pyopenapi_gen-0.10.1/Makefile +188 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/PKG-INFO +18 -4
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/README.md +17 -3
- pyopenapi_gen-0.10.1/coverage.xml +6690 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/poetry.lock +822 -144
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/pyproject.toml +43 -2
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/__init__.py +2 -2
- pyopenapi_gen-0.10.1/src/pyopenapi_gen/context/CLAUDE.md +284 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/context/import_collector.py +8 -8
- pyopenapi_gen-0.10.1/src/pyopenapi_gen/core/CLAUDE.md +224 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/loader/operations/parser.py +1 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/cycle_helpers.py +1 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/keywords/properties_parser.py +4 -4
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/schema_parser.py +4 -4
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +1 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/writers/python_construct_renderer.py +2 -2
- pyopenapi_gen-0.10.1/src/pyopenapi_gen/emitters/CLAUDE.md +286 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/emitters/endpoints_emitter.py +1 -1
- pyopenapi_gen-0.10.1/src/pyopenapi_gen/generator/CLAUDE.md +352 -0
- pyopenapi_gen-0.10.1/src/pyopenapi_gen/helpers/CLAUDE.md +325 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/endpoint_utils.py +2 -2
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/type_cleaner.py +1 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/type_resolution/composition_resolver.py +1 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/type_resolution/finalizer.py +1 -1
- pyopenapi_gen-0.10.1/src/pyopenapi_gen/types/CLAUDE.md +140 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/types/resolvers/schema_resolver.py +2 -2
- pyopenapi_gen-0.10.1/src/pyopenapi_gen/visit/CLAUDE.md +272 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +1 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/endpoint/generators/signature_generator.py +1 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +1 -1
- pyopenapi_gen-0.10.1/tests/cli/test_cli_edge_cases.py +100 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/cli/test_http_pagination_cli.py +34 -55
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_edge_cases_integration.py +6 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/writers/test_python_construct_renderer_json_wizard.py +6 -6
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/emitters/test_list_response_generation.py +17 -17
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/generation/test_external_core_package.py +1 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/test_type_helper.py +1 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/test_utils_helpers.py +1 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/integrations/test_end_to_end_business_swagger.py +1 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/integrations/test_name_collisions.py +2 -2
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/types/test_business_swagger_integration.py +10 -10
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/generators/test_url_args_generator.py +1 -1
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/model/test_dataclass_generator_json_wizard.py +16 -16
- pyopenapi_gen-0.8.7/.bandit +0 -1
- pyopenapi_gen-0.8.7/.github/workflows/ci.yml +0 -42
- pyopenapi_gen-0.8.7/.github/workflows/main-checks.yml +0 -97
- pyopenapi_gen-0.8.7/.github/workflows/pypi-publish.yml +0 -40
- pyopenapi_gen-0.8.7/CHANGELOG.md +0 -130
- pyopenapi_gen-0.8.7/Makefile +0 -61
- pyopenapi_gen-0.8.7/RELEASE_NOTES_v0.8.5.md +0 -81
- pyopenapi_gen-0.8.7/RESPONSE_RESOLUTION_REFACTOR.md +0 -137
- pyopenapi_gen-0.8.7/TEST_MAP.md +0 -223
- pyopenapi_gen-0.8.7/debug_after_fix.py +0 -55
- pyopenapi_gen-0.8.7/debug_data_schema_names.py +0 -56
- pyopenapi_gen-0.8.7/debug_list_issue.py +0 -69
- pyopenapi_gen-0.8.7/debug_signature_issue.py +0 -56
- pyopenapi_gen-0.8.7/debug_strategy_resolver.py +0 -70
- pyopenapi_gen-0.8.7/tests/cli/test_cli_edge_cases.py +0 -105
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.cursor/mcp.json +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.cursor/rules/architecture.mdc +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.cursor/rules/coding-conventions.mdc +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.cursor/rules/project-goal.mdc +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.cursor/rules/testing.mdc +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/BRANCH_PROTECTION.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/CLAUDE_CONFIGURATION.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/CODEOWNERS +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/dependabot.yml +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/workflows/claude-review-trigger.yml +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/workflows/pr-checks.yml +0 -0
- /pyopenapi_gen-0.8.7/.github/workflows/production-release.yml → /pyopenapi_gen-0.10.1/.github/workflows/production-release.yml.backup +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.github/workflows/promote-to-staging.yml +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/.vscode/settings.json +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/CONTRIBUTING.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/LICENSE +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/docs/README.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/docs/architecture.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/docs/endpoint_visitor.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/docs/helpers.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/docs/ir_models.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/docs/line_writer.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/docs/loader.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/docs/model_visitor.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/docs/render_context.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/docs/unified_type_resolution.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/input/business_swagger.json +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/input/minimal_swagger.json +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/input/minimal_syntax_test.json +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/input/test_name_collision_spec.json +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/mkdocs.yml +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/__main__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/cli.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/context/file_manager.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/context/render_context.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/auth/base.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/auth/plugins.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/exceptions.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/http_transport.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/loader/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/loader/loader.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/loader/operations/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/loader/operations/post_processor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/loader/operations/request_body.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/loader/parameters/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/loader/parameters/parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/loader/responses/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/loader/responses/parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/loader/schemas/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/loader/schemas/extractor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/pagination.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/common/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/existing_schema.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/common/type_parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/context.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/keywords/all_of_parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/keywords/any_of_parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/keywords/array_items_parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/keywords/one_of_parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/schema_finalizer.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/transformers/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/parsing/unified_cycle_detection.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/postprocess_manager.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/schemas.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/streaming_helpers.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/telemetry.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/utils.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/warning_collector.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/writers/code_writer.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/writers/documentation_writer.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core/writers/line_writer.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/core_package_template/README.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/emit/models_emitter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/emitters/client_emitter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/emitters/core_emitter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/emitters/docs_emitter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/emitters/exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/emitters/models_emitter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/generator/client_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/type_helper.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/type_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/type_resolution/array_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/type_resolution/named_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/type_resolution/object_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/type_resolution/primitive_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/type_resolution/resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/helpers/url_utils.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/http_types.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/ir.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/py.typed +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/types/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/types/contracts/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/types/contracts/protocols.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/types/contracts/types.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/types/resolvers/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/types/resolvers/reference_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/types/resolvers/response_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/types/services/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/types/services/type_service.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/types/strategies/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/types/strategies/response_strategy.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/client_visitor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/docs_visitor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/endpoint/generators/request_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/endpoint/generators/url_args_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/endpoint/processors/import_analyzer.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/exception_visitor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/model/alias_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/model/dataclass_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/model/enum_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/model/model_visitor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/src/pyopenapi_gen/visit/visitor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/auth/auth_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/auth/test_auth_base.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/auth/test_auth_plugins.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/cli/cli_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/cli/test_cli_backup_diff.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/cli/test_cli_edge_cases_comprehensive.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/cli/test_cli_internal_utils.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/context/context_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/context/test_file_manager.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/context/test_import_collector.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/context/test_render_context.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/context/test_render_context_imports.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/context/test_render_context_relative_paths.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/core_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/loader/test_extractor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/common/ref_resolution/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/common/ref_resolution/helpers/test_cyclic_properties.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/common/ref_resolution/helpers/test_direct_cycle.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/common/ref_resolution/helpers/test_existing_schema.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/common/ref_resolution/helpers/test_list_response.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/common/ref_resolution/helpers/test_missing_ref.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/common/ref_resolution/helpers/test_new_schema.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/common/ref_resolution/helpers/test_stripped_suffix.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/keywords/keywords_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/keywords/test_all_of_parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/keywords/test_any_of_parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/keywords/test_array_items_parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/keywords/test_one_of_parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/keywords/test_properties_parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/parsing_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/test_context.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/test_cycle_detection.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/test_cycle_helpers.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/test_improved_schema_naming.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/test_inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/test_inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/test_logging.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/test_ref_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/test_schema_finalizer.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/test_schema_parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/test_schema_parser_list_response.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/parsing/test_type_parser.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_dataclass_serialization.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_detect_circular_imports.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_edge_cases_systematic.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_exceptions_module.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_forward_references.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_http_transport.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_import_resolution.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_ir.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_ir_schema.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_loader.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_loader_extensive.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_loader_invalid_refs.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_loader_malformed.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_loader_media_types.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_pagination.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_parsing_context.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_protocol_defaults.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_schema_parser_specific_case.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_schemas.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_simple_self_ref_check.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_streaming_helpers.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_telemetry.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_telemetry_client.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_utils.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/test_warning_collector.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/writers/test_code_writer.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/writers/test_documentation_writer.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/writers/test_line_writer.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/core/writers/writers_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/emitters/emitters_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/emitters/test_client_emitter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/emitters/test_docs_emitter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/emitters/test_duplicate_operations.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/emitters/test_endpoints_emitter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/emitters/test_exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/emitters/test_models_emitter.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/end_to_end/test_dataclass_serialization_e2e.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/examples/test_developer_experience_demo.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/generation/generation_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/generation_issues/specs/minimal_addmessage_like.json +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/generation_issues/test_addmessage_like_issues.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/generation_issues/test_agent_include_parameter_typing.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/generation_issues/test_message_batch_response_issue.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/test_array_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/test_endpoint_utils.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/test_endpoint_utils_extended.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/test_get_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/test_named_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/test_named_type_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/test_object_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/test_put_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/test_type_cleaner.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/helpers/test_url_utils.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/integration/test_generated_code_structure.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/integrations/integrations_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/integrations/test_business_swagger_message_type.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/integrations/test_end_to_end_petstore.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/specs/response_unwrapping_spec.yaml +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/test_analysis_overview.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/test_init.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/types/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/types/test_contracts_types.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/types/test_reference_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/types/test_response_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/types/test_response_strategy.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/types/test_response_strategy_simplified.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/types/test_schema_resolver.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/types/test_type_service.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/generators/generators_analysis.md +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/generators/test_dataclass_integration.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/generators/test_docstring_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/generators/test_endpoint_method_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/generators/test_match_case_response.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/generators/test_request_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/generators/test_response_handler_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/generators/test_response_handler_generator_strategy.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/generators/test_signature_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/processors/test_import_analyzer.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/processors/test_import_analyzer.py.bak +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/processors/test_parameter_processor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/endpoint/test_endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/model/test_alias_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/model/test_dataclass_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/model/test_enum_generator.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/test_client_visitor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/test_model_visitor.py +0 -0
- {pyopenapi_gen-0.8.7 → pyopenapi_gen-0.10.1}/tests/visit/test_visitor.py +0 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
# Bandit configuration for pyopenapi-gen
|
2
|
+
|
3
|
+
# Skip these specific checks that are acceptable for this project:
|
4
|
+
# B101: assert_used - We use assertions for Design by Contract (DbC) as documented
|
5
|
+
# B404: import_subprocess - We need subprocess for post-processing (ruff, mypy)
|
6
|
+
# B603: subprocess_without_shell_equals_true - We use controlled subprocess calls to trusted tools
|
7
|
+
# B110: try_except_pass - Acceptable for telemetry error handling
|
8
|
+
skips:
|
9
|
+
- B101
|
10
|
+
- B404
|
11
|
+
- B603
|
12
|
+
- B110
|
13
|
+
|
14
|
+
# Only scan source code, not tests (tests may have different security requirements)
|
15
|
+
exclude_dirs:
|
16
|
+
- tests/
|
17
|
+
- _process/
|
18
|
+
- venv/
|
19
|
+
- .venv/
|
20
|
+
|
21
|
+
# Set confidence level to only report medium and high confidence issues
|
22
|
+
confidence: MEDIUM
|
@@ -0,0 +1,23 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [main]
|
6
|
+
pull_request:
|
7
|
+
branches: [main, develop, staging]
|
8
|
+
# Run on PRs to provide required "test" status check for branch protection
|
9
|
+
# Actual testing is handled by pr-checks.yml, this just satisfies the requirement
|
10
|
+
|
11
|
+
jobs:
|
12
|
+
test:
|
13
|
+
runs-on: ubuntu-latest
|
14
|
+
steps:
|
15
|
+
- name: Provide required test status check
|
16
|
+
run: |
|
17
|
+
echo "✅ This workflow satisfies the required 'test' status check"
|
18
|
+
if [ "${{ github.event_name }}" = "pull_request" ]; then
|
19
|
+
echo "PR testing is handled by pr-checks.yml workflow"
|
20
|
+
else
|
21
|
+
echo "Main branch testing is handled by semantic-release.yml workflow"
|
22
|
+
fi
|
23
|
+
echo "This minimal workflow prevents branch protection conflicts"
|
@@ -1,20 +1,20 @@
|
|
1
1
|
name: Claude Auto-Approve
|
2
2
|
|
3
3
|
on:
|
4
|
-
|
5
|
-
|
4
|
+
workflow_run:
|
5
|
+
workflows: ["Claude Code"]
|
6
|
+
types: [completed]
|
6
7
|
issue_comment:
|
7
8
|
types: [created]
|
8
9
|
|
9
10
|
jobs:
|
10
11
|
auto-approve:
|
11
12
|
if: |
|
12
|
-
(github.event_name == '
|
13
|
-
github.event.
|
14
|
-
contains(github.event.review.body, 'APPROVE')) ||
|
13
|
+
(github.event_name == 'workflow_run' &&
|
14
|
+
github.event.workflow_run.conclusion == 'success') ||
|
15
15
|
(github.event_name == 'issue_comment' &&
|
16
|
-
github.event.comment.
|
17
|
-
contains(github.event.comment.body, '
|
16
|
+
contains(github.event.comment.body, '@claude') &&
|
17
|
+
contains(github.event.comment.body, 'approved'))
|
18
18
|
runs-on: ubuntu-latest
|
19
19
|
permissions:
|
20
20
|
contents: write
|
@@ -31,39 +31,78 @@ jobs:
|
|
31
31
|
|
32
32
|
- name: Get PR number
|
33
33
|
id: pr_number
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
uses: actions/github-script@v7
|
35
|
+
with:
|
36
|
+
script: |
|
37
|
+
let prNumber = null;
|
38
|
+
|
39
|
+
if (context.eventName === 'workflow_run') {
|
40
|
+
// Get PR number from workflow run
|
41
|
+
const { data: workflowRun } = await github.rest.actions.getWorkflowRun({
|
42
|
+
owner: context.repo.owner,
|
43
|
+
repo: context.repo.repo,
|
44
|
+
run_id: context.payload.workflow_run.id,
|
45
|
+
});
|
46
|
+
|
47
|
+
if (workflowRun.pull_requests && workflowRun.pull_requests.length > 0) {
|
48
|
+
prNumber = workflowRun.pull_requests[0].number;
|
49
|
+
}
|
50
|
+
} else if (context.eventName === 'issue_comment') {
|
51
|
+
prNumber = context.payload.issue.number;
|
52
|
+
}
|
53
|
+
|
54
|
+
console.log(`Found PR number: ${prNumber}`);
|
55
|
+
core.setOutput('pr_number', prNumber);
|
56
|
+
return prNumber;
|
40
57
|
|
41
58
|
- name: Check if PR can be auto-approved
|
42
59
|
id: check_approval
|
60
|
+
if: steps.pr_number.outputs.pr_number != ''
|
43
61
|
run: |
|
44
62
|
pr_number="${{ steps.pr_number.outputs.pr_number }}"
|
45
63
|
|
64
|
+
if [[ -z "$pr_number" || "$pr_number" == "null" ]]; then
|
65
|
+
echo "No PR number found, skipping auto-approval"
|
66
|
+
echo "auto_approve=false" >> $GITHUB_OUTPUT
|
67
|
+
exit 0
|
68
|
+
fi
|
69
|
+
|
46
70
|
# Get PR details
|
47
|
-
pr_data=$(gh pr view $pr_number --json author,title,baseRefName,mergeable,reviewDecision)
|
71
|
+
pr_data=$(gh pr view $pr_number --json author,title,baseRefName,mergeable,reviewDecision,headRefName)
|
48
72
|
pr_author=$(echo "$pr_data" | jq -r '.author.login')
|
49
73
|
pr_title=$(echo "$pr_data" | jq -r '.title')
|
50
74
|
pr_base=$(echo "$pr_data" | jq -r '.baseRefName')
|
75
|
+
pr_head=$(echo "$pr_data" | jq -r '.headRefName')
|
51
76
|
pr_mergeable=$(echo "$pr_data" | jq -r '.mergeable')
|
52
77
|
review_decision=$(echo "$pr_data" | jq -r '.reviewDecision')
|
53
78
|
|
54
|
-
echo "PR
|
55
|
-
echo "
|
56
|
-
echo "
|
57
|
-
echo "
|
58
|
-
echo "
|
79
|
+
echo "PR #$pr_number Analysis:"
|
80
|
+
echo " Author: $pr_author"
|
81
|
+
echo " Title: $pr_title"
|
82
|
+
echo " Base: $pr_base"
|
83
|
+
echo " Head: $pr_head"
|
84
|
+
echo " Mergeable: $pr_mergeable"
|
85
|
+
echo " Review Decision: $review_decision"
|
59
86
|
|
60
87
|
# Check if this is an eligible PR for auto-approval
|
61
88
|
auto_approve=false
|
62
89
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
90
|
+
# Auto-approve conditions:
|
91
|
+
# 1. Hotfix branches (fix critical issues)
|
92
|
+
# 2. DevOps bot PRs with fix/chore/release prefixes
|
93
|
+
# 3. Dependabot PRs
|
94
|
+
if [[ "$pr_head" =~ ^hotfix/ ]] || \
|
95
|
+
[[ "$pr_author" == "dependabot[bot]" ]] || \
|
96
|
+
([[ "$pr_author" == "devops-mindhive" ]] && [[ "$pr_title" =~ ^(fix|chore|release): ]]); then
|
97
|
+
|
98
|
+
if [[ "$pr_mergeable" == "MERGEABLE" ]]; then
|
99
|
+
auto_approve=true
|
100
|
+
echo "✅ PR eligible for auto-approval"
|
101
|
+
else
|
102
|
+
echo "❌ PR not mergeable, skipping auto-approval"
|
103
|
+
fi
|
104
|
+
else
|
105
|
+
echo "❌ PR does not meet auto-approval criteria"
|
67
106
|
fi
|
68
107
|
|
69
108
|
echo "auto_approve=$auto_approve" >> $GITHUB_OUTPUT
|
@@ -42,11 +42,19 @@ jobs:
|
|
42
42
|
uses: anthropics/claude-code-action@beta
|
43
43
|
with:
|
44
44
|
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
45
|
+
direct_prompt: |
|
46
|
+
Review this PR for code quality, security, and compatibility:
|
47
|
+
|
48
|
+
**For hotfixes and minor fixes:**
|
49
|
+
1. If code quality is good and tests pass, fix any minor issues directly
|
50
|
+
2. Provide detailed analysis in comments
|
51
|
+
3. Note if manual approval is recommended
|
52
|
+
|
53
|
+
**For larger changes:**
|
54
|
+
1. Provide comprehensive review feedback
|
55
|
+
2. Create issues for complex problems
|
56
|
+
3. Suggest improvements and alternatives
|
57
|
+
|
58
|
+
Focus on: syntax errors, security issues, type safety, and compatibility.
|
59
|
+
timeout_minutes: 60
|
52
60
|
|
@@ -0,0 +1,304 @@
|
|
1
|
+
name: Semantic Release
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [main]
|
6
|
+
workflow_dispatch:
|
7
|
+
inputs:
|
8
|
+
reason:
|
9
|
+
description: 'Reason for manual release'
|
10
|
+
required: false
|
11
|
+
default: 'Manual release'
|
12
|
+
|
13
|
+
permissions:
|
14
|
+
contents: write
|
15
|
+
packages: write
|
16
|
+
pull-requests: write
|
17
|
+
issues: write
|
18
|
+
|
19
|
+
jobs:
|
20
|
+
release:
|
21
|
+
runs-on: ubuntu-latest
|
22
|
+
environment: production
|
23
|
+
concurrency:
|
24
|
+
group: semantic-release
|
25
|
+
cancel-in-progress: false
|
26
|
+
|
27
|
+
steps:
|
28
|
+
- name: Checkout code
|
29
|
+
uses: actions/checkout@v4
|
30
|
+
with:
|
31
|
+
fetch-depth: 0
|
32
|
+
token: ${{ secrets.SEMANTIC_RELEASE_TOKEN || secrets.GITHUB_TOKEN }}
|
33
|
+
|
34
|
+
- name: Set up Python
|
35
|
+
uses: actions/setup-python@v5
|
36
|
+
with:
|
37
|
+
python-version: '3.12'
|
38
|
+
|
39
|
+
- name: Install Poetry
|
40
|
+
uses: snok/install-poetry@v1
|
41
|
+
with:
|
42
|
+
version: latest
|
43
|
+
virtualenvs-create: true
|
44
|
+
virtualenvs-in-project: true
|
45
|
+
virtualenvs-path: .venv
|
46
|
+
|
47
|
+
- name: Install dependencies
|
48
|
+
run: |
|
49
|
+
poetry install --with dev
|
50
|
+
|
51
|
+
- name: Run comprehensive quality checks
|
52
|
+
run: |
|
53
|
+
poetry run black --check src/ tests/
|
54
|
+
poetry run ruff check src/ tests/
|
55
|
+
poetry run mypy src/ --strict --no-warn-no-return
|
56
|
+
poetry run bandit -r src/ -f txt -c .bandit
|
57
|
+
|
58
|
+
- name: Run full test suite
|
59
|
+
run: |
|
60
|
+
poetry run pytest -n 2 --timeout=120 --cov=src --cov-report=term-missing --cov-report=xml --cov-fail-under=85
|
61
|
+
|
62
|
+
- name: Check for release-worthy changes
|
63
|
+
id: check_changes
|
64
|
+
run: |
|
65
|
+
# Check if there are any commits since the last tag that would trigger a release
|
66
|
+
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
|
67
|
+
if [ -n "$LAST_TAG" ]; then
|
68
|
+
COMMITS_SINCE_TAG=$(git log --oneline $LAST_TAG..HEAD | wc -l)
|
69
|
+
RELEASE_WORTHY=$(git log $LAST_TAG..HEAD --grep="^feat" --grep="^fix" --grep="^perf" --grep="BREAKING CHANGE" --oneline | wc -l)
|
70
|
+
else
|
71
|
+
COMMITS_SINCE_TAG=1
|
72
|
+
RELEASE_WORTHY=1
|
73
|
+
fi
|
74
|
+
|
75
|
+
echo "commits_since_tag=$COMMITS_SINCE_TAG" >> $GITHUB_OUTPUT
|
76
|
+
echo "release_worthy=$RELEASE_WORTHY" >> $GITHUB_OUTPUT
|
77
|
+
echo "last_tag=$LAST_TAG" >> $GITHUB_OUTPUT
|
78
|
+
|
79
|
+
if [ "$RELEASE_WORTHY" -gt 0 ]; then
|
80
|
+
echo "Found release-worthy changes since $LAST_TAG"
|
81
|
+
else
|
82
|
+
echo "No release-worthy changes found since $LAST_TAG"
|
83
|
+
fi
|
84
|
+
|
85
|
+
- name: Run semantic-release version
|
86
|
+
if: steps.check_changes.outputs.release_worthy > 0 || github.event_name == 'workflow_dispatch'
|
87
|
+
env:
|
88
|
+
GH_TOKEN: ${{ secrets.SEMANTIC_RELEASE_TOKEN || secrets.GITHUB_TOKEN }}
|
89
|
+
run: |
|
90
|
+
git config user.name "github-actions[bot]"
|
91
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
92
|
+
poetry run semantic-release version --skip-build
|
93
|
+
|
94
|
+
- name: Build packages after version bump
|
95
|
+
if: steps.check_changes.outputs.release_worthy > 0 || github.event_name == 'workflow_dispatch'
|
96
|
+
run: |
|
97
|
+
echo "🧹 Cleaning old packages..."
|
98
|
+
rm -rf dist/
|
99
|
+
echo "📦 Building packages with updated version..."
|
100
|
+
poetry run python -m build
|
101
|
+
echo "📋 Package contents:"
|
102
|
+
ls -la dist/
|
103
|
+
|
104
|
+
- name: Check if packages exist after semantic-release
|
105
|
+
if: steps.check_changes.outputs.release_worthy > 0 || github.event_name == 'workflow_dispatch'
|
106
|
+
run: |
|
107
|
+
if [ -d "dist" ] && [ "$(ls -A dist/)" ]; then
|
108
|
+
echo "✅ Packages exist in dist/"
|
109
|
+
ls -la dist/
|
110
|
+
|
111
|
+
# Extract version from package filename
|
112
|
+
PACKAGE_VERSION=$(ls dist/*.whl | sed 's/.*-\([0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/' | head -1)
|
113
|
+
echo "📦 Built package version: $PACKAGE_VERSION"
|
114
|
+
echo "package_version=$PACKAGE_VERSION" >> $GITHUB_ENV
|
115
|
+
|
116
|
+
# Check if version already exists on PyPI
|
117
|
+
PYPI_LATEST=$(curl -s "https://pypi.org/pypi/pyopenapi-gen/json" | python3 -c "import sys, json; data=json.load(sys.stdin); print(data['info']['version'])" 2>/dev/null || echo "unknown")
|
118
|
+
echo "📚 PyPI latest version: $PYPI_LATEST"
|
119
|
+
|
120
|
+
if [ "$PACKAGE_VERSION" = "$PYPI_LATEST" ]; then
|
121
|
+
echo "⚠️ Version $PACKAGE_VERSION already exists on PyPI"
|
122
|
+
echo "This indicates either:"
|
123
|
+
echo " - No release-worthy changes since last version"
|
124
|
+
echo " - Semantic-release didn't detect conventional commits"
|
125
|
+
echo " - Last commit was already a release commit"
|
126
|
+
echo "packages_exist=false" >> $GITHUB_ENV
|
127
|
+
echo "version_conflict=true" >> $GITHUB_ENV
|
128
|
+
else
|
129
|
+
echo "✅ New version $PACKAGE_VERSION ready for publishing (current: $PYPI_LATEST → new: $PACKAGE_VERSION)"
|
130
|
+
echo "packages_exist=true" >> $GITHUB_ENV
|
131
|
+
echo "version_conflict=false" >> $GITHUB_ENV
|
132
|
+
fi
|
133
|
+
else
|
134
|
+
echo "❌ No packages found, semantic-release may not have triggered a release"
|
135
|
+
echo "packages_exist=false" >> $GITHUB_ENV
|
136
|
+
fi
|
137
|
+
|
138
|
+
- name: Validate PyPI token availability
|
139
|
+
if: (steps.check_changes.outputs.release_worthy > 0 || github.event_name == 'workflow_dispatch') && env.packages_exist == 'true'
|
140
|
+
env:
|
141
|
+
PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
|
142
|
+
run: |
|
143
|
+
echo "🔐 Validating PYPI_API_TOKEN secret..."
|
144
|
+
if [ -z "$PYPI_TOKEN" ]; then
|
145
|
+
echo "❌ PYPI_API_TOKEN secret is not configured in GitHub repository"
|
146
|
+
echo ""
|
147
|
+
echo "To fix this:"
|
148
|
+
echo " 1. Go to: https://github.com/mindhiveoy/pyopenapi_gen/settings/secrets/actions"
|
149
|
+
echo " 2. Click 'New repository secret'"
|
150
|
+
echo " 3. Name: PYPI_API_TOKEN"
|
151
|
+
echo " 4. Value: your PyPI token (starts with pypi-)"
|
152
|
+
echo ""
|
153
|
+
echo "Your PyPI token should be the same one that works locally."
|
154
|
+
exit 1
|
155
|
+
fi
|
156
|
+
|
157
|
+
# Validate token format
|
158
|
+
if [[ ! "$PYPI_TOKEN" =~ ^pypi- ]]; then
|
159
|
+
echo "⚠️ Token doesn't start with 'pypi-' - this may be incorrect"
|
160
|
+
echo "Token length: ${#PYPI_TOKEN} characters"
|
161
|
+
else
|
162
|
+
echo "✅ Token format looks correct (pypi-...)"
|
163
|
+
echo "✅ Token length: ${#PYPI_TOKEN} characters"
|
164
|
+
fi
|
165
|
+
|
166
|
+
- name: Publish to PyPI with twine
|
167
|
+
if: (steps.check_changes.outputs.release_worthy > 0 || github.event_name == 'workflow_dispatch') && env.packages_exist == 'true'
|
168
|
+
timeout-minutes: 10
|
169
|
+
env:
|
170
|
+
TWINE_USERNAME: __token__
|
171
|
+
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
|
172
|
+
run: |
|
173
|
+
echo "🚀 Publishing to PyPI with twine..."
|
174
|
+
|
175
|
+
echo "✅ Token configured (length: ${#TWINE_PASSWORD})"
|
176
|
+
echo "📦 Checking packages..."
|
177
|
+
poetry run twine check dist/*
|
178
|
+
|
179
|
+
echo "🔗 Testing PyPI connectivity..."
|
180
|
+
curl -I https://upload.pypi.org/legacy/ || {
|
181
|
+
echo "⚠️ PyPI upload endpoint not reachable"
|
182
|
+
exit 1
|
183
|
+
}
|
184
|
+
|
185
|
+
echo "📤 Uploading to PyPI with timeout protection..."
|
186
|
+
timeout 300 poetry run twine upload \
|
187
|
+
--username "$TWINE_USERNAME" \
|
188
|
+
--password "$TWINE_PASSWORD" \
|
189
|
+
--verbose \
|
190
|
+
--disable-progress-bar \
|
191
|
+
dist/* || {
|
192
|
+
echo "❌ Upload failed or timed out after 5 minutes"
|
193
|
+
echo "This could be due to:"
|
194
|
+
echo " - Network connectivity issues"
|
195
|
+
echo " - PyPI rate limiting"
|
196
|
+
echo " - Invalid token permissions"
|
197
|
+
echo " - Package already exists (version conflict)"
|
198
|
+
exit 1
|
199
|
+
}
|
200
|
+
|
201
|
+
- name: Run semantic-release publish (GitHub release only)
|
202
|
+
if: steps.check_changes.outputs.release_worthy > 0 || github.event_name == 'workflow_dispatch'
|
203
|
+
env:
|
204
|
+
GH_TOKEN: ${{ secrets.SEMANTIC_RELEASE_TOKEN || secrets.GITHUB_TOKEN }}
|
205
|
+
run: |
|
206
|
+
echo "📝 Creating GitHub release with semantic-release..."
|
207
|
+
poetry run semantic-release publish
|
208
|
+
|
209
|
+
- name: Get release version
|
210
|
+
if: success() && (steps.check_changes.outputs.release_worthy > 0 || github.event_name == 'workflow_dispatch')
|
211
|
+
id: get_version
|
212
|
+
run: |
|
213
|
+
# Get the latest tag as the released version
|
214
|
+
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
|
215
|
+
echo "released_version=$LATEST_TAG" >> $GITHUB_OUTPUT
|
216
|
+
echo "Released version: $LATEST_TAG"
|
217
|
+
|
218
|
+
- name: Sync version to staging branch
|
219
|
+
if: success() && steps.get_version.outputs.released_version != ''
|
220
|
+
env:
|
221
|
+
GH_TOKEN: ${{ secrets.SEMANTIC_RELEASE_TOKEN || secrets.GITHUB_TOKEN }}
|
222
|
+
run: |
|
223
|
+
echo "🔄 Syncing main to staging branch..."
|
224
|
+
|
225
|
+
# Fetch all branches
|
226
|
+
git fetch origin staging:staging || echo "Staging branch doesn't exist, skipping"
|
227
|
+
|
228
|
+
if git show-ref --verify --quiet refs/heads/staging; then
|
229
|
+
# Switch to staging and merge main
|
230
|
+
git checkout staging
|
231
|
+
git merge main --no-edit || {
|
232
|
+
echo "⚠️ Merge conflict detected, creating PR instead"
|
233
|
+
git merge --abort
|
234
|
+
gh pr create \
|
235
|
+
--title "chore: sync version ${{ steps.get_version.outputs.released_version }} from main to staging" \
|
236
|
+
--body "Automated sync of semantic release version ${{ steps.get_version.outputs.released_version }} from main branch" \
|
237
|
+
--base staging \
|
238
|
+
--head main \
|
239
|
+
--label "automated,version-sync" || echo "PR may already exist"
|
240
|
+
} && {
|
241
|
+
echo "✅ Successfully merged main into staging"
|
242
|
+
git push origin staging || echo "Failed to push to staging"
|
243
|
+
}
|
244
|
+
else
|
245
|
+
echo "ℹ️ Staging branch doesn't exist, skipping sync"
|
246
|
+
fi
|
247
|
+
|
248
|
+
- name: Sync version to develop branch
|
249
|
+
if: success() && steps.get_version.outputs.released_version != ''
|
250
|
+
env:
|
251
|
+
GH_TOKEN: ${{ secrets.SEMANTIC_RELEASE_TOKEN || secrets.GITHUB_TOKEN }}
|
252
|
+
run: |
|
253
|
+
echo "🔄 Syncing main to develop branch..."
|
254
|
+
|
255
|
+
# Fetch all branches
|
256
|
+
git fetch origin develop:develop || echo "Develop branch doesn't exist, skipping"
|
257
|
+
|
258
|
+
if git show-ref --verify --quiet refs/heads/develop; then
|
259
|
+
# Switch to develop and merge main
|
260
|
+
git checkout develop
|
261
|
+
git merge main --no-edit || {
|
262
|
+
echo "⚠️ Merge conflict detected, creating PR instead"
|
263
|
+
git merge --abort
|
264
|
+
gh pr create \
|
265
|
+
--title "chore: sync version ${{ steps.get_version.outputs.released_version }} from main to develop" \
|
266
|
+
--body "Automated sync of semantic release version ${{ steps.get_version.outputs.released_version }} from main branch" \
|
267
|
+
--base develop \
|
268
|
+
--head main \
|
269
|
+
--label "automated,version-sync" || echo "PR may already exist"
|
270
|
+
} && {
|
271
|
+
echo "✅ Successfully merged main into develop"
|
272
|
+
git push origin develop || echo "Failed to push to develop"
|
273
|
+
}
|
274
|
+
else
|
275
|
+
echo "ℹ️ Develop branch doesn't exist, skipping sync"
|
276
|
+
fi
|
277
|
+
|
278
|
+
- name: Create release summary
|
279
|
+
if: success()
|
280
|
+
run: |
|
281
|
+
echo "## 🚀 Release Published" >> $GITHUB_STEP_SUMMARY
|
282
|
+
echo "- **Version**: ${{ steps.get_version.outputs.released_version }}" >> $GITHUB_STEP_SUMMARY
|
283
|
+
echo "- **PyPI**: [pyopenapi-gen ${{ steps.get_version.outputs.released_version }}](https://pypi.org/project/pyopenapi-gen/${{ steps.get_version.outputs.released_version }})" >> $GITHUB_STEP_SUMMARY
|
284
|
+
echo "- **GitHub Release**: [Release Notes](https://github.com/mindhiveoy/pyopenapi_gen/releases/tag/${{ steps.get_version.outputs.released_version }})" >> $GITHUB_STEP_SUMMARY
|
285
|
+
|
286
|
+
if [ -n "${{ steps.get_version.outputs.released_version }}" ]; then
|
287
|
+
echo "- **Branch Sync**: Version synced to staging and develop branches" >> $GITHUB_STEP_SUMMARY
|
288
|
+
fi
|
289
|
+
|
290
|
+
notify-completion:
|
291
|
+
needs: release
|
292
|
+
runs-on: ubuntu-latest
|
293
|
+
if: always()
|
294
|
+
steps:
|
295
|
+
- name: Report success
|
296
|
+
if: needs.release.result == 'success'
|
297
|
+
run: |
|
298
|
+
echo "✅ Semantic release completed successfully"
|
299
|
+
|
300
|
+
- name: Report failure
|
301
|
+
if: needs.release.result == 'failure'
|
302
|
+
run: |
|
303
|
+
echo "❌ Semantic release failed"
|
304
|
+
exit 1
|
@@ -1,8 +1,12 @@
|
|
1
|
-
name: Publish to TestPyPI (
|
1
|
+
name: Publish to TestPyPI (manual)
|
2
2
|
|
3
3
|
on:
|
4
|
-
|
5
|
-
|
4
|
+
workflow_dispatch:
|
5
|
+
inputs:
|
6
|
+
reason:
|
7
|
+
description: 'Reason for manual TestPyPI publish'
|
8
|
+
required: false
|
9
|
+
default: 'Manual testing'
|
6
10
|
|
7
11
|
jobs:
|
8
12
|
build-and-testpypi:
|
@@ -0,0 +1 @@
|
|
1
|
+
3.12
|