@typespec/http-client-python 0.28.2 → 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 (309) 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/templates/model_base.py.jinja2 +157 -64
  57. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  58. package/generator/pygen/codegen/templates/model_base.py.jinja2 +157 -64
  59. package/package.json +48 -42
  60. package/eng/scripts/ci/run-ci.ts +0 -89
  61. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_commonproperties_async.py +0 -94
  62. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_largeheader_async.py +0 -30
  63. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_nonresource_async.py +0 -36
  64. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_operationtemplates_async.py +0 -205
  65. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_resource_async.py +0 -478
  66. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_access_async.py +0 -101
  67. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_header_async.py +0 -18
  68. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_path_async.py +0 -18
  69. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_query_async.py +0 -18
  70. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_default_value_async.py +0 -46
  71. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_initialization_async.py +0 -58
  72. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_location_async.py +0 -82
  73. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_deserialize_empty_string_as_null_async.py +0 -20
  74. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_flatten_async.py +0 -115
  75. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_hierrarchy_building_async.py +0 -53
  76. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_next_link_verb_async.py +0 -28
  77. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_override_async.py +0 -106
  78. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_usage_async.py +0 -38
  79. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_basic_async.py +0 -76
  80. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_rpc_async.py +0 -22
  81. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_standard_async.py +0 -39
  82. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_model_async.py +0 -33
  83. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_page_async.py +0 -80
  84. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_scalar_async.py +0 -41
  85. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_traits_async.py +0 -87
  86. package/generator/test/azure/mock_api_tests/asynctests/test_azure_encode_duration_async.py +0 -19
  87. package/generator/test/azure/mock_api_tests/asynctests/test_azure_example_basic_async.py +0 -30
  88. package/generator/test/azure/mock_api_tests/asynctests/test_azure_payload_pageable_async.py +0 -19
  89. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_method_subscription_id_async.py +0 -248
  90. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_async.py +0 -110
  91. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_shared_models_async.py +0 -132
  92. package/generator/test/azure/mock_api_tests/asynctests/test_azure_special_headers_client_request_id_async.py +0 -30
  93. package/generator/test/azure/mock_api_tests/asynctests/test_azure_versioning_previewversion_async.py +0 -53
  94. package/generator/test/azure/mock_api_tests/asynctests/test_client_namespace_async.py +0 -34
  95. package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py +0 -69
  96. package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_enum_conflict_async.py +0 -37
  97. package/generator/test/azure/mock_api_tests/asynctests/test_client_overload_async.py +0 -27
  98. package/generator/test/azure/mock_api_tests/asynctests/test_client_structure_async.py +0 -64
  99. package/generator/test/azure/mock_api_tests/asynctests/test_client_structure_clientoperationgroup_async.py +0 -31
  100. package/generator/test/azure/mock_api_tests/asynctests/test_encode_duration_async.py +0 -63
  101. package/generator/test/azure/mock_api_tests/asynctests/test_encode_numeric_async.py +0 -35
  102. package/generator/test/azure/mock_api_tests/asynctests/test_parameters_basic_async.py +0 -24
  103. package/generator/test/azure/mock_api_tests/asynctests/test_parameters_spread_async.py +0 -76
  104. package/generator/test/azure/mock_api_tests/asynctests/test_payload_content_negotiation_async.py +0 -37
  105. package/generator/test/azure/mock_api_tests/asynctests/test_payload_multipart_async.py +0 -216
  106. package/generator/test/azure/mock_api_tests/asynctests/test_resiliency_srv_driven_async.py +0 -130
  107. package/generator/test/azure/mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +0 -24
  108. package/generator/test/azure/mock_api_tests/asynctests/test_service_multi_service_async.py +0 -31
  109. package/generator/test/azure/mock_api_tests/asynctests/test_special_words_async.py +0 -71
  110. package/generator/test/azure/mock_api_tests/conftest.py +0 -207
  111. package/generator/test/azure/mock_api_tests/data/image.jpg +0 -0
  112. package/generator/test/azure/mock_api_tests/data/image.png +0 -0
  113. package/generator/test/azure/mock_api_tests/test_azure_arm_commonproperties.py +0 -89
  114. package/generator/test/azure/mock_api_tests/test_azure_arm_largeheader.py +0 -27
  115. package/generator/test/azure/mock_api_tests/test_azure_arm_nonresource.py +0 -34
  116. package/generator/test/azure/mock_api_tests/test_azure_arm_operationtemplates.py +0 -180
  117. package/generator/test/azure/mock_api_tests/test_azure_arm_resource.py +0 -436
  118. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_access.py +0 -92
  119. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_header.py +0 -17
  120. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_path.py +0 -17
  121. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_query.py +0 -17
  122. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_default_value.py +0 -42
  123. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_initialization.py +0 -51
  124. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_location.py +0 -70
  125. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_deserialize_empty_string_as_null.py +0 -19
  126. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_flatten.py +0 -104
  127. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_hierrarchy_building.py +0 -45
  128. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_next_link_verb.py +0 -27
  129. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_override.py +0 -102
  130. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_usage.py +0 -32
  131. package/generator/test/azure/mock_api_tests/test_azure_core_basic.py +0 -70
  132. package/generator/test/azure/mock_api_tests/test_azure_core_lro_rpc.py +0 -20
  133. package/generator/test/azure/mock_api_tests/test_azure_core_lro_standard.py +0 -32
  134. package/generator/test/azure/mock_api_tests/test_azure_core_model.py +0 -30
  135. package/generator/test/azure/mock_api_tests/test_azure_core_page.py +0 -71
  136. package/generator/test/azure/mock_api_tests/test_azure_core_scalar.py +0 -35
  137. package/generator/test/azure/mock_api_tests/test_azure_core_traits.py +0 -85
  138. package/generator/test/azure/mock_api_tests/test_azure_encode_duration.py +0 -18
  139. package/generator/test/azure/mock_api_tests/test_azure_example_basic.py +0 -29
  140. package/generator/test/azure/mock_api_tests/test_azure_payload_pageable.py +0 -18
  141. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_method_subscription_id.py +0 -235
  142. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service.py +0 -104
  143. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service_shared_models.py +0 -128
  144. package/generator/test/azure/mock_api_tests/test_azure_special_headers_client_request_id.py +0 -29
  145. package/generator/test/azure/mock_api_tests/test_azure_versioning_previewversion.py +0 -50
  146. package/generator/test/azure/mock_api_tests/test_clear_output_folder.py +0 -23
  147. package/generator/test/azure/mock_api_tests/test_client_namespace.py +0 -32
  148. package/generator/test/azure/mock_api_tests/test_client_naming.py +0 -57
  149. package/generator/test/azure/mock_api_tests/test_client_naming_enum_conflict.py +0 -35
  150. package/generator/test/azure/mock_api_tests/test_client_overload.py +0 -25
  151. package/generator/test/azure/mock_api_tests/test_client_structure.py +0 -60
  152. package/generator/test/azure/mock_api_tests/test_client_structure_clientoperationgroup.py +0 -29
  153. package/generator/test/azure/mock_api_tests/test_encode_duration.py +0 -60
  154. package/generator/test/azure/mock_api_tests/test_encode_numeric.py +0 -31
  155. package/generator/test/azure/mock_api_tests/test_model_base_flatten_compatibility.py +0 -251
  156. package/generator/test/azure/mock_api_tests/test_parameters_basic.py +0 -22
  157. package/generator/test/azure/mock_api_tests/test_parameters_spread.py +0 -66
  158. package/generator/test/azure/mock_api_tests/test_payload_content_negotiation.py +0 -33
  159. package/generator/test/azure/mock_api_tests/test_payload_multipart.py +0 -198
  160. package/generator/test/azure/mock_api_tests/test_resiliency_srv_driven.py +0 -124
  161. package/generator/test/azure/mock_api_tests/test_serialization_encoded_name_json.py +0 -21
  162. package/generator/test/azure/mock_api_tests/test_service_multi_service.py +0 -29
  163. package/generator/test/azure/mock_api_tests/test_special_words.py +0 -63
  164. package/generator/test/azure/requirements.txt +0 -125
  165. package/generator/test/azure/tox.ini +0 -64
  166. package/generator/test/data/image.jpg +0 -0
  167. package/generator/test/data/image.png +0 -0
  168. package/generator/test/dev_requirements.txt +0 -8
  169. package/generator/test/generic_mock_api_tests/asynctests/test_authentication_async.py +0 -140
  170. package/generator/test/generic_mock_api_tests/asynctests/test_encode_array_async.py +0 -139
  171. package/generator/test/generic_mock_api_tests/asynctests/test_encode_bytes_async.py +0 -132
  172. package/generator/test/generic_mock_api_tests/asynctests/test_encode_datetime_async.py +0 -127
  173. package/generator/test/generic_mock_api_tests/asynctests/test_headasboolean_async.py +0 -35
  174. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_body_optionality_async.py +0 -30
  175. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_collection_format_async.py +0 -38
  176. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_path_async.py +0 -24
  177. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_query_async.py +0 -18
  178. package/generator/test/generic_mock_api_tests/asynctests/test_payload_json_merge_patch_async.py +0 -98
  179. package/generator/test/generic_mock_api_tests/asynctests/test_payload_media_type_async.py +0 -27
  180. package/generator/test/generic_mock_api_tests/asynctests/test_payload_pageable_async.py +0 -134
  181. package/generator/test/generic_mock_api_tests/asynctests/test_payload_xml_async.py +0 -150
  182. package/generator/test/generic_mock_api_tests/asynctests/test_response_status_code_range_async.py +0 -38
  183. package/generator/test/generic_mock_api_tests/asynctests/test_routes_async.py +0 -331
  184. package/generator/test/generic_mock_api_tests/asynctests/test_server_endpoint_not_defined_async.py +0 -18
  185. package/generator/test/generic_mock_api_tests/asynctests/test_server_path_multiple_async.py +0 -25
  186. package/generator/test/generic_mock_api_tests/asynctests/test_server_path_single_async.py +0 -18
  187. package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_not_versioned_async.py +0 -28
  188. package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_versioned_async.py +0 -34
  189. package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_conditional_request_async.py +0 -38
  190. package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_repeatability_async.py +0 -19
  191. package/generator/test/generic_mock_api_tests/asynctests/test_specs_documentation_async.py +0 -59
  192. package/generator/test/generic_mock_api_tests/asynctests/test_streaming_jsonl_async.py +0 -27
  193. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_array_async.py +0 -127
  194. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_dictionary_async.py +0 -98
  195. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_extensible_async.py +0 -25
  196. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_fixed_async.py +0 -27
  197. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_file_async.py +0 -59
  198. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_empty_async.py +0 -32
  199. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_enum_discriminator_async.py +0 -70
  200. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_nested_discriminator_async.py +0 -85
  201. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_not_discriminated_async.py +0 -34
  202. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_recursive_async.py +0 -34
  203. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_single_discriminator_async.py +0 -67
  204. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_usage_async.py +0 -32
  205. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_visibility_async.py +0 -47
  206. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_additionalproperties_async.py +0 -353
  207. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py +0 -110
  208. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_optional_async.py +0 -197
  209. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_valuetypes_async.py +0 -315
  210. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_scalar_async.py +0 -60
  211. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_union_async.py +0 -90
  212. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_added_async.py +0 -36
  213. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_made_optional_async.py +0 -21
  214. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_removed_async.py +0 -39
  215. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_renamed_from_async.py +0 -29
  216. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_return_type_changed_from_async.py +0 -18
  217. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_type_changed_from_async.py +0 -22
  218. package/generator/test/generic_mock_api_tests/conftest.py +0 -75
  219. package/generator/test/generic_mock_api_tests/data/image.jpg +0 -0
  220. package/generator/test/generic_mock_api_tests/data/image.png +0 -0
  221. package/generator/test/generic_mock_api_tests/test_authentication.py +0 -130
  222. package/generator/test/generic_mock_api_tests/test_encode_array.py +0 -126
  223. package/generator/test/generic_mock_api_tests/test_encode_bytes.py +0 -128
  224. package/generator/test/generic_mock_api_tests/test_encode_datetime.py +0 -123
  225. package/generator/test/generic_mock_api_tests/test_headasboolean.py +0 -33
  226. package/generator/test/generic_mock_api_tests/test_parameters_body_optionality.py +0 -27
  227. package/generator/test/generic_mock_api_tests/test_parameters_collection_format.py +0 -33
  228. package/generator/test/generic_mock_api_tests/test_parameters_path.py +0 -22
  229. package/generator/test/generic_mock_api_tests/test_parameters_query.py +0 -17
  230. package/generator/test/generic_mock_api_tests/test_payload_json_merge_patch.py +0 -93
  231. package/generator/test/generic_mock_api_tests/test_payload_media_type.py +0 -25
  232. package/generator/test/generic_mock_api_tests/test_payload_pageable.py +0 -99
  233. package/generator/test/generic_mock_api_tests/test_payload_xml.py +0 -135
  234. package/generator/test/generic_mock_api_tests/test_response_status_code_range.py +0 -36
  235. package/generator/test/generic_mock_api_tests/test_routes.py +0 -285
  236. package/generator/test/generic_mock_api_tests/test_server_endpoint_not_defined.py +0 -17
  237. package/generator/test/generic_mock_api_tests/test_server_path_multiple.py +0 -21
  238. package/generator/test/generic_mock_api_tests/test_server_path_single.py +0 -17
  239. package/generator/test/generic_mock_api_tests/test_server_versions_not_versioned.py +0 -25
  240. package/generator/test/generic_mock_api_tests/test_server_versions_versioned.py +0 -30
  241. package/generator/test/generic_mock_api_tests/test_special_headers_conditional_request.py +0 -34
  242. package/generator/test/generic_mock_api_tests/test_special_headers_repeatability.py +0 -18
  243. package/generator/test/generic_mock_api_tests/test_specs_documentation.py +0 -51
  244. package/generator/test/generic_mock_api_tests/test_streaming_jsonl.py +0 -25
  245. package/generator/test/generic_mock_api_tests/test_typetest_array.py +0 -111
  246. package/generator/test/generic_mock_api_tests/test_typetest_dictionary.py +0 -86
  247. package/generator/test/generic_mock_api_tests/test_typetest_enum_extensible.py +0 -23
  248. package/generator/test/generic_mock_api_tests/test_typetest_enum_fixed.py +0 -25
  249. package/generator/test/generic_mock_api_tests/test_typetest_file.py +0 -52
  250. package/generator/test/generic_mock_api_tests/test_typetest_model_empty.py +0 -29
  251. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_enum_discriminator.py +0 -58
  252. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_nested_discriminator.py +0 -79
  253. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_not_discriminated.py +0 -31
  254. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_recursive.py +0 -32
  255. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_single_discriminator.py +0 -60
  256. package/generator/test/generic_mock_api_tests/test_typetest_model_usage.py +0 -28
  257. package/generator/test/generic_mock_api_tests/test_typetest_model_visibility.py +0 -40
  258. package/generator/test/generic_mock_api_tests/test_typetest_property_additionalproperties.py +0 -314
  259. package/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py +0 -102
  260. package/generator/test/generic_mock_api_tests/test_typetest_property_optional.py +0 -174
  261. package/generator/test/generic_mock_api_tests/test_typetest_property_valuetypes.py +0 -286
  262. package/generator/test/generic_mock_api_tests/test_typetest_scalar.py +0 -53
  263. package/generator/test/generic_mock_api_tests/test_typetest_union.py +0 -80
  264. package/generator/test/generic_mock_api_tests/test_typetest_union_discriminated.py +0 -290
  265. package/generator/test/generic_mock_api_tests/test_versioning_added.py +0 -33
  266. package/generator/test/generic_mock_api_tests/test_versioning_made_optional.py +0 -20
  267. package/generator/test/generic_mock_api_tests/test_versioning_removed.py +0 -37
  268. package/generator/test/generic_mock_api_tests/test_versioning_renamed_from.py +0 -27
  269. package/generator/test/generic_mock_api_tests/test_versioning_return_type_changed_from.py +0 -17
  270. package/generator/test/generic_mock_api_tests/test_versioning_type_changed_from.py +0 -21
  271. package/generator/test/unbranded/mock_api_tests/asynctests/test_auth_flow_async.py +0 -19
  272. package/generator/test/unbranded/mock_api_tests/asynctests/test_encode_duration_async.py +0 -63
  273. package/generator/test/unbranded/mock_api_tests/asynctests/test_encode_numeric_async.py +0 -35
  274. package/generator/test/unbranded/mock_api_tests/asynctests/test_parameters_basic_async.py +0 -24
  275. package/generator/test/unbranded/mock_api_tests/asynctests/test_parameters_spread_async.py +0 -76
  276. package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_content_negotiation_async.py +0 -37
  277. package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_multipart_async.py +0 -218
  278. package/generator/test/unbranded/mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +0 -24
  279. package/generator/test/unbranded/mock_api_tests/asynctests/test_special_words_async.py +0 -73
  280. package/generator/test/unbranded/mock_api_tests/asynctests/test_unbranded_async.py +0 -24
  281. package/generator/test/unbranded/mock_api_tests/conftest.py +0 -91
  282. package/generator/test/unbranded/mock_api_tests/data/image.jpg +0 -0
  283. package/generator/test/unbranded/mock_api_tests/data/image.png +0 -0
  284. package/generator/test/unbranded/mock_api_tests/test_auth_flow.py +0 -17
  285. package/generator/test/unbranded/mock_api_tests/test_encode_duration.py +0 -60
  286. package/generator/test/unbranded/mock_api_tests/test_encode_numeric.py +0 -32
  287. package/generator/test/unbranded/mock_api_tests/test_parameters_basic.py +0 -22
  288. package/generator/test/unbranded/mock_api_tests/test_parameters_spread.py +0 -66
  289. package/generator/test/unbranded/mock_api_tests/test_payload_content_negotiation.py +0 -33
  290. package/generator/test/unbranded/mock_api_tests/test_payload_multipart.py +0 -200
  291. package/generator/test/unbranded/mock_api_tests/test_serialization_encoded_name_json.py +0 -22
  292. package/generator/test/unbranded/mock_api_tests/test_special_words.py +0 -66
  293. package/generator/test/unbranded/mock_api_tests/test_unbranded.py +0 -65
  294. package/generator/test/unbranded/requirements.txt +0 -69
  295. package/generator/test/unbranded/tox.ini +0 -64
  296. package/generator/test/unittests/conftest.py +0 -15
  297. package/generator/test/unittests/requirements.txt +0 -3
  298. package/generator/test/unittests/test_enums.py +0 -89
  299. package/generator/test/unittests/test_model_base_serialization.py +0 -4906
  300. package/generator/test/unittests/test_model_base_xml_serialization.py +0 -1239
  301. package/generator/test/unittests/test_name_converter.py +0 -35
  302. package/generator/test/unittests/test_optional_return_type.py +0 -268
  303. package/generator/test/unittests/test_parameter_ordering.py +0 -104
  304. package/generator/test/unittests/test_sort_schema.py +0 -93
  305. package/generator/test/unittests/tox.ini +0 -5
  306. /package/eng/scripts/ci/{mypy.ini → config/mypy.ini} +0 -0
  307. /package/eng/scripts/ci/{pylintrc → config/pylintrc} +0 -0
  308. /package/eng/scripts/ci/{pyproject.toml → config/pyproject.toml} +0 -0
  309. /package/eng/scripts/ci/{pyrightconfig.json → config/pyrightconfig.json} +0 -0
