pyopenapi-gen 0.19.0__tar.gz → 0.20.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 (340) hide show
  1. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.gitignore +3 -1
  2. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/CHANGELOG.md +19 -0
  3. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/PKG-INFO +1 -1
  4. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/coverage.xml +26 -23
  5. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/pyproject.toml +2 -2
  6. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/__init__.py +1 -1
  7. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/utils.py +5 -0
  8. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_dataclass_serialization.py +194 -0
  9. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/end_to_end/test_dataclass_serialization_e2e.py +60 -49
  10. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.bandit +0 -0
  11. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.cursor/mcp.json +0 -0
  12. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.cursor/rules/architecture.mdc +0 -0
  13. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.cursor/rules/coding-conventions.mdc +0 -0
  14. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.cursor/rules/project-goal.mdc +0 -0
  15. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.cursor/rules/testing.mdc +0 -0
  16. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/BRANCH_PROTECTION.md +0 -0
  17. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/CLAUDE_CONFIGURATION.md +0 -0
  18. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/CODEOWNERS +0 -0
  19. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  21. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/dependabot.yml +0 -0
  22. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/ci.yml +0 -0
  23. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/claude-auto-approve.yml +0 -0
  24. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/claude-review-trigger.yml +0 -0
  25. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/claude.yml +0 -0
  26. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/pr-checks.yml +0 -0
  27. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/production-release.yml.backup +0 -0
  28. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/promote-to-staging.yml +0 -0
  29. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/semantic-release.yml +0 -0
  30. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/staging-publish.yml +0 -0
  31. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.github/workflows/testpypi-publish.yml +0 -0
  32. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.python-version +0 -0
  33. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/.vscode/settings.json +0 -0
  34. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/CLAUDE.md +0 -0
  35. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/CONTRIBUTING.md +0 -0
  36. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/LICENSE +0 -0
  37. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/Makefile +0 -0
  38. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/README.md +0 -0
  39. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/README.md +0 -0
  40. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/architecture.md +0 -0
  41. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/endpoint_visitor.md +0 -0
  42. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/helpers.md +0 -0
  43. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/ir_models.md +0 -0
  44. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/line_writer.md +0 -0
  45. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/loader.md +0 -0
  46. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/model_visitor.md +0 -0
  47. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/release-automation.md +0 -0
  48. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/render_context.md +0 -0
  49. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/docs/unified_type_resolution.md +0 -0
  50. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/input/business_swagger.json +0 -0
  51. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/input/minimal_swagger.json +0 -0
  52. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/input/minimal_syntax_test.json +0 -0
  53. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/input/test_name_collision_spec.json +0 -0
  54. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/mkdocs.yml +0 -0
  55. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/poetry.lock +0 -0
  56. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/scripts/sync_version_to_init.py +0 -0
  57. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/scripts/validate_version_sync.py +0 -0
  58. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/__main__.py +0 -0
  59. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/cli.py +0 -0
  60. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/CLAUDE.md +0 -0
  61. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/file_manager.py +0 -0
  62. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/import_collector.py +0 -0
  63. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/render_context.py +0 -0
  64. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/CLAUDE.md +0 -0
  65. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/__init__.py +0 -0
  66. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/auth/base.py +0 -0
  67. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/auth/plugins.py +0 -0
  68. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/exceptions.py +0 -0
  69. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/http_status_codes.py +0 -0
  70. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/http_transport.py +0 -0
  71. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/__init__.py +0 -0
  72. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/loader.py +0 -0
  73. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/__init__.py +0 -0
  74. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/parser.py +0 -0
  75. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/post_processor.py +0 -0
  76. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/request_body.py +0 -0
  77. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/parameters/__init__.py +0 -0
  78. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/parameters/parser.py +0 -0
  79. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/responses/__init__.py +0 -0
  80. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/responses/parser.py +0 -0
  81. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/schemas/__init__.py +0 -0
  82. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/schemas/extractor.py +0 -0
  83. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/pagination.py +0 -0
  84. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/__init__.py +0 -0
  85. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/__init__.py +0 -0
  86. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py +0 -0
  87. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py +0 -0
  88. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py +0 -0
  89. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py +0 -0
  90. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/existing_schema.py +0 -0
  91. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py +0 -0
  92. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py +0 -0
  93. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py +0 -0
  94. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py +0 -0
  95. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py +0 -0
  96. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/type_parser.py +0 -0
  97. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/context.py +0 -0
  98. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/cycle_helpers.py +0 -0
  99. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/__init__.py +0 -0
  100. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/all_of_parser.py +0 -0
  101. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/any_of_parser.py +0 -0
  102. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/array_items_parser.py +0 -0
  103. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/one_of_parser.py +0 -0
  104. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/properties_parser.py +0 -0
  105. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/schema_finalizer.py +0 -0
  106. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/schema_parser.py +0 -0
  107. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/transformers/__init__.py +0 -0
  108. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +0 -0
  109. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py +0 -0
  110. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/unified_cycle_detection.py +0 -0
  111. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/postprocess_manager.py +0 -0
  112. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/schemas.py +0 -0
  113. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/streaming_helpers.py +0 -0
  114. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/telemetry.py +0 -0
  115. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/warning_collector.py +0 -0
  116. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/code_writer.py +0 -0
  117. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/documentation_writer.py +0 -0
  118. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/line_writer.py +0 -0
  119. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/python_construct_renderer.py +0 -0
  120. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core_package_template/README.md +0 -0
  121. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emit/models_emitter.py +0 -0
  122. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/CLAUDE.md +0 -0
  123. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/client_emitter.py +0 -0
  124. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/core_emitter.py +0 -0
  125. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/docs_emitter.py +0 -0
  126. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/endpoints_emitter.py +0 -0
  127. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/exceptions_emitter.py +0 -0
  128. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/models_emitter.py +0 -0
  129. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/generator/CLAUDE.md +0 -0
  130. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/generator/client_generator.py +0 -0
  131. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/CLAUDE.md +0 -0
  132. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/__init__.py +0 -0
  133. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/endpoint_utils.py +0 -0
  134. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_cleaner.py +0 -0
  135. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_helper.py +0 -0
  136. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/__init__.py +0 -0
  137. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/array_resolver.py +0 -0
  138. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/composition_resolver.py +0 -0
  139. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/finalizer.py +0 -0
  140. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/named_resolver.py +0 -0
  141. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/object_resolver.py +0 -0
  142. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/primitive_resolver.py +0 -0
  143. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/resolver.py +0 -0
  144. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/url_utils.py +0 -0
  145. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/http_types.py +0 -0
  146. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/ir.py +0 -0
  147. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/py.typed +0 -0
  148. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/CLAUDE.md +0 -0
  149. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/__init__.py +0 -0
  150. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/contracts/__init__.py +0 -0
  151. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/contracts/protocols.py +0 -0
  152. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/contracts/types.py +0 -0
  153. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/__init__.py +0 -0
  154. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/reference_resolver.py +0 -0
  155. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/response_resolver.py +0 -0
  156. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/schema_resolver.py +0 -0
  157. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/services/__init__.py +0 -0
  158. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/services/type_service.py +0 -0
  159. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/strategies/__init__.py +0 -0
  160. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/strategies/response_strategy.py +0 -0
  161. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/CLAUDE.md +0 -0
  162. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/client_visitor.py +0 -0
  163. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/docs_visitor.py +0 -0
  164. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/__init__.py +0 -0
  165. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +0 -0
  166. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/__init__.py +0 -0
  167. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +0 -0
  168. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py +0 -0
  169. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/overload_generator.py +0 -0
  170. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/request_generator.py +0 -0
  171. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +0 -0
  172. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/signature_generator.py +0 -0
  173. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/url_args_generator.py +0 -0
  174. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/processors/__init__.py +0 -0
  175. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/processors/import_analyzer.py +0 -0
  176. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +0 -0
  177. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/exception_visitor.py +0 -0
  178. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/__init__.py +0 -0
  179. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/alias_generator.py +0 -0
  180. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/dataclass_generator.py +0 -0
  181. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/enum_generator.py +0 -0
  182. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/model_visitor.py +0 -0
  183. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/visitor.py +0 -0
  184. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/__init__.py +0 -0
  185. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/api/test_programmatic_api.py +0 -0
  186. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/auth/auth_analysis.md +0 -0
  187. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/auth/test_auth_base.py +0 -0
  188. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/auth/test_auth_plugins.py +0 -0
  189. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/cli/cli_analysis.md +0 -0
  190. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_backup_diff.py +0 -0
  191. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_edge_cases.py +0 -0
  192. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_edge_cases_comprehensive.py +0 -0
  193. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_internal_utils.py +0 -0
  194. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/cli/test_http_pagination_cli.py +0 -0
  195. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/context_analysis.md +0 -0
  196. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/test_core_import_path.py +0 -0
  197. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/test_file_manager.py +0 -0
  198. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/test_import_collector.py +0 -0
  199. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/test_render_context.py +0 -0
  200. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/test_render_context_imports.py +0 -0
  201. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/context/test_render_context_relative_paths.py +0 -0
  202. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/core_analysis.md +0 -0
  203. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/loader/parameters/test_inline_enum_array_params.py +0 -0
  204. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/loader/test_extractor.py +0 -0
  205. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/loader/test_top_level_enum_extraction.py +0 -0
  206. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/helpers_analysis.md +0 -0
  207. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_cyclic_properties.py +0 -0
  208. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_direct_cycle.py +0 -0
  209. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_existing_schema.py +0 -0
  210. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_list_response.py +0 -0
  211. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_missing_ref.py +0 -0
  212. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_new_schema.py +0 -0
  213. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_stripped_suffix.py +0 -0
  214. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/__init__.py +0 -0
  215. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/keywords_analysis.md +0 -0
  216. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_all_of_parser.py +0 -0
  217. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_any_of_parser.py +0 -0
  218. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_array_items_parser.py +0 -0
  219. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_one_of_parser.py +0 -0
  220. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_properties_parser.py +0 -0
  221. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/parsing_analysis.md +0 -0
  222. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_context.py +0 -0
  223. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_cycle_detection.py +0 -0
  224. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_cycle_helpers.py +0 -0
  225. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_improved_schema_naming.py +0 -0
  226. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_inline_enum_extractor.py +0 -0
  227. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_inline_object_promoter.py +0 -0
  228. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_logging.py +0 -0
  229. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_ref_resolver.py +0 -0
  230. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_schema_finalizer.py +0 -0
  231. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_schema_parser.py +0 -0
  232. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_schema_parser_list_response.py +0 -0
  233. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_type_parser.py +0 -0
  234. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_detect_circular_imports.py +0 -0
  235. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_edge_cases_integration.py +0 -0
  236. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_edge_cases_systematic.py +0 -0
  237. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_exceptions_module.py +0 -0
  238. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_forward_references.py +0 -0
  239. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_http_transport.py +0 -0
  240. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_import_resolution.py +0 -0
  241. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_ir.py +0 -0
  242. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_ir_schema.py +0 -0
  243. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader.py +0 -0
  244. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_extensive.py +0 -0
  245. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_invalid_refs.py +0 -0
  246. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_malformed.py +0 -0
  247. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_media_types.py +0 -0
  248. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_pagination.py +0 -0
  249. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_parsing_context.py +0 -0
  250. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_protocol_defaults.py +0 -0
  251. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_schema_parser_specific_case.py +0 -0
  252. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_schemas.py +0 -0
  253. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_simple_self_ref_check.py +0 -0
  254. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_streaming_helpers.py +0 -0
  255. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_telemetry.py +0 -0
  256. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_telemetry_client.py +0 -0
  257. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_utils.py +0 -0
  258. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/test_warning_collector.py +0 -0
  259. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_code_writer.py +0 -0
  260. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_documentation_writer.py +0 -0
  261. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_line_writer.py +0 -0
  262. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_python_construct_renderer_json_wizard.py +0 -0
  263. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/core/writers/writers_analysis.md +0 -0
  264. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/emitters_analysis.md +0 -0
  265. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_client_emitter.py +0 -0
  266. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_docs_emitter.py +0 -0
  267. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_duplicate_operations.py +0 -0
  268. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_endpoints_emitter.py +0 -0
  269. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_exceptions_emitter.py +0 -0
  270. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_list_response_generation.py +0 -0
  271. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_models_emitter.py +0 -0
  272. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/examples/test_developer_experience_demo.py +0 -0
  273. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/generation/generation_analysis.md +0 -0
  274. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/generation/test_external_core_package.py +0 -0
  275. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/specs/minimal_addmessage_like.json +0 -0
  276. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/test_addmessage_like_issues.py +0 -0
  277. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/test_agent_include_parameter_typing.py +0 -0
  278. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/test_message_batch_response_issue.py +0 -0
  279. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/helpers_analysis.md +0 -0
  280. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_array_resolver.py +0 -0
  281. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_endpoint_utils.py +0 -0
  282. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_endpoint_utils_extended.py +0 -0
  283. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_get_endpoint_return_types.py +0 -0
  284. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_named_resolver.py +0 -0
  285. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_named_type_resolver.py +0 -0
  286. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_object_resolver.py +0 -0
  287. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_put_endpoint_return_types.py +0 -0
  288. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_type_cleaner.py +0 -0
  289. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_type_helper.py +0 -0
  290. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_url_utils.py +0 -0
  291. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_utils_helpers.py +0 -0
  292. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/integration/test_generated_code_structure.py +0 -0
  293. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/integrations/integrations_analysis.md +0 -0
  294. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_business_swagger_message_type.py +0 -0
  295. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_end_to_end_business_swagger.py +0 -0
  296. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_end_to_end_petstore.py +0 -0
  297. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_name_collisions.py +0 -0
  298. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/specs/response_unwrapping_spec.yaml +0 -0
  299. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/test_analysis_overview.md +0 -0
  300. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/test_init.py +0 -0
  301. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/__init__.py +0 -0
  302. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_business_swagger_integration.py +0 -0
  303. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_contracts_types.py +0 -0
  304. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_missing_imports_bug.py +0 -0
  305. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_reference_resolver.py +0 -0
  306. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_response_resolver.py +0 -0
  307. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_response_strategy.py +0 -0
  308. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_response_strategy_simplified.py +0 -0
  309. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_schema_resolver.py +0 -0
  310. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_schema_resolver_enums.py +0 -0
  311. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/types/test_type_service.py +0 -0
  312. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/__init__.py +0 -0
  313. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/__init__.py +0 -0
  314. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/__init__.py +0 -0
  315. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/generators_analysis.md +0 -0
  316. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_dataclass_integration.py +0 -0
  317. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_docstring_generator.py +0 -0
  318. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_endpoint_method_generator.py +0 -0
  319. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_match_case_response.py +0 -0
  320. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_overload_generator.py +0 -0
  321. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_request_generator.py +0 -0
  322. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_response_handler_generator.py +0 -0
  323. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_response_handler_generator_strategy.py +0 -0
  324. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_signature_generator.py +0 -0
  325. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_url_args_generator.py +0 -0
  326. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/__init__.py +0 -0
  327. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/test_import_analyzer.py +0 -0
  328. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/test_import_analyzer.py.bak +0 -0
  329. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/test_parameter_processor.py +0 -0
  330. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/test_endpoint_visitor.py +0 -0
  331. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/__init__.py +0 -0
  332. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_alias_generator.py +0 -0
  333. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_dataclass_generator.py +0 -0
  334. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_dataclass_generator_json_wizard.py +0 -0
  335. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_enum_generator.py +0 -0
  336. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_json_value_integration.py +0 -0
  337. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_json_value_wrapper.py +0 -0
  338. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/test_client_visitor.py +0 -0
  339. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/test_model_visitor.py +0 -0
  340. {pyopenapi_gen-0.19.0 → pyopenapi_gen-0.20.0}/tests/visit/test_visitor.py +0 -0
