@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
@@ -16,7 +16,6 @@ from .utils import TYPESPEC_PACKAGE_MODE, VALID_PACKAGE_MODE
16
16
 
17
17
  from ._version import VERSION
18
18
 
19
-
20
19
  __version__ = VERSION
21
20
  _LOGGER = logging.getLogger(__name__)
22
21
 
@@ -237,8 +236,7 @@ class ReaderAndWriter:
237
236
  def write_file(self, filename: Union[str, Path], file_content: str) -> None:
238
237
  """Directly writing to disk"""
239
238
  file_folder = Path(filename).parent
240
- if not Path.is_dir(self.output_folder / file_folder):
241
- Path.mkdir(self.output_folder / file_folder, parents=True)
239
+ Path.mkdir(self.output_folder / file_folder, parents=True, exist_ok=True)
242
240
  with open(self.output_folder / Path(filename), "w", encoding="utf-8") as fd:
243
241
  fd.write(file_content)
244
242
 
@@ -13,7 +13,6 @@ from ..utils import parse_args
13
13
  from .models.code_model import CodeModel
14
14
  from .serializers import JinjaSerializer
15
15
 
16
-
17
16
  _LOGGER = logging.getLogger(__name__)
18
17
 
19
18
 
@@ -7,7 +7,6 @@ from typing import Any, TYPE_CHECKING, Optional
7
7
  from abc import ABC, abstractmethod
8
8
  from .imports import FileImport
9
9
 
10
-
11
10
  if TYPE_CHECKING:
12
11
  from .code_model import CodeModel
13
12
  from .model_type import ModelType
@@ -291,11 +291,12 @@ class Client(_ClientConfigBase[ClientGlobalParameterList]):
291
291
  ImportType.SDKCORE,
292
292
  )
293
293
 
294
- # import for "Self"
294
+ # import for "Self" (typing.Self available from Python 3.11+)
295
295
  file_import.add_submodule_import(
296
296
  "typing_extensions",
297
297
  "Self",
298
298
  ImportType.STDLIB,
299
+ version_modules=(((3, 11), "typing", None),),
299
300
  )
300
301
  if self.need_cloud_setting:
301
302
  file_import.add_submodule_import("typing", "cast", ImportType.STDLIB)
@@ -95,6 +95,7 @@ class CodeModel: # pylint: disable=too-many-public-methods, disable=too-many-in
95
95
  t for t in self.types_map.values() if isinstance(t, CombinedType) and t.name
96
96
  ]
97
97
  self.cross_language_package_id = self.yaml_data.get("crossLanguagePackageId")
98
+ self.cross_language_version = self.yaml_data.get("crossLanguageVersion")
98
99
  self.for_test: bool = False
99
100
  # key is typespec namespace, value is models/clients/opeartion_groups/enums cache in the namespace
100
101
  self._client_namespace_types: dict[str, ClientNamespaceType] = {}
@@ -10,7 +10,6 @@ from .imports import FileImport, ImportType, TypingSection
10
10
  from .utils import NamespaceType, add_to_pylint_disable
11
11
  from ...utils import NAME_LENGTH_LIMIT
12
12
 
13
-
14
13
  if TYPE_CHECKING:
15
14
  from .code_model import CodeModel
16
15
 
@@ -5,8 +5,7 @@
5
5
  # --------------------------------------------------------------------------
6
6
  from enum import Enum
7
7
  from collections import OrderedDict
8
- from typing import Any, Optional, TYPE_CHECKING, cast
9
- import sys
8
+ from typing import Any, Literal, Optional, TYPE_CHECKING, cast
10
9
  from .utils import add_to_pylint_disable, NamespaceType, LOCALS_LENGTH_LIMIT
11
10
  from .base import BaseType
12
11
  from .constant_type import ConstantType
@@ -14,11 +13,6 @@ from .property import Property
14
13
  from .imports import FileImport, ImportType, TypingSection
15
14
  from ...utils import NAME_LENGTH_LIMIT
16
15
 
17
- if sys.version_info >= (3, 8):
18
- from typing import Literal
19
- else:
20
- from typing_extensions import Literal # type: ignore
21
-
22
16
  if TYPE_CHECKING:
23
17
  from .code_model import CodeModel
24
18
 
@@ -61,6 +61,7 @@ class _ParameterBase(BaseModel, abc.ABC): # pylint: disable=too-many-instance-a
61
61
  ) -> None:
62
62
  super().__init__(yaml_data, code_model)
63
63
  self.wire_name: str = yaml_data.get("wireName", "")
