pyopenapi-gen 0.14.1__tar.gz → 0.14.2__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.
Files changed (333) hide show
  1. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/CHANGELOG.md +23 -0
  2. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/PKG-INFO +1 -1
  3. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/coverage.xml +32 -32
  4. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/pyproject.toml +2 -2
  5. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/endpoints_emitter.py +12 -4
  6. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_duplicate_operations.py +89 -0
  7. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.bandit +0 -0
  8. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.cursor/mcp.json +0 -0
  9. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.cursor/rules/architecture.mdc +0 -0
  10. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.cursor/rules/coding-conventions.mdc +0 -0
  11. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.cursor/rules/project-goal.mdc +0 -0
  12. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.cursor/rules/testing.mdc +0 -0
  13. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/BRANCH_PROTECTION.md +0 -0
  14. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/CLAUDE_CONFIGURATION.md +0 -0
  15. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/CODEOWNERS +0 -0
  16. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  17. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  18. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/dependabot.yml +0 -0
  19. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/ci.yml +0 -0
  20. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/claude-auto-approve.yml +0 -0
  21. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/claude-review-trigger.yml +0 -0
  22. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/claude.yml +0 -0
  23. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/pr-checks.yml +0 -0
  24. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/production-release.yml.backup +0 -0
  25. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/promote-to-staging.yml +0 -0
  26. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/semantic-release.yml +0 -0
  27. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/staging-publish.yml +0 -0
  28. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.github/workflows/testpypi-publish.yml +0 -0
  29. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.gitignore +0 -0
  30. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.python-version +0 -0
  31. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/.vscode/settings.json +0 -0
  32. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/CLAUDE.md +0 -0
  33. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/CONTRIBUTING.md +0 -0
  34. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/LICENSE +0 -0
  35. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/Makefile +0 -0
  36. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/README.md +0 -0
  37. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/README.md +0 -0
  38. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/architecture.md +0 -0
  39. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/endpoint_visitor.md +0 -0
  40. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/helpers.md +0 -0
  41. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/ir_models.md +0 -0
  42. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/line_writer.md +0 -0
  43. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/loader.md +0 -0
  44. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/model_visitor.md +0 -0
  45. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/release-automation.md +0 -0
  46. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/render_context.md +0 -0
  47. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/docs/unified_type_resolution.md +0 -0
  48. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/input/business_swagger.json +0 -0
  49. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/input/minimal_swagger.json +0 -0
  50. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/input/minimal_syntax_test.json +0 -0
  51. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/input/test_name_collision_spec.json +0 -0
  52. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/mkdocs.yml +0 -0
  53. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/poetry.lock +0 -0
  54. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/__init__.py +0 -0
  55. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/__main__.py +0 -0
  56. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/cli.py +0 -0
  57. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/context/CLAUDE.md +0 -0
  58. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/context/file_manager.py +0 -0
  59. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/context/import_collector.py +0 -0
  60. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/context/render_context.py +0 -0
  61. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/CLAUDE.md +0 -0
  62. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/__init__.py +0 -0
  63. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/auth/base.py +0 -0
  64. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/auth/plugins.py +0 -0
  65. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/exceptions.py +0 -0
  66. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/http_status_codes.py +0 -0
  67. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/http_transport.py +0 -0
  68. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/__init__.py +0 -0
  69. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/loader.py +0 -0
  70. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/operations/__init__.py +0 -0
  71. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/operations/parser.py +0 -0
  72. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/operations/post_processor.py +0 -0
  73. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/operations/request_body.py +0 -0
  74. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/parameters/__init__.py +0 -0
  75. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/parameters/parser.py +0 -0
  76. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/responses/__init__.py +0 -0
  77. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/responses/parser.py +0 -0
  78. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/schemas/__init__.py +0 -0
  79. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/loader/schemas/extractor.py +0 -0
  80. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/pagination.py +0 -0
  81. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/__init__.py +0 -0
  82. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/__init__.py +0 -0
  83. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py +0 -0
  84. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py +0 -0
  85. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py +0 -0
  86. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py +0 -0
  87. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/existing_schema.py +0 -0
  88. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py +0 -0
  89. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py +0 -0
  90. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py +0 -0
  91. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py +0 -0
  92. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py +0 -0
  93. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/common/type_parser.py +0 -0
  94. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/context.py +0 -0
  95. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/cycle_helpers.py +0 -0
  96. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/__init__.py +0 -0
  97. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/all_of_parser.py +0 -0
  98. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/any_of_parser.py +0 -0
  99. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/array_items_parser.py +0 -0
  100. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/one_of_parser.py +0 -0
  101. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/keywords/properties_parser.py +0 -0
  102. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/schema_finalizer.py +0 -0
  103. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/schema_parser.py +0 -0
  104. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/transformers/__init__.py +0 -0
  105. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +0 -0
  106. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py +0 -0
  107. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/parsing/unified_cycle_detection.py +0 -0
  108. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/postprocess_manager.py +0 -0
  109. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/schemas.py +0 -0
  110. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/streaming_helpers.py +0 -0
  111. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/telemetry.py +0 -0
  112. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/utils.py +0 -0
  113. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/warning_collector.py +0 -0
  114. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/writers/code_writer.py +0 -0
  115. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/writers/documentation_writer.py +0 -0
  116. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/writers/line_writer.py +0 -0
  117. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core/writers/python_construct_renderer.py +0 -0
  118. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/core_package_template/README.md +0 -0
  119. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emit/models_emitter.py +0 -0
  120. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/CLAUDE.md +0 -0
  121. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/client_emitter.py +0 -0
  122. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/core_emitter.py +0 -0
  123. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/docs_emitter.py +0 -0
  124. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/exceptions_emitter.py +0 -0
  125. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/emitters/models_emitter.py +0 -0
  126. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/generator/CLAUDE.md +0 -0
  127. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/generator/client_generator.py +0 -0
  128. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/CLAUDE.md +0 -0
  129. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/__init__.py +0 -0
  130. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/endpoint_utils.py +0 -0
  131. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_cleaner.py +0 -0
  132. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_helper.py +0 -0
  133. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/__init__.py +0 -0
  134. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/array_resolver.py +0 -0
  135. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/composition_resolver.py +0 -0
  136. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/finalizer.py +0 -0
  137. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/named_resolver.py +0 -0
  138. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/object_resolver.py +0 -0
  139. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/primitive_resolver.py +0 -0
  140. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/type_resolution/resolver.py +0 -0
  141. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/helpers/url_utils.py +0 -0
  142. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/http_types.py +0 -0
  143. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/ir.py +0 -0
  144. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/py.typed +0 -0
  145. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/CLAUDE.md +0 -0
  146. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/__init__.py +0 -0
  147. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/contracts/__init__.py +0 -0
  148. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/contracts/protocols.py +0 -0
  149. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/contracts/types.py +0 -0
  150. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/resolvers/__init__.py +0 -0
  151. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/resolvers/reference_resolver.py +0 -0
  152. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/resolvers/response_resolver.py +0 -0
  153. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/resolvers/schema_resolver.py +0 -0
  154. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/services/__init__.py +0 -0
  155. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/services/type_service.py +0 -0
  156. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/strategies/__init__.py +0 -0
  157. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/types/strategies/response_strategy.py +0 -0
  158. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/CLAUDE.md +0 -0
  159. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/client_visitor.py +0 -0
  160. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/docs_visitor.py +0 -0
  161. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/__init__.py +0 -0
  162. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/endpoint_visitor.py +0 -0
  163. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/__init__.py +0 -0
  164. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +0 -0
  165. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py +0 -0
  166. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/request_generator.py +0 -0
  167. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py +0 -0
  168. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/signature_generator.py +0 -0
  169. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/generators/url_args_generator.py +0 -0
  170. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/processors/__init__.py +0 -0
  171. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/processors/import_analyzer.py +0 -0
  172. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +0 -0
  173. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/exception_visitor.py +0 -0
  174. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/model/__init__.py +0 -0
  175. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/model/alias_generator.py +0 -0
  176. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/model/dataclass_generator.py +0 -0
  177. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/model/enum_generator.py +0 -0
  178. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/model/model_visitor.py +0 -0
  179. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/src/pyopenapi_gen/visit/visitor.py +0 -0
  180. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/__init__.py +0 -0
  181. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/auth/auth_analysis.md +0 -0
  182. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/auth/test_auth_base.py +0 -0
  183. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/auth/test_auth_plugins.py +0 -0
  184. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/cli/cli_analysis.md +0 -0
  185. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/cli/test_cli_backup_diff.py +0 -0
  186. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/cli/test_cli_edge_cases.py +0 -0
  187. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/cli/test_cli_edge_cases_comprehensive.py +0 -0
  188. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/cli/test_cli_internal_utils.py +0 -0
  189. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/cli/test_http_pagination_cli.py +0 -0
  190. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/context/context_analysis.md +0 -0
  191. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/context/test_file_manager.py +0 -0
  192. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/context/test_import_collector.py +0 -0
  193. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/context/test_render_context.py +0 -0
  194. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/context/test_render_context_imports.py +0 -0
  195. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/context/test_render_context_relative_paths.py +0 -0
  196. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/core_analysis.md +0 -0
  197. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/loader/parameters/test_inline_enum_array_params.py +0 -0
  198. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/loader/test_extractor.py +0 -0
  199. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/loader/test_top_level_enum_extraction.py +0 -0
  200. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/helpers_analysis.md +0 -0
  201. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_cyclic_properties.py +0 -0
  202. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_direct_cycle.py +0 -0
  203. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_existing_schema.py +0 -0
  204. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_list_response.py +0 -0
  205. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_missing_ref.py +0 -0
  206. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_new_schema.py +0 -0
  207. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/common/ref_resolution/helpers/test_stripped_suffix.py +0 -0
  208. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/__init__.py +0 -0
  209. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/keywords_analysis.md +0 -0
  210. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/test_all_of_parser.py +0 -0
  211. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/test_any_of_parser.py +0 -0
  212. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/test_array_items_parser.py +0 -0
  213. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/test_one_of_parser.py +0 -0
  214. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/keywords/test_properties_parser.py +0 -0
  215. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/parsing_analysis.md +0 -0
  216. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_context.py +0 -0
  217. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_cycle_detection.py +0 -0
  218. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_cycle_helpers.py +0 -0
  219. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_improved_schema_naming.py +0 -0
  220. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_inline_enum_extractor.py +0 -0
  221. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_inline_object_promoter.py +0 -0
  222. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_logging.py +0 -0
  223. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_ref_resolver.py +0 -0
  224. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_schema_finalizer.py +0 -0
  225. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_schema_parser.py +0 -0
  226. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_schema_parser_list_response.py +0 -0
  227. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/parsing/test_type_parser.py +0 -0
  228. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_dataclass_serialization.py +0 -0
  229. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_detect_circular_imports.py +0 -0
  230. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_edge_cases_integration.py +0 -0
  231. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_edge_cases_systematic.py +0 -0
  232. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_exceptions_module.py +0 -0
  233. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_forward_references.py +0 -0
  234. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_http_transport.py +0 -0
  235. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_import_resolution.py +0 -0
  236. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_ir.py +0 -0
  237. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_ir_schema.py +0 -0
  238. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_loader.py +0 -0
  239. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_loader_extensive.py +0 -0
  240. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_loader_invalid_refs.py +0 -0
  241. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_loader_malformed.py +0 -0
  242. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_loader_media_types.py +0 -0
  243. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_pagination.py +0 -0
  244. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_parsing_context.py +0 -0
  245. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_protocol_defaults.py +0 -0
  246. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_schema_parser_specific_case.py +0 -0
  247. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_schemas.py +0 -0
  248. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_simple_self_ref_check.py +0 -0
  249. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_streaming_helpers.py +0 -0
  250. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_telemetry.py +0 -0
  251. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_telemetry_client.py +0 -0
  252. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_utils.py +0 -0
  253. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/test_warning_collector.py +0 -0
  254. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/writers/test_code_writer.py +0 -0
  255. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/writers/test_documentation_writer.py +0 -0
  256. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/writers/test_line_writer.py +0 -0
  257. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/writers/test_python_construct_renderer_json_wizard.py +0 -0
  258. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/core/writers/writers_analysis.md +0 -0
  259. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/emitters_analysis.md +0 -0
  260. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_client_emitter.py +0 -0
  261. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_docs_emitter.py +0 -0
  262. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_endpoints_emitter.py +0 -0
  263. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_exceptions_emitter.py +0 -0
  264. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_list_response_generation.py +0 -0
  265. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/emitters/test_models_emitter.py +0 -0
  266. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/end_to_end/test_dataclass_serialization_e2e.py +0 -0
  267. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/examples/test_developer_experience_demo.py +0 -0
  268. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/generation/generation_analysis.md +0 -0
  269. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/generation/test_external_core_package.py +0 -0
  270. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/generation_issues/specs/minimal_addmessage_like.json +0 -0
  271. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/generation_issues/test_addmessage_like_issues.py +0 -0
  272. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/generation_issues/test_agent_include_parameter_typing.py +0 -0
  273. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/generation_issues/test_message_batch_response_issue.py +0 -0
  274. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/helpers_analysis.md +0 -0
  275. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_array_resolver.py +0 -0
  276. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_endpoint_utils.py +0 -0
  277. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_endpoint_utils_extended.py +0 -0
  278. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_get_endpoint_return_types.py +0 -0
  279. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_named_resolver.py +0 -0
  280. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_named_type_resolver.py +0 -0
  281. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_object_resolver.py +0 -0
  282. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_put_endpoint_return_types.py +0 -0
  283. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_type_cleaner.py +0 -0
  284. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_type_helper.py +0 -0
  285. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_url_utils.py +0 -0
  286. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/helpers/test_utils_helpers.py +0 -0
  287. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/integration/test_generated_code_structure.py +0 -0
  288. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/integrations/integrations_analysis.md +0 -0
  289. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/integrations/test_business_swagger_message_type.py +0 -0
  290. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/integrations/test_end_to_end_business_swagger.py +0 -0
  291. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/integrations/test_end_to_end_petstore.py +0 -0
  292. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/integrations/test_name_collisions.py +0 -0
  293. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/specs/response_unwrapping_spec.yaml +0 -0
  294. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/test_analysis_overview.md +0 -0
  295. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/test_init.py +0 -0
  296. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/__init__.py +0 -0
  297. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_business_swagger_integration.py +0 -0
  298. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_contracts_types.py +0 -0
  299. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_reference_resolver.py +0 -0
  300. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_response_resolver.py +0 -0
  301. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_response_strategy.py +0 -0
  302. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_response_strategy_simplified.py +0 -0
  303. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_schema_resolver.py +0 -0
  304. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_schema_resolver_enums.py +0 -0
  305. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/types/test_type_service.py +0 -0
  306. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/__init__.py +0 -0
  307. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/__init__.py +0 -0
  308. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/__init__.py +0 -0
  309. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/generators_analysis.md +0 -0
  310. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_dataclass_integration.py +0 -0
  311. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_docstring_generator.py +0 -0
  312. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_endpoint_method_generator.py +0 -0
  313. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_match_case_response.py +0 -0
  314. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_request_generator.py +0 -0
  315. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_response_handler_generator.py +0 -0
  316. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_response_handler_generator_strategy.py +0 -0
  317. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_signature_generator.py +0 -0
  318. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/generators/test_url_args_generator.py +0 -0
  319. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/processors/__init__.py +0 -0
  320. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/processors/test_import_analyzer.py +0 -0
  321. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/processors/test_import_analyzer.py.bak +0 -0
  322. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/processors/test_parameter_processor.py +0 -0
  323. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/endpoint/test_endpoint_visitor.py +0 -0
  324. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/__init__.py +0 -0
  325. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/test_alias_generator.py +0 -0
  326. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/test_dataclass_generator.py +0 -0
  327. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/test_dataclass_generator_json_wizard.py +0 -0
  328. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/test_enum_generator.py +0 -0
  329. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/test_json_value_integration.py +0 -0
  330. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/model/test_json_value_wrapper.py +0 -0
  331. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/test_client_visitor.py +0 -0
  332. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/test_model_visitor.py +0 -0
  333. {pyopenapi_gen-0.14.1 → pyopenapi_gen-0.14.2}/tests/visit/test_visitor.py +0 -0
