pyopenapi-gen 0.8.3__tar.gz → 0.8.6__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.8.3 → pyopenapi_gen-0.8.6}/.github/BRANCH_PROTECTION.md +57 -15
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/workflows/ci.yml +3 -5
- pyopenapi_gen-0.8.6/.github/workflows/claude-review-trigger.yml +68 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/workflows/claude.yml +13 -5
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/workflows/main-checks.yml +1 -2
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/workflows/pr-checks.yml +3 -4
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/workflows/production-release.yml +1 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/workflows/testpypi-publish.yml +1 -2
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.gitignore +5 -3
- pyopenapi_gen-0.8.6/CHANGELOG.md +130 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/CLAUDE.md +37 -2
- pyopenapi_gen-0.8.6/CONTRIBUTING.md +602 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/Makefile +5 -4
- pyopenapi_gen-0.8.6/PKG-INFO +383 -0
- pyopenapi_gen-0.8.6/README.md +325 -0
- pyopenapi_gen-0.8.6/RELEASE_NOTES_v0.8.5.md +81 -0
- pyopenapi_gen-0.8.6/RESPONSE_RESOLUTION_REFACTOR.md +137 -0
- pyopenapi_gen-0.8.6/debug_after_fix.py +55 -0
- pyopenapi_gen-0.8.6/debug_data_schema_names.py +56 -0
- pyopenapi_gen-0.8.6/debug_list_issue.py +69 -0
- pyopenapi_gen-0.8.6/debug_signature_issue.py +56 -0
- pyopenapi_gen-0.8.6/debug_strategy_resolver.py +70 -0
- pyopenapi_gen-0.8.6/docs/README.md +79 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/docs/architecture.md +65 -9
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/poetry.lock +61 -185
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/pyproject.toml +48 -13
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/cli.py +5 -22
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/context/import_collector.py +8 -8
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/loader/operations/parser.py +1 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/context.py +2 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/cycle_helpers.py +1 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/keywords/properties_parser.py +4 -4
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/schema_parser.py +4 -4
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +1 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/postprocess_manager.py +39 -13
- pyopenapi_gen-0.8.6/src/pyopenapi_gen/core/schemas.py +125 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/utils.py +8 -3
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/writers/python_construct_renderer.py +57 -9
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/emitters/endpoints_emitter.py +1 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/endpoint_utils.py +4 -22
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/type_cleaner.py +1 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/type_resolution/composition_resolver.py +1 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/type_resolution/finalizer.py +1 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/types/contracts/types.py +0 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/types/resolvers/response_resolver.py +5 -33
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/types/resolvers/schema_resolver.py +2 -2
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/types/services/type_service.py +0 -18
- pyopenapi_gen-0.8.6/src/pyopenapi_gen/types/strategies/__init__.py +5 -0
- pyopenapi_gen-0.8.6/src/pyopenapi_gen/types/strategies/response_strategy.py +187 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +1 -20
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +5 -3
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py +12 -6
- pyopenapi_gen-0.8.6/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +506 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/endpoint/generators/signature_generator.py +7 -4
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/endpoint/processors/import_analyzer.py +4 -2
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +1 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/model/dataclass_generator.py +32 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/cli/test_cli_edge_cases.py +7 -8
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/cli/test_cli_edge_cases_comprehensive.py +9 -9
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/cli/test_http_pagination_cli.py +0 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/test_cycle_detection.py +0 -47
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_pagination.py +0 -8
- pyopenapi_gen-0.8.6/tests/core/test_schemas.py +773 -0
- pyopenapi_gen-0.8.6/tests/core/writers/test_python_construct_renderer_json_wizard.py +213 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/emitters/test_list_response_generation.py +20 -20
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/emitters/test_models_emitter.py +5 -5
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/generation/test_external_core_package.py +1 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/test_endpoint_utils_extended.py +0 -78
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/test_named_resolver.py +3 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/test_object_resolver.py +14 -5
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/test_type_helper.py +1 -1
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/integrations/test_end_to_end_business_swagger.py +1 -25
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/integrations/test_name_collisions.py +2 -2
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/types/test_business_swagger_integration.py +13 -12
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/types/test_contracts_types.py +0 -3
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/types/test_response_resolver.py +169 -10
- pyopenapi_gen-0.8.6/tests/types/test_response_strategy.py +450 -0
- pyopenapi_gen-0.8.6/tests/types/test_response_strategy_simplified.py +328 -0
- pyopenapi_gen-0.8.6/tests/types/test_schema_resolver.py +643 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/generators/test_docstring_generator.py +11 -8
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/generators/test_endpoint_method_generator.py +46 -10
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/generators/test_match_case_response.py +34 -21
- pyopenapi_gen-0.8.6/tests/visit/endpoint/generators/test_response_handler_generator.py +736 -0
- pyopenapi_gen-0.8.6/tests/visit/endpoint/generators/test_response_handler_generator_strategy.py +429 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/generators/test_signature_generator.py +24 -15
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/generators/test_url_args_generator.py +1 -1
- pyopenapi_gen-0.8.6/tests/visit/endpoint/processors/test_import_analyzer.py +446 -0
- pyopenapi_gen-0.8.3/tests/visit/endpoint/processors/test_import_analyzer.py → pyopenapi_gen-0.8.6/tests/visit/endpoint/processors/test_import_analyzer.py.bak +40 -38
- pyopenapi_gen-0.8.6/tests/visit/model/test_dataclass_generator_json_wizard.py +248 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/test_model_visitor.py +45 -43
- pyopenapi_gen-0.8.3/PKG-INFO +0 -224
- pyopenapi_gen-0.8.3/README.md +0 -182
- pyopenapi_gen-0.8.3/src/pyopenapi_gen/core/schemas.py +0 -40
- pyopenapi_gen-0.8.3/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +0 -497
- pyopenapi_gen-0.8.3/tests/core/test_schemas.py +0 -203
- pyopenapi_gen-0.8.3/tests/generation/test_response_unwrapping.py +0 -391
- pyopenapi_gen-0.8.3/tests/types/test_schema_resolver.py +0 -316
- pyopenapi_gen-0.8.3/tests/visit/endpoint/generators/test_response_handler_generator.py +0 -734
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.bandit +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.cursor/mcp.json +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.cursor/rules/architecture.mdc +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.cursor/rules/coding-conventions.mdc +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.cursor/rules/project-goal.mdc +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.cursor/rules/testing.mdc +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/CODEOWNERS +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/dependabot.yml +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/workflows/promote-to-staging.yml +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/workflows/pypi-publish.yml +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.github/workflows/staging-publish.yml +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/.vscode/settings.json +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/LICENSE +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/TEST_MAP.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/docs/endpoint_visitor.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/docs/helpers.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/docs/ir_models.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/docs/line_writer.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/docs/loader.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/docs/model_visitor.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/docs/render_context.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/docs/unified_type_resolution.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/input/business_swagger.json +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/input/minimal_swagger.json +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/input/minimal_syntax_test.json +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/input/test_name_collision_spec.json +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/mkdocs.yml +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/__main__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/context/file_manager.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/context/render_context.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/auth/base.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/auth/plugins.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/exceptions.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/http_transport.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/loader/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/loader/loader.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/loader/operations/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/loader/operations/post_processor.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/loader/operations/request_body.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/loader/parameters/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/loader/parameters/parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/loader/responses/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/loader/responses/parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/loader/schemas/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/loader/schemas/extractor.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/pagination.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/common/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/existing_schema.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/common/type_parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/keywords/all_of_parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/keywords/any_of_parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/keywords/array_items_parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/keywords/one_of_parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/schema_finalizer.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/transformers/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/parsing/unified_cycle_detection.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/streaming_helpers.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/telemetry.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/warning_collector.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/writers/code_writer.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/writers/documentation_writer.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core/writers/line_writer.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/core_package_template/README.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/emit/models_emitter.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/emitters/client_emitter.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/emitters/core_emitter.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/emitters/docs_emitter.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/emitters/exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/emitters/models_emitter.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/generator/client_generator.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/type_helper.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/type_resolution/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/type_resolution/array_resolver.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/type_resolution/named_resolver.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/type_resolution/object_resolver.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/type_resolution/primitive_resolver.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/type_resolution/resolver.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/helpers/url_utils.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/http_types.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/ir.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/py.typed +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/types/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/types/contracts/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/types/contracts/protocols.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/types/resolvers/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/types/resolvers/reference_resolver.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/types/services/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/client_visitor.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/docs_visitor.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/endpoint/generators/request_generator.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/endpoint/generators/url_args_generator.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/exception_visitor.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/model/alias_generator.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/model/enum_generator.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/model/model_visitor.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/src/pyopenapi_gen/visit/visitor.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/auth/auth_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/auth/test_auth_base.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/auth/test_auth_plugins.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/cli/cli_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/cli/test_cli_backup_diff.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/cli/test_cli_internal_utils.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/context/context_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/context/test_file_manager.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/context/test_import_collector.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/context/test_render_context.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/context/test_render_context_imports.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/context/test_render_context_relative_paths.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/core_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/loader/test_extractor.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/common/ref_resolution/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/common/ref_resolution/helpers/test_cyclic_properties.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/common/ref_resolution/helpers/test_direct_cycle.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/common/ref_resolution/helpers/test_existing_schema.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/common/ref_resolution/helpers/test_list_response.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/common/ref_resolution/helpers/test_missing_ref.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/common/ref_resolution/helpers/test_new_schema.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/common/ref_resolution/helpers/test_stripped_suffix.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/keywords/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/keywords/keywords_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/keywords/test_all_of_parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/keywords/test_any_of_parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/keywords/test_array_items_parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/keywords/test_one_of_parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/keywords/test_properties_parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/parsing_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/test_context.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/test_cycle_helpers.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/test_improved_schema_naming.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/test_inline_enum_extractor.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/test_inline_object_promoter.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/test_logging.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/test_ref_resolver.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/test_schema_finalizer.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/test_schema_parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/test_schema_parser_list_response.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/parsing/test_type_parser.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_dataclass_serialization.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_detect_circular_imports.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_edge_cases_integration.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_edge_cases_systematic.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_exceptions_module.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_forward_references.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_http_transport.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_import_resolution.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_ir.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_ir_schema.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_loader.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_loader_extensive.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_loader_invalid_refs.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_loader_malformed.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_loader_media_types.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_parsing_context.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_protocol_defaults.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_schema_parser_specific_case.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_simple_self_ref_check.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_streaming_helpers.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_telemetry.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_telemetry_client.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_utils.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/test_warning_collector.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/writers/test_code_writer.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/writers/test_documentation_writer.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/writers/test_line_writer.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/core/writers/writers_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/emitters/emitters_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/emitters/test_client_emitter.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/emitters/test_docs_emitter.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/emitters/test_duplicate_operations.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/emitters/test_endpoints_emitter.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/emitters/test_exceptions_emitter.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/end_to_end/test_dataclass_serialization_e2e.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/examples/test_developer_experience_demo.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/generation/generation_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/generation_issues/specs/minimal_addmessage_like.json +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/generation_issues/test_addmessage_like_issues.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/generation_issues/test_agent_include_parameter_typing.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/generation_issues/test_message_batch_response_issue.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/helpers_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/test_array_resolver.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/test_endpoint_utils.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/test_get_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/test_named_type_resolver.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/test_put_endpoint_return_types.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/test_type_cleaner.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/test_url_utils.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/helpers/test_utils_helpers.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/integration/test_generated_code_structure.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/integrations/integrations_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/integrations/test_business_swagger_message_type.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/integrations/test_end_to_end_petstore.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/specs/response_unwrapping_spec.yaml +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/test_analysis_overview.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/test_init.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/types/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/types/test_reference_resolver.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/types/test_type_service.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/generators/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/generators/generators_analysis.md +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/generators/test_dataclass_integration.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/generators/test_request_generator.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/processors/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/processors/test_parameter_processor.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/endpoint/test_endpoint_visitor.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/model/__init__.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/model/test_alias_generator.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/model/test_dataclass_generator.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/model/test_enum_generator.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/test_client_visitor.py +0 -0
- {pyopenapi_gen-0.8.3 → pyopenapi_gen-0.8.6}/tests/visit/test_visitor.py +0 -0
@@ -1,10 +1,18 @@
|
|
1
1
|
# Branch Protection Configuration
|
2
2
|
|
3
|
-
This document outlines the
|
3
|
+
This document outlines the GitHub branch protection settings for the `develop`, `staging`, and `main` branches.
|
4
|
+
|
5
|
+
## 🛡️ Branch Protection Status
|
6
|
+
|
7
|
+
All three critical branches are now **FULLY PROTECTED** with the following settings:
|
8
|
+
|
9
|
+
- **main**: ✅ Protected with full CI/CD enforcement
|
10
|
+
- **staging**: ✅ Protected with full CI/CD enforcement
|
11
|
+
- **develop**: ✅ Protected with full CI/CD enforcement
|
4
12
|
|
5
13
|
## Required Settings
|
6
14
|
|
7
|
-
### Branch Protection Rules for `develop`
|
15
|
+
### Branch Protection Rules for `develop`, `staging`, and `main`
|
8
16
|
|
9
17
|
1. **Require pull request reviews before merging**
|
10
18
|
- Required approving reviews: 1
|
@@ -14,11 +22,11 @@ This document outlines the required GitHub branch protection settings for the `d
|
|
14
22
|
2. **Require status checks to pass before merging**
|
15
23
|
- Require branches to be up to date before merging: ✅
|
16
24
|
- Required status checks:
|
17
|
-
- `
|
18
|
-
- `
|
19
|
-
- `
|
20
|
-
- `security
|
21
|
-
- `
|
25
|
+
- `format-check` (Black formatting)
|
26
|
+
- `lint` (Ruff linting)
|
27
|
+
- `typecheck` (MyPy type checking)
|
28
|
+
- `security` (Bandit security scanning)
|
29
|
+
- `test` (Full test suite with 85% coverage)
|
22
30
|
|
23
31
|
3. **Require conversation resolution before merging**: ✅
|
24
32
|
|
@@ -34,6 +42,22 @@ This document outlines the required GitHub branch protection settings for the `d
|
|
34
42
|
|
35
43
|
9. **Allow deletions**: ❌
|
36
44
|
|
45
|
+
## 🔒 Protection Features
|
46
|
+
|
47
|
+
### Deletion Protection
|
48
|
+
All branches are protected from accidental deletion:
|
49
|
+
- Force pushes are disabled
|
50
|
+
- Branch deletion is explicitly forbidden
|
51
|
+
- Admin privileges still enforce protection rules
|
52
|
+
|
53
|
+
### Quality Gates
|
54
|
+
Every PR must pass all quality checks:
|
55
|
+
- Code formatting (Black)
|
56
|
+
- Linting (Ruff)
|
57
|
+
- Type checking (MyPy strict mode)
|
58
|
+
- Security scanning (Bandit)
|
59
|
+
- Test suite with 85% coverage minimum
|
60
|
+
|
37
61
|
## How to Configure
|
38
62
|
|
39
63
|
### Via GitHub Web Interface
|
@@ -44,16 +68,34 @@ This document outlines the required GitHub branch protection settings for the `d
|
|
44
68
|
4. Configure the settings as outlined above
|
45
69
|
5. Save the branch protection rule
|
46
70
|
|
47
|
-
### Via GitHub CLI
|
71
|
+
### Via GitHub CLI
|
72
|
+
|
73
|
+
The protection was applied using GitHub CLI. Here's how to configure each branch:
|
48
74
|
|
49
75
|
```bash
|
50
|
-
#
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
76
|
+
# Create protection JSON
|
77
|
+
cat > branch_protection.json << EOF
|
78
|
+
{
|
79
|
+
"required_status_checks": {
|
80
|
+
"strict": true,
|
81
|
+
"contexts": ["format-check", "lint", "typecheck", "security", "test"]
|
82
|
+
},
|
83
|
+
"enforce_admins": true,
|
84
|
+
"required_pull_request_reviews": {
|
85
|
+
"required_approving_review_count": 1,
|
86
|
+
"dismiss_stale_reviews": true,
|
87
|
+
"require_code_owner_reviews": false
|
88
|
+
},
|
89
|
+
"restrictions": null,
|
90
|
+
"allow_deletions": false,
|
91
|
+
"allow_force_pushes": false
|
92
|
+
}
|
93
|
+
EOF
|
94
|
+
|
95
|
+
# Apply to each branch
|
96
|
+
gh api --method PUT repos/OWNER/REPO/branches/main/protection --input branch_protection.json
|
97
|
+
gh api --method PUT repos/OWNER/REPO/branches/develop/protection --input branch_protection.json
|
98
|
+
gh api --method PUT repos/OWNER/REPO/branches/staging/protection --input branch_protection.json
|
57
99
|
```
|
58
100
|
|
59
101
|
## Quality Gates Enforced
|
@@ -2,9 +2,9 @@ name: CI
|
|
2
2
|
|
3
3
|
on:
|
4
4
|
push:
|
5
|
-
branches: [main, develop]
|
5
|
+
branches: [main, develop, staging]
|
6
6
|
pull_request:
|
7
|
-
branches: [main, develop]
|
7
|
+
branches: [main, develop, staging]
|
8
8
|
|
9
9
|
jobs:
|
10
10
|
test:
|
@@ -39,6 +39,4 @@ jobs:
|
|
39
39
|
poetry run mypy src/
|
40
40
|
- name: Run tests with coverage
|
41
41
|
run: |
|
42
|
-
poetry run pytest --cov=src --cov-report=xml
|
43
|
-
- name: Generate HTML coverage report
|
44
|
-
run: poetry run pytest --cov=src --cov-report=html
|
42
|
+
poetry run pytest --cov=src --cov-report=xml --cov-report=html
|
@@ -0,0 +1,68 @@
|
|
1
|
+
name: Notify Claude for PR Review
|
2
|
+
|
3
|
+
on:
|
4
|
+
pull_request:
|
5
|
+
types: [opened, synchronize, ready_for_review]
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
notify-claude:
|
9
|
+
runs-on: ubuntu-latest
|
10
|
+
if: github.event.pull_request.draft == false
|
11
|
+
|
12
|
+
permissions:
|
13
|
+
contents: read
|
14
|
+
pull-requests: write
|
15
|
+
|
16
|
+
steps:
|
17
|
+
- name: Checkout repository
|
18
|
+
uses: actions/checkout@v4
|
19
|
+
with:
|
20
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
21
|
+
|
22
|
+
- name: Check if PR needs Claude review
|
23
|
+
id: needs_review
|
24
|
+
run: |
|
25
|
+
pr_author="${{ github.event.pull_request.user.login }}"
|
26
|
+
pr_title="${{ github.event.pull_request.title }}"
|
27
|
+
pr_base="${{ github.event.pull_request.base.ref }}"
|
28
|
+
|
29
|
+
echo "PR Author: $pr_author"
|
30
|
+
echo "PR Title: $pr_title"
|
31
|
+
echo "PR Base Branch: $pr_base"
|
32
|
+
|
33
|
+
# PRs that should get Claude review:
|
34
|
+
# 1. ALL PRs targeting develop branch (main development branch)
|
35
|
+
# 2. Dependabot PRs (dependency updates)
|
36
|
+
# 3. Version bump PRs from devops-mindhive
|
37
|
+
# 4. Documentation PRs from devops-mindhive
|
38
|
+
# 5. PRs with [claude-review] tag
|
39
|
+
|
40
|
+
needs_review=false
|
41
|
+
|
42
|
+
if [[ "$pr_base" == "develop" ]] || \
|
43
|
+
[[ "$pr_author" == "dependabot[bot]" ]] || \
|
44
|
+
[[ "$pr_author" == "devops-mindhive" && "$pr_title" =~ ^(release|chore|docs): ]] || \
|
45
|
+
[[ "$pr_title" =~ \[claude-review\] ]]; then
|
46
|
+
needs_review=true
|
47
|
+
fi
|
48
|
+
|
49
|
+
echo "needs_review=$needs_review" >> $GITHUB_OUTPUT
|
50
|
+
|
51
|
+
if [[ "$needs_review" == "true" ]]; then
|
52
|
+
echo "✅ PR needs Claude review"
|
53
|
+
else
|
54
|
+
echo "❌ PR does not need automatic Claude review"
|
55
|
+
fi
|
56
|
+
|
57
|
+
- name: Request Claude review
|
58
|
+
if: steps.needs_review.outputs.needs_review == 'true'
|
59
|
+
run: |
|
60
|
+
gh pr comment ${{ github.event.pull_request.number }} --body "@claude Please review this PR for code quality, security, and compatibility. If you find any issues:
|
61
|
+
|
62
|
+
1. **For fixable issues** (formatting, linting, small bugs): Please fix them directly by committing to this PR branch
|
63
|
+
2. **For larger issues**: Comment with specific feedback and create issues if needed
|
64
|
+
3. **If everything looks good**: Approve and merge the PR
|
65
|
+
|
66
|
+
You have full access to modify code, run tests, and ensure the PR meets our quality standards."
|
67
|
+
env:
|
68
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
@@ -9,6 +9,8 @@ on:
|
|
9
9
|
types: [opened, assigned]
|
10
10
|
pull_request_review:
|
11
11
|
types: [submitted]
|
12
|
+
pull_request:
|
13
|
+
types: [opened, synchronize, ready_for_review]
|
12
14
|
|
13
15
|
jobs:
|
14
16
|
claude:
|
@@ -16,18 +18,24 @@ jobs:
|
|
16
18
|
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
|
17
19
|
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
|
18
20
|
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
|
19
|
-
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
|
21
|
+
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) ||
|
22
|
+
(github.event_name == 'pull_request' && github.event.pull_request.draft == false)
|
20
23
|
runs-on: ubuntu-latest
|
21
24
|
permissions:
|
22
|
-
contents:
|
23
|
-
pull-requests:
|
24
|
-
issues:
|
25
|
+
contents: write
|
26
|
+
pull-requests: write
|
27
|
+
issues: write
|
25
28
|
id-token: write
|
29
|
+
actions: read
|
30
|
+
checks: read
|
31
|
+
statuses: read
|
32
|
+
repository-projects: read
|
26
33
|
steps:
|
27
34
|
- name: Checkout repository
|
28
35
|
uses: actions/checkout@v4
|
29
36
|
with:
|
30
|
-
fetch-depth:
|
37
|
+
fetch-depth: 0
|
38
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
31
39
|
|
32
40
|
- name: Run Claude Code
|
33
41
|
id: claude
|
@@ -10,7 +10,7 @@ jobs:
|
|
10
10
|
runs-on: ubuntu-latest
|
11
11
|
strategy:
|
12
12
|
matrix:
|
13
|
-
python-version: ["3.
|
13
|
+
python-version: ["3.12"]
|
14
14
|
|
15
15
|
steps:
|
16
16
|
- name: Checkout code
|
@@ -57,7 +57,6 @@ jobs:
|
|
57
57
|
|
58
58
|
- name: Upload coverage artifacts
|
59
59
|
uses: actions/upload-artifact@v4
|
60
|
-
if: matrix.python-version == '3.12'
|
61
60
|
with:
|
62
61
|
name: coverage-report
|
63
62
|
path: htmlcov/
|
@@ -2,7 +2,7 @@ name: Pull Request Checks
|
|
2
2
|
|
3
3
|
on:
|
4
4
|
pull_request:
|
5
|
-
branches: [develop]
|
5
|
+
branches: [develop, staging, main]
|
6
6
|
workflow_dispatch:
|
7
7
|
|
8
8
|
jobs:
|
@@ -10,7 +10,7 @@ jobs:
|
|
10
10
|
runs-on: ubuntu-latest
|
11
11
|
strategy:
|
12
12
|
matrix:
|
13
|
-
python-version: ["3.
|
13
|
+
python-version: ["3.12"]
|
14
14
|
|
15
15
|
steps:
|
16
16
|
- name: Checkout code
|
@@ -59,7 +59,6 @@ jobs:
|
|
59
59
|
|
60
60
|
- name: Upload coverage to Codecov
|
61
61
|
uses: codecov/codecov-action@v4
|
62
|
-
if: matrix.python-version == '3.12'
|
63
62
|
with:
|
64
63
|
file: ./coverage.xml
|
65
64
|
flags: unittests
|
@@ -131,7 +130,7 @@ jobs:
|
|
131
130
|
run: |
|
132
131
|
poetry run pyopenapi-gen --help
|
133
132
|
# Test basic generation
|
134
|
-
poetry run pyopenapi-gen
|
133
|
+
poetry run pyopenapi-gen input/minimal_swagger.json --project-root ./test_output --output-package test_client --force --no-postprocess
|
135
134
|
|
136
135
|
- name: Verify generated client structure
|
137
136
|
run: |
|
@@ -3,12 +3,11 @@ name: Publish to TestPyPI (pre-release)
|
|
3
3
|
on:
|
4
4
|
push:
|
5
5
|
branches: [main]
|
6
|
-
pull_request:
|
7
|
-
branches: [main]
|
8
6
|
|
9
7
|
jobs:
|
10
8
|
build-and-testpypi:
|
11
9
|
runs-on: ubuntu-latest
|
10
|
+
environment: staging
|
12
11
|
steps:
|
13
12
|
- uses: actions/checkout@v4
|
14
13
|
- name: Set up Python
|
@@ -37,20 +37,21 @@ pip-log.txt
|
|
37
37
|
pip-delete-this-directory.txt
|
38
38
|
|
39
39
|
# Unit test / coverage reports
|
40
|
-
htmlcov/
|
41
40
|
.tox/
|
42
41
|
.nox/
|
43
42
|
.coverage
|
44
43
|
.coverage.*
|
45
44
|
.cache
|
46
45
|
nosetests.xml
|
47
|
-
coverage.xml
|
48
46
|
*.cover
|
49
47
|
*.py,cover
|
50
48
|
.hypothesis/
|
51
49
|
.pytest_cache/
|
52
50
|
cover/
|
53
51
|
|
52
|
+
# Coverage reports folder
|
53
|
+
coverage_reports/
|
54
|
+
|
54
55
|
# Translations
|
55
56
|
*.mo
|
56
57
|
*.pot
|
@@ -184,4 +185,5 @@ output
|
|
184
185
|
output_*
|
185
186
|
**/.claude/settings.local.json
|
186
187
|
out
|
187
|
-
test_outputs
|
188
|
+
test_outputs
|
189
|
+
temp_test
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to PyOpenAPI Generator are documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
|
+
|
8
|
+
## [Unreleased]
|
9
|
+
|
10
|
+
## [0.8.4] - 2024-11-06
|
11
|
+
|
12
|
+
### Added
|
13
|
+
- Claude GitHub App automation for PR reviews and fixes
|
14
|
+
- Auto-review for all PRs targeting develop branch
|
15
|
+
- Professional-grade documentation overhaul with comprehensive README.md
|
16
|
+
- Detailed contributing guidelines in CONTRIBUTING.md
|
17
|
+
- Formal changelog protocol following Keep a Changelog format
|
18
|
+
- Documentation index in docs/README.md with navigation
|
19
|
+
- Universal Why→What→How documentation structure standards
|
20
|
+
|
21
|
+
### Changed
|
22
|
+
- TestPyPI workflow now uses staging environment for proper secret access
|
23
|
+
- Enhanced README.md with modern badges, better structure, and comprehensive examples
|
24
|
+
- Improved project metadata and documentation standards in pyproject.toml
|
25
|
+
- Updated architecture documentation to follow established standards
|
26
|
+
- Optimized CI workflow to eliminate duplicate test execution
|
27
|
+
|
28
|
+
### Fixed
|
29
|
+
- Claude.yml workflow validation errors (removed invalid metadata permission)
|
30
|
+
- TestPyPI publishing failures due to secret access issues
|
31
|
+
|
32
|
+
### Removed
|
33
|
+
- Unused Jinja2 dependency (project uses visitor pattern, not templates)
|
34
|
+
- Feature status promises to avoid implementation commitments
|
35
|
+
|
36
|
+
## [0.8.3] - 2024-11-06
|
37
|
+
|
38
|
+
### Changed
|
39
|
+
- Minor improvements and maintenance updates
|
40
|
+
|
41
|
+
## [0.8.1] - 2024-11-06
|
42
|
+
|
43
|
+
### Added
|
44
|
+
- Enhanced schema handling capabilities
|
45
|
+
- Minor improvements to code generation
|
46
|
+
|
47
|
+
### Changed
|
48
|
+
- Improved schema processing logic
|
49
|
+
|
50
|
+
## [0.8.0] - 2024-11-06
|
51
|
+
|
52
|
+
### Added
|
53
|
+
- ⭐ **NEW**: Unified type resolution system (`types/` package)
|
54
|
+
- Clean architecture with contracts, resolvers, and services
|
55
|
+
- Dependency injection with protocol-based design
|
56
|
+
- Comprehensive test coverage for type resolution
|
57
|
+
- Enterprise-grade developer experience improvements
|
58
|
+
- Unified architecture across all components
|
59
|
+
|
60
|
+
### Changed
|
61
|
+
- Major refactoring to use unified type resolution throughout codebase
|
62
|
+
- Enhanced code generation reliability and consistency
|
63
|
+
- Improved error handling and type safety
|
64
|
+
|
65
|
+
### Fixed
|
66
|
+
- All failing tests resolved with new architecture
|
67
|
+
- mypy import errors resolved with proper httpx dependency
|
68
|
+
|
69
|
+
### Technical Details
|
70
|
+
- Implemented unified type resolution system for consistent type handling
|
71
|
+
- Applied black formatting to all source files
|
72
|
+
- Enhanced testing coverage and reliability
|
73
|
+
|
74
|
+
## [0.7.x] - Previous Versions
|
75
|
+
|
76
|
+
### Added
|
77
|
+
- Core OpenAPI client generation functionality
|
78
|
+
- Async-first Python client architecture
|
79
|
+
- Advanced cycle detection for complex schemas
|
80
|
+
- Pluggable authentication system
|
81
|
+
- Smart pagination support
|
82
|
+
- Response unwrapping capabilities
|
83
|
+
- Tag-based operation organization
|
84
|
+
- Comprehensive error handling
|
85
|
+
- Self-contained client generation (zero runtime dependencies)
|
86
|
+
|
87
|
+
### Features Established
|
88
|
+
- Three-stage pipeline: Load → Visit → Emit
|
89
|
+
- Intermediate Representation (IR) for stable code generation
|
90
|
+
- Support for Python 3.10-3.12
|
91
|
+
- Integration with modern Python tooling (Black, Ruff, mypy)
|
92
|
+
- Comprehensive test suite with high coverage requirements
|
93
|
+
|
94
|
+
---
|
95
|
+
|
96
|
+
## Release Notes Format
|
97
|
+
|
98
|
+
Each release includes:
|
99
|
+
|
100
|
+
- **Added**: New features and capabilities
|
101
|
+
- **Changed**: Modifications to existing functionality
|
102
|
+
- **Deprecated**: Features marked for future removal
|
103
|
+
- **Removed**: Features that have been removed
|
104
|
+
- **Fixed**: Bug fixes and issue resolutions
|
105
|
+
- **Security**: Security vulnerability fixes
|
106
|
+
|
107
|
+
## Version History Links
|
108
|
+
|
109
|
+
- [Unreleased]: Compare against latest release
|
110
|
+
- [0.8.3]: https://github.com/your-org/pyopenapi-gen/releases/tag/v0.8.3
|
111
|
+
- [0.8.1]: https://github.com/your-org/pyopenapi-gen/releases/tag/v0.8.1
|
112
|
+
- [0.8.0]: https://github.com/your-org/pyopenapi-gen/releases/tag/v0.8.0
|
113
|
+
|
114
|
+
## Contributing to the Changelog
|
115
|
+
|
116
|
+
When contributing changes:
|
117
|
+
|
118
|
+
1. Add entries to the `[Unreleased]` section
|
119
|
+
2. Use the appropriate category (Added, Changed, Fixed, etc.)
|
120
|
+
3. Write clear, descriptive entries
|
121
|
+
4. Include issue/PR references when relevant
|
122
|
+
5. Follow the established format and tone
|
123
|
+
|
124
|
+
Example entry:
|
125
|
+
```markdown
|
126
|
+
### Added
|
127
|
+
- OAuth2 authentication support with refresh token handling (#123)
|
128
|
+
```
|
129
|
+
|
130
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for complete guidelines.
|
@@ -1,6 +1,41 @@
|
|
1
1
|
# CLAUDE.md
|
2
2
|
|
3
|
-
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) and the Claude GitHub App when working with code in this repository.
|
4
|
+
|
5
|
+
## Claude GitHub App Capabilities
|
6
|
+
|
7
|
+
The Claude GitHub App is configured with extensive permissions to independently operate on this repository:
|
8
|
+
|
9
|
+
### Automated PR Review & Fixes
|
10
|
+
- **Code Review**: Automatically triggered for dependabot PRs, version bumps, and documentation changes
|
11
|
+
- **Issue Fixing**: Can directly commit fixes to PR branches for:
|
12
|
+
- Formatting issues (Black, Ruff)
|
13
|
+
- Linting violations
|
14
|
+
- Type checking errors
|
15
|
+
- Security issues
|
16
|
+
- Small bugs and improvements
|
17
|
+
- **Quality Assurance**: Runs `make quality` and `make test` to ensure all changes meet standards
|
18
|
+
- **Merge Decisions**: Approves and merges PRs when all criteria are met
|
19
|
+
|
20
|
+
### Repository Management
|
21
|
+
- **Issue Creation**: Creates detailed issues for complex problems that need human attention
|
22
|
+
- **Branch Management**: Can work on feature branches and create new branches as needed
|
23
|
+
- **Release Management**: Assists with version bumps and changelog updates
|
24
|
+
- **Documentation**: Updates documentation to reflect code changes
|
25
|
+
|
26
|
+
### Permissions
|
27
|
+
The Claude GitHub App has the following permissions:
|
28
|
+
- `contents: write` - Modify files and commit changes
|
29
|
+
- `pull-requests: write` - Review, approve, and merge PRs
|
30
|
+
- `issues: write` - Create and manage issues
|
31
|
+
- `actions: read` - Monitor CI/CD status
|
32
|
+
- `checks: read` - Review test results
|
33
|
+
- `statuses: read` - Check status checks
|
34
|
+
|
35
|
+
### Triggering Claude Reviews
|
36
|
+
1. **Automatic**: PRs from dependabot, devops-mindhive (docs/release), or with `[claude-review]` tag
|
37
|
+
2. **Manual**: Comment `@claude` on any PR, issue, or review to request assistance
|
38
|
+
3. **On PR Events**: New PRs automatically get Claude attention for quality review
|
4
39
|
|
5
40
|
# PyOpenAPI Generator
|
6
41
|
|
@@ -391,7 +426,7 @@ Located in `core/parsing/unified_cycle_detection.py` with:
|
|
391
426
|
- **Formatting**: Black (120 char line length)
|
392
427
|
- **Linting**: Ruff for code quality and import sorting
|
393
428
|
- **Type Safety**: mypy strict mode with 100% coverage
|
394
|
-
- **Compatibility**: Python 3.
|
429
|
+
- **Compatibility**: Python 3.12+
|
395
430
|
|
396
431
|
### Testing Requirements
|
397
432
|
Follow cursor rules strictly:
|