@typespec/http-client-python 0.28.1 → 0.28.3

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 (311) hide show
  1. package/dist/emitter/code-model.d.ts.map +1 -1
  2. package/dist/emitter/code-model.js +6 -6
  3. package/dist/emitter/code-model.js.map +1 -1
  4. package/dist/emitter/emitter.d.ts.map +1 -1
  5. package/dist/emitter/emitter.js +27 -28
  6. package/dist/emitter/emitter.js.map +1 -1
  7. package/dist/emitter/lib.d.ts +4 -1
  8. package/dist/emitter/lib.d.ts.map +1 -1
  9. package/dist/emitter/lib.js.map +1 -1
  10. package/dist/emitter/system-requirements.js +6 -4
  11. package/dist/emitter/system-requirements.js.map +1 -1
  12. package/dist/emitter/types.d.ts +2 -5
  13. package/dist/emitter/types.d.ts.map +1 -1
  14. package/dist/emitter/types.js +55 -58
  15. package/dist/emitter/types.js.map +1 -1
  16. package/dist/emitter/utils.d.ts.map +1 -1
  17. package/dist/emitter/utils.js +16 -17
  18. package/dist/emitter/utils.js.map +1 -1
  19. package/emitter/src/code-model.ts +6 -13
  20. package/emitter/src/emitter.ts +29 -31
  21. package/emitter/src/lib.ts +4 -0
  22. package/emitter/src/system-requirements.ts +4 -4
  23. package/emitter/src/types.ts +67 -57
  24. package/emitter/src/utils.ts +16 -18
  25. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  26. package/eng/scripts/Build-Packages.ps1 +62 -37
  27. package/eng/scripts/Check-GitChanges.ps1 +30 -3
  28. package/eng/scripts/Functions.ps1 +54 -15
  29. package/eng/scripts/Generate.ps1 +42 -8
  30. package/eng/scripts/Generation.psm1 +44 -15
  31. package/eng/scripts/Initialize-Repository.ps1 +29 -11
  32. package/eng/scripts/Test-Packages.ps1 +47 -31
  33. package/eng/scripts/ci/config/eslint-ci.config.mjs +54 -0
  34. package/eng/scripts/ci/dev_requirements.txt +1 -0
  35. package/eng/scripts/ci/format.ts +232 -2
  36. package/eng/scripts/ci/lint.ts +216 -20
  37. package/eng/scripts/ci/regenerate-common.ts +18 -14
  38. package/eng/scripts/ci/regenerate.ts +305 -68
  39. package/eng/scripts/ci/run-tests.ts +402 -0
  40. package/eng/scripts/ci/run_mypy.py +4 -3
  41. package/eng/scripts/ci/run_pylint.py +4 -3
  42. package/eng/scripts/ci/run_pyright.py +4 -3
  43. package/eng/scripts/ci/typecheck.ts +225 -0
  44. package/eng/scripts/ci/util.py +1 -1
  45. package/eng/scripts/ci/utils.ts +5 -5
  46. package/eng/scripts/setup/__pycache__/package_manager.cpython-311.pyc +0 -0
  47. package/eng/scripts/setup/__pycache__/venvtools.cpython-311.pyc +0 -0
  48. package/eng/scripts/setup/build.ts +1 -1
  49. package/eng/scripts/setup/build_pygen_wheel.py +1 -0
  50. package/eng/scripts/setup/install.py +1 -0
  51. package/eng/scripts/setup/prepare.py +1 -0
  52. package/eng/scripts/setup/prepare.ts +1 -1
  53. package/eng/scripts/setup/run_tsp.py +3 -3
  54. package/eng/scripts/setup/system-requirements.ts +8 -4
  55. package/eng/scripts/setup/venvtools.py +1 -0
  56. package/generator/build/lib/pygen/codegen/models/operation.py +9 -8
  57. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +157 -64
  58. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  59. package/generator/pygen/codegen/models/operation.py +9 -8
  60. package/generator/pygen/codegen/templates/model_base.py.jinja2 +157 -64
  61. package/package.json +48 -42
  62. package/eng/scripts/ci/run-ci.ts +0 -89
  63. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_commonproperties_async.py +0 -94
  64. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_largeheader_async.py +0 -30
  65. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_nonresource_async.py +0 -36
  66. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_operationtemplates_async.py +0 -205
  67. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_resource_async.py +0 -478
  68. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_access_async.py +0 -101
  69. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_header_async.py +0 -18
  70. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_path_async.py +0 -18
  71. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_query_async.py +0 -18
  72. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_default_value_async.py +0 -46
  73. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_initialization_async.py +0 -58
  74. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_location_async.py +0 -82
  75. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_deserialize_empty_string_as_null_async.py +0 -20
  76. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_flatten_async.py +0 -115
  77. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_hierrarchy_building_async.py +0 -53
  78. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_next_link_verb_async.py +0 -28
  79. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_override_async.py +0 -106
  80. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_usage_async.py +0 -38
  81. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_basic_async.py +0 -76
  82. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_rpc_async.py +0 -22
  83. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_standard_async.py +0 -39
  84. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_model_async.py +0 -33
  85. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_page_async.py +0 -80
  86. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_scalar_async.py +0 -41
  87. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_traits_async.py +0 -87
  88. package/generator/test/azure/mock_api_tests/asynctests/test_azure_encode_duration_async.py +0 -19
  89. package/generator/test/azure/mock_api_tests/asynctests/test_azure_example_basic_async.py +0 -30
  90. package/generator/test/azure/mock_api_tests/asynctests/test_azure_payload_pageable_async.py +0 -19
  91. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_method_subscription_id_async.py +0 -248
  92. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_async.py +0 -110
  93. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_shared_models_async.py +0 -132
  94. package/generator/test/azure/mock_api_tests/asynctests/test_azure_special_headers_client_request_id_async.py +0 -30
  95. package/generator/test/azure/mock_api_tests/asynctests/test_azure_versioning_previewversion_async.py +0 -53
  96. package/generator/test/azure/mock_api_tests/asynctests/test_client_namespace_async.py +0 -34
  97. package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py +0 -69
  98. package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_enum_conflict_async.py +0 -37
  99. package/generator/test/azure/mock_api_tests/asynctests/test_client_overload_async.py +0 -27
  100. package/generator/test/azure/mock_api_tests/asynctests/test_client_structure_async.py +0 -64
  101. package/generator/test/azure/mock_api_tests/asynctests/test_client_structure_clientoperationgroup_async.py +0 -31
  102. package/generator/test/azure/mock_api_tests/asynctests/test_encode_duration_async.py +0 -63
  103. package/generator/test/azure/mock_api_tests/asynctests/test_encode_numeric_async.py +0 -35
  104. package/generator/test/azure/mock_api_tests/asynctests/test_parameters_basic_async.py +0 -24
  105. package/generator/test/azure/mock_api_tests/asynctests/test_parameters_spread_async.py +0 -76
  106. package/generator/test/azure/mock_api_tests/asynctests/test_payload_content_negotiation_async.py +0 -37
  107. package/generator/test/azure/mock_api_tests/asynctests/test_payload_multipart_async.py +0 -216
  108. package/generator/test/azure/mock_api_tests/asynctests/test_resiliency_srv_driven_async.py +0 -130
  109. package/generator/test/azure/mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +0 -24
  110. package/generator/test/azure/mock_api_tests/asynctests/test_service_multi_service_async.py +0 -31
  111. package/generator/test/azure/mock_api_tests/asynctests/test_special_words_async.py +0 -71
  112. package/generator/test/azure/mock_api_tests/conftest.py +0 -207
  113. package/generator/test/azure/mock_api_tests/data/image.jpg +0 -0
  114. package/generator/test/azure/mock_api_tests/data/image.png +0 -0
  115. package/generator/test/azure/mock_api_tests/test_azure_arm_commonproperties.py +0 -89
  116. package/generator/test/azure/mock_api_tests/test_azure_arm_largeheader.py +0 -27
  117. package/generator/test/azure/mock_api_tests/test_azure_arm_nonresource.py +0 -34
  118. package/generator/test/azure/mock_api_tests/test_azure_arm_operationtemplates.py +0 -180
  119. package/generator/test/azure/mock_api_tests/test_azure_arm_resource.py +0 -436
  120. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_access.py +0 -92
  121. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_header.py +0 -17
  122. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_path.py +0 -17
  123. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_query.py +0 -17
  124. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_default_value.py +0 -42
  125. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_initialization.py +0 -51
  126. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_location.py +0 -70
  127. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_deserialize_empty_string_as_null.py +0 -19
  128. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_flatten.py +0 -104
  129. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_hierrarchy_building.py +0 -45
  130. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_next_link_verb.py +0 -27
  131. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_override.py +0 -102
  132. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_usage.py +0 -32
  133. package/generator/test/azure/mock_api_tests/test_azure_core_basic.py +0 -70
  134. package/generator/test/azure/mock_api_tests/test_azure_core_lro_rpc.py +0 -20
  135. package/generator/test/azure/mock_api_tests/test_azure_core_lro_standard.py +0 -32
  136. package/generator/test/azure/mock_api_tests/test_azure_core_model.py +0 -30
  137. package/generator/test/azure/mock_api_tests/test_azure_core_page.py +0 -71
  138. package/generator/test/azure/mock_api_tests/test_azure_core_scalar.py +0 -35
  139. package/generator/test/azure/mock_api_tests/test_azure_core_traits.py +0 -85
  140. package/generator/test/azure/mock_api_tests/test_azure_encode_duration.py +0 -18
  141. package/generator/test/azure/mock_api_tests/test_azure_example_basic.py +0 -29
  142. package/generator/test/azure/mock_api_tests/test_azure_payload_pageable.py +0 -18
  143. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_method_subscription_id.py +0 -235
  144. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service.py +0 -104
  145. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service_shared_models.py +0 -128
  146. package/generator/test/azure/mock_api_tests/test_azure_special_headers_client_request_id.py +0 -29
  147. package/generator/test/azure/mock_api_tests/test_azure_versioning_previewversion.py +0 -50
  148. package/generator/test/azure/mock_api_tests/test_clear_output_folder.py +0 -23
  149. package/generator/test/azure/mock_api_tests/test_client_namespace.py +0 -32
  150. package/generator/test/azure/mock_api_tests/test_client_naming.py +0 -57
  151. package/generator/test/azure/mock_api_tests/test_client_naming_enum_conflict.py +0 -35
  152. package/generator/test/azure/mock_api_tests/test_client_overload.py +0 -25
  153. package/generator/test/azure/mock_api_tests/test_client_structure.py +0 -60
  154. package/generator/test/azure/mock_api_tests/test_client_structure_clientoperationgroup.py +0 -29
  155. package/generator/test/azure/mock_api_tests/test_encode_duration.py +0 -60
  156. package/generator/test/azure/mock_api_tests/test_encode_numeric.py +0 -31
  157. package/generator/test/azure/mock_api_tests/test_model_base_flatten_compatibility.py +0 -251
  158. package/generator/test/azure/mock_api_tests/test_parameters_basic.py +0 -22
  159. package/generator/test/azure/mock_api_tests/test_parameters_spread.py +0 -66
  160. package/generator/test/azure/mock_api_tests/test_payload_content_negotiation.py +0 -33
  161. package/generator/test/azure/mock_api_tests/test_payload_multipart.py +0 -198
  162. package/generator/test/azure/mock_api_tests/test_resiliency_srv_driven.py +0 -124
  163. package/generator/test/azure/mock_api_tests/test_serialization_encoded_name_json.py +0 -21
  164. package/generator/test/azure/mock_api_tests/test_service_multi_service.py +0 -29
  165. package/generator/test/azure/mock_api_tests/test_special_words.py +0 -63
  166. package/generator/test/azure/requirements.txt +0 -125
  167. package/generator/test/azure/tox.ini +0 -64
  168. package/generator/test/data/image.jpg +0 -0
  169. package/generator/test/data/image.png +0 -0
  170. package/generator/test/dev_requirements.txt +0 -8
  171. package/generator/test/generic_mock_api_tests/asynctests/test_authentication_async.py +0 -140
  172. package/generator/test/generic_mock_api_tests/asynctests/test_encode_array_async.py +0 -139
  173. package/generator/test/generic_mock_api_tests/asynctests/test_encode_bytes_async.py +0 -132
  174. package/generator/test/generic_mock_api_tests/asynctests/test_encode_datetime_async.py +0 -127
  175. package/generator/test/generic_mock_api_tests/asynctests/test_headasboolean_async.py +0 -35
  176. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_body_optionality_async.py +0 -30
  177. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_collection_format_async.py +0 -38
  178. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_path_async.py +0 -24
  179. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_query_async.py +0 -18
  180. package/generator/test/generic_mock_api_tests/asynctests/test_payload_json_merge_patch_async.py +0 -98
  181. package/generator/test/generic_mock_api_tests/asynctests/test_payload_media_type_async.py +0 -27
  182. package/generator/test/generic_mock_api_tests/asynctests/test_payload_pageable_async.py +0 -134
  183. package/generator/test/generic_mock_api_tests/asynctests/test_payload_xml_async.py +0 -150
  184. package/generator/test/generic_mock_api_tests/asynctests/test_response_status_code_range_async.py +0 -38
  185. package/generator/test/generic_mock_api_tests/asynctests/test_routes_async.py +0 -331
  186. package/generator/test/generic_mock_api_tests/asynctests/test_server_endpoint_not_defined_async.py +0 -18
  187. package/generator/test/generic_mock_api_tests/asynctests/test_server_path_multiple_async.py +0 -25
  188. package/generator/test/generic_mock_api_tests/asynctests/test_server_path_single_async.py +0 -18
  189. package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_not_versioned_async.py +0 -28
  190. package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_versioned_async.py +0 -34
  191. package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_conditional_request_async.py +0 -38
  192. package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_repeatability_async.py +0 -19
  193. package/generator/test/generic_mock_api_tests/asynctests/test_specs_documentation_async.py +0 -59
  194. package/generator/test/generic_mock_api_tests/asynctests/test_streaming_jsonl_async.py +0 -27
  195. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_array_async.py +0 -127
  196. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_dictionary_async.py +0 -98
  197. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_extensible_async.py +0 -25
  198. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_fixed_async.py +0 -27
  199. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_file_async.py +0 -59
  200. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_empty_async.py +0 -32
  201. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_enum_discriminator_async.py +0 -70
  202. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_nested_discriminator_async.py +0 -85
  203. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_not_discriminated_async.py +0 -34
  204. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_recursive_async.py +0 -34
  205. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_single_discriminator_async.py +0 -67
  206. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_usage_async.py +0 -32
  207. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_visibility_async.py +0 -47
  208. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_additionalproperties_async.py +0 -353
  209. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py +0 -110
  210. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_optional_async.py +0 -197
  211. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_valuetypes_async.py +0 -315
  212. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_scalar_async.py +0 -60
  213. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_union_async.py +0 -90
  214. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_added_async.py +0 -36
  215. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_made_optional_async.py +0 -21
  216. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_removed_async.py +0 -39
  217. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_renamed_from_async.py +0 -29
  218. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_return_type_changed_from_async.py +0 -18
  219. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_type_changed_from_async.py +0 -22
  220. package/generator/test/generic_mock_api_tests/conftest.py +0 -75
  221. package/generator/test/generic_mock_api_tests/data/image.jpg +0 -0
  222. package/generator/test/generic_mock_api_tests/data/image.png +0 -0
  223. package/generator/test/generic_mock_api_tests/test_authentication.py +0 -130
  224. package/generator/test/generic_mock_api_tests/test_encode_array.py +0 -126
  225. package/generator/test/generic_mock_api_tests/test_encode_bytes.py +0 -128
  226. package/generator/test/generic_mock_api_tests/test_encode_datetime.py +0 -123
  227. package/generator/test/generic_mock_api_tests/test_headasboolean.py +0 -33
  228. package/generator/test/generic_mock_api_tests/test_parameters_body_optionality.py +0 -27
  229. package/generator/test/generic_mock_api_tests/test_parameters_collection_format.py +0 -33
  230. package/generator/test/generic_mock_api_tests/test_parameters_path.py +0 -22
  231. package/generator/test/generic_mock_api_tests/test_parameters_query.py +0 -17
  232. package/generator/test/generic_mock_api_tests/test_payload_json_merge_patch.py +0 -93
  233. package/generator/test/generic_mock_api_tests/test_payload_media_type.py +0 -25
  234. package/generator/test/generic_mock_api_tests/test_payload_pageable.py +0 -99
  235. package/generator/test/generic_mock_api_tests/test_payload_xml.py +0 -135
  236. package/generator/test/generic_mock_api_tests/test_response_status_code_range.py +0 -36
  237. package/generator/test/generic_mock_api_tests/test_routes.py +0 -285
  238. package/generator/test/generic_mock_api_tests/test_server_endpoint_not_defined.py +0 -17
  239. package/generator/test/generic_mock_api_tests/test_server_path_multiple.py +0 -21
  240. package/generator/test/generic_mock_api_tests/test_server_path_single.py +0 -17
  241. package/generator/test/generic_mock_api_tests/test_server_versions_not_versioned.py +0 -25
  242. package/generator/test/generic_mock_api_tests/test_server_versions_versioned.py +0 -30
  243. package/generator/test/generic_mock_api_tests/test_special_headers_conditional_request.py +0 -34
  244. package/generator/test/generic_mock_api_tests/test_special_headers_repeatability.py +0 -18
  245. package/generator/test/generic_mock_api_tests/test_specs_documentation.py +0 -51
  246. package/generator/test/generic_mock_api_tests/test_streaming_jsonl.py +0 -25
  247. package/generator/test/generic_mock_api_tests/test_typetest_array.py +0 -111
  248. package/generator/test/generic_mock_api_tests/test_typetest_dictionary.py +0 -86
  249. package/generator/test/generic_mock_api_tests/test_typetest_enum_extensible.py +0 -23
  250. package/generator/test/generic_mock_api_tests/test_typetest_enum_fixed.py +0 -25
  251. package/generator/test/generic_mock_api_tests/test_typetest_file.py +0 -52
  252. package/generator/test/generic_mock_api_tests/test_typetest_model_empty.py +0 -29
  253. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_enum_discriminator.py +0 -58
  254. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_nested_discriminator.py +0 -79
  255. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_not_discriminated.py +0 -31
  256. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_recursive.py +0 -32
  257. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_single_discriminator.py +0 -60
  258. package/generator/test/generic_mock_api_tests/test_typetest_model_usage.py +0 -28
  259. package/generator/test/generic_mock_api_tests/test_typetest_model_visibility.py +0 -40
  260. package/generator/test/generic_mock_api_tests/test_typetest_property_additionalproperties.py +0 -314
  261. package/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py +0 -102
  262. package/generator/test/generic_mock_api_tests/test_typetest_property_optional.py +0 -174
  263. package/generator/test/generic_mock_api_tests/test_typetest_property_valuetypes.py +0 -286
  264. package/generator/test/generic_mock_api_tests/test_typetest_scalar.py +0 -53
  265. package/generator/test/generic_mock_api_tests/test_typetest_union.py +0 -80
  266. package/generator/test/generic_mock_api_tests/test_typetest_union_discriminated.py +0 -290
  267. package/generator/test/generic_mock_api_tests/test_versioning_added.py +0 -33
  268. package/generator/test/generic_mock_api_tests/test_versioning_made_optional.py +0 -20
  269. package/generator/test/generic_mock_api_tests/test_versioning_removed.py +0 -37
  270. package/generator/test/generic_mock_api_tests/test_versioning_renamed_from.py +0 -27
  271. package/generator/test/generic_mock_api_tests/test_versioning_return_type_changed_from.py +0 -17
  272. package/generator/test/generic_mock_api_tests/test_versioning_type_changed_from.py +0 -21
  273. package/generator/test/unbranded/mock_api_tests/asynctests/test_auth_flow_async.py +0 -19
  274. package/generator/test/unbranded/mock_api_tests/asynctests/test_encode_duration_async.py +0 -63
  275. package/generator/test/unbranded/mock_api_tests/asynctests/test_encode_numeric_async.py +0 -35
  276. package/generator/test/unbranded/mock_api_tests/asynctests/test_parameters_basic_async.py +0 -24
  277. package/generator/test/unbranded/mock_api_tests/asynctests/test_parameters_spread_async.py +0 -76
  278. package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_content_negotiation_async.py +0 -37
  279. package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_multipart_async.py +0 -218
  280. package/generator/test/unbranded/mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +0 -24
  281. package/generator/test/unbranded/mock_api_tests/asynctests/test_special_words_async.py +0 -73
  282. package/generator/test/unbranded/mock_api_tests/asynctests/test_unbranded_async.py +0 -24
  283. package/generator/test/unbranded/mock_api_tests/conftest.py +0 -91
  284. package/generator/test/unbranded/mock_api_tests/data/image.jpg +0 -0
  285. package/generator/test/unbranded/mock_api_tests/data/image.png +0 -0
  286. package/generator/test/unbranded/mock_api_tests/test_auth_flow.py +0 -17
  287. package/generator/test/unbranded/mock_api_tests/test_encode_duration.py +0 -60
  288. package/generator/test/unbranded/mock_api_tests/test_encode_numeric.py +0 -32
  289. package/generator/test/unbranded/mock_api_tests/test_parameters_basic.py +0 -22
  290. package/generator/test/unbranded/mock_api_tests/test_parameters_spread.py +0 -66
  291. package/generator/test/unbranded/mock_api_tests/test_payload_content_negotiation.py +0 -33
  292. package/generator/test/unbranded/mock_api_tests/test_payload_multipart.py +0 -200
  293. package/generator/test/unbranded/mock_api_tests/test_serialization_encoded_name_json.py +0 -22
  294. package/generator/test/unbranded/mock_api_tests/test_special_words.py +0 -66
  295. package/generator/test/unbranded/mock_api_tests/test_unbranded.py +0 -65
  296. package/generator/test/unbranded/requirements.txt +0 -69
  297. package/generator/test/unbranded/tox.ini +0 -64
  298. package/generator/test/unittests/conftest.py +0 -15
  299. package/generator/test/unittests/requirements.txt +0 -3
  300. package/generator/test/unittests/test_enums.py +0 -89
  301. package/generator/test/unittests/test_model_base_serialization.py +0 -4906
  302. package/generator/test/unittests/test_model_base_xml_serialization.py +0 -1239
  303. package/generator/test/unittests/test_name_converter.py +0 -35
  304. package/generator/test/unittests/test_optional_return_type.py +0 -268
  305. package/generator/test/unittests/test_parameter_ordering.py +0 -104
  306. package/generator/test/unittests/test_sort_schema.py +0 -93
  307. package/generator/test/unittests/tox.ini +0 -5
  308. /package/eng/scripts/ci/{mypy.ini → config/mypy.ini} +0 -0
  309. /package/eng/scripts/ci/{pylintrc → config/pylintrc} +0 -0
  310. /package/eng/scripts/ci/{pyproject.toml → config/pyproject.toml} +0 -0
  311. /package/eng/scripts/ci/{pyrightconfig.json → config/pyrightconfig.json} +0 -0
