@typespec/http-client-python 0.28.2 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/dist/emitter/code-model.d.ts.map +1 -1
  2. package/dist/emitter/code-model.js +7 -6
  3. package/dist/emitter/code-model.js.map +1 -1
  4. package/dist/emitter/constants.d.ts +6 -0
  5. package/dist/emitter/constants.d.ts.map +1 -0
  6. package/dist/emitter/constants.js +27 -0
  7. package/dist/emitter/constants.js.map +1 -0
  8. package/dist/emitter/emitter.d.ts.map +1 -1
  9. package/dist/emitter/emitter.js +193 -119
  10. package/dist/emitter/emitter.js.map +1 -1
  11. package/dist/emitter/http.d.ts.map +1 -1
  12. package/dist/emitter/http.js +33 -1
  13. package/dist/emitter/http.js.map +1 -1
  14. package/dist/emitter/lib.d.ts +37 -3
  15. package/dist/emitter/lib.d.ts.map +1 -1
  16. package/dist/emitter/lib.js +17 -0
  17. package/dist/emitter/lib.js.map +1 -1
  18. package/dist/emitter/run-python3.js +1 -1
  19. package/dist/emitter/run-python3.js.map +1 -1
  20. package/dist/emitter/system-requirements.js +6 -4
  21. package/dist/emitter/system-requirements.js.map +1 -1
  22. package/dist/emitter/types.d.ts +2 -5
  23. package/dist/emitter/types.d.ts.map +1 -1
  24. package/dist/emitter/types.js +86 -63
  25. package/dist/emitter/types.js.map +1 -1
  26. package/dist/emitter/utils.d.ts.map +1 -1
  27. package/dist/emitter/utils.js +16 -17
  28. package/dist/emitter/utils.js.map +1 -1
  29. package/emitter/src/code-model.ts +7 -13
  30. package/emitter/src/constants.ts +27 -0
  31. package/emitter/src/emitter.ts +241 -123
  32. package/emitter/src/http.ts +29 -1
  33. package/emitter/src/lib.ts +24 -0
  34. package/emitter/src/run-python3.ts +1 -1
  35. package/emitter/src/system-requirements.ts +4 -4
  36. package/emitter/src/types.ts +102 -62
  37. package/emitter/src/utils.ts +16 -18
  38. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  39. package/emitter/test/utils.test.ts +3 -0
  40. package/emitter/tsconfig.build.json +2 -1
  41. package/emitter/tsconfig.json +2 -1
  42. package/eng/scripts/Build-Packages.ps1 +62 -37
  43. package/eng/scripts/Check-GitChanges.ps1 +30 -3
  44. package/eng/scripts/Functions.ps1 +54 -15
  45. package/eng/scripts/Generate.ps1 +42 -8
  46. package/eng/scripts/Generation.psm1 +44 -15
  47. package/eng/scripts/Initialize-Repository.ps1 +29 -11
  48. package/eng/scripts/Test-Packages.ps1 +47 -31
  49. package/eng/scripts/ci/config/eslint-ci.config.mjs +64 -0
  50. package/eng/scripts/ci/{mypy.ini → config/mypy.ini} +1 -1
  51. package/eng/scripts/ci/{pylintrc → config/pylintrc} +1 -1
  52. package/eng/scripts/ci/{pyrightconfig.json → config/pyrightconfig.json} +1 -1
  53. package/eng/scripts/ci/dev_requirements.txt +2 -1
  54. package/eng/scripts/ci/format.ts +232 -2
  55. package/eng/scripts/ci/lint.ts +223 -20
  56. package/eng/scripts/ci/regenerate-common.ts +411 -136
  57. package/eng/scripts/ci/regenerate.ts +247 -101
  58. package/eng/scripts/ci/run-tests.ts +507 -0
  59. package/eng/scripts/ci/run_apiview.py +22 -16
  60. package/eng/scripts/ci/run_mypy.py +34 -23
  61. package/eng/scripts/ci/run_pylint.py +27 -19
  62. package/eng/scripts/ci/run_pyright.py +9 -5
  63. package/eng/scripts/ci/run_sphinx_build.py +24 -9
  64. package/eng/scripts/ci/typecheck.ts +225 -0
  65. package/eng/scripts/ci/util.py +61 -25
  66. package/eng/scripts/ci/utils.ts +5 -5
  67. package/eng/scripts/setup/__pycache__/package_manager.cpython-311.pyc +0 -0
  68. package/eng/scripts/setup/__pycache__/venvtools.cpython-311.pyc +0 -0
  69. package/eng/scripts/setup/build.ts +1 -1
  70. package/eng/scripts/setup/build_pygen_wheel.py +4 -3
  71. package/eng/scripts/setup/install.py +4 -3
  72. package/eng/scripts/setup/install.ts +1 -1
  73. package/eng/scripts/setup/prepare.py +3 -2
  74. package/eng/scripts/setup/prepare.ts +1 -1
  75. package/eng/scripts/setup/run-python3.ts +1 -1
  76. package/eng/scripts/setup/run_batch.py +197 -0
  77. package/eng/scripts/setup/run_tsp.py +3 -3
  78. package/eng/scripts/setup/system-requirements.ts +8 -4
  79. package/eng/scripts/setup/venvtools.py +1 -1
  80. package/generator/build/lib/pygen/__init__.py +1 -3
  81. package/generator/build/lib/pygen/codegen/__init__.py +0 -1
  82. package/generator/build/lib/pygen/codegen/models/base.py +0 -1
  83. package/generator/build/lib/pygen/codegen/models/client.py +2 -1
  84. package/generator/build/lib/pygen/codegen/models/code_model.py +1 -0
  85. package/generator/build/lib/pygen/codegen/models/enum_type.py +0 -1
  86. package/generator/build/lib/pygen/codegen/models/model_type.py +1 -7
  87. package/generator/build/lib/pygen/codegen/models/parameter.py +16 -14
  88. package/generator/build/lib/pygen/codegen/serializers/__init__.py +27 -12
  89. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +12 -3
  90. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +6 -2
  91. package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +17 -4
  92. package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +17 -11
  93. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +176 -71
  94. package/generator/build/lib/pygen/codegen/templates/packaging_templates/README.md.jinja2 +11 -3
  95. package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +1 -1
  96. package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +5 -1
  97. package/generator/build/lib/pygen/preprocess/__init__.py +37 -30
  98. package/generator/component-detection-pip-report.json +7 -7
  99. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  100. package/generator/pygen/__init__.py +1 -3
  101. package/generator/pygen/codegen/__init__.py +0 -1
  102. package/generator/pygen/codegen/models/base.py +0 -1
  103. package/generator/pygen/codegen/models/client.py +2 -1
  104. package/generator/pygen/codegen/models/code_model.py +1 -0
  105. package/generator/pygen/codegen/models/enum_type.py +0 -1
  106. package/generator/pygen/codegen/models/model_type.py +1 -7
  107. package/generator/pygen/codegen/models/parameter.py +16 -14
  108. package/generator/pygen/codegen/serializers/__init__.py +27 -12
  109. package/generator/pygen/codegen/serializers/builder_serializer.py +12 -3
  110. package/generator/pygen/codegen/serializers/general_serializer.py +6 -2
  111. package/generator/pygen/codegen/serializers/import_serializer.py +17 -4
  112. package/generator/pygen/codegen/serializers/parameter_serializer.py +17 -11
  113. package/generator/pygen/codegen/templates/model_base.py.jinja2 +176 -71
  114. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +11 -3
  115. package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +1 -1
  116. package/generator/pygen/codegen/templates/serialization.py.jinja2 +5 -1
  117. package/generator/pygen/preprocess/__init__.py +37 -30
  118. package/generator/pygen.egg-info/PKG-INFO +1 -2
  119. package/generator/pygen.egg-info/requires.txt +1 -1
  120. package/generator/setup.py +1 -2
  121. package/package.json +63 -42
  122. package/eng/scripts/ci/run-ci.ts +0 -89
  123. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_commonproperties_async.py +0 -94
  124. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_largeheader_async.py +0 -30
  125. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_nonresource_async.py +0 -36
  126. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_operationtemplates_async.py +0 -205
  127. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_resource_async.py +0 -478
  128. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_access_async.py +0 -101
  129. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_header_async.py +0 -18
  130. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_path_async.py +0 -18
  131. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_query_async.py +0 -18
  132. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_default_value_async.py +0 -46
  133. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_initialization_async.py +0 -58
  134. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_location_async.py +0 -82
  135. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_deserialize_empty_string_as_null_async.py +0 -20
  136. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_flatten_async.py +0 -115
  137. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_hierrarchy_building_async.py +0 -53
  138. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_next_link_verb_async.py +0 -28
  139. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_override_async.py +0 -106
  140. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_usage_async.py +0 -38
  141. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_basic_async.py +0 -76
  142. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_rpc_async.py +0 -22
  143. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_standard_async.py +0 -39
  144. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_model_async.py +0 -33
  145. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_page_async.py +0 -80
  146. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_scalar_async.py +0 -41
  147. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_traits_async.py +0 -87
  148. package/generator/test/azure/mock_api_tests/asynctests/test_azure_encode_duration_async.py +0 -19
  149. package/generator/test/azure/mock_api_tests/asynctests/test_azure_example_basic_async.py +0 -30
  150. package/generator/test/azure/mock_api_tests/asynctests/test_azure_payload_pageable_async.py +0 -19
  151. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_method_subscription_id_async.py +0 -248
  152. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_async.py +0 -110
  153. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_shared_models_async.py +0 -132
  154. package/generator/test/azure/mock_api_tests/asynctests/test_azure_special_headers_client_request_id_async.py +0 -30
  155. package/generator/test/azure/mock_api_tests/asynctests/test_azure_versioning_previewversion_async.py +0 -53
  156. package/generator/test/azure/mock_api_tests/asynctests/test_client_namespace_async.py +0 -34
  157. package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py +0 -69
  158. package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_enum_conflict_async.py +0 -37
  159. package/generator/test/azure/mock_api_tests/asynctests/test_client_overload_async.py +0 -27
  160. package/generator/test/azure/mock_api_tests/asynctests/test_client_structure_async.py +0 -64
  161. package/generator/test/azure/mock_api_tests/asynctests/test_client_structure_clientoperationgroup_async.py +0 -31
  162. package/generator/test/azure/mock_api_tests/asynctests/test_encode_duration_async.py +0 -63
  163. package/generator/test/azure/mock_api_tests/asynctests/test_encode_numeric_async.py +0 -35
  164. package/generator/test/azure/mock_api_tests/asynctests/test_parameters_basic_async.py +0 -24
  165. package/generator/test/azure/mock_api_tests/asynctests/test_parameters_spread_async.py +0 -76
  166. package/generator/test/azure/mock_api_tests/asynctests/test_payload_content_negotiation_async.py +0 -37
  167. package/generator/test/azure/mock_api_tests/asynctests/test_payload_multipart_async.py +0 -216
  168. package/generator/test/azure/mock_api_tests/asynctests/test_resiliency_srv_driven_async.py +0 -130
  169. package/generator/test/azure/mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +0 -24
  170. package/generator/test/azure/mock_api_tests/asynctests/test_service_multi_service_async.py +0 -31
  171. package/generator/test/azure/mock_api_tests/asynctests/test_special_words_async.py +0 -71
  172. package/generator/test/azure/mock_api_tests/conftest.py +0 -207
  173. package/generator/test/azure/mock_api_tests/data/image.jpg +0 -0
  174. package/generator/test/azure/mock_api_tests/data/image.png +0 -0
  175. package/generator/test/azure/mock_api_tests/test_azure_arm_commonproperties.py +0 -89
  176. package/generator/test/azure/mock_api_tests/test_azure_arm_largeheader.py +0 -27
  177. package/generator/test/azure/mock_api_tests/test_azure_arm_nonresource.py +0 -34
  178. package/generator/test/azure/mock_api_tests/test_azure_arm_operationtemplates.py +0 -180
  179. package/generator/test/azure/mock_api_tests/test_azure_arm_resource.py +0 -436
  180. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_access.py +0 -92
  181. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_header.py +0 -17
  182. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_path.py +0 -17
  183. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_query.py +0 -17
  184. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_default_value.py +0 -42
  185. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_initialization.py +0 -51
  186. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_location.py +0 -70
  187. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_deserialize_empty_string_as_null.py +0 -19
  188. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_flatten.py +0 -104
  189. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_hierrarchy_building.py +0 -45
  190. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_next_link_verb.py +0 -27
  191. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_override.py +0 -102
  192. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_usage.py +0 -32
  193. package/generator/test/azure/mock_api_tests/test_azure_core_basic.py +0 -70
  194. package/generator/test/azure/mock_api_tests/test_azure_core_lro_rpc.py +0 -20
  195. package/generator/test/azure/mock_api_tests/test_azure_core_lro_standard.py +0 -32
  196. package/generator/test/azure/mock_api_tests/test_azure_core_model.py +0 -30
  197. package/generator/test/azure/mock_api_tests/test_azure_core_page.py +0 -71
  198. package/generator/test/azure/mock_api_tests/test_azure_core_scalar.py +0 -35
  199. package/generator/test/azure/mock_api_tests/test_azure_core_traits.py +0 -85
  200. package/generator/test/azure/mock_api_tests/test_azure_encode_duration.py +0 -18
  201. package/generator/test/azure/mock_api_tests/test_azure_example_basic.py +0 -29
  202. package/generator/test/azure/mock_api_tests/test_azure_payload_pageable.py +0 -18
  203. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_method_subscription_id.py +0 -235
  204. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service.py +0 -104
  205. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service_shared_models.py +0 -128
  206. package/generator/test/azure/mock_api_tests/test_azure_special_headers_client_request_id.py +0 -29
  207. package/generator/test/azure/mock_api_tests/test_azure_versioning_previewversion.py +0 -50
  208. package/generator/test/azure/mock_api_tests/test_clear_output_folder.py +0 -23
  209. package/generator/test/azure/mock_api_tests/test_client_namespace.py +0 -32
  210. package/generator/test/azure/mock_api_tests/test_client_naming.py +0 -57
  211. package/generator/test/azure/mock_api_tests/test_client_naming_enum_conflict.py +0 -35
  212. package/generator/test/azure/mock_api_tests/test_client_overload.py +0 -25
  213. package/generator/test/azure/mock_api_tests/test_client_structure.py +0 -60
  214. package/generator/test/azure/mock_api_tests/test_client_structure_clientoperationgroup.py +0 -29
  215. package/generator/test/azure/mock_api_tests/test_encode_duration.py +0 -60
  216. package/generator/test/azure/mock_api_tests/test_encode_numeric.py +0 -31
  217. package/generator/test/azure/mock_api_tests/test_model_base_flatten_compatibility.py +0 -251
  218. package/generator/test/azure/mock_api_tests/test_parameters_basic.py +0 -22
  219. package/generator/test/azure/mock_api_tests/test_parameters_spread.py +0 -66
  220. package/generator/test/azure/mock_api_tests/test_payload_content_negotiation.py +0 -33
  221. package/generator/test/azure/mock_api_tests/test_payload_multipart.py +0 -198
  222. package/generator/test/azure/mock_api_tests/test_resiliency_srv_driven.py +0 -124
  223. package/generator/test/azure/mock_api_tests/test_serialization_encoded_name_json.py +0 -21
  224. package/generator/test/azure/mock_api_tests/test_service_multi_service.py +0 -29
  225. package/generator/test/azure/mock_api_tests/test_special_words.py +0 -63
  226. package/generator/test/azure/requirements.txt +0 -125
  227. package/generator/test/azure/tox.ini +0 -64
  228. package/generator/test/data/image.jpg +0 -0
  229. package/generator/test/data/image.png +0 -0
  230. package/generator/test/dev_requirements.txt +0 -8
  231. package/generator/test/generic_mock_api_tests/asynctests/test_authentication_async.py +0 -140
  232. package/generator/test/generic_mock_api_tests/asynctests/test_encode_array_async.py +0 -139
  233. package/generator/test/generic_mock_api_tests/asynctests/test_encode_bytes_async.py +0 -132
  234. package/generator/test/generic_mock_api_tests/asynctests/test_encode_datetime_async.py +0 -127
  235. package/generator/test/generic_mock_api_tests/asynctests/test_headasboolean_async.py +0 -35
  236. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_body_optionality_async.py +0 -30
  237. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_collection_format_async.py +0 -38
  238. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_path_async.py +0 -24
  239. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_query_async.py +0 -18
  240. package/generator/test/generic_mock_api_tests/asynctests/test_payload_json_merge_patch_async.py +0 -98
  241. package/generator/test/generic_mock_api_tests/asynctests/test_payload_media_type_async.py +0 -27
  242. package/generator/test/generic_mock_api_tests/asynctests/test_payload_pageable_async.py +0 -134
  243. package/generator/test/generic_mock_api_tests/asynctests/test_payload_xml_async.py +0 -150
  244. package/generator/test/generic_mock_api_tests/asynctests/test_response_status_code_range_async.py +0 -38
  245. package/generator/test/generic_mock_api_tests/asynctests/test_routes_async.py +0 -331
  246. package/generator/test/generic_mock_api_tests/asynctests/test_server_endpoint_not_defined_async.py +0 -18
  247. package/generator/test/generic_mock_api_tests/asynctests/test_server_path_multiple_async.py +0 -25
  248. package/generator/test/generic_mock_api_tests/asynctests/test_server_path_single_async.py +0 -18
  249. package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_not_versioned_async.py +0 -28
  250. package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_versioned_async.py +0 -34
  251. package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_conditional_request_async.py +0 -38
  252. package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_repeatability_async.py +0 -19
  253. package/generator/test/generic_mock_api_tests/asynctests/test_specs_documentation_async.py +0 -59
  254. package/generator/test/generic_mock_api_tests/asynctests/test_streaming_jsonl_async.py +0 -27
  255. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_array_async.py +0 -127
  256. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_dictionary_async.py +0 -98
  257. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_extensible_async.py +0 -25
  258. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_fixed_async.py +0 -27
  259. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_file_async.py +0 -59
  260. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_empty_async.py +0 -32
  261. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_enum_discriminator_async.py +0 -70
  262. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_nested_discriminator_async.py +0 -85
  263. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_not_discriminated_async.py +0 -34
  264. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_recursive_async.py +0 -34
  265. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_single_discriminator_async.py +0 -67
  266. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_usage_async.py +0 -32
  267. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_visibility_async.py +0 -47
  268. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_additionalproperties_async.py +0 -353
  269. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py +0 -110
  270. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_optional_async.py +0 -197
  271. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_valuetypes_async.py +0 -315
  272. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_scalar_async.py +0 -60
  273. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_union_async.py +0 -90
  274. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_added_async.py +0 -36
  275. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_made_optional_async.py +0 -21
  276. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_removed_async.py +0 -39
  277. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_renamed_from_async.py +0 -29
  278. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_return_type_changed_from_async.py +0 -18
  279. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_type_changed_from_async.py +0 -22
  280. package/generator/test/generic_mock_api_tests/conftest.py +0 -75
  281. package/generator/test/generic_mock_api_tests/data/image.jpg +0 -0
  282. package/generator/test/generic_mock_api_tests/data/image.png +0 -0
  283. package/generator/test/generic_mock_api_tests/test_authentication.py +0 -130
  284. package/generator/test/generic_mock_api_tests/test_encode_array.py +0 -126
  285. package/generator/test/generic_mock_api_tests/test_encode_bytes.py +0 -128
  286. package/generator/test/generic_mock_api_tests/test_encode_datetime.py +0 -123
  287. package/generator/test/generic_mock_api_tests/test_headasboolean.py +0 -33
  288. package/generator/test/generic_mock_api_tests/test_parameters_body_optionality.py +0 -27
  289. package/generator/test/generic_mock_api_tests/test_parameters_collection_format.py +0 -33
  290. package/generator/test/generic_mock_api_tests/test_parameters_path.py +0 -22
  291. package/generator/test/generic_mock_api_tests/test_parameters_query.py +0 -17
  292. package/generator/test/generic_mock_api_tests/test_payload_json_merge_patch.py +0 -93
  293. package/generator/test/generic_mock_api_tests/test_payload_media_type.py +0 -25
  294. package/generator/test/generic_mock_api_tests/test_payload_pageable.py +0 -99
  295. package/generator/test/generic_mock_api_tests/test_payload_xml.py +0 -135
  296. package/generator/test/generic_mock_api_tests/test_response_status_code_range.py +0 -36
  297. package/generator/test/generic_mock_api_tests/test_routes.py +0 -285
  298. package/generator/test/generic_mock_api_tests/test_server_endpoint_not_defined.py +0 -17
  299. package/generator/test/generic_mock_api_tests/test_server_path_multiple.py +0 -21
  300. package/generator/test/generic_mock_api_tests/test_server_path_single.py +0 -17
  301. package/generator/test/generic_mock_api_tests/test_server_versions_not_versioned.py +0 -25
  302. package/generator/test/generic_mock_api_tests/test_server_versions_versioned.py +0 -30
  303. package/generator/test/generic_mock_api_tests/test_special_headers_conditional_request.py +0 -34
  304. package/generator/test/generic_mock_api_tests/test_special_headers_repeatability.py +0 -18
  305. package/generator/test/generic_mock_api_tests/test_specs_documentation.py +0 -51
  306. package/generator/test/generic_mock_api_tests/test_streaming_jsonl.py +0 -25
  307. package/generator/test/generic_mock_api_tests/test_typetest_array.py +0 -111
  308. package/generator/test/generic_mock_api_tests/test_typetest_dictionary.py +0 -86
  309. package/generator/test/generic_mock_api_tests/test_typetest_enum_extensible.py +0 -23
  310. package/generator/test/generic_mock_api_tests/test_typetest_enum_fixed.py +0 -25
  311. package/generator/test/generic_mock_api_tests/test_typetest_file.py +0 -52
  312. package/generator/test/generic_mock_api_tests/test_typetest_model_empty.py +0 -29
  313. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_enum_discriminator.py +0 -58
  314. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_nested_discriminator.py +0 -79
  315. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_not_discriminated.py +0 -31
  316. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_recursive.py +0 -32
  317. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_single_discriminator.py +0 -60
  318. package/generator/test/generic_mock_api_tests/test_typetest_model_usage.py +0 -28
  319. package/generator/test/generic_mock_api_tests/test_typetest_model_visibility.py +0 -40
  320. package/generator/test/generic_mock_api_tests/test_typetest_property_additionalproperties.py +0 -314
  321. package/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py +0 -102
  322. package/generator/test/generic_mock_api_tests/test_typetest_property_optional.py +0 -174
  323. package/generator/test/generic_mock_api_tests/test_typetest_property_valuetypes.py +0 -286
  324. package/generator/test/generic_mock_api_tests/test_typetest_scalar.py +0 -53
  325. package/generator/test/generic_mock_api_tests/test_typetest_union.py +0 -80
  326. package/generator/test/generic_mock_api_tests/test_typetest_union_discriminated.py +0 -290
  327. package/generator/test/generic_mock_api_tests/test_versioning_added.py +0 -33
  328. package/generator/test/generic_mock_api_tests/test_versioning_made_optional.py +0 -20
  329. package/generator/test/generic_mock_api_tests/test_versioning_removed.py +0 -37
  330. package/generator/test/generic_mock_api_tests/test_versioning_renamed_from.py +0 -27
  331. package/generator/test/generic_mock_api_tests/test_versioning_return_type_changed_from.py +0 -17
  332. package/generator/test/generic_mock_api_tests/test_versioning_type_changed_from.py +0 -21
  333. package/generator/test/unbranded/mock_api_tests/asynctests/test_auth_flow_async.py +0 -19
  334. package/generator/test/unbranded/mock_api_tests/asynctests/test_encode_duration_async.py +0 -63
  335. package/generator/test/unbranded/mock_api_tests/asynctests/test_encode_numeric_async.py +0 -35
  336. package/generator/test/unbranded/mock_api_tests/asynctests/test_parameters_basic_async.py +0 -24
  337. package/generator/test/unbranded/mock_api_tests/asynctests/test_parameters_spread_async.py +0 -76
  338. package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_content_negotiation_async.py +0 -37
  339. package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_multipart_async.py +0 -218
  340. package/generator/test/unbranded/mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +0 -24
  341. package/generator/test/unbranded/mock_api_tests/asynctests/test_special_words_async.py +0 -73
  342. package/generator/test/unbranded/mock_api_tests/asynctests/test_unbranded_async.py +0 -24
  343. package/generator/test/unbranded/mock_api_tests/conftest.py +0 -91
  344. package/generator/test/unbranded/mock_api_tests/data/image.jpg +0 -0
  345. package/generator/test/unbranded/mock_api_tests/data/image.png +0 -0
  346. package/generator/test/unbranded/mock_api_tests/test_auth_flow.py +0 -17
  347. package/generator/test/unbranded/mock_api_tests/test_encode_duration.py +0 -60
  348. package/generator/test/unbranded/mock_api_tests/test_encode_numeric.py +0 -32
  349. package/generator/test/unbranded/mock_api_tests/test_parameters_basic.py +0 -22
  350. package/generator/test/unbranded/mock_api_tests/test_parameters_spread.py +0 -66
  351. package/generator/test/unbranded/mock_api_tests/test_payload_content_negotiation.py +0 -33
  352. package/generator/test/unbranded/mock_api_tests/test_payload_multipart.py +0 -200
  353. package/generator/test/unbranded/mock_api_tests/test_serialization_encoded_name_json.py +0 -22
  354. package/generator/test/unbranded/mock_api_tests/test_special_words.py +0 -66
  355. package/generator/test/unbranded/mock_api_tests/test_unbranded.py +0 -65
  356. package/generator/test/unbranded/requirements.txt +0 -69
  357. package/generator/test/unbranded/tox.ini +0 -64
  358. package/generator/test/unittests/conftest.py +0 -15
  359. package/generator/test/unittests/requirements.txt +0 -3
  360. package/generator/test/unittests/test_enums.py +0 -89
  361. package/generator/test/unittests/test_model_base_serialization.py +0 -4906
  362. package/generator/test/unittests/test_model_base_xml_serialization.py +0 -1239
  363. package/generator/test/unittests/test_name_converter.py +0 -35
  364. package/generator/test/unittests/test_optional_return_type.py +0 -268
  365. package/generator/test/unittests/test_parameter_ordering.py +0 -104
  366. package/generator/test/unittests/test_sort_schema.py +0 -93
  367. package/generator/test/unittests/tox.ini +0 -5
  368. /package/eng/scripts/ci/{pyproject.toml → config/pyproject.toml} +0 -0
