@autorest/python 5.15.0 → 5.18.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/ChangeLog.md +98 -4
- package/README.md +30 -4
- package/autorest/__init__.py +2 -3
- package/autorest/black/__init__.py +12 -5
- package/autorest/codegen/__init__.py +122 -211
- package/autorest/codegen/models/__init__.py +122 -78
- package/autorest/codegen/models/base_builder.py +70 -72
- package/autorest/codegen/models/base_model.py +7 -5
- package/autorest/codegen/models/{base_schema.py → base_type.py} +68 -45
- package/autorest/codegen/models/client.py +193 -40
- package/autorest/codegen/models/code_model.py +145 -245
- package/autorest/codegen/models/combined_type.py +107 -0
- package/autorest/codegen/models/constant_type.py +122 -0
- package/autorest/codegen/models/credential_types.py +224 -0
- package/autorest/codegen/models/dictionary_type.py +131 -0
- package/autorest/codegen/models/enum_type.py +195 -0
- package/autorest/codegen/models/imports.py +93 -41
- package/autorest/codegen/models/list_type.py +149 -0
- package/autorest/codegen/models/lro_operation.py +90 -133
- package/autorest/codegen/models/lro_paging_operation.py +28 -12
- package/autorest/codegen/models/model_type.py +262 -0
- package/autorest/codegen/models/operation.py +412 -259
- package/autorest/codegen/models/operation_group.py +80 -91
- package/autorest/codegen/models/paging_operation.py +101 -117
- package/autorest/codegen/models/parameter.py +302 -341
- package/autorest/codegen/models/parameter_list.py +373 -357
- package/autorest/codegen/models/primitive_types.py +544 -0
- package/autorest/codegen/models/property.py +136 -134
- package/autorest/codegen/models/request_builder.py +138 -86
- package/autorest/codegen/models/request_builder_parameter.py +122 -86
- package/autorest/codegen/models/response.py +325 -0
- package/autorest/codegen/models/utils.py +13 -17
- package/autorest/codegen/serializers/__init__.py +212 -112
- package/autorest/codegen/serializers/builder_serializer.py +931 -1040
- package/autorest/codegen/serializers/client_serializer.py +140 -84
- package/autorest/codegen/serializers/general_serializer.py +26 -50
- package/autorest/codegen/serializers/import_serializer.py +96 -31
- package/autorest/codegen/serializers/metadata_serializer.py +39 -79
- package/autorest/codegen/serializers/model_base_serializer.py +62 -34
- package/autorest/codegen/serializers/model_generic_serializer.py +9 -10
- package/autorest/codegen/serializers/model_init_serializer.py +4 -2
- package/autorest/codegen/serializers/model_python3_serializer.py +29 -22
- package/autorest/codegen/serializers/operation_groups_serializer.py +21 -19
- package/autorest/codegen/serializers/operations_init_serializer.py +23 -11
- package/autorest/codegen/serializers/parameter_serializer.py +174 -0
- package/autorest/codegen/serializers/patch_serializer.py +4 -1
- package/autorest/codegen/serializers/request_builders_serializer.py +57 -0
- package/autorest/codegen/serializers/utils.py +0 -126
- package/autorest/codegen/templates/MANIFEST.in.jinja2 +1 -0
- package/autorest/codegen/templates/{service_client.py.jinja2 → client.py.jinja2} +7 -7
- package/autorest/codegen/templates/config.py.jinja2 +13 -13
- package/autorest/codegen/templates/enum.py.jinja2 +4 -4
- package/autorest/codegen/templates/enum_container.py.jinja2 +1 -1
- package/autorest/codegen/templates/init.py.jinja2 +3 -3
- package/autorest/codegen/templates/lro_operation.py.jinja2 +6 -5
- package/autorest/codegen/templates/lro_paging_operation.py.jinja2 +6 -5
- package/autorest/codegen/templates/metadata.json.jinja2 +36 -35
- package/autorest/codegen/templates/model.py.jinja2 +23 -24
- package/autorest/codegen/templates/model_container.py.jinja2 +2 -1
- package/autorest/codegen/templates/model_init.py.jinja2 +3 -5
- package/autorest/codegen/templates/operation.py.jinja2 +10 -14
- package/autorest/codegen/templates/operation_group.py.jinja2 +9 -15
- package/autorest/codegen/templates/operation_groups_container.py.jinja2 +1 -1
- package/autorest/codegen/templates/operation_tools.jinja2 +8 -2
- package/autorest/codegen/templates/paging_operation.py.jinja2 +7 -8
- package/autorest/codegen/templates/request_builder.py.jinja2 +19 -10
- package/autorest/codegen/templates/setup.py.jinja2 +9 -3
- package/autorest/codegen/templates/vendor.py.jinja2 +1 -1
- package/autorest/jsonrpc/__init__.py +7 -12
- package/autorest/jsonrpc/localapi.py +4 -3
- package/autorest/jsonrpc/server.py +28 -9
- package/autorest/jsonrpc/stdstream.py +13 -6
- package/autorest/m2r/__init__.py +5 -8
- package/autorest/m4reformatter/__init__.py +1126 -0
- package/autorest/multiapi/__init__.py +24 -14
- package/autorest/multiapi/models/client.py +21 -11
- package/autorest/multiapi/models/code_model.py +23 -10
- package/autorest/multiapi/models/config.py +4 -1
- package/autorest/multiapi/models/constant_global_parameter.py +1 -0
- package/autorest/multiapi/models/global_parameter.py +2 -1
- package/autorest/multiapi/models/global_parameters.py +14 -8
- package/autorest/multiapi/models/imports.py +24 -17
- package/autorest/multiapi/models/mixin_operation.py +5 -5
- package/autorest/multiapi/models/operation_group.py +2 -1
- package/autorest/multiapi/models/operation_mixin_group.py +21 -10
- package/autorest/multiapi/serializers/__init__.py +20 -25
- package/autorest/multiapi/serializers/import_serializer.py +47 -17
- package/autorest/multiapi/serializers/multiapi_serializer.py +17 -17
- package/autorest/multiapi/templates/multiapi_config.py.jinja2 +3 -3
- package/autorest/multiapi/templates/multiapi_init.py.jinja2 +2 -2
- package/autorest/multiapi/templates/multiapi_operations_mixin.py.jinja2 +4 -4
- package/autorest/multiapi/templates/multiapi_service_client.py.jinja2 +9 -9
- package/autorest/multiapi/utils.py +3 -3
- package/autorest/postprocess/__init__.py +202 -0
- package/autorest/postprocess/get_all.py +19 -0
- package/autorest/postprocess/venvtools.py +73 -0
- package/autorest/preprocess/__init__.py +210 -0
- package/autorest/preprocess/helpers.py +54 -0
- package/autorest/{namer → preprocess}/python_mappings.py +25 -32
- package/package.json +3 -3
- package/run-python3.js +2 -3
- package/venvtools.py +1 -1
- package/autorest/codegen/models/constant_schema.py +0 -101
- package/autorest/codegen/models/credential_model.py +0 -47
- package/autorest/codegen/models/credential_schema.py +0 -91
- package/autorest/codegen/models/credential_schema_policy.py +0 -77
- package/autorest/codegen/models/dictionary_schema.py +0 -103
- package/autorest/codegen/models/enum_schema.py +0 -215
- package/autorest/codegen/models/list_schema.py +0 -123
- package/autorest/codegen/models/object_schema.py +0 -253
- package/autorest/codegen/models/primitive_schemas.py +0 -466
- package/autorest/codegen/models/request_builder_parameter_list.py +0 -280
- package/autorest/codegen/models/rest.py +0 -42
- package/autorest/codegen/models/schema_request.py +0 -45
- package/autorest/codegen/models/schema_response.py +0 -136
- package/autorest/codegen/serializers/rest_serializer.py +0 -57
- package/autorest/namer/__init__.py +0 -25
- package/autorest/namer/name_converter.py +0 -412
|
@@ -4,22 +4,25 @@
|
|
|
4
4
|
# license information.
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
from typing import List
|
|
7
|
+
|
|
7
8
|
from . import utils
|
|
8
|
-
from ..models import CodeModel
|
|
9
|
+
from ..models import CodeModel, ParameterMethodLocation
|
|
10
|
+
from .parameter_serializer import ParameterSerializer, PopKwargType
|
|
9
11
|
|
|
10
12
|
|
|
11
13
|
class ClientSerializer:
|
|
12
14
|
def __init__(self, code_model: CodeModel, is_python3_file: bool) -> None:
|
|
13
15
|
self.code_model = code_model
|
|
14
16
|
self.is_python3_file = is_python3_file
|
|
17
|
+
self.parameter_serializer = ParameterSerializer()
|
|
15
18
|
|
|
16
19
|
def _init_signature(self, async_mode: bool) -> str:
|
|
17
|
-
return
|
|
20
|
+
return self.parameter_serializer.serialize_method(
|
|
18
21
|
function_def="def",
|
|
19
22
|
method_name="__init__",
|
|
20
|
-
|
|
21
|
-
method_param_signatures=self.code_model.
|
|
22
|
-
async_mode or self.is_python3_file
|
|
23
|
+
need_self_param=True,
|
|
24
|
+
method_param_signatures=self.code_model.client.parameters.method_signature(
|
|
25
|
+
async_mode or self.is_python3_file, async_mode
|
|
23
26
|
),
|
|
24
27
|
)
|
|
25
28
|
|
|
@@ -32,39 +35,43 @@ class ClientSerializer:
|
|
|
32
35
|
)
|
|
33
36
|
|
|
34
37
|
def pop_kwargs_from_signature(self, async_mode: bool) -> List[str]:
|
|
35
|
-
return
|
|
36
|
-
self.code_model.
|
|
38
|
+
return self.parameter_serializer.pop_kwargs_from_signature(
|
|
39
|
+
self.code_model.client.parameters.kwargs_to_pop(
|
|
37
40
|
async_mode or self.is_python3_file,
|
|
38
41
|
),
|
|
39
42
|
check_kwarg_dict=False,
|
|
40
|
-
pop_headers_kwarg=
|
|
41
|
-
pop_params_kwarg=
|
|
43
|
+
pop_headers_kwarg=PopKwargType.NO,
|
|
44
|
+
pop_params_kwarg=PopKwargType.NO,
|
|
42
45
|
)
|
|
43
46
|
|
|
44
47
|
def class_definition(self, async_mode) -> str:
|
|
45
|
-
class_name = self.code_model.
|
|
46
|
-
has_mixin_og = any(og for og in self.code_model.operation_groups if og.
|
|
48
|
+
class_name = self.code_model.client.name
|
|
49
|
+
has_mixin_og = any(og for og in self.code_model.operation_groups if og.is_mixin)
|
|
47
50
|
base_class = ""
|
|
48
51
|
if has_mixin_og:
|
|
49
52
|
base_class = f"{class_name}OperationsMixin"
|
|
50
53
|
elif not (async_mode or self.is_python3_file):
|
|
51
54
|
base_class = "object"
|
|
52
|
-
|
|
53
|
-
if len(self.code_model.operation_groups) > 6:
|
|
54
|
-
disable = " # pylint: disable=too-many-instance-attributes"
|
|
55
|
+
pylint_disable = self.code_model.client.pylint_disable
|
|
55
56
|
if base_class:
|
|
56
|
-
return f"class {class_name}({base_class}):{
|
|
57
|
-
return f"class {class_name}:{
|
|
57
|
+
return f"class {class_name}({base_class}):{pylint_disable}"
|
|
58
|
+
return f"class {class_name}:{pylint_disable}"
|
|
58
59
|
|
|
59
60
|
def property_descriptions(self, async_mode: bool) -> List[str]:
|
|
60
61
|
retval: List[str] = []
|
|
61
62
|
operations_folder = ".aio.operations." if async_mode else ".operations."
|
|
62
|
-
for og in [og for og in self.code_model.operation_groups if not og.
|
|
63
|
-
retval.append(f":ivar {og.
|
|
64
|
-
retval.append(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
63
|
+
for og in [og for og in self.code_model.operation_groups if not og.is_mixin]:
|
|
64
|
+
retval.append(f":ivar {og.property_name}: {og.class_name} operations")
|
|
65
|
+
retval.append(
|
|
66
|
+
f":vartype {og.property_name}: {self.code_model.namespace}{operations_folder}{og.class_name}"
|
|
67
|
+
)
|
|
68
|
+
for param in self.code_model.client.parameters.method:
|
|
69
|
+
retval.append(
|
|
70
|
+
f":{param.description_keyword} {param.client_name}: {param.description}"
|
|
71
|
+
)
|
|
72
|
+
retval.append(
|
|
73
|
+
f":{param.docstring_type_keyword} {param.client_name}: {param.docstring_type(async_mode=async_mode)}"
|
|
74
|
+
)
|
|
68
75
|
if self.code_model.has_lro_operations:
|
|
69
76
|
retval.append(
|
|
70
77
|
":keyword int polling_interval: Default waiting time between two polls for LRO operations "
|
|
@@ -74,92 +81,130 @@ class ClientSerializer:
|
|
|
74
81
|
return retval
|
|
75
82
|
|
|
76
83
|
def initialize_config(self) -> str:
|
|
77
|
-
config_name = f"{self.code_model.
|
|
84
|
+
config_name = f"{self.code_model.client.name}Configuration"
|
|
78
85
|
config_call = ", ".join(
|
|
79
86
|
[
|
|
80
|
-
f"{p.
|
|
81
|
-
for p in self.code_model.
|
|
82
|
-
if
|
|
83
|
-
]
|
|
84
|
-
|
|
85
|
-
|
|
87
|
+
f"{p.client_name}={p.client_name}"
|
|
88
|
+
for p in self.code_model.config.parameters.method
|
|
89
|
+
if p.method_location != ParameterMethodLocation.KWARG
|
|
90
|
+
]
|
|
91
|
+
+ ["**kwargs"]
|
|
92
|
+
)
|
|
86
93
|
return f"self._config = {config_name}({config_call})"
|
|
87
94
|
|
|
95
|
+
@property
|
|
96
|
+
def host_variable_name(self) -> str:
|
|
97
|
+
try:
|
|
98
|
+
return next(
|
|
99
|
+
p for p in self.code_model.client.parameters if p.is_host
|
|
100
|
+
).client_name
|
|
101
|
+
except StopIteration:
|
|
102
|
+
return "_endpoint"
|
|
103
|
+
|
|
88
104
|
def initialize_pipeline_client(self, async_mode: bool) -> str:
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
105
|
+
pipeline_client_name = self.code_model.client.pipeline_class(async_mode)
|
|
106
|
+
return (
|
|
107
|
+
f"self._client = {pipeline_client_name}(base_url={self.host_variable_name}, "
|
|
108
|
+
"config=self._config, **kwargs)"
|
|
109
|
+
)
|
|
94
110
|
|
|
95
111
|
def serializers_and_operation_groups_properties(self) -> List[str]:
|
|
96
112
|
retval = []
|
|
97
|
-
if self.code_model.
|
|
98
|
-
client_models_value =
|
|
113
|
+
if self.code_model.model_types:
|
|
114
|
+
client_models_value = (
|
|
115
|
+
"{k: v for k, v in models.__dict__.items() if isinstance(v, type)}"
|
|
116
|
+
)
|
|
99
117
|
else:
|
|
100
118
|
client_models_value = "{} # type: Dict[str, Any]"
|
|
101
119
|
if self.code_model.options["models_mode"]:
|
|
102
120
|
retval.append(f"client_models = {client_models_value}")
|
|
103
|
-
client_models_str =
|
|
121
|
+
client_models_str = (
|
|
122
|
+
"client_models" if self.code_model.options["models_mode"] else ""
|
|
123
|
+
)
|
|
104
124
|
retval.append(f"self._serialize = Serializer({client_models_str})")
|
|
105
125
|
retval.append(f"self._deserialize = Deserializer({client_models_str})")
|
|
106
126
|
if not self.code_model.options["client_side_validation"]:
|
|
107
127
|
retval.append("self._serialize.client_side_validation = False")
|
|
108
|
-
operation_groups = [
|
|
109
|
-
|
|
128
|
+
operation_groups = [
|
|
129
|
+
og for og in self.code_model.operation_groups if not og.is_mixin
|
|
130
|
+
]
|
|
131
|
+
for og in operation_groups:
|
|
110
132
|
retval.extend(
|
|
111
133
|
[
|
|
112
|
-
f"self.{og.
|
|
113
|
-
|
|
134
|
+
f"self.{og.property_name} = {og.class_name}({og.mypy_ignore}{og.pylint_disable}",
|
|
135
|
+
" self._client, self._config, self._serialize, self._deserialize",
|
|
136
|
+
")",
|
|
114
137
|
]
|
|
115
138
|
)
|
|
116
139
|
return retval
|
|
117
140
|
|
|
118
141
|
def _send_request_signature(self, async_mode: bool) -> str:
|
|
119
|
-
|
|
142
|
+
is_python3_file = async_mode or self.code_model.options["python3_only"]
|
|
143
|
+
request_signature = [
|
|
144
|
+
"request: HttpRequest,"
|
|
145
|
+
if is_python3_file
|
|
146
|
+
else "request, # type: HttpRequest"
|
|
147
|
+
]
|
|
148
|
+
send_request_signature = (
|
|
149
|
+
request_signature
|
|
150
|
+
+ self.code_model.client.parameters.method_signature_kwargs(is_python3_file)
|
|
151
|
+
)
|
|
152
|
+
return self.parameter_serializer.serialize_method(
|
|
120
153
|
function_def="def",
|
|
121
|
-
method_name=self.code_model.send_request_name,
|
|
122
|
-
|
|
123
|
-
method_param_signatures=
|
|
124
|
-
async_mode or self.is_python3_file
|
|
125
|
-
),
|
|
154
|
+
method_name=self.code_model.client.send_request_name,
|
|
155
|
+
need_self_param=True,
|
|
156
|
+
method_param_signatures=send_request_signature,
|
|
126
157
|
)
|
|
127
158
|
|
|
128
|
-
def send_request_signature_and_response_type_annotation(
|
|
159
|
+
def send_request_signature_and_response_type_annotation(
|
|
160
|
+
self, async_mode: bool
|
|
161
|
+
) -> str:
|
|
129
162
|
send_request_signature = self._send_request_signature(async_mode)
|
|
130
163
|
return utils.method_signature_and_response_type_annotation_template(
|
|
131
164
|
is_python3_file=async_mode or self.is_python3_file,
|
|
132
165
|
method_signature=send_request_signature,
|
|
133
|
-
response_type_annotation="Awaitable[AsyncHttpResponse]"
|
|
166
|
+
response_type_annotation="Awaitable[AsyncHttpResponse]"
|
|
167
|
+
if async_mode
|
|
168
|
+
else "HttpResponse",
|
|
134
169
|
)
|
|
135
170
|
|
|
136
171
|
def _example_make_call(self, async_mode: bool) -> List[str]:
|
|
137
172
|
http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
|
|
138
173
|
retval = [
|
|
139
|
-
f">>> response = {'await ' if async_mode else ''}client.{self.code_model.send_request_name}(request)"
|
|
174
|
+
f">>> response = {'await ' if async_mode else ''}client.{self.code_model.client.send_request_name}(request)"
|
|
140
175
|
]
|
|
141
176
|
retval.append(f"<{http_response}: 200 OK>")
|
|
142
177
|
return retval
|
|
143
178
|
|
|
144
179
|
def _request_builder_example(self, async_mode: bool) -> List[str]:
|
|
145
180
|
retval = [
|
|
146
|
-
"We have helper methods to create requests specific to this service in "
|
|
147
|
-
f"`{self.code_model.namespace}.{self.code_model.rest_layer_name}`."
|
|
181
|
+
"We have helper methods to create requests specific to this service in "
|
|
182
|
+
+ f"`{self.code_model.namespace}.{self.code_model.rest_layer_name}`."
|
|
148
183
|
]
|
|
149
|
-
retval.append(
|
|
184
|
+
retval.append(
|
|
185
|
+
"Use these helper methods to create the request you pass to this method."
|
|
186
|
+
)
|
|
150
187
|
retval.append("")
|
|
151
188
|
|
|
152
|
-
request_builder = self.code_model.
|
|
189
|
+
request_builder = self.code_model.request_builders[0]
|
|
153
190
|
request_builder_signature = ", ".join(request_builder.parameters.call)
|
|
154
|
-
if request_builder.
|
|
155
|
-
rest_imported = request_builder.
|
|
156
|
-
request_builder_name =
|
|
191
|
+
if request_builder.group_name:
|
|
192
|
+
rest_imported = request_builder.group_name
|
|
193
|
+
request_builder_name = (
|
|
194
|
+
f"{request_builder.group_name}.{request_builder.name}"
|
|
195
|
+
)
|
|
157
196
|
else:
|
|
158
197
|
rest_imported = request_builder.name
|
|
159
198
|
request_builder_name = request_builder.name
|
|
160
|
-
retval.append(
|
|
161
|
-
|
|
162
|
-
|
|
199
|
+
retval.append(
|
|
200
|
+
f">>> from {self.code_model.namespace}.{self.code_model.rest_layer_name} import {rest_imported}"
|
|
201
|
+
)
|
|
202
|
+
retval.append(
|
|
203
|
+
f">>> request = {request_builder_name}({request_builder_signature})"
|
|
204
|
+
)
|
|
205
|
+
retval.append(
|
|
206
|
+
f"<HttpRequest [{request_builder.method}], url: '{request_builder.url}'>"
|
|
207
|
+
)
|
|
163
208
|
retval.extend(self._example_make_call(async_mode))
|
|
164
209
|
return retval
|
|
165
210
|
|
|
@@ -178,33 +223,42 @@ class ClientSerializer:
|
|
|
178
223
|
else:
|
|
179
224
|
retval.extend(self._rest_request_example(async_mode))
|
|
180
225
|
retval.append("")
|
|
181
|
-
retval.append(
|
|
226
|
+
retval.append(
|
|
227
|
+
"For more information on this code flow, see https://aka.ms/azsdk/dpcodegen/python/send_request"
|
|
228
|
+
)
|
|
182
229
|
retval.append(f"")
|
|
183
230
|
retval.append(":param request: The network request you want to make. Required.")
|
|
184
231
|
retval.append(f":type request: ~azure.core.rest.HttpRequest")
|
|
185
|
-
retval.append(
|
|
186
|
-
|
|
232
|
+
retval.append(
|
|
233
|
+
":keyword bool stream: Whether the response payload will be streamed. Defaults to False."
|
|
234
|
+
)
|
|
235
|
+
retval.append(
|
|
236
|
+
":return: The response of your network call. Does not do error handling on your response."
|
|
237
|
+
)
|
|
187
238
|
http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
|
|
188
239
|
retval.append(f":rtype: ~azure.core.rest.{http_response}")
|
|
189
240
|
retval.append('"""')
|
|
190
241
|
return retval
|
|
191
242
|
|
|
192
243
|
def serialize_path(self) -> List[str]:
|
|
193
|
-
return
|
|
244
|
+
return self.parameter_serializer.serialize_path(
|
|
245
|
+
self.code_model.client.parameters.path, "self._serialize"
|
|
246
|
+
)
|
|
194
247
|
|
|
195
|
-
class ConfigSerializer:
|
|
196
248
|
|
|
249
|
+
class ConfigSerializer:
|
|
197
250
|
def __init__(self, code_model: CodeModel, is_python3_file: bool) -> None:
|
|
198
251
|
self.code_model = code_model
|
|
252
|
+
self.parameter_serializer = ParameterSerializer()
|
|
199
253
|
self.is_python3_file = is_python3_file
|
|
200
254
|
|
|
201
255
|
def _init_signature(self, async_mode: bool) -> str:
|
|
202
|
-
return
|
|
256
|
+
return self.parameter_serializer.serialize_method(
|
|
203
257
|
function_def="def",
|
|
204
258
|
method_name="__init__",
|
|
205
|
-
|
|
206
|
-
method_param_signatures=self.code_model.
|
|
207
|
-
async_mode or self.is_python3_file
|
|
259
|
+
need_self_param=True,
|
|
260
|
+
method_param_signatures=self.code_model.config.parameters.method_signature(
|
|
261
|
+
async_mode or self.is_python3_file, async_mode
|
|
208
262
|
),
|
|
209
263
|
)
|
|
210
264
|
|
|
@@ -217,34 +271,36 @@ class ConfigSerializer:
|
|
|
217
271
|
)
|
|
218
272
|
|
|
219
273
|
def pop_kwargs_from_signature(self, async_mode: bool) -> List[str]:
|
|
220
|
-
return
|
|
221
|
-
self.code_model.
|
|
274
|
+
return self.parameter_serializer.pop_kwargs_from_signature(
|
|
275
|
+
self.code_model.config.parameters.kwargs_to_pop(
|
|
222
276
|
async_mode or self.is_python3_file
|
|
223
277
|
),
|
|
224
278
|
check_kwarg_dict=False,
|
|
225
|
-
pop_headers_kwarg=
|
|
226
|
-
pop_params_kwarg=
|
|
279
|
+
pop_headers_kwarg=PopKwargType.NO,
|
|
280
|
+
pop_params_kwarg=PopKwargType.NO,
|
|
227
281
|
)
|
|
228
282
|
|
|
229
283
|
def set_constants(self) -> List[str]:
|
|
230
284
|
return [
|
|
231
|
-
f"self.{p.
|
|
232
|
-
for p in self.code_model.
|
|
233
|
-
if p not in self.code_model.
|
|
285
|
+
f"self.{p.client_name} = {p.client_default_value_declaration}"
|
|
286
|
+
for p in self.code_model.config.parameters.constant
|
|
287
|
+
if p not in self.code_model.config.parameters.method
|
|
234
288
|
]
|
|
235
289
|
|
|
236
290
|
def check_required_parameters(self) -> List[str]:
|
|
237
291
|
return [
|
|
238
|
-
f
|
|
239
|
-
f
|
|
240
|
-
for p in self.code_model.
|
|
241
|
-
if p.
|
|
292
|
+
f"if {p.client_name} is None:\n"
|
|
293
|
+
f" raise ValueError(\"Parameter '{p.client_name}' must not be None.\")"
|
|
294
|
+
for p in self.code_model.config.parameters.method
|
|
295
|
+
if not (p.optional or p.constant)
|
|
242
296
|
]
|
|
243
297
|
|
|
244
|
-
def property_descriptions(self) -> List[str]:
|
|
298
|
+
def property_descriptions(self, async_mode: bool) -> List[str]:
|
|
245
299
|
retval: List[str] = []
|
|
246
|
-
for p in self.code_model.
|
|
247
|
-
retval.append(f":{p.description_keyword} {p.
|
|
248
|
-
retval.append(
|
|
300
|
+
for p in self.code_model.config.parameters.method:
|
|
301
|
+
retval.append(f":{p.description_keyword} {p.client_name}: {p.description}")
|
|
302
|
+
retval.append(
|
|
303
|
+
f":{p.docstring_type_keyword} {p.client_name}: {p.docstring_type(async_mode=async_mode)}"
|
|
304
|
+
)
|
|
249
305
|
retval.append('"""')
|
|
250
306
|
return retval
|
|
@@ -5,27 +5,18 @@
|
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
from jinja2 import Environment
|
|
7
7
|
from .import_serializer import FileImportSerializer, TypingSection
|
|
8
|
-
from ..models import
|
|
8
|
+
from ..models import (
|
|
9
|
+
FileImport,
|
|
10
|
+
ImportType,
|
|
11
|
+
CodeModel,
|
|
12
|
+
)
|
|
9
13
|
from .client_serializer import ClientSerializer, ConfigSerializer
|
|
10
14
|
|
|
11
|
-
def config_imports(code_model, global_parameters: ParameterList, async_mode: bool) -> FileImport:
|
|
12
|
-
file_import = FileImport()
|
|
13
|
-
file_import.add_submodule_import("azure.core.configuration", "Configuration", ImportType.AZURECORE)
|
|
14
|
-
file_import.add_submodule_import("azure.core.pipeline", "policies", ImportType.AZURECORE)
|
|
15
|
-
file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL)
|
|
16
|
-
if code_model.options["package_version"]:
|
|
17
|
-
file_import.add_submodule_import(".._version" if async_mode else "._version", "VERSION", ImportType.LOCAL)
|
|
18
|
-
for gp in global_parameters:
|
|
19
|
-
file_import.merge(gp.imports())
|
|
20
|
-
if code_model.options["azure_arm"]:
|
|
21
|
-
policy = "AsyncARMChallengeAuthenticationPolicy" if async_mode else "ARMChallengeAuthenticationPolicy"
|
|
22
|
-
file_import.add_submodule_import("azure.mgmt.core.policies", "ARMHttpLoggingPolicy", ImportType.AZURECORE)
|
|
23
|
-
file_import.add_submodule_import("azure.mgmt.core.policies", policy, ImportType.AZURECORE)
|
|
24
|
-
return file_import
|
|
25
|
-
|
|
26
15
|
|
|
27
16
|
class GeneralSerializer:
|
|
28
|
-
def __init__(
|
|
17
|
+
def __init__(
|
|
18
|
+
self, code_model: CodeModel, env: Environment, async_mode: bool
|
|
19
|
+
) -> None:
|
|
29
20
|
self.code_model = code_model
|
|
30
21
|
self.env = env
|
|
31
22
|
self.async_mode = async_mode
|
|
@@ -38,21 +29,9 @@ class GeneralSerializer:
|
|
|
38
29
|
template = self.env.get_template("init.py.jinja2")
|
|
39
30
|
return template.render(code_model=self.code_model, async_mode=self.async_mode)
|
|
40
31
|
|
|
41
|
-
def _correct_credential_parameter(self):
|
|
42
|
-
credential_param = [
|
|
43
|
-
gp for gp in self.code_model.global_parameters.parameters if isinstance(gp.schema, TokenCredentialSchema)
|
|
44
|
-
][0]
|
|
45
|
-
credential_param.schema = TokenCredentialSchema(async_mode=self.async_mode)
|
|
46
|
-
|
|
47
32
|
def serialize_service_client_file(self) -> str:
|
|
48
33
|
|
|
49
|
-
template = self.env.get_template("
|
|
50
|
-
|
|
51
|
-
if (
|
|
52
|
-
self.code_model.options['credential'] and
|
|
53
|
-
isinstance(self.code_model.credential_model.credential_schema_policy.credential, TokenCredentialSchema)
|
|
54
|
-
):
|
|
55
|
-
self._correct_credential_parameter()
|
|
34
|
+
template = self.env.get_template("client.py.jinja2")
|
|
56
35
|
|
|
57
36
|
python3_only = self.code_model.options["python3_only"]
|
|
58
37
|
return template.render(
|
|
@@ -60,8 +39,8 @@ class GeneralSerializer:
|
|
|
60
39
|
async_mode=self.async_mode,
|
|
61
40
|
serializer=ClientSerializer(self.code_model, is_python3_file=python3_only),
|
|
62
41
|
imports=FileImportSerializer(
|
|
63
|
-
self.code_model.
|
|
64
|
-
is_python3_file=self.async_mode or python3_only
|
|
42
|
+
self.code_model.client.imports(self.async_mode),
|
|
43
|
+
is_python3_file=self.async_mode or python3_only,
|
|
65
44
|
),
|
|
66
45
|
)
|
|
67
46
|
|
|
@@ -91,11 +70,15 @@ class GeneralSerializer:
|
|
|
91
70
|
)
|
|
92
71
|
file_import.add_submodule_import(
|
|
93
72
|
"._configuration",
|
|
94
|
-
f"{self.code_model.
|
|
95
|
-
ImportType.LOCAL
|
|
73
|
+
f"{self.code_model.client.name}Configuration",
|
|
74
|
+
ImportType.LOCAL,
|
|
75
|
+
)
|
|
76
|
+
file_import.add_submodule_import(
|
|
77
|
+
"msrest", "Serializer", ImportType.THIRDPARTY, TypingSection.TYPING
|
|
78
|
+
)
|
|
79
|
+
file_import.add_submodule_import(
|
|
80
|
+
"msrest", "Deserializer", ImportType.THIRDPARTY, TypingSection.TYPING
|
|
96
81
|
)
|
|
97
|
-
file_import.add_submodule_import("msrest", "Serializer", ImportType.THIRDPARTY, TypingSection.TYPING)
|
|
98
|
-
file_import.add_submodule_import("msrest", "Deserializer", ImportType.THIRDPARTY, TypingSection.TYPING)
|
|
99
82
|
|
|
100
83
|
return template.render(
|
|
101
84
|
code_model=self.code_model,
|
|
@@ -106,29 +89,22 @@ class GeneralSerializer:
|
|
|
106
89
|
async_mode=self.async_mode,
|
|
107
90
|
)
|
|
108
91
|
|
|
109
|
-
|
|
110
92
|
def serialize_config_file(self) -> str:
|
|
111
93
|
|
|
112
|
-
package_name = self.code_model.options[
|
|
94
|
+
package_name = self.code_model.options["package_name"]
|
|
113
95
|
if package_name and package_name.startswith("azure-"):
|
|
114
|
-
package_name = package_name[len("azure-"):]
|
|
115
|
-
sdk_moniker =
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
self.code_model.options['credential'] and
|
|
119
|
-
isinstance(self.code_model.credential_model.credential_schema_policy.credential, TokenCredentialSchema)
|
|
120
|
-
):
|
|
121
|
-
self._correct_credential_parameter()
|
|
122
|
-
|
|
96
|
+
package_name = package_name[len("azure-") :]
|
|
97
|
+
sdk_moniker = (
|
|
98
|
+
package_name if package_name else self.code_model.client.name.lower()
|
|
99
|
+
)
|
|
123
100
|
template = self.env.get_template("config.py.jinja2")
|
|
124
101
|
python3_only = self.code_model.options["python3_only"]
|
|
125
102
|
return template.render(
|
|
126
103
|
code_model=self.code_model,
|
|
127
104
|
async_mode=self.async_mode,
|
|
128
105
|
imports=FileImportSerializer(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
), is_python3_file=self.async_mode or python3_only
|
|
106
|
+
self.code_model.config.imports(self.async_mode),
|
|
107
|
+
is_python3_file=self.async_mode or python3_only,
|
|
132
108
|
),
|
|
133
109
|
serializer=ConfigSerializer(self.code_model, is_python3_file=python3_only),
|
|
134
110
|
sdk_moniker=sdk_moniker,
|