@@ -1,6 +1,29 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v0.14.2 (2025-10-10)
5
+
6
+ ### Bug Fixes
7
+
8
+ - **endpoints**: Prevent _2_2 suffix accumulation in multi-tag operations
9
+ ([`89e500f`](https://github.com/mindhiveoy/pyopenapi_gen/commit/89e500f9c9963492454bc3177fabf872052baac5))
10
+
11
+ Operations with multiple tags previously accumulated duplicate suffixes (_2_2, _2_2_2) because the
12
+ same IROperation object was modified multiple times during per-tag deduplication.
13
+
14
+ **Root Cause:** When an operation has multiple tags (e.g., ["Users", "Admin", "Internal"]), the SAME
15
+ IROperation object reference was added to multiple tag group lists. The per-tag deduplication
16
+ modified the same object repeatedly, causing suffix accumulation.
17
+
18
+ **Solution:** - Implement global deduplication BEFORE tag grouping - New method:
19
+ _deduplicate_operation_ids_globally() - Called once before tag splitting - Ensures each operation
20
+ is renamed at most once - Removed per-tag deduplication call
21
+
22
+ **Testing:** - Existing test for single-tag duplicates still passes - New test verifies multi-tag
23
+ operations get consistent naming - Reproduction test confirms fix resolves _2_2 accumulation - All
24
+ 1299 tests pass with 88.16% coverage
25
+
26
+
4
27
  ## v0.14.1 (2025-10-10)
5
28
 
6
29
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyopenapi-gen
3
- Version: 0.14.1
3
+ Version: 0.14.2
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.6" timestamp="1760114446022" lines-valid="6285" lines-covered="5541" line-rate="0.8816" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
2
+ <coverage version="7.10.6" timestamp="1760116700880" lines-valid="6285" lines-covered="5541" line-rate="0.8816" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
3
3
  <!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.10.6 -->
4
4
  <!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
5
5
  <sources>
@@ -3575,70 +3575,63 @@
3575
3575
  <line number="108" hits="1"/>
3576
3576
  <line number="109" hits="1"/>
3577
3577
  <line number="111" hits="1"/>
3578
- <line number="118" hits="1"/>
3579
- <line number="119" hits="1"/>
3580
- <line number="120" hits="1"/>
3581
- <line number="121" hits="1"/>
3582
3578
  <line number="122" hits="1"/>
3583
3579
  <line number="123" hits="1"/>
3584
3580
  <line number="124" hits="1"/>
3581
+ <line number="125" hits="1"/>
3585
3582
  <line number="126" hits="1"/>
3583
+ <line number="127" hits="1"/>
3586
3584
  <line number="128" hits="1"/>
3587
- <line number="131" hits="1"/>
3585
+ <line number="130" hits="1"/>
3588
3586
  <line number="132" hits="1"/>
3589
- <line number="134" hits="1"/>
3590
- <line number="137" hits="1"/>
3591
- <line number="142" hits="1"/>
3592
- <line number="143" hits="1"/>
3593
- <line number="144" hits="1"/>
3587
+ <line number="135" hits="1"/>
3588
+ <line number="136" hits="1"/>
3589
+ <line number="138" hits="1"/>
3590
+ <line number="141" hits="1"/>
3591
+ <line number="146" hits="1"/>
3592
+ <line number="147" hits="1"/>
3594
3593
  <line number="148" hits="1"/>
3595
- <line number="149" hits="1"/>
3596
- <line number="150" hits="0"/>
3594
+ <line number="152" hits="1"/>
3595
+ <line number="153" hits="1"/>
3597
3596
  <line number="154" hits="0"/>
3598
- <line number="156" hits="1"/>
3599
- <line number="157" hits="1"/>
3600
- <line number="159" hits="1"/>
3597
+ <line number="158" hits="0"/>
3601
3598
  <line number="160" hits="1"/>
3602
3599
  <line number="161" hits="1"/>
3603
- <line number="162" hits="1"/>
3604
- <line number="163" hits="1"/>
3605
- <line number="164" hits="1"/>
3606
3600
  <line number="165" hits="1"/>
3607
- <line number="166" hits="1"/>
3601
+ <line number="167" hits="1"/>
3608
3602
  <line number="168" hits="1"/>
3609
3603
  <line number="169" hits="1"/>
3604
+ <line number="170" hits="1"/>
3610
3605
  <line number="171" hits="1"/>
3611
3606
  <line number="172" hits="1"/>
3612
3607
  <line number="173" hits="1"/>
3613
3608
  <line number="174" hits="1"/>
3614
- <line number="175" hits="1"/>
3615
3609
  <line number="176" hits="1"/>
3616
- <line number="178" hits="1"/>
3610
+ <line number="177" hits="1"/>
3617
3611
  <line number="179" hits="1"/>
3618
3612
  <line number="180" hits="1"/>
3619
3613
  <line number="181" hits="1"/>
3620
3614
  <line number="182" hits="1"/>
3621
3615
  <line number="183" hits="1"/>
3622
- <line number="185" hits="1"/>
3616
+ <line number="184" hits="1"/>
3623
3617
  <line number="186" hits="1"/>
3618
+ <line number="187" hits="1"/>
3624
3619
  <line number="188" hits="1"/>
3625
3620
  <line number="189" hits="1"/>
3626
3621
  <line number="190" hits="1"/>
3627
3622
  <line number="191" hits="1"/>
3628
- <line number="192" hits="1"/>
3629
- <line number="195" hits="1"/>
3623
+ <line number="193" hits="1"/>
3624
+ <line number="194" hits="1"/>
3625
+ <line number="196" hits="1"/>
3630
3626
  <line number="197" hits="1"/>
3627
+ <line number="198" hits="1"/>
3628
+ <line number="199" hits="1"/>
3631
3629
  <line number="200" hits="1"/>
3632
- <line number="201" hits="0"/>
3633
- <line number="202" hits="1"/>
3634
3630
  <line number="203" hits="1"/>
3635
- <line number="205" hits="1"/>
3636
- <line number="206" hits="1"/>
3637
- <line number="207" hits="1"/>
3638
3631
  <line number="208" hits="1"/>
3639
- <line number="209" hits="1"/>
3632
+ <line number="209" hits="0"/>
3633
+ <line number="210" hits="1"/>
3640
3634
  <line number="211" hits="1"/>
3641
- <line number="212" hits="1"/>
3642
3635
  <line number="213" hits="1"/>
3643
3636
  <line number="214" hits="1"/>
3644
3637
  <line number="215" hits="1"/>
@@ -3648,7 +3641,14 @@
3648
3641
  <line number="220" hits="1"/>
3649
3642
  <line number="221" hits="1"/>
3650
3643
  <line number="222" hits="1"/>
3644
+ <line number="223" hits="1"/>
3651
3645
  <line number="224" hits="1"/>
3646
+ <line number="225" hits="1"/>
3647
+ <line number="227" hits="1"/>
3648
+ <line number="228" hits="1"/>
3649
+ <line number="229" hits="1"/>
3650
+ <line number="230" hits="1"/>
3651
+ <line number="232" hits="1"/>
3652
3652
  </lines>
3653
3653
  </class>
3654
3654
  <class name="exceptions_emitter.py" filename="pyopenapi_gen/emitters/exceptions_emitter.py" complexity="0" line-rate="0.9429" branch-rate="0">
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pyopenapi-gen"
7
- version = "0.14.1"
7
+ version = "0.14.2"
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.14.1"
143
+ version = "0.14.2"
144
144
  version_files = [
145
145
  "pyproject.toml:version",
146
146
  "src/pyopenapi_gen/__init__.py:__version__"
@@ -108,12 +108,16 @@ class EndpointsEmitter:
108
108
  self.formatter = Formatter()
109
109
  self.visitor: EndpointVisitor | None = None
110
110
 
111
- def _deduplicate_operation_ids(self, operations: List[IROperation]) -> None:
111
+ def _deduplicate_operation_ids_globally(self, operations: List[IROperation]) -> None:
112
112
  """
113
- Ensures all operations have unique method names within a tag.
113
+ Ensures all operations have unique method names globally across all tags.
114
+
115
+ This prevents the bug where operations with multiple tags share the same
116
+ IROperation object reference, causing _deduplicate_operation_ids() to
117
+ modify the same object multiple times and accumulate _2_2 suffixes.
114
118
 
115
119
  Args:
116
- operations: List of operations for a single tag.
120
+ operations: List of all operations across all tags.
117
121
  """
118
122
  seen_methods: dict[str, int] = {}
119
123
  for op in operations:
@@ -156,6 +160,10 @@ class EndpointsEmitter:
156
160
  if self.visitor is None:
157
161
  self.visitor = EndpointVisitor(current_parsed_schemas) # Pass the (potentially defaulted) dict
158
162
 
163
+ # Deduplicate operation IDs globally BEFORE tag grouping to prevent
164
+ # multi-tag operations from accumulating _2_2 suffixes
165
+ self._deduplicate_operation_ids_globally(operations)
166
+
159
167
  tag_key_to_ops: dict[str, List[IROperation]] = {}
160
168
  tag_key_to_candidates: dict[str, List[str]] = {}
161
169
  for op in operations:
@@ -194,7 +202,7 @@ class EndpointsEmitter:
194
202
  # This will set current_file and reset+reinit import_collector's context
195
203
  self.context.set_current_file(str(file_path))
196
204
 
197
- self._deduplicate_operation_ids(ops_for_tag)
205
+ # Deduplication now done globally before tag grouping (see above)
198
206
 
199
207
  # EndpointVisitor must exist here due to check above
200
208
  if self.visitor is None:
@@ -108,3 +108,92 @@ def test_endpoints_emitter__duplicate_operation_ids__generates_unique_method_nam
108
108
  content = client_file.read_text()
109
109
  assert "async def get_feedback" in content
110
110
  assert "async def get_feedback_2" in content # Second method should have a suffix
111
+
112
+
113
+ def test_endpoints_emitter__multi_tag_duplicate_operation_ids__no_suffix_accumulation(
114
+ tmp_path: Path, mock_render_context: MagicMock
115
+ ) -> None:
116
+ """
117
+ Scenario:
118
+ EndpointsEmitter processes operations with duplicate IDs that have multiple tags.
119
+ Operations with multiple tags share the same IROperation object reference.
120
+
121
+ Expected Outcome:
122
+ Global deduplication should ensure each operation is renamed only ONCE,
123
+ preventing _2_2 suffix accumulation that occurred with per-tag deduplication.
124
+
125
+ Before fix: Multi-tag operations would get _2_2, _2_2_2 suffixes
126
+ After fix: Operations get at most _2 suffix, consistent across all tags
127
+ """
128
+ # Create two operations with IDs that sanitize to the same name,
129
+ # both with multiple tags to trigger the bug
130
+ op1 = IROperation(
131
+ operation_id="get_user", # snake_case
132
+ method=HTTPMethod.GET,
133
+ path="/user/{id}",
134
+ parameters=[],
135
+ responses=[
136
+ IRResponse(
137
+ status_code="200",
138
+ description="Success",
139
+ content={"application/json": IRSchema(name="User", type="object")},
140
+ )
141
+ ],
142
+ summary="Get user by ID",
143
+ description="Get user by ID",
144
+ tags=["Users", "Admin", "Internal"], # Multiple tags!
145
+ )
146
+
147
+ op2 = IROperation(
148
+ operation_id="getUser", # CamelCase - will sanitize to "get_user" (collision!)
149
+ method=HTTPMethod.GET,
150
+ path="/user",
151
+ parameters=[],
152
+ responses=[
153
+ IRResponse(
154
+ status_code="200",
155
+ description="Success",
156
+ content={"application/json": IRSchema(name="UserList", type="object")},
157
+ )
158
+ ],
159
+ summary="List users",
160
+ description="List all users",
161
+ tags=["Users", "Admin", "Internal"], # Same tags!
162
+ )
163
+
164
+ # Create spec
165
+ spec = IRSpec(
166
+ title="Test API",
167
+ version="1.0.0",
168
+ schemas={},
169
+ operations=[op1, op2],
170
+ servers=[],
171
+ )
172
+
173
+ # Generate client code
174
+ out_dir: Path = tmp_path / "out"
175
+ mock_render_context.parsed_schemas = spec.schemas
176
+
177
+ emitter = EndpointsEmitter(context=mock_render_context)
178
+ emitter.emit(spec.operations, str(out_dir))
179
+
180
+ # Verify: After global deduplication, the second operation should be renamed to get_user_2
181
+ # IMPORTANT: The operation_id should be consistent across ALL tag files
182
+ assert op2.operation_id == "getUser_2", f"Expected 'getUser_2', got '{op2.operation_id}'"
183
+
184
+ # Verify NO _2_2 suffix accumulation (the bug we're fixing)
185
+ assert "_2_2" not in op2.operation_id, f"Bug still present: {op2.operation_id} contains _2_2 suffix"
186
+ assert "_3" not in op2.operation_id, f"Bug still present: {op2.operation_id} contains _3 suffix"
187
+
188
+ # Check all tag files to ensure consistent naming
189
+ for tag in ["users", "admin", "internal"]:
190
+ client_file: Path = out_dir / "endpoints" / f"{tag}.py"
191
+ assert client_file.exists(), f"Missing file for tag '{tag}'"
192
+
193
+ content = client_file.read_text()
194
+ # Both files should have both methods with the same names
195
+ assert "async def get_user" in content, f"Missing get_user in {tag}"
196
+ assert "async def get_user_2" in content, f"Missing get_user_2 in {tag}"
197
+
198
+ # Ensure NO _2_2 suffixes appear in ANY file
199
+ assert "_2_2" not in content, f"File {tag}.py contains _2_2 suffix (bug present)"
File without changes
File without changes
File without changes
File without changes
File without changes