pyopenapi-gen 0.21.0__tar.gz → 0.22.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pyopenapi-gen might be problematic. Click here for more details.

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