@typespec/http-client-python 0.28.2 → 0.29.0

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 (368) hide show
  1. package/dist/emitter/code-model.d.ts.map +1 -1
  2. package/dist/emitter/code-model.js +7 -6
  3. package/dist/emitter/code-model.js.map +1 -1
  4. package/dist/emitter/constants.d.ts +6 -0
  5. package/dist/emitter/constants.d.ts.map +1 -0
  6. package/dist/emitter/constants.js +27 -0
  7. package/dist/emitter/constants.js.map +1 -0
  8. package/dist/emitter/emitter.d.ts.map +1 -1
  9. package/dist/emitter/emitter.js +193 -119
  10. package/dist/emitter/emitter.js.map +1 -1
  11. package/dist/emitter/http.d.ts.map +1 -1
  12. package/dist/emitter/http.js +33 -1
  13. package/dist/emitter/http.js.map +1 -1
  14. package/dist/emitter/lib.d.ts +37 -3
  15. package/dist/emitter/lib.d.ts.map +1 -1
  16. package/dist/emitter/lib.js +17 -0
  17. package/dist/emitter/lib.js.map +1 -1
  18. package/dist/emitter/run-python3.js +1 -1
  19. package/dist/emitter/run-python3.js.map +1 -1
  20. package/dist/emitter/system-requirements.js +6 -4
  21. package/dist/emitter/system-requirements.js.map +1 -1
  22. package/dist/emitter/types.d.ts +2 -5
  23. package/dist/emitter/types.d.ts.map +1 -1
  24. package/dist/emitter/types.js +86 -63
  25. package/dist/emitter/types.js.map +1 -1
  26. package/dist/emitter/utils.d.ts.map +1 -1
  27. package/dist/emitter/utils.js +16 -17
  28. package/dist/emitter/utils.js.map +1 -1
  29. package/emitter/src/code-model.ts +7 -13
  30. package/emitter/src/constants.ts +27 -0
  31. package/emitter/src/emitter.ts +241 -123
  32. package/emitter/src/http.ts +29 -1
  33. package/emitter/src/lib.ts +24 -0
  34. package/emitter/src/run-python3.ts +1 -1
  35. package/emitter/src/system-requirements.ts +4 -4
  36. package/emitter/src/types.ts +102 -62
  37. package/emitter/src/utils.ts +16 -18
  38. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  39. package/emitter/test/utils.test.ts +3 -0
  40. package/emitter/tsconfig.build.json +2 -1
  41. package/emitter/tsconfig.json +2 -1
  42. package/eng/scripts/Build-Packages.ps1 +62 -37
  43. package/eng/scripts/Check-GitChanges.ps1 +30 -3
  44. package/eng/scripts/Functions.ps1 +54 -15
  45. package/eng/scripts/Generate.ps1 +42 -8
  46. package/eng/scripts/Generation.psm1 +44 -15
  47. package/eng/scripts/Initialize-Repository.ps1 +29 -11
  48. package/eng/scripts/Test-Packages.ps1 +47 -31
  49. package/eng/scripts/ci/config/eslint-ci.config.mjs +64 -0
  50. package/eng/scripts/ci/{mypy.ini → config/mypy.ini} +1 -1
  51. package/eng/scripts/ci/{pylintrc → config/pylintrc} +1 -1
  52. package/eng/scripts/ci/{pyrightconfig.json → config/pyrightconfig.json} +1 -1
  53. package/eng/scripts/ci/dev_requirements.txt +2 -1
  54. package/eng/scripts/ci/format.ts +232 -2
  55. package/eng/scripts/ci/lint.ts +223 -20
  56. package/eng/scripts/ci/regenerate-common.ts +411 -136
  57. package/eng/scripts/ci/regenerate.ts +247 -101
  58. package/eng/scripts/ci/run-tests.ts +507 -0
  59. package/eng/scripts/ci/run_apiview.py +22 -16
  60. package/eng/scripts/ci/run_mypy.py +34 -23
  61. package/eng/scripts/ci/run_pylint.py +27 -19
  62. package/eng/scripts/ci/run_pyright.py +9 -5
  63. package/eng/scripts/ci/run_sphinx_build.py +24 -9
  64. package/eng/scripts/ci/typecheck.ts +225 -0
  65. package/eng/scripts/ci/util.py +61 -25
  66. package/eng/scripts/ci/utils.ts +5 -5
  67. package/eng/scripts/setup/__pycache__/package_manager.cpython-311.pyc +0 -0
  68. package/eng/scripts/setup/__pycache__/venvtools.cpython-311.pyc +0 -0
  69. package/eng/scripts/setup/build.ts +1 -1
  70. package/eng/scripts/setup/build_pygen_wheel.py +4 -3
  71. package/eng/scripts/setup/install.py +4 -3
  72. package/eng/scripts/setup/install.ts +1 -1
  73. package/eng/scripts/setup/prepare.py +3 -2
  74. package/eng/scripts/setup/prepare.ts +1 -1
  75. package/eng/scripts/setup/run-python3.ts +1 -1
  76. package/eng/scripts/setup/run_batch.py +197 -0
  77. package/eng/scripts/setup/run_tsp.py +3 -3
  78. package/eng/scripts/setup/system-requirements.ts +8 -4
  79. package/eng/scripts/setup/venvtools.py +1 -1
  80. package/generator/build/lib/pygen/__init__.py +1 -3
  81. package/generator/build/lib/pygen/codegen/__init__.py +0 -1
  82. package/generator/build/lib/pygen/codegen/models/base.py +0 -1
  83. package/generator/build/lib/pygen/codegen/models/client.py +2 -1
  84. package/generator/build/lib/pygen/codegen/models/code_model.py +1 -0
  85. package/generator/build/lib/pygen/codegen/models/enum_type.py +0 -1
  86. package/generator/build/lib/pygen/codegen/models/model_type.py +1 -7
  87. package/generator/build/lib/pygen/codegen/models/parameter.py +16 -14
  88. package/generator/build/lib/pygen/codegen/serializers/__init__.py +27 -12
  89. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +12 -3
  90. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +6 -2
  91. package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +17 -4
  92. package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +17 -11
  93. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +176 -71
  94. package/generator/build/lib/pygen/codegen/templates/packaging_templates/README.md.jinja2 +11 -3
  95. package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +1 -1
  96. package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +5 -1
  97. package/generator/build/lib/pygen/preprocess/__init__.py +37 -30
  98. package/generator/component-detection-pip-report.json +7 -7
  99. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  100. package/generator/pygen/__init__.py +1 -3
  101. package/generator/pygen/codegen/__init__.py +0 -1
  102. package/generator/pygen/codegen/models/base.py +0 -1
  103. package/generator/pygen/codegen/models/client.py +2 -1
  104. package/generator/pygen/codegen/models/code_model.py +1 -0
  105. package/generator/pygen/codegen/models/enum_type.py +0 -1
  106. package/generator/pygen/codegen/models/model_type.py +1 -7
  107. package/generator/pygen/codegen/models/parameter.py +16 -14
  108. package/generator/pygen/codegen/serializers/__init__.py +27 -12
  109. package/generator/pygen/codegen/serializers/builder_serializer.py +12 -3
  110. package/generator/pygen/codegen/serializers/general_serializer.py +6 -2
  111. package/generator/pygen/codegen/serializers/import_serializer.py +17 -4
  112. package/generator/pygen/codegen/serializers/parameter_serializer.py +17 -11
  113. package/generator/pygen/codegen/templates/model_base.py.jinja2 +176 -71
  114. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +11 -3
  115. package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +1 -1
  116. package/generator/pygen/codegen/templates/serialization.py.jinja2 +5 -1
  117. package/generator/pygen/preprocess/__init__.py +37 -30
  118. package/generator/pygen.egg-info/PKG-INFO +1 -2
  119. package/generator/pygen.egg-info/requires.txt +1 -1
  120. package/generator/setup.py +1 -2
  121. package/package.json +63 -42
  122. package/eng/scripts/ci/run-ci.ts +0 -89
  123. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_commonproperties_async.py +0 -94
  124. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_largeheader_async.py +0 -30
  125. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_nonresource_async.py +0 -36
  126. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_operationtemplates_async.py +0 -205
  127. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_resource_async.py +0 -478
  128. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_access_async.py +0 -101
  129. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_header_async.py +0 -18
  130. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_path_async.py +0 -18
  131. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_query_async.py +0 -18
  132. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_default_value_async.py +0 -46
  133. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_initialization_async.py +0 -58
  134. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_location_async.py +0 -82
  135. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_deserialize_empty_string_as_null_async.py +0 -20
  136. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_flatten_async.py +0 -115
  137. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_hierrarchy_building_async.py +0 -53
  138. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_next_link_verb_async.py +0 -28
  139. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_override_async.py +0 -106
  140. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_usage_async.py +0 -38
  141. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_basic_async.py +0 -76
  142. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_rpc_async.py +0 -22
  143. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_standard_async.py +0 -39
  144. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_model_async.py +0 -33
  145. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_page_async.py +0 -80
  146. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_scalar_async.py +0 -41
  147. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_traits_async.py +0 -87
  148. package/generator/test/azure/mock_api_tests/asynctests/test_azure_encode_duration_async.py +0 -19
  149. package/generator/test/azure/mock_api_tests/asynctests/test_azure_example_basic_async.py +0 -30
  150. package/generator/test/azure/mock_api_tests/asynctests/test_azure_payload_pageable_async.py +0 -19
  151. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_method_subscription_id_async.py +0 -248
  152. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_async.py +0 -110
  153. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_shared_models_async.py +0 -132
  154. package/generator/test/azure/mock_api_tests/asynctests/test_azure_special_headers_client_request_id_async.py +0 -30
  155. package/generator/test/azure/mock_api_tests/asynctests/test_azure_versioning_previewversion_async.py +0 -53
  156. package/generator/test/azure/mock_api_tests/asynctests/test_client_namespace_async.py +0 -34
  157. package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py +0 -69
  158. package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_enum_conflict_async.py +0 -37
  159. package/generator/test/azure/mock_api_tests/asynctests/test_client_overload_async.py +0 -27
  160. package/generator/test/azure/mock_api_tests/asynctests/test_client_structure_async.py +0 -64
  161. package/generator/test/azure/mock_api_tests/asynctests/test_client_structure_clientoperationgroup_async.py +0 -31
  162. package/generator/test/azure/mock_api_tests/asynctests/test_encode_duration_async.py +0 -63
  163. package/generator/test/azure/mock_api_tests/asynctests/test_encode_numeric_async.py +0 -35
  164. package/generator/test/azure/mock_api_tests/asynctests/test_parameters_basic_async.py +0 -24
  165. package/generator/test/azure/mock_api_tests/asynctests/test_parameters_spread_async.py +0 -76
  166. package/generator/test/azure/mock_api_tests/asynctests/test_payload_content_negotiation_async.py +0 -37
  167. package/generator/test/azure/mock_api_tests/asynctests/test_payload_multipart_async.py +0 -216
  168. package/generator/test/azure/mock_api_tests/asynctests/test_resiliency_srv_driven_async.py +0 -130
  169. package/generator/test/azure/mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +0 -24
  170. package/generator/test/azure/mock_api_tests/asynctests/test_service_multi_service_async.py +0 -31
  171. package/generator/test/azure/mock_api_tests/asynctests/test_special_words_async.py +0 -71
  172. package/generator/test/azure/mock_api_tests/conftest.py +0 -207
  173. package/generator/test/azure/mock_api_tests/data/image.jpg +0 -0
  174. package/generator/test/azure/mock_api_tests/data/image.png +0 -0
  175. package/generator/test/azure/mock_api_tests/test_azure_arm_commonproperties.py +0 -89
  176. package/generator/test/azure/mock_api_tests/test_azure_arm_largeheader.py +0 -27
  177. package/generator/test/azure/mock_api_tests/test_azure_arm_nonresource.py +0 -34
  178. package/generator/test/azure/mock_api_tests/test_azure_arm_operationtemplates.py +0 -180
  179. package/generator/test/azure/mock_api_tests/test_azure_arm_resource.py +0 -436
  180. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_access.py +0 -92
  181. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_header.py +0 -17
  182. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_path.py +0 -17
  183. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_query.py +0 -17
  184. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_default_value.py +0 -42
  185. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_initialization.py +0 -51
  186. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_location.py +0 -70
  187. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_deserialize_empty_string_as_null.py +0 -19
  188. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_flatten.py +0 -104
  189. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_hierrarchy_building.py +0 -45
  190. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_next_link_verb.py +0 -27
  191. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_override.py +0 -102
  192. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_usage.py +0 -32
  193. package/generator/test/azure/mock_api_tests/test_azure_core_basic.py +0 -70
  194. package/generator/test/azure/mock_api_tests/test_azure_core_lro_rpc.py +0 -20
  195. package/generator/test/azure/mock_api_tests/test_azure_core_lro_standard.py +0 -32
  196. package/generator/test/azure/mock_api_tests/test_azure_core_model.py +0 -30
  197. package/generator/test/azure/mock_api_tests/test_azure_core_page.py +0 -71
  198. package/generator/test/azure/mock_api_tests/test_azure_core_scalar.py +0 -35
  199. package/generator/test/azure/mock_api_tests/test_azure_core_traits.py +0 -85
  200. package/generator/test/azure/mock_api_tests/test_azure_encode_duration.py +0 -18
  201. package/generator/test/azure/mock_api_tests/test_azure_example_basic.py +0 -29
  202. package/generator/test/azure/mock_api_tests/test_azure_payload_pageable.py +0 -18
  203. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_method_subscription_id.py +0 -235
  204. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service.py +0 -104
  205. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service_shared_models.py +0 -128
  206. package/generator/test/azure/mock_api_tests/test_azure_special_headers_client_request_id.py +0 -29
  207. package/generator/test/azure/mock_api_tests/test_azure_versioning_previewversion.py +0 -50
  208. package/generator/test/azure/mock_api_tests/test_clear_output_folder.py +0 -23
  209. package/generator/test/azure/mock_api_tests/test_client_namespace.py +0 -32
  210. package/generator/test/azure/mock_api_tests/test_client_naming.py +0 -57
  211. package/generator/test/azure/mock_api_tests/test_client_naming_enum_conflict.py +0 -35
  212. package/generator/test/azure/mock_api_tests/test_client_overload.py +0 -25
  213. package/generator/test/azure/mock_api_tests/test_client_structure.py +0 -60
  214. package/generator/test/azure/mock_api_tests/test_client_structure_clientoperationgroup.py +0 -29
  215. package/generator/test/azure/mock_api_tests/test_encode_duration.py +0 -60
  216. package/generator/test/azure/mock_api_tests/test_encode_numeric.py +0 -31
  217. package/generator/test/azure/mock_api_tests/test_model_base_flatten_compatibility.py +0 -251
  218. package/generator/test/azure/mock_api_tests/test_parameters_basic.py +0 -22
  219. package/generator/test/azure/mock_api_tests/test_parameters_spread.py +0 -66
  220. package/generator/test/azure/mock_api_tests/test_payload_content_negotiation.py +0 -33
  221. package/generator/test/azure/mock_api_tests/test_payload_multipart.py +0 -198
  222. package/generator/test/azure/mock_api_tests/test_resiliency_srv_driven.py +0 -124
  223. package/generator/test/azure/mock_api_tests/test_serialization_encoded_name_json.py +0 -21
  224. package/generator/test/azure/mock_api_tests/test_service_multi_service.py +0 -29
  225. package/generator/test/azure/mock_api_tests/test_special_words.py +0 -63
  226. package/generator/test/azure/requirements.txt +0 -125
  227. package/generator/test/azure/tox.ini +0 -64
  228. package/generator/test/data/image.jpg +0 -0
  229. package/generator/test/data/image.png +0 -0
  230. package/generator/test/dev_requirements.txt +0 -8
  231. package/generator/test/generic_mock_api_tests/asynctests/test_authentication_async.py +0 -140
  232. package/generator/test/generic_mock_api_tests/asynctests/test_encode_array_async.py +0 -139
  233. package/generator/test/generic_mock_api_tests/asynctests/test_encode_bytes_async.py +0 -132
  234. package/generator/test/generic_mock_api_tests/asynctests/test_encode_datetime_async.py +0 -127
  235. package/generator/test/generic_mock_api_tests/asynctests/test_headasboolean_async.py +0 -35
  236. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_body_optionality_async.py +0 -30
  237. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_collection_format_async.py +0 -38
  238. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_path_async.py +0 -24
  239. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_query_async.py +0 -18
  240. package/generator/test/generic_mock_api_tests/asynctests/test_payload_json_merge_patch_async.py +0 -98
  241. package/generator/test/generic_mock_api_tests/asynctests/test_payload_media_type_async.py +0 -27
  242. package/generator/test/generic_mock_api_tests/asynctests/test_payload_pageable_async.py +0 -134
  243. package/generator/test/generic_mock_api_tests/asynctests/test_payload_xml_async.py +0 -150
  244. package/generator/test/generic_mock_api_tests/asynctests/test_response_status_code_range_async.py +0 -38
  245. package/generator/test/generic_mock_api_tests/asynctests/test_routes_async.py +0 -331
  246. package/generator/test/generic_mock_api_tests/asynctests/test_server_endpoint_not_defined_async.py +0 -18
  247. package/generator/test/generic_mock_api_tests/asynctests/test_server_path_multiple_async.py +0 -25
  248. package/generator/test/generic_mock_api_tests/asynctests/test_server_path_single_async.py +0 -18
  249. package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_not_versioned_async.py +0 -28
  250. package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_versioned_async.py +0 -34
  251. package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_conditional_request_async.py +0 -38
  252. package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_repeatability_async.py +0 -19
  253. package/generator/test/generic_mock_api_tests/asynctests/test_specs_documentation_async.py +0 -59
  254. package/generator/test/generic_mock_api_tests/asynctests/test_streaming_jsonl_async.py +0 -27
  255. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_array_async.py +0 -127
  256. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_dictionary_async.py +0 -98
  257. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_extensible_async.py +0 -25
  258. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_fixed_async.py +0 -27
  259. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_file_async.py +0 -59
  260. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_empty_async.py +0 -32
  261. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_enum_discriminator_async.py +0 -70
  262. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_nested_discriminator_async.py +0 -85
  263. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_not_discriminated_async.py +0 -34
  264. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_recursive_async.py +0 -34
  265. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_single_discriminator_async.py +0 -67
  266. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_usage_async.py +0 -32
  267. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_visibility_async.py +0 -47
  268. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_additionalproperties_async.py +0 -353
  269. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py +0 -110
  270. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_optional_async.py +0 -197
  271. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_valuetypes_async.py +0 -315
  272. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_scalar_async.py +0 -60
  273. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_union_async.py +0 -90
  274. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_added_async.py +0 -36
  275. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_made_optional_async.py +0 -21
  276. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_removed_async.py +0 -39
  277. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_renamed_from_async.py +0 -29
  278. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_return_type_changed_from_async.py +0 -18
  279. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_type_changed_from_async.py +0 -22
  280. package/generator/test/generic_mock_api_tests/conftest.py +0 -75
  281. package/generator/test/generic_mock_api_tests/data/image.jpg +0 -0
  282. package/generator/test/generic_mock_api_tests/data/image.png +0 -0
  283. package/generator/test/generic_mock_api_tests/test_authentication.py +0 -130
  284. package/generator/test/generic_mock_api_tests/test_encode_array.py +0 -126
  285. package/generator/test/generic_mock_api_tests/test_encode_bytes.py +0 -128
  286. package/generator/test/generic_mock_api_tests/test_encode_datetime.py +0 -123
  287. package/generator/test/generic_mock_api_tests/test_headasboolean.py +0 -33
  288. package/generator/test/generic_mock_api_tests/test_parameters_body_optionality.py +0 -27
  289. package/generator/test/generic_mock_api_tests/test_parameters_collection_format.py +0 -33
  290. package/generator/test/generic_mock_api_tests/test_parameters_path.py +0 -22
  291. package/generator/test/generic_mock_api_tests/test_parameters_query.py +0 -17
  292. package/generator/test/generic_mock_api_tests/test_payload_json_merge_patch.py +0 -93
  293. package/generator/test/generic_mock_api_tests/test_payload_media_type.py +0 -25
  294. package/generator/test/generic_mock_api_tests/test_payload_pageable.py +0 -99
  295. package/generator/test/generic_mock_api_tests/test_payload_xml.py +0 -135
  296. package/generator/test/generic_mock_api_tests/test_response_status_code_range.py +0 -36
  297. package/generator/test/generic_mock_api_tests/test_routes.py +0 -285
  298. package/generator/test/generic_mock_api_tests/test_server_endpoint_not_defined.py +0 -17
  299. package/generator/test/generic_mock_api_tests/test_server_path_multiple.py +0 -21
  300. package/generator/test/generic_mock_api_tests/test_server_path_single.py +0 -17
  301. package/generator/test/generic_mock_api_tests/test_server_versions_not_versioned.py +0 -25
  302. package/generator/test/generic_mock_api_tests/test_server_versions_versioned.py +0 -30
  303. package/generator/test/generic_mock_api_tests/test_special_headers_conditional_request.py +0 -34
  304. package/generator/test/generic_mock_api_tests/test_special_headers_repeatability.py +0 -18
  305. package/generator/test/generic_mock_api_tests/test_specs_documentation.py +0 -51
  306. package/generator/test/generic_mock_api_tests/test_streaming_jsonl.py +0 -25
  307. package/generator/test/generic_mock_api_tests/test_typetest_array.py +0 -111
  308. package/generator/test/generic_mock_api_tests/test_typetest_dictionary.py +0 -86
  309. package/generator/test/generic_mock_api_tests/test_typetest_enum_extensible.py +0 -23
  310. package/generator/test/generic_mock_api_tests/test_typetest_enum_fixed.py +0 -25
  311. package/generator/test/generic_mock_api_tests/test_typetest_file.py +0 -52
  312. package/generator/test/generic_mock_api_tests/test_typetest_model_empty.py +0 -29
  313. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_enum_discriminator.py +0 -58
  314. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_nested_discriminator.py +0 -79
  315. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_not_discriminated.py +0 -31
  316. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_recursive.py +0 -32
  317. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_single_discriminator.py +0 -60
  318. package/generator/test/generic_mock_api_tests/test_typetest_model_usage.py +0 -28
  319. package/generator/test/generic_mock_api_tests/test_typetest_model_visibility.py +0 -40
  320. package/generator/test/generic_mock_api_tests/test_typetest_property_additionalproperties.py +0 -314
  321. package/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py +0 -102
  322. package/generator/test/generic_mock_api_tests/test_typetest_property_optional.py +0 -174
  323. package/generator/test/generic_mock_api_tests/test_typetest_property_valuetypes.py +0 -286
  324. package/generator/test/generic_mock_api_tests/test_typetest_scalar.py +0 -53
  325. package/generator/test/generic_mock_api_tests/test_typetest_union.py +0 -80
  326. package/generator/test/generic_mock_api_tests/test_typetest_union_discriminated.py +0 -290
  327. package/generator/test/generic_mock_api_tests/test_versioning_added.py +0 -33
  328. package/generator/test/generic_mock_api_tests/test_versioning_made_optional.py +0 -20
  329. package/generator/test/generic_mock_api_tests/test_versioning_removed.py +0 -37
  330. package/generator/test/generic_mock_api_tests/test_versioning_renamed_from.py +0 -27
  331. package/generator/test/generic_mock_api_tests/test_versioning_return_type_changed_from.py +0 -17
  332. package/generator/test/generic_mock_api_tests/test_versioning_type_changed_from.py +0 -21
  333. package/generator/test/unbranded/mock_api_tests/asynctests/test_auth_flow_async.py +0 -19
  334. package/generator/test/unbranded/mock_api_tests/asynctests/test_encode_duration_async.py +0 -63
  335. package/generator/test/unbranded/mock_api_tests/asynctests/test_encode_numeric_async.py +0 -35
  336. package/generator/test/unbranded/mock_api_tests/asynctests/test_parameters_basic_async.py +0 -24
  337. package/generator/test/unbranded/mock_api_tests/asynctests/test_parameters_spread_async.py +0 -76
  338. package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_content_negotiation_async.py +0 -37
  339. package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_multipart_async.py +0 -218
  340. package/generator/test/unbranded/mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +0 -24
  341. package/generator/test/unbranded/mock_api_tests/asynctests/test_special_words_async.py +0 -73
  342. package/generator/test/unbranded/mock_api_tests/asynctests/test_unbranded_async.py +0 -24
  343. package/generator/test/unbranded/mock_api_tests/conftest.py +0 -91
  344. package/generator/test/unbranded/mock_api_tests/data/image.jpg +0 -0
  345. package/generator/test/unbranded/mock_api_tests/data/image.png +0 -0
  346. package/generator/test/unbranded/mock_api_tests/test_auth_flow.py +0 -17
  347. package/generator/test/unbranded/mock_api_tests/test_encode_duration.py +0 -60
  348. package/generator/test/unbranded/mock_api_tests/test_encode_numeric.py +0 -32
  349. package/generator/test/unbranded/mock_api_tests/test_parameters_basic.py +0 -22
  350. package/generator/test/unbranded/mock_api_tests/test_parameters_spread.py +0 -66
  351. package/generator/test/unbranded/mock_api_tests/test_payload_content_negotiation.py +0 -33
  352. package/generator/test/unbranded/mock_api_tests/test_payload_multipart.py +0 -200
  353. package/generator/test/unbranded/mock_api_tests/test_serialization_encoded_name_json.py +0 -22
  354. package/generator/test/unbranded/mock_api_tests/test_special_words.py +0 -66
  355. package/generator/test/unbranded/mock_api_tests/test_unbranded.py +0 -65
  356. package/generator/test/unbranded/requirements.txt +0 -69
  357. package/generator/test/unbranded/tox.ini +0 -64
  358. package/generator/test/unittests/conftest.py +0 -15
  359. package/generator/test/unittests/requirements.txt +0 -3
  360. package/generator/test/unittests/test_enums.py +0 -89
  361. package/generator/test/unittests/test_model_base_serialization.py +0 -4906
  362. package/generator/test/unittests/test_model_base_xml_serialization.py +0 -1239
  363. package/generator/test/unittests/test_name_converter.py +0 -35
  364. package/generator/test/unittests/test_optional_return_type.py +0 -268
  365. package/generator/test/unittests/test_parameter_ordering.py +0 -104
  366. package/generator/test/unittests/test_sort_schema.py +0 -93
  367. package/generator/test/unittests/tox.ini +0 -5
  368. /package/eng/scripts/ci/{pyproject.toml → config/pyproject.toml} +0 -0
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  SdkContext,
3
+ SdkType,
3
4
  UnbrandedSdkEmitterOptions,
