@autorest/python 6.2.0 → 6.2.2

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 +9 -11
  19. package/autorest/codegen/models/parameter.py +48 -32
  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 +49 -50
  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 +57 -47
  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
@@ -14,11 +14,11 @@ from ..models import (
14
14
  OperationGroup,
15
15
  RequestBuilder,
16
16
  OverloadedRequestBuilder,
17
- NamespaceModel,
18
17
  CodeModel,
18
+ Client,
19
19
  )
20
20
  from .enum_serializer import EnumSerializer
21
- from .general_serializer import GeneralNamespaceSerializer, GeneralSerializer
21
+ from .general_serializer import GeneralSerializer
22
22
  from .model_init_serializer import ModelInitSerializer
23
23
  from .model_serializer import DpgModelSerializer, MsrestModelSerializer
24
24
  from .operations_init_serializer import OperationsInitSerializer
@@ -51,57 +51,37 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
51
51
  def __init__(
52
52
  self,
53
53
  code_model: CodeModel,
54
- namespace_model: NamespaceModel,
55
54
  *,
56
55
  output_folder: Union[str, Path],
57
56
  **kwargs: Any,
58
57
  ) -> None:
59
58
  super().__init__(output_folder=output_folder, **kwargs)
60
59
  self.code_model = code_model
61
- self.namespace_model = namespace_model
62
60
 
63
61
  @property
64
62
  def has_aio_folder(self) -> bool:
65
- return not self.namespace_model.options["no_async"] and bool(
66
- self.namespace_model.operation_groups
63
+ return not self.code_model.options["no_async"] and bool(
64
+ self.code_model.has_operations
67
65
  )
68
66
 
69
67
  @property
70
68
  def has_operations_folder(self) -> bool:
71
- return self.namespace_model.options["show_operations"] and bool(
72
- self.namespace_model.operation_groups
69
+ return self.code_model.options["show_operations"] and bool(
70
+ self.code_model.has_operations
73
71
  )
74
72
 
75
- def serialize(self) -> None:
76
- env = Environment(
77
- loader=PackageLoader("autorest.codegen", "templates"),
78
- keep_trailing_newline=True,
79
- line_statement_prefix="##",
80
- line_comment_prefix="###",
81
- trim_blocks=True,
82
- lstrip_blocks=True,
83
- )
84
-
85
- namespace_path = (
86
- Path(".")
87
- if self.namespace_model.options["no_namespace_folders"]
88
- else Path(*(self.namespace_model.namespace.split(".")))
89
- )
73
+ def _serialize_namespace_level(
74
+ self, env: Environment, namespace_path: Path, clients: List[Client]
75
+ ) -> None:
90
76
  # if there was a patch file before, we keep it
91
77
  self._keep_patch_file(namespace_path / Path("_patch.py"), env)
92
78
  if self.has_aio_folder:
93
79
  self._keep_patch_file(namespace_path / Path("aio") / Path("_patch.py"), env)
94
80
 
95
- if self.namespace_model.options["models_mode"] and (
96
- self.namespace_model.model_types or self.namespace_model.enums
97
- ):
98
- self._keep_patch_file(
99
- namespace_path / Path("models") / Path("_patch.py"), env
100
- )
101
81
  if self.has_operations_folder:
102
82
  self._keep_patch_file(
103
83
  namespace_path
104
- / Path(self.namespace_model.operations_folder_name)
84
+ / Path(self.code_model.operations_folder_name)
105
85
  / Path("_patch.py"),
106
86
  env,
107
87
  )
@@ -109,17 +89,16 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
109
89
  self._keep_patch_file(
110
90
  namespace_path
111
91
  / Path("aio")
112
- / Path(self.namespace_model.operations_folder_name)
92
+ / Path(self.code_model.operations_folder_name)
113
93
  / Path("_patch.py"),
114
94
  env,
115
95
  )
116
-
117
96
  self._serialize_and_write_top_level_folder(
118
- env=env, namespace_path=namespace_path
97
+ env=env, namespace_path=namespace_path, clients=clients
119
98
  )
120
99
 
121
- if self.namespace_model.operation_groups:
122
- if self.namespace_model.options["builders_visibility"] != "embedded":
100
+ if any(c for c in self.code_model.clients if c.operation_groups):
101
+ if self.code_model.options["builders_visibility"] != "embedded":
123
102
  self._serialize_and_write_rest_layer(
124
103
  env=env, namespace_path=namespace_path
125
104
  )
@@ -127,24 +106,86 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
127
106
  self._serialize_and_write_aio_top_level_folder(
128
107
  env=env,
129
108
  namespace_path=namespace_path,
109
+ clients=clients,
130
110
  )
131
111
 
132
112
  if self.has_operations_folder:
133
113
  self._serialize_and_write_operations_folder(
134
- env=env, namespace_path=namespace_path
114
+ clients, env=env, namespace_path=namespace_path
135
115
  )
136
- if self.namespace_model.options["multiapi"]:
116
+ if self.code_model.options["multiapi"]:
137
117
  self._serialize_and_write_metadata(
138
118
  env=env, namespace_path=namespace_path
139
119
  )
120
+ if self.code_model.options["package_mode"]:
121
+ self._serialize_and_write_package_files(namespace_path=namespace_path)
122
+
123
+ if (
124
+ self.code_model.options["show_operations"]
125
+ and self.code_model.has_operations
126
+ and self.code_model.options["generate_sample"]
127
+ and not self.code_model.options["multiapi"]
128
+ ):
129
+ self._serialize_and_write_sample(env, namespace_path)
130
+
131
+ def serialize(self) -> None:
132
+ env = Environment(
133
+ loader=PackageLoader("autorest.codegen", "templates"),
134
+ keep_trailing_newline=True,
135
+ line_statement_prefix="##",
136
+ line_comment_prefix="###",
137
+ trim_blocks=True,
138
+ lstrip_blocks=True,
139
+ )
140
+
141
+ namespace_path = (
142
+ Path(".")
143
+ if self.code_model.options["no_namespace_folders"]
144
+ else Path(*(self.code_model.namespace.split(".")))
145
+ )
146
+
147
+ p = namespace_path.parent
148
+ general_serializer = GeneralSerializer(
149
+ code_model=self.code_model, env=env, async_mode=False
150
+ )
151
+ while p != Path("."):
152
+ # write pkgutil init file
153
+ self.write_file(
154
+ p / Path("__init__.py"),
155
+ general_serializer.serialize_pkgutil_init_file(),
156
+ )
157
+ p = p.parent
158
+
159
+ # serialize main module
160
+ self._serialize_namespace_level(
161
+ env,
162
+ namespace_path,
163
+ [c for c in self.code_model.clients if c.has_operations],
164
+ )
165
+ # serialize sub modules
166
+ for (
167
+ subnamespace,
168
+ clients,
169
+ ) in self.code_model.subnamespace_to_clients.items():
170
+ subnamespace_path = namespace_path / Path(subnamespace)
171
+ self._serialize_namespace_level(
172
+ env, subnamespace_path, [c for c in clients if c.has_operations]
173
+ )
140
174
 
141
- if self.namespace_model.options["models_mode"] and (
142
- self.namespace_model.model_types or self.namespace_model.enums
175
+ if self.code_model.options["models_mode"] and (
176
+ self.code_model.model_types or self.code_model.enums
177
+ ):
178
+ self._keep_patch_file(
179
+ namespace_path / Path("models") / Path("_patch.py"), env
180
+ )
181
+
182
+ if self.code_model.options["models_mode"] and (
183
+ self.code_model.model_types or self.code_model.enums
143
184
  ):
144
185
  self._serialize_and_write_models_folder(
145
186
  env=env, namespace_path=namespace_path
146
187
  )
147
- if not self.namespace_model.options["models_mode"]:
188
+ if not self.code_model.options["models_mode"]:
148
189
  # keep models file if users ended up just writing a models file
149
190
  if self.read_file(namespace_path / Path("models.py")):
150
191
  self.write_file(
@@ -152,20 +193,9 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
152
193
  cast(str, self.read_file(namespace_path / Path("models.py"))),
153
194
  )
154
195
 
155
- if self.namespace_model.options["package_mode"]:
156
- self._serialize_and_write_package_files(namespace_path=namespace_path)
157
-
158
- if (
159
- self.namespace_model.options["show_operations"]
160
- and self.namespace_model.operation_groups
161
- and self.namespace_model.options["generate_sample"]
162
- and not self.namespace_model.options["multiapi"]
163
- ):
164
- self._serialize_and_write_sample(env, namespace_path)
165
-
166
196
  def _serialize_and_write_package_files(self, namespace_path: Path) -> None:
167
197
  root_of_sdk = self._package_root_folder(namespace_path)
168
- if self.namespace_model.options["package_mode"] in ("dataplane", "mgmtplane"):
198
+ if self.code_model.options["package_mode"] in ("dataplane", "mgmtplane"):
169
199
  env = Environment(
170
200
  loader=PackageLoader(
171
201
  "autorest.codegen", "templates/packaging_templates"
@@ -174,10 +204,10 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
174
204
  )
175
205
 
176
206
  package_files = _PACKAGE_FILES
177
- elif Path(self.namespace_model.options["package_mode"]).exists():
207
+ elif Path(self.code_model.options["package_mode"]).exists():
178
208
  env = Environment(
179
209
  loader=FileSystemLoader(
180
- str(Path(self.namespace_model.options["package_mode"]))
210
+ str(Path(self.code_model.options["package_mode"]))
181
211
  ),
182
212
  keep_trailing_newline=True,
183
213
  undefined=StrictUndefined,
@@ -185,8 +215,8 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
185
215
  package_files = env.list_templates()
186
216
  else:
187
217
  return
188
- serializer = GeneralSerializer(self.code_model, env)
189
- params = self.namespace_model.options["package_configuration"] or {}
218
+ serializer = GeneralSerializer(self.code_model, env, async_mode=False)
219
+ params = self.code_model.options["package_configuration"] or {}
190
220
  for template_name in package_files:
191
221
  file = template_name.replace(".jinja2", "")
192
222
  output_name = root_of_sdk / file
@@ -202,9 +232,7 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
202
232
  else:
203
233
  self.write_file(
204
234
  path_file,
205
- PatchSerializer(
206
- env=env, namespace_model=self.namespace_model
207
- ).serialize(),
235
+ PatchSerializer(env=env, code_model=self.code_model).serialize(),
208
236
  )
209
237
 
210
238
  def _serialize_and_write_models_folder(
@@ -214,42 +242,36 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
214
242
  models_path = namespace_path / Path("models")
215
243
  serializer = (
216
244
  DpgModelSerializer
217
- if self.namespace_model.options["models_mode"] == "dpg"
245
+ if self.code_model.options["models_mode"] == "dpg"
218
246
  else MsrestModelSerializer
219
247
  )
220
- if self.namespace_model.model_types:
248
+ if self.code_model.model_types:
221
249
  self.write_file(
222
- models_path / Path(f"{self.namespace_model.models_filename}.py"),
223
- serializer(namespace_model=self.namespace_model, env=env).serialize(),
250
+ models_path / Path(f"{self.code_model.models_filename}.py"),
251
+ serializer(code_model=self.code_model, env=env).serialize(),
224
252
  )
225
- if self.namespace_model.enums:
253
+ if self.code_model.enums:
226
254
  self.write_file(
227
- models_path / Path(f"{self.namespace_model.enums_filename}.py"),
228
- EnumSerializer(
229
- namespace_model=self.namespace_model, env=env
230
- ).serialize(),
255
+ models_path / Path(f"{self.code_model.enums_filename}.py"),
256
+ EnumSerializer(code_model=self.code_model, env=env).serialize(),
231
257
  )
232
258
  self.write_file(
233
259
  models_path / Path("__init__.py"),
234
- ModelInitSerializer(
235
- namespace_model=self.namespace_model, env=env
236
- ).serialize(),
260
+ ModelInitSerializer(code_model=self.code_model, env=env).serialize(),
237
261
  )
238
262
 
239
263
  def _serialize_and_write_rest_layer(
240
264
  self, env: Environment, namespace_path: Path
241
265
  ) -> None:
242
- rest_path = namespace_path / Path(self.namespace_model.rest_layer_name)
266
+ rest_path = namespace_path / Path(self.code_model.rest_layer_name)
243
267
  group_names = {
244
- rb.group_name
245
- for c in self.namespace_model.clients
246
- for rb in c.request_builders
268
+ rb.group_name for c in self.code_model.clients for rb in c.request_builders
247
269
  }
248
270
 
249
271
  for group_name in group_names:
250
272
  request_builders = [
251
273
  r
252
- for c in self.namespace_model.clients
274
+ for c in self.code_model.clients
253
275
  for r in c.request_builders
254
276
  if r.group_name == group_name
255
277
  ]
@@ -259,7 +281,7 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
259
281
  if not "" in group_names:
260
282
  self.write_file(
261
283
  rest_path / Path("__init__.py"),
262
- self.namespace_model.options["license_header"],
284
+ self.code_model.options["license_header"],
263
285
  )
264
286
 
265
287
  def _serialize_and_write_single_rest_layer(
@@ -274,7 +296,7 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
274
296
  self.write_file(
275
297
  output_path / Path("_request_builders.py"),
276
298
  RequestBuildersSerializer(
277
- namespace_model=self.namespace_model,
299
+ code_model=self.code_model,
278
300
  env=env,
279
301
  request_builders=request_builders,
280
302
  ).serialize_request_builders(),
@@ -284,7 +306,7 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
284
306
  self.write_file(
285
307
  output_path / Path("__init__.py"),
286
308
  RequestBuildersSerializer(
287
- namespace_model=self.namespace_model,
309
+ code_model=self.code_model,
288
310
  env=env,
289
311
  request_builders=request_builders,
290
312
  ).serialize_init(),
@@ -293,20 +315,22 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
293
315
  def _serialize_and_write_operations_file(
294
316
  self,
295
317
  env: Environment,
318
+ clients: List[Client],
296
319
  namespace_path: Path,
297
320
  operation_group: Optional[OperationGroup] = None,
298
321
  ) -> None:
299
322
  filename = operation_group.filename if operation_group else "_operations"
300
323
  # write first sync file
301
324
  operation_group_serializer = OperationGroupsSerializer(
302
- namespace_model=self.namespace_model,
325
+ code_model=self.code_model,
326
+ clients=clients,
303
327
  env=env,
304
328
  async_mode=False,
305
329
  operation_group=operation_group,
306
330
  )
307
331
  self.write_file(
308
332
  namespace_path
309
- / Path(self.namespace_model.operations_folder_name)
333
+ / Path(self.code_model.operations_folder_name)
310
334
  / Path(f"{filename}.py"),
311
335
  operation_group_serializer.serialize(),
312
336
  )
@@ -314,7 +338,8 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
314
338
  if self.has_aio_folder:
315
339
  # write async operation group and operation files
316
340
  operation_group_async_serializer = OperationGroupsSerializer(
317
- namespace_model=self.namespace_model,
341
+ code_model=self.code_model,
342
+ clients=clients,
318
343
  env=env,
319
344
  async_mode=True,
320
345
  operation_group=operation_group,
@@ -323,22 +348,22 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
323
348
  (
324
349
  namespace_path
325
350
  / Path("aio")
326
- / Path(self.namespace_model.operations_folder_name)
351
+ / Path(self.code_model.operations_folder_name)
327
352
  / Path(f"{filename}.py")
328
353
  ),
329
354
  operation_group_async_serializer.serialize(),
330
355
  )
331
356
 
332
357
  def _serialize_and_write_operations_folder(
333
- self, env: Environment, namespace_path: Path
358
+ self, clients: List[Client], env: Environment, namespace_path: Path
334
359
  ) -> None:
335
360
  # write sync operations init file
336
361
  operations_init_serializer = OperationsInitSerializer(
337
- namespace_model=self.namespace_model, env=env, async_mode=False
362
+ code_model=self.code_model, clients=clients, env=env, async_mode=False
338
363
  )
339
364
  self.write_file(
340
365
  namespace_path
341
- / Path(self.namespace_model.operations_folder_name)
366
+ / Path(self.code_model.operations_folder_name)
342
367
  / Path("__init__.py"),
343
368
  operations_init_serializer.serialize(),
344
369
  )
@@ -346,33 +371,36 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
346
371
  # write async operations init file
347
372
  if self.has_aio_folder:
348
373
  operations_async_init_serializer = OperationsInitSerializer(
349
- namespace_model=self.namespace_model, env=env, async_mode=True
374
+ code_model=self.code_model, clients=clients, env=env, async_mode=True
350
375
  )
351
376
  self.write_file(
352
377
  namespace_path
353
378
  / Path("aio")
354
- / Path(self.namespace_model.operations_folder_name)
379
+ / Path(self.code_model.operations_folder_name)
355
380
  / Path("__init__.py"),
356
381
  operations_async_init_serializer.serialize(),
357
382
  )
358
383
 
359
- if self.namespace_model.options["combine_operation_files"]:
384
+ if self.code_model.options["combine_operation_files"]:
360
385
  self._serialize_and_write_operations_file(
361
386
  env=env,
362
387
  namespace_path=namespace_path,
388
+ clients=clients,
363
389
  )
364
390
  else:
365
- for operation_group in self.namespace_model.operation_groups:
366
- self._serialize_and_write_operations_file(
367
- env=env,
368
- namespace_path=namespace_path,
369
- operation_group=operation_group,
370
- )
391
+ for client in self.code_model.clients:
392
+ for operation_group in client.operation_groups:
393
+ self._serialize_and_write_operations_file(
394
+ env=env,
395
+ namespace_path=namespace_path,
396
+ operation_group=operation_group,
397
+ clients=self.code_model.clients,
398
+ )
371
399
 
372
400
  def _serialize_and_write_version_file(
373
401
  self,
374
402
  namespace_path: Path,
375
- general_namespace_serializer: GeneralNamespaceSerializer,
403
+ general_serializer: GeneralSerializer,
376
404
  ):
377
405
  def _read_version_file(original_version_file_name: str) -> str:
378
406
  return self.read_file(namespace_path / original_version_file_name)
@@ -383,99 +411,98 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
383
411
  _read_version_file(original_version_file_name),
384
412
  )
385
413
 
386
- keep_version_file = self.namespace_model.options["keep_version_file"]
414
+ keep_version_file = self.code_model.options["keep_version_file"]
387
415
  if keep_version_file and _read_version_file("_version.py"):
388
416
  _write_version_file(original_version_file_name="_version.py")
389
417
  elif keep_version_file and _read_version_file("version.py"):
390
418
  _write_version_file(original_version_file_name="version.py")
391
- elif self.namespace_model.options["package_version"]:
419
+ elif self.code_model.options["package_version"]:
392
420
  self.write_file(
393
421
  namespace_path / Path("_version.py"),
394
- general_namespace_serializer.serialize_version_file(),
422
+ general_serializer.serialize_version_file(),
423
+ )
424
+
425
+ def _serialize_client_and_config_files(
426
+ self,
427
+ namespace_path: Path,
428
+ general_serializer: GeneralSerializer,
429
+ async_mode: bool,
430
+ clients: List[Client],
431
+ ) -> None:
432
+ if self.code_model.has_operations:
433
+ namespace_path = (
434
+ namespace_path / Path("aio") if async_mode else namespace_path
435
+ )
436
+ self.write_file(
437
+ namespace_path / Path(f"{self.code_model.client_filename}.py"),
438
+ general_serializer.serialize_service_client_file(clients),
439
+ )
440
+ self.write_file(
441
+ namespace_path / Path("_configuration.py"),
442
+ general_serializer.serialize_config_file(clients),
395
443
  )
396
444
 
397
445
  def _serialize_and_write_top_level_folder(
398
- self, env: Environment, namespace_path: Path
446
+ self, env: Environment, namespace_path: Path, clients: List[Client]
399
447
  ) -> None:
400
- general_namespace_serializer = GeneralNamespaceSerializer(
401
- namespace_model=self.namespace_model, env=env, async_mode=False
402
- )
403
448
  general_serializer = GeneralSerializer(
404
- code_model=self.code_model,
405
- env=env,
449
+ code_model=self.code_model, env=env, async_mode=False
406
450
  )
407
451
 
408
452
  self.write_file(
409
453
  namespace_path / Path("__init__.py"),
410
- general_namespace_serializer.serialize_init_file(),
454
+ general_serializer.serialize_init_file(clients),
411
455
  )
412
- p = namespace_path.parent
413
- while p != Path("."):
414
- # write pkgutil init file
415
- self.write_file(
416
- p / Path("__init__.py"),
417
- general_namespace_serializer.serialize_pkgutil_init_file(),
418
- )
419
- p = p.parent
420
456
 
421
457
  # Write the service client
422
- if self.namespace_model.operation_groups:
423
- self.write_file(
424
- namespace_path / Path(f"{self.namespace_model.client_filename}.py"),
425
- general_namespace_serializer.serialize_service_client_file(),
426
- )
427
-
428
- if self.namespace_model.need_vendored_code(async_mode=False):
458
+ self._serialize_client_and_config_files(
459
+ namespace_path, general_serializer, async_mode=False, clients=clients
460
+ )
461
+ if self.code_model.need_vendored_code(async_mode=False):
429
462
  self.write_file(
430
463
  namespace_path / Path("_vendor.py"),
431
- general_namespace_serializer.serialize_vendor_file(),
464
+ general_serializer.serialize_vendor_file(),
432
465
  )
433
466
 
434
- self._serialize_and_write_version_file(
435
- namespace_path, general_namespace_serializer
436
- )
467
+ self._serialize_and_write_version_file(namespace_path, general_serializer)
437
468
 
438
469
  # write the empty py.typed file
439
470
  self.write_file(namespace_path / Path("py.typed"), "# Marker file for PEP 561.")
440
471
 
441
472
  if (
442
- not self.namespace_model.options["client_side_validation"]
443
- and not self.namespace_model.options["multiapi"]
473
+ not self.code_model.options["client_side_validation"]
474
+ and not self.code_model.options["multiapi"]
444
475
  ):
445
476
  self.write_file(
446
477
  namespace_path / Path("_serialization.py"),
447
- general_namespace_serializer.serialize_serialization_file(),
478
+ general_serializer.serialize_serialization_file(),
448
479
  )
449
- if self.namespace_model.options["models_mode"] == "dpg":
480
+ if self.code_model.options["models_mode"] == "dpg":
450
481
  self.write_file(
451
482
  namespace_path / Path("_model_base.py"),
452
- general_namespace_serializer.serialize_model_base_file(),
483
+ general_serializer.serialize_model_base_file(),
453
484
  )
454
485
 
455
486
  if any(
456
- og for og in self.namespace_model.operation_groups if og.need_validation
487
+ og
488
+ for client in self.code_model.clients
489
+ for og in client.operation_groups
490
+ if og.need_validation
457
491
  ):
458
492
  self.write_file(
459
493
  namespace_path / Path("_validation.py"),
460
- general_namespace_serializer.serialize_validation_file(),
461
- )
462
-
463
- # Write the config file
464
- if self.namespace_model.request_builders:
465
- self.write_file(
466
- namespace_path / Path("_configuration.py"),
467
- general_namespace_serializer.serialize_config_file(),
494
+ general_serializer.serialize_validation_file(),
468
495
  )
469
496
 
470
497
  # Write the setup file
471
- if self.namespace_model.options["basic_setup_py"]:
498
+ if self.code_model.options["basic_setup_py"]:
472
499
  self.write_file(Path("setup.py"), general_serializer.serialize_setup_file())
473
500
 
474
501
  def _serialize_and_write_aio_top_level_folder(
475
- self, env: Environment, namespace_path: Path
502
+ self, env: Environment, namespace_path: Path, clients: List[Client]
476
503
  ) -> None:
477
- aio_general_namespace_serializer = GeneralNamespaceSerializer(
478
- namespace_model=self.namespace_model, env=env, async_mode=True
504
+ aio_general_serializer = GeneralSerializer(
505
+ code_model=self.code_model, env=env, async_mode=True
479
506
  )
480
507
 
481
508
  aio_path = namespace_path / Path("aio")
@@ -483,68 +510,58 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
483
510
  # Write the __init__ file
484
511
  self.write_file(
485
512
  aio_path / Path("__init__.py"),
486
- aio_general_namespace_serializer.serialize_init_file(),
513
+ aio_general_serializer.serialize_init_file(clients),
487
514
  )
488
515
 
489
516
  # Write the service client
490
- if self.namespace_model.request_builders:
491
- self.write_file(
492
- aio_path / Path(f"{self.namespace_model.client_filename}.py"),
493
- aio_general_namespace_serializer.serialize_service_client_file(),
494
- )
495
-
496
- # Write the config file
497
- self.write_file(
498
- aio_path / Path("_configuration.py"),
499
- aio_general_namespace_serializer.serialize_config_file(),
517
+ self._serialize_client_and_config_files(
518
+ namespace_path, aio_general_serializer, async_mode=True, clients=clients
500
519
  )
501
- if self.namespace_model.need_vendored_code(async_mode=True):
520
+ if self.code_model.need_vendored_code(async_mode=True):
502
521
  self.write_file(
503
522
  aio_path / Path("_vendor.py"),
504
- aio_general_namespace_serializer.serialize_vendor_file(),
523
+ aio_general_serializer.serialize_vendor_file(),
505
524
  )
506
525
 
507
526
  def _serialize_and_write_metadata(
508
527
  self, env: Environment, namespace_path: Path
509
528
  ) -> None:
510
- metadata_serializer = MetadataSerializer(self.namespace_model, env)
529
+ metadata_serializer = MetadataSerializer(self.code_model, env)
511
530
  self.write_file(
512
531
  namespace_path / Path("_metadata.json"), metadata_serializer.serialize()
513
532
  )
514
533
 
515
534
  # find root folder where "setup.py" is
516
535
  def _package_root_folder(self, namespace_path: Path) -> Path:
517
- return namespace_path / Path(
518
- "../" * (self.namespace_model.namespace.count(".") + 1)
519
- )
536
+ return namespace_path / Path("../" * (self.code_model.namespace.count(".") + 1))
520
537
 
521
538
  def _serialize_and_write_sample(self, env: Environment, namespace_path: Path):
522
539
  out_path = self._package_root_folder(namespace_path) / Path("generated_samples")
523
- for op_group in self.namespace_model.operation_groups:
524
- for operation in op_group.operations:
525
- samples = operation.yaml_data["samples"]
526
- if not samples:
527
- continue
528
- for key, value in samples.items():
529
- file_name = to_snake_case(key) + ".py"
530
- try:
531
- self.write_file(
532
- out_path / file_name,
533
- SampleSerializer(
534
- namespace_model=self.namespace_model,
535
- env=env,
536
- operation_group=op_group,
537
- operation=operation,
538
- sample=value,
539
- file_name=file_name,
540
- sample_origin_name=key,
541
- ).serialize(),
542
- )
543
- except Exception as e: # pylint: disable=broad-except
544
- # sample generation shall not block code generation, so just log error
545
- _LOGGER.error(
546
- "error happens when generate sample with {%s}: {%s}", key, e
547
- )
540
+ for client in self.code_model.clients:
541
+ for op_group in client.operation_groups:
542
+ for operation in op_group.operations:
543
+ samples = operation.yaml_data["samples"]
544
+ if not samples or operation.name.startswith("_"):
545
+ continue
546
+ for key, value in samples.items():
547
+ file_name = to_snake_case(key) + ".py"
548
+ try:
549
+ self.write_file(
550
+ out_path / file_name,
551
+ SampleSerializer(
552
+ code_model=self.code_model,
553
+ env=env,
554
+ operation_group=op_group,
555
+ operation=operation,
556
+ sample=value,
557
+ file_name=file_name,
558
+ sample_origin_name=key,
559
+ ).serialize(),
560
+ )
561
+ except Exception as e: # pylint: disable=broad-except
562
+ # sample generation shall not block code generation, so just log error
563
+ log_error = f"error happens in sample {key}: {e}"
564
+ _LOGGER.error(log_error)
548
565
 
549
566
 
550
567
  class JinjaSerializerAutorest(JinjaSerializer, ReaderAndWriterAutorest):
@@ -552,7 +569,6 @@ class JinjaSerializerAutorest(JinjaSerializer, ReaderAndWriterAutorest):
552
569
  self,
553
570
  autorestapi: AutorestAPI,
554
571
  code_model: CodeModel,
555
- namespace_model: NamespaceModel,
556
572
  *,
557
573
  output_folder: Union[str, Path],
558
574
  **kwargs: Any,
@@ -560,7 +576,6 @@ class JinjaSerializerAutorest(JinjaSerializer, ReaderAndWriterAutorest):
560
576
  super().__init__(
561
577
  autorestapi=autorestapi,
562
578
  code_model=code_model,
563
- namespace_model=namespace_model,
564
579
  output_folder=output_folder,
565
580
  **kwargs,
566
581
  )