@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,530 @@
1
+ # -------------------------------------------------------------------------
2
+ # Copyright (c) Microsoft Corporation. All rights reserved.
3
+ # Licensed under the MIT License. See License.txt in the project root for
4
+ # license information.
5
+ # --------------------------------------------------------------------------
6
+ from itertools import chain
7
+ from typing import (
8
+ Dict,
9
+ List,
10
+ Any,
11
+ Optional,
12
+ Union,
13
+ TYPE_CHECKING,
14
+ Generic,
15
+ TypeVar,
16
+ cast,
17
+ Sequence,
18
+ )
19
+
20
+ from .request_builder_parameter import RequestBuilderParameter
21
+
22
+ from .utils import OrderedSet, add_to_pylint_disable
23
+ from .base_builder import BaseBuilder
24
+ from .imports import FileImport, ImportType, TypingSection
25
+ from .response import (
26
+ Response,
27
+ PagingResponse,
28
+ LROResponse,
29
+ LROPagingResponse,
30
+ get_response,
31
+ )
32
+ from .parameter import (
33
+ BodyParameter,
34
+ Parameter,
35
+ ParameterLocation,
36
+ )
37
+ from .parameter_list import ParameterList
38
+ from .model_type import ModelType
39
+ from .base import BaseType
40
+ from .request_builder import OverloadedRequestBuilder, RequestBuilder
41
+ from ...utils import xml_serializable, json_serializable, NAME_LENGTH_LIMIT
42
+
43
+ if TYPE_CHECKING:
44
+ from .code_model import CodeModel
45
+ from .client import Client
46
+ from . import OperationType
47
+
48
+ ResponseType = TypeVar(
49
+ "ResponseType",
50
+ bound=Union[Response, PagingResponse, LROResponse, LROPagingResponse],
51
+ )
52
+
53
+
54
+ def is_internal(target: Optional[BaseType]) -> bool:
55
+ return isinstance(target, ModelType) and target.base == "dpg" and target.internal
56
+
57
+
58
+ class OperationBase( # pylint: disable=too-many-public-methods,too-many-instance-attributes
59
+ Generic[ResponseType], BaseBuilder[ParameterList, List["Operation"]]
60
+ ):
61
+ def __init__(
62
+ self,
63
+ yaml_data: Dict[str, Any],
64
+ code_model: "CodeModel",
65
+ client: "Client",
66
+ name: str,
67
+ request_builder: Union[RequestBuilder, OverloadedRequestBuilder],
68
+ parameters: ParameterList,
69
+ responses: List[ResponseType],
70
+ exceptions: List[Response],
71
+ *,
72
+ overloads: Optional[List["Operation"]] = None,
73
+ ) -> None:
74
+ super().__init__(
75
+ code_model=code_model,
76
+ client=client,
77
+ yaml_data=yaml_data,
78
+ name=name,
79
+ parameters=parameters,
80
+ overloads=overloads,
81
+ )
82
+ self.overloads: List["Operation"] = overloads or []
83
+ self.responses = responses
84
+ self.request_builder = request_builder
85
+ self.deprecated = False
86
+ self.exceptions = exceptions
87
+ self.is_lro_initial_operation: bool = self.yaml_data.get("isLroInitialOperation", False)
88
+ self.include_documentation: bool = not self.is_lro_initial_operation
89
+ self.internal: bool = self.yaml_data.get("internal", False)
90
+ if self.internal:
91
+ self.name = "_" + self.name
92
+ self.has_etag: bool = self.yaml_data.get("hasEtag", False)
93
+ self.cross_language_definition_id: Optional[str] = self.yaml_data.get("crossLanguageDefinitionId")
94
+
95
+ @property
96
+ def stream_value(self) -> Union[str, bool]:
97
+ return (
98
+ f'kwargs.pop("stream", {self.has_stream_response})'
99
+ if self.expose_stream_keyword and self.has_response_body
100
+ else self.has_stream_response
101
+ )
102
+
103
+ @property
104
+ def has_form_data_body(self):
105
+ return self.parameters.has_form_data_body
106
+
107
+ @property
108
+ def expose_stream_keyword(self) -> bool:
109
+ return self.yaml_data.get("exposeStreamKeyword", False)
110
+
111
+ @property
112
+ def operation_type(self) -> str:
113
+ return "operation"
114
+
115
+ @property
116
+ def has_optional_return_type(self) -> bool:
117
+ """Has optional return type if there are multiple successful response types where some have
118
+ bodies and some are None
119
+ """
120
+ # means if we have at least one successful response with a body and one without
121
+ successful_response_with_body = any(r for r in self.responses if r.type)
122
+ successful_response_without_body = any(r for r in self.responses if not r.type)
123
+ return successful_response_with_body and successful_response_without_body
124
+
125
+ def response_type_annotation(self, **kwargs) -> str:
126
+ if self.code_model.options["head_as_boolean"] and self.request_builder.method.lower() == "head":
127
+ return "bool"
128
+ response_type_annotations: OrderedSet[str] = {
129
+ response.type_annotation(**kwargs): None for response in self.responses if response.type
130
+ }
131
+ response_str = ", ".join(response_type_annotations.keys())
132
+ if len(response_type_annotations) > 1:
133
+ return f"Union[{response_str}]"
134
+ if self.has_optional_return_type:
135
+ return f"Optional[{response_str}]"
136
+ if self.responses:
137
+ return self.responses[0].type_annotation(**kwargs)
138
+ return "None"
139
+
140
+ def pylint_disable(self, async_mode: bool) -> str:
141
+ retval: str = ""
142
+ if not async_mode and not self.is_overload and self.response_type_annotation(async_mode=False) == "None":
143
+ # doesn't matter if it's async or not
144
+ retval = add_to_pylint_disable(retval, "inconsistent-return-statements")
145
+ try:
146
+ if any(is_internal(r.type) for r in self.responses) or is_internal(self.parameters.body_parameter.type):
147
+ retval = add_to_pylint_disable(retval, "protected-access")
148
+ except ValueError:
149
+ pass
150
+ if len(self.name) > NAME_LENGTH_LIMIT:
151
+ retval = add_to_pylint_disable(retval, "name-too-long")
152
+ return retval
153
+
154
+ def cls_type_annotation(self, *, async_mode: bool) -> str:
155
+ if self.request_builder.method.lower() == "head" and self.code_model.options["head_as_boolean"]:
156
+ return "ClsType[None]"
157
+ return f"ClsType[{self.response_type_annotation(async_mode=async_mode)}]"
158
+
159
+ def _response_docstring_helper(self, attr_name: str, **kwargs: Any) -> str:
160
+ responses_with_body = [r for r in self.responses if r.type]
161
+ if self.request_builder.method.lower() == "head" and self.code_model.options["head_as_boolean"]:
162
+ return "bool"
163
+ if responses_with_body:
164
+ response_docstring_values: OrderedSet[str] = {
165
+ getattr(response, attr_name)(**kwargs): None for response in responses_with_body
166
+ }
167
+ retval = " or ".join(response_docstring_values.keys())
168
+ if self.has_optional_return_type:
169
+ retval += " or None"
170
+ return retval
171
+ if self.responses:
172
+ return getattr(self.responses[0], attr_name)(**kwargs)
173
+ return "None"
174
+
175
+ def response_docstring_text(self, **kwargs) -> str:
176
+ retval = self._response_docstring_helper("docstring_text", **kwargs)
177
+ if not self.code_model.options["version_tolerant"]:
178
+ retval += " or the result of cls(response)"
179
+ if self.code_model.options["models_mode"] == "dpg" and any(
180
+ isinstance(r.type, ModelType) for r in self.responses
181
+ ):
182
+ r = next(r for r in self.responses if isinstance(r.type, ModelType))
183
+ item_type = getattr(r, "item_type", getattr(r, "type"))
184
+ if item_type:
185
+ type_name = item_type.docstring_text(**kwargs)
186
+ retval += f". The {type_name} is compatible with MutableMapping"
187
+ return retval
188
+
189
+ def response_docstring_type(self, **kwargs) -> str:
190
+ return self._response_docstring_helper("docstring_type", **kwargs)
191
+
192
+ @property
193
+ def has_response_body(self) -> bool:
194
+ """Tell if at least one response has a body."""
195
+ return any(response.type for response in self.responses)
196
+
197
+ @property
198
+ def any_response_has_headers(self) -> bool:
199
+ return any(response.headers for response in self.responses)
200
+
201
+ @property
202
+ def default_error_deserialization(self) -> Optional[str]:
203
+ default_exceptions = [e for e in self.exceptions if "default" in e.status_codes and e.type]
204
+ if not default_exceptions:
205
+ return None
206
+ exception_schema = default_exceptions[0].type
207
+ if isinstance(exception_schema, ModelType):
208
+ return exception_schema.type_annotation(skip_quote=True)
209
+ # in this case, it's just an AnyType
210
+ return "'object'"
211
+
212
+ @property
213
+ def non_default_errors(self) -> List[Response]:
214
+ return [e for e in self.exceptions if "default" not in e.status_codes]
215
+
216
+ @property
217
+ def non_default_error_status_codes(self) -> List[Union[str, int]]:
218
+ """Actually returns all of the status codes from exceptions (besides default)"""
219
+ return list(chain.from_iterable([error.status_codes for error in self.non_default_errors]))
220
+
221
+ def _imports_shared(self, async_mode: bool, **kwargs: Any) -> FileImport: # pylint: disable=unused-argument
222
+ file_import = FileImport(self.code_model)
223
+ file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL)
224
+
225
+ response_types = [r.type_annotation(async_mode=async_mode, operation=self) for r in self.responses if r.type]
226
+ if len(set(response_types)) > 1:
227
+ file_import.add_submodule_import("typing", "Union", ImportType.STDLIB, TypingSection.CONDITIONAL)
228
+ if self.added_on:
229
+ file_import.add_submodule_import(
230
+ f"{'.' if async_mode else ''}.._validation",
231
+ "api_version_validation",
232
+ ImportType.LOCAL,
233
+ )
234
+ return file_import
235
+
236
+ def imports_for_multiapi(self, async_mode: bool, **kwargs: Any) -> FileImport:
237
+ if self.abstract:
238
+ return FileImport(self.code_model)
239
+ file_import = self._imports_shared(async_mode, **kwargs)
240
+ for param in self.parameters.method:
241
+ file_import.merge(
242
+ param.imports_for_multiapi(
243
+ async_mode,
244
+ operation=self,
245
+ **kwargs,
246
+ )
247
+ )
248
+ for response in self.responses:
249
+ file_import.merge(response.imports_for_multiapi(async_mode=async_mode, operation=self, **kwargs))
250
+ if self.code_model.options["models_mode"]:
251
+ for exception in self.exceptions:
252
+ file_import.merge(exception.imports_for_multiapi(async_mode=async_mode, operation=self, **kwargs))
253
+ return file_import
254
+
255
+ @staticmethod
256
+ def has_kwargs_to_pop_with_default(
257
+ kwargs_to_pop: List[
258
+ Union[
259
+ Parameter,
260
+ RequestBuilderParameter,
261
+ BodyParameter,
262
+ ]
263
+ ],
264
+ location: ParameterLocation,
265
+ ) -> bool:
266
+ return any(
267
+ (kwarg.client_default_value or kwarg.optional) and kwarg.location == location for kwarg in kwargs_to_pop
268
+ )
269
+
270
+ @property
271
+ def need_validation(self) -> bool:
272
+ """Whether we need parameter / operation validation. For API version."""
273
+ return bool(self.added_on) or any(p for p in self.parameters if p.added_on)
274
+
275
+ def get_request_builder_import(
276
+ self,
277
+ request_builder: Union[RequestBuilder, OverloadedRequestBuilder],
278
+ async_mode: bool,
279
+ ) -> FileImport:
280
+ """Helper method to get a request builder import."""
281
+ file_import = FileImport(self.code_model)
282
+ if self.code_model.options["builders_visibility"] != "embedded":
283
+ group_name = request_builder.group_name
284
+ rest_import_path = "..." if async_mode else ".."
285
+ if group_name:
286
+ file_import.add_submodule_import(
287
+ f"{rest_import_path}{self.code_model.rest_layer_name}",
288
+ group_name,
289
+ import_type=ImportType.LOCAL,
290
+ alias=f"rest_{group_name}",
291
+ )
292
+ else:
293
+ file_import.add_submodule_import(
294
+ rest_import_path,
295
+ self.code_model.rest_layer_name,
296
+ import_type=ImportType.LOCAL,
297
+ alias="rest",
298
+ )
299
+ if self.code_model.options["builders_visibility"] == "embedded" and async_mode:
300
+ file_import.add_submodule_import(
301
+ f"...{self.code_model.operations_folder_name}.{self.filename}",
302
+ request_builder.name,
303
+ import_type=ImportType.LOCAL,
304
+ )
305
+ return file_import
306
+
307
+ def imports( # pylint: disable=too-many-branches, disable=too-many-statements
308
+ self, async_mode: bool, **kwargs: Any
309
+ ) -> FileImport:
310
+ if self.abstract:
311
+ return FileImport(self.code_model)
312
+ file_import = self._imports_shared(async_mode, **kwargs)
313
+
314
+ for param in self.parameters.method:
315
+ file_import.merge(
316
+ param.imports(
317
+ async_mode,
318
+ operation=self,
319
+ **kwargs,
320
+ )
321
+ )
322
+ for response in self.responses:
323
+ file_import.merge(response.imports(async_mode=async_mode, operation=self, **kwargs))
324
+ if self.code_model.options["models_mode"]:
325
+ for exception in self.exceptions:
326
+ file_import.merge(exception.imports(async_mode=async_mode, **kwargs))
327
+
328
+ if self.parameters.has_body and self.parameters.body_parameter.flattened:
329
+ file_import.merge(self.parameters.body_parameter.type.imports(operation=self, **kwargs))
330
+ if not async_mode:
331
+ for param in self.parameters.headers:
332
+ if param.wire_name.lower() == "repeatability-request-id":
333
+ file_import.add_import("uuid", ImportType.STDLIB)
334
+ elif param.wire_name.lower() == "repeatability-first-sent":
335
+ file_import.add_import("datetime", ImportType.STDLIB)
336
+
337
+ # Exceptions
338
+ errors = [
339
+ "map_error",
340
+ "HttpResponseError",
341
+ "ClientAuthenticationError",
342
+ "ResourceNotFoundError",
343
+ "ResourceExistsError",
344
+ "ResourceNotModifiedError",
345
+ ]
346
+ if self.stream_value:
347
+ errors.extend(["StreamConsumedError", "StreamClosedError"])
348
+ for error in errors:
349
+ file_import.add_submodule_import("exceptions", error, ImportType.SDKCORE)
350
+ if self.code_model.options["azure_arm"]:
351
+ file_import.add_submodule_import("azure.mgmt.core.exceptions", "ARMErrorFormat", ImportType.SDKCORE)
352
+ if self.non_default_errors:
353
+ file_import.add_submodule_import(
354
+ "typing",
355
+ "Type",
356
+ ImportType.STDLIB,
357
+ )
358
+ file_import.add_mutable_mapping_import()
359
+ if self.non_default_error_status_codes:
360
+ file_import.add_submodule_import(
361
+ "typing",
362
+ "cast",
363
+ ImportType.STDLIB,
364
+ )
365
+
366
+ if self.has_kwargs_to_pop_with_default(
367
+ self.parameters.kwargs_to_pop, ParameterLocation.HEADER # type: ignore
368
+ ) or self.has_kwargs_to_pop_with_default(
369
+ self.parameters.kwargs_to_pop, ParameterLocation.QUERY # type: ignore
370
+ ):
371
+ file_import.add_submodule_import(
372
+ "utils",
373
+ "case_insensitive_dict",
374
+ ImportType.SDKCORE,
375
+ )
376
+ if self.deprecated:
377
+ file_import.add_import("warnings", ImportType.STDLIB)
378
+
379
+ relative_path = "..." if async_mode else ".."
380
+ if self.has_etag:
381
+ file_import.add_submodule_import(
382
+ "exceptions",
383
+ "ResourceModifiedError",
384
+ ImportType.SDKCORE,
385
+ )
386
+ if not async_mode:
387
+ file_import.add_submodule_import(f"{relative_path}_vendor", "prep_if_match", ImportType.LOCAL)
388
+ file_import.add_submodule_import(f"{relative_path}_vendor", "prep_if_none_match", ImportType.LOCAL)
389
+ if async_mode:
390
+ file_import.add_submodule_import(
391
+ "rest",
392
+ "AsyncHttpResponse",
393
+ ImportType.SDKCORE,
394
+ )
395
+ else:
396
+ file_import.add_submodule_import(
397
+ "rest",
398
+ "HttpResponse",
399
+ ImportType.SDKCORE,
400
+ )
401
+ if self.code_model.options["builders_visibility"] == "embedded" and not async_mode:
402
+ file_import.merge(self.request_builder.imports())
403
+ file_import.add_submodule_import(
404
+ f"{'' if self.code_model.is_azure_flavor else 'runtime.'}pipeline",
405
+ "PipelineResponse",
406
+ ImportType.SDKCORE,
407
+ )
408
+ file_import.add_submodule_import("rest", "HttpRequest", ImportType.SDKCORE)
409
+ file_import.add_submodule_import("typing", "Callable", ImportType.STDLIB, TypingSection.CONDITIONAL)
410
+ file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB, TypingSection.CONDITIONAL)
411
+ file_import.add_submodule_import("typing", "Dict", ImportType.STDLIB, TypingSection.CONDITIONAL)
412
+ file_import.add_submodule_import("typing", "TypeVar", ImportType.STDLIB, TypingSection.CONDITIONAL)
413
+ if self.code_model.options["tracing"] and self.want_tracing and not async_mode:
414
+ file_import.add_submodule_import(
415
+ "azure.core.tracing.decorator",
416
+ "distributed_trace",
417
+ ImportType.SDKCORE,
418
+ )
419
+ file_import.merge(self.get_request_builder_import(self.request_builder, async_mode))
420
+ if self.overloads:
421
+ file_import.add_submodule_import("typing", "overload", ImportType.STDLIB)
422
+ if self.code_model.options["models_mode"] == "dpg":
423
+ if self.parameters.has_body:
424
+ if self.has_form_data_body:
425
+ file_import.add_submodule_import(relative_path, "_model_base", ImportType.LOCAL)
426
+ elif xml_serializable(self.parameters.body_parameter.default_content_type):
427
+ file_import.add_submodule_import(
428
+ f"{relative_path}_model_base",
429
+ "_get_element",
430
+ ImportType.LOCAL,
431
+ )
432
+ elif json_serializable(self.parameters.body_parameter.default_content_type):
433
+ file_import.add_submodule_import(
434
+ f"{relative_path}_model_base",
435
+ "SdkJSONEncoder",
436
+ ImportType.LOCAL,
437
+ )
438
+ file_import.add_import("json", ImportType.STDLIB)
439
+ if any(xml_serializable(str(r.default_content_type)) for r in self.responses):
440
+ file_import.add_submodule_import(f"{relative_path}_model_base", "_deserialize_xml", ImportType.LOCAL)
441
+ elif any(r.type for r in self.responses):
442
+ file_import.add_submodule_import(f"{relative_path}_model_base", "_deserialize", ImportType.LOCAL)
443
+ if self.default_error_deserialization or self.non_default_errors:
444
+ file_import.add_submodule_import(f"{relative_path}_model_base", "_deserialize", ImportType.LOCAL)
445
+ return file_import
446
+
447
+ def get_response_from_status(self, status_code: Optional[Union[str, int]]) -> ResponseType:
448
+ try:
449
+ return next(r for r in self.responses if status_code in r.status_codes)
450
+ except StopIteration as exc:
451
+ raise ValueError(f"Incorrect status code {status_code}, operation {self.name}") from exc
452
+
453
+ @property
454
+ def success_status_codes(self) -> Sequence[Union[str, int]]:
455
+ """The list of all successfull status code."""
456
+ return sorted([code for response in self.responses for code in response.status_codes])
457
+
458
+ @property
459
+ def filename(self) -> str:
460
+ basename = self.group_name
461
+ if basename == "":
462
+ # in a mixin
463
+ basename = self.code_model.clients[0].legacy_filename
464
+
465
+ if basename == "operations" or self.code_model.options["combine_operation_files"]:
466
+ return "_operations"
467
+ return f"_{basename}_operations"
468
+
469
+ @property
470
+ def has_stream_response(self) -> bool:
471
+ return any(r.is_stream_response for r in self.responses)
472
+
473
+ @classmethod
474
+ def get_request_builder(cls, yaml_data: Dict[str, Any], client: "Client"):
475
+ return client.lookup_request_builder(id(yaml_data))
476
+
477
+ @classmethod
478
+ def from_yaml(
479
+ cls,
480
+ yaml_data: Dict[str, Any],
481
+ code_model: "CodeModel",
482
+ client: "Client",
483
+ ):
484
+ name = yaml_data["name"]
485
+ request_builder = cls.get_request_builder(yaml_data, client)
486
+ responses = [cast(ResponseType, get_response(r, code_model)) for r in yaml_data["responses"]]
487
+ exceptions = [Response.from_yaml(e, code_model) for e in yaml_data["exceptions"]]
488
+ parameter_list = ParameterList.from_yaml(yaml_data, code_model)
489
+ overloads = [cls.from_yaml(overload, code_model, client) for overload in yaml_data.get("overloads", [])]
490
+
491
+ return cls(
492
+ yaml_data=yaml_data,
493
+ code_model=code_model,
494
+ client=client,
495
+ request_builder=request_builder,
496
+ name=name,
497
+ parameters=parameter_list,
498
+ overloads=overloads,
499
+ responses=responses,
500
+ exceptions=exceptions,
501
+ )
502
+
503
+
504
+ class Operation(OperationBase[Response]):
505
+ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
506
+ file_import = super().imports(async_mode, **kwargs)
507
+ if self.abstract:
508
+ return file_import
509
+ if async_mode and self.code_model.options["tracing"] and self.want_tracing:
510
+ file_import.add_submodule_import(
511
+ "azure.core.tracing.decorator_async",
512
+ "distributed_trace_async",
513
+ ImportType.SDKCORE,
514
+ )
515
+ if self.has_response_body and not self.has_optional_return_type and not self.code_model.options["models_mode"]:
516
+ file_import.add_submodule_import("typing", "cast", ImportType.STDLIB)
517
+
518
+ return file_import
519
+
520
+
521
+ def get_operation(yaml_data: Dict[str, Any], code_model: "CodeModel", client: "Client") -> "OperationType":
522
+ if yaml_data["discriminator"] == "lropaging":
523
+ from .lro_paging_operation import LROPagingOperation as OperationCls
524
+ elif yaml_data["discriminator"] == "lro":
525
+ from .lro_operation import LROOperation as OperationCls # type: ignore
526
+ elif yaml_data["discriminator"] == "paging":
527
+ from .paging_operation import PagingOperation as OperationCls # type: ignore
528
+ else:
529
+ from . import Operation as OperationCls # type: ignore
530
+ return OperationCls.from_yaml(yaml_data, code_model, client)