4
5
  } from "@azure-tools/typespec-client-generator-core";
5
6
  import { createTypeSpecLibrary, JSONSchemaType, paramMessage } from "@typespec/compiler";
@@ -24,10 +25,14 @@ export interface PythonEmitterOptions {
24
25
  "use-pyodide"?: boolean;
25
26
  "keep-setup-py"?: boolean;
26
27
  "clear-output-folder"?: boolean;
28
+ "emit-yaml-only"?: boolean;
27
29
  }
28
30
 
29
31
  export interface PythonSdkContext extends SdkContext<PythonEmitterOptions> {
30
32
  __endpointPathParameters: Record<string, any>[];
33
+ __typesMap: Map<SdkType, Record<string, any>>;
34
+ __simpleTypesMap: Map<string | null, Record<string, any>>;
35
+ __disableGenerationMap: Set<SdkType>;
31
36
  }
32
37
 
33
38
  export const PythonEmitterOptionsSchema: JSONSchemaType<PythonEmitterOptions> = {
@@ -106,6 +111,12 @@ export const PythonEmitterOptionsSchema: JSONSchemaType<PythonEmitterOptions> =
106
111
  description:
107
112
  "Whether to clear the output folder before generating the code. Defaults to `false`.",
108
113
  },
114
+ "emit-yaml-only": {
115
+ type: "boolean",
116
+ nullable: true,
117
+ description:
118
+ "Emit YAML code model only, without running Python generator. For batch processing.",
119
+ },
109
120
  },
