@autorest/python 6.9.4 → 6.9.5
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 -2
- package/autorest/codegen/__init__.py +250 -138
- package/autorest/codegen/_utils.py +2 -2
- package/autorest/codegen/models/__init__.py +7 -7
- package/autorest/codegen/models/base.py +5 -2
- package/autorest/codegen/models/client.py +31 -24
- package/autorest/codegen/models/combined_type.py +1 -1
- package/autorest/codegen/models/constant_type.py +1 -1
- package/autorest/codegen/models/credential_types.py +33 -23
- package/autorest/codegen/models/dictionary_type.py +1 -1
- package/autorest/codegen/models/enum_type.py +2 -2
- package/autorest/codegen/models/imports.py +71 -3
- package/autorest/codegen/models/list_type.py +1 -1
- package/autorest/codegen/models/lro_operation.py +2 -2
- package/autorest/codegen/models/model_type.py +1 -1
- package/autorest/codegen/models/operation.py +25 -17
- package/autorest/codegen/models/operation_group.py +2 -2
- package/autorest/codegen/models/paging_operation.py +13 -5
- package/autorest/codegen/models/parameter.py +1 -1
- package/autorest/codegen/models/primitive_types.py +17 -13
- package/autorest/codegen/models/property.py +1 -1
- package/autorest/codegen/models/request_builder.py +8 -6
- package/autorest/codegen/models/response.py +26 -14
- package/autorest/codegen/serializers/__init__.py +5 -0
- package/autorest/codegen/serializers/base_serializer.py +21 -0
- package/autorest/codegen/serializers/builder_serializer.py +33 -19
- package/autorest/codegen/serializers/client_serializer.py +20 -5
- package/autorest/codegen/serializers/enum_serializer.py +5 -8
- package/autorest/codegen/serializers/general_serializer.py +19 -23
- package/autorest/codegen/serializers/model_serializer.py +5 -9
- package/autorest/codegen/serializers/operation_groups_serializer.py +4 -5
- package/autorest/codegen/serializers/patch_serializer.py +4 -8
- package/autorest/codegen/serializers/request_builders_serializer.py +4 -4
- package/autorest/codegen/serializers/sample_serializer.py +11 -9
- package/autorest/codegen/serializers/types_serializer.py +3 -8
- package/autorest/codegen/templates/config.py.jinja2 +3 -1
- package/autorest/codegen/templates/enum_container.py.jinja2 +1 -1
- package/autorest/codegen/templates/model_base.py.jinja2 +4 -4
- package/autorest/codegen/templates/packaging_templates/LICENSE.jinja2 +1 -1
- package/autorest/codegen/templates/packaging_templates/README.md.jinja2 +3 -1
- package/autorest/codegen/templates/packaging_templates/setup.py.jinja2 +7 -3
- package/autorest/codegen/templates/serialization.py.jinja2 +17 -18
- package/autorest/m4reformatter/__init__.py +1 -1
- package/autorest/multiapi/models/imports.py +1 -1
- package/autorest/multiapi/serializers/__init__.py +4 -1
- package/autorest/preprocess/__init__.py +1 -9
- package/package.json +1 -1
|
@@ -107,7 +107,7 @@ class BinaryType(PrimitiveType):
|
|
|
107
107
|
from .combined_type import CombinedType
|
|
108
108
|
from .operation import OperationBase
|
|
109
109
|
|
|
110
|
-
file_import =
|
|
110
|
+
file_import = self.init_file_import()
|
|
111
111
|
file_import.add_submodule_import("typing", "IO", ImportType.STDLIB)
|
|
112
112
|
operation = kwargs.get("operation")
|
|
113
113
|
if (
|
|
@@ -145,7 +145,7 @@ class BinaryIteratorType(PrimitiveType):
|
|
|
145
145
|
return self.get_declaration("Iterator[bytes]")
|
|
146
146
|
|
|
147
147
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
148
|
-
file_import =
|
|
148
|
+
file_import = self.init_file_import()
|
|
149
149
|
iterator = "AsyncIterator" if kwargs.get("async_mode") else "Iterator"
|
|
150
150
|
file_import.add_submodule_import("typing", iterator, ImportType.STDLIB)
|
|
151
151
|
return file_import
|
|
@@ -171,7 +171,7 @@ class AnyType(PrimitiveType):
|
|
|
171
171
|
return self.get_declaration({})
|
|
172
172
|
|
|
173
173
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
174
|
-
file_import =
|
|
174
|
+
file_import = self.init_file_import()
|
|
175
175
|
file_import.add_submodule_import(
|
|
176
176
|
"typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL
|
|
177
177
|
)
|
|
@@ -204,7 +204,7 @@ class AnyObjectType(PrimitiveType):
|
|
|
204
204
|
return "isinstance({}, MutableMapping)"
|
|
205
205
|
|
|
206
206
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
207
|
-
file_import =
|
|
207
|
+
file_import = self.init_file_import()
|
|
208
208
|
file_import.define_mutable_mapping_type()
|
|
209
209
|
return file_import
|
|
210
210
|
|
|
@@ -386,7 +386,7 @@ class DatetimeType(PrimitiveType):
|
|
|
386
386
|
return f'"{value}"'
|
|
387
387
|
|
|
388
388
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
389
|
-
file_import =
|
|
389
|
+
file_import = self.init_file_import()
|
|
390
390
|
file_import.add_import("datetime", ImportType.STDLIB)
|
|
391
391
|
return file_import
|
|
392
392
|
|
|
@@ -429,7 +429,7 @@ class TimeType(PrimitiveType):
|
|
|
429
429
|
return f'"{value}"'
|
|
430
430
|
|
|
431
431
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
432
|
-
file_import =
|
|
432
|
+
file_import = self.init_file_import()
|
|
433
433
|
file_import.add_import("datetime", ImportType.STDLIB)
|
|
434
434
|
return file_import
|
|
435
435
|
|
|
@@ -476,7 +476,7 @@ class UnixTimeType(PrimitiveType):
|
|
|
476
476
|
return f'"{value}"'
|
|
477
477
|
|
|
478
478
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
479
|
-
file_import =
|
|
479
|
+
file_import = self.init_file_import()
|
|
480
480
|
file_import.add_import("datetime", ImportType.STDLIB)
|
|
481
481
|
return file_import
|
|
482
482
|
|
|
@@ -519,7 +519,7 @@ class DateType(PrimitiveType):
|
|
|
519
519
|
return f'"{value}"'
|
|
520
520
|
|
|
521
521
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
522
|
-
file_import =
|
|
522
|
+
file_import = self.init_file_import()
|
|
523
523
|
file_import.add_import("datetime", ImportType.STDLIB)
|
|
524
524
|
return file_import
|
|
525
525
|
|
|
@@ -562,7 +562,7 @@ class DurationType(PrimitiveType):
|
|
|
562
562
|
return f'"{value}"'
|
|
563
563
|
|
|
564
564
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
565
|
-
file_import =
|
|
565
|
+
file_import = self.init_file_import()
|
|
566
566
|
file_import.add_import("datetime", ImportType.STDLIB)
|
|
567
567
|
return file_import
|
|
568
568
|
|
|
@@ -606,20 +606,24 @@ class ByteArraySchema(PrimitiveType):
|
|
|
606
606
|
return "isinstance({}, bytes)"
|
|
607
607
|
|
|
608
608
|
|
|
609
|
-
class
|
|
609
|
+
class SdkCoreType(PrimitiveType):
|
|
610
610
|
def __init__(self, yaml_data: Dict[str, Any], code_model: "CodeModel") -> None:
|
|
611
611
|
super().__init__(yaml_data=yaml_data, code_model=code_model)
|
|
612
612
|
self.name = yaml_data.get("name", "")
|
|
613
613
|
|
|
614
614
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
615
|
-
return "~
|
|
615
|
+
return f"~{self.init_file_import().import_core}" + self.type_annotation(
|
|
616
|
+
**kwargs
|
|
617
|
+
)
|
|
616
618
|
|
|
617
619
|
def type_annotation(self, **kwargs: Any) -> str:
|
|
618
620
|
return self.name
|
|
619
621
|
|
|
620
622
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
621
|
-
file_import =
|
|
622
|
-
file_import.add_submodule_import(
|
|
623
|
+
file_import = self.init_file_import()
|
|
624
|
+
file_import.add_submodule_import(
|
|
625
|
+
file_import.import_core, self.name, ImportType.SDKCORE
|
|
626
|
+
)
|
|
623
627
|
return file_import
|
|
624
628
|
|
|
625
629
|
@property
|
|
@@ -147,7 +147,7 @@ class Property(BaseModel): # pylint: disable=too-many-instance-attributes
|
|
|
147
147
|
return retval or None
|
|
148
148
|
|
|
149
149
|
def imports(self, **kwargs) -> FileImport:
|
|
150
|
-
file_import =
|
|
150
|
+
file_import = self.init_file_import()
|
|
151
151
|
if self.is_discriminator and isinstance(self.type, EnumType):
|
|
152
152
|
return file_import
|
|
153
153
|
file_import.merge(
|
|
@@ -72,16 +72,16 @@ class RequestBuilderBase(BaseBuilder[ParameterListType]):
|
|
|
72
72
|
|
|
73
73
|
def response_docstring_text(self, **kwargs) -> str:
|
|
74
74
|
return (
|
|
75
|
-
"Returns an :class:`~
|
|
75
|
+
f"Returns an :class:`~{self.response_docstring_type()}` that you will pass to the client's "
|
|
76
76
|
+ "`send_request` method. See https://aka.ms/azsdk/dpcodegen/python/send_request for how to "
|
|
77
77
|
+ "incorporate this response into your code flow."
|
|
78
78
|
)
|
|
79
79
|
|
|
80
80
|
def response_docstring_type(self, **kwargs) -> str:
|
|
81
|
-
return "~
|
|
81
|
+
return f"~{self.init_file_import().import_core_rest}.HttpRequest"
|
|
82
82
|
|
|
83
83
|
def imports(self) -> FileImport:
|
|
84
|
-
file_import =
|
|
84
|
+
file_import = self.init_file_import()
|
|
85
85
|
relative_path = ".."
|
|
86
86
|
if (
|
|
87
87
|
not self.code_model.options["builders_visibility"] == "embedded"
|
|
@@ -98,14 +98,16 @@ class RequestBuilderBase(BaseBuilder[ParameterListType]):
|
|
|
98
98
|
)
|
|
99
99
|
|
|
100
100
|
file_import.add_submodule_import(
|
|
101
|
-
|
|
101
|
+
file_import.import_core_rest,
|
|
102
102
|
"HttpRequest",
|
|
103
|
-
ImportType.
|
|
103
|
+
ImportType.SDKCORE,
|
|
104
104
|
)
|
|
105
105
|
|
|
106
106
|
if self.parameters.headers or self.parameters.query:
|
|
107
107
|
file_import.add_submodule_import(
|
|
108
|
-
|
|
108
|
+
file_import.import_core_utils,
|
|
109
|
+
"case_insensitive_dict",
|
|
110
|
+
ImportType.SDKCORE,
|
|
109
111
|
)
|
|
110
112
|
file_import.add_submodule_import(
|
|
111
113
|
"typing", "Any", ImportType.STDLIB, typing_section=TypingSection.CONDITIONAL
|
|
@@ -8,7 +8,7 @@ from typing import Dict, Optional, List, Any, TYPE_CHECKING, Union
|
|
|
8
8
|
from .base import BaseModel
|
|
9
9
|
from .base import BaseType
|
|
10
10
|
from .imports import FileImport, ImportType, TypingSection
|
|
11
|
-
from .primitive_types import BinaryType, BinaryIteratorType
|
|
11
|
+
from .primitive_types import BinaryType, BinaryIteratorType, ByteArraySchema
|
|
12
12
|
from .dictionary_type import DictionaryType
|
|
13
13
|
from .list_type import ListType
|
|
14
14
|
from .model_type import ModelType
|
|
@@ -58,6 +58,7 @@ class Response(BaseModel):
|
|
|
58
58
|
self.headers = headers or []
|
|
59
59
|
self.type = type
|
|
60
60
|
self.nullable = yaml_data.get("nullable")
|
|
61
|
+
self.default_content_type = yaml_data.get("defaultContentType")
|
|
61
62
|
|
|
62
63
|
@property
|
|
63
64
|
def result_property(self) -> str:
|
|
@@ -80,7 +81,12 @@ class Response(BaseModel):
|
|
|
80
81
|
@property
|
|
81
82
|
def is_stream_response(self) -> bool:
|
|
82
83
|
"""Is the response expected to be streamable, like a download."""
|
|
83
|
-
|
|
84
|
+
retval = isinstance(self.type, BinaryIteratorType) or (
|
|
85
|
+
isinstance(self.type, ByteArraySchema)
|
|
86
|
+
and bool(self.default_content_type)
|
|
87
|
+
and self.default_content_type != "application/json"
|
|
88
|
+
)
|
|
89
|
+
return retval
|
|
84
90
|
|
|
85
91
|
@property
|
|
86
92
|
def serialization_type(self) -> str:
|
|
@@ -108,7 +114,7 @@ class Response(BaseModel):
|
|
|
108
114
|
return self.type.docstring_type(**kwargs) if self.type else "None"
|
|
109
115
|
|
|
110
116
|
def _imports_shared(self, **kwargs: Any) -> FileImport:
|
|
111
|
-
file_import =
|
|
117
|
+
file_import = self.init_file_import()
|
|
112
118
|
if self.type:
|
|
113
119
|
file_import.merge(self.type.imports(**kwargs))
|
|
114
120
|
if self.nullable:
|
|
@@ -158,6 +164,14 @@ class PagingResponse(Response):
|
|
|
158
164
|
def __init__(self, *args, **kwargs) -> None:
|
|
159
165
|
super().__init__(*args, **kwargs)
|
|
160
166
|
self.item_type = self.code_model.lookup_type(id(self.yaml_data["itemType"]))
|
|
167
|
+
self.pager_sync: str = (
|
|
168
|
+
self.yaml_data.get("pagerSync")
|
|
169
|
+
or f"{self.init_file_import().import_core_paging}.ItemPaged"
|
|
170
|
+
)
|
|
171
|
+
self.pager_async: str = (
|
|
172
|
+
self.yaml_data.get("pagerAsync")
|
|
173
|
+
or f"{self.init_file_import().import_core_paging_async}.AsyncItemPaged"
|
|
174
|
+
)
|
|
161
175
|
|
|
162
176
|
def get_polymorphic_subtypes(self, polymorphic_subtypes: List["ModelType"]) -> None:
|
|
163
177
|
return self.item_type.get_polymorphic_subtypes(polymorphic_subtypes)
|
|
@@ -166,9 +180,7 @@ class PagingResponse(Response):
|
|
|
166
180
|
return self.item_type.get_json_template_representation()
|
|
167
181
|
|
|
168
182
|
def get_pager_path(self, async_mode: bool) -> str:
|
|
169
|
-
return
|
|
170
|
-
self.yaml_data["pagerAsync"] if async_mode else self.yaml_data["pagerSync"]
|
|
171
|
-
)
|
|
183
|
+
return self.pager_async if async_mode else self.pager_sync
|
|
172
184
|
|
|
173
185
|
def get_pager(self, async_mode: bool) -> str:
|
|
174
186
|
return self.get_pager_path(async_mode).split(".")[-1]
|
|
@@ -192,7 +204,7 @@ class PagingResponse(Response):
|
|
|
192
204
|
pager_import_path = ".".join(self.get_pager_path(async_mode).split(".")[:-1])
|
|
193
205
|
pager = self.get_pager(async_mode)
|
|
194
206
|
|
|
195
|
-
file_import.add_submodule_import(pager_import_path, pager, ImportType.
|
|
207
|
+
file_import.add_submodule_import(pager_import_path, pager, ImportType.SDKCORE)
|
|
196
208
|
return file_import
|
|
197
209
|
|
|
198
210
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
@@ -200,7 +212,9 @@ class PagingResponse(Response):
|
|
|
200
212
|
async_mode = kwargs.get("async_mode")
|
|
201
213
|
if async_mode:
|
|
202
214
|
file_import.add_submodule_import(
|
|
203
|
-
|
|
215
|
+
file_import.import_core_paging_async,
|
|
216
|
+
"AsyncList",
|
|
217
|
+
ImportType.SDKCORE,
|
|
204
218
|
)
|
|
205
219
|
|
|
206
220
|
return file_import
|
|
@@ -269,9 +283,7 @@ class LROResponse(Response):
|
|
|
269
283
|
async_mode = kwargs["async_mode"]
|
|
270
284
|
poller_import_path = ".".join(self.get_poller_path(async_mode).split(".")[:-1])
|
|
271
285
|
poller = self.get_poller(async_mode)
|
|
272
|
-
file_import.add_submodule_import(
|
|
273
|
-
poller_import_path, poller, ImportType.AZURECORE
|
|
274
|
-
)
|
|
286
|
+
file_import.add_submodule_import(poller_import_path, poller, ImportType.SDKCORE)
|
|
275
287
|
return file_import
|
|
276
288
|
|
|
277
289
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
@@ -285,7 +297,7 @@ class LROResponse(Response):
|
|
|
285
297
|
file_import.add_submodule_import(
|
|
286
298
|
default_polling_method_import_path,
|
|
287
299
|
default_polling_method,
|
|
288
|
-
ImportType.
|
|
300
|
+
ImportType.SDKCORE,
|
|
289
301
|
)
|
|
290
302
|
default_no_polling_method_import_path = ".".join(
|
|
291
303
|
self.get_no_polling_method_path(async_mode).split(".")[:-1]
|
|
@@ -294,7 +306,7 @@ class LROResponse(Response):
|
|
|
294
306
|
file_import.add_submodule_import(
|
|
295
307
|
default_no_polling_method_import_path,
|
|
296
308
|
default_no_polling_method,
|
|
297
|
-
ImportType.
|
|
309
|
+
ImportType.SDKCORE,
|
|
298
310
|
)
|
|
299
311
|
|
|
300
312
|
base_polling_method_import_path = ".".join(
|
|
@@ -302,7 +314,7 @@ class LROResponse(Response):
|
|
|
302
314
|
)
|
|
303
315
|
base_polling_method = self.get_base_polling_method(async_mode)
|
|
304
316
|
file_import.add_submodule_import(
|
|
305
|
-
base_polling_method_import_path, base_polling_method, ImportType.
|
|
317
|
+
base_polling_method_import_path, base_polling_method, ImportType.SDKCORE
|
|
306
318
|
)
|
|
307
319
|
return file_import
|
|
308
320
|
|
|
@@ -240,6 +240,11 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
240
240
|
serializer = GeneralSerializer(self.code_model, env, async_mode=False)
|
|
241
241
|
params = self.code_model.options["package_configuration"] or {}
|
|
242
242
|
for template_name in package_files:
|
|
243
|
+
if (
|
|
244
|
+
self.code_model.options["unbranded"]
|
|
245
|
+
and template_name == "dev_requirements.txt.jinja2"
|
|
246
|
+
):
|
|
247
|
+
continue
|
|
243
248
|
file = template_name.replace(".jinja2", "")
|
|
244
249
|
output_name = root_of_sdk / file
|
|
245
250
|
if not self.read_file(output_name) or file in _REGENERATE_FILES:
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
+
# license information.
|
|
5
|
+
# --------------------------------------------------------------------------
|
|
6
|
+
from jinja2 import Environment
|
|
7
|
+
from ..models import (
|
|
8
|
+
FileImport,
|
|
9
|
+
CodeModel,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class BaseSerializer:
|
|
14
|
+
"""Base serializer for SDK root level files"""
|
|
15
|
+
|
|
16
|
+
def __init__(self, code_model: CodeModel, env: Environment):
|
|
17
|
+
self.code_model = code_model
|
|
18
|
+
self.env = env
|
|
19
|
+
|
|
20
|
+
def init_file_import(self) -> FileImport:
|
|
21
|
+
return FileImport(self.code_model)
|
|
@@ -426,6 +426,12 @@ class _BuilderBaseSerializer(Generic[BuilderType]): # pylint: disable=abstract-
|
|
|
426
426
|
builder.parameters.path, self.serializer_name
|
|
427
427
|
)
|
|
428
428
|
|
|
429
|
+
@property
|
|
430
|
+
def pipeline_name(self) -> str:
|
|
431
|
+
if not self.code_model.options["unbranded"]:
|
|
432
|
+
return "_pipeline"
|
|
433
|
+
return "pipeline"
|
|
434
|
+
|
|
429
435
|
|
|
430
436
|
############################## REQUEST BUILDERS ##############################
|
|
431
437
|
|
|
@@ -483,12 +489,13 @@ class RequestBuilderSerializer(
|
|
|
483
489
|
return False
|
|
484
490
|
|
|
485
491
|
def response_docstring(self, builder: RequestBuilderType) -> List[str]:
|
|
492
|
+
import_core_rest = builder.init_file_import().import_core_rest
|
|
486
493
|
response_str = (
|
|
487
|
-
":return: Returns an :class:`~
|
|
494
|
+
f":return: Returns an :class:`~{import_core_rest}.HttpRequest` that you will pass to the client's "
|
|
488
495
|
+ "`send_request` method. See https://aka.ms/azsdk/dpcodegen/python/send_request for how to "
|
|
489
496
|
+ "incorporate this response into your code flow."
|
|
490
497
|
)
|
|
491
|
-
rtype_str = ":rtype: ~
|
|
498
|
+
rtype_str = f":rtype: ~{import_core_rest}.HttpRequest"
|
|
492
499
|
return [response_str, rtype_str]
|
|
493
500
|
|
|
494
501
|
def pop_kwargs_from_signature(self, builder: RequestBuilderType) -> List[str]:
|
|
@@ -637,13 +644,13 @@ class _OperationSerializer(
|
|
|
637
644
|
def make_pipeline_call(self, builder: OperationType) -> List[str]:
|
|
638
645
|
type_ignore = self.async_mode and builder.group_name == "" # is in a mixin
|
|
639
646
|
stream_value = (
|
|
640
|
-
'kwargs.pop("stream",
|
|
647
|
+
f'kwargs.pop("stream", {builder.has_stream_response})'
|
|
641
648
|
if builder.expose_stream_keyword
|
|
642
649
|
else builder.has_stream_response
|
|
643
650
|
)
|
|
644
651
|
return [
|
|
645
652
|
f"_stream = {stream_value}",
|
|
646
|
-
f"pipeline_response: PipelineResponse = {self._call_method}self._client.
|
|
653
|
+
f"pipeline_response: PipelineResponse = {self._call_method}self._client.{self.pipeline_name}.run( "
|
|
647
654
|
+ f"{'# type: ignore' if type_ignore else ''} # pylint: disable=protected-access",
|
|
648
655
|
" _request,",
|
|
649
656
|
" stream=_stream,",
|
|
@@ -723,7 +730,7 @@ class _OperationSerializer(
|
|
|
723
730
|
return [
|
|
724
731
|
response_str,
|
|
725
732
|
rtype_str,
|
|
726
|
-
":raises ~
|
|
733
|
+
f":raises ~{builder.init_file_import().import_core_exceptions}.HttpResponseError:",
|
|
727
734
|
]
|
|
728
735
|
|
|
729
736
|
def _serialize_body_parameter(self, builder: OperationType) -> List[str]:
|
|
@@ -1049,14 +1056,17 @@ class _OperationSerializer(
|
|
|
1049
1056
|
if response.headers:
|
|
1050
1057
|
retval.append("")
|
|
1051
1058
|
deserialize_code: List[str] = []
|
|
1052
|
-
if
|
|
1053
|
-
|
|
1054
|
-
"
|
|
1059
|
+
if builder.has_stream_response:
|
|
1060
|
+
if isinstance(response.type, ByteArraySchema):
|
|
1061
|
+
retval.append(f"{'await ' if self.async_mode else ''}response.read()")
|
|
1062
|
+
deserialized = "response.content"
|
|
1063
|
+
else:
|
|
1064
|
+
deserialized = (
|
|
1055
1065
|
"response.iter_bytes()"
|
|
1056
1066
|
if self.code_model.options["version_tolerant"]
|
|
1057
|
-
else "response.stream_download(self._client.
|
|
1067
|
+
else f"response.stream_download(self._client.{self.pipeline_name})"
|
|
1058
1068
|
)
|
|
1059
|
-
)
|
|
1069
|
+
deserialize_code.append(f"deserialized = {deserialized}")
|
|
1060
1070
|
elif response.type:
|
|
1061
1071
|
pylint_disable = ""
|
|
1062
1072
|
if isinstance(response.type, ModelType) and response.type.internal:
|
|
@@ -1069,14 +1079,18 @@ class _OperationSerializer(
|
|
|
1069
1079
|
deserialize_code.append(" pipeline_response")
|
|
1070
1080
|
deserialize_code.append(")")
|
|
1071
1081
|
elif self.code_model.options["models_mode"] == "dpg":
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1082
|
+
if builder.has_stream_response:
|
|
1083
|
+
deserialize_code.append("deserialized = response.content")
|
|
1084
|
+
else:
|
|
1085
|
+
deserialize_code.append("deserialized = _deserialize(")
|
|
1086
|
+
deserialize_code.append(
|
|
1087
|
+
f" {response.type.type_annotation(is_operation_file=True)},{pylint_disable}"
|
|
1088
|
+
)
|
|
1089
|
+
deserialize_code.append(
|
|
1090
|
+
f" response.json(){response.result_property}"
|
|
1091
|
+
)
|
|
1092
|
+
deserialize_code.append(")")
|
|
1093
|
+
|
|
1080
1094
|
else:
|
|
1081
1095
|
deserialized_value = (
|
|
1082
1096
|
"ET.fromstring(response.text())"
|
|
@@ -1088,7 +1102,7 @@ class _OperationSerializer(
|
|
|
1088
1102
|
deserialize_code.append("else:")
|
|
1089
1103
|
deserialize_code.append(" deserialized = None")
|
|
1090
1104
|
if len(deserialize_code) > 0:
|
|
1091
|
-
if builder.expose_stream_keyword:
|
|
1105
|
+
if builder.expose_stream_keyword and not builder.has_stream_response:
|
|
1092
1106
|
retval.append("if _stream:")
|
|
1093
1107
|
retval.append(" deserialized = response.iter_bytes()")
|
|
1094
1108
|
retval.append("else:")
|
|
@@ -111,19 +111,28 @@ class ClientSerializer:
|
|
|
111
111
|
def initialize_pipeline_client(self, async_mode: bool) -> List[str]:
|
|
112
112
|
result = []
|
|
113
113
|
pipeline_client_name = self.client.pipeline_class(async_mode)
|
|
114
|
+
endpoint_name = (
|
|
115
|
+
"endpoint" if self.client.code_model.options["unbranded"] else "base_url"
|
|
116
|
+
)
|
|
114
117
|
params = {
|
|
115
|
-
|
|
118
|
+
endpoint_name: self.host_variable_name,
|
|
116
119
|
"policies": "_policies",
|
|
117
120
|
}
|
|
118
121
|
if not self.client.code_model.is_legacy and self.client.request_id_header_name:
|
|
119
122
|
result.append(
|
|
120
123
|
f'kwargs["request_id_header_name"] = "{self.client.request_id_header_name}"'
|
|
121
124
|
)
|
|
125
|
+
policies = build_policies(
|
|
126
|
+
self.client.code_model.options["azure_arm"],
|
|
127
|
+
async_mode,
|
|
128
|
+
self.client.code_model.options["unbranded"],
|
|
129
|
+
self.client.code_model.options["tracing"],
|
|
130
|
+
)
|
|
122
131
|
result.extend(
|
|
123
132
|
[
|
|
124
133
|
"_policies = kwargs.pop('policies', None)",
|
|
125
134
|
"if _policies is None:",
|
|
126
|
-
f' _policies = [{",".join(
|
|
135
|
+
f' _policies = [{",".join(policies)}]',
|
|
127
136
|
f"self._client: {pipeline_client_name} = {pipeline_client_name}("
|
|
128
137
|
f"{', '.join(f'{k}={v}' for k, v in params.items())}, **kwargs)",
|
|
129
138
|
]
|
|
@@ -243,7 +252,9 @@ class ClientSerializer:
|
|
|
243
252
|
return retval
|
|
244
253
|
|
|
245
254
|
def _rest_request_example(self, async_mode: bool) -> List[str]:
|
|
246
|
-
retval = [
|
|
255
|
+
retval = [
|
|
256
|
+
f">>> from {self.client.init_file_import().import_core_rest} import HttpRequest"
|
|
257
|
+
]
|
|
247
258
|
retval.append('>>> request = HttpRequest("GET", "https://www.example.org/")')
|
|
248
259
|
retval.append("<HttpRequest [GET], url: 'https://www.example.org/'>")
|
|
249
260
|
retval.extend(self._example_make_call(async_mode))
|
|
@@ -262,7 +273,9 @@ class ClientSerializer:
|
|
|
262
273
|
)
|
|
263
274
|
retval.append("")
|
|
264
275
|
retval.append(":param request: The network request you want to make. Required.")
|
|
265
|
-
retval.append(
|
|
276
|
+
retval.append(
|
|
277
|
+
f":type request: ~{self.client.init_file_import().import_core_rest}.HttpRequest"
|
|
278
|
+
)
|
|
266
279
|
retval.append(
|
|
267
280
|
":keyword bool stream: Whether the response payload will be streamed. Defaults to False."
|
|
268
281
|
)
|
|
@@ -270,7 +283,9 @@ class ClientSerializer:
|
|
|
270
283
|
":return: The response of your network call. Does not do error handling on your response."
|
|
271
284
|
)
|
|
272
285
|
http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
|
|
273
|
-
retval.append(
|
|
286
|
+
retval.append(
|
|
287
|
+
f":rtype: ~{self.client.init_file_import().import_core_rest}.{http_response}"
|
|
288
|
+
)
|
|
274
289
|
retval.append('"""')
|
|
275
290
|
return retval
|
|
276
291
|
|
|
@@ -4,16 +4,13 @@
|
|
|
4
4
|
# license information.
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
from ..models import CodeModel
|
|
7
|
+
from .base_serializer import BaseSerializer
|
|
9
8
|
|
|
10
9
|
|
|
11
|
-
class EnumSerializer:
|
|
12
|
-
def __init__(self, code_model: CodeModel, env: Environment) -> None:
|
|
13
|
-
self.code_model = code_model
|
|
14
|
-
self.env = env
|
|
15
|
-
|
|
10
|
+
class EnumSerializer(BaseSerializer):
|
|
16
11
|
def serialize(self) -> str:
|
|
17
12
|
# Generate the enum file
|
|
18
13
|
template = self.env.get_template("enum_container.py.jinja2")
|
|
19
|
-
return template.render(
|
|
14
|
+
return template.render(
|
|
15
|
+
code_model=self.code_model, file_import=self.init_file_import()
|
|
16
|
+
)
|
|
@@ -8,29 +8,20 @@ from jinja2 import Environment
|
|
|
8
8
|
from .import_serializer import FileImportSerializer, TypingSection
|
|
9
9
|
from ..models.imports import MsrestImportType
|
|
10
10
|
from ..models import (
|
|
11
|
-
FileImport,
|
|
12
11
|
ImportType,
|
|
13
12
|
CodeModel,
|
|
14
13
|
TokenCredentialType,
|
|
15
14
|
Client,
|
|
16
15
|
)
|
|
17
16
|
from .client_serializer import ClientSerializer, ConfigSerializer
|
|
17
|
+
from .base_serializer import BaseSerializer
|
|
18
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
19
|
|
|
27
|
-
|
|
28
|
-
class GeneralSerializer:
|
|
20
|
+
class GeneralSerializer(BaseSerializer):
|
|
29
21
|
"""General serializer for SDK root level files"""
|
|
30
22
|
|
|
31
23
|
def __init__(self, code_model: CodeModel, env: Environment, async_mode: bool):
|
|
32
|
-
|
|
33
|
-
self.env = env
|
|
24
|
+
super().__init__(code_model, env)
|
|
34
25
|
self.async_mode = async_mode
|
|
35
26
|
|
|
36
27
|
def serialize_setup_file(self) -> str:
|
|
@@ -68,7 +59,7 @@ class GeneralSerializer:
|
|
|
68
59
|
}
|
|
69
60
|
params.update(self.code_model.options)
|
|
70
61
|
params.update(kwargs)
|
|
71
|
-
return template.render(**params)
|
|
62
|
+
return template.render(file_import=self.init_file_import(), **params)
|
|
72
63
|
|
|
73
64
|
def serialize_pkgutil_init_file(self) -> str:
|
|
74
65
|
template = self.env.get_template("pkgutil_init.py.jinja2")
|
|
@@ -85,7 +76,7 @@ class GeneralSerializer:
|
|
|
85
76
|
def serialize_service_client_file(self, clients: List[Client]) -> str:
|
|
86
77
|
template = self.env.get_template("client_container.py.jinja2")
|
|
87
78
|
|
|
88
|
-
imports =
|
|
79
|
+
imports = self.init_file_import()
|
|
89
80
|
for client in clients:
|
|
90
81
|
imports.merge(client.imports(self.async_mode))
|
|
91
82
|
|
|
@@ -101,12 +92,12 @@ class GeneralSerializer:
|
|
|
101
92
|
template = self.env.get_template("vendor.py.jinja2")
|
|
102
93
|
|
|
103
94
|
# configure imports
|
|
104
|
-
file_import =
|
|
95
|
+
file_import = self.init_file_import()
|
|
105
96
|
if self.code_model.need_request_converter:
|
|
106
97
|
file_import.add_submodule_import(
|
|
107
98
|
"azure.core.pipeline.transport",
|
|
108
99
|
"HttpRequest",
|
|
109
|
-
ImportType.
|
|
100
|
+
ImportType.SDKCORE,
|
|
110
101
|
)
|
|
111
102
|
|
|
112
103
|
if self.code_model.need_mixin_abc:
|
|
@@ -116,9 +107,9 @@ class GeneralSerializer:
|
|
|
116
107
|
ImportType.STDLIB,
|
|
117
108
|
)
|
|
118
109
|
file_import.add_submodule_import(
|
|
119
|
-
|
|
110
|
+
file_import.import_core_pipeline_client,
|
|
120
111
|
f"{'Async' if self.async_mode else ''}PipelineClient",
|
|
121
|
-
ImportType.
|
|
112
|
+
ImportType.SDKCORE,
|
|
122
113
|
TypingSection.TYPING,
|
|
123
114
|
)
|
|
124
115
|
file_import.add_msrest_import(
|
|
@@ -135,9 +126,9 @@ class GeneralSerializer:
|
|
|
135
126
|
if self.code_model.has_etag:
|
|
136
127
|
file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB)
|
|
137
128
|
file_import.add_submodule_import(
|
|
138
|
-
|
|
129
|
+
file_import.import_core,
|
|
139
130
|
"MatchConditions",
|
|
140
|
-
ImportType.
|
|
131
|
+
ImportType.SDKCORE,
|
|
141
132
|
)
|
|
142
133
|
|
|
143
134
|
return template.render(
|
|
@@ -151,7 +142,7 @@ class GeneralSerializer:
|
|
|
151
142
|
|
|
152
143
|
def serialize_config_file(self, clients: List[Client]) -> str:
|
|
153
144
|
template = self.env.get_template("config_container.py.jinja2")
|
|
154
|
-
imports =
|
|
145
|
+
imports = self.init_file_import()
|
|
155
146
|
for client in self.code_model.clients:
|
|
156
147
|
imports.merge(client.config.imports(self.async_mode))
|
|
157
148
|
return template.render(
|
|
@@ -168,11 +159,16 @@ class GeneralSerializer:
|
|
|
168
159
|
|
|
169
160
|
def serialize_serialization_file(self) -> str:
|
|
170
161
|
template = self.env.get_template("serialization.py.jinja2")
|
|
171
|
-
return template.render(
|
|
162
|
+
return template.render(
|
|
163
|
+
import_core_exceptions=self.init_file_import().import_core_exceptions,
|
|
164
|
+
import_core_serialization=self.init_file_import().import_core_serialization,
|
|
165
|
+
)
|
|
172
166
|
|
|
173
167
|
def serialize_model_base_file(self) -> str:
|
|
174
168
|
template = self.env.get_template("model_base.py.jinja2")
|
|
175
|
-
return template.render(
|
|
169
|
+
return template.render(
|
|
170
|
+
code_model=self.code_model, file_import=self.init_file_import()
|
|
171
|
+
)
|
|
176
172
|
|
|
177
173
|
def serialize_validation_file(self) -> str:
|
|
178
174
|
template = self.env.get_template("validation.py.jinja2")
|