@autorest/python 6.2.0 → 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 (73) hide show
  1. package/autorest/codegen/__init__.py +9 -74
  2. package/autorest/codegen/models/__init__.py +11 -12
  3. package/autorest/codegen/models/{base_type.py → base.py} +29 -10
  4. package/autorest/codegen/models/base_builder.py +8 -10
  5. package/autorest/codegen/models/client.py +111 -40
  6. package/autorest/codegen/models/code_model.py +131 -90
  7. package/autorest/codegen/models/combined_type.py +7 -7
  8. package/autorest/codegen/models/constant_type.py +44 -10
  9. package/autorest/codegen/models/credential_types.py +17 -19
  10. package/autorest/codegen/models/dictionary_type.py +7 -9
  11. package/autorest/codegen/models/enum_type.py +19 -24
  12. package/autorest/codegen/models/imports.py +82 -33
  13. package/autorest/codegen/models/list_type.py +11 -15
  14. package/autorest/codegen/models/lro_operation.py +6 -10
  15. package/autorest/codegen/models/model_type.py +20 -21
  16. package/autorest/codegen/models/operation.py +49 -42
  17. package/autorest/codegen/models/operation_group.py +11 -11
  18. package/autorest/codegen/models/paging_operation.py +8 -10
  19. package/autorest/codegen/models/parameter.py +44 -31
  20. package/autorest/codegen/models/parameter_list.py +16 -22
  21. package/autorest/codegen/models/primitive_types.py +12 -23
  22. package/autorest/codegen/models/property.py +11 -11
  23. package/autorest/codegen/models/request_builder.py +19 -19
  24. package/autorest/codegen/models/request_builder_parameter.py +14 -16
  25. package/autorest/codegen/models/response.py +24 -28
  26. package/autorest/codegen/serializers/__init__.py +202 -187
  27. package/autorest/codegen/serializers/builder_serializer.py +46 -49
  28. package/autorest/codegen/serializers/client_serializer.py +9 -7
  29. package/autorest/codegen/serializers/enum_serializer.py +4 -4
  30. package/autorest/codegen/serializers/general_serializer.py +26 -36
  31. package/autorest/codegen/serializers/import_serializer.py +30 -36
  32. package/autorest/codegen/serializers/metadata_serializer.py +35 -17
  33. package/autorest/codegen/serializers/model_init_serializer.py +6 -10
  34. package/autorest/codegen/serializers/model_serializer.py +42 -27
  35. package/autorest/codegen/serializers/operation_groups_serializer.py +12 -8
  36. package/autorest/codegen/serializers/operations_init_serializer.py +13 -6
  37. package/autorest/codegen/serializers/patch_serializer.py +4 -4
  38. package/autorest/codegen/serializers/request_builders_serializer.py +6 -6
  39. package/autorest/codegen/serializers/sample_serializer.py +10 -12
  40. package/autorest/codegen/templates/client_container.py.jinja2 +2 -2
  41. package/autorest/codegen/templates/config.py.jinja2 +1 -1
  42. package/autorest/codegen/templates/config_container.py.jinja2 +3 -3
  43. package/autorest/codegen/templates/enum_container.py.jinja2 +2 -2
  44. package/autorest/codegen/templates/init.py.jinja2 +2 -2
  45. package/autorest/codegen/templates/lro_operation.py.jinja2 +1 -1
  46. package/autorest/codegen/templates/lro_paging_operation.py.jinja2 +1 -1
  47. package/autorest/codegen/templates/metadata.json.jinja2 +2 -2
  48. package/autorest/codegen/templates/model_container.py.jinja2 +3 -3
  49. package/autorest/codegen/templates/model_dpg.py.jinja2 +4 -4
  50. package/autorest/codegen/templates/model_init.py.jinja2 +3 -3
  51. package/autorest/codegen/templates/operation.py.jinja2 +1 -1
  52. package/autorest/codegen/templates/operation_group.py.jinja2 +2 -2
  53. package/autorest/codegen/templates/operation_groups_container.py.jinja2 +3 -3
  54. package/autorest/codegen/templates/operation_tools.jinja2 +3 -3
  55. package/autorest/codegen/templates/operations_folder_init.py.jinja2 +4 -4
  56. package/autorest/codegen/templates/packaging_templates/setup.py.jinja2 +4 -1
  57. package/autorest/codegen/templates/paging_operation.py.jinja2 +1 -1
  58. package/autorest/codegen/templates/request_builder.py.jinja2 +1 -1
  59. package/autorest/codegen/templates/request_builders.py.jinja2 +2 -2
  60. package/autorest/codegen/templates/rest_init.py.jinja2 +1 -1
  61. package/autorest/codegen/templates/sample.py.jinja2 +5 -5
  62. package/autorest/codegen/templates/validation.py.jinja2 +1 -1
  63. package/autorest/codegen/templates/vendor.py.jinja2 +6 -6
  64. package/autorest/codegen/templates/version.py.jinja2 +2 -2
  65. package/autorest/m4reformatter/__init__.py +7 -6
  66. package/autorest/multiapi/models/imports.py +89 -18
  67. package/autorest/multiapi/serializers/import_serializer.py +88 -7
  68. package/autorest/multiapi/utils.py +6 -0
  69. package/autorest/preprocess/__init__.py +23 -26
  70. package/package.json +1 -1
  71. package/run_cadl.py +0 -1
  72. package/autorest/cadlflags/__init__.py +0 -130
  73. package/autorest/codegen/models/base_model.py +0 -30
