@autorest/python 6.1.11 → 6.2.1
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/_utils.py +2 -1
- package/autorest/codegen/__init__.py +23 -81
- package/autorest/codegen/models/__init__.py +5 -3
- package/autorest/codegen/models/{base_type.py → base.py} +24 -3
- package/autorest/codegen/models/base_builder.py +9 -5
- package/autorest/codegen/models/client.py +183 -13
- package/autorest/codegen/models/code_model.py +154 -141
- package/autorest/codegen/models/combined_type.py +5 -2
- package/autorest/codegen/models/constant_type.py +38 -4
- package/autorest/codegen/models/credential_types.py +1 -1
- package/autorest/codegen/models/dictionary_type.py +1 -1
- package/autorest/codegen/models/enum_type.py +5 -3
- package/autorest/codegen/models/imports.py +78 -29
- package/autorest/codegen/models/list_type.py +1 -1
- package/autorest/codegen/models/lro_operation.py +5 -1
- package/autorest/codegen/models/model_type.py +1 -2
- package/autorest/codegen/models/operation.py +34 -10
- package/autorest/codegen/models/operation_group.py +16 -5
- package/autorest/codegen/models/paging_operation.py +5 -4
- package/autorest/codegen/models/parameter.py +19 -6
- package/autorest/codegen/models/primitive_types.py +1 -2
- package/autorest/codegen/models/property.py +4 -4
- package/autorest/codegen/models/request_builder.py +17 -6
- package/autorest/codegen/models/request_builder_parameter.py +5 -2
- package/autorest/codegen/models/response.py +6 -3
- package/autorest/codegen/serializers/__init__.py +207 -135
- package/autorest/codegen/serializers/builder_serializer.py +2 -4
- package/autorest/codegen/serializers/client_serializer.py +41 -45
- package/autorest/codegen/serializers/general_serializer.py +80 -37
- package/autorest/codegen/serializers/import_serializer.py +30 -36
- package/autorest/codegen/serializers/metadata_serializer.py +36 -14
- package/autorest/codegen/serializers/model_serializer.py +34 -19
- package/autorest/codegen/serializers/operation_groups_serializer.py +22 -6
- package/autorest/codegen/serializers/operations_init_serializer.py +10 -4
- package/autorest/codegen/serializers/sample_serializer.py +144 -0
- package/autorest/codegen/templates/client.py.jinja2 +7 -15
- package/autorest/codegen/templates/client_container.py.jinja2 +12 -0
- package/autorest/codegen/templates/config.py.jinja2 +13 -26
- package/autorest/codegen/templates/config_container.py.jinja2 +16 -0
- package/autorest/codegen/templates/enum_container.py.jinja2 +1 -1
- package/autorest/codegen/templates/init.py.jinja2 +9 -3
- package/autorest/codegen/templates/lro_operation.py.jinja2 +1 -1
- package/autorest/codegen/templates/metadata.json.jinja2 +13 -14
- package/autorest/codegen/templates/model_dpg.py.jinja2 +4 -4
- package/autorest/codegen/templates/model_init.py.jinja2 +1 -1
- 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 +5 -5
- package/autorest/codegen/templates/operation_tools.jinja2 +2 -2
- package/autorest/codegen/templates/operations_folder_init.py.jinja2 +4 -4
- package/autorest/codegen/templates/{CHANGELOG.md.jinja2 → packaging_templates/CHANGELOG.md.jinja2} +0 -0
- package/autorest/codegen/templates/{LICENSE.jinja2 → packaging_templates/LICENSE.jinja2} +0 -0
- package/autorest/codegen/templates/{MANIFEST.in.jinja2 → packaging_templates/MANIFEST.in.jinja2} +0 -0
- package/autorest/codegen/templates/{README.md.jinja2 → packaging_templates/README.md.jinja2} +0 -0
- package/autorest/codegen/templates/{dev_requirements.txt.jinja2 → packaging_templates/dev_requirements.txt.jinja2} +0 -0
- package/autorest/codegen/templates/{setup.py.jinja2 → packaging_templates/setup.py.jinja2} +12 -9
- package/autorest/codegen/templates/request_builders.py.jinja2 +2 -2
- package/autorest/codegen/templates/sample.py.jinja2 +44 -0
- package/autorest/codegen/templates/vendor.py.jinja2 +4 -2
- package/autorest/m4reformatter/__init__.py +18 -4
- 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 +20 -8
- 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 -28
|
@@ -6,18 +6,18 @@
|
|
|
6
6
|
from typing import List
|
|
7
7
|
|
|
8
8
|
from . import utils
|
|
9
|
-
from ..models import
|
|
9
|
+
from ..models import Client, ParameterMethodLocation
|
|
10
10
|
from .parameter_serializer import ParameterSerializer, PopKwargType
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class ClientSerializer:
|
|
14
|
-
def __init__(self,
|
|
15
|
-
self.
|
|
14
|
+
def __init__(self, client: Client) -> None:
|
|
15
|
+
self.client = client
|
|
16
16
|
self.parameter_serializer = ParameterSerializer()
|
|
17
17
|
|
|
18
18
|
def _init_signature(self, async_mode: bool) -> str:
|
|
19
19
|
pylint_disable = ""
|
|
20
|
-
if not self.
|
|
20
|
+
if not self.client.parameters.credential:
|
|
21
21
|
pylint_disable = (
|
|
22
22
|
" # pylint: disable=missing-client-constructor-parameter-credential"
|
|
23
23
|
)
|
|
@@ -25,9 +25,7 @@ class ClientSerializer:
|
|
|
25
25
|
function_def="def",
|
|
26
26
|
method_name="__init__",
|
|
27
27
|
need_self_param=True,
|
|
28
|
-
method_param_signatures=self.
|
|
29
|
-
async_mode
|
|
30
|
-
),
|
|
28
|
+
method_param_signatures=self.client.parameters.method_signature(async_mode),
|
|
31
29
|
pylint_disable=pylint_disable,
|
|
32
30
|
)
|
|
33
31
|
|
|
@@ -40,7 +38,7 @@ class ClientSerializer:
|
|
|
40
38
|
|
|
41
39
|
def pop_kwargs_from_signature(self) -> List[str]:
|
|
42
40
|
return self.parameter_serializer.pop_kwargs_from_signature(
|
|
43
|
-
self.
|
|
41
|
+
self.client.parameters.kwargs_to_pop,
|
|
44
42
|
check_kwarg_dict=False,
|
|
45
43
|
pop_headers_kwarg=PopKwargType.NO,
|
|
46
44
|
pop_params_kwarg=PopKwargType.NO,
|
|
@@ -48,12 +46,12 @@ class ClientSerializer:
|
|
|
48
46
|
|
|
49
47
|
@property
|
|
50
48
|
def class_definition(self) -> str:
|
|
51
|
-
class_name = self.
|
|
52
|
-
has_mixin_og = any(og for og in self.
|
|
49
|
+
class_name = self.client.name
|
|
50
|
+
has_mixin_og = any(og for og in self.client.operation_groups if og.is_mixin)
|
|
53
51
|
base_class = ""
|
|
54
52
|
if has_mixin_og:
|
|
55
53
|
base_class = f"{class_name}OperationsMixin"
|
|
56
|
-
pylint_disable = self.
|
|
54
|
+
pylint_disable = self.client.pylint_disable
|
|
57
55
|
if base_class:
|
|
58
56
|
return f"class {class_name}({base_class}):{pylint_disable}"
|
|
59
57
|
return f"class {class_name}:{pylint_disable}"
|
|
@@ -61,19 +59,20 @@ class ClientSerializer:
|
|
|
61
59
|
def property_descriptions(self, async_mode: bool) -> List[str]:
|
|
62
60
|
retval: List[str] = []
|
|
63
61
|
operations_folder = ".aio.operations." if async_mode else ".operations."
|
|
64
|
-
for og in [og for og in self.
|
|
62
|
+
for og in [og for og in self.client.operation_groups if not og.is_mixin]:
|
|
65
63
|
retval.append(f":ivar {og.property_name}: {og.class_name} operations")
|
|
66
|
-
|
|
67
|
-
f"
|
|
64
|
+
property_type = (
|
|
65
|
+
f"{self.client.code_model.namespace}{operations_folder}{og.class_name}"
|
|
68
66
|
)
|
|
69
|
-
|
|
67
|
+
retval.append(f":vartype {og.property_name}: {property_type}")
|
|
68
|
+
for param in self.client.parameters.method:
|
|
70
69
|
retval.append(
|
|
71
70
|
f":{param.description_keyword} {param.client_name}: {param.description}"
|
|
72
71
|
)
|
|
73
72
|
retval.append(
|
|
74
73
|
f":{param.docstring_type_keyword} {param.client_name}: {param.docstring_type(async_mode=async_mode)}"
|
|
75
74
|
)
|
|
76
|
-
if self.
|
|
75
|
+
if self.client.has_lro_operations:
|
|
77
76
|
retval.append(
|
|
78
77
|
":keyword int polling_interval: Default waiting time between two polls for LRO operations "
|
|
79
78
|
"if no Retry-After header is present."
|
|
@@ -82,11 +81,11 @@ class ClientSerializer:
|
|
|
82
81
|
return retval
|
|
83
82
|
|
|
84
83
|
def initialize_config(self) -> str:
|
|
85
|
-
config_name = f"{self.
|
|
84
|
+
config_name = f"{self.client.name}Configuration"
|
|
86
85
|
config_call = ", ".join(
|
|
87
86
|
[
|
|
88
87
|
f"{p.client_name}={p.client_name}"
|
|
89
|
-
for p in self.
|
|
88
|
+
for p in self.client.config.parameters.method
|
|
90
89
|
if p.method_location != ParameterMethodLocation.KWARG
|
|
91
90
|
]
|
|
92
91
|
+ ["**kwargs"]
|
|
@@ -96,9 +95,7 @@ class ClientSerializer:
|
|
|
96
95
|
@property
|
|
97
96
|
def host_variable_name(self) -> str:
|
|
98
97
|
try:
|
|
99
|
-
return next(
|
|
100
|
-
p for p in self.code_model.client.parameters if p.is_host
|
|
101
|
-
).client_name
|
|
98
|
+
return next(p for p in self.client.parameters if p.is_host).client_name
|
|
102
99
|
except StopIteration:
|
|
103
100
|
return "_endpoint"
|
|
104
101
|
|
|
@@ -106,12 +103,12 @@ class ClientSerializer:
|
|
|
106
103
|
def should_init_super(self) -> bool:
|
|
107
104
|
return any(
|
|
108
105
|
og
|
|
109
|
-
for og in self.
|
|
106
|
+
for og in self.client.operation_groups
|
|
110
107
|
if og.is_mixin and og.has_abstract_operations
|
|
111
108
|
)
|
|
112
109
|
|
|
113
110
|
def initialize_pipeline_client(self, async_mode: bool) -> str:
|
|
114
|
-
pipeline_client_name = self.
|
|
111
|
+
pipeline_client_name = self.client.pipeline_class(async_mode)
|
|
115
112
|
return (
|
|
116
113
|
f"self._client = {pipeline_client_name}(base_url={self.host_variable_name}, "
|
|
117
114
|
"config=self._config, **kwargs)"
|
|
@@ -119,22 +116,22 @@ class ClientSerializer:
|
|
|
119
116
|
|
|
120
117
|
def serializers_and_operation_groups_properties(self) -> List[str]:
|
|
121
118
|
retval = []
|
|
122
|
-
if self.code_model.model_types:
|
|
119
|
+
if self.client.code_model.model_types:
|
|
123
120
|
client_models_value = (
|
|
124
121
|
"{k: v for k, v in models.__dict__.items() if isinstance(v, type)}"
|
|
125
122
|
)
|
|
126
123
|
else:
|
|
127
124
|
client_models_value = "{} # type: Dict[str, Any]"
|
|
128
|
-
is_msrest_model = self.code_model.options["models_mode"] == "msrest"
|
|
125
|
+
is_msrest_model = self.client.code_model.options["models_mode"] == "msrest"
|
|
129
126
|
if is_msrest_model:
|
|
130
127
|
retval.append(f"client_models = {client_models_value}")
|
|
131
128
|
client_models_str = "client_models" if is_msrest_model else ""
|
|
132
129
|
retval.append(f"self._serialize = Serializer({client_models_str})")
|
|
133
130
|
retval.append(f"self._deserialize = Deserializer({client_models_str})")
|
|
134
|
-
if not self.code_model.options["client_side_validation"]:
|
|
131
|
+
if not self.client.code_model.options["client_side_validation"]:
|
|
135
132
|
retval.append("self._serialize.client_side_validation = False")
|
|
136
133
|
operation_groups = [
|
|
137
|
-
og for og in self.
|
|
134
|
+
og for og in self.client.operation_groups if not og.is_mixin
|
|
138
135
|
]
|
|
139
136
|
for og in operation_groups:
|
|
140
137
|
retval.extend(
|
|
@@ -149,10 +146,10 @@ class ClientSerializer:
|
|
|
149
146
|
def _send_request_signature(self) -> str:
|
|
150
147
|
send_request_signature = [
|
|
151
148
|
"request: HttpRequest,"
|
|
152
|
-
] + self.
|
|
149
|
+
] + self.client.parameters.method_signature_kwargs
|
|
153
150
|
return self.parameter_serializer.serialize_method(
|
|
154
151
|
function_def="def",
|
|
155
|
-
method_name=self.
|
|
152
|
+
method_name=self.client.send_request_name,
|
|
156
153
|
need_self_param=True,
|
|
157
154
|
method_param_signatures=send_request_signature,
|
|
158
155
|
)
|
|
@@ -171,7 +168,7 @@ class ClientSerializer:
|
|
|
171
168
|
def _example_make_call(self, async_mode: bool) -> List[str]:
|
|
172
169
|
http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
|
|
173
170
|
retval = [
|
|
174
|
-
f">>> response = {'await ' if async_mode else ''}client.{self.
|
|
171
|
+
f">>> response = {'await ' if async_mode else ''}client.{self.client.send_request_name}(request)"
|
|
175
172
|
]
|
|
176
173
|
retval.append(f"<{http_response}: 200 OK>")
|
|
177
174
|
return retval
|
|
@@ -179,14 +176,14 @@ class ClientSerializer:
|
|
|
179
176
|
def _request_builder_example(self, async_mode: bool) -> List[str]:
|
|
180
177
|
retval = [
|
|
181
178
|
"We have helper methods to create requests specific to this service in "
|
|
182
|
-
+ f"`{self.code_model.namespace}.{self.code_model.rest_layer_name}`."
|
|
179
|
+
+ f"`{self.client.code_model.namespace}.{self.client.code_model.rest_layer_name}`."
|
|
183
180
|
]
|
|
184
181
|
retval.append(
|
|
185
182
|
"Use these helper methods to create the request you pass to this method."
|
|
186
183
|
)
|
|
187
184
|
retval.append("")
|
|
188
185
|
|
|
189
|
-
request_builder = self.
|
|
186
|
+
request_builder = self.client.request_builders[0]
|
|
190
187
|
request_builder_signature = ", ".join(request_builder.parameters.call)
|
|
191
188
|
if request_builder.group_name:
|
|
192
189
|
rest_imported = request_builder.group_name
|
|
@@ -196,9 +193,8 @@ class ClientSerializer:
|
|
|
196
193
|
else:
|
|
197
194
|
rest_imported = request_builder.name
|
|
198
195
|
request_builder_name = request_builder.name
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
)
|
|
196
|
+
full_path = f"{self.client.code_model.namespace}.{self.client.code_model.rest_layer_name}"
|
|
197
|
+
retval.append(f">>> from {full_path} import {rest_imported}")
|
|
202
198
|
retval.append(
|
|
203
199
|
f">>> request = {request_builder_name}({request_builder_signature})"
|
|
204
200
|
)
|
|
@@ -218,7 +214,7 @@ class ClientSerializer:
|
|
|
218
214
|
def send_request_description(self, async_mode: bool) -> List[str]:
|
|
219
215
|
retval = ['"""Runs the network request through the client\'s chained policies.']
|
|
220
216
|
retval.append("")
|
|
221
|
-
if self.code_model.options["builders_visibility"] != "embedded":
|
|
217
|
+
if self.client.code_model.options["builders_visibility"] != "embedded":
|
|
222
218
|
retval.extend(self._request_builder_example(async_mode))
|
|
223
219
|
else:
|
|
224
220
|
retval.extend(self._rest_request_example(async_mode))
|
|
@@ -242,13 +238,13 @@ class ClientSerializer:
|
|
|
242
238
|
|
|
243
239
|
def serialize_path(self) -> List[str]:
|
|
244
240
|
return self.parameter_serializer.serialize_path(
|
|
245
|
-
self.
|
|
241
|
+
self.client.parameters.path, "self._serialize"
|
|
246
242
|
)
|
|
247
243
|
|
|
248
244
|
|
|
249
245
|
class ConfigSerializer:
|
|
250
|
-
def __init__(self,
|
|
251
|
-
self.
|
|
246
|
+
def __init__(self, client: Client) -> None:
|
|
247
|
+
self.client = client
|
|
252
248
|
self.parameter_serializer = ParameterSerializer()
|
|
253
249
|
|
|
254
250
|
def _init_signature(self, async_mode: bool) -> str:
|
|
@@ -256,7 +252,7 @@ class ConfigSerializer:
|
|
|
256
252
|
function_def="def",
|
|
257
253
|
method_name="__init__",
|
|
258
254
|
need_self_param=True,
|
|
259
|
-
method_param_signatures=self.
|
|
255
|
+
method_param_signatures=self.client.config.parameters.method_signature(
|
|
260
256
|
async_mode
|
|
261
257
|
),
|
|
262
258
|
)
|
|
@@ -270,7 +266,7 @@ class ConfigSerializer:
|
|
|
270
266
|
|
|
271
267
|
def pop_kwargs_from_signature(self) -> List[str]:
|
|
272
268
|
return self.parameter_serializer.pop_kwargs_from_signature(
|
|
273
|
-
self.
|
|
269
|
+
self.client.config.parameters.kwargs_to_pop,
|
|
274
270
|
check_kwarg_dict=False,
|
|
275
271
|
pop_headers_kwarg=PopKwargType.NO,
|
|
276
272
|
pop_params_kwarg=PopKwargType.NO,
|
|
@@ -279,21 +275,21 @@ class ConfigSerializer:
|
|
|
279
275
|
def set_constants(self) -> List[str]:
|
|
280
276
|
return [
|
|
281
277
|
f"self.{p.client_name} = {p.client_default_value_declaration}"
|
|
282
|
-
for p in self.
|
|
283
|
-
if p not in self.
|
|
278
|
+
for p in self.client.config.parameters.constant
|
|
279
|
+
if p not in self.client.config.parameters.method
|
|
284
280
|
]
|
|
285
281
|
|
|
286
282
|
def check_required_parameters(self) -> List[str]:
|
|
287
283
|
return [
|
|
288
284
|
f"if {p.client_name} is None:\n"
|
|
289
285
|
f" raise ValueError(\"Parameter '{p.client_name}' must not be None.\")"
|
|
290
|
-
for p in self.
|
|
286
|
+
for p in self.client.config.parameters.method
|
|
291
287
|
if not (p.optional or p.constant)
|
|
292
288
|
]
|
|
293
289
|
|
|
294
290
|
def property_descriptions(self, async_mode: bool) -> List[str]:
|
|
295
291
|
retval: List[str] = []
|
|
296
|
-
for p in self.
|
|
292
|
+
for p in self.client.config.parameters.method:
|
|
297
293
|
retval.append(f":{p.description_keyword} {p.client_name}: {p.description}")
|
|
298
294
|
retval.append(
|
|
299
295
|
f":{p.docstring_type_keyword} {p.client_name}: {p.docstring_type(async_mode=async_mode)}"
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
4
|
# license information.
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
|
+
from typing import Any, List
|
|
6
7
|
from jinja2 import Environment
|
|
7
8
|
from .import_serializer import FileImportSerializer, TypingSection
|
|
8
9
|
from ..models.imports import MsrestImportType
|
|
@@ -10,37 +11,91 @@ from ..models import (
|
|
|
10
11
|
FileImport,
|
|
11
12
|
ImportType,
|
|
12
13
|
CodeModel,
|
|
14
|
+
TokenCredentialType,
|
|
15
|
+
Client,
|
|
13
16
|
)
|
|
14
17
|
from .client_serializer import ClientSerializer, ConfigSerializer
|
|
15
18
|
|
|
19
|
+
_PACKAGE_MODE_FILES = [
|
|
20
|
+
"CHANGELOG.md.jinja2",
|
|
21
|
+
"dev_requirements.txt.jinja2",
|
|
22
|
+
"LICENSE.jinja2",
|
|
23
|
+
"MANIFEST.in.jinja2",
|
|
24
|
+
"README.md.jinja2",
|
|
25
|
+
]
|
|
26
|
+
|
|
16
27
|
|
|
17
28
|
class GeneralSerializer:
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
29
|
+
"""General serializer for SDK root level files"""
|
|
30
|
+
|
|
31
|
+
def __init__(self, code_model: CodeModel, env: Environment, async_mode: bool):
|
|
21
32
|
self.code_model = code_model
|
|
22
33
|
self.env = env
|
|
23
34
|
self.async_mode = async_mode
|
|
24
35
|
|
|
36
|
+
def serialize_setup_file(self) -> str:
|
|
37
|
+
template = self.env.get_template("packaging_templates/setup.py.jinja2")
|
|
38
|
+
params = {}
|
|
39
|
+
params.update(self.code_model.options)
|
|
40
|
+
return template.render(code_model=self.code_model, **params)
|
|
41
|
+
|
|
42
|
+
def serialize_package_file(self, template_name: str, **kwargs: Any) -> str:
|
|
43
|
+
template = self.env.get_template(template_name)
|
|
44
|
+
package_parts = (self.code_model.options["package_name"] or "").split("-")[:-1]
|
|
45
|
+
token_credential = any(
|
|
46
|
+
c
|
|
47
|
+
for c in self.code_model.clients
|
|
48
|
+
if isinstance(getattr(c.credential, "type", None), TokenCredentialType)
|
|
49
|
+
)
|
|
50
|
+
version = self.code_model.options["package_version"]
|
|
51
|
+
if any(x in version for x in ["a", "b", "rc"]) or version[0] == "0":
|
|
52
|
+
dev_status = "4 - Beta"
|
|
53
|
+
else:
|
|
54
|
+
dev_status = "5 - Production/Stable"
|
|
55
|
+
params = {
|
|
56
|
+
"code_model": self.code_model,
|
|
57
|
+
"dev_status": dev_status,
|
|
58
|
+
"token_credential": token_credential,
|
|
59
|
+
"pkgutil_names": [
|
|
60
|
+
".".join(package_parts[: i + 1]) for i in range(len(package_parts))
|
|
61
|
+
],
|
|
62
|
+
"init_names": [
|
|
63
|
+
"/".join(package_parts[: i + 1]) + "/__init__.py"
|
|
64
|
+
for i in range(len(package_parts))
|
|
65
|
+
],
|
|
66
|
+
"client_name": self.code_model.clients[0].name,
|
|
67
|
+
"namespace": self.code_model.namespace,
|
|
68
|
+
}
|
|
69
|
+
params.update(self.code_model.options)
|
|
70
|
+
params.update(kwargs)
|
|
71
|
+
return template.render(**params)
|
|
72
|
+
|
|
25
73
|
def serialize_pkgutil_init_file(self) -> str:
|
|
26
74
|
template = self.env.get_template("pkgutil_init.py.jinja2")
|
|
27
75
|
return template.render()
|
|
28
76
|
|
|
29
|
-
def serialize_init_file(self) -> str:
|
|
77
|
+
def serialize_init_file(self, clients: List[Client]) -> str:
|
|
30
78
|
template = self.env.get_template("init.py.jinja2")
|
|
31
|
-
return template.render(
|
|
79
|
+
return template.render(
|
|
80
|
+
code_model=self.code_model,
|
|
81
|
+
clients=clients,
|
|
82
|
+
async_mode=self.async_mode,
|
|
83
|
+
)
|
|
32
84
|
|
|
33
|
-
def serialize_service_client_file(self) -> str:
|
|
85
|
+
def serialize_service_client_file(self, clients: List[Client]) -> str:
|
|
34
86
|
|
|
35
|
-
template = self.env.get_template("
|
|
87
|
+
template = self.env.get_template("client_container.py.jinja2")
|
|
88
|
+
|
|
89
|
+
imports = FileImport()
|
|
90
|
+
for client in clients:
|
|
91
|
+
imports.merge(client.imports(self.async_mode))
|
|
36
92
|
|
|
37
93
|
return template.render(
|
|
38
94
|
code_model=self.code_model,
|
|
95
|
+
clients=clients,
|
|
39
96
|
async_mode=self.async_mode,
|
|
40
|
-
|
|
41
|
-
imports=FileImportSerializer(
|
|
42
|
-
self.code_model.client.imports(self.async_mode),
|
|
43
|
-
),
|
|
97
|
+
get_serializer=ClientSerializer,
|
|
98
|
+
imports=FileImportSerializer(imports),
|
|
44
99
|
)
|
|
45
100
|
|
|
46
101
|
def serialize_vendor_file(self) -> str:
|
|
@@ -67,17 +122,18 @@ class GeneralSerializer:
|
|
|
67
122
|
ImportType.AZURECORE,
|
|
68
123
|
TypingSection.TYPING,
|
|
69
124
|
)
|
|
70
|
-
file_import.add_submodule_import(
|
|
71
|
-
"._configuration",
|
|
72
|
-
f"{self.code_model.client.name}Configuration",
|
|
73
|
-
ImportType.LOCAL,
|
|
74
|
-
)
|
|
75
125
|
file_import.add_msrest_import(
|
|
76
126
|
self.code_model,
|
|
77
127
|
".." if self.async_mode else ".",
|
|
78
128
|
MsrestImportType.SerializerDeserializer,
|
|
79
129
|
TypingSection.TYPING,
|
|
80
130
|
)
|
|
131
|
+
for client in self.code_model.clients:
|
|
132
|
+
file_import.add_submodule_import(
|
|
133
|
+
"._configuration",
|
|
134
|
+
f"{client.name}Configuration",
|
|
135
|
+
ImportType.LOCAL,
|
|
136
|
+
)
|
|
81
137
|
|
|
82
138
|
return template.render(
|
|
83
139
|
code_model=self.code_model,
|
|
@@ -87,36 +143,23 @@ class GeneralSerializer:
|
|
|
87
143
|
async_mode=self.async_mode,
|
|
88
144
|
)
|
|
89
145
|
|
|
90
|
-
def serialize_config_file(self) -> str:
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
sdk_moniker = (
|
|
96
|
-
package_name if package_name else self.code_model.client.name.lower()
|
|
97
|
-
)
|
|
98
|
-
template = self.env.get_template("config.py.jinja2")
|
|
146
|
+
def serialize_config_file(self, clients: List[Client]) -> str:
|
|
147
|
+
template = self.env.get_template("config_container.py.jinja2")
|
|
148
|
+
imports = FileImport()
|
|
149
|
+
for client in self.code_model.clients:
|
|
150
|
+
imports.merge(client.config.imports(self.async_mode))
|
|
99
151
|
return template.render(
|
|
100
152
|
code_model=self.code_model,
|
|
101
153
|
async_mode=self.async_mode,
|
|
102
|
-
imports=FileImportSerializer(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
serializer=ConfigSerializer(self.code_model),
|
|
106
|
-
sdk_moniker=sdk_moniker,
|
|
154
|
+
imports=FileImportSerializer(imports),
|
|
155
|
+
get_serializer=ConfigSerializer,
|
|
156
|
+
clients=clients,
|
|
107
157
|
)
|
|
108
158
|
|
|
109
159
|
def serialize_version_file(self) -> str:
|
|
110
160
|
template = self.env.get_template("version.py.jinja2")
|
|
111
161
|
return template.render(code_model=self.code_model)
|
|
112
162
|
|
|
113
|
-
def serialize_setup_file(self) -> str:
|
|
114
|
-
template = self.env.get_template("setup.py.jinja2")
|
|
115
|
-
params = {}
|
|
116
|
-
params.update(self.code_model.options)
|
|
117
|
-
params.update(self.code_model.package_dependency)
|
|
118
|
-
return template.render(code_model=self.code_model, **params)
|
|
119
|
-
|
|
120
163
|
def serialize_serialization_file(self) -> str:
|
|
121
164
|
template = self.env.get_template("serialization.py.jinja2")
|
|
122
165
|
return template.render(code_model=self.code_model)
|
|
@@ -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
|
|
|
@@ -8,12 +8,12 @@ import json
|
|
|
8
8
|
from typing import List, Optional, Set, Tuple, Dict, Union
|
|
9
9
|
from jinja2 import Environment
|
|
10
10
|
from ..models import (
|
|
11
|
-
CodeModel,
|
|
12
11
|
OperationGroup,
|
|
13
12
|
LROOperation,
|
|
14
13
|
PagingOperation,
|
|
15
14
|
TypingSection,
|
|
16
15
|
ImportType,
|
|
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:
|
|
@@ -64,13 +82,15 @@ def _mixin_imports(
|
|
|
64
82
|
class MetadataSerializer:
|
|
65
83
|
def __init__(self, code_model: CodeModel, env: Environment) -> None:
|
|
66
84
|
self.code_model = code_model
|
|
85
|
+
self.client = self.code_model.clients[0] # we only do one client for multiapi
|
|
67
86
|
self.env = env
|
|
68
87
|
|
|
69
88
|
def _choose_api_version(self) -> Tuple[str, List[str]]:
|
|
70
89
|
chosen_version = ""
|
|
71
90
|
total_api_version_set: Set[str] = set()
|
|
72
|
-
for
|
|
73
|
-
|
|
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)
|
|
74
94
|
|
|
75
95
|
total_api_version_list = list(total_api_version_set)
|
|
76
96
|
total_api_version_list.sort()
|
|
@@ -99,7 +119,8 @@ class MetadataSerializer:
|
|
|
99
119
|
mixin_operation_group: Optional[OperationGroup] = next(
|
|
100
120
|
(
|
|
101
121
|
operation_group
|
|
102
|
-
for
|
|
122
|
+
for client in self.code_model.clients
|
|
123
|
+
for operation_group in client.operation_groups
|
|
103
124
|
if operation_group.is_mixin
|
|
104
125
|
),
|
|
105
126
|
None,
|
|
@@ -116,10 +137,11 @@ class MetadataSerializer:
|
|
|
116
137
|
template = self.env.get_template("metadata.json.jinja2")
|
|
117
138
|
|
|
118
139
|
return template.render(
|
|
140
|
+
code_model=self.code_model,
|
|
119
141
|
chosen_version=chosen_version,
|
|
120
142
|
total_api_version_list=total_api_version_list,
|
|
121
|
-
|
|
122
|
-
global_parameters=self.
|
|
143
|
+
client=self.client,
|
|
144
|
+
global_parameters=self.client.parameters,
|
|
123
145
|
mixin_operations=mixin_operations,
|
|
124
146
|
any=any,
|
|
125
147
|
is_lro=_is_lro,
|
|
@@ -128,26 +150,26 @@ class MetadataSerializer:
|
|
|
128
150
|
sync_mixin_imports=sync_mixin_imports,
|
|
129
151
|
async_mixin_imports=async_mixin_imports,
|
|
130
152
|
sync_client_imports=_json_serialize_imports(
|
|
131
|
-
self.
|
|
153
|
+
self.client.imports_for_multiapi(async_mode=False).to_dict()
|
|
132
154
|
),
|
|
133
155
|
async_client_imports=_json_serialize_imports(
|
|
134
|
-
self.
|
|
156
|
+
self.client.imports_for_multiapi(async_mode=True).to_dict()
|
|
135
157
|
),
|
|
136
158
|
sync_config_imports=_json_serialize_imports(
|
|
137
|
-
self.
|
|
159
|
+
self.client.config.imports_for_multiapi(async_mode=False).to_dict()
|
|
138
160
|
),
|
|
139
161
|
async_config_imports=_json_serialize_imports(
|
|
140
|
-
self.
|
|
162
|
+
self.client.config.imports_for_multiapi(async_mode=True).to_dict()
|
|
141
163
|
),
|
|
142
164
|
get_async_operation_serializer=functools.partial(
|
|
143
165
|
get_operation_serializer,
|
|
144
|
-
code_model=self.code_model,
|
|
166
|
+
code_model=self.client.code_model,
|
|
145
167
|
async_mode=True,
|
|
146
168
|
),
|
|
147
169
|
get_sync_operation_serializer=functools.partial(
|
|
148
170
|
get_operation_serializer,
|
|
149
|
-
code_model=self.code_model,
|
|
171
|
+
code_model=self.client.code_model,
|
|
150
172
|
async_mode=False,
|
|
151
173
|
),
|
|
152
|
-
has_credential=bool(self.
|
|
174
|
+
has_credential=bool(self.client.credential),
|
|
153
175
|
)
|