@@ -1,41 +1,91 @@
1
1
  /* eslint-disable no-console */
2
- import chalk from "chalk";
3
- import { execFile } from "child_process";
2
+ /**
3
+ * Regenerates Python SDK code from TypeSpec definitions.
4
+ *
5
+ * Uses in-process TypeSpec compilation to avoid subprocess spawning overhead.
6
+ * This is significantly faster than spawning `tsp compile` for each spec.
7
+ */
8
+
9
+ import { compile, NodeHost } from "@typespec/compiler";
4
10
  import { promises, rmSync } from "fs";
5
- import { join, resolve } from "path";
11
+ import { platform } from "os";
12
+ import { dirname, join, relative, resolve } from "path";
13
+ import pc from "picocolors";
6
14
  import { fileURLToPath } from "url";
7
- import { parseArgs, promisify } from "util";
15
+ import { parseArgs } from "util";
8
16
  import {
9
17
  BASE_AZURE_EMITTER_OPTIONS,
10
18
  BASE_EMITTER_OPTIONS,
11
- buildOptions,
12
- regenerate,
19
+ getSubdirectories,
20
+ SpecialFlags,
13
21
  toPosix,
14
- type RegenerateConfig,
15
22
  type RegenerateFlags,
16
- type RegenerateFlagsInput,
17
- type TspCommand,
18
23
  } from "./regenerate-common.js";
