@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,184 @@
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 typing import Dict, List, Any, TYPE_CHECKING
7
+
8
+ from .utils import OrderedSet
9
+
10
+ from .base import BaseModel
11
+ from .operation import get_operation
12
+ from .imports import FileImport, ImportType, TypingSection
13
+ from .utils import add_to_pylint_disable
14
+ from .lro_operation import LROOperation
15
+ from .lro_paging_operation import LROPagingOperation
16
+ from ...utils import NAME_LENGTH_LIMIT
17
+
18
+ if TYPE_CHECKING:
19
+ from .code_model import CodeModel
20
+ from .client import Client
21
+ from . import OperationType
22
+
23
+
24
+ class OperationGroup(BaseModel):
25
+ """Represent an operation group."""
26
+
27
+ def __init__(
28
+ self,
29
+ yaml_data: Dict[str, Any],
30
+ code_model: "CodeModel",
31
+ client: "Client",
32
+ operations: List["OperationType"],
33
+ api_versions: List[str],
34
+ ) -> None:
35
+ super().__init__(yaml_data, code_model)
36
+ self.client = client
37
+ self.class_name: str = yaml_data["className"]
38
+ self.identify_name: str = yaml_data["identifyName"]
39
+ self.property_name: str = yaml_data["propertyName"]
40
+ self.operations = operations
41
+ self.api_versions = api_versions
42
+ self.operation_groups: List[OperationGroup] = []
43
+ if self.code_model.options["show_operations"]:
44
+ self.operation_groups = [
45
+ OperationGroup.from_yaml(op_group, code_model, client)
46
+ for op_group in self.yaml_data.get("operationGroups", [])
47
+ ]
48
+ self.link_lro_initial_operations()
49
+
50
+ @property
51
+ def has_abstract_operations(self) -> bool:
52
+ return any(o for o in self.operations if o.abstract) or any(
53
+ operation_group.has_abstract_operations for operation_group in self.operation_groups
54
+ )
55
+
56
+ @property
57
+ def has_non_abstract_operations(self) -> bool:
58
+ return any(o for o in self.operations if not o.abstract) or any(
59
+ operation_group.has_non_abstract_operations for operation_group in self.operation_groups
60
+ )
61
+
62
+ @property
63
+ def base_class(self) -> str:
64
+ base_classes: List[str] = []
65
+ if self.is_mixin:
66
+ base_classes.append(f"{self.client.name}MixinABC")
67
+ return ", ".join(base_classes)
68
+
69
+ def imports_for_multiapi(self, async_mode: bool) -> FileImport:
70
+ file_import = FileImport(self.code_model)
71
+ relative_path = ".." if async_mode else "."
72
+ for operation in self.operations:
73
+ file_import.merge(operation.imports_for_multiapi(async_mode, relative_path=relative_path))
74
+ if (self.code_model.model_types or self.code_model.enums) and self.code_model.options[
75
+ "models_mode"
76
+ ] == "msrest":
77
+ file_import.add_submodule_import(relative_path, "models", ImportType.LOCAL, alias="_models")
78
+ return file_import
79
+
80
+ def pylint_disable(self) -> str:
81
+ retval: str = ""
82
+ if self.has_abstract_operations:
83
+ retval = add_to_pylint_disable(retval, "abstract-class-instantiated")
84
+ if len(self.operations) > 20:
85
+ retval = add_to_pylint_disable(retval, "too-many-public-methods")
86
+ if len(self.class_name) > NAME_LENGTH_LIMIT:
87
+ retval = add_to_pylint_disable(retval, "name-too-long")
88
+ if len(self.operation_groups) > 6:
89
+ retval = add_to_pylint_disable(retval, "too-many-instance-attributes")
90
+ return retval
91
+
92
+ @property
93
+ def need_validation(self) -> bool:
94
+ """Whether any of its operations need validation"""
95
+ return any(o for o in self.operations if o.need_validation)
96
+
97
+ def imports(self, async_mode: bool) -> FileImport:
98
+ file_import = FileImport(self.code_model)
99
+
100
+ relative_path = ("..." if async_mode else "..") + ("." if self.client.is_subclient else "")
101
+ for operation in self.operations:
102
+ file_import.merge(operation.imports(async_mode, relative_path=relative_path))
103
+ if not self.code_model.options["combine_operation_files"]:
104
+ for og in self.operation_groups:
105
+ file_import.add_submodule_import(
106
+ ".",
107
+ og.class_name,
108
+ ImportType.LOCAL,
109
+ )
110
+ # for multiapi
111
+ if (
112
+ (self.code_model.public_model_types)
113
+ and self.code_model.options["models_mode"] == "msrest"
114
+ and not self.is_mixin
115
+ ):
116
+ file_import.add_submodule_import(relative_path, "models", ImportType.LOCAL, alias="_models")
117
+ if self.is_mixin:
118
+ file_import.add_submodule_import(".._vendor", f"{self.client.name}MixinABC", ImportType.LOCAL)
119
+ if self.has_abstract_operations:
120
+ file_import.add_submodule_import(".._vendor", "raise_if_not_implemented", ImportType.LOCAL)
121
+ if all(o.abstract for o in self.operations):
122
+ return file_import
123
+ file_import.add_submodule_import("typing", "TypeVar", ImportType.STDLIB, TypingSection.CONDITIONAL)
124
+ file_import.define_mypy_type("T", "TypeVar('T')")
125
+ type_value = "Optional[Callable[[PipelineResponse[HttpRequest, {}HttpResponse], T, Dict[str, Any]], Any]]"
126
+ file_import.define_mypy_type("ClsType", type_value.format(""), type_value.format("Async"))
127
+ return file_import
128
+
129
+ @property
130
+ def filename(self) -> str:
131
+ return self.operations[0].filename
132
+
133
+ @property
134
+ def is_mixin(self) -> bool:
135
+ """The operation group with no name is the direct client methods."""
136
+ return self.identify_name == ""
137
+
138
+ def link_lro_initial_operations(self) -> None:
139
+ """Link each LRO operation to its initial operation"""
140
+ for operation_group in self.operation_groups:
141
+ for operation in operation_group.operations:
142
+ if isinstance(operation, (LROOperation, LROPagingOperation)):
143
+ operation.initial_operation = self.lookup_operation(id(operation.yaml_data["initialOperation"]))
144
+
145
+ def lookup_operation(self, operation_id: int) -> "OperationType":
146
+ try:
147
+ return next(o for og in self.operation_groups for o in og.operations if id(o.yaml_data) == operation_id)
148
+ except StopIteration as exc:
149
+ raise KeyError(f"No operation with id {operation_id} found.") from exc
150
+
151
+ @property
152
+ def lro_operations(self) -> List["OperationType"]:
153
+ return [operation for operation in self.operations if operation.operation_type in ("lro", "lropaging")] + [
154
+ operation for operation_group in self.operation_groups for operation in operation_group.lro_operations
155
+ ]
156
+
157
+ @property
158
+ def has_operations(self) -> bool:
159
+ return any(operation_group.has_operations for operation_group in self.operation_groups) or bool(self.operations)
160
+
161
+ @property
162
+ def has_form_data_body(self) -> bool:
163
+ operations = self.operations + [o for og in self.operation_groups for o in og.operations]
164
+ return any(operation.has_form_data_body for operation in operations)
165
+
166
+ @classmethod
167
+ def from_yaml(
168
+ cls,
169
+ yaml_data: Dict[str, Any],
170
+ code_model: "CodeModel",
171
+ client: "Client",
172
+ ) -> "OperationGroup":
173
+ operations = [get_operation(o, code_model, client) for o in yaml_data["operations"]]
174
+ api_versions: OrderedSet[str] = {}
175
+ for operation in operations:
176
+ for api_version in operation.api_versions:
177
+ api_versions[api_version] = None
178
+ return cls(
179
+ yaml_data=yaml_data,
180
+ code_model=code_model,
181
+ client=client,
182
+ operations=operations,
183
+ api_versions=list(api_versions.keys()),
184
+ )
@@ -0,0 +1,155 @@
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 typing import Dict, List, Any, Optional, Union, TYPE_CHECKING, cast, TypeVar
7
+
8
+ from .operation import Operation, OperationBase
9
+ from .response import PagingResponse, LROPagingResponse, Response
10
+ from .request_builder import (
11
+ OverloadedRequestBuilder,
12
+ RequestBuilder,
13
+ get_request_builder,
14
+ )
15
+ from .imports import ImportType, FileImport, TypingSection
16
+ from .parameter_list import ParameterList
17
+ from .model_type import ModelType
18
+ from .list_type import ListType
19
+
20
+ if TYPE_CHECKING:
21
+ from .code_model import CodeModel
22
+ from .client import Client
23
+
24
+ PagingResponseType = TypeVar("PagingResponseType", bound=Union[PagingResponse, LROPagingResponse])
25
+
26
+
27
+ class PagingOperationBase(OperationBase[PagingResponseType]):
28
+ def __init__(
29
+ self,
30
+ yaml_data: Dict[str, Any],
31
+ code_model: "CodeModel",
32
+ client: "Client",
33
+ name: str,
34
+ request_builder: RequestBuilder,
35
+ parameters: ParameterList,
36
+ responses: List[PagingResponseType],
37
+ exceptions: List[Response],
38
+ *,
39
+ overloads: Optional[List[Operation]] = None,
40
+ override_success_response_to_200: bool = False,
41
+ ) -> None:
42
+ super().__init__(
43
+ code_model=code_model,
44
+ client=client,
45
+ yaml_data=yaml_data,
46
+ name=name,
47
+ request_builder=request_builder,
48
+ parameters=parameters,
49
+ responses=responses,
50
+ exceptions=exceptions,
51
+ overloads=overloads,
52
+ )
53
+ self.next_request_builder: Optional[Union[RequestBuilder, OverloadedRequestBuilder]] = (
54
+ get_request_builder(self.yaml_data["nextOperation"], code_model, client)
55
+ if self.yaml_data.get("nextOperation")
56
+ else None
57
+ )
58
+ self.override_success_response_to_200 = override_success_response_to_200
59
+ self.pager_sync: str = yaml_data.get("pagerSync") or f"{self.code_model.core_library}.paging.ItemPaged"
60
+ self.pager_async: str = yaml_data.get("pagerAsync") or f"{self.code_model.core_library}.paging.AsyncItemPaged"
61
+
62
+ def _get_attr_name(self, wire_name: str) -> str:
63
+ response_type = self.responses[0].type
64
+ if not response_type:
65
+ raise ValueError(f"Can't find a matching property in response for {wire_name}")
66
+ if response_type.type == "list":
67
+ response_type = cast(ListType, response_type).element_type
68
+ try:
69
+ return next(p.client_name for p in cast(ModelType, response_type).properties if p.wire_name == wire_name)
70
+ except StopIteration as exc:
71
+ raise ValueError(f"Can't find a matching property in response for {wire_name}") from exc
72
+
73
+ def get_pager(self, async_mode: bool) -> str:
74
+ return self.responses[0].get_pager(async_mode)
75
+
76
+ @property
77
+ def continuation_token_name(self) -> Optional[str]:
78
+ wire_name = self.yaml_data.get("continuationTokenName")
79
+ if not wire_name:
80
+ # That's an ok scenario, it just means no next page possible
81
+ return None
82
+ if self.code_model.options["models_mode"] == "msrest":
83
+ return self._get_attr_name(wire_name)
84
+ return wire_name
85
+
86
+ @property
87
+ def item_name(self) -> str:
88
+ wire_name = self.yaml_data["itemName"]
89
+ if self.code_model.options["models_mode"] == "msrest":
90
+ # we don't use the paging model for dpg
91
+ return self._get_attr_name(wire_name)
92
+ return wire_name
93
+
94
+ @property
95
+ def item_type(self) -> ModelType:
96
+ try:
97
+ item_type_yaml = self.yaml_data["itemType"]
98
+ except KeyError as e:
99
+ raise ValueError("Only call this for DPG paging model deserialization") from e
100
+ return cast(ModelType, self.code_model.types_map[id(item_type_yaml)])
101
+
102
+ @property
103
+ def operation_type(self) -> str:
104
+ return "paging"
105
+
106
+ def cls_type_annotation(self, *, async_mode: bool) -> str:
107
+ return f"ClsType[{Response.type_annotation(self.responses[0], async_mode=async_mode)}]"
108
+
109
+ def _imports_shared(self, async_mode: bool, **kwargs: Any) -> FileImport:
110
+ file_import = super()._imports_shared(async_mode, **kwargs)
111
+ if async_mode:
112
+ file_import.add_submodule_import("typing", "AsyncIterable", ImportType.STDLIB, TypingSection.CONDITIONAL)
113
+ else:
114
+ file_import.add_submodule_import("typing", "Iterable", ImportType.STDLIB, TypingSection.CONDITIONAL)
115
+ if (
116
+ self.next_request_builder
117
+ and self.code_model.options["builders_visibility"] == "embedded"
118
+ and not async_mode
119
+ ):
120
+ file_import.merge(self.next_request_builder.imports())
121
+ return file_import
122
+
123
+ @property
124
+ def has_optional_return_type(self) -> bool:
125
+ return False
126
+
127
+ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
128
+ if self.abstract:
129
+ return FileImport(self.code_model)
130
+ file_import = self._imports_shared(async_mode, **kwargs)
131
+ file_import.merge(super().imports(async_mode, **kwargs))
132
+ if self.code_model.options["tracing"] and self.want_tracing:
133
+ file_import.add_submodule_import(
134
+ "azure.core.tracing.decorator",
135
+ "distributed_trace",
136
+ ImportType.SDKCORE,
137
+ )
138
+ if self.next_request_builder:
139
+ file_import.merge(self.get_request_builder_import(self.next_request_builder, async_mode))
140
+ elif any(p.is_api_version for p in self.client.parameters):
141
+ file_import.add_import("urllib.parse", ImportType.STDLIB)
142
+ file_import.add_submodule_import(
143
+ "utils",
144
+ "case_insensitive_dict",
145
+ ImportType.SDKCORE,
146
+ )
147
+ if self.code_model.options["models_mode"] == "dpg":
148
+ relative_path = "..." if async_mode else ".."
149
+ file_import.merge(self.item_type.imports(**kwargs))
150
+ if self.default_error_deserialization or any(r.type for r in self.responses):
151
+ file_import.add_submodule_import(f"{relative_path}_model_base", "_deserialize", ImportType.LOCAL)
152
+ return file_import
153
+
154
+
155
+ class PagingOperation(PagingOperationBase[PagingResponse]): ...