pyopenapi-gen 0.18.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.18.0 → pyopenapi_gen-0.20.0}/.gitignore +3 -1
  2. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/CHANGELOG.md +32 -0
  3. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/PKG-INFO +1 -1
  4. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/coverage.xml +49 -45
  5. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/pyproject.toml +2 -2
  6. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/__init__.py +1 -1
  7. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/utils.py +5 -0
  8. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py +6 -3
  9. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_dataclass_serialization.py +194 -0
  10. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/end_to_end/test_dataclass_serialization_e2e.py +60 -49
  11. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.bandit +0 -0
  12. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.cursor/mcp.json +0 -0
  13. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.cursor/rules/architecture.mdc +0 -0
  14. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.cursor/rules/coding-conventions.mdc +0 -0
  15. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.cursor/rules/project-goal.mdc +0 -0
  16. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.cursor/rules/testing.mdc +0 -0
  17. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/BRANCH_PROTECTION.md +0 -0
  18. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/CLAUDE_CONFIGURATION.md +0 -0
  19. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/CODEOWNERS +0 -0
  20. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  22. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/dependabot.yml +0 -0
  23. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/ci.yml +0 -0
  24. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/claude-auto-approve.yml +0 -0
  25. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/claude-review-trigger.yml +0 -0
  26. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/claude.yml +0 -0
  27. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/pr-checks.yml +0 -0
  28. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/production-release.yml.backup +0 -0
  29. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/promote-to-staging.yml +0 -0
  30. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/semantic-release.yml +0 -0
  31. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/staging-publish.yml +0 -0
  32. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.github/workflows/testpypi-publish.yml +0 -0
  33. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.python-version +0 -0
  34. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/.vscode/settings.json +0 -0
  35. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/CLAUDE.md +0 -0
  36. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/CONTRIBUTING.md +0 -0
  37. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/LICENSE +0 -0
  38. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/Makefile +0 -0
  39. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/README.md +0 -0
  40. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/README.md +0 -0
  41. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/architecture.md +0 -0
  42. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/endpoint_visitor.md +0 -0
  43. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/helpers.md +0 -0
  44. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/ir_models.md +0 -0
  45. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/line_writer.md +0 -0
  46. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/loader.md +0 -0
  47. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/model_visitor.md +0 -0
  48. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/release-automation.md +0 -0
  49. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/render_context.md +0 -0
  50. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/docs/unified_type_resolution.md +0 -0
  51. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/input/business_swagger.json +0 -0
  52. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/input/minimal_swagger.json +0 -0
  53. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/input/minimal_syntax_test.json +0 -0
  54. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/input/test_name_collision_spec.json +0 -0
  55. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/mkdocs.yml +0 -0
  56. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/poetry.lock +0 -0
  57. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/scripts/sync_version_to_init.py +0 -0
  58. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/scripts/validate_version_sync.py +0 -0
  59. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/__main__.py +0 -0
  60. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/cli.py +0 -0
  61. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/CLAUDE.md +0 -0
  62. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/file_manager.py +0 -0
  63. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/import_collector.py +0 -0
  64. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/context/render_context.py +0 -0
  65. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/CLAUDE.md +0 -0
  66. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/__init__.py +0 -0
  67. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/auth/base.py +0 -0
  68. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/auth/plugins.py +0 -0
  69. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/exceptions.py +0 -0
  70. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/http_status_codes.py +0 -0
  71. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/http_transport.py +0 -0
  72. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/__init__.py +0 -0
  73. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/loader.py +0 -0
  74. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/__init__.py +0 -0
  75. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/parser.py +0 -0
  76. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/post_processor.py +0 -0
  77. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/operations/request_body.py +0 -0
  78. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/parameters/__init__.py +0 -0
  79. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/parameters/parser.py +0 -0
  80. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/responses/__init__.py +0 -0
  81. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/responses/parser.py +0 -0
  82. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/schemas/__init__.py +0 -0
  83. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/loader/schemas/extractor.py +0 -0
  84. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/pagination.py +0 -0
  85. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/__init__.py +0 -0
  86. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/__init__.py +0 -0
  87. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py +0 -0
  88. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py +0 -0
  89. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py +0 -0
  90. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py +0 -0
  91. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/existing_schema.py +0 -0
  92. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py +0 -0
  93. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py +0 -0
  94. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py +0 -0
  95. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py +0 -0
  96. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py +0 -0
  97. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/common/type_parser.py +0 -0
  98. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/context.py +0 -0
  99. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/cycle_helpers.py +0 -0
  100. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/__init__.py +0 -0
  101. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/all_of_parser.py +0 -0
  102. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/any_of_parser.py +0 -0
  103. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/array_items_parser.py +0 -0
  104. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/one_of_parser.py +0 -0
  105. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/keywords/properties_parser.py +0 -0
  106. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/schema_finalizer.py +0 -0
  107. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/schema_parser.py +0 -0
  108. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/transformers/__init__.py +0 -0
  109. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +0 -0
  110. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py +0 -0
  111. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/parsing/unified_cycle_detection.py +0 -0
  112. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/postprocess_manager.py +0 -0
  113. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/schemas.py +0 -0
  114. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/streaming_helpers.py +0 -0
  115. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/telemetry.py +0 -0
  116. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/warning_collector.py +0 -0
  117. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/code_writer.py +0 -0
  118. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/documentation_writer.py +0 -0
  119. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/line_writer.py +0 -0
  120. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core/writers/python_construct_renderer.py +0 -0
  121. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/core_package_template/README.md +0 -0
  122. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emit/models_emitter.py +0 -0
  123. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/CLAUDE.md +0 -0
  124. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/client_emitter.py +0 -0
  125. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/core_emitter.py +0 -0
  126. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/docs_emitter.py +0 -0
  127. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/endpoints_emitter.py +0 -0
  128. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/exceptions_emitter.py +0 -0
  129. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/emitters/models_emitter.py +0 -0
  130. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/generator/CLAUDE.md +0 -0
  131. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/generator/client_generator.py +0 -0
  132. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/CLAUDE.md +0 -0
  133. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/__init__.py +0 -0
  134. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/endpoint_utils.py +0 -0
  135. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_cleaner.py +0 -0
  136. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_helper.py +0 -0
  137. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/__init__.py +0 -0
  138. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/array_resolver.py +0 -0
  139. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/composition_resolver.py +0 -0
  140. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/finalizer.py +0 -0
  141. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/named_resolver.py +0 -0
  142. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/object_resolver.py +0 -0
  143. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/primitive_resolver.py +0 -0
  144. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/type_resolution/resolver.py +0 -0
  145. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/helpers/url_utils.py +0 -0
  146. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/http_types.py +0 -0
  147. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/ir.py +0 -0
  148. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/py.typed +0 -0
  149. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/CLAUDE.md +0 -0
  150. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/__init__.py +0 -0
  151. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/contracts/__init__.py +0 -0
  152. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/contracts/protocols.py +0 -0
  153. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/contracts/types.py +0 -0
  154. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/__init__.py +0 -0
  155. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/reference_resolver.py +0 -0
  156. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/response_resolver.py +0 -0
  157. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/resolvers/schema_resolver.py +0 -0
  158. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/services/__init__.py +0 -0
  159. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/services/type_service.py +0 -0
  160. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/strategies/__init__.py +0 -0
  161. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/types/strategies/response_strategy.py +0 -0
  162. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/CLAUDE.md +0 -0
  163. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/client_visitor.py +0 -0
  164. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/docs_visitor.py +0 -0
  165. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/__init__.py +0 -0
  166. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +0 -0
  167. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/__init__.py +0 -0
  168. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +0 -0
  169. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/overload_generator.py +0 -0
  170. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/request_generator.py +0 -0
  171. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +0 -0
  172. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/signature_generator.py +0 -0
  173. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/generators/url_args_generator.py +0 -0
  174. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/processors/__init__.py +0 -0
  175. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/processors/import_analyzer.py +0 -0
  176. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +0 -0
  177. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/exception_visitor.py +0 -0
  178. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/__init__.py +0 -0
  179. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/alias_generator.py +0 -0
  180. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/dataclass_generator.py +0 -0
  181. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/enum_generator.py +0 -0
  182. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/model/model_visitor.py +0 -0
  183. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/src/pyopenapi_gen/visit/visitor.py +0 -0
  184. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/__init__.py +0 -0
  185. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/api/test_programmatic_api.py +0 -0
  186. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/auth/auth_analysis.md +0 -0
  187. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/auth/test_auth_base.py +0 -0
  188. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/auth/test_auth_plugins.py +0 -0
  189. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/cli/cli_analysis.md +0 -0
  190. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_backup_diff.py +0 -0
  191. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_edge_cases.py +0 -0
  192. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_edge_cases_comprehensive.py +0 -0
  193. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/cli/test_cli_internal_utils.py +0 -0
  194. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/cli/test_http_pagination_cli.py +0 -0
  195. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/context_analysis.md +0 -0
  196. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/test_core_import_path.py +0 -0
  197. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/test_file_manager.py +0 -0
  198. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/test_import_collector.py +0 -0
  199. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/test_render_context.py +0 -0
  200. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/test_render_context_imports.py +0 -0
  201. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/context/test_render_context_relative_paths.py +0 -0
  202. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/core_analysis.md +0 -0
  203. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/loader/parameters/test_inline_enum_array_params.py +0 -0
  204. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/loader/test_extractor.py +0 -0
  205. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/loader/test_top_level_enum_extraction.py +0 -0
  206. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/helpers_analysis.md +0 -0
  207. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_cyclic_properties.py +0 -0
  208. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_direct_cycle.py +0 -0
  209. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_existing_schema.py +0 -0
  210. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_list_response.py +0 -0
  211. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_missing_ref.py +0 -0
  212. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_new_schema.py +0 -0
  213. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/common/ref_resolution/helpers/test_stripped_suffix.py +0 -0
  214. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/__init__.py +0 -0
  215. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/keywords_analysis.md +0 -0
  216. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_all_of_parser.py +0 -0
  217. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_any_of_parser.py +0 -0
  218. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_array_items_parser.py +0 -0
  219. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_one_of_parser.py +0 -0
  220. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/keywords/test_properties_parser.py +0 -0
  221. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/parsing_analysis.md +0 -0
  222. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_context.py +0 -0
  223. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_cycle_detection.py +0 -0
  224. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_cycle_helpers.py +0 -0
  225. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_improved_schema_naming.py +0 -0
  226. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_inline_enum_extractor.py +0 -0
  227. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_inline_object_promoter.py +0 -0
  228. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_logging.py +0 -0
  229. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_ref_resolver.py +0 -0
  230. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_schema_finalizer.py +0 -0
  231. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_schema_parser.py +0 -0
  232. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_schema_parser_list_response.py +0 -0
  233. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/parsing/test_type_parser.py +0 -0
  234. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_detect_circular_imports.py +0 -0
  235. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_edge_cases_integration.py +0 -0
  236. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_edge_cases_systematic.py +0 -0
  237. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_exceptions_module.py +0 -0
  238. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_forward_references.py +0 -0
  239. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_http_transport.py +0 -0
  240. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_import_resolution.py +0 -0
  241. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_ir.py +0 -0
  242. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_ir_schema.py +0 -0
  243. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader.py +0 -0
  244. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_extensive.py +0 -0
  245. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_invalid_refs.py +0 -0
  246. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_malformed.py +0 -0
  247. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_loader_media_types.py +0 -0
  248. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_pagination.py +0 -0
  249. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_parsing_context.py +0 -0
  250. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_protocol_defaults.py +0 -0
  251. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_schema_parser_specific_case.py +0 -0
  252. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_schemas.py +0 -0
  253. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_simple_self_ref_check.py +0 -0
  254. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_streaming_helpers.py +0 -0
  255. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_telemetry.py +0 -0
  256. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_telemetry_client.py +0 -0
  257. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_utils.py +0 -0
  258. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/test_warning_collector.py +0 -0
  259. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_code_writer.py +0 -0
  260. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_documentation_writer.py +0 -0
  261. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_line_writer.py +0 -0
  262. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/writers/test_python_construct_renderer_json_wizard.py +0 -0
  263. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/core/writers/writers_analysis.md +0 -0
  264. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/emitters_analysis.md +0 -0
  265. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_client_emitter.py +0 -0
  266. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_docs_emitter.py +0 -0
  267. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_duplicate_operations.py +0 -0
  268. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_endpoints_emitter.py +0 -0
  269. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_exceptions_emitter.py +0 -0
  270. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_list_response_generation.py +0 -0
  271. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/emitters/test_models_emitter.py +0 -0
  272. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/examples/test_developer_experience_demo.py +0 -0
  273. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/generation/generation_analysis.md +0 -0
  274. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/generation/test_external_core_package.py +0 -0
  275. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/specs/minimal_addmessage_like.json +0 -0
  276. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/test_addmessage_like_issues.py +0 -0
  277. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/test_agent_include_parameter_typing.py +0 -0
  278. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/generation_issues/test_message_batch_response_issue.py +0 -0
  279. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/helpers_analysis.md +0 -0
  280. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_array_resolver.py +0 -0
  281. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_endpoint_utils.py +0 -0
  282. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_endpoint_utils_extended.py +0 -0
  283. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_get_endpoint_return_types.py +0 -0
  284. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_named_resolver.py +0 -0
  285. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_named_type_resolver.py +0 -0
  286. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_object_resolver.py +0 -0
  287. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_put_endpoint_return_types.py +0 -0
  288. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_type_cleaner.py +0 -0
  289. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_type_helper.py +0 -0
  290. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_url_utils.py +0 -0
  291. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/helpers/test_utils_helpers.py +0 -0
  292. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/integration/test_generated_code_structure.py +0 -0
  293. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/integrations/integrations_analysis.md +0 -0
  294. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_business_swagger_message_type.py +0 -0
  295. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_end_to_end_business_swagger.py +0 -0
  296. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_end_to_end_petstore.py +0 -0
  297. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/integrations/test_name_collisions.py +0 -0
  298. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/specs/response_unwrapping_spec.yaml +0 -0
  299. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/test_analysis_overview.md +0 -0
  300. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/test_init.py +0 -0
  301. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/__init__.py +0 -0
  302. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_business_swagger_integration.py +0 -0
  303. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_contracts_types.py +0 -0
  304. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_missing_imports_bug.py +0 -0
  305. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_reference_resolver.py +0 -0
  306. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_response_resolver.py +0 -0
  307. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_response_strategy.py +0 -0
  308. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_response_strategy_simplified.py +0 -0
  309. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_schema_resolver.py +0 -0
  310. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_schema_resolver_enums.py +0 -0
  311. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/types/test_type_service.py +0 -0
  312. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/__init__.py +0 -0
  313. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/__init__.py +0 -0
  314. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/__init__.py +0 -0
  315. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/generators_analysis.md +0 -0
  316. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_dataclass_integration.py +0 -0
  317. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_docstring_generator.py +0 -0
  318. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_endpoint_method_generator.py +0 -0
  319. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_match_case_response.py +0 -0
  320. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_overload_generator.py +0 -0
  321. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_request_generator.py +0 -0
  322. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_response_handler_generator.py +0 -0
  323. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_response_handler_generator_strategy.py +0 -0
  324. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_signature_generator.py +0 -0
  325. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/generators/test_url_args_generator.py +0 -0
  326. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/__init__.py +0 -0
  327. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/test_import_analyzer.py +0 -0
  328. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/test_import_analyzer.py.bak +0 -0
  329. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/processors/test_parameter_processor.py +0 -0
  330. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/endpoint/test_endpoint_visitor.py +0 -0
  331. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/__init__.py +0 -0
  332. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_alias_generator.py +0 -0
  333. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_dataclass_generator.py +0 -0
  334. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_dataclass_generator_json_wizard.py +0 -0
  335. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_enum_generator.py +0 -0
  336. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_json_value_integration.py +0 -0
  337. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/model/test_json_value_wrapper.py +0 -0
  338. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/test_client_visitor.py +0 -0
  339. {pyopenapi_gen-0.18.0 → pyopenapi_gen-0.20.0}/tests/visit/test_model_visitor.py +0 -0
  340. {pyopenapi_gen-0.18.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,38 @@
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
+
23
+ ## v0.19.0 (2025-10-18)
24
+
25
+ ### Chores
26
+
27
+ - **release**: Sync __init__.py version [skip ci]
28
+ ([`4938f48`](https://github.com/mindhiveoy/pyopenapi_gen/commit/4938f4840650dc56573ca3294d782f74ea89dc65))
29
+
30
+ ### Features
31
+
32
+ - **codegen**: Integrate DataclassSerializer for request body serialization
33
+ ([`0b5b01f`](https://github.com/mindhiveoy/pyopenapi_gen/commit/0b5b01f3e7a5a1d7d57298088bf2543920517855))
34
+
35
+
4
36
  ## v0.18.0 (2025-10-14)
5
37
 
6
38
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyopenapi-gen
3
- Version: 0.18.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="1760418914146" lines-valid="6501" lines-covered="5746" 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">
@@ -6005,7 +6008,7 @@
6005
6008
  </class>
6006
6009
  </classes>
6007
6010
  </package>
6008
- <package name="pyopenapi_gen.visit.endpoint.generators" line-rate="0.8879" branch-rate="0" complexity="0">
6011
+ <package name="pyopenapi_gen.visit.endpoint.generators" line-rate="0.8881" branch-rate="0" complexity="0">
6009
6012
  <classes>
6010
6013
  <class name="__init__.py" filename="pyopenapi_gen/visit/endpoint/generators/__init__.py" complexity="0" line-rate="1" branch-rate="0">
6011
6014
  <methods/>
@@ -6082,7 +6085,7 @@
6082
6085
  <line number="123" hits="1"/>
6083
6086
  </lines>
6084
6087
  </class>
6085
- <class name="endpoint_method_generator.py" filename="pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py" complexity="0" line-rate="0.9286" branch-rate="0">
6088
+ <class name="endpoint_method_generator.py" filename="pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py" complexity="0" line-rate="0.9291" branch-rate="0">
6086
6089
  <methods/>
6087
6090
  <lines>
6088
6091
  <line number="1" hits="1"/>
@@ -6152,30 +6155,28 @@
6152
6155
  <line number="127" hits="1"/>
6153
6156
  <line number="131" hits="1"/>
6154
6157
  <line number="134" hits="1"/>
6155
- <line number="135" hits="1"/>
6158
+ <line number="137" hits="1"/>
6156
6159
  <line number="138" hits="1"/>
6157
- <line number="139" hits="1"/>
6158
- <line number="140" hits="1"/>
6159
6160
  <line number="141" hits="1"/>
6160
6161
  <line number="142" hits="1"/>
6161
6162
  <line number="143" hits="1"/>
6162
6163
  <line number="144" hits="1"/>
6163
6164
  <line number="145" hits="1"/>
6164
6165
  <line number="146" hits="1"/>
6166
+ <line number="147" hits="1"/>
6167
+ <line number="148" hits="1"/>
6165
6168
  <line number="149" hits="1"/>
6166
- <line number="150" hits="1"/>
6169
+ <line number="152" hits="1"/>
6167
6170
  <line number="153" hits="1"/>
6168
- <line number="155" hits="1"/>
6169
6171
  <line number="156" hits="1"/>
6170
- <line number="157" hits="1"/>
6171
- <line number="161" hits="1"/>
6172
- <line number="162" hits="1"/>
6173
- <line number="163" hits="1"/>
6172
+ <line number="158" hits="1"/>
6173
+ <line number="159" hits="1"/>
6174
+ <line number="160" hits="1"/>
6175
+ <line number="164" hits="1"/>
6174
6176
  <line number="165" hits="1"/>
6175
- <line number="167" hits="1"/>
6177
+ <line number="166" hits="1"/>
6178
+ <line number="168" hits="1"/>
6176
6179
  <line number="170" hits="1"/>
6177
- <line number="171" hits="1"/>
6178
- <line number="172" hits="1"/>
6179
6180
  <line number="173" hits="1"/>
6180
6181
  <line number="174" hits="1"/>
6181
6182
  <line number="175" hits="1"/>
@@ -6193,24 +6194,27 @@
6193
6194
  <line number="187" hits="1"/>
6194
6195
  <line number="188" hits="1"/>
6195
6196
  <line number="189" hits="1"/>
6196
- <line number="191" hits="0"/>
6197
- <line number="192" hits="0"/>
6198
- <line number="193" hits="0"/>
6197
+ <line number="190" hits="1"/>
6198
+ <line number="191" hits="1"/>
6199
+ <line number="192" hits="1"/>
6199
6200
  <line number="194" hits="0"/>
6200
6201
  <line number="195" hits="0"/>
6201
6202
  <line number="196" hits="0"/>
6202
6203
  <line number="197" hits="0"/>
6203
6204
  <line number="198" hits="0"/>
6204
6205
  <line number="199" hits="0"/>
6205
- <line number="201" hits="1"/>
6206
+ <line number="200" hits="0"/>
6207
+ <line number="201" hits="0"/>
6208
+ <line number="202" hits="0"/>
6206
6209
  <line number="204" hits="1"/>
6207
- <line number="205" hits="1"/>
6208
- <line number="206" hits="1"/>
6209
6210
  <line number="207" hits="1"/>
6210
6211
  <line number="208" hits="1"/>
6212
+ <line number="209" hits="1"/>
6213
+ <line number="210" hits="1"/>
6211
6214
  <line number="211" hits="1"/>
6212
- <line number="213" hits="1"/>
6213
- <line number="215" hits="1"/>
6215
+ <line number="214" hits="1"/>
6216
+ <line number="216" hits="1"/>
6217
+ <line number="218" hits="1"/>
6214
6218
  </lines>
6215
6219
  </class>
6216
6220
  <class name="overload_generator.py" filename="pyopenapi_gen/visit/endpoint/generators/overload_generator.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.18.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.18.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.18.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)
@@ -130,6 +130,9 @@ class EndpointMethodGenerator:
130
130
 
131
131
  writer = CodeWriter()
132
132
 
133
+ # Import DataclassSerializer for automatic conversion
134
+ context.add_import(f"{context.core_package_name}.utils", "DataclassSerializer")
135
+
133
136
  # Generate implementation signature (accepts all content-type parameters as optional)
134
137
  impl_sig = self.overload_generator.generate_implementation_signature(op, context, response_strategy)
135
138
  writer.write_block(impl_sig)
@@ -168,7 +171,7 @@ class EndpointMethodGenerator:
168
171
 
169
172
  # Generate request call for this content type
170
173
  if content_type == "application/json":
171
- writer.write_line(f"json_body = {param_info['name']}")
174
+ writer.write_line(f"json_body = DataclassSerializer.serialize({param_info['name']})")
172
175
  writer.write_line("response = await self._transport.request(")
173
176
  writer.indent()
174
177
  writer.write_line(f'"{op.method.value.upper()}", url,')
@@ -178,7 +181,7 @@ class EndpointMethodGenerator:
178
181
  writer.dedent()
179
182
  writer.write_line(")")
180
183
  elif content_type == "multipart/form-data":
181
- writer.write_line(f"files_data = {param_info['name']}")
184
+ writer.write_line(f"files_data = DataclassSerializer.serialize({param_info['name']})")
182
185
  writer.write_line("response = await self._transport.request(")
183
186
  writer.indent()
184
187
  writer.write_line(f'"{op.method.value.upper()}", url,')
@@ -188,7 +191,7 @@ class EndpointMethodGenerator:
188
191
  writer.dedent()
189
192
  writer.write_line(")")
190
193
  else:
191
- writer.write_line(f"data = {param_info['name']}")
194
+ writer.write_line(f"data = DataclassSerializer.serialize({param_info['name']})")
192
195
  writer.write_line("response = await self._transport.request(")
193
196
  writer.indent()
194
197
  writer.write_line(f'"{op.method.value.upper()}", url,')
@@ -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."""