@autorest/python 5.14.0 → 5.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/ChangeLog.md +91 -2
  2. package/README.md +30 -4
  3. package/autorest/__init__.py +2 -3
  4. package/autorest/black/__init__.py +12 -5
  5. package/autorest/codegen/__init__.py +130 -179
  6. package/autorest/codegen/models/__init__.py +122 -78
  7. package/autorest/codegen/models/base_builder.py +70 -72
  8. package/autorest/codegen/models/base_model.py +7 -5
  9. package/autorest/codegen/models/{base_schema.py → base_type.py} +62 -49
  10. package/autorest/codegen/models/client.py +195 -36
  11. package/autorest/codegen/models/code_model.py +165 -299
  12. package/autorest/codegen/models/combined_type.py +107 -0
  13. package/autorest/codegen/models/constant_type.py +122 -0
  14. package/autorest/codegen/models/credential_types.py +224 -0
  15. package/autorest/codegen/models/dictionary_type.py +116 -0
  16. package/autorest/codegen/models/enum_type.py +195 -0
  17. package/autorest/codegen/models/imports.py +95 -41
  18. package/autorest/codegen/models/list_type.py +134 -0
  19. package/autorest/codegen/models/lro_operation.py +90 -133
  20. package/autorest/codegen/models/lro_paging_operation.py +28 -12
  21. package/autorest/codegen/models/model_type.py +239 -0
  22. package/autorest/codegen/models/operation.py +415 -241
  23. package/autorest/codegen/models/operation_group.py +82 -88
  24. package/autorest/codegen/models/paging_operation.py +101 -117
  25. package/autorest/codegen/models/parameter.py +307 -322
  26. package/autorest/codegen/models/parameter_list.py +366 -357
  27. package/autorest/codegen/models/primitive_types.py +544 -0
  28. package/autorest/codegen/models/property.py +122 -134
  29. package/autorest/codegen/models/request_builder.py +138 -86
  30. package/autorest/codegen/models/request_builder_parameter.py +122 -79
  31. package/autorest/codegen/models/response.py +325 -0
  32. package/autorest/codegen/models/utils.py +17 -1
  33. package/autorest/codegen/serializers/__init__.py +242 -118
  34. package/autorest/codegen/serializers/builder_serializer.py +863 -1027
  35. package/autorest/codegen/serializers/client_serializer.py +148 -82
  36. package/autorest/codegen/serializers/general_serializer.py +44 -47
  37. package/autorest/codegen/serializers/import_serializer.py +96 -31
  38. package/autorest/codegen/serializers/metadata_serializer.py +39 -79
  39. package/autorest/codegen/serializers/model_base_serializer.py +65 -29
  40. package/autorest/codegen/serializers/model_generic_serializer.py +9 -10
  41. package/autorest/codegen/serializers/model_init_serializer.py +4 -2
  42. package/autorest/codegen/serializers/model_python3_serializer.py +29 -22
  43. package/autorest/codegen/serializers/operation_groups_serializer.py +21 -18
  44. package/autorest/codegen/serializers/operations_init_serializer.py +23 -11
  45. package/autorest/codegen/serializers/parameter_serializer.py +174 -0
  46. package/autorest/codegen/serializers/patch_serializer.py +14 -2
  47. package/autorest/codegen/serializers/request_builders_serializer.py +57 -0
  48. package/autorest/codegen/serializers/utils.py +0 -103
  49. package/autorest/codegen/templates/MANIFEST.in.jinja2 +1 -0
  50. package/autorest/codegen/templates/{service_client.py.jinja2 → client.py.jinja2} +7 -7
  51. package/autorest/codegen/templates/config.py.jinja2 +13 -13
  52. package/autorest/codegen/templates/enum.py.jinja2 +4 -4
  53. package/autorest/codegen/templates/enum_container.py.jinja2 +1 -2
  54. package/autorest/codegen/templates/init.py.jinja2 +9 -6
  55. package/autorest/codegen/templates/keywords.jinja2 +14 -1
  56. package/autorest/codegen/templates/lro_operation.py.jinja2 +6 -5
  57. package/autorest/codegen/templates/lro_paging_operation.py.jinja2 +6 -5
  58. package/autorest/codegen/templates/metadata.json.jinja2 +36 -35
  59. package/autorest/codegen/templates/model.py.jinja2 +23 -29
  60. package/autorest/codegen/templates/model_container.py.jinja2 +2 -1
  61. package/autorest/codegen/templates/model_init.py.jinja2 +9 -8
  62. package/autorest/codegen/templates/operation.py.jinja2 +10 -15
  63. package/autorest/codegen/templates/operation_group.py.jinja2 +14 -13
  64. package/autorest/codegen/templates/operation_groups_container.py.jinja2 +1 -2
  65. package/autorest/codegen/templates/operation_tools.jinja2 +8 -2
  66. package/autorest/codegen/templates/operations_folder_init.py.jinja2 +4 -0
  67. package/autorest/codegen/templates/paging_operation.py.jinja2 +7 -8
  68. package/autorest/codegen/templates/patch.py.jinja2 +18 -29
  69. package/autorest/codegen/templates/request_builder.py.jinja2 +20 -13
  70. package/autorest/codegen/templates/setup.py.jinja2 +9 -3
  71. package/autorest/codegen/templates/vendor.py.jinja2 +12 -2
  72. package/autorest/jsonrpc/__init__.py +7 -12
  73. package/autorest/jsonrpc/localapi.py +4 -3
  74. package/autorest/jsonrpc/server.py +28 -9
  75. package/autorest/jsonrpc/stdstream.py +13 -6
  76. package/autorest/m2r/__init__.py +5 -8
  77. package/autorest/m4reformatter/__init__.py +1108 -0
  78. package/autorest/multiapi/__init__.py +24 -14
  79. package/autorest/multiapi/models/client.py +21 -11
  80. package/autorest/multiapi/models/code_model.py +23 -10
  81. package/autorest/multiapi/models/config.py +4 -1
  82. package/autorest/multiapi/models/constant_global_parameter.py +1 -0
  83. package/autorest/multiapi/models/global_parameter.py +2 -1
  84. package/autorest/multiapi/models/global_parameters.py +14 -8
  85. package/autorest/multiapi/models/imports.py +35 -18
  86. package/autorest/multiapi/models/mixin_operation.py +5 -5
  87. package/autorest/multiapi/models/operation_group.py +2 -1
  88. package/autorest/multiapi/models/operation_mixin_group.py +21 -10
  89. package/autorest/multiapi/serializers/__init__.py +20 -25
  90. package/autorest/multiapi/serializers/import_serializer.py +47 -15
  91. package/autorest/multiapi/serializers/multiapi_serializer.py +17 -17
  92. package/autorest/multiapi/templates/multiapi_config.py.jinja2 +3 -3
  93. package/autorest/multiapi/templates/multiapi_init.py.jinja2 +2 -2
  94. package/autorest/multiapi/templates/multiapi_operations_mixin.py.jinja2 +4 -4
  95. package/autorest/multiapi/templates/multiapi_service_client.py.jinja2 +9 -9
  96. package/autorest/multiapi/utils.py +3 -3
  97. package/autorest/postprocess/__init__.py +202 -0
  98. package/autorest/postprocess/get_all.py +19 -0
  99. package/autorest/postprocess/venvtools.py +73 -0
  100. package/autorest/preprocess/__init__.py +209 -0
  101. package/autorest/preprocess/helpers.py +54 -0
  102. package/autorest/{namer → preprocess}/python_mappings.py +25 -32
  103. package/package.json +3 -3
  104. package/run-python3.js +2 -3
  105. package/venvtools.py +1 -1
  106. package/autorest/codegen/models/constant_schema.py +0 -97
  107. package/autorest/codegen/models/credential_schema.py +0 -90
  108. package/autorest/codegen/models/credential_schema_policy.py +0 -77
  109. package/autorest/codegen/models/dictionary_schema.py +0 -103
  110. package/autorest/codegen/models/enum_schema.py +0 -246
  111. package/autorest/codegen/models/list_schema.py +0 -113
  112. package/autorest/codegen/models/object_schema.py +0 -249
  113. package/autorest/codegen/models/primitive_schemas.py +0 -476
  114. package/autorest/codegen/models/request_builder_parameter_list.py +0 -280
  115. package/autorest/codegen/models/rest.py +0 -42
  116. package/autorest/codegen/models/schema_request.py +0 -45
  117. package/autorest/codegen/models/schema_response.py +0 -123
  118. package/autorest/codegen/serializers/rest_serializer.py +0 -57
  119. package/autorest/namer/__init__.py +0 -25
  120. package/autorest/namer/name_converter.py +0 -412
