@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,40 @@
1
+ #!/usr/bin/env python
2
+
3
+ # --------------------------------------------------------------------------------------------
4
+ # Copyright (c) Microsoft Corporation. All rights reserved.
5
+ # Licensed under the MIT License. See License.txt in the project root for license information.
6
+ # --------------------------------------------------------------------------------------------
7
+
8
+ # This script is used to execute apiview generation within a tox environment. Depending on which package is being executed against,
9
+ # a failure may be suppressed.
10
+
11
+ from subprocess import check_call, CalledProcessError
12
+ import logging
13
+ from util import run_check
14
+
15
+ logging.getLogger().setLevel(logging.INFO)
16
+
17
+
18
+ def _single_dir_apiview(mod):
19
+ loop = 0
20
+ while True:
21
+ try:
22
+ check_call(
23
+ [
24
+ "apistubgen",
25
+ "--pkg-path",
26
+ str(mod.absolute()),
27
+ ]
28
+ )
29
+ except CalledProcessError as e:
30
+ if loop >= 2: # retry for maximum 3 times because sometimes the apistubgen has transient failure.
31
+ logging.error("{} exited with apiview generation error {}".format(mod.stem, e.returncode))
32
+ return False
33
+ else:
34
+ loop += 1
35
+ continue
36
+ return True
37
+
38
+
39
+ if __name__ == "__main__":
40
+ run_check("apiview", _single_dir_apiview, "APIView")
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env python
2
+
3
+ # --------------------------------------------------------------------------------------------
4
+ # Copyright (c) Microsoft Corporation. All rights reserved.
5
+ # Licensed under the MIT License. See License.txt in the project root for license information.
6
+ # --------------------------------------------------------------------------------------------
7
+
8
+ # This script is used to execute mypy within a tox environment. Depending on which package is being executed against,
9
+ # a failure may be suppressed.
10
+
11
+ from subprocess import check_call, CalledProcessError
12
+ import os
13
+ import logging
14
+ import sys
15
+ from util import run_check
16
+
17
+ logging.getLogger().setLevel(logging.INFO)
18
+
19
+
20
+ def get_config_file_location():
21
+ mypy_ini_path = os.path.join(os.getcwd(), "../../eng/scripts/ci/mypy.ini")
22
+ if os.path.exists(mypy_ini_path):
23
+ return mypy_ini_path
24
+ else:
25
+ return os.path.join(os.getcwd(), "../../../eng/scripts/ci/mypy.ini")
26
+
27
+
28
+ def _single_dir_mypy(mod):
29
+ inner_class = next(d for d in mod.iterdir() if d.is_dir() and not str(d).endswith("egg-info"))
30
+ try:
31
+ check_call(
32
+ [
33
+ sys.executable,
34
+ "-m",
35
+ "mypy",
36
+ "--config-file",
37
+ get_config_file_location(),
38
+ "--ignore-missing",
39
+ str(inner_class.absolute()),
40
+ ]
41
+ )
42
+ return True
43
+ except CalledProcessError as e:
44
+ logging.error("{} exited with mypy error {}".format(inner_class.stem, e.returncode))
45
+ return False
46
+
47
+
48
+ if __name__ == "__main__":
49
+ run_check("mypy", _single_dir_mypy, "MyPy")
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env python
2
+
3
+ # --------------------------------------------------------------------------------------------
4
+ # Copyright (c) Microsoft Corporation. All rights reserved.
5
+ # Licensed under the MIT License. See License.txt in the project root for license information.
6
+ # --------------------------------------------------------------------------------------------
7
+
8
+ # This script is used to execute pylint within a tox environment. Depending on which package is being executed against,
9
+ # a failure may be suppressed.
10
+
11
+ from subprocess import check_call, CalledProcessError
12
+ import os
13
+ import logging
14
+ import sys
15
+ from util import run_check
16
+
17
+ logging.getLogger().setLevel(logging.INFO)
18
+
19
+
20
+ def get_rfc_file_location():
21
+ rfc_file_location = os.path.join(os.getcwd(), "../../../eng/scripts/ci/pylintrc")
22
+ if os.path.exists(rfc_file_location):
23
+ return rfc_file_location
24
+ else:
25
+ return os.path.join(os.getcwd(), "../../../../eng/scripts/ci/pylintrc")
26
+
27
+
28
+ def _single_dir_pylint(mod):
29
+ inner_class = next(d for d in mod.iterdir() if d.is_dir() and not str(d).endswith("egg-info"))
30
+ try:
31
+ check_call(
32
+ [
33
+ sys.executable,
34
+ "-m",
35
+ "pylint",
36
+ "--rcfile={}".format(get_rfc_file_location()),
37
+ "--evaluation=(max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention + info)/ statement) * 10)))",
38
+ "--load-plugins=pylint_guidelines_checker",
39
+ "--output-format=parseable",
40
+ str(inner_class.absolute()),
41
+ ]
42
+ )
43
+ return True
44
+ except CalledProcessError as e:
45
+ logging.error("{} exited with linting error {}".format(str(inner_class.absolute()), e.returncode))
46
+ return False
47
+
48
+
49
+ if __name__ == "__main__":
50
+ run_check("pylint", _single_dir_pylint, "Pylint")
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env python
2
+
3
+ # --------------------------------------------------------------------------------------------
4
+ # Copyright (c) Microsoft Corporation. All rights reserved.
5
+ # Licensed under the MIT License. See License.txt in the project root for license information.
6
+ # --------------------------------------------------------------------------------------------
7
+
8
+ # This script is used to execute pyright within a tox environment. Depending on which package is being executed against,
9
+ # a failure may be suppressed.
10
+
11
+ import os
12
+ from subprocess import check_output, CalledProcessError
13
+ import logging
14
+ import sys
15
+ import time
16
+ from util import run_check
17
+
18
+ logging.getLogger().setLevel(logging.INFO)
19
+
20
+
21
+ def get_pyright_config_file_location():
22
+ pyright_config = os.path.join(os.getcwd(), "../../eng/scripts/ci/pyrightconfig.json")
23
+ if os.path.exists(pyright_config):
24
+ return pyright_config
25
+ else:
26
+ return os.path.join(os.getcwd(), "../../../eng/scripts/ci/pyrightconfig.json")
27
+
28
+
29
+ def _single_dir_pyright(mod):
30
+ inner_class = next(d for d in mod.iterdir() if d.is_dir() and not str(d).endswith("egg-info"))
31
+ retries = 3
32
+ while retries:
33
+ try:
34
+ check_output(
35
+ [
36
+ sys.executable,
37
+ "-m",
38
+ "pyright",
39
+ "-p",
40
+ get_pyright_config_file_location(),
41
+ str(inner_class.absolute()),
42
+ ],
43
+ text=True,
44
+ )
45
+ return True
46
+ except CalledProcessError as e:
47
+ logging.exception("{} exited with pyright error {}".format(inner_class.stem, e.returncode))
48
+ logging.error(f"PyRight stdout:\n{e.stdout}\n===========")
49
+ logging.error(f"PyRight stderr:\n{e.stderr}\n===========")
50
+ # PyRight has shown to randomly failed with a 217, retry the same folder 3 times should help
51
+ retries -= 1
52
+ time.sleep(5)
53
+
54
+ return False
55
+
56
+
57
+ if __name__ == "__main__":
58
+ run_check("pyright", _single_dir_pyright, "PyRight")
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env python
2
+
3
+ # --------------------------------------------------------------------------------------------
4
+ # Copyright (c) Microsoft Corporation. All rights reserved.
5
+ # Licensed under the MIT License. See License.txt in the project root for license information.
6
+ # --------------------------------------------------------------------------------------------
7
+ import os
8
+ import logging
9
+ from pathlib import Path
10
+ import argparse
11
+ from multiprocessing import Pool
12
+
13
+ logging.getLogger().setLevel(logging.INFO)
14
+
15
+ ROOT_FOLDER = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "..", "..", "..", "generator"))
16
+
17
+ IGNORE_FOLDER = []
18
+
19
+
20
+ def run_check(name, call_back, log_info):
21
+ parser = argparse.ArgumentParser(
22
+ description=f"Run {name} against target folder. Add a local custom plugin to the path prior to execution. "
23
+ )
24
+ parser.add_argument(
25
+ "-t",
26
+ "--test-folder",
27
+ dest="test_folder",
28
+ help="The test folder we're in. Can be 'azure', 'multiapi', or 'vanilla'",
29
+ required=True,
30
+ )
31
+ parser.add_argument(
32
+ "-g",
33
+ "--generator",
34
+ dest="generator",
35
+ help="The generator we're using. Can be 'legacy', 'version-tolerant'.",
36
+ required=False,
37
+ )
38
+ parser.add_argument(
39
+ "-f",
40
+ "--file-name",
41
+ dest="file_name",
42
+ help="The specific file name if you only want to run one file. Optional.",
43
+ required=False,
44
+ )
45
+ parser.add_argument(
46
+ "-s",
47
+ "--subfolder",
48
+ dest="subfolder",
49
+ help="The specific sub folder to validate, default to Expected/AcceptanceTests. Optional.",
50
+ required=False,
51
+ default="Expected/AcceptanceTests",
52
+ )
53
+
54
+ args = parser.parse_args()
55
+
56
+ pkg_dir = Path(ROOT_FOLDER) / Path("test") / Path(args.test_folder)
57
+ if args.generator:
58
+ pkg_dir /= Path(args.generator)
59
+ if args.subfolder:
60
+ pkg_dir /= Path(args.subfolder)
61
+ dirs = [d for d in pkg_dir.iterdir() if d.is_dir() and not d.stem.startswith("_") and d.stem not in IGNORE_FOLDER]
62
+ if args.file_name:
63
+ dirs = [d for d in dirs if args.file_name.lower() in d.stem.lower()]
64
+ if len(dirs) > 1:
65
+ with Pool() as pool:
66
+ result = pool.map(call_back, dirs)
67
+ response = all(result)
68
+ else:
69
+ response = call_back(dirs[0])
70
+ if not response:
71
+ logging.error("%s fails", log_info)
72
+ exit(0)
@@ -0,0 +1,48 @@
1
+ /* eslint-disable no-console */
2
+ import chalk from "chalk";
3
+ import { exec } from "child_process";
4
+ import { existsSync } from "fs";
5
+ import { dirname, join, resolve } from "path";
6
+ import process from "process";
7
+ import { fileURLToPath } from "url";
8
+ import { parseArgs } from "util";
9
+
10
+ const argv = parseArgs({
11
+ args: process.argv.slice(2),
12
+ options: {
13
+ pythonPath: { type: "string" },
14
+ },
15
+ });
16
+
17
+ // execute the command
18
+ export function executeCommand(command: string, prettyName: string) {
19
+ exec(command, (error, stdout, stderr) => {
20
+ if (error) {
21
+ console.error(chalk.red(`Error executing ${command}(stdout): ${stdout}`));
22
+ console.error(chalk.red(`Error executing ${command}{stderr}: ${stderr}`));
23
+ process.exit(1);
24
+ }
25
+ if (stderr) {
26
+ // Process stderr output
27
+ console.log(chalk.yellow(`${command}:\n${stderr}`));
28
+ return;
29
+ }
30
+ console.log(chalk.green(`${prettyName} passed`));
31
+ });
32
+ }
33
+
34
+ // Function to run a command and log the output
35
+ export function runCommand(command: string, prettyName: string) {
36
+ let pythonPath = argv.values.pythonPath
37
+ ? resolve(argv.values.pythonPath)
38
+ : join(dirname(fileURLToPath(import.meta.url)), "..", "..", "..", "venv/");
39
+ if (existsSync(join(pythonPath, "bin"))) {
40
+ pythonPath = join(pythonPath, "bin", "python");
41
+ } else if (existsSync(join(pythonPath, "Scripts"))) {
42
+ pythonPath = join(pythonPath, "Scripts", "python");
43
+ } else {
44
+ throw new Error(pythonPath);
45
+ }
46
+ command = `${pythonPath} -m ${command}`;
47
+ executeCommand(command, prettyName);
48
+ }
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env python
2
+
3
+ # -------------------------------------------------------------------------
4
+ # Copyright (c) Microsoft Corporation. All rights reserved.
5
+ # Licensed under the MIT License. See License.txt in the project root for
6
+ # license information.
7
+ # --------------------------------------------------------------------------
8
+ import sys
9
+
10
+ if not sys.version_info >= (3, 8, 0):
11
+ raise Exception("Autorest for Python extension requires Python 3.8 at least")
12
+
13
+ try:
14
+ import pip
15
+ except ImportError:
16
+ raise Exception("Your Python installation doesn't have pip available")
17
+
18
+ try:
19
+ import venv
20
+ except ImportError:
21
+ raise Exception("Your Python installation doesn't have venv available")
22
+
23
+
24
+ # Now we have pip and Py >= 3.8, go to work
25
+
26
+ from pathlib import Path
27
+
28
+ from venvtools import ExtendedEnvBuilder, python_run
29
+
30
+ _ROOT_DIR = Path(__file__).parent.parent.parent.parent
31
+
32
+
33
+ def main():
34
+ venv_path = _ROOT_DIR / "venv"
35
+ if venv_path.exists():
36
+ env_builder = venv.EnvBuilder(with_pip=True)
37
+ venv_context = env_builder.ensure_directories(venv_path)
38
+ else:
39
+ env_builder = ExtendedEnvBuilder(with_pip=True, upgrade_deps=True)
40
+ env_builder.create(venv_path)
41
+ venv_context = env_builder.context
42
+
43
+ python_run(venv_context, "pip", ["install", "-U", "pip"])
44
+ python_run(
45
+ venv_context,
46
+ "pip",
47
+ ["install", "-r", f"{_ROOT_DIR}/generator/requirements.txt"],
48
+ )
49
+ python_run(venv_context, "pip", ["install", "-e", f"{_ROOT_DIR}/generator"])
50
+
51
+
52
+ if __name__ == "__main__":
53
+ main()
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env python
2
+
3
+ # -------------------------------------------------------------------------
4
+ # Copyright (c) Microsoft Corporation. All rights reserved.
5
+ # Licensed under the MIT License. See License.txt in the project root for
6
+ # license information.
7
+ # --------------------------------------------------------------------------
8
+ import sys
9
+ import os
10
+ import argparse
11
+
12
+ if not sys.version_info >= (3, 8, 0):
13
+ raise Exception("Autorest for Python extension requires Python 3.8 at least")
14
+
15
+ from pathlib import Path
16
+ import venv
17
+
18
+ from venvtools import python_run
19
+
20
+ _ROOT_DIR = Path(__file__).parent.parent.parent.parent
21
+
22
+
23
+ def main():
24
+ venv_path = _ROOT_DIR / "venv"
25
+ venv_preexists = venv_path.exists()
26
+
27
+ assert venv_preexists # Otherwise install was not done
28
+
29
+ env_builder = venv.EnvBuilder(with_pip=True)
30
+ venv_context = env_builder.ensure_directories(venv_path)
31
+ try:
32
+ python_run(
33
+ venv_context,
34
+ "pip",
35
+ ["install", "-r", f"{_ROOT_DIR}/generator/dev_requirements.txt"],
36
+ )
37
+ except FileNotFoundError as e:
38
+ raise ValueError(e.filename)
39
+
40
+
41
+ if __name__ == "__main__":
42
+ main()
@@ -0,0 +1,25 @@
1
+ // This script wraps logic in @azure-tools/extension to resolve
2
+ // the path to Python 3 so that a Python script file can be run
3
+ // from an npm script in package.json. It uses the same Python 3
4
+ // path resolution algorithm as AutoRest so that the behavior
5
+ // is fully consistent (and also supports AUTOREST_PYTHON_EXE).
6
+ //
7
+ // Invoke it like so: "tsx run-python3.ts script.py"
8
+
9
+ import cp from "child_process";
10
+ import { patchPythonPath } from "./system-requirements.js";
11
+
12
+ async function runPython3(...args: string[]) {
13
+ const command = await patchPythonPath(["python", ...args], {
14
+ version: ">=3.8",
15
+ environmentVariable: "AUTOREST_PYTHON_EXE",
16
+ });
17
+ cp.execSync(command.join(" "), {
18
+ stdio: [0, 1, 2],
19
+ });
20
+ }
21
+
22
+ runPython3(...process.argv.slice(2)).catch((err) => {
23
+ console.error(err.toString()); // eslint-disable-line no-console
24
+ process.exit(1);
25
+ });
@@ -0,0 +1,42 @@
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
+ import sys
7
+ import venv
8
+ import logging
9
+ from pathlib import Path
10
+ from pygen import m2r, preprocess, codegen, black
11
+ from pygen.utils import parse_args
12
+
13
+ _ROOT_DIR = Path(__file__).parent.parent.parent.parent
14
+
15
+ _LOGGER = logging.getLogger(__name__)
16
+
17
+ if __name__ == "__main__":
18
+ venv_path = _ROOT_DIR / "venv"
19
+ venv_preexists = venv_path.exists()
20
+
21
+ assert venv_preexists # Otherwise install was not done
22
+
23
+ env_builder = venv.EnvBuilder(with_pip=True)
24
+ venv_context = env_builder.ensure_directories(venv_path)
25
+
26
+ if "--debug" in sys.argv or "--debug=true" in sys.argv:
27
+ try:
28
+ import debugpy # pylint: disable=import-outside-toplevel
29
+ except ImportError:
30
+ raise SystemExit("Please pip install ptvsd in order to use VSCode debugging")
31
+
32
+ # 5678 is the default attach port in the VS Code debug configurations
33
+ debugpy.listen(("localhost", 5678))
34
+ debugpy.wait_for_client()
35
+ breakpoint() # pylint: disable=undefined-variable
36
+
37
+ # run m2r
38
+ args, unknown_args = parse_args()
39
+ m2r.M2R(output_folder=args.output_folder, cadl_file=args.cadl_file, **unknown_args).process()
40
+ preprocess.PreProcessPlugin(output_folder=args.output_folder, cadl_file=args.cadl_file, **unknown_args).process()
41
+ codegen.CodeGenerator(output_folder=args.output_folder, cadl_file=args.cadl_file, **unknown_args).process()
42
+ black.BlackScriptPlugin(output_folder=args.output_folder, **unknown_args).process()