@autorest/python 6.14.2 → 6.15.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 (132) hide show
  1. package/autorest/__init__.py +2 -93
  2. package/autorest/black.py +13 -0
  3. package/autorest/codegen.py +117 -0
  4. package/autorest/m2r.py +16 -0
  5. package/autorest/m4reformatter/__init__.py +1 -1
  6. package/autorest/multiapi/__init__.py +2 -1
  7. package/autorest/multiapi/serializers/__init__.py +5 -3
  8. package/autorest/multiclient/__init__.py +2 -1
  9. package/autorest/postprocess.py +14 -0
  10. package/autorest/preprocess.py +20 -0
  11. package/generator/LICENSE +21 -0
  12. package/generator/README.md +1 -0
  13. package/generator/dev_requirements.txt +5 -0
  14. package/generator/pygen/__init__.py +107 -0
  15. package/generator/pygen/_version.py +7 -0
  16. package/{autorest/black/__init__.py → generator/pygen/black.py} +2 -7
  17. package/{autorest → generator/pygen}/codegen/__init__.py +3 -83
  18. package/{autorest → generator/pygen}/codegen/models/combined_type.py +1 -1
  19. package/{autorest → generator/pygen}/codegen/models/model_type.py +1 -1
  20. package/{autorest → generator/pygen}/codegen/models/operation_group.py +1 -1
  21. package/{autorest → generator/pygen}/codegen/serializers/__init__.py +12 -30
  22. package/{autorest → generator/pygen}/codegen/serializers/builder_serializer.py +1 -1
  23. package/{autorest → generator/pygen}/codegen/serializers/client_serializer.py +1 -1
  24. package/{autorest → generator/pygen}/codegen/serializers/operations_init_serializer.py +1 -1
  25. package/{autorest → generator/pygen}/codegen/serializers/sample_serializer.py +2 -2
  26. package/{autorest → generator/pygen}/codegen/serializers/test_serializer.py +48 -24
  27. package/{autorest → generator/pygen}/codegen/templates/conftest.py.jinja2 +1 -1
  28. package/{autorest → generator/pygen}/codegen/templates/serialization.py.jinja2 +2 -0
  29. package/generator/pygen/codegen/templates/test.py.jinja2 +50 -0
  30. package/{autorest/m2r/__init__.py → generator/pygen/m2r.py} +5 -10
  31. package/{autorest → generator/pygen}/postprocess/__init__.py +1 -6
  32. package/{autorest → generator/pygen}/preprocess/__init__.py +3 -13
  33. package/{autorest → generator/pygen}/preprocess/python_mappings.py +1 -1
  34. package/generator/pygen.egg-info/PKG-INFO +25 -0
  35. package/generator/pygen.egg-info/SOURCES.txt +66 -0
  36. package/generator/pygen.egg-info/dependency_links.txt +1 -0
  37. package/generator/pygen.egg-info/requires.txt +4 -0
  38. package/generator/pygen.egg-info/top_level.txt +1 -0
  39. package/generator/requirements.txt +12 -0
  40. package/generator/setup.py +55 -0
  41. package/package.json +11 -12
  42. package/requirements.txt +1 -1
  43. package/scripts/__pycache__/venvtools.cpython-38.pyc +0 -0
  44. package/scripts/copy-generator.js +19 -0
  45. package/{install.py → scripts/install.py} +3 -5
  46. package/{prepare.py → scripts/prepare.py} +7 -4
  47. package/{start.py → scripts/start.py} +1 -1
  48. package/{venvtools.py → scripts/venvtools.py} +1 -1
  49. package/autorest/codegen/templates/test.py.jinja2 +0 -26
  50. package/run_cadl.py +0 -40
  51. /package/{autorest → generator/pygen}/codegen/_utils.py +0 -0
  52. /package/{autorest → generator/pygen}/codegen/models/__init__.py +0 -0
  53. /package/{autorest → generator/pygen}/codegen/models/base.py +0 -0
  54. /package/{autorest → generator/pygen}/codegen/models/base_builder.py +0 -0
  55. /package/{autorest → generator/pygen}/codegen/models/client.py +0 -0
  56. /package/{autorest → generator/pygen}/codegen/models/code_model.py +0 -0
  57. /package/{autorest → generator/pygen}/codegen/models/constant_type.py +0 -0
  58. /package/{autorest → generator/pygen}/codegen/models/credential_types.py +0 -0
  59. /package/{autorest → generator/pygen}/codegen/models/dictionary_type.py +0 -0
  60. /package/{autorest → generator/pygen}/codegen/models/enum_type.py +0 -0
  61. /package/{autorest → generator/pygen}/codegen/models/imports.py +0 -0
  62. /package/{autorest → generator/pygen}/codegen/models/list_type.py +0 -0
  63. /package/{autorest → generator/pygen}/codegen/models/lro_operation.py +0 -0
  64. /package/{autorest → generator/pygen}/codegen/models/lro_paging_operation.py +0 -0
  65. /package/{autorest → generator/pygen}/codegen/models/operation.py +0 -0
  66. /package/{autorest → generator/pygen}/codegen/models/paging_operation.py +0 -0
  67. /package/{autorest → generator/pygen}/codegen/models/parameter.py +0 -0
  68. /package/{autorest → generator/pygen}/codegen/models/parameter_list.py +0 -0
  69. /package/{autorest → generator/pygen}/codegen/models/primitive_types.py +0 -0
  70. /package/{autorest → generator/pygen}/codegen/models/property.py +0 -0
  71. /package/{autorest → generator/pygen}/codegen/models/request_builder.py +0 -0
  72. /package/{autorest → generator/pygen}/codegen/models/request_builder_parameter.py +0 -0
  73. /package/{autorest → generator/pygen}/codegen/models/response.py +0 -0
  74. /package/{autorest → generator/pygen}/codegen/models/utils.py +0 -0
  75. /package/{autorest → generator/pygen}/codegen/serializers/base_serializer.py +0 -0
  76. /package/{autorest → generator/pygen}/codegen/serializers/enum_serializer.py +0 -0
  77. /package/{autorest → generator/pygen}/codegen/serializers/general_serializer.py +0 -0
  78. /package/{autorest → generator/pygen}/codegen/serializers/import_serializer.py +0 -0
  79. /package/{autorest → generator/pygen}/codegen/serializers/metadata_serializer.py +0 -0
  80. /package/{autorest → generator/pygen}/codegen/serializers/model_init_serializer.py +0 -0
  81. /package/{autorest → generator/pygen}/codegen/serializers/model_serializer.py +0 -0
  82. /package/{autorest → generator/pygen}/codegen/serializers/operation_groups_serializer.py +0 -0
  83. /package/{autorest → generator/pygen}/codegen/serializers/parameter_serializer.py +0 -0
  84. /package/{autorest → generator/pygen}/codegen/serializers/patch_serializer.py +0 -0
  85. /package/{autorest → generator/pygen}/codegen/serializers/request_builders_serializer.py +0 -0
  86. /package/{autorest → generator/pygen}/codegen/serializers/types_serializer.py +0 -0
  87. /package/{autorest → generator/pygen}/codegen/serializers/utils.py +0 -0
  88. /package/{autorest → generator/pygen}/codegen/templates/client.py.jinja2 +0 -0
  89. /package/{autorest → generator/pygen}/codegen/templates/client_container.py.jinja2 +0 -0
  90. /package/{autorest → generator/pygen}/codegen/templates/config.py.jinja2 +0 -0
  91. /package/{autorest → generator/pygen}/codegen/templates/config_container.py.jinja2 +0 -0
  92. /package/{autorest → generator/pygen}/codegen/templates/enum.py.jinja2 +0 -0
  93. /package/{autorest → generator/pygen}/codegen/templates/enum_container.py.jinja2 +0 -0
  94. /package/{autorest → generator/pygen}/codegen/templates/init.py.jinja2 +0 -0
  95. /package/{autorest → generator/pygen}/codegen/templates/keywords.jinja2 +0 -0
  96. /package/{autorest → generator/pygen}/codegen/templates/lro_operation.py.jinja2 +0 -0
  97. /package/{autorest → generator/pygen}/codegen/templates/lro_paging_operation.py.jinja2 +0 -0
  98. /package/{autorest → generator/pygen}/codegen/templates/macros.jinja2 +0 -0
  99. /package/{autorest → generator/pygen}/codegen/templates/metadata.json.jinja2 +0 -0
  100. /package/{autorest → generator/pygen}/codegen/templates/model_base.py.jinja2 +0 -0
  101. /package/{autorest → generator/pygen}/codegen/templates/model_container.py.jinja2 +0 -0
  102. /package/{autorest → generator/pygen}/codegen/templates/model_dpg.py.jinja2 +0 -0
  103. /package/{autorest → generator/pygen}/codegen/templates/model_init.py.jinja2 +0 -0
  104. /package/{autorest → generator/pygen}/codegen/templates/model_msrest.py.jinja2 +0 -0
  105. /package/{autorest → generator/pygen}/codegen/templates/operation.py.jinja2 +0 -0
  106. /package/{autorest → generator/pygen}/codegen/templates/operation_group.py.jinja2 +0 -0
  107. /package/{autorest → generator/pygen}/codegen/templates/operation_groups_container.py.jinja2 +0 -0
  108. /package/{autorest → generator/pygen}/codegen/templates/operation_tools.jinja2 +0 -0
  109. /package/{autorest → generator/pygen}/codegen/templates/operations_folder_init.py.jinja2 +0 -0
  110. /package/{autorest → generator/pygen}/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +0 -0
  111. /package/{autorest → generator/pygen}/codegen/templates/packaging_templates/LICENSE.jinja2 +0 -0
  112. /package/{autorest → generator/pygen}/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +0 -0
  113. /package/{autorest → generator/pygen}/codegen/templates/packaging_templates/README.md.jinja2 +0 -0
  114. /package/{autorest → generator/pygen}/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +0 -0
  115. /package/{autorest → generator/pygen}/codegen/templates/packaging_templates/setup.py.jinja2 +0 -0
  116. /package/{autorest → generator/pygen}/codegen/templates/paging_operation.py.jinja2 +0 -0
  117. /package/{autorest → generator/pygen}/codegen/templates/patch.py.jinja2 +0 -0
  118. /package/{autorest → generator/pygen}/codegen/templates/pkgutil_init.py.jinja2 +0 -0
  119. /package/{autorest → generator/pygen}/codegen/templates/request_builder.py.jinja2 +0 -0
  120. /package/{autorest → generator/pygen}/codegen/templates/request_builders.py.jinja2 +0 -0
  121. /package/{autorest → generator/pygen}/codegen/templates/rest_init.py.jinja2 +0 -0
  122. /package/{autorest → generator/pygen}/codegen/templates/sample.py.jinja2 +0 -0
  123. /package/{autorest → generator/pygen}/codegen/templates/testpreparer.py.jinja2 +0 -0
  124. /package/{autorest → generator/pygen}/codegen/templates/types.py.jinja2 +0 -0
  125. /package/{autorest → generator/pygen}/codegen/templates/validation.py.jinja2 +0 -0
  126. /package/{autorest → generator/pygen}/codegen/templates/vendor.py.jinja2 +0 -0
  127. /package/{autorest → generator/pygen}/codegen/templates/version.py.jinja2 +0 -0
  128. /package/{autorest → generator/pygen}/postprocess/get_all.py +0 -0
  129. /package/{autorest → generator/pygen}/postprocess/venvtools.py +0 -0
  130. /package/{autorest → generator/pygen}/preprocess/helpers.py +0 -0
  131. /package/{autorest/_utils.py → generator/pygen/utils.py} +0 -0
  132. /package/{run-python3.js → scripts/run-python3.js} +0 -0