@@ -4,22 +4,25 @@
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
6
  from typing import List
7
+
7
8
  from . import utils
8
- from ..models import CodeModel
9
+ from ..models import CodeModel, ParameterMethodLocation
10
+ from .parameter_serializer import ParameterSerializer, PopKwargType
9
11
 
10
12
 
11
13
  class ClientSerializer:
12
14
  def __init__(self, code_model: CodeModel, is_python3_file: bool) -> None:
13
15
  self.code_model = code_model
14
16
  self.is_python3_file = is_python3_file
17
+ self.parameter_serializer = ParameterSerializer()
15
18
 
16
19
  def _init_signature(self, async_mode: bool) -> str:
17
- return utils.serialize_method(
20
+ return self.parameter_serializer.serialize_method(
18
21
  function_def="def",
19
22
  method_name="__init__",
20
- is_in_class=True,
21
- method_param_signatures=self.code_model.service_client.parameters.client_method_signature(
22
- async_mode or self.is_python3_file
23
+ need_self_param=True,
24
+ method_param_signatures=self.code_model.client.parameters.method_signature(
25
+ async_mode or self.is_python3_file, async_mode
23
26
  ),
24
27
  )
25
28
 
@@ -32,34 +35,43 @@ class ClientSerializer:
32
35
  )
33
36
 
34
37
  def pop_kwargs_from_signature(self, async_mode: bool) -> List[str]:
35
- return utils.pop_kwargs_from_signature(self.code_model.service_client.parameters.kwargs_to_pop(
36
- async_mode or self.is_python3_file
37
- ))
38
+ return self.parameter_serializer.pop_kwargs_from_signature(
39
+ self.code_model.client.parameters.kwargs_to_pop(
40
+ async_mode or self.is_python3_file,
41
+ ),
42
+ check_kwarg_dict=False,
43
+ pop_headers_kwarg=PopKwargType.NO,
44
+ pop_params_kwarg=PopKwargType.NO,
45
+ )
38
46
 
39
47
  def class_definition(self, async_mode) -> str:
40
- class_name = self.code_model.class_name
41
- has_mixin_og = any(og for og in self.code_model.operation_groups if og.is_empty_operation_group)
48
+ class_name = self.code_model.client.name
49
+ has_mixin_og = any(og for og in self.code_model.operation_groups if og.is_mixin)
42
50
  base_class = ""
43
51
  if has_mixin_og:
44
52
  base_class = f"{class_name}OperationsMixin"
45
53
  elif not (async_mode or self.is_python3_file):
46
54
  base_class = "object"
47
- disable = ""
48
- if len(self.code_model.operation_groups) > 6:
49
- disable = " # pylint: disable=too-many-instance-attributes"
55
+ pylint_disable = self.code_model.client.pylint_disable
50
56
  if base_class:
51
- return f"class {class_name}({base_class}):{disable}"
52
- return f"class {class_name}:{disable}"
57
+ return f"class {class_name}({base_class}):{pylint_disable}"
58
+ return f"class {class_name}:{pylint_disable}"
53
59
 
54
60
  def property_descriptions(self, async_mode: bool) -> List[str]:
55
61
  retval: List[str] = []
56
62
  operations_folder = ".aio.operations." if async_mode else ".operations."
57
- for og in [og for og in self.code_model.operation_groups if not og.is_empty_operation_group]:
58
- retval.append(f":ivar {og.name}: {og.class_name} operations")
59
- retval.append(f":vartype {og.name}: {self.code_model.namespace}{operations_folder}{og.class_name}")
60
- for param in self.code_model.service_client.parameters.client_method:
61
- retval.append(f":{param.description_keyword} {param.serialized_name}: {param.description}")
62
- retval.append(f":{param.docstring_type_keyword} {param.serialized_name}: {param.docstring_type}")
63
+ for og in [og for og in self.code_model.operation_groups if not og.is_mixin]:
64
+ retval.append(f":ivar {og.property_name}: {og.class_name} operations")
65
+ retval.append(
66
+ f":vartype {og.property_name}: {self.code_model.namespace}{operations_folder}{og.class_name}"
67
+ )
68
+ for param in self.code_model.client.parameters.method:
69
+ retval.append(
70
+ f":{param.description_keyword} {param.client_name}: {param.description}"
71
+ )
72
+ retval.append(
73
+ f":{param.docstring_type_keyword} {param.client_name}: {param.docstring_type(async_mode=async_mode)}"
74
+ )
63
75
  if self.code_model.has_lro_operations:
64
76
  retval.append(
65
77
  ":keyword int polling_interval: Default waiting time between two polls for LRO operations "
@@ -69,92 +81,130 @@ class ClientSerializer:
69
81
  return retval
70
82
 
71
83
  def initialize_config(self) -> str:
72
- config_name = f"{self.code_model.class_name}Configuration"
84
+ config_name = f"{self.code_model.client.name}Configuration"
73
85
  config_call = ", ".join(
74
86
  [
75
- f"{p.serialized_name}={p.serialized_name}"
76
- for p in self.code_model.service_client.parameters.config_method
77
- if not p.is_kwarg
78
- ] + [
79
- "**kwargs"
80
- ])
87
+ f"{p.client_name}={p.client_name}"
88
+ for p in self.code_model.config.parameters.method
89
+ if p.method_location != ParameterMethodLocation.KWARG
90
+ ]
91
+ + ["**kwargs"]
92
+ )
81
93
  return f"self._config = {config_name}({config_call})"
