@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
@@ -0,0 +1,402 @@
1
+ /* eslint-disable no-console */
2
+ import { ChildProcess, spawn } from "child_process";
3
+ import fs from "fs";
4
+ import { cpus } from "os";
5
+ import { dirname, join } from "path";
6
+ import pc from "picocolors";
7
+ import { fileURLToPath } from "url";
8
+ import { parseArgs } from "util";
9
+
10
+ const root = join(dirname(fileURLToPath(import.meta.url)), "../../../");
11
+ const monorepoRoot = join(root, "../../");
12
+ const testsDir = join(root, "tests");
13
+
14
+ const argv = parseArgs({
15
+ args: process.argv.slice(2),
16
+ options: {
17
+ emitter: { type: "boolean", short: "e" },
18
+ generator: { type: "boolean", short: "g" },
19
+ flavor: { type: "string", short: "f", default: "all" },
20
+ env: { type: "string" },
21
+ jobs: { type: "string", short: "j" },
22
+ name: { type: "string", short: "n" },
23
+ quiet: { type: "boolean", short: "q", default: false },
24
+ help: { type: "boolean", short: "h", default: false },
25
+ },
26
+ });
27
+
28
+ if (argv.values.help) {
29
+ console.log(`
30
+ Usage: run-tests.ts [options]
31
+
32
+ Options:
33
+ -e, --emitter Run TypeScript emitter tests (vitest)
34
+ -g, --generator Run Python generator tests (tox)
35
+ -f, --flavor <azure|unbranded> SDK flavor to test (only applies to --generator)
36
+ If not specified, tests both flavors
37
+ --env <env1,env2,...> Specific tox environments to run
38
+ Available: test, lint, mypy, pyright, docs, ci, unittest
39
+ -j, --jobs <n> Number of parallel jobs (default: CPU cores - 2)
40
+ -n, --name <pattern> Filter tests by name pattern
41
+ -q, --quiet Suppress test output (only show pass/fail summary)
42
+ -h, --help Show this help message
43
+
44
+ Environments (for --generator):
45
+ test Run pytest tests for generated packages
46
+ lint Run pylint on generated packages
47
+ mypy Run mypy type checking on generated packages
48
+ pyright Run pyright type checking on generated packages
49
+ docs Run documentation validation (apiview, sphinx)
50
+ ci Run all checks (test + lint + mypy + pyright)
51
+ unittest Run unit tests for pygen internals
52
+
53
+ Examples:
54
+ run-tests.ts # Run all tests (emitter + generator)
55
+ run-tests.ts --emitter # Run only emitter tests
56
+ run-tests.ts --generator # Run generator tests for all flavors
57
+ run-tests.ts --generator --flavor=azure # Run generator tests for azure only
58
+ run-tests.ts -g -f azure --env=test # Run pytest for azure only
59
+ run-tests.ts -g --env=mypy # Run mypy for all flavors
60
+ run-tests.ts -g -f unbranded --env=lint # Run pylint for unbranded only
61
+ `);
62
+ process.exit(0);
63
+ }
64
+
65
+ // Get Python venv path
66
+ function getVenvPython(): string {
67
+ const venvPath = join(root, "venv");
68
+ if (fs.existsSync(join(venvPath, "bin"))) {
69
+ return join(venvPath, "bin", "python");
70
+ } else if (fs.existsSync(join(venvPath, "Scripts"))) {
71
+ return join(venvPath, "Scripts", "python.exe");
72
+ }
73
+ throw new Error("Virtual environment not found. Run 'npm run install' first.");
74
+ }
75
+
76
+ interface ToxResult {
77
+ env: string;
78
+ success: boolean;
79
+ duration: number;
80
+ error?: string;
81
+ }
82
+
83
+ async function runToxEnv(env: string, pythonPath: string, name?: string): Promise<ToxResult> {
84
+ const startTime = Date.now();
85
+ const toxIniPath = join(testsDir, "tox.ini");
86
+
87
+ // Build command
88
+ const args = ["-m", "tox", "-c", toxIniPath, "-e", env];
89
+ if (name) {
90
+ args.push("--", "-k", name);
91
+ }
92
+
93
+ console.log(`${pc.blue("[START]")} ${env}`);
94
+
95
+ return new Promise((resolve) => {
96
+ const proc: ChildProcess = spawn(pythonPath, args, {
97
+ cwd: testsDir,
98
+ stdio: !argv.values.quiet ? "inherit" : "pipe",
99
+ env: { ...process.env, FOLDER: env.split("-")[1] || "azure" },
100
+ });
101
+
102
+ let stderr = "";
103
+ if (argv.values.quiet && proc.stderr) {
104
+ proc.stderr.on("data", (data) => {
105
+ stderr += data.toString();
106
+ });
107
+ }
108
+
109
+ proc.on("close", (code) => {
110
+ const duration = (Date.now() - startTime) / 1000;
111
+ const success = code === 0;
112
+
113
+ if (success) {
114
+ console.log(`${pc.green("[PASS]")} ${env} (${duration.toFixed(1)}s)`);
115
+ } else {
116
+ console.log(`${pc.red("[FAIL]")} ${env} (${duration.toFixed(1)}s)`);
117
+ }
118
+
119
+ resolve({
120
+ env,
121
+ success,
122
+ duration,
123
+ error: success ? undefined : stderr || `Exit code: ${code}`,
124
+ });
125
+ });
126
+
127
+ proc.on("error", (err) => {
128
+ const duration = (Date.now() - startTime) / 1000;
129
+ console.log(`${pc.red("[ERROR]")} ${env}: ${err.message}`);
130
+ resolve({
131
+ env,
132
+ success: false,
133
+ duration,
134
+ error: err.message,
135
+ });
136
+ });
137
+ });
138
+ }
139
+
140
+ async function runParallel(
141
+ envs: string[],
142
+ pythonPath: string,
143
+ maxJobs: number,
144
+ name?: string,
145
+ ): Promise<ToxResult[]> {
146
+ const results: ToxResult[] = [];
147
+ const running: Map<string, Promise<ToxResult>> = new Map();
148
+
149
+ for (const env of envs) {
150
+ // Wait if we're at max capacity
151
+ if (running.size >= maxJobs) {
152
+ const completed = await Promise.race(running.values());
153
+ results.push(completed);
154
+ running.delete(completed.env);
155
+ }
156
+
157
+ // Start new task
158
+ const task = runToxEnv(env, pythonPath, name);
159
+ running.set(env, task);
160
+ }
161
+
162
+ // Wait for remaining tasks
163
+ const remaining = await Promise.all(running.values());
164
+ results.push(...remaining);
165
+
166
+ return results;
167
+ }
168
+
169
+ async function _runSequential(
170
+ envs: string[],
171
+ pythonPath: string,
172
+ name?: string,
173
+ ): Promise<ToxResult[]> {
174
+ const results: ToxResult[] = [];
175
+ for (const env of envs) {
176
+ const result = await runToxEnv(env, pythonPath, name);
177
+ results.push(result);
178
+ }
179
+ return results;
180
+ }
181
+
182
+ function printSummary(results: ToxResult[]): void {
183
+ console.log("\n" + pc.bold("═".repeat(60)));
184
+ console.log(pc.bold(" Test Results Summary"));
185
+ console.log(pc.bold("═".repeat(60)) + "\n");
186
+
187
+ const passed = results.filter((r) => r.success);
188
+ const failed = results.filter((r) => !r.success);
189
+ const totalDuration = results.reduce((sum, r) => sum + r.duration, 0);
190
+
191
+ for (const result of results) {
192
+ const status = result.success ? pc.green("PASS") : pc.red("FAIL");
193
+ console.log(` ${status} ${result.env} (${result.duration.toFixed(1)}s)`);
194
+ }
195
+
196
+ console.log("\n" + "─".repeat(60));
197
+ console.log(
198
+ ` ${pc.green(`Passed: ${passed.length}`)} ` +
199
+ `${pc.red(`Failed: ${failed.length}`)} ` +
200
+ `Total: ${results.length} ` +
201
+ `Duration: ${totalDuration.toFixed(1)}s`,
202
+ );
203
+ console.log("─".repeat(60) + "\n");
204
+
205
+ if (failed.length > 0) {
206
+ console.log(pc.red("Failed environments:"));
207
+ for (const result of failed) {
208
+ console.log(` - ${result.env}`);
209
+ if (result.error && !argv.values.quiet) {
210
+ console.log(` ${result.error.split("\n").slice(0, 5).join("\n ")}`);
211
+ }
212
+ }
213
+ console.log();
214
+ }
215
+ }
216
+
217
+ async function runEmitterTests(): Promise<ToxResult> {
218
+ const startTime = Date.now();
219
+ console.log(`${pc.blue("[START]")} emitter (vitest)`);
220
+
221
+ // Add node_modules/.bin directories to PATH so vitest can be found
222
+ const pathSep = process.platform === "win32" ? ";" : ":";
223
+ const binPaths = [
224
+ join(root, "node_modules", ".bin"),
225
+ join(monorepoRoot, "node_modules", ".bin"),
226
+ ].join(pathSep);
227
+ const env = {
228
+ ...process.env,
229
+ PATH: `${binPaths}${pathSep}${process.env.PATH}`,
230
+ };
231
+
232
+ return new Promise((resolve) => {
233
+ const proc: ChildProcess = spawn("vitest", ["run", "-c", "./emitter/vitest.config.ts"], {
234
+ cwd: root,
235
+ stdio: !argv.values.quiet ? "inherit" : "pipe",
236
+ shell: true,
237
+ env,
238
+ });
239
+
240
+ let stderr = "";
241
+ if (argv.values.quiet && proc.stderr) {
242
+ proc.stderr.on("data", (data) => {
243
+ stderr += data.toString();
244
+ });
245
+ }
246
+
247
+ proc.on("close", (code) => {
248
+ const duration = (Date.now() - startTime) / 1000;
249
+ const success = code === 0;
250
+
251
+ if (success) {
252
+ console.log(`${pc.green("[PASS]")} emitter (vitest) (${duration.toFixed(1)}s)`);
253
+ } else {
254
+ console.log(`${pc.red("[FAIL]")} emitter (vitest) (${duration.toFixed(1)}s)`);
255
+ }
256
+
257
+ resolve({
258
+ env: "emitter (vitest)",
259
+ success,
260
+ duration,
261
+ error: success ? undefined : stderr || `Exit code: ${code}`,
262
+ });
263
+ });
264
+
265
+ proc.on("error", (err) => {
266
+ const duration = (Date.now() - startTime) / 1000;
267
+ console.log(`${pc.red("[ERROR]")} emitter (vitest): ${err.message}`);
268
+ resolve({
269
+ env: "emitter (vitest)",
270
+ success: false,
271
+ duration,
272
+ error: err.message,
273
+ });
274
+ });
275
+ });
276
+ }
277
+
278
+ async function main(): Promise<void> {
279
+ const startTime = Date.now();
280
+
281
+ const runEmitter = argv.values.emitter;
282
+ const runGenerator = argv.values.generator;
283
+ const runBoth = !runEmitter && !runGenerator;
284
+
285
+ const allResults: ToxResult[] = [];
286
+
287
+ // Header
288
+ console.log(pc.cyan("\n╔══════════════════════════════════════════════════════════╗"));
289
+ console.log(
290
+ pc.cyan("║") +
291
+ pc.bold(" TypeSpec Python SDK Generator Tests ") +
292
+ pc.cyan("║"),
293
+ );
294
+ console.log(pc.cyan("╚══════════════════════════════════════════════════════════╝") + "\n");
295
+
296
+ // Run emitter tests if requested
297
+ if (runEmitter || runBoth) {
298
+ console.log(`${pc.bold("=== Emitter Tests (TypeScript) ===")}\n`);
299
+ const emitterResult = await runEmitterTests();
300
+ allResults.push(emitterResult);
301
+ }
302
+
303
+ // Run generator tests if requested
304
+ if (runGenerator || runBoth) {
305
+ console.log(`\n${pc.bold("=== Generator Tests (Python) ===")}\n`);
306
+
307
+ // Determine flavors
308
+ const flavors = argv.values.flavor === "all" ? ["azure", "unbranded"] : [argv.values.flavor!];
309
+
310
+ // Determine environments
311
+ let baseEnvs: string[];
312
+ if (argv.values.env) {
313
+ baseEnvs = argv.values.env.split(",").map((e) => e.trim());
314
+ } else {
315
+ // Default: run test environments
316
+ baseEnvs = ["test"];
317
+ }
318
+
319
+ // Expand 'ci' into its component environments for parallel execution
320
+ const expandedEnvs: string[] = [];
321
+ for (const env of baseEnvs) {
322
+ if (env === "ci") {
323
+ // Run test first (sequential), then lint/mypy/pyright/docs in parallel
324
+ expandedEnvs.push("test", "lint", "mypy", "pyright", "docs");
325
+ } else {
326
+ expandedEnvs.push(env);
327
+ }
328
+ }
329
+
330
+ // Build full environment list
331
+ const envs: string[] = [];
332
+ for (const env of expandedEnvs) {
333
+ if (env === "unittest") {
334
+ envs.push("unittest");
335
+ } else {
336
+ for (const flavor of flavors) {
337
+ envs.push(`${env}-${flavor}`);
338
+ }
339
+ }
340
+ }
341
+
342
+ // Get Python path
343
+ let pythonPath: string;
344
+ try {
345
+ pythonPath = getVenvPython();
346
+ } catch (error) {
347
+ console.error(pc.red((error as Error).message));
348
+ process.exit(1);
349
+ }
350
+
351
+ // Separate test environments from other environments
352
+ // Test environments must run sequentially (they share port 3000)
353
+ // Other environments (lint, mypy, pyright, docs) can run in parallel
354
+ const testEnvs = envs.filter((e) => e.startsWith("test-") || e === "unittest");
355
+ const otherEnvs = envs.filter((e) => !e.startsWith("test-") && e !== "unittest");
356
+
357
+ const maxJobs = argv.values.jobs
358
+ ? parseInt(argv.values.jobs, 10)
359
+ : Math.max(2, cpus().length - 2);
360
+
361
+ console.log(` Flavors: ${flavors.join(", ")}`);
362
+ console.log(` Environments: ${envs.join(", ")}`);
363
+ console.log(` Jobs: ${maxJobs} (test envs run sequentially, others in parallel)`);
364
+ if (argv.values.name) {
365
+ console.log(` Filter: ${argv.values.name}`);
366
+ }
367
+ console.log();
368
+
369
+ // Run test environments first (sequentially)
370
+ let results: ToxResult[] = [];
371
+ if (testEnvs.length > 0) {
372
+ console.log(pc.cyan("Running test environments (sequential)..."));
373
+ results = await runParallel(testEnvs, pythonPath, 1, argv.values.name);
374
+ }
375
+
376
+ // Run other environments in parallel
377
+ if (otherEnvs.length > 0) {
378
+ console.log(pc.cyan("\nRunning lint/typecheck environments (parallel)..."));
379
+ const otherResults = await runParallel(otherEnvs, pythonPath, maxJobs, argv.values.name);
380
+ results = results.concat(otherResults);
381
+ }
382
+
383
+ allResults.push(...results);
384
+ }
385
+
386
+ // Print summary
387
+ printSummary(allResults);
388
+
389
+ const totalDuration = (Date.now() - startTime) / 1000;
390
+ console.log(`Total execution time: ${totalDuration.toFixed(1)}s\n`);
391
+
392
+ // Exit with appropriate code
393
+ const failed = allResults.filter((r) => !r.success);
394
+ if (failed.length > 0) {
395
+ process.exit(1);
396
+ }
397
+ }
398
+
399
+ main().catch((error) => {
400
+ console.error(`${pc.red("Unexpected error:")}`, error);
401
+ process.exit(1);
402
+ });
@@ -18,11 +18,12 @@ logging.getLogger().setLevel(logging.INFO)
18
18
 