@@ -0,0 +1,64 @@
1
+ // @ts-check
2
+ // Standalone eslint config for http-client-python package
3
+ // This config is used in CI where monorepo dependencies may not be available
4
+ import eslint from "@eslint/js";
5
+ import { dirname } from "path";
6
+ import tsEslint from "typescript-eslint";
7
+ import { fileURLToPath } from "url";
8
+
9
+ const root = dirname(dirname(dirname(dirname(fileURLToPath(import.meta.url)))));
10
+
11
+ export default [
12
+ {
13
+ ignores: ["**/dist/**/*", "**/node_modules/**/*"],
14
+ },
15
+ eslint.configs.recommended,
16
+ ...tsEslint.configs.recommended,
17
+ {
18
+ languageOptions: {
19
+ parserOptions: {
20
+ tsconfigRootDir: root,
21
+ },
22
+ },
23
+ rules: {
24
+ // TypeScript plugin overrides
25
+ "@typescript-eslint/no-non-null-assertion": "off",
26
+ "@typescript-eslint/no-explicit-any": "off",
27
+ "@typescript-eslint/no-inferrable-types": "off",
28
+ "@typescript-eslint/no-empty-function": "off",
29
+ "@typescript-eslint/no-empty-interface": "off",
30
+ "@typescript-eslint/no-empty-object-type": "off",
31
+ "@typescript-eslint/no-unused-vars": [
32
+ "warn",
33
+ {
34
+ varsIgnorePattern: "^_",
35
+ argsIgnorePattern: ".*",
36
+ ignoreRestSiblings: true,
37
+ caughtErrorsIgnorePattern: ".*",
38
+ },
39
+ ],
40
+ "@typescript-eslint/no-unused-expressions": [
41
+ "warn",
42
+ { allowShortCircuit: true, allowTernary: true },
43
+ ],
44
+
45
+ // Core rules
46
+ "no-inner-declarations": "off",
47
+ "no-empty": "off",
48
+ "no-constant-condition": "off",
49
+ "no-case-declarations": "off",
50
+ "no-ex-assign": "off",
51
+ "no-undef": "off",
52
+ "no-useless-assignment": "error",
53
+ "prefer-const": [
54
+ "warn",
55
+ {
56
+ destructuring: "all",
57
+ },
58
+ ],
59
+ eqeqeq: ["warn", "always", { null: "ignore" }],
60
+ "no-console": "warn",
61
+ "symbol-description": "warn",
62
+ },
63
+ },
64
+ ];
@@ -1,6 +1,6 @@
1
1
  # global configurations