19
24
 
20
- // PARSE INPUT ARGUMENTS
21
-
25
+ // Parse arguments
22
26
  const argv = parseArgs({
23
27
  args: process.argv.slice(2),
24
28
  options: {
25
- flavor: { type: "string" },
26
- name: { type: "string" },
27
- debug: { type: "boolean" },
29
+ flavor: { type: "string", short: "f" },
30
+ name: { type: "string", short: "n" },
31
+ debug: { type: "boolean", short: "d" },
28
32
  pluginDir: { type: "string" },
29
33
  emitterName: { type: "string" },
30
34
  generatedFolder: { type: "string" },
31
- pyodide: { type: "boolean" },
35
+ jobs: { type: "string", short: "j" },
36
+ help: { type: "boolean", short: "h" },
32
37
  },
33
38
  });
34
39
 
35
- // Get the directory of the current file
40
+ if (argv.values.help) {
41
+ console.log(`
42
+ ${pc.bold("Usage:")} tsx regenerate.ts [options]
43
+
44
+ ${pc.bold("Description:")}
45
+ Regenerates Python SDK code from TypeSpec definitions using in-process compilation.
46
+ This avoids spawning a new Node.js process for each spec, making it significantly faster.
47
+
48
+ ${pc.bold("Options:")}
49
+ ${pc.cyan("-f, --flavor <azure|unbranded>")}
50
+ SDK flavor to regenerate. If not specified, regenerates both flavors.
51
+
52
+ ${pc.cyan("-n, --name <pattern>")}
53
+ Filter packages by name pattern (case-insensitive substring match).
54
+ Examples:
55
+ --name xml Regenerate packages containing "xml"
56
+ --name authentication Regenerate authentication packages
57
+ --name type/array Regenerate the type/array package
58
+
59
+ ${pc.cyan("-d, --debug")}
60
+ Enable debug output during regeneration.
61
+
62
+ ${pc.cyan("-j, --jobs <n>")}
63
+ Number of parallel compilation tasks (default: 30 on Linux/Mac, 10 on Windows).
64
+
65
+ ${pc.cyan("-h, --help")}
66
+ Show this help message.
67
+
68
+ ${pc.bold("Examples:")}
69
+ ${pc.dim("# Regenerate all packages for both flavors")}
70
+ tsx regenerate.ts
71
+
72
+ ${pc.dim("# Regenerate only Azure packages")}
73
+ tsx regenerate.ts --flavor azure
74
+
75
+ ${pc.dim("# Regenerate a specific package by name")}
76
+ tsx regenerate.ts --flavor azure --name authentication-api-key
77
+
78
+ ${pc.dim("# Regenerate with more parallelism")}
79
+ tsx regenerate.ts --jobs 50
80
+ `);
81
+ process.exit(0);
82
+ }
83
+
84
+ // Get paths
85
+ const SCRIPT_DIR = dirname(fileURLToPath(import.meta.url));
36
86
  const PLUGIN_DIR = argv.values.pluginDir