64
+ self.etag_role: Optional[str] = yaml_data.get("etagRole", None)
64
65
  self.client_name: str = self.yaml_data["clientName"]
65
66
  self.optional: bool = self.yaml_data["optional"]
66
67
  self.implementation: Optional[str] = yaml_data.get("implementation", None)
@@ -108,25 +109,24 @@ class _ParameterBase(BaseModel, abc.ABC): # pylint: disable=too-many-instance-a
108
109
  type_description = self.type.description(is_operation_file=True)
109
110
  if type_description:
110
111
  base_description = add_to_description(base_description, type_description)
111
- if self.optional and isinstance(self.type, ConstantType):
112
- if self.is_api_version:
113
- base_description = add_to_description(
114
- base_description,
115
- f"Known values are {self.get_declaration()}.",
116
- )
117
- else:
118
- base_description = add_to_description(
119
- base_description,
120
- f"Known values are {self.get_declaration()} and None.",
121
- )
112
+ if (self.optional or self.is_api_version) and isinstance(self.type, ConstantType):
113
+ base_description = add_to_description(
114
+ base_description,
115
+ f"Known values are {self.get_declaration()} and None.",
116
+ )
122
117
  if not (self.optional or self.client_default_value):
123
118
  base_description = add_to_description(base_description, "Required.")
124
- if self.client_default_value is not None:
119
+ if self.is_api_version:
120
+ base_description = add_to_description(
121
+ base_description,
122
+ "Default value is None. If not set, the operation's default API version will be used.",
123
+ )
124
+ elif self.client_default_value is not None:
125
125
  base_description = add_to_description(
126
126
  base_description,
127
127
  f"Default value is {self.client_default_value_declaration}.",
128
128
  )