@@ -1,8 +1,8 @@
1
1
  /* eslint-disable no-console */
2
- import chalk from "chalk";
3
2
  import { execFile } from "child_process";
4
3
  import { existsSync } from "fs";
5
4
  import { dirname, join, resolve } from "path";
5
+ import pc from "picocolors";
6
6
  import process from "process";
7
7
  import { fileURLToPath } from "url";
8
8
  import { parseArgs, promisify } from "util";
@@ -21,11 +21,11 @@ export async function executeCommand(command: string, args: string[]) {
21
21
  const execFileAsync = promisify(execFile);
22
22
  try {
23
23
  await execFileAsync(command, args, { shell: true });
24
- console.log(chalk.green(`${command} passed`));
24
+ console.log(pc.green(`${command} passed`));
25
25
  } catch (err: any) {
26
- console.error(chalk.red(`Error executing ${command}`));
27
- if (err.stdout) console.error(chalk.yellow("STDOUT:"), err.stdout);
28
- if (err.stderr) console.error(chalk.yellow("STDERR:"), err.stderr);
26
+ console.error(pc.red(`Error executing ${command}`));
27
+ if (err.stdout) console.error(pc.yellow("STDOUT:"), err.stdout);
28
+ if (err.stderr) console.error(pc.yellow("STDERR:"), err.stderr);
29
29
  process.exit(1);
30
30
  }
31
31
  }