37
87
  ? resolve(argv.values.pluginDir)
38
- : resolve(fileURLToPath(import.meta.url), "../../../../");
88
+ : resolve(SCRIPT_DIR, "../../../");
39
89
  const AZURE_HTTP_SPECS = resolve(PLUGIN_DIR, "node_modules/@azure-tools/azure-http-specs/specs");
40
90
  const HTTP_SPECS = resolve(PLUGIN_DIR, "node_modules/@typespec/http-specs/specs");
41
91
  const GENERATED_FOLDER = argv.values.generatedFolder
@@ -43,6 +93,7 @@ const GENERATED_FOLDER = argv.values.generatedFolder
43
93
  : resolve(PLUGIN_DIR, "generator");
44
94
  const EMITTER_NAME = argv.values.emitterName || "@typespec/http-client-python";
45
95
 
96
+ // Emitter options
46
97
  const AZURE_EMITTER_OPTIONS: Record<string, Record<string, string> | Record<string, string>[]> = {
47
98
  ...BASE_AZURE_EMITTER_OPTIONS,
48
99
  "client/structure/client-operation-group": {
@@ -56,82 +107,268 @@ const EMITTER_OPTIONS: Record<string, Record<string, string> | Record<string, st
56
107
  "type/array": {
57
108
  "package-name": "typetest-array",
58
109
  namespace: "typetest.array",
59
- "use-pyodide": "true",
60
110
  },
61
111
  "type/model/inheritance/recursive": {
62
112
  "package-name": "typetest-model-recursive",
63
113
  namespace: "typetest.model.recursive",
64
- "use-pyodide": "true",
65
114
  },
66
115
  };
67
116
 
68
- // Function to execute CLI commands asynchronously
69
- async function executeCommand(tspCommand: TspCommand): Promise<void> {
70
- const cmd = tspCommand.command as string[];
71
- const execFileAsync = promisify(execFile);
117
+ interface CompileTask {
118
+ spec: string;
119
+ outputDir: string;
120
+ options: Record<string, unknown>;
121
+ }
122
+
123
+ // Group of tasks for the same spec that must run sequentially
124
+ interface TaskGroup {
125
+ spec: string;
126
+ tasks: CompileTask[];
127
+ }
128
+
129
+ function defaultPackageName(spec: string): string {
130
+ const specDir = spec.includes("azure") ? AZURE_HTTP_SPECS : HTTP_SPECS;
131
+ return toPosix(relative(specDir, dirname(spec)))
132
+ .replace(/\//g, "-")
133
+ .toLowerCase();
134
+ }
135
+
136
+ function getEmitterOptions(spec: string, flavor: string): Record<string, string>[] {
137
+ const specDir = spec.includes("azure") ? AZURE_HTTP_SPECS : HTTP_SPECS;
138
+ const relativeSpec = toPosix(relative(specDir, spec));
139
+ const key = relativeSpec.includes("resiliency/srv-driven/old.tsp")
140
+ ? relativeSpec
141
+ : dirname(relativeSpec);
142
+ const emitterOpts = EMITTER_OPTIONS[key] ||
143
+ (flavor === "azure" ? AZURE_EMITTER_OPTIONS[key] : [{}]) || [{}];
144
+ return Array.isArray(emitterOpts) ? emitterOpts : [emitterOpts];
145
+ }
146
+
147
+ function buildTaskGroups(specs: string[], flags: RegenerateFlags): TaskGroup[] {
148
+ const groups: TaskGroup[] = [];
149
+
150
+ for (const spec of specs) {
151
+ const tasks: CompileTask[] = [];
152
+
153
+ for (const emitterConfig of getEmitterOptions(spec, flags.flavor)) {
154
+ const options: Record<string, unknown> = { ...emitterConfig };
155
+
156
+ // Add flavor-specific options
157
+ options["flavor"] = flags.flavor;
158
+ for (const [k, v] of Object.entries(SpecialFlags[flags.flavor] ?? {})) {
159
+ options[k] = v;
160
+ }
161
+
162
+ // Set output directory - use tests/generated/<flavor>/<package> structure
163
+ const packageName = (options["package-name"] as string) || defaultPackageName(spec);
164
+ const outputDir =
165
+ (options["emitter-output-dir"] as string) ||
166
+ toPosix(`${GENERATED_FOLDER}/../tests/generated/${flags.flavor}/${packageName}`);
167
+ options["emitter-output-dir"] = outputDir;
168
+
169
+ // Debug mode
170
+ if (flags.debug) {
171
+ options["debug"] = true;
172
+ }
173
+
174
+ // Examples directory
175
+ options["examples-dir"] = toPosix(join(dirname(spec), "examples"));
176
+
177
+ tasks.push({ spec, outputDir, options });
178
+ }
179
+
180
+ groups.push({ spec, tasks });
181
+ }
182
+
183
+ return groups;
184
+ }
185
+
186
+ async function compileSpec(task: CompileTask): Promise<{ success: boolean; error?: string }> {
187
+ const { spec, outputDir, options } = task;
188
+
72
189
  try {
73
- console.log(chalk.green(`start tsp ${cmd.join(" ")}`));
74
- await execFileAsync("tsp", cmd, { shell: true });
75
- console.log(chalk.green(`tsp ${cmd.join(" ")} succeeded`));
190
+ // Build compiler options
191
+ const compilerOptions = {
192
+ emit: [PLUGIN_DIR],
193
+ options: {
194
+ [EMITTER_NAME]: options,
195
+ },
196
+ };
197
+
198
+ // Compile using TypeSpec compiler directly (no subprocess)
199
+ const program = await compile(NodeHost, spec, compilerOptions);
200
+
201
+ if (program.hasError()) {
202
+ const errors = program.diagnostics
203
+ .filter((d) => d.severity === "error")
204
+ .map((d) => d.message)
205
+ .join("\n");
206
+ return { success: false, error: errors };
207
+ }
208
+
209
+ return { success: true };
76
210
  } catch (err) {
77
- rmSync(tspCommand.outputDir, { recursive: true, force: true });
78
- console.error(chalk.red(`exec error: ${err}`));
79
- throw err;
211
+ // Clean up on error
212
+ rmSync(outputDir, { recursive: true, force: true });
213
+ return { success: false, error: String(err) };
214
+ }
215
+ }
216
+
217
+ async function runParallel(groups: TaskGroup[], maxJobs: number): Promise<Map<string, boolean>> {
218
+ const results = new Map<string, boolean>();
219
+ const executing: Set<Promise<void>> = new Set();
220
+
221
+ // Count total tasks for progress
222
+ const totalTasks = groups.reduce((sum, g) => sum + g.tasks.length, 0);
223
+ let completed = 0;
224
+
225
+ for (const group of groups) {
226
+ // Each group runs as a unit - tasks within a group run sequentially
227
+ // But different groups can run in parallel
228
+ const runGroup = async () => {
229
+ const specDir = group.spec.includes("azure") ? AZURE_HTTP_SPECS : HTTP_SPECS;
230
+ const shortName = toPosix(relative(specDir, dirname(group.spec)));
231
+
232
+ // Run all tasks in this group sequentially to avoid state pollution
233
+ let groupSuccess = true;
234
+ for (const task of group.tasks) {
235
+ const packageName = (task.options["package-name"] as string) || shortName;
236
+ console.log(pc.blue(`[${completed + 1}/${totalTasks}] Compiling ${packageName}...`));
237
+
238
+ const result = await compileSpec(task);
239
+ completed++;
240
+
241
+ if (result.success) {
242
+ console.log(pc.green(`[${completed}/${totalTasks}] ${packageName} succeeded`));
243
+ } else {
244
+ console.log(
245
+ pc.red(`[${completed}/${totalTasks}] ${packageName} failed: ${result.error}`),
246
+ );
247
+ groupSuccess = false;
248
+ }
249
+ }
250
+
251
+ results.set(group.spec, groupSuccess);
252
+ };
253
+
254
+ const p = runGroup().finally(() => executing.delete(p));
255
+ executing.add(p);
256
+
257
+ if (executing.size >= maxJobs) {
258
+ await Promise.race(executing);
259
+ }
80
260
  }
261
+
262
+ await Promise.all(executing);
263
+ return results;
81
264
  }
82
265
 
83
- // create some files before regeneration. After regeneration, these files should be deleted and we will test it
84
- // in test case
85
- async function preprocess(flags: RegenerateFlagsInput): Promise<void> {
86
- if (flags.flavor === "azure") {
87
- // create folder if not exists
266
+ // Preprocess: create files that should be deleted after regeneration (for testing)
267
+ async function preprocess(flavor: string): Promise<void> {
268
+ if (flavor === "azure") {
269
+ // Use tests/generated/<flavor>/<package> structure (same as output)
270
+ const testsGeneratedDir = resolve(GENERATED_FOLDER, "../tests/generated");
88
271
  const folderParts = [
89
- "test",
90
272
  "azure",
91
- "generated",
92
273
  "authentication-api-key",
93
274
  "authentication",
94
275
  "apikey",
95
276
  "_operations",
96
277
  ];
97
- await promises.mkdir(join(GENERATED_FOLDER, ...folderParts), { recursive: true });
278
+ await promises.mkdir(join(testsGeneratedDir, ...folderParts), { recursive: true });
98
279
  await promises.writeFile(
99
- join(GENERATED_FOLDER, ...folderParts, "to_be_deleted.py"),
280
+ join(testsGeneratedDir, ...folderParts, "to_be_deleted.py"),
100
281
  "# This file is to be deleted after regeneration",
101
282
  );
102
283
  }
103
284
  }
104
285
 
105
- function _getCmdList(spec: string, flags: RegenerateFlags): TspCommand[] {
106
- return buildOptions(spec, GENERATED_FOLDER, flags, config).map((po) => {
107
- const optionArgs = Object.entries(po.options).flatMap(([k, v]) => [
108
- "--option",
109
- `${EMITTER_NAME}.${k}="${v}"`,
110
- ]);
111
- return {
112
- outputDir: po.outputDir,
113
- command: ["compile", spec, "--emit", toPosix(PLUGIN_DIR), ...optionArgs],
114
- };
115
- });
286
+ async function regenerateFlavor(
287
+ flavor: string,
288
+ name: string | undefined,
289
+ debug: boolean,
290
+ jobs: number,
291
+ ): Promise<boolean> {
292
+ console.log(pc.cyan(`\n${"=".repeat(60)}`));
293
+ console.log(pc.cyan(`Regenerating ${flavor} flavor`));
294
+ console.log(pc.cyan(`${"=".repeat(60)}\n`));
295
+
296
+ const flags: RegenerateFlags = { flavor, debug, name };
297
+
298
+ // Preprocess
299
+ await preprocess(flavor);
300
+
301
+ // Collect specs
302
+ const azureSpecs = flavor === "azure" ? await getSubdirectories(AZURE_HTTP_SPECS, flags) : [];
303
+ const standardSpecs = await getSubdirectories(HTTP_SPECS, flags);
304
+ const allSpecs = [...azureSpecs, ...standardSpecs];
305
+
306
+ // Build task groups (tasks for same spec run sequentially to avoid state pollution)
307
+ const groups = buildTaskGroups(allSpecs, flags);
308
+ const totalTasks = groups.reduce((sum, g) => sum + g.tasks.length, 0);
309
+
310
+ console.log(pc.cyan(`Found ${allSpecs.length} specs (${totalTasks} total tasks) to compile`));
311
+ console.log(pc.cyan(`Using ${jobs} parallel jobs\n`));
312
+
313
+ // Run compilation
314
+ const startTime = performance.now();
315
+ const results = await runParallel(groups, jobs);
316
+ const duration = (performance.now() - startTime) / 1000;
317
+
318
+ // Summary
319
+ const succeeded = Array.from(results.values()).filter((v) => v).length;
320
+ const failed = results.size - succeeded;
321
+
322
+ console.log(pc.cyan(`\n${"=".repeat(60)}`));
323
+ console.log(pc.cyan(`Results: ${succeeded} succeeded, ${failed} failed`));
324
+ console.log(pc.cyan(`Time: ${duration.toFixed(1)}s`));
325
+ console.log(pc.cyan(`${"=".repeat(60)}\n`));
326
+
327
+ return failed === 0;
116
328
  }
117
329
 
118
- const config: RegenerateConfig = {
119
- azureHttpSpecs: AZURE_HTTP_SPECS,
120
- httpSpecs: HTTP_SPECS,
121
- emitterOptions: EMITTER_OPTIONS,
122
- azureEmitterOptions: AZURE_EMITTER_OPTIONS,
123
- preprocess,
124
- getCmdList: _getCmdList,
125
- executeCommand,
126
- };
330
+ async function main() {
331
+ const isWindows = platform() === "win32";
332
+ const flavor = argv.values.flavor;
333
+ const name = argv.values.name;
334
+ const debug = argv.values.debug ?? false;
335
+ // Windows has slower file system operations and process spawning,
336
+ // so use fewer parallel jobs to avoid I/O contention and memory pressure
337
+ const defaultJobs = isWindows ? 10 : 30;
338
+ const jobs = argv.values.jobs ? parseInt(argv.values.jobs, 10) : defaultJobs;
127
339
 
128
- const start = performance.now();
129
- regenerate(argv.values, config)
130
- .then(() =>
131
- console.log(
132
- chalk.green(
133
- `Regeneration successful, time taken: ${Math.round((performance.now() - start) / 1000)} s`,
134
- ),
135
- ),
136
- )
137
- .catch((error) => console.error(chalk.red(`Regeneration failed: ${error.message}`)));
340
+ console.log(pc.cyan(`\nRegeneration config:`));
341
+ console.log(pc.cyan(` Platform: ${isWindows ? "Windows" : "Unix"}`));
342
+ console.log(pc.cyan(` Mode: in-process compilation`));
343
+ console.log(pc.cyan(` Jobs: ${jobs}`));
344
+ if (name) {
345
+ console.log(pc.cyan(` Filter: ${name}`));
346
+ }
347
+ console.log();
348
+
349
+ const startTime = performance.now();
350
+ let success: boolean;
351
+
352
+ if (flavor) {
353
+ success = await regenerateFlavor(flavor, name, debug, jobs);
354
+ } else {
355
+ // Both flavors
356
+ const azureSuccess = await regenerateFlavor("azure", name, debug, jobs);
357
+ const unbrandedSuccess = await regenerateFlavor("unbranded", name, debug, jobs);
358
+ success = azureSuccess && unbrandedSuccess;
359
+ }
360
+
361
+ const totalDuration = (performance.now() - startTime) / 1000;
362
+ console.log(
363
+ success
364
+ ? pc.green(`\nRegeneration completed successfully in ${totalDuration.toFixed(1)}s`)
365
+ : pc.red(`\nRegeneration failed after ${totalDuration.toFixed(1)}s`),
366
+ );
367
+
368
+ process.exit(success ? 0 : 1);
369
+ }
370
+
371
+ main().catch((err) => {
372
+ console.error(pc.red(`Fatal error: ${err}`));
373
+ process.exit(1);
374
+ });