@typespec/http-client-python 0.1.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 (334) hide show
  1. package/README.md +118 -0
  2. package/dist/emitter/code-model.d.ts +4 -0
  3. package/dist/emitter/code-model.d.ts.map +1 -0
  4. package/dist/emitter/code-model.js +195 -0
  5. package/dist/emitter/code-model.js.map +1 -0
  6. package/dist/emitter/emitter.d.ts +6 -0
  7. package/dist/emitter/emitter.d.ts.map +1 -0
  8. package/dist/emitter/emitter.js +104 -0
  9. package/dist/emitter/emitter.js.map +1 -0
  10. package/dist/emitter/external-process.d.ts +20 -0
  11. package/dist/emitter/external-process.d.ts.map +1 -0
  12. package/dist/emitter/external-process.js +44 -0
  13. package/dist/emitter/external-process.js.map +1 -0
  14. package/dist/emitter/http.d.ts +7 -0
  15. package/dist/emitter/http.d.ts.map +1 -0
  16. package/dist/emitter/http.js +268 -0
  17. package/dist/emitter/http.js.map +1 -0
  18. package/dist/emitter/index.d.ts +3 -0
  19. package/dist/emitter/index.d.ts.map +1 -0
  20. package/dist/emitter/index.js +3 -0
  21. package/dist/emitter/index.js.map +1 -0
  22. package/dist/emitter/lib.d.ts +30 -0
  23. package/dist/emitter/lib.d.ts.map +1 -0
  24. package/dist/emitter/lib.js +33 -0
  25. package/dist/emitter/lib.js.map +1 -0
  26. package/dist/emitter/types.d.ts +36 -0
  27. package/dist/emitter/types.d.ts.map +1 -0
  28. package/dist/emitter/types.js +491 -0
  29. package/dist/emitter/types.js.map +1 -0
  30. package/dist/emitter/utils.d.ts +26 -0
  31. package/dist/emitter/utils.d.ts.map +1 -0
  32. package/dist/emitter/utils.js +155 -0
  33. package/dist/emitter/utils.js.map +1 -0
  34. package/emitter/src/code-model.ts +272 -0
  35. package/emitter/src/emitter.ts +127 -0
  36. package/emitter/src/external-process.ts +52 -0
  37. package/emitter/src/http.ts +382 -0
  38. package/emitter/src/index.ts +2 -0
  39. package/emitter/src/lib.ts +59 -0
  40. package/emitter/src/types.ts +573 -0
  41. package/emitter/src/utils.ts +215 -0
  42. package/emitter/temp/tsconfig.tsbuildinfo +1 -0
  43. package/emitter/test/utils.test.ts +22 -0
  44. package/emitter/tsconfig.build.json +11 -0
  45. package/emitter/tsconfig.json +7 -0
  46. package/emitter/vitest.config.ts +4 -0
  47. package/eng/scripts/Build-Packages.ps1 +86 -0
  48. package/eng/scripts/Check-GitChanges.ps1 +22 -0
  49. package/eng/scripts/Functions.ps1 +26 -0
  50. package/eng/scripts/Generate.ps1 +11 -0
  51. package/eng/scripts/Generation.psm1 +22 -0
  52. package/eng/scripts/Initialize-Repository.ps1 +40 -0
  53. package/eng/scripts/Test-Packages.ps1 +65 -0
  54. package/eng/scripts/ci/format.ts +3 -0
  55. package/eng/scripts/ci/lint.ts +39 -0
  56. package/eng/scripts/ci/mypy.ini +38 -0
  57. package/eng/scripts/ci/pylintrc +59 -0
  58. package/eng/scripts/ci/pyproject.toml +18 -0
  59. package/eng/scripts/ci/pyrightconfig.json +6 -0
  60. package/eng/scripts/ci/regenerate.ts +299 -0
  61. package/eng/scripts/ci/run-ci.ts +88 -0
  62. package/eng/scripts/ci/run_apiview.py +40 -0
  63. package/eng/scripts/ci/run_mypy.py +49 -0
  64. package/eng/scripts/ci/run_pylint.py +50 -0
  65. package/eng/scripts/ci/run_pyright.py +58 -0
  66. package/eng/scripts/ci/util.py +72 -0
  67. package/eng/scripts/ci/utils.ts +48 -0
  68. package/eng/scripts/setup/__pycache__/venvtools.cpython-38.pyc +0 -0
  69. package/eng/scripts/setup/install.py +53 -0
  70. package/eng/scripts/setup/prepare.py +42 -0
  71. package/eng/scripts/setup/run-python3.ts +25 -0
  72. package/eng/scripts/setup/run_tsp.py +42 -0
  73. package/eng/scripts/setup/system-requirements.ts +261 -0
  74. package/eng/scripts/setup/venvtools.py +87 -0
  75. package/generator/LICENSE +21 -0
  76. package/generator/README.md +1 -0
  77. package/generator/dev_requirements.txt +13 -0
  78. package/generator/pygen/__init__.py +107 -0
  79. package/generator/pygen/_version.py +7 -0
  80. package/generator/pygen/black.py +71 -0
  81. package/generator/pygen/codegen/__init__.py +338 -0
  82. package/generator/pygen/codegen/_utils.py +17 -0
  83. package/generator/pygen/codegen/models/__init__.py +204 -0
  84. package/generator/pygen/codegen/models/base.py +186 -0
  85. package/generator/pygen/codegen/models/base_builder.py +118 -0
  86. package/generator/pygen/codegen/models/client.py +433 -0
  87. package/generator/pygen/codegen/models/code_model.py +237 -0
  88. package/generator/pygen/codegen/models/combined_type.py +149 -0
  89. package/generator/pygen/codegen/models/constant_type.py +129 -0
  90. package/generator/pygen/codegen/models/credential_types.py +214 -0
  91. package/generator/pygen/codegen/models/dictionary_type.py +127 -0
  92. package/generator/pygen/codegen/models/enum_type.py +238 -0
  93. package/generator/pygen/codegen/models/imports.py +291 -0
  94. package/generator/pygen/codegen/models/list_type.py +143 -0
  95. package/generator/pygen/codegen/models/lro_operation.py +142 -0
  96. package/generator/pygen/codegen/models/lro_paging_operation.py +32 -0
  97. package/generator/pygen/codegen/models/model_type.py +359 -0
  98. package/generator/pygen/codegen/models/operation.py +530 -0
  99. package/generator/pygen/codegen/models/operation_group.py +184 -0
  100. package/generator/pygen/codegen/models/paging_operation.py +155 -0
  101. package/generator/pygen/codegen/models/parameter.py +412 -0
  102. package/generator/pygen/codegen/models/parameter_list.py +387 -0
  103. package/generator/pygen/codegen/models/primitive_types.py +659 -0
  104. package/generator/pygen/codegen/models/property.py +170 -0
  105. package/generator/pygen/codegen/models/request_builder.py +189 -0
  106. package/generator/pygen/codegen/models/request_builder_parameter.py +115 -0
  107. package/generator/pygen/codegen/models/response.py +348 -0
  108. package/generator/pygen/codegen/models/utils.py +21 -0
  109. package/generator/pygen/codegen/serializers/__init__.py +574 -0
  110. package/generator/pygen/codegen/serializers/base_serializer.py +21 -0
  111. package/generator/pygen/codegen/serializers/builder_serializer.py +1507 -0
  112. package/generator/pygen/codegen/serializers/client_serializer.py +294 -0
  113. package/generator/pygen/codegen/serializers/enum_serializer.py +15 -0
  114. package/generator/pygen/codegen/serializers/general_serializer.py +213 -0
  115. package/generator/pygen/codegen/serializers/import_serializer.py +126 -0
  116. package/generator/pygen/codegen/serializers/metadata_serializer.py +198 -0
  117. package/generator/pygen/codegen/serializers/model_init_serializer.py +33 -0
  118. package/generator/pygen/codegen/serializers/model_serializer.py +317 -0
  119. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +89 -0
  120. package/generator/pygen/codegen/serializers/operations_init_serializer.py +44 -0
  121. package/generator/pygen/codegen/serializers/parameter_serializer.py +221 -0
  122. package/generator/pygen/codegen/serializers/patch_serializer.py +19 -0
  123. package/generator/pygen/codegen/serializers/request_builders_serializer.py +52 -0
  124. package/generator/pygen/codegen/serializers/sample_serializer.py +168 -0
  125. package/generator/pygen/codegen/serializers/test_serializer.py +292 -0
  126. package/generator/pygen/codegen/serializers/types_serializer.py +31 -0
  127. package/generator/pygen/codegen/serializers/utils.py +68 -0
  128. package/generator/pygen/codegen/templates/client.py.jinja2 +37 -0
  129. package/generator/pygen/codegen/templates/client_container.py.jinja2 +12 -0
  130. package/generator/pygen/codegen/templates/config.py.jinja2 +73 -0
  131. package/generator/pygen/codegen/templates/config_container.py.jinja2 +16 -0
  132. package/generator/pygen/codegen/templates/conftest.py.jinja2 +28 -0
  133. package/generator/pygen/codegen/templates/enum.py.jinja2 +13 -0
  134. package/generator/pygen/codegen/templates/enum_container.py.jinja2 +10 -0
  135. package/generator/pygen/codegen/templates/init.py.jinja2 +24 -0
  136. package/generator/pygen/codegen/templates/keywords.jinja2 +19 -0
  137. package/generator/pygen/codegen/templates/lro_operation.py.jinja2 +16 -0
  138. package/generator/pygen/codegen/templates/lro_paging_operation.py.jinja2 +18 -0
  139. package/generator/pygen/codegen/templates/macros.jinja2 +12 -0
  140. package/generator/pygen/codegen/templates/metadata.json.jinja2 +167 -0
  141. package/generator/pygen/codegen/templates/model_base.py.jinja2 +1157 -0
  142. package/generator/pygen/codegen/templates/model_container.py.jinja2 +12 -0
  143. package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +97 -0
  144. package/generator/pygen/codegen/templates/model_init.py.jinja2 +28 -0
  145. package/generator/pygen/codegen/templates/model_msrest.py.jinja2 +92 -0
  146. package/generator/pygen/codegen/templates/operation.py.jinja2 +21 -0
  147. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +75 -0
  148. package/generator/pygen/codegen/templates/operation_groups_container.py.jinja2 +19 -0
  149. package/generator/pygen/codegen/templates/operation_tools.jinja2 +81 -0
  150. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +17 -0
  151. package/generator/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +6 -0
  152. package/generator/pygen/codegen/templates/packaging_templates/LICENSE.jinja2 +21 -0
  153. package/generator/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +8 -0
  154. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +107 -0
  155. package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +9 -0
  156. package/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +108 -0
  157. package/generator/pygen/codegen/templates/paging_operation.py.jinja2 +21 -0
  158. package/generator/pygen/codegen/templates/patch.py.jinja2 +19 -0
  159. package/generator/pygen/codegen/templates/pkgutil_init.py.jinja2 +1 -0
  160. package/generator/pygen/codegen/templates/request_builder.py.jinja2 +28 -0
  161. package/generator/pygen/codegen/templates/request_builders.py.jinja2 +10 -0
  162. package/generator/pygen/codegen/templates/rest_init.py.jinja2 +12 -0
  163. package/generator/pygen/codegen/templates/sample.py.jinja2 +44 -0
  164. package/generator/pygen/codegen/templates/serialization.py.jinja2 +2114 -0
  165. package/generator/pygen/codegen/templates/test.py.jinja2 +50 -0
  166. package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +26 -0
  167. package/generator/pygen/codegen/templates/types.py.jinja2 +7 -0
  168. package/generator/pygen/codegen/templates/validation.py.jinja2 +38 -0
  169. package/generator/pygen/codegen/templates/vendor.py.jinja2 +95 -0
  170. package/generator/pygen/codegen/templates/version.py.jinja2 +4 -0
  171. package/generator/pygen/m2r.py +65 -0
  172. package/generator/pygen/postprocess/__init__.py +183 -0
  173. package/generator/pygen/postprocess/get_all.py +19 -0
  174. package/generator/pygen/postprocess/venvtools.py +75 -0
  175. package/generator/pygen/preprocess/__init__.py +515 -0
  176. package/generator/pygen/preprocess/helpers.py +27 -0
  177. package/generator/pygen/preprocess/python_mappings.py +224 -0
  178. package/generator/pygen/utils.py +163 -0
  179. package/generator/pygen.egg-info/PKG-INFO +25 -0
  180. package/generator/pygen.egg-info/SOURCES.txt +66 -0
  181. package/generator/pygen.egg-info/dependency_links.txt +1 -0
  182. package/generator/pygen.egg-info/requires.txt +4 -0
  183. package/generator/pygen.egg-info/top_level.txt +1 -0
  184. package/generator/requirements.txt +12 -0
  185. package/generator/setup.py +55 -0
  186. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_models_common_types_managed_identity_async.py +63 -0
  187. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_models_resource_async.py +284 -0
  188. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_access_async.py +101 -0
  189. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_flatten_async.py +93 -0
  190. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_usage_async.py +31 -0
  191. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_basic_async.py +76 -0
  192. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_rpc_async.py +22 -0
  193. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_standard_async.py +39 -0
  194. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_model_async.py +33 -0
  195. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_page_async.py +58 -0
  196. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_scalar_async.py +41 -0
  197. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_traits_async.py +87 -0
  198. package/generator/test/azure/mock_api_tests/asynctests/test_azure_example_basic_async.py +30 -0
  199. package/generator/test/azure/mock_api_tests/asynctests/test_azure_special_headers_client_request_id_async.py +30 -0
  200. package/generator/test/azure/mock_api_tests/conftest.py +150 -0
  201. package/generator/test/azure/mock_api_tests/test_azure_arm_models_common_types_managed_identity.py +60 -0
  202. package/generator/test/azure/mock_api_tests/test_azure_arm_models_resource.py +254 -0
  203. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_access.py +92 -0
  204. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_flatten.py +84 -0
  205. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_usage.py +28 -0
  206. package/generator/test/azure/mock_api_tests/test_azure_core_basic.py +70 -0
  207. package/generator/test/azure/mock_api_tests/test_azure_core_lro_rpc.py +20 -0
  208. package/generator/test/azure/mock_api_tests/test_azure_core_lro_standard.py +32 -0
  209. package/generator/test/azure/mock_api_tests/test_azure_core_model.py +30 -0
  210. package/generator/test/azure/mock_api_tests/test_azure_core_page.py +51 -0
  211. package/generator/test/azure/mock_api_tests/test_azure_core_scalar.py +35 -0
  212. package/generator/test/azure/mock_api_tests/test_azure_core_traits.py +85 -0
  213. package/generator/test/azure/mock_api_tests/test_azure_example_basic.py +29 -0
  214. package/generator/test/azure/mock_api_tests/test_azure_special_headers_client_request_id.py +29 -0
  215. package/generator/test/azure/requirements.txt +89 -0
  216. package/generator/test/azure/tox.ini +56 -0
  217. package/generator/test/generic_mock_api_tests/asynctests/test_authentication_async.py +121 -0
  218. package/generator/test/generic_mock_api_tests/asynctests/test_client_naming_async.py +69 -0
  219. package/generator/test/generic_mock_api_tests/asynctests/test_client_structure_async.py +62 -0
  220. package/generator/test/generic_mock_api_tests/asynctests/test_encode_bytes_async.py +133 -0
  221. package/generator/test/generic_mock_api_tests/asynctests/test_encode_datetime_async.py +127 -0
  222. package/generator/test/generic_mock_api_tests/asynctests/test_encode_duration_async.py +63 -0
  223. package/generator/test/generic_mock_api_tests/asynctests/test_encode_numeric_async.py +35 -0
  224. package/generator/test/generic_mock_api_tests/asynctests/test_headasboolean_async.py +35 -0
  225. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_basic_async.py +24 -0
  226. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_body_optionality_async.py +30 -0
  227. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_collection_format_async.py +44 -0
  228. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_spread_async.py +76 -0
  229. package/generator/test/generic_mock_api_tests/asynctests/test_payload_content_negotiation_async.py +37 -0
  230. package/generator/test/generic_mock_api_tests/asynctests/test_payload_json_merge_patch_async.py +98 -0
  231. package/generator/test/generic_mock_api_tests/asynctests/test_payload_media_type_async.py +27 -0
  232. package/generator/test/generic_mock_api_tests/asynctests/test_payload_multipart_async.py +153 -0
  233. package/generator/test/generic_mock_api_tests/asynctests/test_payload_pageable_async.py +19 -0
  234. package/generator/test/generic_mock_api_tests/asynctests/test_payload_xml_async.py +103 -0
  235. package/generator/test/generic_mock_api_tests/asynctests/test_resiliency_srv_driven_async.py +128 -0
  236. package/generator/test/generic_mock_api_tests/asynctests/test_routes_async.py +331 -0
  237. package/generator/test/generic_mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +24 -0
  238. package/generator/test/generic_mock_api_tests/asynctests/test_server_endpoint_not_defined_async.py +18 -0
  239. package/generator/test/generic_mock_api_tests/asynctests/test_server_path_multiple_async.py +25 -0
  240. package/generator/test/generic_mock_api_tests/asynctests/test_server_path_single_async.py +18 -0
  241. package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_not_versioned_async.py +28 -0
  242. package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_versioned_async.py +34 -0
  243. package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_conditional_request_async.py +38 -0
  244. package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_repeatability_async.py +19 -0
  245. package/generator/test/generic_mock_api_tests/asynctests/test_special_words_async.py +42 -0
  246. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_array_async.py +118 -0
  247. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_dictionary_async.py +98 -0
  248. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_extensible_async.py +25 -0
  249. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_fixed_async.py +27 -0
  250. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_empty_async.py +32 -0
  251. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_enum_discriminator_async.py +70 -0
  252. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_nested_discriminator_async.py +85 -0
  253. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_not_discriminated_async.py +34 -0
  254. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_recursive_async.py +34 -0
  255. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_single_discriminator_async.py +67 -0
  256. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_usage_async.py +32 -0
  257. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_visibility_async.py +47 -0
  258. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_additionalproperties_async.py +352 -0
  259. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py +110 -0
  260. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_optional_async.py +197 -0
  261. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_valuetypes_async.py +315 -0
  262. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_scalar_async.py +60 -0
  263. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_union_async.py +90 -0
  264. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_added_async.py +36 -0
  265. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_made_optional_async.py +21 -0
  266. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_removed_async.py +21 -0
  267. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_renamed_from_async.py +29 -0
  268. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_return_type_changed_from_async.py +18 -0
  269. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_type_changed_from_async.py +22 -0
  270. package/generator/test/generic_mock_api_tests/conftest.py +113 -0
  271. package/generator/test/generic_mock_api_tests/data/image.jpg +0 -0
  272. package/generator/test/generic_mock_api_tests/data/image.png +0 -0
  273. package/generator/test/generic_mock_api_tests/test_authentication.py +113 -0
  274. package/generator/test/generic_mock_api_tests/test_client_naming.py +57 -0
  275. package/generator/test/generic_mock_api_tests/test_client_structure.py +57 -0
  276. package/generator/test/generic_mock_api_tests/test_encode_bytes.py +128 -0
  277. package/generator/test/generic_mock_api_tests/test_encode_datetime.py +123 -0
  278. package/generator/test/generic_mock_api_tests/test_encode_duration.py +60 -0
  279. package/generator/test/generic_mock_api_tests/test_encode_numeric.py +31 -0
  280. package/generator/test/generic_mock_api_tests/test_headasboolean.py +33 -0
  281. package/generator/test/generic_mock_api_tests/test_parameters_basic.py +22 -0
  282. package/generator/test/generic_mock_api_tests/test_parameters_body_optionality.py +27 -0
  283. package/generator/test/generic_mock_api_tests/test_parameters_collection_format.py +37 -0
  284. package/generator/test/generic_mock_api_tests/test_parameters_spread.py +66 -0
  285. package/generator/test/generic_mock_api_tests/test_payload_content_negotiation.py +33 -0
  286. package/generator/test/generic_mock_api_tests/test_payload_json_merge_patch.py +93 -0
  287. package/generator/test/generic_mock_api_tests/test_payload_media_type.py +25 -0
  288. package/generator/test/generic_mock_api_tests/test_payload_multipart.py +140 -0
  289. package/generator/test/generic_mock_api_tests/test_payload_pageable.py +18 -0
  290. package/generator/test/generic_mock_api_tests/test_payload_xml.py +93 -0
  291. package/generator/test/generic_mock_api_tests/test_resiliency_srv_driven.py +122 -0
  292. package/generator/test/generic_mock_api_tests/test_routes.py +285 -0
  293. package/generator/test/generic_mock_api_tests/test_serialization_encoded_name_json.py +21 -0
  294. package/generator/test/generic_mock_api_tests/test_server_endpoint_not_defined.py +17 -0
  295. package/generator/test/generic_mock_api_tests/test_server_path_multiple.py +21 -0
  296. package/generator/test/generic_mock_api_tests/test_server_path_single.py +17 -0
  297. package/generator/test/generic_mock_api_tests/test_server_versions_not_versioned.py +25 -0
  298. package/generator/test/generic_mock_api_tests/test_server_versions_versioned.py +30 -0
  299. package/generator/test/generic_mock_api_tests/test_special_headers_conditional_request.py +34 -0
  300. package/generator/test/generic_mock_api_tests/test_special_headers_repeatability.py +18 -0
  301. package/generator/test/generic_mock_api_tests/test_special_words.py +37 -0
  302. package/generator/test/generic_mock_api_tests/test_typetest_array.py +103 -0
  303. package/generator/test/generic_mock_api_tests/test_typetest_dictionary.py +86 -0
  304. package/generator/test/generic_mock_api_tests/test_typetest_enum_extensible.py +23 -0
  305. package/generator/test/generic_mock_api_tests/test_typetest_enum_fixed.py +25 -0
  306. package/generator/test/generic_mock_api_tests/test_typetest_model_empty.py +29 -0
  307. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_enum_discriminator.py +58 -0
  308. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_nested_discriminator.py +79 -0
  309. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_not_discriminated.py +31 -0
  310. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_recursive.py +32 -0
  311. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_single_discriminator.py +60 -0
  312. package/generator/test/generic_mock_api_tests/test_typetest_model_usage.py +28 -0
  313. package/generator/test/generic_mock_api_tests/test_typetest_model_visibility.py +40 -0
  314. package/generator/test/generic_mock_api_tests/test_typetest_property_additionalproperties.py +313 -0
  315. package/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py +102 -0
  316. package/generator/test/generic_mock_api_tests/test_typetest_property_optional.py +174 -0
  317. package/generator/test/generic_mock_api_tests/test_typetest_property_valuetypes.py +286 -0
  318. package/generator/test/generic_mock_api_tests/test_typetest_scalar.py +53 -0
  319. package/generator/test/generic_mock_api_tests/test_typetest_union.py +80 -0
  320. package/generator/test/generic_mock_api_tests/test_versioning_added.py +33 -0
  321. package/generator/test/generic_mock_api_tests/test_versioning_made_optional.py +20 -0
  322. package/generator/test/generic_mock_api_tests/test_versioning_removed.py +20 -0
  323. package/generator/test/generic_mock_api_tests/test_versioning_renamed_from.py +27 -0
  324. package/generator/test/generic_mock_api_tests/test_versioning_return_type_changed_from.py +17 -0
  325. package/generator/test/generic_mock_api_tests/test_versioning_type_changed_from.py +21 -0
  326. package/generator/test/generic_mock_api_tests/unittests/test_model_base_serialization.py +4067 -0
  327. package/generator/test/generic_mock_api_tests/unittests/test_model_base_xml_serialization.py +1001 -0
  328. package/generator/test/unbranded/mock_api_tests/asynctests/test_unbranded_async.py +24 -0
  329. package/generator/test/unbranded/mock_api_tests/cadl-ranch-config.yaml +27 -0
  330. package/generator/test/unbranded/mock_api_tests/conftest.py +35 -0
  331. package/generator/test/unbranded/mock_api_tests/test_unbranded.py +57 -0
  332. package/generator/test/unbranded/requirements.txt +72 -0
  333. package/generator/test/unbranded/tox.ini +56 -0
  334. package/package.json +93 -0
