@autorest/python 5.14.0 → 5.17.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 +91 -2
- package/README.md +30 -4
- package/autorest/__init__.py +2 -3
- package/autorest/black/__init__.py +12 -5
- package/autorest/codegen/__init__.py +130 -179
- 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} +62 -49
- package/autorest/codegen/models/client.py +195 -36
- package/autorest/codegen/models/code_model.py +165 -299
- 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 +116 -0
- package/autorest/codegen/models/enum_type.py +195 -0
- package/autorest/codegen/models/imports.py +95 -41
- package/autorest/codegen/models/list_type.py +134 -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 +239 -0
- package/autorest/codegen/models/operation.py +415 -241
- package/autorest/codegen/models/operation_group.py +82 -88
- package/autorest/codegen/models/paging_operation.py +101 -117
- package/autorest/codegen/models/parameter.py +307 -322
- package/autorest/codegen/models/parameter_list.py +366 -357
- package/autorest/codegen/models/primitive_types.py +544 -0
- package/autorest/codegen/models/property.py +122 -134
- package/autorest/codegen/models/request_builder.py +138 -86
- package/autorest/codegen/models/request_builder_parameter.py +122 -79
- package/autorest/codegen/models/response.py +325 -0
- package/autorest/codegen/models/utils.py +17 -1
- package/autorest/codegen/serializers/__init__.py +242 -118
- package/autorest/codegen/serializers/builder_serializer.py +863 -1027
- package/autorest/codegen/serializers/client_serializer.py +148 -82
- package/autorest/codegen/serializers/general_serializer.py +44 -47
- 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 +65 -29
- 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 -18
- 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 +14 -2
- package/autorest/codegen/serializers/request_builders_serializer.py +57 -0
- package/autorest/codegen/serializers/utils.py +0 -103
- 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 -2
- package/autorest/codegen/templates/init.py.jinja2 +9 -6
- package/autorest/codegen/templates/keywords.jinja2 +14 -1
- 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 -29
- package/autorest/codegen/templates/model_container.py.jinja2 +2 -1
- package/autorest/codegen/templates/model_init.py.jinja2 +9 -8
- package/autorest/codegen/templates/operation.py.jinja2 +10 -15
- package/autorest/codegen/templates/operation_group.py.jinja2 +14 -13
- package/autorest/codegen/templates/operation_groups_container.py.jinja2 +1 -2
- package/autorest/codegen/templates/operation_tools.jinja2 +8 -2
- package/autorest/codegen/templates/operations_folder_init.py.jinja2 +4 -0
- package/autorest/codegen/templates/paging_operation.py.jinja2 +7 -8
- package/autorest/codegen/templates/patch.py.jinja2 +18 -29
- package/autorest/codegen/templates/request_builder.py.jinja2 +20 -13
- package/autorest/codegen/templates/setup.py.jinja2 +9 -3
- package/autorest/codegen/templates/vendor.py.jinja2 +12 -2
- 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 +1108 -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 +35 -18
- 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 -15
- 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 +209 -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 -97
- package/autorest/codegen/models/credential_schema.py +0 -90
- 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 -246
- package/autorest/codegen/models/list_schema.py +0 -113
- package/autorest/codegen/models/object_schema.py +0 -249
- package/autorest/codegen/models/primitive_schemas.py +0 -476
- 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 -123
- 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,34 +35,43 @@ class ClientSerializer:
|
|
|
32
35
|
)
|
|
33
36
|
|
|
34
37
|
def pop_kwargs_from_signature(self, async_mode: bool) -> List[str]:
|
|
35
|
-
return
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
return self.parameter_serializer.pop_kwargs_from_signature(
|
|
39
|
+
self.code_model.client.parameters.kwargs_to_pop(
|
|
40
|
+
async_mode or self.is_python3_file,
|
|
41
|
+
),
|
|
42
|
+
check_kwarg_dict=False,
|
|
43
|
+
pop_headers_kwarg=PopKwargType.NO,
|
|
44
|
+
pop_params_kwarg=PopKwargType.NO,
|
|
45
|
+
)
|
|
38
46
|
|
|
39
47
|
def class_definition(self, async_mode) -> str:
|
|
40
|
-
class_name = self.code_model.
|
|
41
|
-
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)
|
|
42
50
|
base_class = ""
|
|
43
51
|
if has_mixin_og:
|
|
44
52
|
base_class = f"{class_name}OperationsMixin"
|
|
45
53
|
elif not (async_mode or self.is_python3_file):
|
|
46
54
|
base_class = "object"
|
|
47
|
-
|
|
48
|
-
if len(self.code_model.operation_groups) > 6:
|
|
49
|
-
disable = " # pylint: disable=too-many-instance-attributes"
|
|
55
|
+
pylint_disable = self.code_model.client.pylint_disable
|
|
50
56
|
if base_class:
|
|
51
|
-
return f"class {class_name}({base_class}):{
|
|
52
|
-
return f"class {class_name}:{
|
|
57
|
+
return f"class {class_name}({base_class}):{pylint_disable}"
|
|
58
|
+
return f"class {class_name}:{pylint_disable}"
|
|
53
59
|
|
|
54
60
|
def property_descriptions(self, async_mode: bool) -> List[str]:
|
|
55
61
|
retval: List[str] = []
|
|
56
62
|
operations_folder = ".aio.operations." if async_mode else ".operations."
|
|
57
|
-
for og in [og for og in self.code_model.operation_groups if not og.
|
|
58
|
-
retval.append(f":ivar {og.
|
|
59
|
-
retval.append(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
+
)
|
|
63
75
|
if self.code_model.has_lro_operations:
|
|
64
76
|
retval.append(
|
|
65
77
|
":keyword int polling_interval: Default waiting time between two polls for LRO operations "
|
|
@@ -69,92 +81,130 @@ class ClientSerializer:
|
|
|
69
81
|
return retval
|
|
70
82
|
|
|
71
83
|
def initialize_config(self) -> str:
|
|
72
|
-
config_name = f"{self.code_model.
|
|
84
|
+
config_name = f"{self.code_model.client.name}Configuration"
|
|
73
85
|
config_call = ", ".join(
|
|
74
86
|
[
|
|
75
|
-
f"{p.
|
|
76
|
-
for p in self.code_model.
|
|
77
|
-
if
|
|
78
|
-
]
|
|
79
|
-
|
|
80
|
-
|
|
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
|
+
)
|
|
81
93
|
return f"self._config = {config_name}({config_call})"
|
|
82
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
|
+
|
|
83
104
|
def initialize_pipeline_client(self, async_mode: bool) -> str:
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
+
)
|
|
89
110
|
|
|
90
111
|
def serializers_and_operation_groups_properties(self) -> List[str]:
|
|
91
112
|
retval = []
|
|
92
|
-
if self.code_model.
|
|
93
|
-
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
|
+
)
|
|
94
117
|
else:
|
|
95
118
|
client_models_value = "{} # type: Dict[str, Any]"
|
|
96
119
|
if self.code_model.options["models_mode"]:
|
|
97
120
|
retval.append(f"client_models = {client_models_value}")
|
|
98
|
-
client_models_str =
|
|
121
|
+
client_models_str = (
|
|
122
|
+
"client_models" if self.code_model.options["models_mode"] else ""
|
|
123
|
+
)
|
|
99
124
|
retval.append(f"self._serialize = Serializer({client_models_str})")
|
|
100
125
|
retval.append(f"self._deserialize = Deserializer({client_models_str})")
|
|
101
126
|
if not self.code_model.options["client_side_validation"]:
|
|
102
127
|
retval.append("self._serialize.client_side_validation = False")
|
|
103
|
-
operation_groups = [
|
|
104
|
-
|
|
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:
|
|
105
132
|
retval.extend(
|
|
106
133
|
[
|
|
107
|
-
f"self.{og.
|
|
108
|
-
|
|
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
|
+
")",
|
|
109
137
|
]
|
|
110
138
|
)
|
|
111
139
|
return retval
|
|
112
140
|
|
|
113
141
|
def _send_request_signature(self, async_mode: bool) -> str:
|
|
114
|
-
|
|
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(
|
|
115
153
|
function_def="def",
|
|
116
|
-
method_name=self.code_model.send_request_name,
|
|
117
|
-
|
|
118
|
-
method_param_signatures=
|
|
119
|
-
async_mode or self.is_python3_file
|
|
120
|
-
),
|
|
154
|
+
method_name=self.code_model.client.send_request_name,
|
|
155
|
+
need_self_param=True,
|
|
156
|
+
method_param_signatures=send_request_signature,
|
|
121
157
|
)
|
|
122
158
|
|
|
123
|
-
def send_request_signature_and_response_type_annotation(
|
|
159
|
+
def send_request_signature_and_response_type_annotation(
|
|
160
|
+
self, async_mode: bool
|
|
161
|
+
) -> str:
|
|
124
162
|
send_request_signature = self._send_request_signature(async_mode)
|
|
125
163
|
return utils.method_signature_and_response_type_annotation_template(
|
|
126
164
|
is_python3_file=async_mode or self.is_python3_file,
|
|
127
165
|
method_signature=send_request_signature,
|
|
128
|
-
response_type_annotation="Awaitable[AsyncHttpResponse]"
|
|
166
|
+
response_type_annotation="Awaitable[AsyncHttpResponse]"
|
|
167
|
+
if async_mode
|
|
168
|
+
else "HttpResponse",
|
|
129
169
|
)
|
|
130
170
|
|
|
131
171
|
def _example_make_call(self, async_mode: bool) -> List[str]:
|
|
132
172
|
http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
|
|
133
173
|
retval = [
|
|
134
|
-
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)"
|
|
135
175
|
]
|
|
136
176
|
retval.append(f"<{http_response}: 200 OK>")
|
|
137
177
|
return retval
|
|
138
178
|
|
|
139
179
|
def _request_builder_example(self, async_mode: bool) -> List[str]:
|
|
140
180
|
retval = [
|
|
141
|
-
"We have helper methods to create requests specific to this service in "
|
|
142
|
-
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}`."
|
|
143
183
|
]
|
|
144
|
-
retval.append(
|
|
184
|
+
retval.append(
|
|
185
|
+
"Use these helper methods to create the request you pass to this method."
|
|
186
|
+
)
|
|
145
187
|
retval.append("")
|
|
146
188
|
|
|
147
|
-
request_builder = self.code_model.
|
|
189
|
+
request_builder = self.code_model.request_builders[0]
|
|
148
190
|
request_builder_signature = ", ".join(request_builder.parameters.call)
|
|
149
|
-
if request_builder.
|
|
150
|
-
rest_imported = request_builder.
|
|
151
|
-
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
|
+
)
|
|
152
196
|
else:
|
|
153
197
|
rest_imported = request_builder.name
|
|
154
198
|
request_builder_name = request_builder.name
|
|
155
|
-
retval.append(
|
|
156
|
-
|
|
157
|
-
|
|
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
|
+
)
|
|
158
208
|
retval.extend(self._example_make_call(async_mode))
|
|
159
209
|
return retval
|
|
160
210
|
|
|
@@ -173,33 +223,42 @@ class ClientSerializer:
|
|
|
173
223
|
else:
|
|
174
224
|
retval.extend(self._rest_request_example(async_mode))
|
|
175
225
|
retval.append("")
|
|
176
|
-
retval.append(
|
|
226
|
+
retval.append(
|
|
227
|
+
"For more information on this code flow, see https://aka.ms/azsdk/python/protocol/quickstart"
|
|
228
|
+
)
|
|
177
229
|
retval.append(f"")
|
|
178
230
|
retval.append(":param request: The network request you want to make. Required.")
|
|
179
231
|
retval.append(f":type request: ~azure.core.rest.HttpRequest")
|
|
180
|
-
retval.append(
|
|
181
|
-
|
|
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
|
+
)
|
|
182
238
|
http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
|
|
183
239
|
retval.append(f":rtype: ~azure.core.rest.{http_response}")
|
|
184
240
|
retval.append('"""')
|
|
185
241
|
return retval
|
|
186
242
|
|
|
187
243
|
def serialize_path(self) -> List[str]:
|
|
188
|
-
return
|
|
244
|
+
return self.parameter_serializer.serialize_path(
|
|
245
|
+
self.code_model.client.parameters.path, "self._serialize"
|
|
246
|
+
)
|
|
189
247
|
|
|
190
|
-
class ConfigSerializer:
|
|
191
248
|
|
|
249
|
+
class ConfigSerializer:
|
|
192
250
|
def __init__(self, code_model: CodeModel, is_python3_file: bool) -> None:
|
|
193
251
|
self.code_model = code_model
|
|
252
|
+
self.parameter_serializer = ParameterSerializer()
|
|
194
253
|
self.is_python3_file = is_python3_file
|
|
195
254
|
|
|
196
255
|
def _init_signature(self, async_mode: bool) -> str:
|
|
197
|
-
return
|
|
256
|
+
return self.parameter_serializer.serialize_method(
|
|
198
257
|
function_def="def",
|
|
199
258
|
method_name="__init__",
|
|
200
|
-
|
|
201
|
-
method_param_signatures=self.code_model.
|
|
202
|
-
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
|
|
203
262
|
),
|
|
204
263
|
)
|
|
205
264
|
|
|
@@ -212,29 +271,36 @@ class ConfigSerializer:
|
|
|
212
271
|
)
|
|
213
272
|
|
|
214
273
|
def pop_kwargs_from_signature(self, async_mode: bool) -> List[str]:
|
|
215
|
-
return
|
|
216
|
-
|
|
217
|
-
|
|
274
|
+
return self.parameter_serializer.pop_kwargs_from_signature(
|
|
275
|
+
self.code_model.config.parameters.kwargs_to_pop(
|
|
276
|
+
async_mode or self.is_python3_file
|
|
277
|
+
),
|
|
278
|
+
check_kwarg_dict=False,
|
|
279
|
+
pop_headers_kwarg=PopKwargType.NO,
|
|
280
|
+
pop_params_kwarg=PopKwargType.NO,
|
|
281
|
+
)
|
|
218
282
|
|
|
219
283
|
def set_constants(self) -> List[str]:
|
|
220
284
|
return [
|
|
221
|
-
f"self.{p.
|
|
222
|
-
for p in self.code_model.
|
|
223
|
-
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
|
|
224
288
|
]
|
|
225
289
|
|
|
226
290
|
def check_required_parameters(self) -> List[str]:
|
|
227
291
|
return [
|
|
228
|
-
f
|
|
229
|
-
f
|
|
230
|
-
for p in self.code_model.
|
|
231
|
-
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)
|
|
232
296
|
]
|
|
233
297
|
|
|
234
|
-
def property_descriptions(self) -> List[str]:
|
|
298
|
+
def property_descriptions(self, async_mode: bool) -> List[str]:
|
|
235
299
|
retval: List[str] = []
|
|
236
|
-
for p in self.code_model.
|
|
237
|
-
retval.append(f":{p.description_keyword} {p.
|
|
238
|
-
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
|
+
)
|
|
239
305
|
retval.append('"""')
|
|
240
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_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
|
|
|
@@ -77,37 +56,55 @@ class GeneralSerializer:
|
|
|
77
56
|
ImportType.AZURECORE,
|
|
78
57
|
)
|
|
79
58
|
|
|
59
|
+
if self.code_model.need_mixin_abc:
|
|
60
|
+
file_import.add_submodule_import(
|
|
61
|
+
"abc",
|
|
62
|
+
"ABC",
|
|
63
|
+
ImportType.STDLIB,
|
|
64
|
+
)
|
|
65
|
+
file_import.add_submodule_import(
|
|
66
|
+
"azure.core",
|
|
67
|
+
f"{'Async' if self.async_mode else ''}PipelineClient",
|
|
68
|
+
ImportType.AZURECORE,
|
|
69
|
+
TypingSection.TYPING,
|
|
70
|
+
)
|
|
71
|
+
file_import.add_submodule_import(
|
|
72
|
+
"._configuration",
|
|
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
|
|
81
|
+
)
|
|
82
|
+
|
|
80
83
|
return template.render(
|
|
81
84
|
code_model=self.code_model,
|
|
82
85
|
imports=FileImportSerializer(
|
|
83
86
|
file_import,
|
|
84
87
|
is_python3_file=self.async_mode,
|
|
85
|
-
)
|
|
88
|
+
),
|
|
89
|
+
async_mode=self.async_mode,
|
|
86
90
|
)
|
|
87
91
|
|
|
88
|
-
|
|
89
92
|
def serialize_config_file(self) -> str:
|
|
90
93
|
|
|
91
|
-
package_name = self.code_model.options[
|
|
94
|
+
package_name = self.code_model.options["package_name"]
|
|
92
95
|
if package_name and package_name.startswith("azure-"):
|
|
93
|
-
package_name = package_name[len("azure-"):]
|
|
94
|
-
sdk_moniker =
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
self.code_model.options['credential'] and
|
|
98
|
-
isinstance(self.code_model.credential_schema_policy.credential, TokenCredentialSchema)
|
|
99
|
-
):
|
|
100
|
-
self._correct_credential_parameter()
|
|
101
|
-
|
|
96
|
+
package_name = package_name[len("azure-") :]
|
|
97
|
+
sdk_moniker = (
|
|
98
|
+
package_name if package_name else self.code_model.client.name.lower()
|
|
99
|
+
)
|
|
102
100
|
template = self.env.get_template("config.py.jinja2")
|
|
103
101
|
python3_only = self.code_model.options["python3_only"]
|
|
104
102
|
return template.render(
|
|
105
103
|
code_model=self.code_model,
|
|
106
104
|
async_mode=self.async_mode,
|
|
107
105
|
imports=FileImportSerializer(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
), 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,
|
|
111
108
|
),
|
|
112
109
|
serializer=ConfigSerializer(self.code_model, is_python3_file=python3_only),
|
|
113
110
|
sdk_moniker=sdk_moniker,
|