2
2
  [mypy]
3
- python_version = 3.9
3
+ python_version = 3.10
4
4
  # Exclude mypy check for sub client tests
5
5
  exclude = .*/clientinitialization/.*\.py
6
6
 
@@ -1,5 +1,5 @@
1
1
  [MASTER]
2
- py-version=3.9
2
+ py-version=3.10
3
3
  ignore-patterns=test_*,conftest,setup
4
4
  reports=no
5
5
 
@@ -2,5 +2,5 @@
2
2
  "reportUnnecessaryCast": "warning",
3
3
  "reportTypeCommentUsage": true,
4
4
  "reportMissingImports": false,
5
- "pythonVersion": "3.9"
5
+ "pythonVersion": "3.10"
6
6
  }
@@ -1,11 +1,12 @@
1
1
  pyright==1.1.407
2
2
  pylint==4.0.4
3
3
  tox==4.16.0
4
+ tox-uv
4
5
  mypy==1.19.1
5
6
  colorama==0.4.6
6
7
  debugpy==1.8.2
7
8
  pytest==8.3.2
8
9
  coverage==7.6.1
9
- black==24.8.0
10
+ black==26.3.1
10
11
  ptvsd==4.3.2
11
12
  types-PyYAML==6.0.12.8
@@ -1,3 +1,233 @@
1
- import { runCommand } from "./utils.js";
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";
2
8
 