@@ -0,0 +1,155 @@
1
+ import { getNamespaceFullName } from "@typespec/compiler";
2
+ import { getSimpleTypeResult, getType } from "./types.js";
3
+ function IsFullyUpperCase(identifier, maxUppercasePreserve) {
4
+ const len = identifier.length;
5
+ if (len > 1) {
6
+ if (len <= maxUppercasePreserve && identifier === identifier.toUpperCase()) {
7
+ return true;
8
+ }
9
+ if (len <= maxUppercasePreserve + 1 && identifier.endsWith("s")) {
10
+ const i = identifier.substring(0, len - 1);
11
+ if (i.toUpperCase() === i) {
12
+ return true;
13
+ }
14
+ }
15
+ }
16
+ return false;
17
+ }
18
+ function deconstruct(identifier, maxUppercasePreserve) {
19
+ if (Array.isArray(identifier)) {
20
+ return [...identifier.flatMap((each) => deconstruct(each, maxUppercasePreserve))];
21
+ }
22
+ return `${identifier}`
23
+ .replace(/([a-z]+)([A-Z])/g, "$1 $2") // Add a space in between camelCase words(e.g. fooBar => foo Bar)
24
+ .replace(/(\d+)/g, " $1 ") // Adds a space after numbers(e.g. foo123 => foo123 bar)
25
+ .replace(/\b([A-Z]+)([A-Z])s([^a-z])(.*)/g, "$1$2« $3$4") // Add a space after a plural upper cased word(e.g. MBsFoo => MBs Foo)
26
+ .replace(/\b([A-Z]+)([A-Z])([a-z]+)/g, "$1 $2$3") // Add a space between an upper case word(2 char+) and the last capital case.(e.g. SQLConnection -> SQL Connection)
27
+ .replace(/«/g, "s")
28
+ .trim()
29
+ .split(/[\W|_]+/)
30
+ .map((each) => (IsFullyUpperCase(each, maxUppercasePreserve) ? each : each.toLowerCase()));
31
+ }
32
+ function isEqual(s1, s2) {
33
+ // when s2 is undefined and s1 is the string 'undefined', it returns 0, making this true.
34
+ // To prevent that, first we need to check if s2 is undefined.
35
+ return s2 !== undefined && !!s1 && !s1.localeCompare(s2, undefined, { sensitivity: "base" });
36
+ }
37
+ function removeSequentialDuplicates(identifier) {
38
+ const ids = [...identifier].filter((each) => !!each);
39
+ for (let i = 0; i < ids.length; i++) {
40
+ while (isEqual(ids[i], ids[i - 1])) {
41
+ ids.splice(i, 1);
42
+ }
43
+ while (isEqual(ids[i], ids[i - 2]) && isEqual(ids[i + 1], ids[i - 1])) {
44
+ ids.splice(i, 2);
45
+ }
46
+ }
47
+ return ids;
48
+ }
49
+ function normalize(identifier, removeDuplicates = true, maxUppercasePreserve = 0) {
50
+ if (!identifier || identifier.length === 0) {
51
+ return [""];
52
+ }
53
+ return typeof identifier === "string"
54
+ ? normalize(deconstruct(identifier, maxUppercasePreserve), removeDuplicates, maxUppercasePreserve)
55
+ : removeDuplicates
56
+ ? removeSequentialDuplicates(identifier)
57
+ : identifier;
58
+ }
59
+ export function camelToSnakeCase(name) {
60
+ if (!name)
61
+ return name;
62
+ const words = normalize(name, false, 6);
63
+ const result = words.join("_").toLowerCase();
64
+ const result_final = result.replace(/([^\d])_(\d+)/g, "$1$2");
65
+ return result_final;
66
+ }
67
+ export function removeUnderscoresFromNamespace(name) {
68
+ // needed because of the _specs_ tests
69
+ return (name || "").replace(/_/g, "");
70
+ }
71
+ export function getImplementation(context, parameter) {
72
+ if (parameter.onClient)
73
+ return "Client";
74
+ return "Method";
75
+ }
76
+ export function isAbstract(method) {
77
+ return (method.operation.bodyParam?.contentTypes.length ?? 0) > 1 && method.access !== "internal";
78
+ }
79
+ export function getDelimiterAndExplode(parameter) {
80
+ if (parameter.type.kind !== "array")
81
+ return [undefined, false];
82
+ let delimiter = undefined;
83
+ let explode = parameter.kind === "query" && parameter.explode;
84
+ if (parameter.collectionFormat === "csv" || parameter.collectionFormat === "simple") {
85
+ delimiter = "comma";
86
+ }
87
+ else if (parameter.collectionFormat === "ssv") {
88
+ delimiter = "space";
89
+ }
90
+ else if (parameter.collectionFormat === "tsv") {
91
+ delimiter = "tab";
92
+ }
93
+ else if (parameter.collectionFormat === "pipes") {
94
+ delimiter = "pipe";
95
+ }
96
+ else {
97
+ explode = true;
98
+ }
99
+ return [delimiter, explode];
100
+ }
101
+ export function getAddedOn(context, type) {
102
+ // since we do not support multi-service for now, we can just check the root client's api version
103
+ // if type is added in the first version of the client, we do not need to add the versioning info
104
+ if (type.apiVersions[0] ===
105
+ context.sdkPackage.clients.find((c) => c.initialization.access === "public")?.apiVersions[0])
106
+ return undefined;
107
+ return type.apiVersions[0];
108
+ }
109
+ export function emitParamBase(context, parameter) {
110
+ let type = getType(context, parameter.type);
111
+ if (parameter.isApiVersionParam) {
112
+ if (parameter.clientDefaultValue) {
113
+ type = getSimpleTypeResult({
114
+ type: "constant",
115
+ value: parameter.clientDefaultValue,
116
+ valueType: type,
117
+ });
118
+ }
119
+ }
120
+ return {
121
+ optional: parameter.optional,
122
+ description: parameter.description || "",
123
+ addedOn: getAddedOn(context, parameter),
124
+ clientName: camelToSnakeCase(parameter.name),
125
+ inOverload: false,
126
+ isApiVersion: parameter.isApiVersionParam,
127
+ type,
128
+ };
129
+ }
130
+ export function isAzureCoreErrorResponse(t) {
131
+ if (!t)
132
+ return false;
133
+ const tspType = t.__raw;
134
+ if (!tspType)
135
+ return false;
136
+ return (tspType.kind === "Model" &&
137
+ tspType.namespace !== undefined &&
138
+ ["Azure.Core", "Azure.Core.Foundations"].includes(getNamespaceFullName(tspType.namespace)) &&
139
+ tspType.name === "ErrorResponse");
140
+ }
141
+ export function getDescriptionAndSummary(method) {
142
+ if (method.details) {
143
+ return {
144
+ description: method.details,
145
+ summary: method.description,
146
+ };
147
+ }
148
+ return {
149
+ description: method.description ?? "",
150
+ };
151
+ }
152
+ export function capitalize(name) {
153
+ return name[0].toUpperCase() + name.slice(1);
154
+ }
155
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../emitter/src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,272 @@
1
+ import {
2
+ SdkBasicServiceMethod,
3
+ SdkClientType,
4
+ SdkCredentialParameter,
5
+ SdkEndpointParameter,
6
+ SdkEndpointType,
7
+ SdkLroPagingServiceMethod,
8
+ SdkLroServiceMethod,
9
+ SdkMethodParameter,
10
+ SdkPagingServiceMethod,
11
+ SdkServiceMethod,
12
+ SdkServiceOperation,
13
+ UsageFlags,
14
+ getCrossLanguagePackageId,
15
+ } from "@azure-tools/typespec-client-generator-core";
16
+ import { ignoreDiagnostics } from "@typespec/compiler";
17
+ import {
18
+ emitBasicHttpMethod,
19
+ emitLroHttpMethod,
20
+ emitLroPagingHttpMethod,
21
+ emitPagingHttpMethod,
22
+ } from "./http.js";
23
+ import { PythonSdkContext } from "./lib.js";
24
+ import {
25
+ KnownTypes,
26
+ disableGenerationMap,
27
+ emitEndpointType,
28
+ getType,
29
+ simpleTypesMap,
30
+ typesMap,
31
+ } from "./types.js";
32
+ import { emitParamBase, getImplementation, removeUnderscoresFromNamespace } from "./utils.js";
33
+
34
+ function emitBasicMethod<TServiceOperation extends SdkServiceOperation>(
35
+ context: PythonSdkContext<TServiceOperation>,
36
+ rootClient: SdkClientType<TServiceOperation>,
37
+ method: SdkBasicServiceMethod<TServiceOperation>,
38
+ operationGroupName: string,
39
+ ): Record<string, any>[] {
40
+ if (method.operation.kind !== "http")
41
+ throw new Error("We only support HTTP operations right now");
42
+ switch (method.operation.kind) {
43
+ case "http":
44
+ return emitBasicHttpMethod(context, rootClient, method, operationGroupName);
45
+ default:
46
+ throw new Error("We only support HTTP operations right now");
47
+ }
48
+ }
49
+
50
+ function emitLroMethod<TServiceOperation extends SdkServiceOperation>(
51
+ context: PythonSdkContext<TServiceOperation>,
52
+ rootClient: SdkClientType<TServiceOperation>,
53
+ method: SdkLroServiceMethod<TServiceOperation>,
54
+ operationGroupName: string,
55
+ ): Record<string, any>[] {
56
+ if (method.operation.kind !== "http")
57
+ throw new Error("We only support HTTP operations right now");
58
+ switch (method.operation.kind) {
59
+ case "http":
60
+ return emitLroHttpMethod(context, rootClient, method, operationGroupName);
61
+ default:
62
+ throw new Error("We only support HTTP operations right now");
63
+ }
64
+ }
65
+
66
+ function emitPagingMethod<TServiceOperation extends SdkServiceOperation>(
67
+ context: PythonSdkContext<TServiceOperation>,
68
+ rootClient: SdkClientType<TServiceOperation>,
69
+ method: SdkPagingServiceMethod<TServiceOperation>,
70
+ operationGroupName: string,
71
+ ): Record<string, any>[] {
72
+ if (method.operation.kind !== "http")
73
+ throw new Error("We only support HTTP operations right now");
74
+ switch (method.operation.kind) {
75
+ case "http":
76
+ return emitPagingHttpMethod(context, rootClient, method, operationGroupName);
77
+ default:
78
+ throw new Error("We only support HTTP operations right now");
79
+ }
80
+ }
81
+
82
+ function emitLroPagingMethod<TServiceOperation extends SdkServiceOperation>(
83
+ context: PythonSdkContext<TServiceOperation>,
84
+ rootClient: SdkClientType<TServiceOperation>,
85
+ method: SdkLroPagingServiceMethod<TServiceOperation>,
86
+ operationGroupName: string,
87
+ ): Record<string, any>[] {
88
+ if (method.operation.kind !== "http")
89
+ throw new Error("We only support HTTP operations right now");
90
+ switch (method.operation.kind) {
91
+ case "http":
92
+ return emitLroPagingHttpMethod(context, rootClient, method, operationGroupName);
93
+ default:
94
+ throw new Error("We only support HTTP operations right now");
95
+ }
96
+ }
97
+
98
+ function emitMethodParameter<TServiceOperation extends SdkServiceOperation>(
99
+ context: PythonSdkContext<TServiceOperation>,
100
+ parameter: SdkEndpointParameter | SdkCredentialParameter | SdkMethodParameter,
101
+ ): Record<string, any>[] {
102
+ if (parameter.kind === "endpoint") {
103
+ if (parameter.type.kind === "union") {
104
+ for (const endpointVal of parameter.type.variantTypes) {
105
+ return emitEndpointType(context, endpointVal as SdkEndpointType);
106
+ }
107
+ } else {
108
+ return emitEndpointType(context, parameter.type);
109
+ }
110
+ }
111
+ const base = {
112
+ ...emitParamBase(context, parameter),
113
+ implementation: getImplementation(context, parameter),
114
+ clientDefaultValue: parameter.clientDefaultValue,
115
+ location: parameter.kind,
116
+ };
117
+ if (parameter.isApiVersionParam) {
118
+ return [
119
+ {
120
+ ...base,
121
+ location: "query",
122
+ wireName: "api-version",
123
+ in_docstring: false,
124
+ },
125
+ ];
126
+ }
127
+ return [base];
128
+ }
129
+
130
+ function emitMethod<TServiceOperation extends SdkServiceOperation>(
131
+ context: PythonSdkContext<TServiceOperation>,
132
+ rootClient: SdkClientType<TServiceOperation>,
133
+ method: SdkServiceMethod<TServiceOperation>,
134
+ operationGroupName: string,
135
+ ): Record<string, any>[] {
136
+ switch (method.kind) {
137
+ case "basic":
138
+ return emitBasicMethod(context, rootClient, method, operationGroupName);
139
+ case "lro":
140
+ return emitLroMethod(context, rootClient, method, operationGroupName);
141
+ case "paging":
142
+ return emitPagingMethod(context, rootClient, method, operationGroupName);
143
+ default:
144
+ return emitLroPagingMethod(context, rootClient, method, operationGroupName);
145
+ }
146
+ }
147
+
148
+ function emitOperationGroups<TServiceOperation extends SdkServiceOperation>(
149
+ context: PythonSdkContext<TServiceOperation>,
150
+ client: SdkClientType<TServiceOperation>,
151
+ rootClient: SdkClientType<TServiceOperation>,
152
+ prefix: string,
153
+ ): Record<string, any>[] | undefined {
154
+ const operationGroups: Record<string, any>[] = [];
155
+
156
+ for (const method of client.methods) {
157
+ if (method.kind === "clientaccessor") {
158
+ const operationGroup = method.response;
159
+ const name = `${prefix}${operationGroup.name}`;
160
+ let operations: Record<string, any>[] = [];
161
+ for (const method of operationGroup.methods) {
162
+ if (method.kind === "clientaccessor") continue;
163
+ operations = operations.concat(emitMethod(context, rootClient, method, name));
164
+ }
165
+ operationGroups.push({
166
+ name: name,
167
+ className: name,
168
+ propertyName: operationGroup.name,
169
+ operations: operations,
170
+ operationGroups: emitOperationGroups(context, operationGroup, rootClient, name),
171
+ });
172
+ }
173
+ }
174
+
175
+ // root client should deal with mixin operation group
176
+ if (prefix === "") {
177
+ let operations: Record<string, any>[] = [];
178
+ for (const method of client.methods) {
179
+ if (method.kind === "clientaccessor") continue;
180
+ operations = operations.concat(emitMethod(context, rootClient, method, ""));
181
+ }
182
+ if (operations.length > 0) {
183
+ operationGroups.push({
184
+ name: "",
185
+ className: "",
186
+ propertyName: "",
187
+ operations: operations,
188
+ });
189
+ }
190
+ }
191
+
192
+ return operationGroups.length > 0 ? operationGroups : undefined;
193
+ }
194
+
195
+ function emitClient<TServiceOperation extends SdkServiceOperation>(
196
+ context: PythonSdkContext<TServiceOperation>,
197
+ client: SdkClientType<TServiceOperation>,
198
+ ): Record<string, any> {
199
+ if (client.initialization) {
200
+ context.__endpointPathParameters = [];
201
+ }
202
+ const parameters =
203
+ client.initialization?.properties
204
+ .map((x) => emitMethodParameter(context, x))
205
+ .reduce((a, b) => [...a, ...b]) ?? [];
206
+
207
+ const endpointParameter = client.initialization?.properties.find((x) => x.kind === "endpoint") as
208
+ | SdkEndpointParameter
209
+ | undefined;
210
+ const operationGroups = emitOperationGroups(context, client, client, "");
211
+ let url: string | undefined;
212
+ if (endpointParameter?.type.kind === "union") {
213
+ url = (endpointParameter.type.variantTypes[0] as SdkEndpointType).serverUrl;
214
+ } else {
215
+ url = endpointParameter?.type.serverUrl;
216
+ }
217
+ return {
218
+ name: client.name,
219
+ description: client.description ?? "",
220
+ parameters,
221
+ operationGroups,
222
+ url,
223
+ apiVersions: client.apiVersions,
224
+ arm: context.arm,
225
+ };
226
+ }
227
+
228
+ export function emitCodeModel<TServiceOperation extends SdkServiceOperation>(
229
+ sdkContext: PythonSdkContext<TServiceOperation>,
230
+ ) {
231
+ // Get types
232
+ const sdkPackage = sdkContext.sdkPackage;
233
+ const codeModel: Record<string, any> = {
234
+ namespace: removeUnderscoresFromNamespace(sdkPackage.rootNamespace).toLowerCase(),
235
+ clients: [],
236
+ subnamespaceToClients: {},
237
+ };
238
+ for (const client of sdkPackage.clients) {
239
+ codeModel["clients"].push(emitClient(sdkContext, client));
240
+ if (client.nameSpace === sdkPackage.rootNamespace) {
241
+ } else {
242
+ codeModel["subnamespaceToClients"][client.nameSpace] = emitClient(sdkContext, client);
243
+ }
244
+ }
245
+ // loop through models and enums since there may be some orphaned models needs to be generated
246
+ for (const model of sdkPackage.models) {
247
+ if (
248
+ model.name === "" ||
249
+ ((model.usage & UsageFlags.Spread) > 0 &&
250
+ (model.usage & UsageFlags.Input) === 0 &&
251
+ (model.usage & UsageFlags.Output) === 0)
252
+ ) {
253
+ continue;
254
+ }
255
+ if (!disableGenerationMap.has(model)) {
256
+ getType(sdkContext, model);
257
+ }
258
+ }
259
+ for (const sdkEnum of sdkPackage.enums) {
260
+ if (sdkEnum.usage === UsageFlags.ApiVersionEnum) {
261
+ continue;
262
+ }
263
+ getType(sdkContext, sdkEnum);
264
+ }
265
+ codeModel["types"] = [
266
+ ...typesMap.values(),
267
+ ...Object.values(KnownTypes),
268
+ ...simpleTypesMap.values(),
269
+ ];
270
+ codeModel["crossLanguagePackageId"] = ignoreDiagnostics(getCrossLanguagePackageId(sdkContext));
271
+ return codeModel;
272
+ }
@@ -0,0 +1,127 @@
1
+ import {
2
+ createSdkContext,
3
+ SdkContext,
4
+ SdkHttpOperation,
5
+ SdkServiceOperation,
6
+ } from "@azure-tools/typespec-client-generator-core";
7
+ import { EmitContext } from "@typespec/compiler";
8
+ import { execSync } from "child_process";
9
+ import fs from "fs";
10
+ import path, { dirname } from "path";
11
+ import { fileURLToPath } from "url";
12
+ import { emitCodeModel } from "./code-model.js";
13
+ import { saveCodeModelAsYaml } from "./external-process.js";
14
+ import { PythonEmitterOptions, PythonSdkContext } from "./lib.js";
15
+ import { removeUnderscoresFromNamespace } from "./utils.js";
16
+
17
+ export function getModelsMode(context: SdkContext): "dpg" | "none" {
18
+ const specifiedModelsMode = context.emitContext.options["models-mode"];
19
+ if (specifiedModelsMode) {
20
+ const modelModes = ["dpg", "none"];
21
+ if (modelModes.includes(specifiedModelsMode)) {
22
+ return specifiedModelsMode;
23
+ }
24
+ throw new Error(
25
+ `Need to specify models mode with the following values: ${modelModes.join(", ")}`,
26
+ );
27
+ }
28
+ return "dpg";
29
+ }
30
+
31
+ function addDefaultOptions(sdkContext: SdkContext) {
32
+ const defaultOptions = {
33
+ "package-version": "1.0.0b1",
34
+ "generate-packaging-files": true,
35
+ flavor: undefined,
36
+ };
37
+ sdkContext.emitContext.options = {
38
+ ...defaultOptions,
39
+ ...sdkContext.emitContext.options,
40
+ };
41
+ const options = sdkContext.emitContext.options;
42
+ options["models-mode"] = getModelsMode(sdkContext);
43
+ if (options["generate-packaging-files"]) {
44
+ options["package-mode"] = sdkContext.arm ? "azure-mgmt" : "azure-dataplane";
45
+ }
46
+ if (!options["package-name"]) {
47
+ options["package-name"] = removeUnderscoresFromNamespace(
48
+ sdkContext.sdkPackage.rootNamespace.toLowerCase(),
49
+ ).replace(/\./g, "-");
50
+ }
51
+ if (options.flavor !== "azure") {
52
+ // if they pass in a flavor other than azure, we want to ignore the value
53
+ options.flavor = undefined;
54
+ }
55
+ if (!options.flavor && sdkContext.emitContext.emitterOutputDir.includes("azure")) {
56
+ options.flavor = "azure";
57
+ }
58
+ }
59
+
60
+ async function createPythonSdkContext<TServiceOperation extends SdkServiceOperation>(
61
+ context: EmitContext<PythonEmitterOptions>,
62
+ ): Promise<PythonSdkContext<TServiceOperation>> {
63
+ return {
64
+ ...(await createSdkContext<PythonEmitterOptions, TServiceOperation>(
65
+ context,
66
+ "@typespec/http-client-python",
67
+ {
68
+ additionalDecorators: ["TypeSpec\\.@encodedName"],
69
+ },
70
+ )),
71
+ __endpointPathParameters: [],
72
+ };
73
+ }
74
+
75
+ export async function $onEmit(context: EmitContext<PythonEmitterOptions>) {
76
+ const program = context.program;
77
+ const sdkContext = await createPythonSdkContext<SdkHttpOperation>(context);
78
+ const root = path.join(dirname(fileURLToPath(import.meta.url)), "..", "..");
79
+ const outputDir = context.emitterOutputDir;
80
+ const yamlMap = emitCodeModel(sdkContext);
81
+ addDefaultOptions(sdkContext);
82
+ const yamlPath = await saveCodeModelAsYaml("python-yaml-path", yamlMap);
83
+ let venvPath = path.join(root, "venv");
84
+ if (fs.existsSync(path.join(venvPath, "bin"))) {
85
+ venvPath = path.join(venvPath, "bin", "python");
86
+ } else if (fs.existsSync(path.join(venvPath, "Scripts"))) {
87
+ venvPath = path.join(venvPath, "Scripts", "python.exe");
88
+ } else {
89
+ throw new Error("Virtual environment doesn't exist.");
90
+ }
91
+ const commandArgs = [
92
+ venvPath,
93
+ `${root}/eng/scripts/setup/run_tsp.py`,
94
+ `--output-folder=${outputDir}`,
95
+ `--cadl-file=${yamlPath}`,
96
+ ];
97
+ const resolvedOptions = sdkContext.emitContext.options;
98
+ if (resolvedOptions["packaging-files-config"]) {
99
+ const keyValuePairs = Object.entries(resolvedOptions["packaging-files-config"]).map(
100
+ ([key, value]) => {
101
+ return `${key}:${value}`;
102
+ },
103
+ );
104
+ commandArgs.push(`--packaging-files-config='${keyValuePairs.join("|")}'`);
105
+ resolvedOptions["packaging-files-config"] = undefined;
106
+ }
107
+ if (
108
+ resolvedOptions["package-pprint-name"] !== undefined &&
109
+ !resolvedOptions["package-pprint-name"].startsWith('"')
110
+ ) {
111
+ resolvedOptions["package-pprint-name"] = `"${resolvedOptions["package-pprint-name"]}"`;
112
+ }
113
+
114
+ for (const [key, value] of Object.entries(resolvedOptions)) {
115
+ commandArgs.push(`--${key}=${value}`);
116
+ }
117
+ if (sdkContext.arm === true) {
118
+ commandArgs.push("--azure-arm=true");
119
+ }
120
+ if (resolvedOptions.flavor === "azure") {
121
+ commandArgs.push("--emit-cross-language-definition-file=true");
122
+ }
123
+ commandArgs.push("--from-typespec=true");
124
+ if (!program.compilerOptions.noEmit && !program.hasError()) {
125
+ execSync(commandArgs.join(" "));
126
+ }
127
+ }
@@ -0,0 +1,52 @@
1
+ import { joinPaths } from "@typespec/compiler";
2
+ import { ChildProcess, spawn, SpawnOptions } from "child_process";
3
+ import { randomUUID } from "crypto";
4
+ import { mkdir, writeFile } from "fs/promises";
5
+ import jsyaml from "js-yaml";
6
+ import os from "os";
7
+
8
+ const cadlCodeGenTempDir = joinPaths(os.tmpdir(), "cadl-codegen");
9
+
10
+ export function createTempPath(extension: string, prefix: string = "") {
11
+ return joinPaths(cadlCodeGenTempDir, prefix + randomUUID() + extension);
12
+ }
13
+
14
+ /**
15
+ * Save the given codemodel in a yaml file.
16
+ * @param name Name of the codemodel. To give a guide to the temp file name.
17
+ * @param codemodel Codemodel to save
18
+ * @return the absolute path to the created codemodel.
19
+ */
20
+ export async function saveCodeModelAsYaml(name: string, codemodel: unknown): Promise<string> {
21
+ await mkdir(cadlCodeGenTempDir, { recursive: true });
22
+ const filename = createTempPath(".yaml", name);
23
+ const yamlStr = jsyaml.dump(codemodel);
24
+ await writeFile(filename, yamlStr);
25
+ return filename;
26
+ }
27
+
28
+ /**
29
+ * Start external process async
30
+ * @param command Command to run. This is the just the executable path or name.
31
+ * @param args Command arguments.
32
+ * @param options Options
33
+ */
34
+ export async function execAsync(
35
+ command: string,
36
+ args: string[],
37
+ options: SpawnOptions = {},
38
+ ): Promise<{ exitCode: number; proc: ChildProcess }> {
39
+ const child = spawn(command, args, { stdio: "inherit", ...options });
40
+ return new Promise((resolve, reject) => {
41
+ child.on("error", (error) => {
42
+ reject(error);
43
+ });
44
+
45
+ child.on("exit", (exitCode) => {
46
+ resolve({
47
+ exitCode: exitCode ?? -1,
48
+ proc: child,
49
+ });
50
+ });
51
+ });
52
+ }