@autorest/python 6.14.3 → 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.
- package/autorest/__init__.py +2 -93
- package/autorest/black.py +13 -0
- package/autorest/codegen.py +117 -0
- package/autorest/m2r.py +16 -0
- package/autorest/m4reformatter/__init__.py +1 -1
- package/autorest/multiapi/__init__.py +2 -1
- package/autorest/multiapi/serializers/__init__.py +5 -3
- package/autorest/multiclient/__init__.py +2 -1
- package/autorest/postprocess.py +14 -0
- package/autorest/preprocess.py +20 -0
- package/generator/LICENSE +21 -0
- package/generator/README.md +1 -0
- package/generator/dev_requirements.txt +5 -0
- package/generator/pygen/__init__.py +107 -0
- package/generator/pygen/_version.py +7 -0
- package/{autorest/black/__init__.py → generator/pygen/black.py} +2 -7
- package/{autorest → generator/pygen}/codegen/__init__.py +3 -83
- package/{autorest → generator/pygen}/codegen/models/combined_type.py +1 -1
- package/{autorest → generator/pygen}/codegen/models/model_type.py +1 -1
- package/{autorest → generator/pygen}/codegen/models/operation_group.py +1 -1
- package/{autorest → generator/pygen}/codegen/serializers/__init__.py +12 -30
- package/{autorest → generator/pygen}/codegen/serializers/builder_serializer.py +1 -1
- package/{autorest → generator/pygen}/codegen/serializers/client_serializer.py +1 -1
- package/{autorest → generator/pygen}/codegen/serializers/operations_init_serializer.py +1 -1
- package/{autorest → generator/pygen}/codegen/serializers/sample_serializer.py +2 -2
- package/{autorest → generator/pygen}/codegen/serializers/test_serializer.py +48 -24
- package/{autorest → generator/pygen}/codegen/templates/conftest.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/test.py.jinja2 +50 -0
- package/{autorest/m2r/__init__.py → generator/pygen/m2r.py} +5 -10
- package/{autorest → generator/pygen}/postprocess/__init__.py +1 -6
- package/{autorest → generator/pygen}/preprocess/__init__.py +3 -13
- package/{autorest → generator/pygen}/preprocess/python_mappings.py +1 -1
- package/generator/pygen.egg-info/PKG-INFO +25 -0
- package/generator/pygen.egg-info/SOURCES.txt +66 -0
- package/generator/pygen.egg-info/dependency_links.txt +1 -0
- package/generator/pygen.egg-info/requires.txt +4 -0
- package/generator/pygen.egg-info/top_level.txt +1 -0
- package/generator/requirements.txt +12 -0
- package/generator/setup.py +55 -0
- package/package.json +11 -12
- package/requirements.txt +1 -1
- package/scripts/__pycache__/venvtools.cpython-38.pyc +0 -0
- package/scripts/copy-generator.js +19 -0
- package/{install.py → scripts/install.py} +3 -5
- package/{prepare.py → scripts/prepare.py} +7 -4
- package/{start.py → scripts/start.py} +1 -1
- package/{venvtools.py → scripts/venvtools.py} +1 -1
- package/autorest/codegen/templates/test.py.jinja2 +0 -26
- package/run_cadl.py +0 -40
- /package/{autorest → generator/pygen}/codegen/_utils.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/__init__.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/base.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/base_builder.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/client.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/code_model.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/constant_type.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/credential_types.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/dictionary_type.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/enum_type.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/imports.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/list_type.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/lro_operation.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/lro_paging_operation.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/operation.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/paging_operation.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/parameter.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/parameter_list.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/primitive_types.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/property.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/request_builder.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/request_builder_parameter.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/response.py +0 -0
- /package/{autorest → generator/pygen}/codegen/models/utils.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/base_serializer.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/enum_serializer.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/general_serializer.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/import_serializer.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/metadata_serializer.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/model_init_serializer.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/model_serializer.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/operation_groups_serializer.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/parameter_serializer.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/patch_serializer.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/request_builders_serializer.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/types_serializer.py +0 -0
- /package/{autorest → generator/pygen}/codegen/serializers/utils.py +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/client.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/client_container.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/config.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/config_container.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/enum.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/enum_container.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/init.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/keywords.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/lro_operation.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/lro_paging_operation.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/macros.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/metadata.json.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/model_base.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/model_container.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/model_dpg.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/model_init.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/model_msrest.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/operation.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/operation_group.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/operation_groups_container.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/operation_tools.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/operations_folder_init.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/packaging_templates/LICENSE.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/packaging_templates/README.md.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/packaging_templates/setup.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/paging_operation.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/patch.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/pkgutil_init.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/request_builder.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/request_builders.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/rest_init.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/sample.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/serialization.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/testpreparer.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/types.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/validation.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/vendor.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/codegen/templates/version.py.jinja2 +0 -0
- /package/{autorest → generator/pygen}/postprocess/get_all.py +0 -0
- /package/{autorest → generator/pygen}/postprocess/venvtools.py +0 -0
- /package/{autorest → generator/pygen}/preprocess/helpers.py +0 -0
- /package/{autorest/_utils.py → generator/pygen/utils.py} +0 -0
- /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
|
|
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
|
|
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 ...
|
|
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("
|
|
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("
|
|
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
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
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 ...
|
|
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 ...
|
|
11
|
+
from ...utils import build_policies
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class ClientSerializer:
|
|
@@ -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
|
|
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 ...
|
|
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
|
|
92
|
+
if is_lro(self.operation.operation_type):
|
|
75
93
|
return "response = await (await "
|
|
76
|
-
|
|
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
|
|
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.
|
|
93
|
-
if self.
|
|
94
|
-
|
|
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
|
-
|
|
144
|
-
|
|
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(
|
|
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")
|
|
@@ -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
|
|
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
|
|
14
|
-
from
|
|
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
|
|
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=
|
|
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
|
|
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 ..
|
|
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
|
|
20
|
-
from ..
|
|
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
|
|
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 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pygen
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
|
|
9
|
+
|
|
10
|
+
import os
|
|
11
|
+
import re
|
|
12
|
+
|
|
13
|
+
from setuptools import setup, find_packages
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# Version extraction inspired from 'requests'
|
|
17
|
+
with open(os.path.join("pygen", "_version.py"), "r") as fd:
|
|
18
|
+
version = re.search(r'^VERSION\s*=\s*[\'"]([^\'"]*)[\'"]', fd.read(), re.MULTILINE).group(1)
|
|
19
|
+
|
|
20
|
+
if not version:
|
|
21
|
+
raise RuntimeError("Cannot find version information")
|
|
22
|
+
|
|
23
|
+
setup(
|
|
24
|
+
name="pygen",
|
|
25
|
+
version=version,
|
|
26
|
+
description="Core Library for Python Generation",
|
|
27
|
+
long_description=open("README.md", "r").read(),
|
|
28
|
+
long_description_content_type="text/markdown",
|
|
29
|
+
license="MIT License",
|
|
30
|
+
author="Microsoft Corporation",
|
|
31
|
+
author_email="azpysdkhelp@microsoft.com",
|
|
32
|
+
url="https://github.com/Azure/autorest.python/packages/core",
|
|
33
|
+
classifiers=[
|
|
34
|
+
"Development Status :: 4 - Beta",
|
|
35
|
+
"Programming Language :: Python",
|
|
36
|
+
"Programming Language :: Python :: 3",
|
|
37
|
+
"Programming Language :: Python :: 3.8",
|
|
38
|
+
"Programming Language :: Python :: 3.9",
|
|
39
|
+
"Programming Language :: Python :: 3.10",
|
|
40
|
+
"Programming Language :: Python :: 3.11",
|
|
41
|
+
"Programming Language :: Python :: 3.12",
|
|
42
|
+
"License :: OSI Approved :: MIT License",
|
|
43
|
+
],
|
|
44
|
+
packages=find_packages(
|
|
45
|
+
exclude=[
|
|
46
|
+
"test",
|
|
47
|
+
]
|
|
48
|
+
),
|
|
49
|
+
install_requires=[
|
|
50
|
+
"Jinja2 >= 2.11", # I need "include" and auto-context + blank line are not indented by default
|
|
51
|
+
"pyyaml",
|
|
52
|
+
"m2r2",
|
|
53
|
+
"black",
|
|
54
|
+
],
|
|
55
|
+
)
|