82
94
 
95
+ @property
96
+ def host_variable_name(self) -> str:
97
+ try:
98
+ return next(
99
+ p for p in self.code_model.client.parameters if p.is_host
100
+ ).client_name
101
+ except StopIteration:
102
+ return "_endpoint"
103
+
83
104
  def initialize_pipeline_client(self, async_mode: bool) -> str:
84
- host_variable_name = self.code_model.service_client.parameters.host_variable_name
85
- if self.code_model.service_client.has_parameterized_host:
86
- host_variable_name = "_" + host_variable_name # we don't want potential conflicts with input params
87
- pipeline_client_name = self.code_model.service_client.pipeline_class(async_mode)
88
- return f"self._client = {pipeline_client_name}(base_url={host_variable_name}, config=self._config, **kwargs)"
105
+ pipeline_client_name = self.code_model.client.pipeline_class(async_mode)
106
+ return (
107
+ f"self._client = {pipeline_client_name}(base_url={self.host_variable_name}, "
108
+ "config=self._config, **kwargs)"
109
+ )
89
110
 
90
111
  def serializers_and_operation_groups_properties(self) -> List[str]:
91
112
  retval = []
92
- if self.code_model.sorted_schemas:
93
- client_models_value = "{k: v for k, v in models.__dict__.items() if isinstance(v, type)}"
113
+ if self.code_model.model_types:
114
+ client_models_value = (
115
+ "{k: v for k, v in models.__dict__.items() if isinstance(v, type)}"
116
+ )
94
117
  else:
95
118
  client_models_value = "{} # type: Dict[str, Any]"
96
119
  if self.code_model.options["models_mode"]:
97
120
  retval.append(f"client_models = {client_models_value}")
98
- client_models_str = "client_models" if self.code_model.options["models_mode"] else ""
121
+ client_models_str = (
122
+ "client_models" if self.code_model.options["models_mode"] else ""
123
+ )
99
124
  retval.append(f"self._serialize = Serializer({client_models_str})")
100
125
  retval.append(f"self._deserialize = Deserializer({client_models_str})")
101
126
  if not self.code_model.options["client_side_validation"]:
102
127
  retval.append("self._serialize.client_side_validation = False")
103
- operation_groups = [og for og in self.code_model.operation_groups if not og.is_empty_operation_group]
104
- if operation_groups:
128
+ operation_groups = [
129
+ og for og in self.code_model.operation_groups if not og.is_mixin
130
+ ]
131
+ for og in operation_groups:
105
132
  retval.extend(
106
133
  [
107
- f"self.{og.name} = {og.class_name}(self._client, self._config, self._serialize, self._deserialize)"
108
- for og in operation_groups
134
+ f"self.{og.property_name} = {og.class_name}({og.mypy_ignore}{og.pylint_disable}",
135
+ " self._client, self._config, self._serialize, self._deserialize",
136
+ ")",
109
137
  ]
110
138
  )