@@ -4,7 +4,7 @@ import { runPython3 } from "./run-python3.js";
4
4
  async function main() {
5
5
  await runPython3("./eng/scripts/setup/build_pygen_wheel.py");
6
6
  // remove the venv_build_wheel directory
7
- exec("rimraf ./venv_build_wheel", (error, stdout, stderr) => {
7
+ exec("rimraf ./venv_build_wheel", (error, stdout, _stderr) => {
8
8
  if (error) {
9
9
  console.error(`Error executing command: ${error.message}`); // eslint-disable-line no-console
10
10
  return;
@@ -25,6 +25,7 @@ from pathlib import Path
25
25
  from venvtools import python_run
26
26
  from package_manager import install_packages, create_venv_with_package_manager
27
27
 
28
+ # eng/scripts/setup/build_pygen_wheel.py -> need to go up 4 levels to get to package root
28
29
  _ROOT_DIR = Path(__file__).parent.parent.parent.parent
29
30
 
30
31
 
@@ -38,6 +38,7 @@ except (ImportError, ModuleNotFoundError):
38
38
 
39
39
  from pathlib import Path
40
40
 
41
+ # eng/scripts/setup/install.py -> need to go up 4 levels to get to package root
41
42
  _ROOT_DIR = Path(__file__).parent.parent.parent.parent
42
43
 
43
44
 
@@ -15,6 +15,7 @@ if not sys.version_info >= (3, 9, 0):
15
15
  from pathlib import Path
16
16
  from package_manager import create_venv_with_package_manager, install_packages
17
17
 
18
+ # eng/scripts/setup/prepare.py -> need to go up 4 levels to get to package root
18
19
  _ROOT_DIR = Path(__file__).parent.parent.parent.parent
19
20
 
20
21
 
@@ -3,7 +3,7 @@ import { runPython3 } from "./run-python3.js";
3
3
  async function main() {
4
4
  try {
5
5
  await runPython3("./eng/scripts/setup/prepare.py");
6
- } catch (error) {
6
+ } catch {
7
7
  console.log("No Python found on your local environment. We will use Pyodide instead."); // eslint-disable-line no-console
8
8
  }
9
9
  }
@@ -4,12 +4,12 @@
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
6
  import sys
7
- import venv
8
7
  import logging
9
8
  from pathlib import Path
10
9
  from pygen import preprocess, codegen
11
10
  from pygen.utils import parse_args
12
11
 
12
+ # eng/scripts/setup/run_tsp.py -> need to go up 4 levels to get to package root
13
13
  _ROOT_DIR = Path(__file__).parent.parent.parent.parent
14
14
 
15
15
  _LOGGER = logging.getLogger(__name__)
@@ -20,8 +20,8 @@ if __name__ == "__main__":
20
20
 
21
21
  assert venv_preexists # Otherwise install was not done
22
22
 
23
- env_builder = venv.EnvBuilder(with_pip=True)
24
- venv_context = env_builder.ensure_directories(venv_path)
23
+ # Don't use EnvBuilder.ensure_directories() - it causes race conditions
24
+ # when multiple processes run in parallel. The venv already exists.
25
25
 
26
26
  if "--debug" in sys.argv or "--debug=true" in sys.argv:
27
27
  try:
@@ -15,8 +15,12 @@ const execute = (
15
15
  options.onCreate(cp);
16
16
  }
17
17
 
18
- options.onStdOutData && cp.stdout.on("data", options.onStdOutData);
19
- options.onStdErrData && cp.stderr.on("data", options.onStdErrData);
18
+ if (options.onStdOutData) {
19
+ cp.stdout.on("data", options.onStdOutData);
20
+ }
21
+ if (options.onStdErrData) {
22
+ cp.stderr.on("data", options.onStdErrData);
23
+ }
20
24
 
21
25
  let err = "";
22
26
  let out = "";
@@ -33,7 +37,7 @@ const execute = (
33
37
  cp.on("error", (err) => {
34
38
  reject(err);
35
39
  });
36
- cp.on("close", (code, signal) =>
40
+ cp.on("close", (code, _signal) =>
37
41
  resolve({
38
42
  stdout: out,
39
43
  stderr: err,
@@ -118,7 +122,7 @@ const tryPython = async (
118
122
  `"${PRINT_PYTHON_VERSION_SCRIPT}"`,
119
123
  ]);
120
124
  return validateVersionRequirement(resolution, result.stdout.trim(), requirement);
121
- } catch (e) {
125
+ } catch {
122
126
  return {
123
127
  error: true,
124
128
  ...resolution,
@@ -9,6 +9,7 @@ import sys
9
9
  from pathlib import Path
10
10
 
11
11
 
12
+ # eng/scripts/setup/venvtools.py -> need to go up 4 levels to get to package root
12
13
  _ROOT_DIR = Path(__file__).parent.parent.parent.parent
13
14
 
14
15
 
@@ -449,21 +449,22 @@ class OperationBase( # pylint: disable=too-many-public-methods,too-many-instanc
449
449
  file_import.add_import("json", ImportType.STDLIB)
450
450
  if self.enable_import_deserialize_xml:
451
451
  file_import.add_submodule_import(relative_path, "_deserialize_xml", ImportType.LOCAL)
452
- elif self.need_deserialize:
452
+ if any(
453
+ r.type
454
+ and not isinstance(r.type, BinaryIteratorType)
455
+ and not xml_serializable(str(r.default_content_type))
456
+ for r in self.responses
457
+ ):
453
458
  file_import.add_submodule_import(relative_path, "_deserialize", ImportType.LOCAL)
454
459
  if self.default_error_deserialization(serialize_namespace) or self.non_default_errors:
455
- xml_non_default_errors = any(
456
- xml_serializable(str(e.default_content_type)) for e in self.non_default_errors
457
- )
458
460
  try:
459
461
  default_error = next(e for e in self.exceptions if "default" in e.status_codes and e.type)
460
462
  except StopIteration:
461
463
  default_error = None
462
- if xml_non_default_errors or (
463
- default_error and xml_serializable(str(default_error.default_content_type))
464
- ):
464
+ all_errors = list(self.non_default_errors) + ([default_error] if default_error else [])
465
+ if any(xml_serializable(str(e.default_content_type)) for e in all_errors):
465
466
  file_import.add_submodule_import(relative_path, "_failsafe_deserialize_xml", ImportType.LOCAL)
466
- else:
467
+ if any(not xml_serializable(str(e.default_content_type)) for e in all_errors):
467
468
  file_import.add_submodule_import(relative_path, "_failsafe_deserialize", ImportType.LOCAL)
468
469
  return file_import
469
470
 
@@ -622,57 +622,9 @@ class Model(_MyMutableMapping):
622
622
  for rest_field in self._attr_to_rest_field.values()
623
623
  if rest_field._default is not _UNSET
624
624
  }
625
- if args: # pylint: disable=too-many-nested-blocks
625
+ if args:
626
626
  if isinstance(args[0], ET.Element):
627
- existed_attr_keys = []
628
- model_meta = getattr(self, "_xml", {})
629
-
630
- for rf in self._attr_to_rest_field.values():
631
- prop_meta = getattr(rf, "_xml", {})
632
- xml_name = prop_meta.get("name", rf._rest_name)
633
- xml_ns = prop_meta.get("ns", model_meta.get("ns", None))
634
- if xml_ns:
635
- xml_name = "{" + xml_ns + "}" + xml_name
636
-
637
- # attribute
638
- if prop_meta.get("attribute", False) and args[0].get(xml_name) is not None:
639
- existed_attr_keys.append(xml_name)
640
- dict_to_pass[rf._rest_name] = _deserialize(rf._type, args[0].get(xml_name))
641
- continue
642
-
643
- # unwrapped element is array
644
- if prop_meta.get("unwrapped", False):
645
- # unwrapped array could either use prop items meta/prop meta
646
- if prop_meta.get("itemsName"):
647
- xml_name = prop_meta.get("itemsName")
648
- xml_ns = prop_meta.get("itemNs")
649
- if xml_ns:
650
- xml_name = "{" + xml_ns + "}" + xml_name
651
- items = args[0].findall(xml_name) # pyright: ignore
652
- if len(items) > 0:
653
- existed_attr_keys.append(xml_name)
654
- dict_to_pass[rf._rest_name] = _deserialize(rf._type, items)
655
- elif not rf._is_optional:
656
- existed_attr_keys.append(xml_name)
657
- dict_to_pass[rf._rest_name] = []
658
- continue
659
-
660
- # text element is primitive type
661
- if prop_meta.get("text", False):
662
- if args[0].text is not None:
663
- dict_to_pass[rf._rest_name] = _deserialize(rf._type, args[0].text)
664
- continue
665
-
666
- # wrapped element could be normal property or array, it should only have one element
667
- item = args[0].find(xml_name)
668
- if item is not None:
669
- existed_attr_keys.append(xml_name)
670
- dict_to_pass[rf._rest_name] = _deserialize(rf._type, item)
671
-
672
- # rest thing is additional properties
673
- for e in args[0]:
674
- if e.tag not in existed_attr_keys:
675
- dict_to_pass[e.tag] = _convert_element(e)
627
+ dict_to_pass.update(self._init_from_xml(args[0]))
676
628
  else:
677
629
  dict_to_pass.update(
678
630
  {k: _create_value(_get_rest_field(self._attr_to_rest_field, k), v) for k, v in args[0].items()}
@@ -691,6 +643,69 @@ class Model(_MyMutableMapping):
691
643
  )
692
644
  super().__init__(dict_to_pass)
693
645
 
646
+ def _init_from_xml(self, element: ET.Element) -> dict[str, typing.Any]:
647
+ """Deserialize an XML element into a dict mapping rest field names to values.
648
+
649
+ :param ET.Element element: The XML element to deserialize from.
650
+ :returns: A dictionary of rest_name to deserialized value pairs.
651
+ :rtype: dict
652
+ """
653
+ result: dict[str, typing.Any] = {}
654
+ model_meta = getattr(self, "_xml", {})
655
+ existed_attr_keys: list[str] = []
656
+
657
+ for rf in self._attr_to_rest_field.values():
658
+ prop_meta = getattr(rf, "_xml", {})
659
+ xml_name = prop_meta.get("name", rf._rest_name)
660
+ xml_ns = _resolve_xml_ns(prop_meta, model_meta)
661
+ if xml_ns:
662
+ xml_name = "{" + xml_ns + "}" + xml_name
663
+
664
+ # attribute
665
+ if prop_meta.get("attribute", False) and element.get(xml_name) is not None:
666
+ existed_attr_keys.append(xml_name)
667
+ result[rf._rest_name] = _deserialize(rf._type, element.get(xml_name))
668
+ continue
669
+
670
+ # unwrapped element is array
671
+ if prop_meta.get("unwrapped", False):
672
+ # unwrapped array could either use prop items meta/prop meta
673
+ _items_name = prop_meta.get("itemsName")
674
+ if _items_name:
675
+ xml_name = _items_name
676
+ _items_ns = prop_meta.get("itemsNs")
677
+ if _items_ns is not None:
678
+ xml_ns = _items_ns
679
+ if xml_ns:
680
+ xml_name = "{" + xml_ns + "}" + xml_name
681
+ items = element.findall(xml_name) # pyright: ignore
682
+ if len(items) > 0:
683
+ existed_attr_keys.append(xml_name)
684
+ result[rf._rest_name] = _deserialize(rf._type, items)
685
+ elif not rf._is_optional:
686
+ existed_attr_keys.append(xml_name)
687
+ result[rf._rest_name] = []
688
+ continue
689
+
690
+ # text element is primitive type
691
+ if prop_meta.get("text", False):
692
+ if element.text is not None:
693
+ result[rf._rest_name] = _deserialize(rf._type, element.text)
694
+ continue
695
+
696
+ # wrapped element could be normal property or array, it should only have one element
697
+ item = element.find(xml_name)
698
+ if item is not None:
699
+ existed_attr_keys.append(xml_name)
700
+ result[rf._rest_name] = _deserialize(rf._type, item)
701
+
702
+ # rest thing is additional properties
703
+ for e in element:
704
+ if e.tag not in existed_attr_keys:
705
+ result[e.tag] = _convert_element(e)
706
+
707
+ return result
708
+
694
709
  def copy(self) -> "Model":
695
710
  return Model(self.__dict__)
696
711
 
@@ -761,7 +776,7 @@ class Model(_MyMutableMapping):
761
776
  model_meta = getattr(cls, "_xml", {})
762
777
  prop_meta = getattr(discriminator, "_xml", {})
763
778
  xml_name = prop_meta.get("name", discriminator._rest_name)
764
- xml_ns = prop_meta.get("ns", model_meta.get("ns", None))
779
+ xml_ns = _resolve_xml_ns(prop_meta, model_meta)
765
780
  if xml_ns:
766
781
  xml_name = "{" + xml_ns + "}" + xml_name
767
782
 
@@ -1243,6 +1258,58 @@ def serialize_xml(model: Model, exclude_readonly: bool = False) -> str:
1243
1258
  return ET.tostring(_get_element(model, exclude_readonly), encoding="unicode") # type: ignore
1244
1259
 
1245
1260
 
1261
+ def _get_xml_ns(meta: dict[str, typing.Any]) -> typing.Optional[str]:
1262
+ """Return the XML namespace from a metadata dict, checking both 'ns' (old-style) and 'namespace' (DPG) keys.
1263
+
1264
+ :param dict meta: The metadata dictionary to extract namespace from.
1265
+ :returns: The namespace string if 'ns' or 'namespace' key is present, None otherwise.
1266
+ :rtype: str or None
1267
+ """
1268
+ ns = meta.get("ns")
1269
+ if ns is None:
1270
+ ns = meta.get("namespace")
1271
+ return ns
1272
+
1273
+
1274
+ def _resolve_xml_ns(
1275
+ prop_meta: dict[str, typing.Any], model_meta: typing.Optional[dict[str, typing.Any]] = None
1276
+ ) -> typing.Optional[str]:
1277
+ """Resolve XML namespace for a property, falling back to model namespace when appropriate.
1278
+
1279
+ Checks the property metadata first; if no namespace is found and the model does not declare
1280
+ an explicit prefix, falls back to the model-level namespace.
1281
+
1282
+ :param dict prop_meta: The property metadata dictionary.
1283
+ :param dict model_meta: The model metadata dictionary, used as fallback.
1284
+ :returns: The resolved namespace string, or None.
1285
+ :rtype: str or None
1286
+ """
1287
+ ns = _get_xml_ns(prop_meta)
1288
+ if ns is None and model_meta is not None and not model_meta.get("prefix"):
1289
+ ns = _get_xml_ns(model_meta)
1290
+ return ns
1291
+
1292
+
1293
+ def _set_xml_attribute(
1294
+ element: ET.Element, name: str, value: typing.Any, prop_meta: dict[str, typing.Any]
1295
+ ) -> None:
1296
+ """Set an XML attribute on an element, handling namespace prefix registration.
1297
+
1298
+ :param ET.Element element: The element to set the attribute on.
1299
+ :param str name: The default attribute name (wire name).
1300
+ :param any value: The attribute value.
1301
+ :param dict prop_meta: The property metadata dictionary.
1302
+ """
1303
+ xml_name = prop_meta.get("name", name)
1304
+ _attr_ns = _get_xml_ns(prop_meta)
1305
+ if _attr_ns:
1306
+ _attr_prefix = prop_meta.get("prefix")
1307
+ if _attr_prefix:
1308
+ _safe_register_namespace(_attr_prefix, _attr_ns)
1309
+ xml_name = "{" + _attr_ns + "}" + xml_name
1310
+ element.set(xml_name, _get_primitive_type_value(value))
1311
+
1312
+
1246
1313
  def _get_element(
1247
1314
  o: typing.Any,
1248
1315
  exclude_readonly: bool = False,
@@ -1254,10 +1321,16 @@ def _get_element(
1254
1321
 
1255
1322
  # if prop is a model, then use the prop element directly, else generate a wrapper of model
1256
1323
  if wrapped_element is None:
1324
+ # When serializing as an array item (parent_meta is set), check if the parent has an
1325
+ # explicit itemsName. This ensures correct element names for unwrapped arrays (where
1326
+ # the element tag is the property/items name, not the model type name).
1327
+ _items_name = parent_meta.get("itemsName") if parent_meta is not None else None
1328
+ element_name = _items_name if _items_name else (model_meta.get("name") or o.__class__.__name__)
1329
+ _model_ns = _get_xml_ns(model_meta)
1257
1330
  wrapped_element = _create_xml_element(
1258
- model_meta.get("name", o.__class__.__name__),
1331
+ element_name,
1259
1332
  model_meta.get("prefix"),
1260
- model_meta.get("ns"),
1333
+ _model_ns,
1261
1334
  )
1262
1335
 
1263
1336
  readonly_props = []
@@ -1279,7 +1352,9 @@ def _get_element(
1279
1352
  # additional properties will not have rest field, use the wire name as xml name
1280
1353
  prop_meta = {"name": k}
1281
1354
 
1282
- # if no ns for prop, use model's
1355
+ # Propagate model namespace to properties only for old-style "ns"-keyed models.
1356
+ # DPG-generated models use the "namespace" key and explicitly declare namespace on
1357
+ # each property that needs it, so propagation is intentionally skipped for them.
1283
1358
  if prop_meta.get("ns") is None and model_meta.get("ns"):
1284
1359
  prop_meta["ns"] = model_meta.get("ns")
1285
1360
  prop_meta["prefix"] = model_meta.get("prefix")
@@ -1291,12 +1366,7 @@ def _get_element(
1291
1366
  # text could only set on primitive type
1292
1367
  wrapped_element.text = _get_primitive_type_value(v)
1293
1368
  elif prop_meta.get("attribute", False):
1294
- xml_name = prop_meta.get("name", k)
1295
- if prop_meta.get("ns"):
1296
- ET.register_namespace(prop_meta.get("prefix"), prop_meta.get("ns")) # pyright: ignore
1297
- xml_name = "{" + prop_meta.get("ns") + "}" + xml_name # pyright: ignore
1298
- # attribute should be primitive type
1299
- wrapped_element.set(xml_name, _get_primitive_type_value(v))
1369
+ _set_xml_attribute(wrapped_element, k, v, prop_meta)
1300
1370
  else:
1301
1371
  # other wrapped prop element
1302
1372
  wrapped_element.append(_get_wrapped_element(v, exclude_readonly, prop_meta))
@@ -1305,6 +1375,7 @@ def _get_element(
1305
1375
  return [_get_element(x, exclude_readonly, parent_meta) for x in o] # type: ignore
1306
1376
  if isinstance(o, dict):
1307
1377
  result = []
1378
+ _dict_ns = _get_xml_ns(parent_meta) if parent_meta else None
1308
1379
  for k, v in o.items():
1309
1380
  result.append(
1310
1381
  _get_wrapped_element(
@@ -1312,7 +1383,7 @@ def _get_element(
1312
1383
  exclude_readonly,
1313
1384
  {
1314
1385
  "name": k,
1315
- "ns": parent_meta.get("ns") if parent_meta else None,
1386
+ "ns": _dict_ns,
1316
1387
  "prefix": parent_meta.get("prefix") if parent_meta else None,
1317
1388
  },
1318
1389
  )
@@ -1321,13 +1392,16 @@ def _get_element(
1321
1392
 
1322
1393
  # primitive case need to create element based on parent_meta
1323
1394
  if parent_meta:
1395
+ _items_ns = parent_meta.get("itemsNs")
1396
+ if _items_ns is None:
1397
+ _items_ns = _get_xml_ns(parent_meta)
1324
1398
  return _get_wrapped_element(
1325
1399
  o,
1326
1400
  exclude_readonly,
1327
1401
  {
1328
1402
  "name": parent_meta.get("itemsName", parent_meta.get("name")),
1329
1403
  "prefix": parent_meta.get("itemsPrefix", parent_meta.get("prefix")),
1330
- "ns": parent_meta.get("itemsNs", parent_meta.get("ns")),
1404
+ "ns": _items_ns,
1331
1405
  },
1332
1406
  )
1333
1407
 
@@ -1339,8 +1413,9 @@ def _get_wrapped_element(
1339
1413
  exclude_readonly: bool,
1340
1414
  meta: typing.Optional[dict[str, typing.Any]],
1341
1415
  ) -> ET.Element:
1416
+ _meta_ns = _get_xml_ns(meta) if meta else None
1342
1417
  wrapped_element = _create_xml_element(
1343
- meta.get("name") if meta else None, meta.get("prefix") if meta else None, meta.get("ns") if meta else None
1418
+ meta.get("name") if meta else None, meta.get("prefix") if meta else None, _meta_ns
1344
1419
  )
1345
1420
  if isinstance(v, (dict, list)):
1346
1421
  wrapped_element.extend(_get_element(v, exclude_readonly, meta))
@@ -1361,11 +1436,29 @@ def _get_primitive_type_value(v) -> str:
1361
1436
  return str(v)
1362
1437
 
1363
1438
 
1439
+ def _safe_register_namespace(prefix: str, ns: str) -> None:
1440
+ """Register an XML namespace prefix, handling reserved prefix patterns.
1441
+
1442
+ Some prefixes (e.g. 'ns2') match Python's reserved 'ns\\d+' pattern used for
1443
+ auto-generated prefixes, causing register_namespace to raise ValueError.
1444
+ Falls back to directly registering in the internal namespace map.
1445
+
1446
+ :param str prefix: The namespace prefix to register.
1447
+ :param str ns: The namespace URI.
1448
+ """
1449
+ try:
1450
+ ET.register_namespace(prefix, ns)
1451
+ except ValueError:
1452
+ _ns_map = getattr(ET, "_namespace_map", None)
1453
+ if _ns_map is not None:
1454
+ _ns_map[ns] = prefix
1455
+
1456
+
1364
1457
  def _create_xml_element(
1365
1458
  tag: typing.Any, prefix: typing.Optional[str] = None, ns: typing.Optional[str] = None
1366
1459
  ) -> ET.Element:
1367
1460
  if prefix and ns:
1368
- ET.register_namespace(prefix, ns)
1461
+ _safe_register_namespace(prefix, ns)
1369
1462
  if ns:
1370
1463
  return ET.Element("{" + ns + "}" + tag)
1371
1464
  return ET.Element(tag)
@@ -449,21 +449,22 @@ class OperationBase( # pylint: disable=too-many-public-methods,too-many-instanc
449
449
  file_import.add_import("json", ImportType.STDLIB)
450
450
  if self.enable_import_deserialize_xml:
451
451
  file_import.add_submodule_import(relative_path, "_deserialize_xml", ImportType.LOCAL)
452
- elif self.need_deserialize:
452
+ if any(
453
+ r.type
454
+ and not isinstance(r.type, BinaryIteratorType)
455
+ and not xml_serializable(str(r.default_content_type))
456
+ for r in self.responses
457
+ ):
453
458
  file_import.add_submodule_import(relative_path, "_deserialize", ImportType.LOCAL)
454
459
  if self.default_error_deserialization(serialize_namespace) or self.non_default_errors:
455
- xml_non_default_errors = any(
456
- xml_serializable(str(e.default_content_type)) for e in self.non_default_errors
457
- )
458
460
  try:
459
461
  default_error = next(e for e in self.exceptions if "default" in e.status_codes and e.type)
460
462
  except StopIteration:
461
463
  default_error = None
462
- if xml_non_default_errors or (
463
- default_error and xml_serializable(str(default_error.default_content_type))
464
- ):
464
+ all_errors = list(self.non_default_errors) + ([default_error] if default_error else [])
465
+ if any(xml_serializable(str(e.default_content_type)) for e in all_errors):
465
466
  file_import.add_submodule_import(relative_path, "_failsafe_deserialize_xml", ImportType.LOCAL)
466
- else:
467
+ if any(not xml_serializable(str(e.default_content_type)) for e in all_errors):
467
468
  file_import.add_submodule_import(relative_path, "_failsafe_deserialize", ImportType.LOCAL)
468
469
  return file_import
469
470