129
- if self.optional and self.client_default_value is None:
129
+ elif self.optional:
130
130
  base_description = add_to_description(
131
131
  base_description,
132
132
  f"Default value is {self.client_default_value_declaration}.",
@@ -378,6 +378,8 @@ class ClientParameter(Parameter):
378
378
  def method_location(self) -> ParameterMethodLocation:
379
379
  if self.constant:
380
380
  return ParameterMethodLocation.KWARG
381
+ if self.is_api_version:
382
+ return ParameterMethodLocation.KWARG
381
383
  if (
382
384
  self.is_host
383
385
  and (self.code_model.options["version-tolerant"] or self.code_model.options["low-level-client"])
@@ -409,6 +411,6 @@ class ConfigParameter(Parameter):
409
411
 
410
412
  @property
411
413
  def method_location(self) -> ParameterMethodLocation:
412
- if self.constant:
414
+ if self.constant or self.is_api_version:
413
415
  return ParameterMethodLocation.KWARG
414
416
  return ParameterMethodLocation.POSITIONAL
@@ -42,15 +42,15 @@ __all__ = [
42
42
  "JinjaSerializer",
43
43
  ]
44
44
 
45
- _PACKAGE_FILES = [
45
+ _DEFAULT_PACKAGE_FILES = (
46
46
  "CHANGELOG.md.jinja2",
47
47
  "dev_requirements.txt.jinja2",
48
48
  "LICENSE.jinja2",
49
49
  "MANIFEST.in.jinja2",
50
50
  "README.md.jinja2",
51
- ]
51
+ )
52
52
 
53
- _REGENERATE_FILES = {"MANIFEST.in"}
53
+ _DEFAULT_REGENERATE_FILES = frozenset({"MANIFEST.in"})
54
54
  AsyncInfo = namedtuple("AsyncInfo", ["async_mode", "async_path"])
55
55
 
56
56
 
@@ -75,15 +75,17 @@ class JinjaSerializer(ReaderAndWriter):
75
75
  ) -> None:
76
76
  super().__init__(output_folder=output_folder, **kwargs)
77
77
  self.code_model = code_model
78
+ self._package_files: list[str] = list(_DEFAULT_PACKAGE_FILES)
79
+ self._regenerate_files: set[str] = set(_DEFAULT_REGENERATE_FILES)
78
80
  self._regenerate_setup_py()
79
81
 
80
82
  def _regenerate_setup_py(self):
81
83
  if self.code_model.options["keep-setup-py"] or self.code_model.options["basic-setup-py"]:
82
- _PACKAGE_FILES.append("setup.py.jinja2")
83
- _REGENERATE_FILES.add("setup.py")
84
+ self._package_files.append("setup.py.jinja2")
85
+ self._regenerate_files.add("setup.py")
84
86
  else:
85
- _PACKAGE_FILES.append("pyproject.toml.jinja2")
86
- _REGENERATE_FILES.add("pyproject.toml")
87
+ self._package_files.append("pyproject.toml.jinja2")
88
+ self._regenerate_files.add("pyproject.toml")
87
89
 
88
90
  @property
89
91
  def has_aio_folder(self) -> bool:
@@ -180,6 +182,17 @@ class JinjaSerializer(ReaderAndWriter):
180
182
  elif client_namespace_type.clients:
181
183
  # add clients folder if there are clients in this namespace
182
184
  self._serialize_client_and_config_files(client_namespace, client_namespace_type.clients, env)
185
+ # When generation-subdir is configured, generated code goes into a subdirectory
186
+ # (e.g., _generated/). We also need an __init__.py in the parent namespace dir
187
+ # so that the package is discoverable by find_packages() / pip install.
188
+ root_dir = self.code_model.get_root_dir()
189
+ if self.code_model.options.get("generation-subdir") and not self.read_file(
190
+ root_dir / Path("__init__.py")
191
+ ):
192
+ self.write_file(
193
+ root_dir / Path("__init__.py"),
194
+ general_serializer.serialize_pkgutil_init_file(),
195
+ )
183
196
  else:
184
197
  # add pkgutil init file if no clients in this namespace
185
198
  self.write_file(
@@ -242,7 +255,7 @@ class JinjaSerializer(ReaderAndWriter):
242
255
  lstrip_blocks=True,
243
256
  )
244
257
 
245
- package_files = _PACKAGE_FILES
258
+ package_files = list(self._package_files)
246
259
  if not self.code_model.license_description:
247
260
  package_files.remove("LICENSE.jinja2")
248
261
  elif Path(self.code_model.options["package-mode"]).exists():
@@ -261,7 +274,7 @@ class JinjaSerializer(ReaderAndWriter):
261
274
  continue
262
275
  file = template_name.replace(".jinja2", "")
263
276
  output_file = root_of_sdk / file
264
- if not self.read_file(output_file) or file in _REGENERATE_FILES:
277
+ if not self.read_file(output_file) or file in self._regenerate_files:
265
278
  if self.keep_version_file and file == "setup.py" and not self.code_model.options["azure-arm"]:
266
279
  # don't regenerate setup.py file if the version file is more up to date for data-plane
267
280
  continue
@@ -482,32 +495,34 @@ class JinjaSerializer(ReaderAndWriter):
482
495
 
483
496
  def _serialize_and_write_top_level_folder(self, env: Environment, namespace: str) -> None:
484
497
  root_dir = self.code_model.get_root_dir()
498
+ generation_dir = self.code_model.get_generation_dir(namespace)
485
499
  # write _utils folder
486
500
  self._serialize_and_write_utils_folder(env, self.code_model.namespace)
487
501
 
488
502
  general_serializer = GeneralSerializer(code_model=self.code_model, env=env, async_mode=False)
489
503
 
490
504
  # write _version.py
505
+ # Always write at root namespace since pyproject.toml references it there
491
506
  self._serialize_and_write_version_file(general_serializer)
492
- # if there's a subdir, we need to write another version file in the subdir
493
507
  if self.code_model.options.get("generation-subdir"):
494
508
  self._serialize_and_write_version_file(general_serializer, namespace)
495
509
 
496
510
  # write the empty py.typed file
511
+ # Always write at root namespace since MANIFEST.in references it there
497
512
  pytyped_value = "# Marker file for PEP 561."
498
513
  self.write_file(root_dir / Path("py.typed"), pytyped_value)
499
514
 
500
515
  # write _validation.py
501
516
  if any(og for client in self.code_model.clients for og in client.operation_groups if og.need_validation):
502
517
  self.write_file(
503
- root_dir / Path("_validation.py"),
518
+ generation_dir / Path("_validation.py"),
504
519
  general_serializer.serialize_validation_file(),
505
520
  )
506
521
 
507
522
  # write _types.py
508
523
  if self.code_model.named_unions:
509
524
  self.write_file(
510
- root_dir / Path("_types.py"),
525
+ generation_dir / Path("_types.py"),
511
526
  TypesSerializer(code_model=self.code_model, env=env).serialize(),
512
527
  )
513
528
 
@@ -107,10 +107,18 @@ def _serialize_grouped_body(builder: BuilderType) -> list[str]:
107
107
  groupers = [p for p in builder.parameters if p.grouper]
108
108
  for grouper in groupers:
109
109
  retval.append(f"if {grouper.client_name} is not None:")
110
+ # Keys in property_to_parameter_name are original client names (e.g. "from", "custom_header").
111
+ # Attribute access needs the padded client_name from the model property (e.g. "from_property").
112
+ # Build lookup from both wire_name and client_name to handle all cases.
113
+ grouper_model = cast(ModelType, grouper.type)
114
+ prop_name_to_client = {}
115
+ for prop in grouper_model.properties:
116
+ prop_name_to_client[prop.wire_name] = prop.client_name
117
+ prop_name_to_client[prop.client_name] = prop.client_name
110
118
  retval.extend(
111
119
  [
112
- f" {parameter} = {grouper.client_name}.{property}"
113
- for property, parameter in grouper.property_to_parameter_name.items()
120
+ f" {parameter} = {grouper.client_name}.{prop_name_to_client[prop_name]}"
121
+ for prop_name, parameter in grouper.property_to_parameter_name.items()
114
122
  ]
115
123
  )
116
124
  return retval
@@ -1353,7 +1361,8 @@ class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
1353
1361
  except StopIteration:
1354
1362
  pass
1355
1363
 
1356
- retval.append(f'_request = HttpRequest("{builder.next_link_verb}", {next_link_str}{query_str})')
1364
+ header_str = ", headers=_headers"
1365
+ retval.append(f'_request = HttpRequest("{builder.next_link_verb}", {next_link_str}{header_str}{query_str})')
1357
1366
  retval.extend(self._postprocess_http_request(builder, "_request.url"))
1358
1367
 
1359
1368
  return retval
@@ -28,7 +28,7 @@ VERSION_MAP = {
28
28
  "corehttp": "1.0.0b6",
29
29
  }
30
30
 
31
- MIN_PYTHON_VERSION = "3.9"
31
+ MIN_PYTHON_VERSION = "3.10"
32
32
  MAX_PYTHON_VERSION = "3.13"
33
33
 
34
34
 
@@ -155,7 +155,10 @@ class GeneralSerializer(BaseSerializer):
155
155
  "VERSION_MAP": VERSION_MAP,
156
156
  "MIN_PYTHON_VERSION": MIN_PYTHON_VERSION,
157
157
  "MAX_PYTHON_VERSION": MAX_PYTHON_VERSION,
158
- "ADDITIONAL_DEPENDENCIES": [f"{item[0]}>={item[1]}" for item in additional_version_map.items()],
158
+ "ADDITIONAL_DEPENDENCIES": [
159
+ dep if dep.startswith('"') else f'"{dep}"'
160
+ for dep in (f"{item[0]}>={item[1]}" for item in additional_version_map.items())
161
+ ],
159
162
  }