110
121
  required: [],
111
122
  };
@@ -127,6 +138,19 @@ const libDef = {
127
138
  "Python is not installed. Please follow https://www.python.org/ to install Python or set 'use-pyodide' to true.",
128
139
  },
129
140
  },
141
+ "no-sdk-clients": {
142
+ severity: "error",
143
+ messages: {
144
+ default:
145
+ "The Python emitter did not find any SDK clients in this TypeSpec program. The current Python generator expects at least one client/service to generate code.",
146
+ },
147
+ },
148
+ "browser-runtime-load-failed": {
149
+ severity: "error",
150
+ messages: {
151
+ default: paramMessage`Failed to initialize the browser Python runtime.${"details"}`,
152
+ },
153
+ },
130
154
  "invalid-paging-items": {
131
155
  severity: "warning",
132
156
  messages: {
@@ -11,7 +11,7 @@ import { patchPythonPath } from "./system-requirements.js";
11
11
 
12
12
  export async function runPython3(...args: string[]) {
13
13
  const command = await patchPythonPath(["python", ...args], {
14
- version: ">=3.9",
14
+ version: ">=3.10",
15
15
  environmentVariable: "AUTOREST_PYTHON_EXE",
16
16
  });
17
17
  cp.execSync(command.join(" "), {
@@ -16,8 +16,8 @@ const execute = (
16
16
  options.onCreate(cp);
17
17
  }
18
18
 
19
- options.onStdOutData && cp.stdout.on("data", options.onStdOutData);
20
- options.onStdErrData && cp.stderr.on("data", options.onStdErrData);
19
+ if (options.onStdOutData) cp.stdout.on("data", options.onStdOutData);
20
+ if (options.onStdErrData) cp.stderr.on("data", options.onStdErrData);
21
21
 
22
22
  let err = "";
23
23
  let out = "";
@@ -34,7 +34,7 @@ const execute = (
34
34
  cp.on("error", (err) => {
35
35
  reject(err);
36
36
  });
37
- cp.on("close", (code, signal) =>
37
+ cp.on("close", (code, _signal) =>
38
38
  resolve({
39
39
  stdout: out,
40
40
  stderr: err,
@@ -110,7 +110,7 @@ const tryPython = async (
110
110
  `"${PRINT_PYTHON_VERSION_SCRIPT}"`,
111
111
  ]);
112
112
  return validateVersionRequirement(resolution, result.stdout.trim(), requirement);
113
- } catch (e) {
113
+ } catch {
114
114
  return {
115
115
  error: true,
116
116
  ...resolution,
@@ -28,10 +28,6 @@ import {
28
28
  getImplementation,
29
29
  } from "./utils.js";
30
30
 
31
- export const typesMap = new Map<SdkType, Record<string, any>>();
32
- export const simpleTypesMap = new Map<string | null, Record<string, any>>();
33
- export const disableGenerationMap = new Set<SdkType>();
34
-
35
31
  export interface CredentialType {
36
32
  kind: "Credential";
37
33
  scheme: HttpAuth;
@@ -59,13 +55,16 @@ function isEmptyModel(type: SdkType): boolean {
59
55
  );
60
56
  }
61
57
 
62
- export function getSimpleTypeResult(result: Record<string, any>): Record<string, any> {
58
+ export function getSimpleTypeResult(
59
+ context: PythonSdkContext,
60
+ result: Record<string, any>,
61
+ ): Record<string, any> {
63
62
  const key = dump(result, { sortKeys: true });
64
- const value = simpleTypesMap.get(key);
63
+ const value = context.__simpleTypesMap.get(key);
65
64
  if (value) {
66
65
  result = value;
67
66
  } else {
68
- simpleTypesMap.set(key, result);
67
+ context.__simpleTypesMap.set(key, result);
69
68
  }
70
69
  return result;
71
70
  }
@@ -82,16 +81,16 @@ export function getType(
82
81
  case "enum":
83
82
  return emitEnum(context, type);
84
83
  case "constant":
85
- return emitConstant(type)!;
84
+ return emitConstant(context, type)!;
86
85
  case "array":
87
86
  case "dict":
88
87
  return emitArrayOrDict(context, type)!;
89
88
  case "utcDateTime":
90
89
  case "offsetDateTime":
91
90
  case "duration":
92
- return emitDurationOrDateType(type);
91
+ return emitDurationOrDateType(context, type);
93
92
  case "enumvalue":
94
- return emitEnumMember(type, emitEnum(context, type.enumType));
93
+ return emitEnumMember(context, type, emitEnum(context, type.enumType));
95
94
  case "credential":
96
95
  return emitCredential(context, type);
97
96
  case "bytes":
@@ -116,7 +115,7 @@ export function getType(
116
115
  case "decimal128":
117
116
  case "string":
118
117
  case "url":
119
- return emitBuiltInType(type);
118
+ return emitBuiltInType(context, type);
120
119
  case "unknown":
121
120
  return KnownTypes.any;
122
121
  case "nullable":
@@ -133,12 +132,12 @@ function emitMultiPartFile(
133
132
  type: MultiPartFileType,
134
133
  ): Record<string, any> {
135
134
  if (type.type.kind === "array") {
136
- return getSimpleTypeResult({
135
+ return getSimpleTypeResult(context, {
137
136
  type: "list",
138
137
  elementType: getType(context, createMultiPartFileType(type.type.valueType)),
139
138
  });
140
139
  }
141
- return getSimpleTypeResult({
140
+ return getSimpleTypeResult(context, {
142
141
  type: type.kind,
143
142
  description: type.type.summary ? type.type.summary : type.type.doc,
144
143
  });
@@ -183,7 +182,7 @@ function emitCredential(
183
182
  },
184
183
  };
185
184
  }
186
- return getSimpleTypeResult(credential_type);
185
+ return getSimpleTypeResult(context, credential_type);
187
186
  }
188
187
 
189
188
  function visibilityMapping(visibility?: Visibility[]): string[] | undefined {
@@ -211,14 +210,14 @@ function createMultiPartFileType(type: SdkType): MultiPartFileType {
211
210
  return { kind: "multipartfile", type };
212
211
  }
213
212
 
214
- function addDisableGenerationMap(type: SdkType): void {
215
- if (disableGenerationMap.has(type)) return;
213
+ function addDisableGenerationMap(context: PythonSdkContext, type: SdkType): void {
214
+ if (context.__disableGenerationMap.has(type)) return;
216
215
 
217
- disableGenerationMap.add(type);
216
+ context.__disableGenerationMap.add(type);
218
217
  if (type.kind === "model" && type.baseModel) {
219
- addDisableGenerationMap(type.baseModel);
218
+ addDisableGenerationMap(context, type.baseModel);
220
219
  } else if (type.kind === "array") {
221
- addDisableGenerationMap(type.valueType);
220
+ addDisableGenerationMap(context, type.valueType);
222
221
  }
223
222
  }
224
223
 
@@ -231,7 +230,7 @@ function emitProperty(
231
230
  if (isMultipartFileInput) {
232
231
  sourceType = createMultiPartFileType(property.type);
233
232
  // Python convert all the type of file part to FileType so clear these models' usage so that they won't be generated
234
- addDisableGenerationMap(property.type);
233
+ addDisableGenerationMap(context, property.type);
235
234
  }
236
235
  return {
237
236
  clientName: camelToSnakeCase(property.name),
@@ -250,6 +249,7 @@ function emitProperty(
250
249
  isMultipartFileInput: isMultipartFileInput,
251
250
  xmlMetadata: getXmlMetadata(property),
252
251
  encode: property.encode,
252
+ clientDefaultValue: property.clientDefaultValue,
253
253
  };
254
254
  }
255
255
 
@@ -257,8 +257,8 @@ function emitModel(context: PythonSdkContext, type: SdkModelType): Record<string
257
257
  if (isEmptyModel(type)) {
258
258
  return KnownTypes.any;
259
259
  }
260
- if (typesMap.has(type)) {
261
- return typesMap.get(type)!;
260
+ if (context.__typesMap.has(type)) {
261
+ return context.__typesMap.get(type)!;
262
262
  }
263
263
  if (type.crossLanguageDefinitionId === "Azure.Core.Foundations.Error") {
264
264
  return {
@@ -275,7 +275,7 @@ function emitModel(context: PythonSdkContext, type: SdkModelType): Record<string
275
275
  };
276
276
  }
277
277
  if (type.external) {
278
- return getSimpleTypeResult({
278
+ return getSimpleTypeResult(context, {
279
279
  type: "external",
280
280
  externalTypeInfo: type.external,
281
281
  });
@@ -299,7 +299,7 @@ function emitModel(context: PythonSdkContext, type: SdkModelType): Record<string
299
299
  clientNamespace: getClientNamespace(context, type.namespace),
300
300
  };
301
301
 
302
- typesMap.set(type, newValue);
302
+ context.__typesMap.set(type, newValue);
303
303
  newValue.parents = type.baseModel ? [getType(context, type.baseModel)] : newValue.parents;
304
304
  for (const property of type.properties.values()) {
305
305
  if (property.kind === "property" && !isHttpMetadata(context, property)) {
@@ -309,7 +309,7 @@ function emitModel(context: PythonSdkContext, type: SdkModelType): Record<string
309
309
  if (type.discriminatedSubtypes && property.discriminator) {
310
310
  newValue.properties[newValue.properties.length - 1].isPolymorphic = true;
311
311
  if (property.type.kind === "string") {
312
- newValue.properties[newValue.properties.length - 1].type = getConstantType(null);
312
+ newValue.properties[newValue.properties.length - 1].type = getConstantType(context, null);
313
313
  }
314
314
  }
315
315
  }
@@ -322,25 +322,28 @@ function emitModel(context: PythonSdkContext, type: SdkModelType): Record<string
322
322
  return newValue;
323
323
  }
324
324
 
325
- function getConstantFromEnumValueType(type: SdkEnumValueType): Record<string, any> {
326
- return getSimpleTypeResult({
325
+ function getConstantFromEnumValueType(
326
+ context: PythonSdkContext,
327
+ type: SdkEnumValueType,
328
+ ): Record<string, any> {
329
+ return getSimpleTypeResult(context, {
327
330
  type: "constant",
328
331
  value: type.value,
329
- valueType: emitBuiltInType(type.valueType),
332
+ valueType: emitBuiltInType(context, type.valueType),
330
333
  });
331
334
  }
332
335
 
333
336
  function emitEnum(context: PythonSdkContext, type: SdkEnumType): Record<string, any> {
334
- if (typesMap.has(type)) {
335
- return typesMap.get(type)!;
337
+ if (context.__typesMap.has(type)) {
338
+ return context.__typesMap.get(type)!;
336
339
  }
337
340
  if (type.isGeneratedName) {
338
341
  const types = [];
339
342
  for (const value of type.values) {
340
- types.push(getConstantFromEnumValueType(value));
343
+ types.push(getConstantFromEnumValueType(context, value));
341
344
  }
342
345
  if (!type.isFixed) {
343
- types.push(emitBuiltInType(type.valueType));
346
+ types.push(emitBuiltInType(context, type.valueType));
344
347
  }
345
348
 
346
349
  const newValue = {
@@ -350,7 +353,7 @@ function emitEnum(context: PythonSdkContext, type: SdkEnumType): Record<string,
350
353
  types,
351
354
  xmlMetadata: {},
352
355
  };
353
- typesMap.set(type, newValue);
356
+ context.__typesMap.set(type, newValue);
354
357
  return newValue;
355
358
  }
356
359
  const values: Record<string, any>[] = [];
@@ -361,36 +364,34 @@ function emitEnum(context: PythonSdkContext, type: SdkEnumType): Record<string,
361
364
  description: (type.summary ? type.summary : type.doc) ?? `Type of ${name}`,
362
365
  internal: type.access === "internal",
363
366
  type: type.kind,
364
- valueType: emitBuiltInType(type.valueType),
367
+ valueType: emitBuiltInType(context, type.valueType),
365
368
  values,
366
369
  xmlMetadata: {},
367
370
  crossLanguageDefinitionId: type.crossLanguageDefinitionId,
368
371
  clientNamespace: getClientNamespace(context, type.namespace),
369
372
  };
370
373
  for (const value of type.values) {
371
- newValue.values.push(emitEnumMember(value, newValue));
374
+ newValue.values.push(emitEnumMember(context, value, newValue));
372
375
  }
373
- typesMap.set(type, newValue);
376
+ context.__typesMap.set(type, newValue);
374
377
  return newValue;
375
378
  }
376
379
 
377
380
  function enumName(name: string): string {
378
- if (name.toUpperCase() === name) {
379
- return name;
380
- }
381
381
  return camelToSnakeCase(name).toUpperCase();
382
382
  }
383
383
 
384
384
  function emitEnumMember(
385
+ context: PythonSdkContext,
385
386
  type: SdkEnumValueType,
386
387
  enumType: Record<string, any>,
387
388
  ): Record<string, any> {
388
- if (typesMap.has(type)) {
389
- return typesMap.get(type)!;
389
+ if (context.__typesMap.has(type)) {
390
+ return context.__typesMap.get(type)!;
390
391
  }
391
392
  // python don't generate enum created by TCGC, so we shall not generate type for enum member of the enum, either.
392
393
  if (type.enumType.isGeneratedName) {
393
- return getConstantFromEnumValueType(type);
394
+ return getConstantFromEnumValueType(context, type);
394
395
  }
395
396
 
396
397
  const result = {
@@ -401,14 +402,17 @@ function emitEnumMember(
401
402
  type: type.kind,
402
403
  valueType: enumType["valueType"],
403
404
  };
404
- typesMap.set(type, result);
405
+ context.__typesMap.set(type, result);
405
406
  return result;
406
407
  }
407
408
 
408
- function emitDurationOrDateType(type: SdkDurationType | SdkDateTimeType): Record<string, any> {
409
- return getSimpleTypeResult({
410
- ...emitBuiltInType(type),
411
- wireType: emitBuiltInType(type.wireType),
409
+ function emitDurationOrDateType(
410
+ context: PythonSdkContext,
411
+ type: SdkDurationType | SdkDateTimeType,
412
+ ): Record<string, any> {
413
+ return getSimpleTypeResult(context, {
414
+ ...emitBuiltInType(context, type),
415
+ wireType: emitBuiltInType(context, type.wireType),
412
416
  });
413
417
  }
414
418
 
@@ -417,17 +421,17 @@ function emitArrayOrDict(
417
421
  type: SdkArrayType | SdkDictionaryType,
418
422
  ): Record<string, any> {
419
423
  const kind = type.kind === "array" ? "list" : type.kind;
420
- return getSimpleTypeResult({
424
+ return getSimpleTypeResult(context, {
421
425
  type: kind,
422
426
  elementType: getType(context, type.valueType),
423
427
  });
424
428
  }
425
429
 
426
- function emitConstant(type: SdkConstantType) {
427
- return getSimpleTypeResult({
430
+ function emitConstant(context: PythonSdkContext, type: SdkConstantType) {
431
+ return getSimpleTypeResult(context, {
428
432
  type: type.kind,
429
433
  value: type.value,
430
- valueType: emitBuiltInType(type.valueType),
434
+ valueType: emitBuiltInType(context, type.valueType),
431
435
  });
432
436
  }
433
437
 
@@ -461,12 +465,13 @@ const sdkScalarKindToPythonKind: Record<string, string> = {
461
465
  };
462
466
 
463
467
  function emitBuiltInType(
468
+ context: PythonSdkContext,
464
469
  type: SdkBuiltInType | SdkDurationType | SdkDateTimeType,
465
470
  ): Record<string, any> {
466
471
  if (type.encode) {
467
472
  if (type.kind === "duration") {
468
473
  if (type.encode === "ISO8601") {
469
- return getSimpleTypeResult({
474
+ return getSimpleTypeResult(context, {
470
475
  type: type.kind,
471
476
  encode: type.encode,
472
477
  });
@@ -474,13 +479,13 @@ function emitBuiltInType(
474
479
  }
475
480
  if (type.kind === "utcDateTime" || type.kind === "offsetDateTime") {
476
481
  if (type.encode === "unixTimestamp") {
477
- return getSimpleTypeResult({
482
+ return getSimpleTypeResult(context, {
478
483
  type: "unixtime",
479
484
  encode: type.encode,
480
485
  });
481
486
  }
482
487
  if (type.encode === "rfc3339" || type.encode === "rfc7231") {
483
- return getSimpleTypeResult({
488
+ return getSimpleTypeResult(context, {
484
489
  type: type.kind,
485
490
  encode: type.encode,
486
491
  });
@@ -489,21 +494,21 @@ function emitBuiltInType(
489
494
 
490
495
  // fallback to wire type for unknown or unsupported encode
491
496
  if ("wireType" in type && type.wireType !== undefined) {
492
- return getSimpleTypeResult({
497
+ return getSimpleTypeResult(context, {
493
498
  type: sdkScalarKindToPythonKind[type.wireType.kind] || type.wireType.kind,
494
499
  encode: type.encode,
495
500
  });
496
501
  }
497
502
  }
498
503
 
499
- return getSimpleTypeResult({
504
+ return getSimpleTypeResult(context, {
500
505
  type: sdkScalarKindToPythonKind[type.kind] || type.kind, // TODO: switch to kind
501
506
  encode: type.encode,
502
507
  });
503
508
  }
504
509
 
505
510
  function emitUnion(context: PythonSdkContext, type: SdkUnionType): Record<string, any> {
506
- return getSimpleTypeResult({
511
+ return getSimpleTypeResult(context, {
507
512
  name: type.isGeneratedName ? undefined : type.name,
508
513
  snakeCaseName: type.isGeneratedName ? undefined : camelToSnakeCase(type.name),
509
514
  description: type.isGeneratedName ? "" : `Type of ${type.name}`,
@@ -515,8 +520,11 @@ function emitUnion(context: PythonSdkContext, type: SdkUnionType): Record<string
515
520
  });
516
521
  }
517
522
 
518
- export function getConstantType(key: string | null): Record<string, any> {
519
- const cache = simpleTypesMap.get(key);
523
+ export function getConstantType(
524
+ context: PythonSdkContext,
525
+ key: string | null,
526
+ ): Record<string, any> {
527
+ const cache = context.__simpleTypesMap.get(key);
520
528
  if (cache) {
521
529
  return cache;
522
530
  }
@@ -527,7 +535,7 @@ export function getConstantType(key: string | null): Record<string, any> {
527
535
  valueType: KnownTypes.string,
528
536
  xmlMetadata: {},
529
537
  };
530
- simpleTypesMap.set(key, type);
538
+ context.__simpleTypesMap.set(key, type);
531
539
  return type;
532
540
  }
533
541
 
@@ -537,6 +545,22 @@ export const KnownTypes = {
537
545
  any: { type: "any" },
538
546
  };
539
547
 
548
+ /**
549
+ * Detect whether an endpoint template parameter should be treated as an API
550
+ * version parameter even when TCGC does not flag it as such. This is a
551
+ * compatibility shim for unreleased TCGC changes that gate the name-based
552
+ * heuristic on `isMetadata`, which excludes server template parameters.
553
+ */
554
+ function isEndpointApiVersionFallback(
555
+ param: { name: string; isApiVersionParam: boolean },
556
+ serviceApiVersions: string[],
557
+ ): boolean {
558
+ if (param.isApiVersionParam) return false;
559
+ if (serviceApiVersions.length === 0) return false;
560
+ const lower = param.name.toLowerCase();
561
+ return lower === "apiversion" || lower === "api-version";
562
+ }
563
+
540
564
  export function emitEndpointType(
541
565
  context: PythonSdkContext,
542
566
  type: SdkEndpointType,
@@ -546,13 +570,29 @@ export function emitEndpointType(
546
570
  for (const param of type.templateArguments) {
547
571
  const paramBase = emitParamBase(context, param, undefined, serviceApiVersions);
548
572
  paramBase.clientName = context.arm ? "base_url" : paramBase.clientName;
573
+
574
+ let effectiveClientDefaultValue = param.clientDefaultValue;
575
+ // If this endpoint template param looks like an api-version but TCGC
576
+ // did not flag it, apply fallback: mark as api version and derive defaults.
577
+ if (isEndpointApiVersionFallback(param, serviceApiVersions)) {
578
+ paramBase.isApiVersion = true;
579
+ if (!effectiveClientDefaultValue) {
580
+ effectiveClientDefaultValue = serviceApiVersions[serviceApiVersions.length - 1];
581
+ }
582
+ paramBase.type = getSimpleTypeResult(context, {
583
+ type: "constant",
584
+ value: effectiveClientDefaultValue,
585
+ valueType: paramBase.type,
586
+ });
587
+ }
588
+
549
589
  params.push({
550
590
  ...paramBase,
551
- optional: Boolean(param.clientDefaultValue),
591
+ optional: Boolean(effectiveClientDefaultValue),
552
592
  wireName: param.name,
553
593
  location: "endpointPath",
554
594
  implementation: getImplementation(context, param),
555
- clientDefaultValue: param.clientDefaultValue,
595
+ clientDefaultValue: effectiveClientDefaultValue,
556
596
  skipUrlEncoding: param.allowReserved,
557
597
  });
558
598
  context.__endpointPathParameters!.push(params.at(-1)!);
@@ -213,7 +213,7 @@ export function emitParamBase<TServiceOperation extends SdkServiceOperation>(
213
213
  let type = getType(context, parameter.type);
214
214
  if (parameter.isApiVersionParam) {
215
215
  if (parameter.clientDefaultValue) {
216
- type = getSimpleTypeResult({
216
+ type = getSimpleTypeResult(context, {
217
217
  type: "constant",
218
218
  value: parameter.clientDefaultValue,
219
219
  valueType: type,
@@ -262,6 +262,7 @@ export function capitalize(name: string): string {
262
262
  return name[0].toUpperCase() + name.slice(1);
263
263
  }
264
264
 
265
+ // Library namespaces that should not be used as client namespaces
265
266
  const LIB_NAMESPACE = [
266
267
  "azure.core",
267
268
  "azure.resourcemanager",
@@ -272,29 +273,25 @@ const LIB_NAMESPACE = [
272
273
  ];
273
274
 
274
275
  export function getRootNamespace(context: PythonSdkContext): string {
275
- let rootNamespace = "";
276
276
  if (context.sdkPackage.clients.length > 0) {
277
- rootNamespace = context.sdkPackage.clients[0].namespace;
278
- } else if (context.sdkPackage.models.length > 0) {
279
- const result = context.sdkPackage.models
280
- .map((model) => model.namespace)
281
- .filter((namespace) => !LIB_NAMESPACE.includes(namespace));
282
- if (result.length > 0) {
283
- result.sort();
284
- rootNamespace = result[0];
285
- }
277
+ return context.sdkPackage.clients[0].namespace.toLowerCase();
286
278
  } else if (context.sdkPackage.namespaces.length > 0) {
287
- rootNamespace = context.sdkPackage.namespaces[0].fullName;
279
+ return context.sdkPackage.namespaces[0].fullName.toLowerCase();
288
280
  }
281
+ return "";
282
+ }
289
283
 
290
- return rootNamespace.toLowerCase();
284
+ function isLibraryNamespace(namespace: string): boolean {
285
+ const ns = namespace.toLowerCase();
286
+ return LIB_NAMESPACE.some((lib) => ns.startsWith(lib));
291
287
  }
292
288
 
293
289
  export function getClientNamespace(context: PythonSdkContext, clientNamespace: string) {
294
- if (
295
- clientNamespace === "" ||
296
- LIB_NAMESPACE.some((item) => clientNamespace.toLowerCase().startsWith(item))
297
- ) {
290
+ // Namespace precedence: @clientNamespace > --namespace > original namespace
291
+ // These are resolved by TCGC and passed in as clientNamespace.
292
+ // However, models from library namespaces (azure.core, azure.resourcemanager, etc.)
293
+ // should use the SDK's root namespace instead.
294
+ if (clientNamespace === "" || isLibraryNamespace(clientNamespace)) {
298
295
  return getRootNamespace(context);
299
296
  }
300
297
  return clientNamespace.toLowerCase();
@@ -320,7 +317,7 @@ function parseToken(token: Token): string {
320
317
  case "codespan":
321
318
  parsed += `\`\`${token.text}\`\``;
322
319
  break;
323
- case "code":
320
+ case "code": {
324
321
  let codeBlockStyle = token.codeBlockStyle;
325
322
  if (codeBlockStyle === undefined) {
326
323
  codeBlockStyle = token.raw.split("\n")[0].replace("```", "").trim();
@@ -331,6 +328,7 @@ function parseToken(token: Token): string {
331
328
  }
332
329
  parsed += `\n\n.. code-block:: ${codeBlockStyle ?? ""}\n\n ${token.text.split("\n").join("\n ")}`;
333
330
  break;
331
+ }
334
332
  case "link":
335
333
  if (token.href !== undefined) {
336
334
  parsed += `\`${token.text} <${token.href}>\`_`;