19
19
 
20
20
  def get_config_file_location():
21
- mypy_ini_path = os.path.join(os.getcwd(), "../../eng/scripts/ci/mypy.ini")
21
+ # When running from tests/ directory via tox
22
+ mypy_ini_path = os.path.join(os.getcwd(), "../eng/scripts/ci/config/mypy.ini")
22
23
  if os.path.exists(mypy_ini_path):
23
24
  return mypy_ini_path
24
- else:
25
- return os.path.join(os.getcwd(), "../../../eng/scripts/ci/mypy.ini")
25
+ # Fallback for running from different directories
26
+ return os.path.join(os.path.dirname(__file__), "config/mypy.ini")
26
27
 
27
28
 
28
29
  def _single_dir_mypy(mod):
@@ -18,11 +18,12 @@ logging.getLogger().setLevel(logging.INFO)
18
18
 
19
19
 
20
20
  def get_rfc_file_location():
21
- rfc_file_location = os.path.join(os.getcwd(), "../../../eng/scripts/ci/pylintrc")
21
+ # When running from tests/ directory via tox
22
+ rfc_file_location = os.path.join(os.getcwd(), "../eng/scripts/ci/config/pylintrc")
22
23
  if os.path.exists(rfc_file_location):
23
24
  return rfc_file_location