@@ -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
 
@@ -13,7 +13,7 @@ from ..models import (
13
13
  PagingOperation,
14
14
  TypingSection,
15
15
  ImportType,
16
- NamespaceModel,
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:
@@ -62,18 +80,17 @@ def _mixin_imports(
62
80
 
63
81
 
64
82
  class MetadataSerializer:
65
- def __init__(self, namespace_model: NamespaceModel, env: Environment) -> None:
66
- self.namespace_model = namespace_model
67
- self.client = self.namespace_model.clients[
68
- 0
69
- ] # we only do one client for multiapi
83
+ def __init__(self, code_model: CodeModel, env: Environment) -> None:
84
+ self.code_model = code_model
85
+ self.client = self.code_model.clients[0] # we only do one client for multiapi
70
86
  self.env = env
71
87
 
72
88
  def _choose_api_version(self) -> Tuple[str, List[str]]:
73
89
  chosen_version = ""
74
90
  total_api_version_set: Set[str] = set()
75
- for operation_group in self.namespace_model.operation_groups:
76
- 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)
77
94
 
78
95
  total_api_version_list = list(total_api_version_set)
79
96
  total_api_version_list.sort()
@@ -85,7 +102,7 @@ class MetadataSerializer:
85
102
  if len(total_api_version_list) == 1:
86
103
  chosen_version = total_api_version_list[0]
87
104
  elif len(total_api_version_list) > 1:
88
- module_version = self.namespace_model.namespace.split(".")[-1]
105
+ module_version = self.code_model.namespace.split(".")[-1]
89
106
  for api_version in total_api_version_list:
90
107
  if "v{}".format(api_version.replace("-", "_")) == module_version:
91
108
  chosen_version = api_version
@@ -102,7 +119,8 @@ class MetadataSerializer:
102
119
  mixin_operation_group: Optional[OperationGroup] = next(
103
120
  (
104
121
  operation_group
105
- for operation_group in self.namespace_model.operation_groups
122
+ for client in self.code_model.clients
123
+ for operation_group in client.operation_groups
106
124
  if operation_group.is_mixin
107
125
  ),
108
126
  None,
@@ -115,11 +133,11 @@ class MetadataSerializer:
115
133
  chosen_version, total_api_version_list = self._choose_api_version()
116
134
 
117
135
  # setting to true, because for multiapi we always generate with a version file with version 0.1.0
118
- self.namespace_model.options["package_version"] = "0.1.0"
136
+ self.code_model.options["package_version"] = "0.1.0"
119
137
  template = self.env.get_template("metadata.json.jinja2")
120
138
 
121
139
  return template.render(
122
- namespace_model=self.namespace_model,
140
+ code_model=self.code_model,
123
141
  chosen_version=chosen_version,
124
142
  total_api_version_list=total_api_version_list,
125
143
  client=self.client,
@@ -138,19 +156,19 @@ class MetadataSerializer:
138
156
  self.client.imports_for_multiapi(async_mode=True).to_dict()
139
157
  ),
140
158
  sync_config_imports=_json_serialize_imports(
141
- self.client.config.imports(async_mode=False).to_dict()
159
+ self.client.config.imports_for_multiapi(async_mode=False).to_dict()
142
160
  ),
143
161
  async_config_imports=_json_serialize_imports(
144
- self.client.config.imports(async_mode=True).to_dict()
162
+ self.client.config.imports_for_multiapi(async_mode=True).to_dict()
145
163
  ),
146
164
  get_async_operation_serializer=functools.partial(
147
165
  get_operation_serializer,
148
- namespace_model=self.client.namespace_model,
166
+ code_model=self.client.code_model,
149
167
  async_mode=True,
150
168
  ),
151
169
  get_sync_operation_serializer=functools.partial(
152
170
  get_operation_serializer,
153
- namespace_model=self.client.namespace_model,
171
+ code_model=self.client.code_model,
154
172
  async_mode=False,
155
173
  ),
156
174
  has_credential=bool(self.client.credential),
@@ -4,21 +4,19 @@
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
6
  from jinja2 import Environment
7
- from ..models import NamespaceModel
7
+ from ..models import CodeModel
8
8
 
9
9
 
10
10
  class ModelInitSerializer:
11
- def __init__(self, namespace_model: NamespaceModel, env: Environment) -> None:
12
- self.namespace_model = namespace_model
11
+ def __init__(self, code_model: CodeModel, env: Environment) -> None:
12
+ self.code_model = code_model
13
13
  self.env = env
14
14
 
15
15
  def serialize(self) -> str:
16
- schemas = [s.name for s in self.namespace_model.public_model_types]
16
+ schemas = [s.name for s in self.code_model.public_model_types]
17
17
  schemas.sort()
18
18
  enums = (
19
- [e.name for e in self.namespace_model.enums]
20
- if self.namespace_model.enums
21
- else None
19
+ [e.name for e in self.code_model.enums] if self.code_model.enums else None
22
20
  )
23
21
 
24
22
  if enums:
@@ -34,6 +32,4 @@ class ModelInitSerializer:
34
32
  )
35
33
 
36
34
  template = self.env.get_template("model_init.py.jinja2")
37
- return template.render(
38
- namespace_model=self.namespace_model, schemas=schemas, enums=enums
39
- )
35
+ return template.render(code_model=self.code_model, schemas=schemas, enums=enums)
@@ -5,10 +5,12 @@
5
5
  # --------------------------------------------------------------------------
6
6
  from typing import cast, List
7
7
  from abc import ABC, abstractmethod
8
+
8
9
  from jinja2 import Environment
9
- from ..models import ModelType, NamespaceModel, Property
10
+ from ..models import ModelType, CodeModel, Property
10
11
  from ..models.imports import FileImport, TypingSection, MsrestImportType, ImportType
11
12
  from .import_serializer import FileImportSerializer
13
+ from ..models.constant_type import ConstantType
12
14
 
13
15
 
14
16
  def _documentation_string(
@@ -28,8 +30,8 @@ def _documentation_string(
28
30
 
29
31
 
30
32
  class _ModelSerializer(ABC):
31
- def __init__(self, namespace_model: NamespaceModel, env: Environment) -> None:
32
- self.namespace_model = namespace_model
33
+ def __init__(self, code_model: CodeModel, env: Environment) -> None:
34
+ self.code_model = code_model
33
35
  self.env = env
34
36
 
35
37
  @abstractmethod
@@ -40,7 +42,7 @@ class _ModelSerializer(ABC):
40
42
  # Generate the models
41
43
  template = self.env.get_template("model_container.py.jinja2")
42
44
  return template.render(
43
- namespace_model=self.namespace_model,
45
+ code_model=self.code_model,
44
46
  imports=FileImportSerializer(self.imports()),
45
47
  str=str,
46
48
  serializer=self,
@@ -93,13 +95,17 @@ class _ModelSerializer(ABC):
93
95
  f"Known sub-classes are: {', '.join(v.name for v in model.discriminated_subtypes.values())}"
94
96
  )
95
97
 
96
- def init_line(self, model: ModelType) -> List[str]:
97
- init_properties_declaration = []
98
- init_line_parameters = [
98
+ @staticmethod
99
+ def _init_line_parameters(model: ModelType):
100
+ return [
99
101
  p
100
102
  for p in model.properties
101
103
  if not p.readonly and not p.is_discriminator and not p.constant
102
104
  ]
105
+
106
+ def init_line(self, model: ModelType) -> List[str]:
107
+ init_properties_declaration = []
108
+ init_line_parameters = self._init_line_parameters(model)
103
109
  init_line_parameters.sort(key=lambda x: x.optional)
104
110
  if init_line_parameters:
105
111
  init_properties_declaration.append("*,")
@@ -130,21 +136,19 @@ class MsrestModelSerializer(_ModelSerializer):
130
136
  def imports(self) -> FileImport:
131
137
  file_import = FileImport()
132
138
  file_import.add_msrest_import(
133
- self.namespace_model, "..", MsrestImportType.Module, TypingSection.REGULAR
139
+ self.code_model, "..", MsrestImportType.Module, TypingSection.REGULAR
134
140
  )
135
- for model in self.namespace_model.model_types:
141
+ for model in self.code_model.model_types:
136
142
  file_import.merge(model.imports(is_operation_file=False))
137
- init_line_parameters = [
138
- p for p in model.properties if not p.readonly and not p.is_discriminator
139
- ]
140
- for param in init_line_parameters:
143
+ for param in self._init_line_parameters(model):
141
144
  file_import.merge(param.imports())
145
+
142
146
  return file_import
143
147
 
144
148
  def declare_model(self, model: ModelType) -> str:
145
149
  basename = (
146
150
  "msrest.serialization.Model"
147
- if self.namespace_model.options["client_side_validation"]
151
+ if self.code_model.options["client_side_validation"]
148
152
  else "_serialization.Model"
149
153
  )
150
154
  if model.parents:
@@ -207,10 +211,10 @@ class DpgModelSerializer(_ModelSerializer):
207
211
  file_import.add_submodule_import("typing", "Mapping", ImportType.STDLIB)
208
212
  file_import.add_submodule_import("typing", "Any", ImportType.STDLIB)
209
213
 
210
- for model in self.namespace_model.model_types:
214
+ for model in self.code_model.model_types:
211
215
  file_import.merge(model.imports(is_operation_file=False))
212
- for param in model.properties:
213
- file_import.merge(param.imports())
216
+ for prop in model.properties:
217
+ file_import.merge(prop.imports())
214
218
  return file_import
215
219
 
216
220
  def declare_model(self, model: ModelType) -> str:
@@ -222,30 +226,31 @@ class DpgModelSerializer(_ModelSerializer):
222
226
  return f"class {model.name}({basename}):{model.pylint_disable}"
223
227
 
224
228
  @staticmethod
225
- def get_properties_to_initialize(model: ModelType) -> List[Property]:
229
+ def get_properties_to_declare(model: ModelType) -> List[Property]:
226
230
  if model.parents:
231
+ parent_properties = [
232
+ p for bm in model.parents for p in cast(ModelType, bm).properties
233
+ ]
227
234
  properties_to_declare = [
228
235
  p
229
- for bm in model.parents
230
236
  for p in model.properties
231
- if p not in cast(ModelType, bm).properties
237
+ if not any(
238
+ p.client_name == pp.client_name
239
+ and p.type_annotation() == pp.type_annotation()
240
+ for pp in parent_properties
241
+ )
232
242
  ]
233
-
234
243
  else:
235
244
  properties_to_declare = model.properties
236
245
  if any(p for p in properties_to_declare if p.client_name == "_"):
237
246
  raise ValueError("We do not generate anonymous properties")
238
- return [
239
- p
240
- for p in properties_to_declare
241
- if (not p.is_discriminator or p.is_polymorphic)
242
- ]
247
+ return properties_to_declare
243
248
 
244
249
  @staticmethod
245
250
  def declare_property(prop: Property) -> List[str]:
246
251
  attribute_key = _ModelSerializer.escape_dot(prop.rest_api_name)
247
252
  args = []
248
- if prop.client_name != attribute_key:
253
+ if prop.client_name != attribute_key or prop.is_discriminator:
249
254
  args.append(f'name="{attribute_key}"')
250
255
  if prop.readonly:
251
256
  args.append("readonly=True")
@@ -261,3 +266,13 @@ class DpgModelSerializer(_ModelSerializer):
261
266
  if comment:
262
267
  ret.append(f'"""{comment}"""')
263
268
  return ret
269
+
270
+ def initialize_properties(self, model: ModelType) -> List[str]:
271
+ init_args = []
272
+ for prop in self.get_properties_to_declare(model):
273
+ if prop.constant or prop.is_discriminator:
274
+ init_args.append(
275
+ f"self.{prop.client_name} = {cast(ConstantType, prop.type).get_declaration()} "
276
+ f"# type: {prop.type_annotation()}"
277
+ )
278
+ return init_args
@@ -8,11 +8,12 @@ import functools
8
8
  from jinja2 import Environment
9
9
 
10
10
  from ..models import (
11
- NamespaceModel,
11
+ CodeModel,
12
12
  OperationGroup,
13
13
  FileImport,
14
14
  RequestBuilder,
15
15
  OverloadedRequestBuilder,
16
+ Client,
16
17
  )
17
18
  from .import_serializer import FileImportSerializer
18
19
  from .builder_serializer import get_operation_serializer, RequestBuilderSerializer
@@ -21,12 +22,14 @@ from .builder_serializer import get_operation_serializer, RequestBuilderSerializ
21
22
  class OperationGroupsSerializer:
22
23
  def __init__(
23
24
  self,
24
- namespace_model: NamespaceModel,
25
+ code_model: CodeModel,
26
+ clients: List[Client],
25
27
  env: Environment,
26
28
  async_mode: bool,
27
29
  operation_group: Optional[OperationGroup] = None,
28
30
  ):
29
- self.namespace_model = namespace_model
31
+ self.clients = clients
32
+ self.code_model = code_model
30
33
  self.env = env
31
34
  self.async_mode = async_mode
32
35
  self.operation_group = operation_group
@@ -36,7 +39,8 @@ class OperationGroupsSerializer:
36
39
  ) -> List[Union[OverloadedRequestBuilder, RequestBuilder]]:
37
40
  return [
38
41
  r
39
- for r in self.namespace_model.request_builders
42
+ for client in self.clients
43
+ for r in client.request_builders
40
44
  if r.client.name == operation_group.client.name
41
45
  and r.group_name == operation_group.property_name
42
46
  and not r.is_overload
@@ -47,7 +51,7 @@ class OperationGroupsSerializer:
47
51
  operation_groups = (
48
52
  [self.operation_group]
49
53
  if self.operation_group
50
- else self.namespace_model.operation_groups
54
+ else [og for client in self.clients for og in client.operation_groups]
51
55
  )
52
56
  imports = FileImport()
53
57
  for operation_group in operation_groups:
@@ -61,7 +65,7 @@ class OperationGroupsSerializer:
61
65
  "operation_groups_container.py.jinja2"
62
66
  )
63
67
  return template.render(
64
- namespace_model=self.namespace_model,
68
+ code_model=self.code_model,
65
69
  operation_groups=operation_groups,
66
70
  imports=FileImportSerializer(
67
71
  imports,
@@ -70,11 +74,11 @@ class OperationGroupsSerializer:
70
74
  async_mode=self.async_mode,
71
75
  get_operation_serializer=functools.partial(
72
76
  get_operation_serializer,
73
- namespace_model=self.namespace_model,
77
+ code_model=self.code_model,
74
78
  async_mode=self.async_mode,
75
79
  ),
76
80
  request_builder_serializer=RequestBuilderSerializer(
77
- self.namespace_model,
81
+ self.code_model,
78
82
  async_mode=False,
79
83
  ),
80
84
  get_request_builders=self._get_request_builders,
@@ -7,14 +7,19 @@ from typing import List
7
7
  from jinja2 import Environment
8
8
 
9
9
  from autorest.codegen.models.operation_group import OperationGroup
10
- from ..models import NamespaceModel
10
+ from ..models import CodeModel, Client
11
11
 
12
12
 
13
13
  class OperationsInitSerializer:
14
14
  def __init__(
15
- self, namespace_model: NamespaceModel, env: Environment, async_mode: bool
15
+ self,
16
+ code_model: CodeModel,
17
+ clients: List[Client],
18
+ env: Environment,
19
+ async_mode: bool,
16
20
  ) -> None:
17
- self.namespace_model = namespace_model
21
+ self.code_model = code_model
22
+ self.clients = clients
18
23
  self.env = env
19
24
  self.async_mode = async_mode
20
25
 
@@ -22,13 +27,14 @@ class OperationsInitSerializer:
22
27
  def _get_filename(operation_group: OperationGroup) -> str:
23
28
  return (
24
29
  "_operations"
25
- if self.namespace_model.options["combine_operation_files"]
30
+ if self.code_model.options["combine_operation_files"]
26
31
  else operation_group.filename
27
32
  )
28
33
 
29
34
  return [
30
35
  f"from .{_get_filename(og)} import {og.class_name}"
31
- for og in self.namespace_model.operation_groups
36
+ for client in self.clients
37
+ for og in client.operation_groups
32
38
  ]
33
39
 
34
40
  def serialize(self) -> str:
@@ -37,7 +43,8 @@ class OperationsInitSerializer:
37
43
  )
38
44
 
39
45
  return operation_group_init_template.render(
40
- namespace_model=self.namespace_model,
46
+ code_model=self.code_model,
41
47
  async_mode=self.async_mode,
42
48
  operation_group_imports=self.operation_group_imports,
49
+ clients=self.clients,
43
50
  )
@@ -5,13 +5,13 @@
5
5
  # --------------------------------------------------------------------------
6
6
  from jinja2 import Environment
7
7
  from .import_serializer import FileImportSerializer
8
- from ..models import NamespaceModel, FileImport, ImportType, TypingSection
8
+ from ..models import CodeModel, FileImport, ImportType, TypingSection
9
9
 
10
10
 
11
11
  class PatchSerializer:
12
- def __init__(self, env: Environment, namespace_model: NamespaceModel) -> None:
12
+ def __init__(self, env: Environment, code_model: CodeModel) -> None:
13
13
  self.env = env
14
- self.namespace_model = namespace_model
14
+ self.code_model = code_model
15
15
 
16
16
  def serialize(self) -> str:
17
17
  template = self.env.get_template("patch.py.jinja2")
@@ -20,6 +20,6 @@ class PatchSerializer:
20
20
  "typing", "List", ImportType.STDLIB, TypingSection.CONDITIONAL
21
21
  )
22
22
  return template.render(
23
- namespace_model=self.namespace_model,
23
+ code_model=self.code_model,
24
24
  imports=FileImportSerializer(imports),
25
25
  )
@@ -8,18 +8,18 @@ from jinja2 import Environment
8
8
 
9
9
  from ..models import FileImport
10
10
  from .import_serializer import FileImportSerializer
11
- from ..models import NamespaceModel, RequestBuilderType
11
+ from ..models import CodeModel, RequestBuilderType
12
12
  from .builder_serializer import RequestBuilderSerializer
13
13
 
14
14
 
15
15
  class RequestBuildersSerializer:
16
16
  def __init__(
17
17
  self,
18
- namespace_model: NamespaceModel,
18
+ code_model: CodeModel,
19
19
  env: Environment,
20
20
  request_builders: List[RequestBuilderType],
21
21
  ) -> None:
22
- self.namespace_model = namespace_model
22
+ self.code_model = code_model
23
23
  self.env = env
24
24
  self.request_builders = request_builders
25
25
  self.group_name = request_builders[0].group_name
@@ -35,7 +35,7 @@ class RequestBuildersSerializer:
35
35
  def serialize_init(self) -> str:
36
36
  template = self.env.get_template("rest_init.py.jinja2")
37
37
  return template.render(
38
- namespace_model=self.namespace_model,
38
+ code_model=self.code_model,
39
39
  request_builders=[r for r in self.request_builders if not r.is_overload],
40
40
  )
41
41
 
@@ -43,12 +43,12 @@ class RequestBuildersSerializer:
43
43
  template = self.env.get_template("request_builders.py.jinja2")
44
44
 
45
45
  return template.render(
46
- namespace_model=self.namespace_model,
46
+ code_model=self.code_model,
47
47
  request_builders=[rb for rb in self.request_builders if not rb.abstract],
48
48
  imports=FileImportSerializer(
49
49
  self.imports,
50
50
  ),
51
51
  request_builder_serializer=RequestBuilderSerializer(
52
- self.namespace_model, async_mode=False
52
+ self.code_model, async_mode=False
53
53
  ),
54
54
  )
@@ -14,7 +14,7 @@ from autorest.codegen.models.imports import FileImport, ImportType
14
14
  from autorest.codegen.models.operation import OperationBase
15
15
  from autorest.codegen.models.operation_group import OperationGroup
16
16
  from autorest.codegen.serializers.import_serializer import FileImportSerializer
17
- from ..models import NamespaceModel
17
+ from ..models import CodeModel
18
18
 
19
19
  _LOGGER = logging.getLogger(__name__)
20
20
 
@@ -22,7 +22,7 @@ _LOGGER = logging.getLogger(__name__)
22
22
  class SampleSerializer:
23
23
  def __init__(
24
24
  self,
25
- namespace_model: NamespaceModel,
25
+ code_model: CodeModel,
26
26
  env: Environment,
27
27
  operation_group: OperationGroup,
28
28
  operation: OperationBase[Any],
@@ -30,7 +30,7 @@ class SampleSerializer:
30
30
  file_name: str,
31
31
  sample_origin_name: str,
32
32
  ) -> None:
33
- self.namespace_model = namespace_model
33
+ self.code_model = code_model
34
34
  self.env = env
35
35
  self.operation_group = operation_group
36
36
  self.operation = operation
@@ -40,10 +40,10 @@ class SampleSerializer:
40
40
 
41
41
  def _imports(self) -> FileImportSerializer:
42
42
  imports = FileImport()
43
- namespace = (self.namespace_model.options["package_name"] or "").replace(
43
+ namespace = (self.code_model.options["package_name"] or "").replace(
44
44
  "-", "."
45
- ) or self.namespace_model.namespace
46
- client = self.namespace_model.clients[0]
45
+ ) or self.code_model.namespace
46
+ client = self.code_model.clients[0]
47
47
  imports.add_submodule_import(namespace, client.name, ImportType.THIRDPARTY)
48
48
  credential_type = getattr(client.credential, "type", None)
49
49
  if isinstance(credential_type, TokenCredentialType):
@@ -60,9 +60,7 @@ class SampleSerializer:
60
60
  def _client_params(self) -> Dict[str, Any]:
61
61
  # client params
62
62
  special_param = dict()
63
- credential_type = getattr(
64
- self.namespace_model.clients[0].credential, "type", None
65
- )
63
+ credential_type = getattr(self.code_model.clients[0].credential, "type", None)
66
64
  if isinstance(credential_type, TokenCredentialType):
67
65
  special_param.update({"credential": "DefaultAzureCredential()"})
68
66
  elif isinstance(credential_type, AzureKeyCredentialType):
@@ -72,7 +70,7 @@ class SampleSerializer:
72
70
 
73
71
  params_positional = [
74
72
  p
75
- for p in self.namespace_model.clients[0].parameters.positional
73
+ for p in self.code_model.clients[0].parameters.positional
76
74
  if not (p.optional or p.client_default_value)
77
75
  ]
78
76
  cls = lambda x: f'"{x}"'
@@ -97,7 +95,7 @@ class SampleSerializer:
97
95
  if not p.client_default_value
98
96
  ]
99
97
  cls = lambda x: f'"{x}"' if isinstance(x, str) else str(x)
100
- failure_info = '"fail to find required param named {%s} in example file {%s}"'
98
+ failure_info = "fail to find required param named {} in example file {}"
101
99
  operation_params = {}
102
100
  for param in params_positional:
103
101
  name = param.rest_api_name
@@ -134,7 +132,7 @@ class SampleSerializer:
134
132
 
135
133
  def serialize(self) -> str:
136
134
  return self.env.get_template("sample.py.jinja2").render(
137
- namespace_model=self.namespace_model,
135
+ code_model=self.code_model,
138
136
  file_name=self.file_name,
139
137
  operation_result=self._operation_result(),
140
138
  operation_params=self._operation_params(),
@@ -2,11 +2,11 @@
2
2
  {% import 'operation_tools.jinja2' as op_tools %}
3
3
  {# actual template starts here #}
4
4
  # coding=utf-8
5
- {{ namespace_model.options['license_header'] }}
5
+ {{ code_model.options['license_header'] }}
6
6
 
7
7
  {{ imports }}
8
8
 
9
- {% for client in namespace_model.clients %}
9
+ {% for client in clients %}
10
10
  {% set serializer = get_serializer(client) %}
11
11
  {% include "client.py.jinja2" %}
12
12
  {% endfor %}