@autorest/python 5.15.0 → 5.16.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 +20 -0
- package/autorest/__init__.py +1 -2
- package/autorest/black/__init__.py +12 -5
- package/autorest/codegen/__init__.py +145 -73
- package/autorest/codegen/models/__init__.py +29 -18
- package/autorest/codegen/models/base_builder.py +48 -11
- package/autorest/codegen/models/base_model.py +6 -4
- package/autorest/codegen/models/base_schema.py +19 -18
- package/autorest/codegen/models/client.py +65 -21
- package/autorest/codegen/models/code_model.py +107 -61
- package/autorest/codegen/models/constant_schema.py +25 -13
- package/autorest/codegen/models/credential_model.py +23 -15
- package/autorest/codegen/models/credential_schema.py +18 -14
- package/autorest/codegen/models/credential_schema_policy.py +11 -15
- package/autorest/codegen/models/dictionary_schema.py +20 -17
- package/autorest/codegen/models/enum_schema.py +35 -25
- package/autorest/codegen/models/imports.py +70 -41
- package/autorest/codegen/models/list_schema.py +25 -13
- package/autorest/codegen/models/lro_operation.py +58 -22
- package/autorest/codegen/models/lro_paging_operation.py +2 -3
- package/autorest/codegen/models/object_schema.py +99 -49
- package/autorest/codegen/models/operation.py +236 -117
- package/autorest/codegen/models/operation_group.py +64 -34
- package/autorest/codegen/models/paging_operation.py +45 -18
- package/autorest/codegen/models/parameter.py +151 -83
- package/autorest/codegen/models/parameter_list.py +183 -162
- package/autorest/codegen/models/primitive_schemas.py +84 -55
- package/autorest/codegen/models/property.py +44 -26
- package/autorest/codegen/models/request_builder.py +65 -30
- package/autorest/codegen/models/request_builder_parameter.py +47 -23
- package/autorest/codegen/models/request_builder_parameter_list.py +77 -108
- package/autorest/codegen/models/schema_request.py +16 -6
- package/autorest/codegen/models/schema_response.py +18 -13
- package/autorest/codegen/models/utils.py +5 -2
- package/autorest/codegen/serializers/__init__.py +182 -91
- package/autorest/codegen/serializers/builder_serializer.py +667 -331
- package/autorest/codegen/serializers/client_serializer.py +98 -37
- package/autorest/codegen/serializers/general_serializer.py +61 -26
- package/autorest/codegen/serializers/import_serializer.py +93 -31
- package/autorest/codegen/serializers/metadata_serializer.py +73 -24
- package/autorest/codegen/serializers/model_base_serializer.py +35 -15
- package/autorest/codegen/serializers/model_generic_serializer.py +1 -4
- package/autorest/codegen/serializers/model_init_serializer.py +5 -1
- package/autorest/codegen/serializers/model_python3_serializer.py +7 -6
- package/autorest/codegen/serializers/operation_groups_serializer.py +20 -9
- package/autorest/codegen/serializers/operations_init_serializer.py +23 -11
- package/autorest/codegen/serializers/patch_serializer.py +4 -1
- package/autorest/codegen/serializers/{rest_serializer.py → request_builders_serializer.py} +29 -12
- package/autorest/codegen/serializers/utils.py +35 -21
- package/autorest/codegen/templates/init.py.jinja2 +2 -2
- package/autorest/codegen/templates/lro_operation.py.jinja2 +5 -7
- package/autorest/codegen/templates/lro_paging_operation.py.jinja2 +5 -7
- package/autorest/codegen/templates/metadata.json.jinja2 +7 -6
- package/autorest/codegen/templates/operation.py.jinja2 +7 -9
- package/autorest/codegen/templates/operation_group.py.jinja2 +2 -8
- package/autorest/codegen/templates/operation_groups_container.py.jinja2 +1 -1
- package/autorest/codegen/templates/paging_operation.py.jinja2 +7 -8
- package/autorest/codegen/templates/request_builder.py.jinja2 +18 -11
- package/autorest/jsonrpc/__init__.py +7 -12
- package/autorest/jsonrpc/localapi.py +4 -3
- package/autorest/jsonrpc/server.py +13 -6
- package/autorest/jsonrpc/stdstream.py +13 -6
- package/autorest/m2r/__init__.py +5 -8
- 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 +18 -23
- package/autorest/multiapi/serializers/import_serializer.py +47 -17
- package/autorest/multiapi/serializers/multiapi_serializer.py +17 -17
- package/autorest/multiapi/templates/multiapi_operations_mixin.py.jinja2 +1 -1
- package/autorest/multiapi/utils.py +3 -3
- package/autorest/namer/__init__.py +2 -4
- package/autorest/namer/name_converter.py +200 -103
- package/autorest/namer/python_mappings.py +10 -22
- package/package.json +2 -2
- package/run-python3.js +2 -3
- package/venvtools.py +1 -1
- package/autorest/codegen/models/rest.py +0 -42
|
@@ -24,13 +24,22 @@ from ..models import (
|
|
|
24
24
|
from .builder_serializer import get_operation_serializer
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
def _correct_credential_parameter(
|
|
28
|
-
|
|
27
|
+
def _correct_credential_parameter(
|
|
28
|
+
global_parameters: ParameterList, async_mode: bool
|
|
29
|
+
) -> None:
|
|
30
|
+
credential_param = [
|
|
31
|
+
gp
|
|
32
|
+
for gp in global_parameters.parameters
|
|
33
|
+
if isinstance(gp.schema, TokenCredentialSchema)
|
|
34
|
+
][0]
|
|
29
35
|
credential_param.schema = TokenCredentialSchema(async_mode=async_mode)
|
|
30
36
|
|
|
31
37
|
|
|
32
38
|
def _json_serialize_imports(
|
|
33
|
-
imports: Dict[
|
|
39
|
+
imports: Dict[
|
|
40
|
+
TypingSection,
|
|
41
|
+
Dict[ImportType, Dict[str, Set[Optional[Union[str, Tuple[str, str]]]]]],
|
|
42
|
+
]
|
|
34
43
|
):
|
|
35
44
|
if not imports:
|
|
36
45
|
return None
|
|
@@ -55,14 +64,18 @@ def _json_serialize_imports(
|
|
|
55
64
|
return json.dumps(json_serialize_imports)
|
|
56
65
|
|
|
57
66
|
|
|
58
|
-
def _mixin_imports(
|
|
67
|
+
def _mixin_imports(
|
|
68
|
+
mixin_operation_group: Optional[OperationGroup],
|
|
69
|
+
) -> Tuple[Optional[str], Optional[str]]:
|
|
59
70
|
if not mixin_operation_group:
|
|
60
71
|
return None, None
|
|
61
72
|
|
|
62
73
|
sync_mixin_imports = mixin_operation_group.imports_for_multiapi(async_mode=False)
|
|
63
74
|
async_mixin_imports = mixin_operation_group.imports_for_multiapi(async_mode=True)
|
|
64
75
|
|
|
65
|
-
return _json_serialize_imports(
|
|
76
|
+
return _json_serialize_imports(
|
|
77
|
+
sync_mixin_imports.to_dict()
|
|
78
|
+
), _json_serialize_imports(async_mixin_imports.to_dict())
|
|
66
79
|
|
|
67
80
|
|
|
68
81
|
class MetadataSerializer:
|
|
@@ -80,7 +93,9 @@ class MetadataSerializer:
|
|
|
80
93
|
total_api_version_list.sort()
|
|
81
94
|
|
|
82
95
|
# switching ' to " so json can decode the dict we end up writing to file
|
|
83
|
-
total_api_version_list = [
|
|
96
|
+
total_api_version_list = [
|
|
97
|
+
str(api_version).replace("'", '"') for api_version in total_api_version_list
|
|
98
|
+
]
|
|
84
99
|
if len(total_api_version_list) == 1:
|
|
85
100
|
chosen_version = total_api_version_list[0]
|
|
86
101
|
elif len(total_api_version_list) > 1:
|
|
@@ -97,26 +112,43 @@ class MetadataSerializer:
|
|
|
97
112
|
return global_parameters
|
|
98
113
|
|
|
99
114
|
def _service_client_imports(
|
|
100
|
-
self,
|
|
115
|
+
self,
|
|
116
|
+
global_parameters: ParameterList,
|
|
117
|
+
mixin_operation_group: Optional[OperationGroup],
|
|
118
|
+
async_mode: bool,
|
|
101
119
|
) -> str:
|
|
102
120
|
file_import = FileImport()
|
|
103
121
|
for gp in global_parameters:
|
|
104
122
|
file_import.merge(gp.imports())
|
|
105
|
-
file_import.add_submodule_import("azure.profiles", "KnownProfiles", import_type=ImportType.AZURECORE)
|
|
106
|
-
file_import.add_submodule_import("azure.profiles", "ProfileDefinition", import_type=ImportType.AZURECORE)
|
|
107
123
|
file_import.add_submodule_import(
|
|
108
|
-
"azure.profiles
|
|
124
|
+
"azure.profiles", "KnownProfiles", import_type=ImportType.AZURECORE
|
|
109
125
|
)
|
|
110
126
|
file_import.add_submodule_import(
|
|
111
|
-
".
|
|
127
|
+
"azure.profiles", "ProfileDefinition", import_type=ImportType.AZURECORE
|
|
128
|
+
)
|
|
129
|
+
file_import.add_submodule_import(
|
|
130
|
+
"azure.profiles.multiapiclient",
|
|
131
|
+
"MultiApiClientMixin",
|
|
132
|
+
import_type=ImportType.AZURECORE,
|
|
133
|
+
)
|
|
134
|
+
file_import.add_submodule_import(
|
|
135
|
+
"._configuration",
|
|
136
|
+
f"{self.code_model.class_name}Configuration",
|
|
137
|
+
ImportType.LOCAL,
|
|
112
138
|
)
|
|
113
139
|
# api_version and potentially endpoint require Optional typing
|
|
114
|
-
file_import.add_submodule_import(
|
|
140
|
+
file_import.add_submodule_import(
|
|
141
|
+
"typing", "Optional", ImportType.STDLIB, TypingSection.CONDITIONAL
|
|
142
|
+
)
|
|
115
143
|
if mixin_operation_group:
|
|
116
144
|
file_import.add_submodule_import(
|
|
117
|
-
"._operations_mixin",
|
|
145
|
+
"._operations_mixin",
|
|
146
|
+
f"{self.code_model.class_name}OperationsMixin",
|
|
147
|
+
ImportType.LOCAL,
|
|
118
148
|
)
|
|
119
|
-
file_import.merge(
|
|
149
|
+
file_import.merge(
|
|
150
|
+
self.code_model.service_client.imports_for_multiapi(async_mode=async_mode)
|
|
151
|
+
)
|
|
120
152
|
return _json_serialize_imports(file_import.to_dict())
|
|
121
153
|
|
|
122
154
|
def serialize(self) -> str:
|
|
@@ -134,7 +166,9 @@ class MetadataSerializer:
|
|
|
134
166
|
),
|
|
135
167
|
None,
|
|
136
168
|
)
|
|
137
|
-
mixin_operations =
|
|
169
|
+
mixin_operations = (
|
|
170
|
+
mixin_operation_group.operations if mixin_operation_group else []
|
|
171
|
+
)
|
|
138
172
|
sync_mixin_imports, async_mixin_imports = _mixin_imports(mixin_operation_group)
|
|
139
173
|
|
|
140
174
|
chosen_version, total_api_version_list = self._choose_api_version()
|
|
@@ -143,9 +177,9 @@ class MetadataSerializer:
|
|
|
143
177
|
# In this case, we need two copies of the credential global parameter
|
|
144
178
|
# for typing purposes.
|
|
145
179
|
async_global_parameters = self.code_model.global_parameters
|
|
146
|
-
if (
|
|
147
|
-
self.code_model.
|
|
148
|
-
|
|
180
|
+
if self.code_model.options["credential"] and isinstance(
|
|
181
|
+
self.code_model.credential_model.credential_schema_policy.credential,
|
|
182
|
+
TokenCredentialSchema,
|
|
149
183
|
):
|
|
150
184
|
# this ensures that the TokenCredentialSchema showing up in the list of code model's global parameters
|
|
151
185
|
# is sync. This way we only have to make a copy for an async_credential
|
|
@@ -163,8 +197,13 @@ class MetadataSerializer:
|
|
|
163
197
|
|
|
164
198
|
# setting to true, because for multiapi we always generate with a version file with version 0.1.0
|
|
165
199
|
self.code_model.options["package_version"] = "0.1.0"
|
|
166
|
-
if
|
|
167
|
-
self.code_model.
|
|
200
|
+
if (
|
|
201
|
+
self.code_model.options["azure_arm"]
|
|
202
|
+
and not self.code_model.service_client.parameters.host
|
|
203
|
+
):
|
|
204
|
+
self.code_model.service_client.parameters.add_host(
|
|
205
|
+
"https://management.azure.com"
|
|
206
|
+
)
|
|
168
207
|
return template.render(
|
|
169
208
|
chosen_version=chosen_version,
|
|
170
209
|
total_api_version_list=total_api_version_list,
|
|
@@ -181,15 +220,25 @@ class MetadataSerializer:
|
|
|
181
220
|
sync_client_imports=sync_client_imports,
|
|
182
221
|
async_client_imports=async_client_imports,
|
|
183
222
|
sync_config_imports=_json_serialize_imports(
|
|
184
|
-
config_imports(
|
|
223
|
+
config_imports(
|
|
224
|
+
self.code_model, self.code_model.global_parameters, async_mode=False
|
|
225
|
+
).to_dict()
|
|
185
226
|
),
|
|
186
227
|
async_config_imports=_json_serialize_imports(
|
|
187
|
-
config_imports(
|
|
228
|
+
config_imports(
|
|
229
|
+
self.code_model, async_global_parameters, async_mode=True
|
|
230
|
+
).to_dict()
|
|
188
231
|
),
|
|
189
232
|
get_async_operation_serializer=functools.partial(
|
|
190
|
-
get_operation_serializer,
|
|
233
|
+
get_operation_serializer,
|
|
234
|
+
code_model=self.code_model,
|
|
235
|
+
async_mode=True,
|
|
236
|
+
is_python3_file=True,
|
|
191
237
|
),
|
|
192
238
|
get_sync_operation_serializer=functools.partial(
|
|
193
|
-
get_operation_serializer,
|
|
239
|
+
get_operation_serializer,
|
|
240
|
+
code_model=self.code_model,
|
|
241
|
+
async_mode=False,
|
|
242
|
+
is_python3_file=False,
|
|
194
243
|
),
|
|
195
244
|
)
|
|
@@ -10,21 +10,25 @@ from ..models import ObjectSchema, CodeModel, Property
|
|
|
10
10
|
from ..models.imports import FileImport, ImportType
|
|
11
11
|
from .import_serializer import FileImportSerializer
|
|
12
12
|
|
|
13
|
+
|
|
13
14
|
def _documentation_string(
|
|
14
15
|
prop: Property, description_keyword: str, docstring_type_keyword: str
|
|
15
16
|
) -> List[str]:
|
|
16
17
|
retval: List[str] = []
|
|
17
18
|
sphinx_prefix = f":{description_keyword} {prop.name}:"
|
|
18
19
|
retval.append(
|
|
19
|
-
f"{sphinx_prefix} {prop.description}" if prop.description
|
|
20
|
-
|
|
20
|
+
f"{sphinx_prefix} {prop.description}" if prop.description else sphinx_prefix
|
|
21
|
+
)
|
|
22
|
+
retval.append(
|
|
23
|
+
f":{docstring_type_keyword} {prop.name}: {prop.schema.docstring_type}"
|
|
21
24
|
)
|
|
22
|
-
retval.append(f":{docstring_type_keyword} {prop.name}: {prop.schema.docstring_type}")
|
|
23
25
|
return retval
|
|
24
26
|
|
|
25
27
|
|
|
26
28
|
class ModelBaseSerializer:
|
|
27
|
-
def __init__(
|
|
29
|
+
def __init__(
|
|
30
|
+
self, code_model: CodeModel, env: Environment, is_python3_file: bool
|
|
31
|
+
) -> None:
|
|
28
32
|
self.code_model = code_model
|
|
29
33
|
self.env = env
|
|
30
34
|
self.is_python3_file = is_python3_file
|
|
@@ -34,7 +38,9 @@ class ModelBaseSerializer:
|
|
|
34
38
|
template = self.env.get_template("model_container.py.jinja2")
|
|
35
39
|
return template.render(
|
|
36
40
|
code_model=self.code_model,
|
|
37
|
-
imports=FileImportSerializer(
|
|
41
|
+
imports=FileImportSerializer(
|
|
42
|
+
self.imports(), is_python3_file=self.is_python3_file
|
|
43
|
+
),
|
|
38
44
|
str=str,
|
|
39
45
|
init_line=self.init_line,
|
|
40
46
|
init_args=self.init_args,
|
|
@@ -53,12 +59,16 @@ class ModelBaseSerializer:
|
|
|
53
59
|
@staticmethod
|
|
54
60
|
def get_properties_to_initialize(model: ObjectSchema) -> List[Property]:
|
|
55
61
|
if model.base_models:
|
|
56
|
-
properties_to_initialize = list(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
properties_to_initialize = list(
|
|
63
|
+
{
|
|
64
|
+
p.name: p
|
|
65
|
+
for bm in model.base_models
|
|
66
|
+
for p in model.properties
|
|
67
|
+
if p not in cast(ObjectSchema, bm).properties
|
|
68
|
+
or p.is_discriminator
|
|
69
|
+
or p.constant
|
|
70
|
+
}.values()
|
|
71
|
+
)
|
|
62
72
|
else:
|
|
63
73
|
properties_to_initialize = model.properties
|
|
64
74
|
return properties_to_initialize
|
|
@@ -67,7 +77,9 @@ class ModelBaseSerializer:
|
|
|
67
77
|
def declare_model(model: ObjectSchema) -> str:
|
|
68
78
|
basename = "msrest.serialization.Model"
|
|
69
79
|
if model.base_models:
|
|
70
|
-
basename = ", ".join(
|
|
80
|
+
basename = ", ".join(
|
|
81
|
+
[cast(ObjectSchema, m).name for m in model.base_models]
|
|
82
|
+
)
|
|
71
83
|
return f"class {model.name}({basename}):"
|
|
72
84
|
|
|
73
85
|
@staticmethod
|
|
@@ -82,15 +94,23 @@ class ModelBaseSerializer:
|
|
|
82
94
|
def init_args(self, model: ObjectSchema) -> List[str]:
|
|
83
95
|
init_args = []
|
|
84
96
|
properties_to_pass_to_super = self.properties_to_pass_to_super(model)
|
|
85
|
-
init_args.append(
|
|
97
|
+
init_args.append(
|
|
98
|
+
f"super({model.name}, self).__init__({properties_to_pass_to_super})"
|
|
99
|
+
)
|
|
86
100
|
for prop in ModelBaseSerializer.get_properties_to_initialize(model):
|
|
87
101
|
if prop.is_discriminator:
|
|
88
|
-
discriminator_value =
|
|
102
|
+
discriminator_value = (
|
|
103
|
+
f"'{model.discriminator_value}'"
|
|
104
|
+
if model.discriminator_value
|
|
105
|
+
else None
|
|
106
|
+
)
|
|
89
107
|
if not discriminator_value:
|
|
90
108
|
typing = "Optional[str]"
|
|
91
109
|
else:
|
|
92
110
|
typing = "str"
|
|
93
|
-
init_args.append(
|
|
111
|
+
init_args.append(
|
|
112
|
+
f"self.{prop.name} = {discriminator_value} # type: {typing}"
|
|
113
|
+
)
|
|
94
114
|
elif prop.readonly:
|
|
95
115
|
init_args.append(f"self.{prop.name} = None")
|
|
96
116
|
elif not prop.constant:
|
|
@@ -10,11 +10,8 @@ from ..models import ObjectSchema, CodeModel, Property
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class ModelGenericSerializer(ModelBaseSerializer):
|
|
13
|
-
|
|
14
13
|
def __init__(self, code_model: CodeModel, env: Environment) -> None:
|
|
15
|
-
super(
|
|
16
|
-
code_model=code_model, env=env, is_python3_file=False
|
|
17
|
-
)
|
|
14
|
+
super().__init__(code_model=code_model, env=env, is_python3_file=False)
|
|
18
15
|
|
|
19
16
|
def init_line(self, model: ObjectSchema) -> List[str]:
|
|
20
17
|
return []
|
|
@@ -15,7 +15,11 @@ class ModelInitSerializer:
|
|
|
15
15
|
def serialize(self) -> str:
|
|
16
16
|
schemas = [s.name for s in self.code_model.sorted_schemas]
|
|
17
17
|
schemas.sort()
|
|
18
|
-
enums =
|
|
18
|
+
enums = (
|
|
19
|
+
[e.name for e in self.code_model.enums.values()]
|
|
20
|
+
if self.code_model.enums
|
|
21
|
+
else None
|
|
22
|
+
)
|
|
19
23
|
|
|
20
24
|
if enums:
|
|
21
25
|
enums.sort()
|
|
@@ -11,16 +11,15 @@ from ..models.imports import FileImport
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class ModelPython3Serializer(ModelBaseSerializer):
|
|
14
|
-
|
|
15
14
|
def __init__(self, code_model: CodeModel, env: Environment) -> None:
|
|
16
|
-
super(
|
|
17
|
-
code_model=code_model, env=env, is_python3_file=True
|
|
18
|
-
)
|
|
15
|
+
super().__init__(code_model=code_model, env=env, is_python3_file=True)
|
|
19
16
|
|
|
20
17
|
def init_line(self, model: ObjectSchema) -> List[str]:
|
|
21
18
|
init_properties_declaration = []
|
|
22
19
|
init_line_parameters = [
|
|
23
|
-
p
|
|
20
|
+
p
|
|
21
|
+
for p in model.properties
|
|
22
|
+
if not p.readonly and not p.is_discriminator and not p.constant
|
|
24
23
|
]
|
|
25
24
|
init_line_parameters.sort(key=lambda x: x.required, reverse=True)
|
|
26
25
|
if init_line_parameters:
|
|
@@ -58,7 +57,9 @@ class ModelPython3Serializer(ModelBaseSerializer):
|
|
|
58
57
|
def imports(self) -> FileImport:
|
|
59
58
|
file_import = super(ModelPython3Serializer, self).imports()
|
|
60
59
|
for model in self.code_model.sorted_schemas:
|
|
61
|
-
init_line_parameters = [
|
|
60
|
+
init_line_parameters = [
|
|
61
|
+
p for p in model.properties if not p.readonly and not p.is_discriminator
|
|
62
|
+
]
|
|
62
63
|
for param in init_line_parameters:
|
|
63
64
|
file_import.merge(param.model_file_imports())
|
|
64
65
|
|
|
@@ -12,11 +12,12 @@ from ..models import (
|
|
|
12
12
|
OperationGroup,
|
|
13
13
|
FileImport,
|
|
14
14
|
LROOperation,
|
|
15
|
-
PagingOperation
|
|
15
|
+
PagingOperation,
|
|
16
16
|
)
|
|
17
17
|
from .import_serializer import FileImportSerializer
|
|
18
18
|
from .builder_serializer import get_operation_serializer, get_request_builder_serializer
|
|
19
19
|
|
|
20
|
+
|
|
20
21
|
class OperationGroupsSerializer:
|
|
21
22
|
def __init__(
|
|
22
23
|
self,
|
|
@@ -38,22 +39,31 @@ class OperationGroupsSerializer:
|
|
|
38
39
|
|
|
39
40
|
def _is_paging(operation):
|
|
40
41
|
return isinstance(operation, PagingOperation)
|
|
41
|
-
|
|
42
|
+
|
|
43
|
+
operation_groups = (
|
|
44
|
+
[self.operation_group]
|
|
45
|
+
if self.operation_group
|
|
46
|
+
else self.code_model.operation_groups
|
|
47
|
+
)
|
|
42
48
|
imports = FileImport()
|
|
43
49
|
for operation_group in operation_groups:
|
|
44
|
-
imports.merge(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
imports.merge(
|
|
51
|
+
operation_group.imports(
|
|
52
|
+
async_mode=self.async_mode,
|
|
53
|
+
is_python3_file=self.is_python3_file,
|
|
54
|
+
)
|
|
55
|
+
)
|
|
48
56
|
|
|
49
|
-
template = self.env.get_or_select_template(
|
|
57
|
+
template = self.env.get_or_select_template(
|
|
58
|
+
"operation_groups_container.py.jinja2"
|
|
59
|
+
)
|
|
50
60
|
return template.render(
|
|
51
61
|
code_model=self.code_model,
|
|
52
62
|
operation_groups=operation_groups,
|
|
53
63
|
imports=FileImportSerializer(
|
|
54
64
|
imports,
|
|
55
65
|
is_python3_file=self.is_python3_file,
|
|
56
|
-
async_mode=self.async_mode
|
|
66
|
+
async_mode=self.async_mode,
|
|
57
67
|
),
|
|
58
68
|
async_mode=self.async_mode,
|
|
59
69
|
is_python3_file=self.is_python3_file,
|
|
@@ -66,6 +76,7 @@ class OperationGroupsSerializer:
|
|
|
66
76
|
is_python3_file=self.is_python3_file,
|
|
67
77
|
),
|
|
68
78
|
request_builder_serializer=get_request_builder_serializer(
|
|
69
|
-
self.code_model,
|
|
79
|
+
self.code_model,
|
|
80
|
+
self.is_python3_file,
|
|
70
81
|
),
|
|
71
82
|
)
|
|
@@ -11,15 +11,22 @@ from ..models import CodeModel
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class OperationsInitSerializer:
|
|
14
|
-
def __init__(
|
|
14
|
+
def __init__(
|
|
15
|
+
self, code_model: CodeModel, env: Environment, async_mode: bool
|
|
16
|
+
) -> None:
|
|
15
17
|
self.code_model = code_model
|
|
16
18
|
self.env = env
|
|
17
19
|
self.async_mode = async_mode
|
|
18
20
|
|
|
19
21
|
def _operation_group_imports_helper(self, filename_suffix: str = "") -> List[str]:
|
|
20
22
|
def _get_filename(operation_group: OperationGroup) -> str:
|
|
21
|
-
prefix =
|
|
23
|
+
prefix = (
|
|
24
|
+
"_operations"
|
|
25
|
+
if self.code_model.options["combine_operation_files"]
|
|
26
|
+
else operation_group.filename
|
|
27
|
+
)
|
|
22
28
|
return prefix + filename_suffix
|
|
29
|
+
|
|
23
30
|
return [
|
|
24
31
|
f"from .{_get_filename(og)} import {og.class_name}"
|
|
25
32
|
for og in self.code_model.operation_groups
|
|
@@ -30,20 +37,25 @@ class OperationsInitSerializer:
|
|
|
30
37
|
py3_only = self.code_model.options["python3_only"]
|
|
31
38
|
if typed_py3_files and not py3_only and not self.async_mode:
|
|
32
39
|
retval: List[str] = ["try:"]
|
|
33
|
-
retval.extend(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
retval.extend(
|
|
41
|
+
[
|
|
42
|
+
f" {line}"
|
|
43
|
+
for line in self._operation_group_imports_helper(
|
|
44
|
+
filename_suffix="_py3"
|
|
45
|
+
)
|
|
46
|
+
]
|
|
47
|
+
)
|
|
37
48
|
retval.append("except (SyntaxError, ImportError):")
|
|
38
|
-
retval.extend(
|
|
39
|
-
f" {line}"
|
|
40
|
-
|
|
41
|
-
])
|
|
49
|
+
retval.extend(
|
|
50
|
+
[f" {line}" for line in self._operation_group_imports_helper()]
|
|
51
|
+
)
|
|
42
52
|
return retval
|
|
43
53
|
return self._operation_group_imports_helper()
|
|
44
54
|
|
|
45
55
|
def serialize(self) -> str:
|
|
46
|
-
operation_group_init_template = self.env.get_template(
|
|
56
|
+
operation_group_init_template = self.env.get_template(
|
|
57
|
+
"operations_folder_init.py.jinja2"
|
|
58
|
+
)
|
|
47
59
|
|
|
48
60
|
return operation_group_init_template.render(
|
|
49
61
|
code_model=self.code_model,
|
|
@@ -7,6 +7,7 @@ from jinja2 import Environment
|
|
|
7
7
|
from .import_serializer import FileImportSerializer
|
|
8
8
|
from ..models import CodeModel, FileImport, ImportType, TypingSection
|
|
9
9
|
|
|
10
|
+
|
|
10
11
|
class PatchSerializer:
|
|
11
12
|
def __init__(self, env: Environment, code_model: CodeModel) -> None:
|
|
12
13
|
self.env = env
|
|
@@ -15,7 +16,9 @@ class PatchSerializer:
|
|
|
15
16
|
def serialize(self) -> str:
|
|
16
17
|
template = self.env.get_template("patch.py.jinja2")
|
|
17
18
|
imports = FileImport()
|
|
18
|
-
imports.add_submodule_import(
|
|
19
|
+
imports.add_submodule_import(
|
|
20
|
+
"typing", "List", ImportType.STDLIB, TypingSection.CONDITIONAL
|
|
21
|
+
)
|
|
19
22
|
is_python3_file = self.code_model.options["python3_only"]
|
|
20
23
|
return template.render(
|
|
21
24
|
code_model=self.code_model,
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
from typing import List
|
|
7
7
|
from jinja2 import Environment
|
|
8
8
|
|
|
9
|
-
from ..models import RequestBuilder
|
|
9
|
+
from ..models import RequestBuilder, FileImport
|
|
10
10
|
from .import_serializer import FileImportSerializer
|
|
11
11
|
from ..models import CodeModel
|
|
12
12
|
from .builder_serializer import (
|
|
@@ -15,43 +15,60 @@ from .builder_serializer import (
|
|
|
15
15
|
)
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
class
|
|
19
|
-
def __init__(
|
|
18
|
+
class RequestBuildersSerializer:
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
code_model: CodeModel,
|
|
22
|
+
env: Environment,
|
|
23
|
+
request_builders: List[RequestBuilder],
|
|
24
|
+
) -> None:
|
|
20
25
|
self.code_model = code_model
|
|
21
26
|
self.env = env
|
|
22
27
|
self.request_builders = request_builders
|
|
23
28
|
self.builder_group_name = request_builders[0].builder_group_name
|
|
24
29
|
|
|
30
|
+
@property
|
|
31
|
+
def imports(self) -> FileImport:
|
|
32
|
+
file_import = FileImport()
|
|
33
|
+
for request_builder in self.request_builders:
|
|
34
|
+
if request_builder.builder_group_name == self.builder_group_name:
|
|
35
|
+
file_import.merge(request_builder.imports())
|
|
36
|
+
return file_import
|
|
37
|
+
|
|
25
38
|
def serialize_init(self) -> str:
|
|
26
39
|
template = self.env.get_template("rest_init.py.jinja2")
|
|
27
|
-
return template.render(
|
|
40
|
+
return template.render(
|
|
41
|
+
code_model=self.code_model, request_builders=self.request_builders
|
|
42
|
+
)
|
|
28
43
|
|
|
29
44
|
|
|
30
|
-
class
|
|
45
|
+
class RequestBuildersPython3Serializer(RequestBuildersSerializer):
|
|
31
46
|
def serialize_request_builders(self) -> str:
|
|
32
47
|
template = self.env.get_template("request_builders.py.jinja2")
|
|
33
48
|
|
|
34
49
|
return template.render(
|
|
35
50
|
code_model=self.code_model,
|
|
36
51
|
request_builders=self.request_builders,
|
|
37
|
-
imports=FileImportSerializer(
|
|
38
|
-
self.
|
|
39
|
-
|
|
52
|
+
imports=FileImportSerializer(
|
|
53
|
+
self.imports,
|
|
54
|
+
is_python3_file=True,
|
|
55
|
+
),
|
|
40
56
|
is_python3_file=True,
|
|
41
57
|
request_builder_serializer=RequestBuilderPython3Serializer(self.code_model),
|
|
42
58
|
)
|
|
43
59
|
|
|
44
60
|
|
|
45
|
-
class
|
|
61
|
+
class RequestBuildersGenericSerializer(RequestBuildersSerializer):
|
|
46
62
|
def serialize_request_builders(self) -> str:
|
|
47
63
|
template = self.env.get_template("request_builders.py.jinja2")
|
|
48
64
|
|
|
49
65
|
return template.render(
|
|
50
66
|
code_model=self.code_model,
|
|
51
67
|
request_builders=self.request_builders,
|
|
52
|
-
imports=FileImportSerializer(
|
|
53
|
-
self.
|
|
54
|
-
|
|
68
|
+
imports=FileImportSerializer(
|
|
69
|
+
self.imports,
|
|
70
|
+
is_python3_file=False,
|
|
71
|
+
),
|
|
55
72
|
is_python3_file=False,
|
|
56
73
|
request_builder_serializer=RequestBuilderGenericSerializer(self.code_model),
|
|
57
74
|
)
|