@@ -5,7 +5,7 @@
5
5
  # --------------------------------------------------------------------------
6
6
  from typing import Dict, List, Any, TYPE_CHECKING
7
7
 
8
- from autorest.codegen.models.utils import OrderedSet
8
+ from .utils import OrderedSet
9
9
 
10
10
  from .base import BaseModel
11
11
  from .operation import get_operation
@@ -8,8 +8,7 @@ from typing import List, Optional, Any, Union
8
8
  from pathlib import Path
9
9
  from jinja2 import PackageLoader, Environment, FileSystemLoader, StrictUndefined
10
10
 
11
- from ... import ReaderAndWriter, ReaderAndWriterAutorest
12
- from ...jsonrpc import AutorestAPI
11
+ from ... import ReaderAndWriter
13
12
  from ..models import (
14
13
  OperationGroup,
15
14
  RequestBuilder,
@@ -29,7 +28,7 @@ from .patch_serializer import PatchSerializer
29
28
  from .sample_serializer import SampleSerializer
30
29
  from .test_serializer import TestSerializer, TestGeneralSerializer
31
30
  from .types_serializer import TypesSerializer
32
- from ..._utils import to_snake_case
31
+ from ...utils import to_snake_case
33
32
  from .._utils import VALID_PACKAGE_MODE
34
33
  from .utils import (
35
34
  extract_sample_name,
@@ -132,13 +131,12 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
132
131
  self.code_model.options["show_operations"]
133
132
  and self.code_model.has_operations
134
133
  and self.code_model.options["generate_test"]
135
- and not self.code_model.options["azure_arm"]
136
134
  ):
137
135
  self._serialize_and_write_test(env, namespace_path)
138
136
 
139
137
  def serialize(self) -> None:
140
138
  env = Environment(
141
- loader=PackageLoader("autorest.codegen", "templates"),
139
+ loader=PackageLoader("pygen.codegen", "templates"),
142
140
  keep_trailing_newline=True,
143
141
  line_statement_prefix="##",
144
142
  line_comment_prefix="###",
@@ -196,7 +194,7 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
196
194
  root_of_sdk = self._package_root_folder(namespace_path)
197
195
  if self.code_model.options["package_mode"] in VALID_PACKAGE_MODE:
198
196
  env = Environment(
199
- loader=PackageLoader("autorest.codegen", "templates/packaging_templates"),
197
+ loader=PackageLoader("pygen.codegen", "templates/packaging_templates"),
200
198
  undefined=StrictUndefined,
201
199
  )
202
200
 
@@ -546,13 +544,14 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
546
544
  out_path = self._package_root_folder(namespace_path) / Path("generated_tests")
547
545
  general_serializer = TestGeneralSerializer(code_model=self.code_model, env=env)
548
546
  self.write_file(out_path / "conftest.py", general_serializer.serialize_conftest())
549
- for is_async in (True, False):
550
- async_suffix = "_async" if is_async else ""
551
- general_serializer.is_async = is_async
552
- self.write_file(
553
- out_path / f"testpreparer{async_suffix}.py",
554
- general_serializer.serialize_testpreparer(),
555
- )
547
+ if not self.code_model.options["azure_arm"]:
548
+ for is_async in (True, False):
549
+ async_suffix = "_async" if is_async else ""
550
+ general_serializer.is_async = is_async
551
+ self.write_file(
552
+ out_path / f"testpreparer{async_suffix}.py",
553
+ general_serializer.serialize_testpreparer(),
554
+ )
556
555
 
557
556
  for client in self.code_model.clients:
558
557
  for og in client.operation_groups:
@@ -569,20 +568,3 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
569
568
  log_error = f"error happens in test generation for operation group {og.class_name}: {e}"
570
569
  _LOGGER.error(log_error)
571
570
  self.code_model.for_test = False
572
-
573
-
574
- class JinjaSerializerAutorest(JinjaSerializer, ReaderAndWriterAutorest):
575
- def __init__(
576
- self,
577
- autorestapi: AutorestAPI,
578
- code_model: CodeModel,
579
- *,
580
- output_folder: Union[str, Path],
581
- **kwargs: Any,
582
- ) -> None:
583
- super().__init__(
584
- autorestapi=autorestapi,
585
- code_model=code_model,
586
- output_folder=output_folder,
587
- **kwargs,
588
- )
@@ -36,7 +36,7 @@ from ..models import (
36
36
  from .parameter_serializer import ParameterSerializer, PopKwargType
37
37
  from ..models.parameter_list import ParameterType
38
38
  from . import utils
39
- from ..._utils import JSON_REGEXP
39
+ from ...utils import JSON_REGEXP
40
40
 
41
41
  T = TypeVar("T")
42
42
  OrderedSet = Dict[T, None]
@@ -8,7 +8,7 @@ from typing import List
8
8
  from . import utils
9
9
  from ..models import Client, ParameterMethodLocation
10
10
  from .parameter_serializer import ParameterSerializer, PopKwargType
11
- from ..._utils import build_policies
11
+ from ...utils import build_policies
12
12
 
13
13
 
14
14
  class ClientSerializer:
@@ -6,7 +6,7 @@
6
6
  from typing import List
7
7
  from jinja2 import Environment
8
8
 
9
- from autorest.codegen.models.operation_group import OperationGroup
9
+ from ..models.operation_group import OperationGroup
10
10
  from ..models import CodeModel, Client
11
11
 
12
12
 
@@ -8,7 +8,7 @@ import logging
8
8
  from typing import Dict, Any, Union, Tuple
9
9
  from jinja2 import Environment
10
10
 
11
- from autorest.codegen.models.operation import OperationBase
11
+ from ..models.operation import OperationBase
12
12
  from .import_serializer import FileImportSerializer
13
13
  from .base_serializer import BaseSerializer
14
14
  from ..models import (
@@ -22,7 +22,7 @@ from ..models import (
22
22
  FileImport,
23
23
  )
24
24
  from .utils import get_namespace_config, get_namespace_from_package_name
25
- from ..._utils import to_snake_case
25
+ from ...utils import to_snake_case
26
26
 
27
27
  _LOGGER = logging.getLogger(__name__)
28
28
 
@@ -18,12 +18,26 @@ from ..models import (
18
18
  ModelType,
19
19
  BaseType,
20
20
  CombinedType,
21
+ FileImport,
21
22
  )
22
23
  from .utils import get_namespace_from_package_name, json_dumps_template
23
24
 
24
25
 
26
+ def is_lro(operation_type: str) -> bool:
27
+ return operation_type in ("lro", "lropaging")
28
+
29
+
30
+ def is_paging(operation_type: str) -> bool:
31
+ return operation_type in ("paging", "lropaging")
32
+
33
+
34
+ def is_common_operation(operation_type: str) -> bool:
35
+ return operation_type == "operation"
36
+
37
+
25
38
  class TestName:
26
- def __init__(self, client_name: str, *, is_async: bool = False) -> None:
39
+ def __init__(self, code_model: CodeModel, client_name: str, *, is_async: bool = False) -> None:
40
+ self.code_model = code_model
27
41
  self.client_name = client_name
28
42
  self.is_async = is_async
29
43
 
@@ -41,10 +55,14 @@ class TestName:
41
55
 
42
56
  @property
43
57
  def preparer_name(self) -> str:
58
+ if self.code_model.options["azure_arm"]:
59
+ return "RandomNameResourceGroupPreparer"
44
60
  return self.prefix + "Preparer"
45
61
 
46
62
  @property
47
63
  def base_test_class_name(self) -> str:
64
+ if self.code_model.options["azure_arm"]:
65
+ return "AzureMgmtRecordedTestCase"
48
66
  return f"{self.client_name}TestBase{self.async_suffix_capt}"
49
67
 
50
68
 
@@ -71,40 +89,35 @@ class TestCase:
71
89
  @property
72
90
  def response(self) -> str:
73
91
  if self.is_async:
74
- if self.operation.operation_type == "lropaging":
92
+ if is_lro(self.operation.operation_type):
75
93
  return "response = await (await "
76
- return "response = await "
94
+ if is_common_operation(self.operation.operation_type):
95
+ return "response = await "
77
96
  return "response = "
78
97
 
79
98
  @property
80
99
  def lro_comment(self) -> str:
81
- return " # poll until service return final result"
100
+ return " # call '.result()' to poll until service return final result"
82
101
 
83
102
  @property
84
103
  def operation_suffix(self) -> str:
85
- if self.operation.operation_type == "lropaging":
104
+ if is_lro(self.operation.operation_type):
86
105
  extra = ")" if self.is_async else ""
87
106
  return f"{extra}.result(){self.lro_comment}"
88
107
  return ""
89
108
 
90
109
  @property
91
110
  def extra_operation(self) -> str:
92
- if self.is_async:
93
- if self.operation.operation_type == "lro":
94
- return f"result = await response.result(){self.lro_comment}"
95
- if self.operation.operation_type == ("lropaging", "paging"):
96
- return "result = [r async for r in response]"
97
- else:
98
- if self.operation.operation_type == "lro":
99
- return f"result = response.result(){self.lro_comment}"
100
- if self.operation.operation_type in ("lropaging", "paging"):
101
- return "result = [r for r in response]"
111
+ if is_paging(self.operation.operation_type):
112
+ async_str = "async " if self.is_async else ""
113
+ return f"result = [r {async_str}for r in response]"
102
114
  return ""
103
115
 
104
116
 
105
117
  class Test(TestName):
106
118
  def __init__(
107
119
  self,
120
+ code_model: CodeModel,
108
121
  client_name: str,
109
122
  operation_group: OperationGroup,
110
123
  testcases: List[TestCase],
@@ -112,7 +125,7 @@ class Test(TestName):
112
125
  *,
113
126
  is_async: bool = False,
114
127
  ) -> None:
115
- super().__init__(client_name, is_async=is_async)
128
+ super().__init__(code_model, client_name, is_async=is_async)
116
129
  self.operation_group = operation_group
117
130
  self.testcases = testcases
118
131
  self.test_class_name = test_class_name
@@ -129,19 +142,23 @@ class TestGeneralSerializer(BaseSerializer):
129
142
 
130
143
  @property
131
144
  def test_names(self) -> List[TestName]:
132
- return [TestName(c.name, is_async=self.is_async) for c in self.code_model.clients]
145
+ return [TestName(self.code_model, c.name, is_async=self.is_async) for c in self.code_model.clients]
146
+
147
+ def add_import_client(self, imports: FileImport) -> None:
148
+ namespace = get_namespace_from_package_name(self.code_model.options["package_name"])
149
+ for client in self.code_model.clients:
150
+ imports.add_submodule_import(namespace + self.aio_str, client.name, ImportType.STDLIB)
133
151
 
134
152
  @property
135
153
  def import_clients(self) -> FileImportSerializer:
136
154
  imports = self.init_file_import()
137
- namespace = get_namespace_from_package_name(self.code_model.options["package_name"])
138
155
 
139
156
  imports.add_submodule_import("devtools_testutils", "AzureRecordedTestCase", ImportType.STDLIB)
140
157
  if not self.is_async:
141
158
  imports.add_import("functools", ImportType.STDLIB)
142
159
  imports.add_submodule_import("devtools_testutils", "PowerShellPreparer", ImportType.STDLIB)
143
- for client in self.code_model.clients:
144
- imports.add_submodule_import(namespace + self.aio_str, client.name, ImportType.STDLIB)
160
+ self.add_import_client(imports)
161
+
145
162
  return FileImportSerializer(imports, self.is_async)
146
163
 
147
164
  def serialize_conftest(self) -> str:
@@ -175,19 +192,25 @@ class TestSerializer(TestGeneralSerializer):
175
192
  @property
176
193
  def import_test(self) -> FileImportSerializer:
177
194
  imports = self.init_file_import()
178
- test_name = TestName(self.client.name, is_async=self.is_async)
195
+ test_name = TestName(self.code_model, self.client.name, is_async=self.is_async)
179
196
  async_suffix = "_async" if self.is_async else ""
180
197
  imports.add_submodule_import(
181
- "testpreparer" + async_suffix,
198
+ "devtools_testutils" if self.code_model.options["azure_arm"] else "testpreparer" + async_suffix,
182
199
  test_name.base_test_class_name,
183
200
  ImportType.LOCAL,
184
201
  )
185
- imports.add_submodule_import("testpreparer", test_name.preparer_name, ImportType.LOCAL)
202
+ imports.add_submodule_import(
203
+ "devtools_testutils" if self.code_model.options["azure_arm"] else "testpreparer",
204
+ test_name.preparer_name,
205
+ ImportType.LOCAL,
206
+ )
186
207
  imports.add_submodule_import(
187
208
  "devtools_testutils" + self.aio_str,
188
209
  "recorded_by_proxy" + async_suffix,
189
210
  ImportType.LOCAL,
190
211
  )
212
+ if self.code_model.options["azure_arm"]:
213
+ self.add_import_client(imports)
191
214
  return FileImportSerializer(imports, self.is_async)
192
215
 
193
216
  @property
@@ -242,6 +265,7 @@ class TestSerializer(TestGeneralSerializer):
242
265
  raise Exception("no public operation to test") # pylint: disable=broad-exception-raised
243
266
 
244
267
  return Test(
268
+ code_model=self.code_model,
245
269
  client_name=self.client.name,
246
270
  operation_group=self.operation_group,
247
271
  testcases=testcases,
@@ -251,7 +275,7 @@ class TestSerializer(TestGeneralSerializer):
251
275
 
252
276
  @property
253
277
  def test_class_name(self) -> str:
254
- test_name = TestName(self.client.name, is_async=self.is_async)
278
+ test_name = TestName(self.code_model, self.client.name, is_async=self.is_async)
255
279
  class_name = "" if self.operation_group.is_mixin else self.operation_group.class_name
256
280
  return f"Test{test_name.prefix}{class_name}{test_name.async_suffix_capt}"
257
281
 
@@ -11,7 +11,7 @@ load_dotenv()
11
11
  @pytest.fixture(scope="session", autouse=True)
12
12
  def add_sanitizers(test_proxy):
13
13
  {% for test_name in test_names %}
14
- {% set prefix_upper = test_name.prefix|upper %}
14
+ {% set prefix_upper = "AZURE" if code_model.options["azure_arm"] else test_name.prefix|upper %}
15
15
  {% set prefix_lower = test_name.prefix|lower %}
16
16
  {{ prefix_lower }}_subscription_id = os.environ.get("{{ prefix_upper }}_SUBSCRIPTION_ID", "00000000-0000-0000-0000-000000000000")
17
17
  {{ prefix_lower }}_tenant_id = os.environ.get("{{ prefix_upper }}_TENANT_ID", "00000000-0000-0000-0000-000000000000")
@@ -144,6 +144,8 @@ class RawDeserializer:
144
144
  # context otherwise.
145
145
  _LOGGER.critical("Wasn't XML not JSON, failing")
146
146
  raise DeserializationError("XML is invalid") from err
147
+ elif content_type.startswith("text/"):
148
+ return data_as_str
147
149
  raise DeserializationError("Cannot deserialize content-type: {}".format(content_type))
148
150
 
149
151
  @classmethod
@@ -0,0 +1,50 @@
1
+ {% set prefix_lower = test.prefix|lower %}
2
+ {% set client_var = "self.client" if code_model.options["azure_arm"] else "client" %}
3
+ {% set async = "async " if test.is_async else "" %}
4
+ {% set async_suffix = "_async" if test.is_async else "" %}
5
+ # coding=utf-8
6
+ {{ code_model.options['license_header'] }}
7
+ import pytest
8
+ {{ imports }}
9
+
10
+ {% if code_model.options["azure_arm"] %}
11
+ AZURE_LOCATION = "eastus"
12
+ {% endif %}
13
+
14
+ @pytest.mark.skip("you may need to update the auto-generated test case before run it")
15
+ class {{ test.test_class_name }}({{ test.base_test_class_name }}):
16
+ {% if code_model.options["azure_arm"] %}
17
+ def setup_method(self, method):
18
+ {% if test.is_async %}
19
+ self.client = self.create_mgmt_client({{ test.client_name }}, is_async=True)
20
+ {% else %}
21
+ self.client = self.create_mgmt_client({{ test.client_name }})
22
+ {% endif %}
23
+ {% endif %}
24
+ {% for testcase in test.testcases %}
25
+ {% if code_model.options["azure_arm"] %}
26
+ @{{ test.preparer_name }}(location=AZURE_LOCATION)
27
+ {% else %}
28
+ @{{ test.preparer_name }}()
29
+ {% endif %}
30
+ @recorded_by_proxy{{ async_suffix }}
31
+ {% if code_model.options["azure_arm"] %}
32
+ {{ async }}def test_{{ testcase.operation.name }}(self, resource_group):
33
+ {% else %}
34
+ {{ async }}def test_{{ testcase.operation.name }}(self, {{ prefix_lower }}_endpoint):
35
+ {{ client_var }} = self.{{ test.create_client_name }}(endpoint={{ prefix_lower }}_endpoint)
36
+ {% endif %}
37
+ {{testcase.response }}{{ client_var }}{{ testcase.operation_group_prefix }}.{{ testcase.operation.name }}(
38
+ {% for key, value in testcase.params.items() %}
39
+ {% if code_model.options["azure_arm"] and key == "resource_group_name" %}
40
+ {{ key }}=resource_group.name,
41
+ {% else %}
42
+ {{ key }}={{ value|indent(12) }},
43
+ {% endif %}
44
+ {% endfor %}
45
+ ){{ testcase.operation_suffix }}
46
+ {{ testcase.extra_operation }}
47
+ # please add some check logic here by yourself
48
+ # ...
49
+
50
+ {% endfor %}
@@ -3,21 +3,21 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
- """An autorest MD to RST plugin.
6
+ """An MD to RST plugin.
7
7
  """
8
8
  import logging
9
9
  from typing import Any, Dict, Set, Union
10
10
 
11
11
  import m2r2
12
12
 
13
- from .. import YamlUpdatePluginAutorest, YamlUpdatePlugin
14
- from .._utils import parse_args
13
+ from . import YamlUpdatePlugin
14
+ from .utils import parse_args
15
15
 
16
16
 
17
17
  _LOGGER = logging.getLogger(__name__)
18
18
 
19
19
 
20
- class AutorestRender(m2r2.RestRenderer):
20
+ class GeneratorRenderer(m2r2.RestRenderer):
21
21
  """Redefine the concept of inline HTML in the renderer, we don't want to define a new format
22
22
  in the description/summary.
23
23
  """
@@ -54,16 +54,11 @@ class M2R(YamlUpdatePlugin): # pylint: disable=abstract-method
54
54
  def convert_to_rst(string_to_convert: str) -> str:
55
55
  """Convert that string from MD to RST."""
56
56
  try:
57
- return m2r2.convert(string_to_convert, renderer=AutorestRender()).strip()
57
+ return m2r2.convert(string_to_convert, renderer=GeneratorRenderer()).strip()
58
58
  except Exception: # pylint: disable=broad-except
59
59
  return string_to_convert
60
60
 
61
61
 
62
- class M2RAutorest(YamlUpdatePluginAutorest, M2R):
63
- def get_options(self) -> Dict[str, Any]:
64
- return {}
65
-
66
-
67
62
  if __name__ == "__main__":
68
63
  # CADL pipeline will call this
69
64
  args, unknown_args = parse_args()
@@ -12,7 +12,7 @@ import black
12
12
  from black.report import NothingChanged
13
13
  from .venvtools import ExtendedEnvBuilder, python_run
14
14
 
15
- from .. import Plugin, PluginAutorest
15
+ from .. import Plugin
16
16
 
17
17
  _BLACK_MODE = black.Mode() # pyright: ignore [reportPrivateImportUsage]
18
18
  _BLACK_MODE.line_length = 120
@@ -181,8 +181,3 @@ class PostProcessPlugin(Plugin): # pylint: disable=abstract-method
181
181
  file_content = file_content.replace("__all__ = [", f"__all__ = [\n{added_objs_all}", 1)
182
182
  formatted_file = format_file(file, file_content)
183
183
  self.write_file(file, formatted_file)
184
-
185
-
186
- class PostProcessPluginAutorest(PostProcessPlugin, PluginAutorest):
187
- def get_options(self) -> Dict[str, Any]:
188
- return {"outputFolderUri": self._autorestapi.get_value("outputFolderUri")}
@@ -8,7 +8,7 @@
8
8
  import copy
9
9
  from typing import Callable, Dict, Any, List, Optional
10
10
 
11
- from .._utils import to_snake_case
11
+ from ..utils import to_snake_case
12
12
  from .helpers import (
13
13
  add_redefined_builtin_info,
14
14
  pad_builtin_namespaces,
@@ -16,8 +16,8 @@ from .helpers import (
16
16
  )
17
17
  from .python_mappings import CADL_RESERVED_WORDS, RESERVED_WORDS, PadType
18
18
 
19
- from .. import YamlUpdatePlugin, YamlUpdatePluginAutorest
20
- from .._utils import parse_args, get_body_type_for_description, JSON_REGEXP, KNOWN_TYPES, update_enum_value
19
+ from .. import YamlUpdatePlugin
20
+ from ..utils import parse_args, get_body_type_for_description, JSON_REGEXP, KNOWN_TYPES, update_enum_value
21
21
 
22
22
 
23
23
  def update_overload_section(
@@ -497,16 +497,6 @@ class PreProcessPlugin(YamlUpdatePlugin): # pylint: disable=abstract-method
497
497
  yaml_data["namespace"] = pad_builtin_namespaces(yaml_data["namespace"])
498
498
 
499
499
 
500
- class PreProcessPluginAutorest(YamlUpdatePluginAutorest, PreProcessPlugin):
501
- def get_options(self) -> Dict[str, Any]:
502
- options = {
503
- "version-tolerant": self._autorestapi.get_boolean_value("version-tolerant"),
504
- "azure-arm": self._autorestapi.get_boolean_value("azure-arm"),
505
- "models-mode": self._autorestapi.get_value("models-mode"),
506
- }
507
- return {k: v for k, v in options.items() if v is not None}
508
-
509
-
510
500
  if __name__ == "__main__":
511
501
  # CADL pipeline will call this
512
502
  args, unknown_args = parse_args()
@@ -112,7 +112,7 @@ RESERVED_WORDS = {
112
112
  PadType.METHOD: [*_always_reserved],
113
113
  PadType.PARAMETER: [
114
114
  "self",
115
- # these are kwargs we've reserved for our autorest generated operations
115
+ # these are kwargs we've reserved for our generated operations
116
116
  "content_type",
117
117
  "accept",
118
118
  "cls",
@@ -0,0 +1,25 @@
1
+ Metadata-Version: 2.1
2
+ Name: pygen
3
+ Version: 0.1.0
4
+ Summary: Core Library for Python Generation
5
+ Home-page: https://github.com/Azure/autorest.python/packages/core
6
+ Author: Microsoft Corporation
7
+ Author-email: azpysdkhelp@microsoft.com
8
+ License: MIT License
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Programming Language :: Python
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.8
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: License :: OSI Approved :: MIT License
18
+ Description-Content-Type: text/markdown
19
+ License-File: LICENSE
20
+ Requires-Dist: Jinja2>=2.11
21
+ Requires-Dist: pyyaml
22
+ Requires-Dist: m2r2
23
+ Requires-Dist: black
24
+
25
+ # Core Library for Python Generation
@@ -0,0 +1,66 @@
1
+ LICENSE
2
+ README.md
3
+ setup.py
4
+ pygen/__init__.py
5
+ pygen/_version.py
6
+ pygen/black.py
7
+ pygen/m2r.py
8
+ pygen/utils.py
9
+ pygen.egg-info/PKG-INFO
10
+ pygen.egg-info/SOURCES.txt
11
+ pygen.egg-info/dependency_links.txt
12
+ pygen.egg-info/requires.txt
13
+ pygen.egg-info/top_level.txt
14
+ pygen/codegen/__init__.py
15
+ pygen/codegen/_utils.py
16
+ pygen/codegen/models/__init__.py
17
+ pygen/codegen/models/base.py
18
+ pygen/codegen/models/base_builder.py
19
+ pygen/codegen/models/client.py
20
+ pygen/codegen/models/code_model.py
21
+ pygen/codegen/models/combined_type.py
22
+ pygen/codegen/models/constant_type.py
23
+ pygen/codegen/models/credential_types.py
24
+ pygen/codegen/models/dictionary_type.py
25
+ pygen/codegen/models/enum_type.py
26
+ pygen/codegen/models/imports.py
27
+ pygen/codegen/models/list_type.py
28
+ pygen/codegen/models/lro_operation.py
29
+ pygen/codegen/models/lro_paging_operation.py
30
+ pygen/codegen/models/model_type.py
31
+ pygen/codegen/models/operation.py
32
+ pygen/codegen/models/operation_group.py
33
+ pygen/codegen/models/paging_operation.py
34
+ pygen/codegen/models/parameter.py
35
+ pygen/codegen/models/parameter_list.py
36
+ pygen/codegen/models/primitive_types.py
37
+ pygen/codegen/models/property.py
38
+ pygen/codegen/models/request_builder.py
39
+ pygen/codegen/models/request_builder_parameter.py
40
+ pygen/codegen/models/response.py
41
+ pygen/codegen/models/utils.py
42
+ pygen/codegen/serializers/__init__.py
43
+ pygen/codegen/serializers/base_serializer.py
44
+ pygen/codegen/serializers/builder_serializer.py
45
+ pygen/codegen/serializers/client_serializer.py
46
+ pygen/codegen/serializers/enum_serializer.py
47
+ pygen/codegen/serializers/general_serializer.py
48
+ pygen/codegen/serializers/import_serializer.py
49
+ pygen/codegen/serializers/metadata_serializer.py
50
+ pygen/codegen/serializers/model_init_serializer.py
51
+ pygen/codegen/serializers/model_serializer.py
52
+ pygen/codegen/serializers/operation_groups_serializer.py
53
+ pygen/codegen/serializers/operations_init_serializer.py
54
+ pygen/codegen/serializers/parameter_serializer.py
55
+ pygen/codegen/serializers/patch_serializer.py
56
+ pygen/codegen/serializers/request_builders_serializer.py
57
+ pygen/codegen/serializers/sample_serializer.py
58
+ pygen/codegen/serializers/test_serializer.py
59
+ pygen/codegen/serializers/types_serializer.py
60
+ pygen/codegen/serializers/utils.py
61
+ pygen/postprocess/__init__.py
62
+ pygen/postprocess/get_all.py
63
+ pygen/postprocess/venvtools.py
64
+ pygen/preprocess/__init__.py
65
+ pygen/preprocess/helpers.py
66
+ pygen/preprocess/python_mappings.py
@@ -0,0 +1,4 @@
1
+ Jinja2>=2.11
2
+ pyyaml
3
+ m2r2
4
+ black
@@ -0,0 +1 @@
1
+ pygen
@@ -0,0 +1,12 @@
1
+ black==24.4.0
2
+ click==8.1.3
3
+ docutils==0.19
4
+ Jinja2==3.1.4
5
+ m2r2==0.3.3
6
+ MarkupSafe==2.1.2
7
+ mistune==0.8.4
8
+ pathspec==0.11.1
9
+ platformdirs==3.2.0
10
+ PyYAML==6.0.1
11
+ tomli==2.0.1
12
+ setuptools==69.2.0