@@ -199,4 +199,6 @@ agent-plan.json
199
199
 
200
200
  # Bug reports and analysis documents (keep in _process/ folder)
201
201
  *-bug-report.md
202
- *-analysis.md
202
+ *-analysis.md
203
+
204
+ coverage.json
@@ -1,6 +1,25 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v0.20.0 (2025-10-19)
5
+
6
+ ### Bug Fixes
7
+
8
+ - **serializer**: Handle enum instances in DataclassSerializer serialization
9
+ ([`7eaf8ed`](https://github.com/mindhiveoy/pyopenapi_gen/commit/7eaf8ed07e6b975ecd33ec0c3a6e642f2f23e205))
10
+
11
+ ### Chores
12
+
13
+ - **release**: Sync __init__.py version [skip ci]
14
+ ([`53c6163`](https://github.com/mindhiveoy/pyopenapi_gen/commit/53c6163b7c536ee17b6bb3a5fb631ed1900a4520))
15
+
16
+ ### Features
17
+
18
+ - **tests**: Add comprehensive tests for DataclassSerializer with enum support and nested
19
+ dataclasses
20
+ ([`21de6af`](https://github.com/mindhiveoy/pyopenapi_gen/commit/21de6af2fdd33de6212863cc645ed426c6b1cd72))
21
+
22
+
4
23
  ## v0.19.0 (2025-10-18)
5
24
 
6
25
  ### Chores
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyopenapi-gen
3
- Version: 0.19.0
3
+ Version: 0.20.0
4
4
  Summary: Modern, async-first Python client generator for OpenAPI specifications with advanced cycle detection and unified type resolution
5
5
  Project-URL: Homepage, https://github.com/your-org/pyopenapi-gen
6
6
  Project-URL: Documentation, https://github.com/your-org/pyopenapi-gen/blob/main/README.md
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" ?>
2
- <coverage version="7.10.7" timestamp="1760800055874" lines-valid="6502" lines-covered="5747" line-rate="0.8839" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
2
+ <coverage version="7.10.7" timestamp="1760875420300" lines-valid="6505" lines-covered="5750" line-rate="0.8839" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
3
3
  <!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.10.7 -->
4
4
  <!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
5
5
  <sources>
@@ -652,7 +652,7 @@
652
652
  </class>
653
653
  </classes>
654
654
  </package>
655
- <package name="pyopenapi_gen.core" line-rate="0.8318" branch-rate="0" complexity="0">
655
+ <package name="pyopenapi_gen.core" line-rate="0.8327" branch-rate="0" complexity="0">
656
656
  <classes>
657
657
  <class name="__init__.py" filename="pyopenapi_gen/core/__init__.py" complexity="0" line-rate="1" branch-rate="0">
658
658
  <methods/>
@@ -1053,7 +1053,7 @@
1053
1053
  <line number="69" hits="1"/>
1054
1054
  </lines>
1055
1055
  </class>
1056
- <class name="utils.py" filename="pyopenapi_gen/core/utils.py" complexity="0" line-rate="0.9341" branch-rate="0">
1056
+ <class name="utils.py" filename="pyopenapi_gen/core/utils.py" complexity="0" line-rate="0.9353" branch-rate="0">
1057
1057
  <methods/>
1058
1058
  <lines>
1059
1059
  <line number="6" hits="1"/>
@@ -1176,53 +1176,56 @@
1176
1176
  <line number="339" hits="1"/>
1177
1177
  <line number="341" hits="1"/>
1178
1178
  <line number="342" hits="1"/>
1179
- <line number="346" hits="1"/>
1179
+ <line number="344" hits="1"/>
1180
1180
  <line number="347" hits="1"/>
1181
- <line number="350" hits="1"/>
1181
+ <line number="348" hits="1"/>
1182
1182
  <line number="351" hits="1"/>
1183
- <line number="353" hits="1"/>
1183
+ <line number="352" hits="1"/>
1184
1184
  <line number="354" hits="1"/>
1185
- <line number="355" hits="0"/>
1186
- <line number="358" hits="1"/>
1185
+ <line number="355" hits="1"/>
1186
+ <line number="356" hits="0"/>
1187
1187
  <line number="359" hits="1"/>
1188
- <line number="362" hits="1"/>
1188
+ <line number="360" hits="1"/>
1189
1189
  <line number="363" hits="1"/>
1190
1190
  <line number="364" hits="1"/>
1191
- <line number="365" hits="1"/>
1192
- <line number="366" hits="1"/>
1193
1191
  <line number="367" hits="1"/>
1192
+ <line number="368" hits="1"/>
1194
1193
  <line number="369" hits="1"/>
1195
1194
  <line number="370" hits="1"/>
1196
1195
  <line number="371" hits="1"/>
1197
1196
  <line number="372" hits="1"/>
1198
- <line number="373" hits="1"/>
1197
+ <line number="374" hits="1"/>
1199
1198
  <line number="375" hits="1"/>
1199
+ <line number="376" hits="1"/>
1200
+ <line number="377" hits="1"/>
1200
1201
  <line number="378" hits="1"/>
1201
- <line number="379" hits="1"/>
1202
- <line number="382" hits="1"/>
1202
+ <line number="380" hits="1"/>
1203
1203
  <line number="383" hits="1"/>
1204
1204
  <line number="384" hits="1"/>
1205
- <line number="385" hits="1"/>
1206
- <line number="386" hits="1"/>
1207
1205
  <line number="387" hits="1"/>
1208
1206
  <line number="388" hits="1"/>
1207
+ <line number="389" hits="1"/>
1208
+ <line number="390" hits="1"/>
1209
1209
  <line number="391" hits="1"/>
1210
1210
  <line number="392" hits="1"/>
1211
- <line number="395" hits="1"/>
1211
+ <line number="393" hits="1"/>
1212
+ <line number="396" hits="1"/>
1212
1213
  <line number="397" hits="1"/>
1213
- <line number="398" hits="1"/>
1214
- <line number="399" hits="1"/>
1215
1214
  <line number="400" hits="1"/>
1216
- <line number="401" hits="1"/>
1217
1215
  <line number="402" hits="1"/>
1218
1216
  <line number="403" hits="1"/>
1219
1217
  <line number="404" hits="1"/>
1220
1218
  <line number="405" hits="1"/>
1221
1219
  <line number="406" hits="1"/>
1220
+ <line number="407" hits="1"/>
1222
1221
  <line number="408" hits="1"/>
1223
- <line number="411" hits="0"/>
1224
- <line number="412" hits="0"/>
1225
- <line number="414" hits="0"/>
1222
+ <line number="409" hits="1"/>
1223
+ <line number="410" hits="1"/>
1224
+ <line number="411" hits="1"/>
1225
+ <line number="413" hits="1"/>
1226
+ <line number="416" hits="0"/>
1227
+ <line number="417" hits="0"/>
1228
+ <line number="419" hits="0"/>
1226
1229
  </lines>
1227
1230
  </class>
1228
1231
  <class name="warning_collector.py" filename="pyopenapi_gen/core/warning_collector.py" complexity="0" line-rate="1" branch-rate="0">
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pyopenapi-gen"
7
- version = "0.19.0"
7
+ version = "0.20.0"
8
8
  description = "Modern, async-first Python client generator for OpenAPI specifications with advanced cycle detection and unified type resolution"
9
9
  authors = [{ name = "Mindhive Oy", email = "contact@mindhive.fi" }]
10
10
  maintainers = [{ name = "Ville Venäläinen | Mindhive Oy", email = "ville@mindhive.fi" }]
@@ -140,7 +140,7 @@ pyopenapi-gen = "pyopenapi_gen.cli:app"
140
140
 
141
141
  [tool.commitizen]
142
142
  name = "cz_conventional_commits"
143
- version = "0.19.0"
143
+ version = "0.20.0"
144
144
  version_files = [
145
145
  "pyproject.toml:version",
146
146
  "src/pyopenapi_gen/__init__.py:__version__"
@@ -50,7 +50,7 @@ __all__ = [
50
50
  ]
51
51
 
52
52
  # Semantic version of the generator core – automatically managed by semantic-release.
53
- __version__: str = "0.19.0"
53
+ __version__: str = "0.20.0"
54
54
 
55
55
  # ---------------------------------------------------------------------------
56
56
  # Lazy-loading and autocompletion support (This part remains)
@@ -341,6 +341,7 @@ class DataclassSerializer:
341
341
  @staticmethod
342
342
  def _serialize_with_tracking(obj: Any, visited: Set[int]) -> Any:
343
343
  """Internal serialization method with circular reference tracking."""
344
+ from enum import Enum
344
345
 
345
346
  # Handle None values by excluding them
346
347
  if obj is None:
@@ -358,6 +359,10 @@ class DataclassSerializer:
358
359
  if isinstance(obj, datetime):
359
360
  return obj.isoformat()
360
361
 
362
+ # Handle enum instances
363
+ if isinstance(obj, Enum) and not isinstance(obj, type):
364
+ return obj.value
365
+
361
366
  # Handle dataclass instances
362
367
  if dataclasses.is_dataclass(obj) and not isinstance(obj, type):
363
368
  visited.add(obj_id)
@@ -9,6 +9,7 @@ converted to dictionaries before being sent in HTTP requests.
9
9
 
10
10
  import dataclasses
11
11
  from datetime import datetime
12
+ from enum import Enum
12
13
  from typing import Any, List, Optional
13
14
 
14
15
  import pytest
@@ -53,6 +54,42 @@ class ComplexData:
53
54
  optional_field: str | None = None
54
55
 
55
56
 
57
+ class Status(Enum):
58
+ """Status enum for testing."""
59
+
60
+ PENDING = "pending"
61
+ ACTIVE = "active"
62
+ INACTIVE = "inactive"
63
+ COMPLETED = "completed"
64
+
65
+
66
+ class Priority(Enum):
67
+ """Priority enum with integer values for testing."""
68
+
69
+ LOW = 1
70
+ MEDIUM = 2
71
+ HIGH = 3
72
+ CRITICAL = 4
73
+
74
+
75
+ @dataclasses.dataclass
76
+ class Task:
77
+ """Task dataclass with enum fields for testing."""
78
+
79
+ title: str
80
+ status: Status
81
+ priority: Priority
82
+
83
+
84
+ @dataclasses.dataclass
85
+ class Project:
86
+ """Project dataclass with nested enum-containing dataclass for testing."""
87
+
88
+ name: str
89
+ main_task: Task
90
+ backup_status: Status | None = None
91
+
92
+
56
93
  class TestDataclassSerializer:
57
94
  """Test the DataclassSerializer utility that should be added to core.utils."""
58
95
 
@@ -229,6 +266,163 @@ class TestDataclassSerializer:
229
266
  assert result == {}
230
267
  assert isinstance(result, dict)
231
268
 
269
+ def test_serialize_enum_string_value__converts_to_value__returns_string(self) -> None:
270
+ """
271
+ Scenario: Serialize an enum instance with string value
272
+ Expected Outcome: Returns the enum's underlying value (string)
273
+ """
274
+ # Arrange
275
+ status = Status.ACTIVE
276
+
277
+ # Act
278
+ result = DataclassSerializer.serialize(status)
279
+
280
+ # Assert
281
+ assert result == "active"
282
+ assert isinstance(result, str)
283
+
284
+ def test_serialize_enum_integer_value__converts_to_value__returns_integer(self) -> None:
285
+ """
286
+ Scenario: Serialize an enum instance with integer value
287
+ Expected Outcome: Returns the enum's underlying value (integer)
288
+ """
289
+ # Arrange
290
+ priority = Priority.HIGH
291
+
292
+ # Act
293
+ result = DataclassSerializer.serialize(priority)
294
+
295
+ # Assert
296
+ assert result == 3
297
+ assert isinstance(result, int)
298
+
299
+ def test_serialize_dataclass_with_enum_fields__converts_enums_to_values__returns_proper_dict(self) -> None:
300
+ """
301
+ Scenario: Serialize a dataclass containing enum fields
302
+ Expected Outcome: Enum fields are converted to their underlying values
303
+ """
304
+ # Arrange
305
+ task = Task(title="Implement feature", status=Status.ACTIVE, priority=Priority.HIGH)
306
+
307
+ # Act
308
+ result = DataclassSerializer.serialize(task)
309
+
310
+ # Assert
311
+ expected = {"title": "Implement feature", "status": "active", "priority": 3}
312
+ assert result == expected
313
+
314
+ def test_serialize_nested_dataclass_with_enums__converts_recursively__returns_proper_structure(self) -> None:
315
+ """
316
+ Scenario: Serialize nested dataclasses containing enum fields
317
+ Expected Outcome: All enum fields at all nesting levels are converted to values
318
+ """
319
+ # Arrange
320
+ task = Task(title="Main task", status=Status.COMPLETED, priority=Priority.CRITICAL)
321
+ project = Project(name="API Project", main_task=task, backup_status=Status.PENDING)
322
+
323
+ # Act
324
+ result = DataclassSerializer.serialize(project)
325
+
326
+ # Assert
327
+ expected = {
328
+ "name": "API Project",
329
+ "main_task": {"title": "Main task", "status": "completed", "priority": 4},
330
+ "backup_status": "pending",
331
+ }
332
+ assert result == expected
333
+
334
+ def test_serialize_list_with_enum_values__converts_all_enums__returns_list_of_values(self) -> None:
335
+ """
336
+ Scenario: Serialize a list containing enum instances
337
+ Expected Outcome: Each enum in the list is converted to its underlying value
338
+ """
339
+ # Arrange
340
+ statuses = [Status.PENDING, Status.ACTIVE, Status.COMPLETED]
341
+
342
+ # Act
343
+ result = DataclassSerializer.serialize(statuses)
344
+
345
+ # Assert
346
+ expected = ["pending", "active", "completed"]
347
+ assert result == expected
348
+
349
+ def test_serialize_dict_with_enum_values__converts_enum_values__preserves_keys(self) -> None:
350
+ """
351
+ Scenario: Serialize a dictionary with enum values
352
+ Expected Outcome: Enum values are converted while dictionary keys are preserved
353
+ """
354
+ # Arrange
355
+ status_map = {"current": Status.ACTIVE, "previous": Status.PENDING, "target": Status.COMPLETED}
356
+
357
+ # Act
358
+ result = DataclassSerializer.serialize(status_map)
359
+
360
+ # Assert
361
+ expected = {"current": "active", "previous": "pending", "target": "completed"}
362
+ assert result == expected
363
+
364
+ def test_serialize_dataclass_with_optional_enum_none__excludes_none_value__returns_clean_dict(self) -> None:
365
+ """
366
+ Scenario: Serialize a dataclass with optional enum field set to None
367
+ Expected Outcome: None enum field is excluded from the result
368
+ """
369
+ # Arrange
370
+ task = Task(title="Simple task", status=Status.PENDING, priority=Priority.LOW)
371
+ project = Project(name="Simple project", main_task=task) # backup_status is None
372
+
373
+ # Act
374
+ result = DataclassSerializer.serialize(project)
375
+
376
+ # Assert
377
+ expected = {
378
+ "name": "Simple project",
379
+ "main_task": {"title": "Simple task", "status": "pending", "priority": 1},
380
+ }
381
+ assert result == expected
382
+ assert "backup_status" not in result
383
+
384
+ def test_serialize_mixed_dataclass_with_enums_and_complex_types__handles_all_types__returns_complete_dict(
385
+ self,
386
+ ) -> None:
387
+ """
388
+ Scenario: Serialize a dataclass containing enums, dates, lists, and nested structures
389
+ Expected Outcome: All types including enums are properly serialized
390
+ """
391
+
392
+ # Arrange
393
+ @dataclasses.dataclass
394
+ class ComplexTask:
395
+ title: str
396
+ status: Status
397
+ priority: Priority
398
+ created_at: datetime
399
+ tags: List[str]
400
+ metadata: dict[str, Any]
401
+
402
+ created_at = datetime(2023, 6, 15, 9, 30, 0)
403
+ task = ComplexTask(
404
+ title="Complex task",
405
+ status=Status.ACTIVE,
406
+ priority=Priority.HIGH,
407
+ created_at=created_at,
408
+ tags=["urgent", "api"],
409
+ metadata={"version": "2.0", "retries": 3},
410
+ )
411
+
412
+ # Act
413
+ result = DataclassSerializer.serialize(task)
414
+
415
+ # Assert
416
+ expected = {
417
+ "title": "Complex task",
418
+ "status": "active",
419
+ "priority": 3,
420
+ "created_at": "2023-06-15T09:30:00",
421
+ "tags": ["urgent", "api"],
422
+ "metadata": {"version": "2.0", "retries": 3},
423
+ }
424
+ assert result == expected
425
+
232
426
 
233
427
  class TestGeneratedClientDataclassIntegration:
234
428
  """Test that generated client code properly integrates dataclass serialization."""
@@ -7,11 +7,9 @@ Expected Outcome: Generated endpoint methods include DataclassSerializer calls
7
7
  and proper imports for seamless dataclass handling.
8
8
  """
9
9
 
10
- from unittest.mock import MagicMock
11
-
12
10
  from pyopenapi_gen.context.render_context import RenderContext
13
11
  from pyopenapi_gen.http_types import HTTPMethod
14
- from pyopenapi_gen.ir import IROperation, IRRequestBody, IRSchema
12
+ from pyopenapi_gen.ir import IROperation, IRRequestBody, IRResponse, IRSchema
15
13
  from pyopenapi_gen.visit.endpoint.generators.endpoint_method_generator import EndpointMethodGenerator
16
14
 
17
15
 
@@ -20,10 +18,15 @@ class TestDataclassSerializationEndToEnd:
20
18
 
21
19
  def test_generate_endpoint_with_json_body__includes_serializer__complete_method(self) -> None:
22
20
  """
23
- Scenario: Generate complete endpoint method with JSON body parameter
21
+ Scenario: Generate complete endpoint method with JSON body parameter using real RenderContext
24
22
  Expected Outcome: Generated code includes DataclassSerializer import and usage
25
23
  """
26
- # Arrange
24
+ # Arrange - Use real RenderContext instead of mocks
25
+ context = RenderContext(
26
+ output_package_name="test_package",
27
+ core_package_name="test_package.core",
28
+ )
29
+
27
30
  operation = IROperation(
28
31
  operation_id="create_user",
29
32
  summary="Create a new user",
@@ -37,27 +40,28 @@ class TestDataclassSerializationEndToEnd:
37
40
  content={"application/json": IRSchema(type="CreateUserRequest", description="User creation data")},
38
41
  required=True,
39
42
  ),
40
- responses=[],
43
+ responses=[
44
+ IRResponse(
45
+ status_code="201",
46
+ description="User created",
47
+ content={"application/json": IRSchema(type="User", description="Created user")},
48
+ )
49
+ ],
41
50
  )
42
51
 
43
- # Mock render context
44
- context = MagicMock(spec=RenderContext)
45
- context.core_package_name = "test_core"
46
- context.add_import = MagicMock()
47
- context.add_typing_imports_for_type = MagicMock()
48
-
49
52
  # Create generator
50
53
  generator = EndpointMethodGenerator()
51
54
 
52
- # Act
55
+ # Act - Generate code with real context
53
56
  generated_code = generator.generate(operation, context)
54
57
 
55
- # Assert
56
- # Check that the generated code includes DataclassSerializer
57
- assert "DataclassSerializer.serialize" in generated_code
58
+ # Assert - Validate generated code structure
59
+ assert "DataclassSerializer.serialize" in generated_code, "Should include DataclassSerializer usage"
58
60
 
59
- # Check that the import was added
60
- context.add_import.assert_any_call("test_core.utils", "DataclassSerializer")
61
+ # Verify import was registered in real context
62
+ imports = context.import_collector.imports
63
+ serializer_import_found = "DataclassSerializer" in imports.get("test_package.core.utils", set())
64
+ assert serializer_import_found, "DataclassSerializer import should be registered"
61
65
 
62
66
  # Check that the generated code structure is correct
63
67
  assert "async def create_user" in generated_code
@@ -75,10 +79,15 @@ class TestDataclassSerializationEndToEnd:
75
79
 
76
80
  def test_generate_endpoint_without_body__no_serializer__clean_method(self) -> None:
77
81
  """
78
- Scenario: Generate endpoint method without body parameter (GET request)
82
+ Scenario: Generate endpoint method without body parameter (GET request) using real RenderContext
79
83
  Expected Outcome: Generated code does not include DataclassSerializer
80
84
  """
81
- # Arrange
85
+ # Arrange - Use real RenderContext instead of mocks
86
+ context = RenderContext(
87
+ output_package_name="test_package",
88
+ core_package_name="test_package.core",
89
+ )
90
+
82
91
  operation = IROperation(
83
92
  operation_id="get_users",
84
93
  summary="Get all users",
@@ -88,31 +97,28 @@ class TestDataclassSerializationEndToEnd:
88
97
  tags=["users"],
89
98
  parameters=[],
90
99
  request_body=None,
91
- responses=[],
100
+ responses=[
101
+ IRResponse(
102
+ status_code="200",
103
+ description="Success",
104
+ content={"application/json": IRSchema(type="list[User]", description="List of users")},
105
+ )
106
+ ],
92
107
  )
93
108
 
94
- # Mock render context
95
- context = MagicMock(spec=RenderContext)
96
- context.core_package_name = "test_core"
97
- context.add_import = MagicMock()
98
- context.add_typing_imports_for_type = MagicMock()
99
-
100
109
  # Create generator
101
110
  generator = EndpointMethodGenerator()
102
111
 
103
- # Act
112
+ # Act - Generate code with real context
104
113
  generated_code = generator.generate(operation, context)
105
114
 
106
- # Assert
107
- # Check that the generated code does NOT include DataclassSerializer
108
- assert "DataclassSerializer" not in generated_code
115
+ # Assert - Validate generated code does NOT include serializer
116
+ assert "DataclassSerializer" not in generated_code, "GET requests should not use DataclassSerializer"
109
117
 
110
- # Check that the import was NOT added
111
- import_calls = context.add_import.call_args_list
112
- serializer_imports = [
113
- call for call in import_calls if len(call[0]) >= 2 and "DataclassSerializer" in str(call[0][1])
114
- ]
115
- assert len(serializer_imports) == 0, "DataclassSerializer should not be imported for bodyless requests"
118
+ # Verify import was NOT registered in real context
119
+ imports = context.import_collector.imports
120
+ serializer_import_found = any("DataclassSerializer" in module_imports for module_imports in imports.values())
121
+ assert not serializer_import_found, "DataclassSerializer should not be imported for bodyless requests"
116
122
 
117
123
  # Check basic structure
118
124
  assert "async def get_users" in generated_code
@@ -120,10 +126,15 @@ class TestDataclassSerializationEndToEnd:
120
126
 
121
127
  def test_generated_code_formatting__preserves_style__clean_output(self) -> None:
122
128
  """
123
- Scenario: Verify that generated code with DataclassSerializer maintains proper formatting
129
+ Scenario: Verify that generated code with DataclassSerializer maintains proper formatting using real RenderContext
124
130
  Expected Outcome: Generated code is properly formatted with correct indentation and structure
125
131
  """
126
- # Arrange
132
+ # Arrange - Use real RenderContext instead of mocks
133
+ context = RenderContext(
134
+ output_package_name="test_package",
135
+ core_package_name="test_package.core",
136
+ )
137
+
127
138
  operation = IROperation(
128
139
  operation_id="update_user",
129
140
  summary="Update a user",
@@ -137,26 +148,26 @@ class TestDataclassSerializationEndToEnd:
137
148
  content={"application/json": IRSchema(type="UpdateUserRequest", description="User update data")},
138
149
  required=True,
139
150
  ),
140
- responses=[],
151
+ responses=[
152
+ IRResponse(
153
+ status_code="200",
154
+ description="User updated",
155
+ content={"application/json": IRSchema(type="User", description="Updated user")},
156
+ )
157
+ ],
141
158
  )
142
159
 
143
- context = MagicMock(spec=RenderContext)
144
- context.core_package_name = "test_core"
145
- context.add_import = MagicMock()
146
- context.add_typing_imports_for_type = MagicMock()
147
-
148
160
  generator = EndpointMethodGenerator()
149
161
 
150
- # Act
162
+ # Act - Generate code with real context
151
163
  generated_code = generator.generate(operation, context)
152
164
 
153
- # Assert
154
- # Check that the code is properly formatted
165
+ # Assert - Validate code formatting
155
166
  lines = generated_code.split("\n")
156
167
 
157
168
  # Find the json_body assignment line
158
169
  json_body_lines = [line for line in lines if "json_body:" in line and "DataclassSerializer" in line]
159
- assert len(json_body_lines) == 1
170
+ assert len(json_body_lines) == 1, f"Expected exactly one json_body assignment, got: {json_body_lines}"
160
171
 
161
172
  json_body_line = json_body_lines[0]
162
173
 
File without changes