3
- runCommand("black", ["generator/", "eng/", "--config", "./eng/scripts/ci/pyproject.toml"]);
9
+ const root = join(dirname(fileURLToPath(import.meta.url)), "../../../");
10
+ const monorepoRoot = join(root, "../../");
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
+ emitter: { type: "boolean", short: "e" },
27
+ generator: { type: "boolean", short: "g" },
28
+ generated: { type: "boolean" },
29
+ check: { type: "boolean", short: "c" },
30
+ help: { type: "boolean", short: "h" },
31
+ },
32
+ });
33
+
34
+ if (argv.values.help) {
35
+ console.log(`
36
+ ${pc.bold("Usage:")} tsx format.ts [options]
37
+
38
+ ${pc.bold("Description:")}
39
+ Format code using Prettier (TypeScript) and Black (Python).
40
+
41
+ ${pc.bold("Options:")}
42
+ ${pc.cyan("-e, --emitter")}
43
+ Format TypeScript emitter code with Prettier.
44
+
45
+ ${pc.cyan("-g, --generator")}
46
+ Format Python generator source code (pygen) with Black.
47
+
48
+ ${pc.cyan("--generated")}
49
+ Format generated SDK packages with Black.
50
+
51
+ ${pc.cyan("-c, --check")}
52
+ Check formatting without making changes (exit with error if unformatted).
53
+
54
+ ${pc.cyan("-h, --help")}
55
+ Show this help message.
56
+
57
+ ${pc.bold("Examples:")}
58
+ ${pc.dim("# Format emitter + pygen source (default)")}
59
+ tsx format.ts
60
+
61
+ ${pc.dim("# Format only TypeScript emitter")}
62
+ tsx format.ts --emitter
63
+
64
+ ${pc.dim("# Format only pygen source code")}
65
+ tsx format.ts --generator
66
+
67
+ ${pc.dim("# Check formatting without making changes")}
68
+ tsx format.ts --check
69
+
70
+ ${pc.dim("# Format generated SDK packages")}
71
+ tsx format.ts --generated
72
+ `);
73
+ process.exit(0);
74
+ }
75
+
76
+ function runCommand(command: string, args: string[]): Promise<boolean> {
77
+ // Add node_modules/.bin directories to PATH so commands like prettier can be found
78
+ const pathSep = process.platform === "win32" ? ";" : ":";
79
+ const binPaths = [
80
+ join(root, "node_modules", ".bin"),
81
+ join(monorepoRoot, "node_modules", ".bin"),
82
+ ].join(pathSep);
83
+ const env = {
84
+ ...process.env,
85
+ PATH: `${binPaths}${pathSep}${process.env.PATH}`,
86
+ };
87
+
88
+ return new Promise((resolve) => {
89
+ console.log(`${pc.cyan("[RUN]")} ${command} ${args.join(" ")}`);
90
+ const proc = spawn(command, args, {
91
+ cwd: root,
92
+ stdio: "inherit",
93
+ shell: true,
94
+ env,
95
+ });
96
+
97
+ proc.on("close", (code) => {
98
+ if (code === 0) {
99
+ console.log(`${pc.green("[PASS]")} ${command} completed successfully`);
100
+ resolve(true);
101
+ } else {
102
+ console.log(`${pc.red("[FAIL]")} ${command} failed with code ${code}`);
103
+ resolve(false);
104
+ }
105
+ });
106
+
107
+ proc.on("error", (err) => {
108
+ console.log(`${pc.red("[ERROR]")} ${command}: ${err.message}`);
109
+ resolve(false);
110
+ });
111
+ });
112
+ }
113
+
114
+ async function formatEmitter(check: boolean): Promise<boolean> {
115
+ console.log(`\n${pc.bold("=== Formatting TypeScript Emitter ===")}\n`);
116
+ // Use prettier directly - it's available via node_modules/.bin in PATH
117
+ // Exclude CHANGELOG.md as it's managed by chronus changelog tool
118
+ const args = check
119
+ ? [
120
+ "--check",
121
+ "emitter/",
122
+ "eng/scripts/",
123
+ "*.json",
124
+ "README.md",
125
+ "CONTRIBUTING.md",
126
+ "ARCHITECTURE.md",
127
+ ]
128
+ : [
129
+ "--write",
130
+ "emitter/",
131
+ "eng/scripts/",
132
+ "*.json",
133
+ "README.md",
134
+ "CONTRIBUTING.md",
135
+ "ARCHITECTURE.md",
136
+ ];
137
+ return runCommand("prettier", args);
138
+ }
139
+
140
+ async function formatPygenSource(check: boolean): Promise<boolean> {
141
+ console.log(`\n${pc.bold("=== Formatting Python Generator (pygen) ===")}\n`);
142
+
143
+ let pythonPath: string;
144
+ try {
145
+ pythonPath = getVenvPython();
146
+ } catch (error) {
147
+ console.error(pc.red((error as Error).message));
148
+ return false;
149
+ }
150
+
151
+ const args = [
152
+ "-m",
153
+ "black",
154
+ "generator/pygen",
155
+ "eng/scripts/",
156
+ "--config",
157
+ "./eng/scripts/ci/config/pyproject.toml",
158
+ ];
159
+ if (check) {
160
+ args.push("--check");
161
+ }
162
+ return runCommand(pythonPath, args);
163
+ }
164
+
165
+ async function formatGeneratedPackages(check: boolean): Promise<boolean> {
166
+ console.log(`\n${pc.bold("=== Formatting Generated SDK Packages ===")}\n`);
167
+
168
+ let pythonPath: string;
169
+ try {
170
+ pythonPath = getVenvPython();
171
+ } catch (error) {
172
+ console.error(pc.red((error as Error).message));
173
+ return false;
174
+ }
175
+
176
+ const args = [
177
+ "-m",
178
+ "black",
179
+ "generator/test/azure/generated",
180
+ "generator/test/unbranded/generated",
181
+ "--config",
182
+ "./eng/scripts/ci/config/pyproject.toml",
183
+ ];
184
+ if (check) {
185
+ args.push("--check");
186
+ }
187
+ return runCommand(pythonPath, args);
188
+ }
189
+
190
+ async function main(): Promise<void> {
191
+ const runEmitter = argv.values.emitter;
192
+ const runGenerator = argv.values.generator;
193
+ const runGenerated = argv.values.generated;
194
+ const check = argv.values.check || false;
195
+
196
+ // If --generated is specified, only format generated packages
197
+ if (runGenerated) {
198
+ const result = await formatGeneratedPackages(check);
199
+ if (!result) process.exit(1);
200
+ console.log(
201
+ `\n${pc.green(pc.bold(`Generated SDK formatting ${check ? "check " : ""}complete!`))}\n`,
202
+ );
203
+ return;
204
+ }
205
+
206
+ // Default: format emitter + pygen source
207
+ const runBoth = !runEmitter && !runGenerator;
208
+
209
+ let success = true;
210
+
211
+ if (runEmitter || runBoth) {
212
+ const result = await formatEmitter(check);
213
+ if (!result) success = false;
214
+ }
215
+
216
+ if (runGenerator || runBoth) {
217
+ const result = await formatPygenSource(check);
218
+ if (!result) success = false;
219
+ }
220
+
221
+ if (!success) {
222
+ process.exit(1);
223
+ }
224
+
225
+ console.log(
226
+ `\n${pc.green(pc.bold(`All formatting ${check ? "checks passed" : "complete"}!`))}\n`,
227
+ );
228
+ }
229
+
230
+ main().catch((error) => {
231
+ console.error(`${pc.red("Unexpected error:")}`, error);
232
+ process.exit(1);
233
+ });
@@ -1,36 +1,239 @@
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";
1
7
  import { parseArgs } from "util";
