@autorest/python 6.1.11 → 6.2.1

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