111
139
  return retval
112
140
 
113
141
  def _send_request_signature(self, async_mode: bool) -> str:
114
- return utils.serialize_method(
142
+ is_python3_file = async_mode or self.code_model.options["python3_only"]
143
+ request_signature = [
144
+ "request: HttpRequest,"
145
+ if is_python3_file
146
+ else "request, # type: HttpRequest"
147
+ ]
148
+ send_request_signature = (
149
+ request_signature
150
+ + self.code_model.client.parameters.method_signature_kwargs(is_python3_file)
151
+ )
152
+ return self.parameter_serializer.serialize_method(
115
153
  function_def="def",
116
- method_name=self.code_model.send_request_name,
117
- is_in_class=True,
118
- method_param_signatures=self.code_model.service_client.send_request_signature(
119
- async_mode or self.is_python3_file
120
- ),
154
+ method_name=self.code_model.client.send_request_name,
155
+ need_self_param=True,
156
+ method_param_signatures=send_request_signature,
121
157
  )
122
158
 
123
- def send_request_signature_and_response_type_annotation(self, async_mode: bool) -> str:
159
+ def send_request_signature_and_response_type_annotation(
160
+ self, async_mode: bool
161
+ ) -> str:
124
162
  send_request_signature = self._send_request_signature(async_mode)
125
163
  return utils.method_signature_and_response_type_annotation_template(
126
164
  is_python3_file=async_mode or self.is_python3_file,
127
165
  method_signature=send_request_signature,
128
- response_type_annotation="Awaitable[AsyncHttpResponse]" if async_mode else "HttpResponse",
166
+ response_type_annotation="Awaitable[AsyncHttpResponse]"
167
+ if async_mode
168
+ else "HttpResponse",
129
169
  )
130
170
 
131
171
  def _example_make_call(self, async_mode: bool) -> List[str]:
132
172
  http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
133
173
  retval = [
134
- f">>> response = {'await ' if async_mode else ''}client.{self.code_model.send_request_name}(request)"
174
+ f">>> response = {'await ' if async_mode else ''}client.{self.code_model.client.send_request_name}(request)"
135
175
  ]
136
176
  retval.append(f"<{http_response}: 200 OK>")
137
177
  return retval
138
178
 
139
179
  def _request_builder_example(self, async_mode: bool) -> List[str]:
140
180
  retval = [
141
- "We have helper methods to create requests specific to this service in " +
142
- f"`{self.code_model.namespace}.{self.code_model.rest_layer_name}`."
181
+ "We have helper methods to create requests specific to this service in "
182
+ + f"`{self.code_model.namespace}.{self.code_model.rest_layer_name}`."
143
183
  ]
144
- retval.append("Use these helper methods to create the request you pass to this method.")
184
+ retval.append(
185
+ "Use these helper methods to create the request you pass to this method."
186
+ )
145
187
  retval.append("")
146
188
 
147
- request_builder = self.code_model.rest.request_builders[0]
189
+ request_builder = self.code_model.request_builders[0]
148
190
  request_builder_signature = ", ".join(request_builder.parameters.call)
149
- if request_builder.builder_group_name:
150
- rest_imported = request_builder.builder_group_name
151
- request_builder_name = f"{request_builder.builder_group_name}.{request_builder.name}"
191
+ if request_builder.group_name:
192
+ rest_imported = request_builder.group_name
193
+ request_builder_name = (
194
+ f"{request_builder.group_name}.{request_builder.name}"
195
+ )
152
196
  else:
153
197
  rest_imported = request_builder.name
154
198
  request_builder_name = request_builder.name
155
- retval.append(f">>> from {self.code_model.namespace}.{self.code_model.rest_layer_name} import {rest_imported}")
156
- retval.append(f">>> request = {request_builder_name}({request_builder_signature})")
157
- retval.append(f"<HttpRequest [{request_builder.method}], url: '{request_builder.url}'>")
199
+ retval.append(
200
+ f">>> from {self.code_model.namespace}.{self.code_model.rest_layer_name} import {rest_imported}"
201
+ )
202
+ retval.append(
203
+ f">>> request = {request_builder_name}({request_builder_signature})"
204
+ )
205
+ retval.append(
206
+ f"<HttpRequest [{request_builder.method}], url: '{request_builder.url}'>"
207
+ )
158
208
  retval.extend(self._example_make_call(async_mode))
159
209
  return retval
160
210
 
@@ -173,33 +223,42 @@ class ClientSerializer:
173
223
  else:
174
224
  retval.extend(self._rest_request_example(async_mode))
175
225
  retval.append("")
176
- retval.append("For more information on this code flow, see https://aka.ms/azsdk/python/protocol/quickstart")
226
+ retval.append(
227
+ "For more information on this code flow, see https://aka.ms/azsdk/python/protocol/quickstart"
228
+ )
177
229
  retval.append(f"")
178
230
  retval.append(":param request: The network request you want to make. Required.")
179
231
  retval.append(f":type request: ~azure.core.rest.HttpRequest")
180
- retval.append(":keyword bool stream: Whether the response payload will be streamed. Defaults to False.")
181
- retval.append(":return: The response of your network call. Does not do error handling on your response.")
232
+ retval.append(
233
+ ":keyword bool stream: Whether the response payload will be streamed. Defaults to False."
234
+ )
235
+ retval.append(
236
+ ":return: The response of your network call. Does not do error handling on your response."
237
+ )
182
238
  http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
183
239
  retval.append(f":rtype: ~azure.core.rest.{http_response}")
184
240
  retval.append('"""')
185
241
  return retval
186
242
 
187
243
  def serialize_path(self) -> List[str]:
188
- return utils.serialize_path(self.code_model.global_parameters.path, "self._serialize")
244
+ return self.parameter_serializer.serialize_path(
245
+ self.code_model.client.parameters.path, "self._serialize"
246
+ )
189
247
 
190
- class ConfigSerializer:
191
248
 
249
+ class ConfigSerializer:
192
250
  def __init__(self, code_model: CodeModel, is_python3_file: bool) -> None:
193
251
  self.code_model = code_model
252
+ self.parameter_serializer = ParameterSerializer()
194
253
  self.is_python3_file = is_python3_file
195
254
 
196
255
  def _init_signature(self, async_mode: bool) -> str:
197
- return utils.serialize_method(
256
+ return self.parameter_serializer.serialize_method(
198
257
  function_def="def",
199
258
  method_name="__init__",
200
- is_in_class=True,
201
- method_param_signatures=self.code_model.global_parameters.config_method_signature(
202
- async_mode or self.is_python3_file
259
+ need_self_param=True,
260
+ method_param_signatures=self.code_model.config.parameters.method_signature(
261
+ async_mode or self.is_python3_file, async_mode
203
262
  ),
204
263
  )
205
264
 
@@ -212,29 +271,36 @@ class ConfigSerializer:
212
271
  )
213
272
 
214
273
  def pop_kwargs_from_signature(self, async_mode: bool) -> List[str]:
215
- return utils.pop_kwargs_from_signature(self.code_model.global_parameters.config_kwargs_to_pop(
216
- async_mode or self.is_python3_file
217
- ))
274
+ return self.parameter_serializer.pop_kwargs_from_signature(
275
+ self.code_model.config.parameters.kwargs_to_pop(
276
+ async_mode or self.is_python3_file
277
+ ),
278
+ check_kwarg_dict=False,
279
+ pop_headers_kwarg=PopKwargType.NO,
280
+ pop_params_kwarg=PopKwargType.NO,
281
+ )
218
282
 
219
283
  def set_constants(self) -> List[str]:
220
284
  return [
221
- f"self.{p.serialized_name} = {p.constant_declaration}"
222
- for p in self.code_model.global_parameters.constant
223
- if p not in self.code_model.global_parameters.method
285
+ f"self.{p.client_name} = {p.client_default_value_declaration}"
286
+ for p in self.code_model.config.parameters.constant
287
+ if p not in self.code_model.config.parameters.method
224
288
  ]
225
289
 
226
290
  def check_required_parameters(self) -> List[str]:
227
291
  return [
228
- f'if {p.serialized_name} is None:\n'
229
- f' raise ValueError("Parameter \'{p.serialized_name}\' must not be None.")'
230
- for p in self.code_model.global_parameters.config_method
231
- if p.required and not p.constant
292
+ f"if {p.client_name} is None:\n"
293
+ f" raise ValueError(\"Parameter '{p.client_name}' must not be None.\")"
294
+ for p in self.code_model.config.parameters.method
295
+ if not (p.optional or p.constant)
232
296
  ]
233
297
 
234
- def property_descriptions(self) -> List[str]:
298
+ def property_descriptions(self, async_mode: bool) -> List[str]:
235
299
  retval: List[str] = []
236
- for p in self.code_model.global_parameters.config_method:
237
- retval.append(f":{p.description_keyword} {p.serialized_name}: {p.description}")
238
- retval.append(f":{p.docstring_type_keyword} {p.serialized_name}: {p.docstring_type}")
300
+ for p in self.code_model.config.parameters.method:
301
+ retval.append(f":{p.description_keyword} {p.client_name}: {p.description}")
302
+ retval.append(
303
+ f":{p.docstring_type_keyword} {p.client_name}: {p.docstring_type(async_mode=async_mode)}"
304
+ )
239
305
  retval.append('"""')
240
306
  return retval
@@ -5,27 +5,18 @@
5
5
  # --------------------------------------------------------------------------
6
6
  from jinja2 import Environment
7
7
  from .import_serializer import FileImportSerializer, TypingSection
8
- from ..models import FileImport, ImportType, CodeModel, TokenCredentialSchema, ParameterList
8
+ from ..models import (
9
+ FileImport,
10
+ ImportType,
11
+ CodeModel,
12
+ )
9
13
  from .client_serializer import ClientSerializer, ConfigSerializer
10
14
 
11
- def config_imports(code_model, global_parameters: ParameterList, async_mode: bool) -> FileImport:
12
- file_import = FileImport()
13
- file_import.add_submodule_import("azure.core.configuration", "Configuration", ImportType.AZURECORE)
14
- file_import.add_submodule_import("azure.core.pipeline", "policies", ImportType.AZURECORE)
15
- file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL)
16
- if code_model.options["package_version"]:
17
- file_import.add_submodule_import(".._version" if async_mode else "._version", "VERSION", ImportType.LOCAL)
18
- for gp in global_parameters:
19
- file_import.merge(gp.imports())
20
- if code_model.options["azure_arm"]:
21
- policy = "AsyncARMChallengeAuthenticationPolicy" if async_mode else "ARMChallengeAuthenticationPolicy"
22
- file_import.add_submodule_import("azure.mgmt.core.policies", "ARMHttpLoggingPolicy", ImportType.AZURECORE)
23
- file_import.add_submodule_import("azure.mgmt.core.policies", policy, ImportType.AZURECORE)
24
- return file_import
25
-
26
15
 
27
16
  class GeneralSerializer:
28
- def __init__(self, code_model: CodeModel, env: Environment, async_mode: bool) -> None:
17
+ def __init__(
18
+ self, code_model: CodeModel, env: Environment, async_mode: bool
19
+ ) -> None:
29
20
  self.code_model = code_model
30
21
  self.env = env
31
22
  self.async_mode = async_mode
@@ -38,21 +29,9 @@ class GeneralSerializer:
38
29
  template = self.env.get_template("init.py.jinja2")
39
30
  return template.render(code_model=self.code_model, async_mode=self.async_mode)
40
31
 
41
- def _correct_credential_parameter(self):
42
- credential_param = [
43
- gp for gp in self.code_model.global_parameters.parameters if isinstance(gp.schema, TokenCredentialSchema)
44
- ][0]
45
- credential_param.schema = TokenCredentialSchema(async_mode=self.async_mode)
46
-
47
32
  def serialize_service_client_file(self) -> str:
48
33
 
49
- template = self.env.get_template("service_client.py.jinja2")
50
-
51
- if (
52
- self.code_model.options['credential'] and
53
- isinstance(self.code_model.credential_schema_policy.credential, TokenCredentialSchema)
54
- ):
55
- self._correct_credential_parameter()
34
+ template = self.env.get_template("client.py.jinja2")
56
35
 
57
36
  python3_only = self.code_model.options["python3_only"]
58
37
  return template.render(
@@ -60,8 +39,8 @@ class GeneralSerializer:
60
39
  async_mode=self.async_mode,
61
40
  serializer=ClientSerializer(self.code_model, is_python3_file=python3_only),
62
41
  imports=FileImportSerializer(
63
- self.code_model.service_client.imports(self.async_mode),
64
- is_python3_file=self.async_mode or python3_only
42
+ self.code_model.client.imports(self.async_mode),
43
+ is_python3_file=self.async_mode or python3_only,
65
44
  ),
66
45
  )
67
46
 
@@ -77,37 +56,55 @@ class GeneralSerializer:
77
56
  ImportType.AZURECORE,
78
57
  )