2
- import { runCommand } from "./utils.js";
3
8
 
4
- // PARSE INPUT ARGUMENTS
9
+ const root = join(dirname(fileURLToPath(import.meta.url)), "../../../");
10
+ const monorepoRoot = join(root, "../../");
11
+ const testsDir = join(root, "tests");
12
+
13
+ // Get Python venv path
14
+ function getVenvPython(): string {
15
+ const venvPath = join(root, "venv");
16
+ if (fs.existsSync(join(venvPath, "bin"))) {
17
+ return join(venvPath, "bin", "python");
18
+ } else if (fs.existsSync(join(venvPath, "Scripts"))) {
19
+ return join(venvPath, "Scripts", "python.exe");
20
+ }
21
+ throw new Error("Virtual environment not found. Run 'npm run install' first.");
22
+ }
5
23
 
6
24
  const argv = parseArgs({
7
25
  args: process.argv.slice(2),
8
26
  options: {
9
- folderName: { type: "string" },
10
- command: { type: "string" },
27
+ emitter: { type: "boolean", short: "e" },
28
+ generator: { type: "boolean", short: "g" },
29
+ generated: { type: "boolean" },
30
+ flavor: { type: "string", short: "f" },
31
+ help: { type: "boolean", short: "h" },
11
32
  },
12
33
  });