160
163
  params |= {"options": self.code_model.options}
161
164
  params |= kwargs
@@ -326,6 +329,7 @@ class GeneralSerializer(BaseSerializer):
326
329
  {
327
330
  "CrossLanguagePackageId": self.code_model.cross_language_package_id,
328
331
  "CrossLanguageDefinitionId": cross_langauge_def_dict,
332
+ "CrossLanguageVersion": self.code_model.cross_language_version,
329
333
  },
330
334
  indent=4,
331
335
  )
@@ -50,20 +50,25 @@ def _serialize_import_type(imports: list[ImportModel], delimiter: str) -> str:
50
50
  import_list = []
51
51
  for module_name in sorted(set(i.module_name for i in imports)):
52
52
  normal_imports = [i for i in imports if i.module_name == module_name and not i.version_modules]
53
- versioned_imports = [i for i in imports if i.module_name == module_name and i.version_modules]
54
53
  if normal_imports:
55
54
  import_list.append(_serialize_package(normal_imports, delimiter))
56
- for i in versioned_imports:
57
- import_list.append(_serialize_versioned_package(i, delimiter))
58
55
  return delimiter.join(import_list)
59
56
 
60
57
 
58
+ def _serialize_versioned_imports(imports: list[ImportModel], delimiter: str) -> str:
59
+ """Serialize all versioned imports together, to be emitted after all regular imports."""
60
+ return delimiter.join(_serialize_versioned_package(i, delimiter) for i in imports if i.version_modules)
61
+
62
+
61
63
  def _get_import_clauses(imports: list[ImportModel], delimiter: str) -> list[str]:
62
64
  import_clause = []
63
65
  for import_type in ImportType:
64
- imports_with_import_type = [i for i in imports if i.import_type == import_type]
66
+ imports_with_import_type = [i for i in imports if i.import_type == import_type and not i.version_modules]
65
67
  if imports_with_import_type:
66
68
  import_clause.append(_serialize_import_type(imports_with_import_type, delimiter))
69
+ versioned = [i for i in imports if i.version_modules]
70
+ if versioned:
71
+ import_clause.append(_serialize_versioned_imports(versioned, delimiter))
67
72
  return import_clause
68
73
 
69
74
 
@@ -79,6 +84,13 @@ class FileImportSerializer:
79
84
  if any(self.file_import.get_imports_from_section(TypingSection.TYPING)):
80
85
  self.file_import.add_submodule_import("typing", "TYPE_CHECKING", ImportType.STDLIB)
81
86
 
87
+ def _add_sys_import_if_needed(self):
88
+ all_imports = list(self.file_import.get_imports_from_section(TypingSection.REGULAR)) + list(
89
+ self.file_import.get_imports_from_section(TypingSection.TYPING)
90
+ )
91
+ if any(i.version_modules for i in all_imports):
92
+ self.file_import.add_import("sys", ImportType.STDLIB)
93
+
82
94
  def get_typing_definitions(self) -> str:
83
95
  def declare_definition(type_name: str, type_definition: TypeDefinition) -> list[str]:
84
96
  ret: list[str] = []
@@ -95,6 +107,7 @@ class FileImportSerializer:
95
107
 
96
108
  def __str__(self) -> str:
97
109
  self._add_type_checking_import()
110
+ self._add_sys_import_if_needed()
98
111
  regular_imports = ""
99
112
  regular_imports_list = self._get_imports_list(TypingSection.REGULAR)
100
113
 
@@ -39,16 +39,6 @@ SPECIAL_HEADER_SERIALIZATION: dict[str, list[str]] = {
39
39
  "client-request-id": [],
40
40
  "x-ms-client-request-id": [],
41
41
  "return-client-request-id": [],
42
- "etag": [
43
- """if_match = prep_if_match(etag, match_condition)""",
44
- """if if_match is not None:""",
45
- """ _headers["If-Match"] = _SERIALIZER.header("if_match", if_match, "str")""",
46
- ],
47
- "match-condition": [
48
- """if_none_match = prep_if_none_match(etag, match_condition)""",
49
- """if if_none_match is not None:""",
50
- """ _headers["If-None-Match"] = _SERIALIZER.header("if_none_match", if_none_match, "str")""",
51
- ],
52
42
  }
53
43
 
54
44
 
@@ -157,6 +147,20 @@ class ParameterSerializer:
157
147
  ):
158
148
  return SPECIAL_HEADER_SERIALIZATION[param.wire_name.lower()]
159
149
 
150
+ if not is_legacy and param.location == ParameterLocation.HEADER and param.etag_role is not None:
151
+ header_name = param.wire_name
152
+ if param.etag_role == "ifMatch":
153
+ return [
154
+ """if_match = prep_if_match(etag, match_condition)""",
155
+ """if if_match is not None:""",
156
+ f""" _headers["{header_name}"] = _SERIALIZER.header("if_match", if_match, "str")""",
157
+ ]
158
+ return [
159
+ """if_none_match = prep_if_none_match(etag, match_condition)""",
160
+ """if if_none_match is not None:""",
161
+ f""" _headers["{header_name}"] = _SERIALIZER.header("if_none_match", if_none_match, "str")""",
162
+ ]
163
+
160
164
  set_parameter = "_{}['{}'] = {}".format(
161
165
  kwarg_name,
162
166
  param.wire_name,
@@ -202,11 +206,13 @@ class ParameterSerializer:
202
206
  if is_content_type_optional and not type_annotation.startswith("Optional[")
203
207
  else type_annotation
204
208
  )
205
- if kwarg.client_default_value is not None or kwarg.optional or kwarg.constant:
209
+ if kwarg.client_default_value is not None or kwarg.optional or kwarg.constant or kwarg.is_api_version:
206
210
  if check_client_input and kwarg.check_client_input:
207
211
  default_value = f"self._config.{kwarg.client_name}"
208
212
  elif kwarg.constant:
209
213
  default_value = kwarg.type.get_declaration(None)
214
+ elif kwarg.is_api_version and kwarg.client_default_value is None and kwarg.api_versions:
215
+ default_value = f'"{kwarg.api_versions[-1]}"'
210
216
  else:
211
217
  default_value = kwarg.client_default_value_declaration
212
218
  if check_kwarg_dict and (kwarg.location in [ParameterLocation.HEADER, ParameterLocation.QUERY]):