@autorest/python 6.2.0 → 6.2.2
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/codegen/__init__.py +9 -74
- package/autorest/codegen/models/__init__.py +11 -12
- package/autorest/codegen/models/{base_type.py → base.py} +29 -10
- package/autorest/codegen/models/base_builder.py +8 -10
- package/autorest/codegen/models/client.py +111 -40
- package/autorest/codegen/models/code_model.py +131 -90
- package/autorest/codegen/models/combined_type.py +7 -7
- package/autorest/codegen/models/constant_type.py +44 -10
- package/autorest/codegen/models/credential_types.py +17 -19
- package/autorest/codegen/models/dictionary_type.py +7 -9
- package/autorest/codegen/models/enum_type.py +19 -24
- package/autorest/codegen/models/imports.py +82 -33
- package/autorest/codegen/models/list_type.py +11 -15
- package/autorest/codegen/models/lro_operation.py +6 -10
- package/autorest/codegen/models/model_type.py +20 -21
- package/autorest/codegen/models/operation.py +49 -42
- package/autorest/codegen/models/operation_group.py +11 -11
- package/autorest/codegen/models/paging_operation.py +9 -11
- package/autorest/codegen/models/parameter.py +48 -32
- package/autorest/codegen/models/parameter_list.py +16 -22
- package/autorest/codegen/models/primitive_types.py +12 -23
- package/autorest/codegen/models/property.py +11 -11
- package/autorest/codegen/models/request_builder.py +19 -19
- package/autorest/codegen/models/request_builder_parameter.py +14 -16
- package/autorest/codegen/models/response.py +24 -28
- package/autorest/codegen/serializers/__init__.py +202 -187
- package/autorest/codegen/serializers/builder_serializer.py +49 -50
- package/autorest/codegen/serializers/client_serializer.py +9 -7
- package/autorest/codegen/serializers/enum_serializer.py +4 -4
- package/autorest/codegen/serializers/general_serializer.py +26 -36
- package/autorest/codegen/serializers/import_serializer.py +30 -36
- package/autorest/codegen/serializers/metadata_serializer.py +35 -17
- package/autorest/codegen/serializers/model_init_serializer.py +6 -10
- package/autorest/codegen/serializers/model_serializer.py +42 -27
- package/autorest/codegen/serializers/operation_groups_serializer.py +12 -8
- package/autorest/codegen/serializers/operations_init_serializer.py +13 -6
- package/autorest/codegen/serializers/patch_serializer.py +4 -4
- package/autorest/codegen/serializers/request_builders_serializer.py +6 -6
- package/autorest/codegen/serializers/sample_serializer.py +10 -12
- package/autorest/codegen/templates/client_container.py.jinja2 +2 -2
- package/autorest/codegen/templates/config.py.jinja2 +1 -1
- package/autorest/codegen/templates/config_container.py.jinja2 +3 -3
- package/autorest/codegen/templates/enum_container.py.jinja2 +2 -2
- package/autorest/codegen/templates/init.py.jinja2 +2 -2
- package/autorest/codegen/templates/lro_operation.py.jinja2 +1 -1
- package/autorest/codegen/templates/lro_paging_operation.py.jinja2 +1 -1
- package/autorest/codegen/templates/metadata.json.jinja2 +2 -2
- package/autorest/codegen/templates/model_container.py.jinja2 +3 -3
- package/autorest/codegen/templates/model_dpg.py.jinja2 +4 -4
- package/autorest/codegen/templates/model_init.py.jinja2 +3 -3
- package/autorest/codegen/templates/operation.py.jinja2 +1 -1
- package/autorest/codegen/templates/operation_group.py.jinja2 +2 -2
- package/autorest/codegen/templates/operation_groups_container.py.jinja2 +3 -3
- package/autorest/codegen/templates/operation_tools.jinja2 +3 -3
- package/autorest/codegen/templates/operations_folder_init.py.jinja2 +4 -4
- package/autorest/codegen/templates/packaging_templates/setup.py.jinja2 +4 -1
- package/autorest/codegen/templates/paging_operation.py.jinja2 +1 -1
- package/autorest/codegen/templates/request_builder.py.jinja2 +1 -1
- package/autorest/codegen/templates/request_builders.py.jinja2 +2 -2
- package/autorest/codegen/templates/rest_init.py.jinja2 +1 -1
- package/autorest/codegen/templates/sample.py.jinja2 +5 -5
- package/autorest/codegen/templates/validation.py.jinja2 +1 -1
- package/autorest/codegen/templates/vendor.py.jinja2 +6 -6
- package/autorest/codegen/templates/version.py.jinja2 +2 -2
- package/autorest/m4reformatter/__init__.py +57 -47
- package/autorest/multiapi/models/imports.py +89 -18
- package/autorest/multiapi/serializers/import_serializer.py +88 -7
- package/autorest/multiapi/utils.py +6 -0
- package/autorest/preprocess/__init__.py +23 -26
- package/package.json +1 -1
- package/run_cadl.py +0 -1
- package/autorest/cadlflags/__init__.py +0 -130
- package/autorest/codegen/models/base_model.py +0 -30
|
@@ -33,16 +33,40 @@ def _serialize_package(imports: List[ImportModel], delimiter: str) -> str:
|
|
|
33
33
|
return delimiter.join(buffer)
|
|
34
34
|
|
|
35
35
|
|
|
36
|
+
def _serialize_versioned_package(i: ImportModel, delimiter: str) -> str:
|
|
37
|
+
if not i.version_modules:
|
|
38
|
+
return ""
|
|
39
|
+
buffer = []
|
|
40
|
+
for n, (version, module_name, comment) in enumerate(i.version_modules):
|
|
41
|
+
buffer.append(
|
|
42
|
+
"{} sys.version_info >= {}:".format("if" if n == 0 else "elif", version)
|
|
43
|
+
)
|
|
44
|
+
buffer.append(
|
|
45
|
+
f" from {module_name} import {i.submodule_name}{f' as {i.alias}' if i.alias else ''}"
|
|
46
|
+
f"{f' # {comment}' if comment else ''}"
|
|
47
|
+
)
|
|
48
|
+
buffer.append("else:")
|
|
49
|
+
buffer.append(
|
|
50
|
+
f" from {i.module_name} import {i.submodule_name}{f' as {i.alias}' if i.alias else ''}"
|
|
51
|
+
" # type: ignore # pylint: disable=ungrouped-imports"
|
|
52
|
+
)
|
|
53
|
+
return delimiter.join(buffer)
|
|
54
|
+
|
|
55
|
+
|
|
36
56
|
def _serialize_import_type(imports: List[ImportModel], delimiter: str) -> str:
|
|
37
57
|
"""Serialize a given import type."""
|
|
38
58
|
import_list = []
|
|
39
59
|
for module_name in sorted(set(i.module_name for i in imports)):
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
60
|
+
normal_imports = [
|
|
61
|
+
i for i in imports if i.module_name == module_name and not i.version_modules
|
|
62
|
+
]
|
|
63
|
+
versioned_imports = [
|
|
64
|
+
i for i in imports if i.module_name == module_name and i.version_modules
|
|
65
|
+
]
|
|
66
|
+
if normal_imports:
|
|
67
|
+
import_list.append(_serialize_package(normal_imports, delimiter))
|
|
68
|
+
for i in versioned_imports:
|
|
69
|
+
import_list.append(_serialize_versioned_package(i, delimiter))
|
|
46
70
|
return delimiter.join(import_list)
|
|
47
71
|
|
|
48
72
|
|
|
@@ -94,36 +118,6 @@ class FileImportSerializer:
|
|
|
94
118
|
if self.async_mode
|
|
95
119
|
else type_definition.sync_definition
|
|
96
120
|
)
|
|
97
|
-
if type_definition.version_imports is not None:
|
|
98
|
-
versions = type_definition.version_imports.keys()
|
|
99
|
-
for i, version in enumerate(
|
|
100
|
-
sorted(
|
|
101
|
-
versions, key=lambda x: x if x is not None else (), reverse=True
|
|
102
|
-
)
|
|
103
|
-
):
|
|
104
|
-
if version is not None:
|
|
105
|
-
ret.append(
|
|
106
|
-
"{} sys.version_info >= {}:".format(
|
|
107
|
-
"if" if i == 0 else "elif", version
|
|
108
|
-
)
|
|
109
|
-
)
|
|
110
|
-
elif i > 0:
|
|
111
|
-
ret.append("else:")
|
|
112
|
-
for import_clause in _get_import_clauses(
|
|
113
|
-
[type_definition.version_imports[version]], "\n"
|
|
114
|
-
):
|
|
115
|
-
ret.append(
|
|
116
|
-
"{}{}".format(
|
|
117
|
-
" "
|
|
118
|
-
if len(versions) > 1 or version is not None
|
|
119
|
-
else "",
|
|
120
|
-
import_clause,
|
|
121
|
-
)
|
|
122
|
-
)
|
|
123
|
-
if i > 0:
|
|
124
|
-
ret[
|
|
125
|
-
-1
|
|
126
|
-
] += " # type: ignore # pylint: disable=ungrouped-imports"
|
|
127
121
|
ret.append("{} = {}".format(type_name, definition_value))
|
|
128
122
|
return ret
|
|
129
123
|
|
|
@@ -13,7 +13,7 @@ from ..models import (
|
|
|
13
13
|
PagingOperation,
|
|
14
14
|
TypingSection,
|
|
15
15
|
ImportType,
|
|
16
|
-
|
|
16
|
+
CodeModel,
|
|
17
17
|
)
|
|
18
18
|
from .builder_serializer import get_operation_serializer
|
|
19
19
|
|
|
@@ -21,7 +21,25 @@ from .builder_serializer import get_operation_serializer
|
|
|
21
21
|
def _json_serialize_imports(
|
|
22
22
|
imports: Dict[
|
|
23
23
|
TypingSection,
|
|
24
|
-
Dict[
|
|
24
|
+
Dict[
|
|
25
|
+
ImportType,
|
|
26
|
+
Dict[
|
|
27
|
+
str,
|
|
28
|
+
Set[
|
|
29
|
+
Optional[
|
|
30
|
+
Union[
|
|
31
|
+
str,
|
|
32
|
+
Tuple[str, str],
|
|
33
|
+
Tuple[
|
|
34
|
+
str,
|
|
35
|
+
Optional[str],
|
|
36
|
+
Tuple[Tuple[Tuple[int, int], str, Optional[str]]],
|
|
37
|
+
],
|
|
38
|
+
]
|
|
39
|
+
]
|
|
40
|
+
],
|
|
41
|
+
],
|
|
42
|
+
],
|
|
25
43
|
]
|
|
26
44
|
) -> str:
|
|
27
45
|
if not imports:
|
|
@@ -62,18 +80,17 @@ def _mixin_imports(
|
|
|
62
80
|
|
|
63
81
|
|
|
64
82
|
class MetadataSerializer:
|
|
65
|
-
def __init__(self,
|
|
66
|
-
self.
|
|
67
|
-
self.client = self.
|
|
68
|
-
0
|
|
69
|
-
] # we only do one client for multiapi
|
|
83
|
+
def __init__(self, code_model: CodeModel, env: Environment) -> None:
|
|
84
|
+
self.code_model = code_model
|
|
85
|
+
self.client = self.code_model.clients[0] # we only do one client for multiapi
|
|
70
86
|
self.env = env
|
|
71
87
|
|
|
72
88
|
def _choose_api_version(self) -> Tuple[str, List[str]]:
|
|
73
89
|
chosen_version = ""
|
|
74
90
|
total_api_version_set: Set[str] = set()
|
|
75
|
-
for
|
|
76
|
-
|
|
91
|
+
for client in self.code_model.clients:
|
|
92
|
+
for operation_group in client.operation_groups:
|
|
93
|
+
total_api_version_set.update(operation_group.api_versions)
|
|
77
94
|
|
|
78
95
|
total_api_version_list = list(total_api_version_set)
|
|
79
96
|
total_api_version_list.sort()
|
|
@@ -85,7 +102,7 @@ class MetadataSerializer:
|
|
|
85
102
|
if len(total_api_version_list) == 1:
|
|
86
103
|
chosen_version = total_api_version_list[0]
|
|
87
104
|
elif len(total_api_version_list) > 1:
|
|
88
|
-
module_version = self.
|
|
105
|
+
module_version = self.code_model.namespace.split(".")[-1]
|
|
89
106
|
for api_version in total_api_version_list:
|
|
90
107
|
if "v{}".format(api_version.replace("-", "_")) == module_version:
|
|
91
108
|
chosen_version = api_version
|
|
@@ -102,7 +119,8 @@ class MetadataSerializer:
|
|
|
102
119
|
mixin_operation_group: Optional[OperationGroup] = next(
|
|
103
120
|
(
|
|
104
121
|
operation_group
|
|
105
|
-
for
|
|
122
|
+
for client in self.code_model.clients
|
|
123
|
+
for operation_group in client.operation_groups
|
|
106
124
|
if operation_group.is_mixin
|
|
107
125
|
),
|
|
108
126
|
None,
|
|
@@ -115,11 +133,11 @@ class MetadataSerializer:
|
|
|
115
133
|
chosen_version, total_api_version_list = self._choose_api_version()
|
|
116
134
|
|
|
117
135
|
# setting to true, because for multiapi we always generate with a version file with version 0.1.0
|
|
118
|
-
self.
|
|
136
|
+
self.code_model.options["package_version"] = "0.1.0"
|
|
119
137
|
template = self.env.get_template("metadata.json.jinja2")
|
|
120
138
|
|
|
121
139
|
return template.render(
|
|
122
|
-
|
|
140
|
+
code_model=self.code_model,
|
|
123
141
|
chosen_version=chosen_version,
|
|
124
142
|
total_api_version_list=total_api_version_list,
|
|
125
143
|
client=self.client,
|
|
@@ -138,19 +156,19 @@ class MetadataSerializer:
|
|
|
138
156
|
self.client.imports_for_multiapi(async_mode=True).to_dict()
|
|
139
157
|
),
|
|
140
158
|
sync_config_imports=_json_serialize_imports(
|
|
141
|
-
self.client.config.
|
|
159
|
+
self.client.config.imports_for_multiapi(async_mode=False).to_dict()
|
|
142
160
|
),
|
|
143
161
|
async_config_imports=_json_serialize_imports(
|
|
144
|
-
self.client.config.
|
|
162
|
+
self.client.config.imports_for_multiapi(async_mode=True).to_dict()
|
|
145
163
|
),
|
|
146
164
|
get_async_operation_serializer=functools.partial(
|
|
147
165
|
get_operation_serializer,
|
|
148
|
-
|
|
166
|
+
code_model=self.client.code_model,
|
|
149
167
|
async_mode=True,
|
|
150
168
|
),
|
|
151
169
|
get_sync_operation_serializer=functools.partial(
|
|
152
170
|
get_operation_serializer,
|
|
153
|
-
|
|
171
|
+
code_model=self.client.code_model,
|
|
154
172
|
async_mode=False,
|
|
155
173
|
),
|
|
156
174
|
has_credential=bool(self.client.credential),
|
|
@@ -4,21 +4,19 @@
|
|
|
4
4
|
# license information.
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
from jinja2 import Environment
|
|
7
|
-
from ..models import
|
|
7
|
+
from ..models import CodeModel
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class ModelInitSerializer:
|
|
11
|
-
def __init__(self,
|
|
12
|
-
self.
|
|
11
|
+
def __init__(self, code_model: CodeModel, env: Environment) -> None:
|
|
12
|
+
self.code_model = code_model
|
|
13
13
|
self.env = env
|
|
14
14
|
|
|
15
15
|
def serialize(self) -> str:
|
|
16
|
-
schemas = [s.name for s in self.
|
|
16
|
+
schemas = [s.name for s in self.code_model.public_model_types]
|
|
17
17
|
schemas.sort()
|
|
18
18
|
enums = (
|
|
19
|
-
[e.name for e in self.
|
|
20
|
-
if self.namespace_model.enums
|
|
21
|
-
else None
|
|
19
|
+
[e.name for e in self.code_model.enums] if self.code_model.enums else None
|
|
22
20
|
)
|
|
23
21
|
|
|
24
22
|
if enums:
|
|
@@ -34,6 +32,4 @@ class ModelInitSerializer:
|
|
|
34
32
|
)
|
|
35
33
|
|
|
36
34
|
template = self.env.get_template("model_init.py.jinja2")
|
|
37
|
-
return template.render(
|
|
38
|
-
namespace_model=self.namespace_model, schemas=schemas, enums=enums
|
|
39
|
-
)
|
|
35
|
+
return template.render(code_model=self.code_model, schemas=schemas, enums=enums)
|
|
@@ -5,10 +5,12 @@
|
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
from typing import cast, List
|
|
7
7
|
from abc import ABC, abstractmethod
|
|
8
|
+
|
|
8
9
|
from jinja2 import Environment
|
|
9
|
-
from ..models import ModelType,
|
|
10
|
+
from ..models import ModelType, CodeModel, Property
|
|
10
11
|
from ..models.imports import FileImport, TypingSection, MsrestImportType, ImportType
|
|
11
12
|
from .import_serializer import FileImportSerializer
|
|
13
|
+
from ..models.constant_type import ConstantType
|
|
12
14
|
|
|
13
15
|
|
|
14
16
|
def _documentation_string(
|
|
@@ -28,8 +30,8 @@ def _documentation_string(
|
|
|
28
30
|
|
|
29
31
|
|
|
30
32
|
class _ModelSerializer(ABC):
|
|
31
|
-
def __init__(self,
|
|
32
|
-
self.
|
|
33
|
+
def __init__(self, code_model: CodeModel, env: Environment) -> None:
|
|
34
|
+
self.code_model = code_model
|
|
33
35
|
self.env = env
|
|
34
36
|
|
|
35
37
|
@abstractmethod
|
|
@@ -40,7 +42,7 @@ class _ModelSerializer(ABC):
|
|
|
40
42
|
# Generate the models
|
|
41
43
|
template = self.env.get_template("model_container.py.jinja2")
|
|
42
44
|
return template.render(
|
|
43
|
-
|
|
45
|
+
code_model=self.code_model,
|
|
44
46
|
imports=FileImportSerializer(self.imports()),
|
|
45
47
|
str=str,
|
|
46
48
|
serializer=self,
|
|
@@ -93,13 +95,17 @@ class _ModelSerializer(ABC):
|
|
|
93
95
|
f"Known sub-classes are: {', '.join(v.name for v in model.discriminated_subtypes.values())}"
|
|
94
96
|
)
|
|
95
97
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
98
|
+
@staticmethod
|
|
99
|
+
def _init_line_parameters(model: ModelType):
|
|
100
|
+
return [
|
|
99
101
|
p
|
|
100
102
|
for p in model.properties
|
|
101
103
|
if not p.readonly and not p.is_discriminator and not p.constant
|
|
102
104
|
]
|
|
105
|
+
|
|
106
|
+
def init_line(self, model: ModelType) -> List[str]:
|
|
107
|
+
init_properties_declaration = []
|
|
108
|
+
init_line_parameters = self._init_line_parameters(model)
|
|
103
109
|
init_line_parameters.sort(key=lambda x: x.optional)
|
|
104
110
|
if init_line_parameters:
|
|
105
111
|
init_properties_declaration.append("*,")
|
|
@@ -130,21 +136,19 @@ class MsrestModelSerializer(_ModelSerializer):
|
|
|
130
136
|
def imports(self) -> FileImport:
|
|
131
137
|
file_import = FileImport()
|
|
132
138
|
file_import.add_msrest_import(
|
|
133
|
-
self.
|
|
139
|
+
self.code_model, "..", MsrestImportType.Module, TypingSection.REGULAR
|
|
134
140
|
)
|
|
135
|
-
for model in self.
|
|
141
|
+
for model in self.code_model.model_types:
|
|
136
142
|
file_import.merge(model.imports(is_operation_file=False))
|
|
137
|
-
|
|
138
|
-
p for p in model.properties if not p.readonly and not p.is_discriminator
|
|
139
|
-
]
|
|
140
|
-
for param in init_line_parameters:
|
|
143
|
+
for param in self._init_line_parameters(model):
|
|
141
144
|
file_import.merge(param.imports())
|
|
145
|
+
|
|
142
146
|
return file_import
|
|
143
147
|
|
|
144
148
|
def declare_model(self, model: ModelType) -> str:
|
|
145
149
|
basename = (
|
|
146
150
|
"msrest.serialization.Model"
|
|
147
|
-
if self.
|
|
151
|
+
if self.code_model.options["client_side_validation"]
|
|
148
152
|
else "_serialization.Model"
|
|
149
153
|
)
|
|
150
154
|
if model.parents:
|
|
@@ -207,10 +211,10 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
207
211
|
file_import.add_submodule_import("typing", "Mapping", ImportType.STDLIB)
|
|
208
212
|
file_import.add_submodule_import("typing", "Any", ImportType.STDLIB)
|
|
209
213
|
|
|
210
|
-
for model in self.
|
|
214
|
+
for model in self.code_model.model_types:
|
|
211
215
|
file_import.merge(model.imports(is_operation_file=False))
|
|
212
|
-
for
|
|
213
|
-
file_import.merge(
|
|
216
|
+
for prop in model.properties:
|
|
217
|
+
file_import.merge(prop.imports())
|
|
214
218
|
return file_import
|
|
215
219
|
|
|
216
220
|
def declare_model(self, model: ModelType) -> str:
|
|
@@ -222,30 +226,31 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
222
226
|
return f"class {model.name}({basename}):{model.pylint_disable}"
|
|
223
227
|
|
|
224
228
|
@staticmethod
|
|
225
|
-
def
|
|
229
|
+
def get_properties_to_declare(model: ModelType) -> List[Property]:
|
|
226
230
|
if model.parents:
|
|
231
|
+
parent_properties = [
|
|
232
|
+
p for bm in model.parents for p in cast(ModelType, bm).properties
|
|
233
|
+
]
|
|
227
234
|
properties_to_declare = [
|
|
228
235
|
p
|
|
229
|
-
for bm in model.parents
|
|
230
236
|
for p in model.properties
|
|
231
|
-
if
|
|
237
|
+
if not any(
|
|
238
|
+
p.client_name == pp.client_name
|
|
239
|
+
and p.type_annotation() == pp.type_annotation()
|
|
240
|
+
for pp in parent_properties
|
|
241
|
+
)
|
|
232
242
|
]
|
|
233
|
-
|
|
234
243
|
else:
|
|
235
244
|
properties_to_declare = model.properties
|
|
236
245
|
if any(p for p in properties_to_declare if p.client_name == "_"):
|
|
237
246
|
raise ValueError("We do not generate anonymous properties")
|
|
238
|
-
return
|
|
239
|
-
p
|
|
240
|
-
for p in properties_to_declare
|
|
241
|
-
if (not p.is_discriminator or p.is_polymorphic)
|
|
242
|
-
]
|
|
247
|
+
return properties_to_declare
|
|
243
248
|
|
|
244
249
|
@staticmethod
|
|
245
250
|
def declare_property(prop: Property) -> List[str]:
|
|
246
251
|
attribute_key = _ModelSerializer.escape_dot(prop.rest_api_name)
|
|
247
252
|
args = []
|
|
248
|
-
if prop.client_name != attribute_key:
|
|
253
|
+
if prop.client_name != attribute_key or prop.is_discriminator:
|
|
249
254
|
args.append(f'name="{attribute_key}"')
|
|
250
255
|
if prop.readonly:
|
|
251
256
|
args.append("readonly=True")
|
|
@@ -261,3 +266,13 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
261
266
|
if comment:
|
|
262
267
|
ret.append(f'"""{comment}"""')
|
|
263
268
|
return ret
|
|
269
|
+
|
|
270
|
+
def initialize_properties(self, model: ModelType) -> List[str]:
|
|
271
|
+
init_args = []
|
|
272
|
+
for prop in self.get_properties_to_declare(model):
|
|
273
|
+
if prop.constant or prop.is_discriminator:
|
|
274
|
+
init_args.append(
|
|
275
|
+
f"self.{prop.client_name} = {cast(ConstantType, prop.type).get_declaration()} "
|
|
276
|
+
f"# type: {prop.type_annotation()}"
|
|
277
|
+
)
|
|
278
|
+
return init_args
|
|
@@ -8,11 +8,12 @@ import functools
|
|
|
8
8
|
from jinja2 import Environment
|
|
9
9
|
|
|
10
10
|
from ..models import (
|
|
11
|
-
|
|
11
|
+
CodeModel,
|
|
12
12
|
OperationGroup,
|
|
13
13
|
FileImport,
|
|
14
14
|
RequestBuilder,
|
|
15
15
|
OverloadedRequestBuilder,
|
|
16
|
+
Client,
|
|
16
17
|
)
|
|
17
18
|
from .import_serializer import FileImportSerializer
|
|
18
19
|
from .builder_serializer import get_operation_serializer, RequestBuilderSerializer
|
|
@@ -21,12 +22,14 @@ from .builder_serializer import get_operation_serializer, RequestBuilderSerializ
|
|
|
21
22
|
class OperationGroupsSerializer:
|
|
22
23
|
def __init__(
|
|
23
24
|
self,
|
|
24
|
-
|
|
25
|
+
code_model: CodeModel,
|
|
26
|
+
clients: List[Client],
|
|
25
27
|
env: Environment,
|
|
26
28
|
async_mode: bool,
|
|
27
29
|
operation_group: Optional[OperationGroup] = None,
|
|
28
30
|
):
|
|
29
|
-
self.
|
|
31
|
+
self.clients = clients
|
|
32
|
+
self.code_model = code_model
|
|
30
33
|
self.env = env
|
|
31
34
|
self.async_mode = async_mode
|
|
32
35
|
self.operation_group = operation_group
|
|
@@ -36,7 +39,8 @@ class OperationGroupsSerializer:
|
|
|
36
39
|
) -> List[Union[OverloadedRequestBuilder, RequestBuilder]]:
|
|
37
40
|
return [
|
|
38
41
|
r
|
|
39
|
-
for
|
|
42
|
+
for client in self.clients
|
|
43
|
+
for r in client.request_builders
|
|
40
44
|
if r.client.name == operation_group.client.name
|
|
41
45
|
and r.group_name == operation_group.property_name
|
|
42
46
|
and not r.is_overload
|
|
@@ -47,7 +51,7 @@ class OperationGroupsSerializer:
|
|
|
47
51
|
operation_groups = (
|
|
48
52
|
[self.operation_group]
|
|
49
53
|
if self.operation_group
|
|
50
|
-
else self.
|
|
54
|
+
else [og for client in self.clients for og in client.operation_groups]
|
|
51
55
|
)
|
|
52
56
|
imports = FileImport()
|
|
53
57
|
for operation_group in operation_groups:
|
|
@@ -61,7 +65,7 @@ class OperationGroupsSerializer:
|
|
|
61
65
|
"operation_groups_container.py.jinja2"
|
|
62
66
|
)
|
|
63
67
|
return template.render(
|
|
64
|
-
|
|
68
|
+
code_model=self.code_model,
|
|
65
69
|
operation_groups=operation_groups,
|
|
66
70
|
imports=FileImportSerializer(
|
|
67
71
|
imports,
|
|
@@ -70,11 +74,11 @@ class OperationGroupsSerializer:
|
|
|
70
74
|
async_mode=self.async_mode,
|
|
71
75
|
get_operation_serializer=functools.partial(
|
|
72
76
|
get_operation_serializer,
|
|
73
|
-
|
|
77
|
+
code_model=self.code_model,
|
|
74
78
|
async_mode=self.async_mode,
|
|
75
79
|
),
|
|
76
80
|
request_builder_serializer=RequestBuilderSerializer(
|
|
77
|
-
self.
|
|
81
|
+
self.code_model,
|
|
78
82
|
async_mode=False,
|
|
79
83
|
),
|
|
80
84
|
get_request_builders=self._get_request_builders,
|
|
@@ -7,14 +7,19 @@ from typing import List
|
|
|
7
7
|
from jinja2 import Environment
|
|
8
8
|
|
|
9
9
|
from autorest.codegen.models.operation_group import OperationGroup
|
|
10
|
-
from ..models import
|
|
10
|
+
from ..models import CodeModel, Client
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class OperationsInitSerializer:
|
|
14
14
|
def __init__(
|
|
15
|
-
self,
|
|
15
|
+
self,
|
|
16
|
+
code_model: CodeModel,
|
|
17
|
+
clients: List[Client],
|
|
18
|
+
env: Environment,
|
|
19
|
+
async_mode: bool,
|
|
16
20
|
) -> None:
|
|
17
|
-
self.
|
|
21
|
+
self.code_model = code_model
|
|
22
|
+
self.clients = clients
|
|
18
23
|
self.env = env
|
|
19
24
|
self.async_mode = async_mode
|
|
20
25
|
|
|
@@ -22,13 +27,14 @@ class OperationsInitSerializer:
|
|
|
22
27
|
def _get_filename(operation_group: OperationGroup) -> str:
|
|
23
28
|
return (
|
|
24
29
|
"_operations"
|
|
25
|
-
if self.
|
|
30
|
+
if self.code_model.options["combine_operation_files"]
|
|
26
31
|
else operation_group.filename
|
|
27
32
|
)
|
|
28
33
|
|
|
29
34
|
return [
|
|
30
35
|
f"from .{_get_filename(og)} import {og.class_name}"
|
|
31
|
-
for
|
|
36
|
+
for client in self.clients
|
|
37
|
+
for og in client.operation_groups
|
|
32
38
|
]
|
|
33
39
|
|
|
34
40
|
def serialize(self) -> str:
|
|
@@ -37,7 +43,8 @@ class OperationsInitSerializer:
|
|
|
37
43
|
)
|
|
38
44
|
|
|
39
45
|
return operation_group_init_template.render(
|
|
40
|
-
|
|
46
|
+
code_model=self.code_model,
|
|
41
47
|
async_mode=self.async_mode,
|
|
42
48
|
operation_group_imports=self.operation_group_imports,
|
|
49
|
+
clients=self.clients,
|
|
43
50
|
)
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
from jinja2 import Environment
|
|
7
7
|
from .import_serializer import FileImportSerializer
|
|
8
|
-
from ..models import
|
|
8
|
+
from ..models import CodeModel, FileImport, ImportType, TypingSection
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class PatchSerializer:
|
|
12
|
-
def __init__(self, env: Environment,
|
|
12
|
+
def __init__(self, env: Environment, code_model: CodeModel) -> None:
|
|
13
13
|
self.env = env
|
|
14
|
-
self.
|
|
14
|
+
self.code_model = code_model
|
|
15
15
|
|
|
16
16
|
def serialize(self) -> str:
|
|
17
17
|
template = self.env.get_template("patch.py.jinja2")
|
|
@@ -20,6 +20,6 @@ class PatchSerializer:
|
|
|
20
20
|
"typing", "List", ImportType.STDLIB, TypingSection.CONDITIONAL
|
|
21
21
|
)
|
|
22
22
|
return template.render(
|
|
23
|
-
|
|
23
|
+
code_model=self.code_model,
|
|
24
24
|
imports=FileImportSerializer(imports),
|
|
25
25
|
)
|
|
@@ -8,18 +8,18 @@ from jinja2 import Environment
|
|
|
8
8
|
|
|
9
9
|
from ..models import FileImport
|
|
10
10
|
from .import_serializer import FileImportSerializer
|
|
11
|
-
from ..models import
|
|
11
|
+
from ..models import CodeModel, RequestBuilderType
|
|
12
12
|
from .builder_serializer import RequestBuilderSerializer
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class RequestBuildersSerializer:
|
|
16
16
|
def __init__(
|
|
17
17
|
self,
|
|
18
|
-
|
|
18
|
+
code_model: CodeModel,
|
|
19
19
|
env: Environment,
|
|
20
20
|
request_builders: List[RequestBuilderType],
|
|
21
21
|
) -> None:
|
|
22
|
-
self.
|
|
22
|
+
self.code_model = code_model
|
|
23
23
|
self.env = env
|
|
24
24
|
self.request_builders = request_builders
|
|
25
25
|
self.group_name = request_builders[0].group_name
|
|
@@ -35,7 +35,7 @@ class RequestBuildersSerializer:
|
|
|
35
35
|
def serialize_init(self) -> str:
|
|
36
36
|
template = self.env.get_template("rest_init.py.jinja2")
|
|
37
37
|
return template.render(
|
|
38
|
-
|
|
38
|
+
code_model=self.code_model,
|
|
39
39
|
request_builders=[r for r in self.request_builders if not r.is_overload],
|
|
40
40
|
)
|
|
41
41
|
|
|
@@ -43,12 +43,12 @@ class RequestBuildersSerializer:
|
|
|
43
43
|
template = self.env.get_template("request_builders.py.jinja2")
|
|
44
44
|
|
|
45
45
|
return template.render(
|
|
46
|
-
|
|
46
|
+
code_model=self.code_model,
|
|
47
47
|
request_builders=[rb for rb in self.request_builders if not rb.abstract],
|
|
48
48
|
imports=FileImportSerializer(
|
|
49
49
|
self.imports,
|
|
50
50
|
),
|
|
51
51
|
request_builder_serializer=RequestBuilderSerializer(
|
|
52
|
-
self.
|
|
52
|
+
self.code_model, async_mode=False
|
|
53
53
|
),
|
|
54
54
|
)
|
|
@@ -14,7 +14,7 @@ from autorest.codegen.models.imports import FileImport, ImportType
|
|
|
14
14
|
from autorest.codegen.models.operation import OperationBase
|
|
15
15
|
from autorest.codegen.models.operation_group import OperationGroup
|
|
16
16
|
from autorest.codegen.serializers.import_serializer import FileImportSerializer
|
|
17
|
-
from ..models import
|
|
17
|
+
from ..models import CodeModel
|
|
18
18
|
|
|
19
19
|
_LOGGER = logging.getLogger(__name__)
|
|
20
20
|
|
|
@@ -22,7 +22,7 @@ _LOGGER = logging.getLogger(__name__)
|
|
|
22
22
|
class SampleSerializer:
|
|
23
23
|
def __init__(
|
|
24
24
|
self,
|
|
25
|
-
|
|
25
|
+
code_model: CodeModel,
|
|
26
26
|
env: Environment,
|
|
27
27
|
operation_group: OperationGroup,
|
|
28
28
|
operation: OperationBase[Any],
|
|
@@ -30,7 +30,7 @@ class SampleSerializer:
|
|
|
30
30
|
file_name: str,
|
|
31
31
|
sample_origin_name: str,
|
|
32
32
|
) -> None:
|
|
33
|
-
self.
|
|
33
|
+
self.code_model = code_model
|
|
34
34
|
self.env = env
|
|
35
35
|
self.operation_group = operation_group
|
|
36
36
|
self.operation = operation
|
|
@@ -40,10 +40,10 @@ class SampleSerializer:
|
|
|
40
40
|
|
|
41
41
|
def _imports(self) -> FileImportSerializer:
|
|
42
42
|
imports = FileImport()
|
|
43
|
-
namespace = (self.
|
|
43
|
+
namespace = (self.code_model.options["package_name"] or "").replace(
|
|
44
44
|
"-", "."
|
|
45
|
-
) or self.
|
|
46
|
-
client = self.
|
|
45
|
+
) or self.code_model.namespace
|
|
46
|
+
client = self.code_model.clients[0]
|
|
47
47
|
imports.add_submodule_import(namespace, client.name, ImportType.THIRDPARTY)
|
|
48
48
|
credential_type = getattr(client.credential, "type", None)
|
|
49
49
|
if isinstance(credential_type, TokenCredentialType):
|
|
@@ -60,9 +60,7 @@ class SampleSerializer:
|
|
|
60
60
|
def _client_params(self) -> Dict[str, Any]:
|
|
61
61
|
# client params
|
|
62
62
|
special_param = dict()
|
|
63
|
-
credential_type = getattr(
|
|
64
|
-
self.namespace_model.clients[0].credential, "type", None
|
|
65
|
-
)
|
|
63
|
+
credential_type = getattr(self.code_model.clients[0].credential, "type", None)
|
|
66
64
|
if isinstance(credential_type, TokenCredentialType):
|
|
67
65
|
special_param.update({"credential": "DefaultAzureCredential()"})
|
|
68
66
|
elif isinstance(credential_type, AzureKeyCredentialType):
|
|
@@ -72,7 +70,7 @@ class SampleSerializer:
|
|
|
72
70
|
|
|
73
71
|
params_positional = [
|
|
74
72
|
p
|
|
75
|
-
for p in self.
|
|
73
|
+
for p in self.code_model.clients[0].parameters.positional
|
|
76
74
|
if not (p.optional or p.client_default_value)
|
|
77
75
|
]
|
|
78
76
|
cls = lambda x: f'"{x}"'
|
|
@@ -97,7 +95,7 @@ class SampleSerializer:
|
|
|
97
95
|
if not p.client_default_value
|
|
98
96
|
]
|
|
99
97
|
cls = lambda x: f'"{x}"' if isinstance(x, str) else str(x)
|
|
100
|
-
failure_info =
|
|
98
|
+
failure_info = "fail to find required param named {} in example file {}"
|
|
101
99
|
operation_params = {}
|
|
102
100
|
for param in params_positional:
|
|
103
101
|
name = param.rest_api_name
|
|
@@ -134,7 +132,7 @@ class SampleSerializer:
|
|
|
134
132
|
|
|
135
133
|
def serialize(self) -> str:
|
|
136
134
|
return self.env.get_template("sample.py.jinja2").render(
|
|
137
|
-
|
|
135
|
+
code_model=self.code_model,
|
|
138
136
|
file_name=self.file_name,
|
|
139
137
|
operation_result=self._operation_result(),
|
|
140
138
|
operation_params=self._operation_params(),
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
{% import 'operation_tools.jinja2' as op_tools %}
|
|
3
3
|
{# actual template starts here #}
|
|
4
4
|
# coding=utf-8
|
|
5
|
-
{{
|
|
5
|
+
{{ code_model.options['license_header'] }}
|
|
6
6
|
|
|
7
7
|
{{ imports }}
|
|
8
8
|
|
|
9
|
-
{% for client in
|
|
9
|
+
{% for client in clients %}
|
|
10
10
|
{% set serializer = get_serializer(client) %}
|
|
11
11
|
{% include "client.py.jinja2" %}
|
|
12
12
|
{% endfor %}
|