13
34
 
14
- export function pylint() {
15
- runCommand("pylint", [argv.values.folderName!, "--rcfile", "./eng/scripts/ci/pylintrc"]);
35
+ if (argv.values.help) {
36
+ console.log(`
37
+ ${pc.bold("Usage:")} tsx lint.ts [options]
38
+
39
+ ${pc.bold("Description:")}
40
+ Run linting checks on the codebase.
41
+
42
+ ${pc.bold("Options:")}
43
+ ${pc.cyan("-e, --emitter")}
44
+ Run ESLint on TypeScript emitter code.
45
+
46
+ ${pc.cyan("-g, --generator")}
47
+ Run pylint on Python generator source code (pygen).
48
+
49
+ ${pc.cyan("--generated")}
50
+ Run pylint on generated SDK packages (via tox).
51
+ Use with --flavor to specify azure or unbranded.
52
+
53
+ ${pc.cyan("-f, --flavor <azure|unbranded>")}
54
+ SDK flavor to lint (only applies to --generated).
55
+ If not specified, lints both flavors.
56
+
57
+ ${pc.cyan("-h, --help")}
58
+ Show this help message.
59
+
60
+ ${pc.bold("Examples:")}
61
+ ${pc.dim("# Lint emitter + pygen source (default)")}
62
+ tsx lint.ts
63
+
64
+ ${pc.dim("# Lint only TypeScript emitter")}
65
+ tsx lint.ts --emitter
66
+
67
+ ${pc.dim("# Lint only pygen source code")}
68
+ tsx lint.ts --generator
69
+
70
+ ${pc.dim("# Lint generated SDK packages")}
71
+ tsx lint.ts --generated
72
+
73
+ ${pc.dim("# Lint generated SDK packages for azure only")}
74
+ tsx lint.ts --generated --flavor=azure
75
+ `);
76
+ process.exit(0);
77
+ }
78
+
79
+ function runCommand(
80
+ command: string,
81
+ args: string[],
82
+ cwd?: string,
83
+ displayName?: string,
84
+ ): Promise<boolean> {
85
+ const workingDir = cwd || root;
86
+ const name = displayName || command;
87
+
88
+ // Add node_modules/.bin directories to PATH so commands like eslint can be found
89
+ // Also set NODE_PATH so that config files can resolve packages from monorepo's node_modules
90
+ const pathSep = process.platform === "win32" ? ";" : ":";
91
+ const binPaths = [
92
+ join(workingDir, "node_modules", ".bin"),
93
+ join(root, "node_modules", ".bin"),
94
+ join(monorepoRoot, "node_modules", ".bin"),
95
+ ].join(pathSep);
96
+ const nodePaths = [
97
+ join(workingDir, "node_modules"),
98
+ join(root, "node_modules"),
99
+ join(monorepoRoot, "node_modules"),
100
+ ].join(pathSep);
101
+ const env = {
102
+ ...process.env,
103
+ PATH: `${binPaths}${pathSep}${process.env.PATH}`,
104
+ NODE_PATH: nodePaths,
105
+ };
106
+
107
+ return new Promise((resolve) => {
108
+ // If displayName is provided, show it as-is; otherwise show command + args
109
+ const logMessage = displayName ? displayName : `${command} ${args.join(" ")}`;
110
+ console.log(`${pc.cyan("[RUN]")} ${logMessage}`);
111
+ const proc = spawn(command, args, {
112
+ cwd: workingDir,
113
+ stdio: "inherit",
114
+ shell: true,
115
+ env,
116
+ });
117
+
118
+ proc.on("close", (code) => {
119
+ if (code === 0) {
120
+ console.log(`${pc.green("[PASS]")} ${name} completed successfully`);
121
+ resolve(true);
122
+ } else {
123
+ console.log(`${pc.red("[FAIL]")} ${name} failed with code ${code}`);
124
+ resolve(false);
125
+ }
126
+ });
127
+
128
+ proc.on("error", (err) => {
129
+ console.log(`${pc.red("[ERROR]")} ${name}: ${err.message}`);
130
+ resolve(false);
131
+ });
132
+ });
16
133
  }
17
134
 
18
- export function mypy() {
19
- runCommand("mypy", [argv.values.folderName!, "--config-file", "./eng/scripts/ci/mypy.ini"]);
135
+ async function lintEmitter(): Promise<boolean> {
136
+ console.log(`\n${pc.bold("=== Linting TypeScript ===")}\n`);
137
+ // Run eslint with local config to avoid dependency on monorepo's eslint.config.js
138
+ // This ensures the package can be linted in CI without full monorepo dependencies
139
+ // Lint both emitter/ and eng/scripts/ directories
140
+ return runCommand(
141
+ "eslint",
142
+ [
143
+ "emitter/",
144
+ "eng/scripts/",
145
+ "--config",
146
+ "eng/scripts/ci/config/eslint-ci.config.mjs",
147
+ "--max-warnings=0",
148
+ ],
149
+ root,
150
+ "eslint emitter/ eng/scripts/ --max-warnings=0",
151
+ );
20
152
  }
21
153
 
22
- export function pyright() {
23
- runCommand("pyright", [argv.values.folderName!, "-p", "./eng/scripts/ci/pyrightconfig.json"]);
154
+ async function lintPygenSource(): Promise<boolean> {
155
+ console.log(`\n${pc.bold("=== Linting Python Generator (pygen) ===")}\n`);
156
+
157
+ let pythonPath: string;
158
+ try {
159
+ pythonPath = getVenvPython();
160
+ } catch (error) {
161
+ console.error(pc.red((error as Error).message));
162
+ return false;
163
+ }
164
+
165
+ // Lint pygen source code directly with pylint
166
+ return runCommand(pythonPath, [
167
+ "-m",
168
+ "pylint",
169
+ "generator/pygen",
170
+ "--rcfile=eng/scripts/ci/config/pylintrc",
171
+ "--recursive=y",
172
+ "--py-version=3.10",
173
+ ]);
24
174
  }
25
175
 
26
- if (argv.values.command === "pylint") {
27
- pylint();
28
- } else if (argv.values.command === "mypy") {
29
- mypy();
30
- } else if (argv.values.command === "pyright") {
31
- pyright();
32
- } else {
33
- pylint();
34
- mypy();
35
- pyright();
176
+ async function lintGeneratedPackages(flavor?: string): Promise<boolean> {
177
+ const flavors = flavor ? [flavor] : ["azure", "unbranded"];
178
+ console.log(`\n${pc.bold(`=== Linting Generated SDK Packages (${flavors.join(", ")}) ===`)}\n`);
179
+
180
+ let pythonPath: string;
181
+ try {
182
+ pythonPath = getVenvPython();
183
+ } catch (error) {
184
+ console.error(pc.red((error as Error).message));
185
+ return false;
186
+ }
187
+
188
+ let success = true;
189
+ for (const f of flavors) {
190
+ const toxEnv = `lint-${f}`;
191
+ const result = await runCommand(
192
+ pythonPath,
193
+ ["-m", "tox", "-c", "tox.ini", "-e", toxEnv],
194
+ testsDir,
195
+ );
196
+ if (!result) success = false;
197
+ }
198
+ return success;
36
199
  }
200
+
201
+ async function main(): Promise<void> {
202
+ const runEmitter = argv.values.emitter;
203
+ const runGenerator = argv.values.generator;
204
+ const runGenerated = argv.values.generated;
205
+
206
+ // If --generated is specified, only lint generated packages
207
+ if (runGenerated) {
208
+ const result = await lintGeneratedPackages(argv.values.flavor);
209
+ if (!result) process.exit(1);
210
+ console.log(`\n${pc.green(pc.bold("Generated SDK linting complete!"))}\n`);
211
+ return;
212
+ }
213
+
214
+ // Default: lint emitter + pygen source
215
+ const runBoth = !runEmitter && !runGenerator;
216
+
217
+ let success = true;
218
+
219
+ if (runEmitter || runBoth) {
220
+ const result = await lintEmitter();
221
+ if (!result) success = false;
222
+ }
223
+
224
+ if (runGenerator || runBoth) {
225
+ const result = await lintPygenSource();
226
+ if (!result) success = false;
227
+ }
228
+
229
+ if (!success) {
230
+ process.exit(1);
231
+ }
232
+
233
+ console.log(`\n${pc.green(pc.bold("All linting checks passed!"))}\n`);
234
+ }
235
+
236
+ main().catch((error) => {
237
+ console.error(`${pc.red("Unexpected error:")}`, error);
238
+ process.exit(1);
239
+ });