24
- else:
25
- return os.path.join(os.getcwd(), "../../../../eng/scripts/ci/pylintrc")
25
+ # Fallback for running from different directories
26
+ return os.path.join(os.path.dirname(__file__), "config/pylintrc")
26
27
 
27
28
 
28
29
  def _single_dir_pylint(mod):
@@ -19,11 +19,12 @@ logging.getLogger().setLevel(logging.INFO)
19
19
 
20
20
 
21
21
  def get_pyright_config_file_location():
22
- pyright_config = os.path.join(os.getcwd(), "../../eng/scripts/ci/pyrightconfig.json")
22
+ # When running from tests/ directory via tox
23
+ pyright_config = os.path.join(os.getcwd(), "../eng/scripts/ci/config/pyrightconfig.json")
23
24
  if os.path.exists(pyright_config):
24
25
  return pyright_config
25
- else:
26
- return os.path.join(os.getcwd(), "../../../eng/scripts/ci/pyrightconfig.json")
26
+ # Fallback for running from different directories
27
+ return os.path.join(os.path.dirname(__file__), "config/pyrightconfig.json")
27
28
 
28
29
 
29
30
  def _single_dir_pyright(mod):
@@ -0,0 +1,225 @@
1
+ /* eslint-disable no-console */
2
+ import { spawn } from "child_process";
3
+ import fs from "fs";
4
+ import { dirname, join } from "path";
5
+ import pc from "picocolors";
6
+ import { fileURLToPath } from "url";
7
+ import { parseArgs } from "util";
8
+
9
+ const root = join(dirname(fileURLToPath(import.meta.url)), "../../../");
10
+ const testsDir = join(root, "tests");
11
+
12
+ // Get Python venv path
13
+ function getVenvPython(): string {
14
+ const venvPath = join(root, "venv");
15
+ if (fs.existsSync(join(venvPath, "bin"))) {
16
+ return join(venvPath, "bin", "python");
17
+ } else if (fs.existsSync(join(venvPath, "Scripts"))) {
18
+ return join(venvPath, "Scripts", "python.exe");
19
+ }
20
+ throw new Error("Virtual environment not found. Run 'npm run install' first.");
21
+ }
22
+
23
+ const argv = parseArgs({
24
+ args: process.argv.slice(2),
25
+ options: {
26
+ generated: { type: "boolean" },
27
+ flavor: { type: "string", short: "f" },
28
+ mypy: { type: "boolean" },
29
+ pyright: { type: "boolean" },
30
+ help: { type: "boolean", short: "h" },
31
+ },
32
+ });
33
+
34
+ if (argv.values.help) {
35
+ console.log(`
36
+ ${pc.bold("Usage:")} tsx typecheck.ts [options]
37
+
38
+ ${pc.bold("Description:")}
39
+ Run type checking (mypy + pyright) on Python code.
40
+
41
+ ${pc.bold("Options:")}
42
+ ${pc.cyan("--generated")}
43
+ Run type checking on generated SDK packages (via tox).
44
+ Use with --flavor to specify azure or unbranded.
45
+
46
+ ${pc.cyan("-f, --flavor <azure|unbranded>")}
47
+ SDK flavor to check (only applies to --generated).
48
+ If not specified, checks both flavors.
49
+
50
+ ${pc.cyan("--mypy")}
51
+ Run only mypy (skip pyright).
52
+
53
+ ${pc.cyan("--pyright")}
54
+ Run only pyright (skip mypy).
55
+
56
+ ${pc.cyan("-h, --help")}
57
+ Show this help message.
58
+
59
+ ${pc.bold("Examples:")}
60
+ ${pc.dim("# Type check pygen source (default - runs both mypy and pyright)")}
61
+ tsx typecheck.ts
62
+
63
+ ${pc.dim("# Run only mypy on pygen source")}
64
+ tsx typecheck.ts --mypy
65
+
66
+ ${pc.dim("# Run only pyright on pygen source")}
67
+ tsx typecheck.ts --pyright
68
+
69
+ ${pc.dim("# Type check generated SDK packages")}
70
+ tsx typecheck.ts --generated
71
+
72
+ ${pc.dim("# Type check generated SDK packages for azure only")}
73
+ tsx typecheck.ts --generated --flavor=azure
74
+ `);
75
+ process.exit(0);
76
+ }
77
+
78
+ function runCommand(command: string, args: string[], cwd?: string): Promise<boolean> {
79
+ return new Promise((resolve) => {
80
+ console.log(`${pc.cyan("[RUN]")} ${command} ${args.join(" ")}`);
81
+ const proc = spawn(command, args, {
82
+ cwd: cwd || root,
83
+ stdio: "inherit",
84
+ shell: true,
85
+ });
86
+
87
+ proc.on("close", (code) => {
88
+ if (code === 0) {
89
+ console.log(`${pc.green("[PASS]")} ${command} completed successfully`);
90
+ resolve(true);
91
+ } else {
92
+ console.log(`${pc.red("[FAIL]")} ${command} failed with code ${code}`);
93
+ resolve(false);
94
+ }
95
+ });
96
+
97
+ proc.on("error", (err) => {
98
+ console.log(`${pc.red("[ERROR]")} ${command}: ${err.message}`);
99
+ resolve(false);
100
+ });
101
+ });
102
+ }
103
+
104
+ async function runMypyOnPygen(): Promise<boolean> {
105
+ console.log(`\n${pc.bold("=== Running mypy on pygen ===")}\n`);
106
+
107
+ let pythonPath: string;
108
+ try {
109
+ pythonPath = getVenvPython();
110
+ } catch (error) {
111
+ console.error(pc.red((error as Error).message));
112
+ return false;
113
+ }
114
+
115
+ return runCommand(pythonPath, [
116
+ "-m",
117
+ "mypy",
118
+ "generator/pygen",
119
+ "--config-file=eng/scripts/ci/config/mypy.ini",
120
+ "--ignore-missing",
121
+ ]);
122
+ }
123
+
124
+ async function runPyrightOnPygen(): Promise<boolean> {
125
+ console.log(`\n${pc.bold("=== Running pyright on pygen ===")}\n`);
126
+
127
+ let pythonPath: string;
128
+ try {
129
+ pythonPath = getVenvPython();
130
+ } catch (error) {
131
+ console.error(pc.red((error as Error).message));
132
+ return false;
133
+ }
134
+
135
+ return runCommand(pythonPath, [
136
+ "-m",
137
+ "pyright",
138
+ "-p",
139
+ "eng/scripts/ci/config/pyrightconfig.json",
140
+ "generator/pygen",
141
+ ]);
142
+ }
143
+
144
+ async function runTypecheckOnGenerated(
145
+ flavor?: string,
146
+ mypyOnly?: boolean,
147
+ pyrightOnly?: boolean,
148
+ ): Promise<boolean> {
149
+ const flavors = flavor ? [flavor] : ["azure", "unbranded"];
150
+ console.log(
151
+ `\n${pc.bold(`=== Type Checking Generated SDK Packages (${flavors.join(", ")}) ===`)}\n`,
152
+ );
153
+
154
+ let pythonPath: string;
155
+ try {
156
+ pythonPath = getVenvPython();
157
+ } catch (error) {
158
+ console.error(pc.red((error as Error).message));
159
+ return false;
160
+ }
161
+
162
+ let success = true;
163
+
164
+ for (const f of flavors) {
165
+ if (!pyrightOnly) {
166
+ const mypyEnv = `mypy-${f}`;
167
+ const result = await runCommand(
168
+ pythonPath,
169
+ ["-m", "tox", "-c", "tox.ini", "-e", mypyEnv],
170
+ testsDir,
171
+ );
172
+ if (!result) success = false;
173
+ }
174
+
175
+ if (!mypyOnly) {
176
+ const pyrightEnv = `pyright-${f}`;
177
+ const result = await runCommand(
178
+ pythonPath,
179
+ ["-m", "tox", "-c", "tox.ini", "-e", pyrightEnv],
180
+ testsDir,
181
+ );
182
+ if (!result) success = false;
183
+ }
184
+ }
185
+
186
+ return success;
187
+ }
188
+
189
+ async function main(): Promise<void> {
190
+ const runGenerated = argv.values.generated;
191
+ const mypyOnly = argv.values.mypy && !argv.values.pyright;
192
+ const pyrightOnly = argv.values.pyright && !argv.values.mypy;
193
+
194
+ // If --generated is specified, type check generated packages
195
+ if (runGenerated) {
196
+ const result = await runTypecheckOnGenerated(argv.values.flavor, mypyOnly, pyrightOnly);
197
+ if (!result) process.exit(1);
198
+ console.log(`\n${pc.green(pc.bold("Generated SDK type checking complete!"))}\n`);
199
+ return;
200
+ }
201
+
202
+ // Default: type check pygen source
203
+ let success = true;
204
+
205
+ if (!pyrightOnly) {
206
+ const mypyResult = await runMypyOnPygen();
207
+ if (!mypyResult) success = false;
208
+ }
209
+
210
+ if (!mypyOnly) {
211
+ const pyrightResult = await runPyrightOnPygen();
212
+ if (!pyrightResult) success = false;
213
+ }
214
+
215
+ if (!success) {
216
+ process.exit(1);
217
+ }
218
+
219
+ console.log(`\n${pc.green(pc.bold("All type checks passed!"))}\n`);
220
+ }
221
+
222
+ main().catch((error) => {
223
+ console.error(`${pc.red("Unexpected error:")}`, error);
224
+ process.exit(1);
225
+ });
@@ -12,7 +12,7 @@ from multiprocessing import Pool
12
12
 
13
13
  logging.getLogger().setLevel(logging.INFO)
14
14
 
15
- ROOT_FOLDER = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "..", "..", "..", "generator"))
15
+ ROOT_FOLDER = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "..", "..", "generator"))
16
16
 
17
17
  IGNORE_FOLDER = []
18
18