79
58
 
59
+ if self.code_model.need_mixin_abc:
60
+ file_import.add_submodule_import(
61
+ "abc",
62
+ "ABC",
63
+ ImportType.STDLIB,
64
+ )
65
+ file_import.add_submodule_import(
66
+ "azure.core",
67
+ f"{'Async' if self.async_mode else ''}PipelineClient",
68
+ ImportType.AZURECORE,
69
+ TypingSection.TYPING,
70
+ )
71
+ file_import.add_submodule_import(
72
+ "._configuration",
73
+ f"{self.code_model.client.name}Configuration",
74
+ ImportType.LOCAL,
75
+ )
76
+ file_import.add_submodule_import(
77
+ "msrest", "Serializer", ImportType.THIRDPARTY, TypingSection.TYPING
78
+ )
79
+ file_import.add_submodule_import(
80
+ "msrest", "Deserializer", ImportType.THIRDPARTY, TypingSection.TYPING
81
+ )
82
+
80
83
  return template.render(
81
84
  code_model=self.code_model,
82
85
  imports=FileImportSerializer(
83
86
  file_import,
84
87
  is_python3_file=self.async_mode,
85
- )
88
+ ),
89
+ async_mode=self.async_mode,
86
90
  )
87
91
 
88
-
89
92
  def serialize_config_file(self) -> str:
90
93
 
91
- package_name = self.code_model.options['package_name']
94
+ package_name = self.code_model.options["package_name"]
92
95
  if package_name and package_name.startswith("azure-"):
93
- package_name = package_name[len("azure-"):]
94
- sdk_moniker = package_name if package_name else self.code_model.class_name.lower()
95
-
96
- if (
97
- self.code_model.options['credential'] and
98
- isinstance(self.code_model.credential_schema_policy.credential, TokenCredentialSchema)
99
- ):
100
- self._correct_credential_parameter()
101
-
96
+ package_name = package_name[len("azure-") :]
97
+ sdk_moniker = (
98
+ package_name if package_name else self.code_model.client.name.lower()
99
+ )
102
100
  template = self.env.get_template("config.py.jinja2")
103
101
  python3_only = self.code_model.options["python3_only"]
104
102
  return template.render(
105
103
  code_model=self.code_model,
106
104
  async_mode=self.async_mode,
107
105
  imports=FileImportSerializer(
108
- config_imports(
109
- self.code_model, self.code_model.global_parameters, self.async_mode
110
- ), is_python3_file=self.async_mode or python3_only
106
+ self.code_model.config.imports(self.async_mode),
107
+ is_python3_file=self.async_mode or python3_only,
111
108
  ),
112
109
  serializer=ConfigSerializer(self.code_model, is_python3_file=python3_only),
113
110
  sdk_moniker=sdk_moniker,