@autorest/python 5.15.0 → 5.18.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 (118) hide show
  1. package/ChangeLog.md +98 -4
  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 +122 -211
  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} +68 -45
  10. package/autorest/codegen/models/client.py +193 -40
  11. package/autorest/codegen/models/code_model.py +145 -245
  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 +131 -0
  16. package/autorest/codegen/models/enum_type.py +195 -0
  17. package/autorest/codegen/models/imports.py +93 -41
  18. package/autorest/codegen/models/list_type.py +149 -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 +262 -0
  22. package/autorest/codegen/models/operation.py +412 -259
  23. package/autorest/codegen/models/operation_group.py +80 -91
  24. package/autorest/codegen/models/paging_operation.py +101 -117
  25. package/autorest/codegen/models/parameter.py +302 -341
  26. package/autorest/codegen/models/parameter_list.py +373 -357
  27. package/autorest/codegen/models/primitive_types.py +544 -0
  28. package/autorest/codegen/models/property.py +136 -134
  29. package/autorest/codegen/models/request_builder.py +138 -86
  30. package/autorest/codegen/models/request_builder_parameter.py +122 -86
  31. package/autorest/codegen/models/response.py +325 -0
  32. package/autorest/codegen/models/utils.py +13 -17
  33. package/autorest/codegen/serializers/__init__.py +212 -112
  34. package/autorest/codegen/serializers/builder_serializer.py +931 -1040
  35. package/autorest/codegen/serializers/client_serializer.py +140 -84
  36. package/autorest/codegen/serializers/general_serializer.py +26 -50
  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 +62 -34
  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 -19
  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 +4 -1
  47. package/autorest/codegen/serializers/request_builders_serializer.py +57 -0
  48. package/autorest/codegen/serializers/utils.py +0 -126
  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 -1
  54. package/autorest/codegen/templates/init.py.jinja2 +3 -3
  55. package/autorest/codegen/templates/lro_operation.py.jinja2 +6 -5
  56. package/autorest/codegen/templates/lro_paging_operation.py.jinja2 +6 -5
  57. package/autorest/codegen/templates/metadata.json.jinja2 +36 -35
  58. package/autorest/codegen/templates/model.py.jinja2 +23 -24
  59. package/autorest/codegen/templates/model_container.py.jinja2 +2 -1
  60. package/autorest/codegen/templates/model_init.py.jinja2 +3 -5
  61. package/autorest/codegen/templates/operation.py.jinja2 +10 -14
  62. package/autorest/codegen/templates/operation_group.py.jinja2 +9 -15
  63. package/autorest/codegen/templates/operation_groups_container.py.jinja2 +1 -1
  64. package/autorest/codegen/templates/operation_tools.jinja2 +8 -2
  65. package/autorest/codegen/templates/paging_operation.py.jinja2 +7 -8
  66. package/autorest/codegen/templates/request_builder.py.jinja2 +19 -10
  67. package/autorest/codegen/templates/setup.py.jinja2 +9 -3
  68. package/autorest/codegen/templates/vendor.py.jinja2 +1 -1
  69. package/autorest/jsonrpc/__init__.py +7 -12
  70. package/autorest/jsonrpc/localapi.py +4 -3
  71. package/autorest/jsonrpc/server.py +28 -9
  72. package/autorest/jsonrpc/stdstream.py +13 -6
  73. package/autorest/m2r/__init__.py +5 -8
  74. package/autorest/m4reformatter/__init__.py +1126 -0
  75. package/autorest/multiapi/__init__.py +24 -14
  76. package/autorest/multiapi/models/client.py +21 -11
  77. package/autorest/multiapi/models/code_model.py +23 -10
  78. package/autorest/multiapi/models/config.py +4 -1
  79. package/autorest/multiapi/models/constant_global_parameter.py +1 -0
  80. package/autorest/multiapi/models/global_parameter.py +2 -1
  81. package/autorest/multiapi/models/global_parameters.py +14 -8
  82. package/autorest/multiapi/models/imports.py +24 -17
  83. package/autorest/multiapi/models/mixin_operation.py +5 -5
  84. package/autorest/multiapi/models/operation_group.py +2 -1
  85. package/autorest/multiapi/models/operation_mixin_group.py +21 -10
  86. package/autorest/multiapi/serializers/__init__.py +20 -25
  87. package/autorest/multiapi/serializers/import_serializer.py +47 -17
  88. package/autorest/multiapi/serializers/multiapi_serializer.py +17 -17
  89. package/autorest/multiapi/templates/multiapi_config.py.jinja2 +3 -3
  90. package/autorest/multiapi/templates/multiapi_init.py.jinja2 +2 -2
  91. package/autorest/multiapi/templates/multiapi_operations_mixin.py.jinja2 +4 -4
  92. package/autorest/multiapi/templates/multiapi_service_client.py.jinja2 +9 -9
  93. package/autorest/multiapi/utils.py +3 -3
  94. package/autorest/postprocess/__init__.py +202 -0
  95. package/autorest/postprocess/get_all.py +19 -0
  96. package/autorest/postprocess/venvtools.py +73 -0
  97. package/autorest/preprocess/__init__.py +210 -0
  98. package/autorest/preprocess/helpers.py +54 -0
  99. package/autorest/{namer → preprocess}/python_mappings.py +25 -32
  100. package/package.json +3 -3
  101. package/run-python3.js +2 -3
  102. package/venvtools.py +1 -1
  103. package/autorest/codegen/models/constant_schema.py +0 -101
  104. package/autorest/codegen/models/credential_model.py +0 -47
  105. package/autorest/codegen/models/credential_schema.py +0 -91
  106. package/autorest/codegen/models/credential_schema_policy.py +0 -77
  107. package/autorest/codegen/models/dictionary_schema.py +0 -103
  108. package/autorest/codegen/models/enum_schema.py +0 -215
  109. package/autorest/codegen/models/list_schema.py +0 -123
  110. package/autorest/codegen/models/object_schema.py +0 -253
  111. package/autorest/codegen/models/primitive_schemas.py +0 -466
  112. package/autorest/codegen/models/request_builder_parameter_list.py +0 -280
  113. package/autorest/codegen/models/rest.py +0 -42
  114. package/autorest/codegen/models/schema_request.py +0 -45
  115. package/autorest/codegen/models/schema_response.py +0 -136
  116. package/autorest/codegen/serializers/rest_serializer.py +0 -57
  117. package/autorest/namer/__init__.py +0 -25
  118. 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,39 +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(
36
- self.code_model.service_client.parameters.kwargs_to_pop(
38
+ return self.parameter_serializer.pop_kwargs_from_signature(
39
+ self.code_model.client.parameters.kwargs_to_pop(
37
40
  async_mode or self.is_python3_file,
38
41
  ),
39
42
  check_kwarg_dict=False,
40
- pop_headers_kwarg=utils.PopKwargType.NO,
41
- pop_params_kwarg=utils.PopKwargType.NO,
43
+ pop_headers_kwarg=PopKwargType.NO,
44
+ pop_params_kwarg=PopKwargType.NO,
42
45
  )
43
46
 
44
47
  def class_definition(self, async_mode) -> str:
45
- class_name = self.code_model.class_name
46
- 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)
47
50
  base_class = ""
48
51
  if has_mixin_og:
49
52
  base_class = f"{class_name}OperationsMixin"
50
53
  elif not (async_mode or self.is_python3_file):
51
54
  base_class = "object"
52
- disable = ""
53
- if len(self.code_model.operation_groups) > 6:
54
- disable = " # pylint: disable=too-many-instance-attributes"
55
+ pylint_disable = self.code_model.client.pylint_disable
55
56
  if base_class:
56
- return f"class {class_name}({base_class}):{disable}"
57
- return f"class {class_name}:{disable}"
57
+ return f"class {class_name}({base_class}):{pylint_disable}"
58
+ return f"class {class_name}:{pylint_disable}"
58
59
 
59
60
  def property_descriptions(self, async_mode: bool) -> List[str]:
60
61
  retval: List[str] = []
61
62
  operations_folder = ".aio.operations." if async_mode else ".operations."
62
- for og in [og for og in self.code_model.operation_groups if not og.is_empty_operation_group]:
63
- retval.append(f":ivar {og.name}: {og.class_name} operations")
64
- retval.append(f":vartype {og.name}: {self.code_model.namespace}{operations_folder}{og.class_name}")
65
- for param in self.code_model.service_client.parameters.client_method:
66
- retval.append(f":{param.description_keyword} {param.serialized_name}: {param.description}")
67
- 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
+ )
68
75
  if self.code_model.has_lro_operations:
69
76
  retval.append(
70
77
  ":keyword int polling_interval: Default waiting time between two polls for LRO operations "
@@ -74,92 +81,130 @@ class ClientSerializer:
74
81
  return retval
75
82
 
76
83
  def initialize_config(self) -> str:
77
- config_name = f"{self.code_model.class_name}Configuration"
84
+ config_name = f"{self.code_model.client.name}Configuration"
78
85
  config_call = ", ".join(
79
86
  [
80
- f"{p.serialized_name}={p.serialized_name}"
81
- for p in self.code_model.service_client.parameters.config_method
82
- if not p.is_kwarg
83
- ] + [
84
- "**kwargs"
85
- ])
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
+ )
86
93
  return f"self._config = {config_name}({config_call})"
87
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
+
88
104
  def initialize_pipeline_client(self, async_mode: bool) -> str:
89
- host_variable_name = self.code_model.service_client.parameters.host_variable_name
90
- if self.code_model.service_client.has_parameterized_host:
91
- host_variable_name = "_" + host_variable_name # we don't want potential conflicts with input params
92
- pipeline_client_name = self.code_model.service_client.pipeline_class(async_mode)
93
- 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
+ )
94
110
 
95
111
  def serializers_and_operation_groups_properties(self) -> List[str]:
96
112
  retval = []
97
- if self.code_model.sorted_schemas:
98
- 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
+ )
99
117
  else:
100
118
  client_models_value = "{} # type: Dict[str, Any]"
101
119
  if self.code_model.options["models_mode"]:
102
120
  retval.append(f"client_models = {client_models_value}")
103
- 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
+ )
104
124
  retval.append(f"self._serialize = Serializer({client_models_str})")
105
125
  retval.append(f"self._deserialize = Deserializer({client_models_str})")
106
126
  if not self.code_model.options["client_side_validation"]:
107
127
  retval.append("self._serialize.client_side_validation = False")
108
- operation_groups = [og for og in self.code_model.operation_groups if not og.is_empty_operation_group]
109
- 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:
110
132
  retval.extend(
111
133
  [
112
- f"self.{og.name} = {og.class_name}(self._client, self._config, self._serialize, self._deserialize)"
113
- 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
+ ")",
114
137
  ]
115
138
  )
116
139
  return retval
117
140
 
118
141
  def _send_request_signature(self, async_mode: bool) -> str:
119
- 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(
120
153
  function_def="def",
121
- method_name=self.code_model.send_request_name,
122
- is_in_class=True,
123
- method_param_signatures=self.code_model.service_client.send_request_signature(
124
- async_mode or self.is_python3_file
125
- ),
154
+ method_name=self.code_model.client.send_request_name,
155
+ need_self_param=True,
156
+ method_param_signatures=send_request_signature,
126
157
  )
127
158
 
128
- 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:
129
162
  send_request_signature = self._send_request_signature(async_mode)
130
163
  return utils.method_signature_and_response_type_annotation_template(
131
164
  is_python3_file=async_mode or self.is_python3_file,
132
165
  method_signature=send_request_signature,
133
- response_type_annotation="Awaitable[AsyncHttpResponse]" if async_mode else "HttpResponse",
166
+ response_type_annotation="Awaitable[AsyncHttpResponse]"
167
+ if async_mode
168
+ else "HttpResponse",
134
169
  )
135
170
 
136
171
  def _example_make_call(self, async_mode: bool) -> List[str]:
137
172
  http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
138
173
  retval = [
139
- 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)"
140
175
  ]
141
176
  retval.append(f"<{http_response}: 200 OK>")
142
177
  return retval
143
178
 
144
179
  def _request_builder_example(self, async_mode: bool) -> List[str]:
145
180
  retval = [
146
- "We have helper methods to create requests specific to this service in " +
147
- 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}`."
148
183
  ]
149
- 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
+ )
150
187
  retval.append("")
151
188
 
152
- request_builder = self.code_model.rest.request_builders[0]
189
+ request_builder = self.code_model.request_builders[0]
153
190
  request_builder_signature = ", ".join(request_builder.parameters.call)
154
- if request_builder.builder_group_name:
155
- rest_imported = request_builder.builder_group_name
156
- 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
+ )
157
196
  else:
158
197
  rest_imported = request_builder.name
159
198
  request_builder_name = request_builder.name
160
- retval.append(f">>> from {self.code_model.namespace}.{self.code_model.rest_layer_name} import {rest_imported}")
161
- retval.append(f">>> request = {request_builder_name}({request_builder_signature})")
162
- 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
+ )
163
208
  retval.extend(self._example_make_call(async_mode))
164
209
  return retval
165
210
 
@@ -178,33 +223,42 @@ class ClientSerializer:
178
223
  else:
179
224
  retval.extend(self._rest_request_example(async_mode))
180
225
  retval.append("")
181
- 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/dpcodegen/python/send_request"
228
+ )
182
229
  retval.append(f"")
183
230
  retval.append(":param request: The network request you want to make. Required.")
184
231
  retval.append(f":type request: ~azure.core.rest.HttpRequest")
185
- retval.append(":keyword bool stream: Whether the response payload will be streamed. Defaults to False.")
186
- 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
+ )
187
238
  http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
188
239
  retval.append(f":rtype: ~azure.core.rest.{http_response}")
189
240
  retval.append('"""')
190
241
  return retval
191
242
 
192
243
  def serialize_path(self) -> List[str]:
193
- 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
+ )
194
247
 
195
- class ConfigSerializer:
196
248
 
249
+ class ConfigSerializer:
197
250
  def __init__(self, code_model: CodeModel, is_python3_file: bool) -> None:
198
251
  self.code_model = code_model
252
+ self.parameter_serializer = ParameterSerializer()
199
253
  self.is_python3_file = is_python3_file
200
254
 
201
255
  def _init_signature(self, async_mode: bool) -> str:
202
- return utils.serialize_method(
256
+ return self.parameter_serializer.serialize_method(
203
257
  function_def="def",
204
258
  method_name="__init__",
205
- is_in_class=True,
206
- method_param_signatures=self.code_model.global_parameters.config_method_signature(
207
- 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
208
262
  ),
209
263
  )
210
264
 
@@ -217,34 +271,36 @@ class ConfigSerializer:
217
271
  )
218
272
 
219
273
  def pop_kwargs_from_signature(self, async_mode: bool) -> List[str]:
220
- return utils.pop_kwargs_from_signature(
221
- self.code_model.global_parameters.config_kwargs_to_pop(
274
+ return self.parameter_serializer.pop_kwargs_from_signature(
275
+ self.code_model.config.parameters.kwargs_to_pop(
222
276
  async_mode or self.is_python3_file
223
277
  ),
224
278
  check_kwarg_dict=False,
225
- pop_headers_kwarg=utils.PopKwargType.NO,
226
- pop_params_kwarg=utils.PopKwargType.NO,
279
+ pop_headers_kwarg=PopKwargType.NO,
280
+ pop_params_kwarg=PopKwargType.NO,
227
281
  )
228
282
 
229
283
  def set_constants(self) -> List[str]:
230
284
  return [
231
- f"self.{p.serialized_name} = {p.constant_declaration}"
232
- for p in self.code_model.global_parameters.constant
233
- 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
234
288
  ]
235
289
 
236
290
  def check_required_parameters(self) -> List[str]:
237
291
  return [
238
- f'if {p.serialized_name} is None:\n'
239
- f' raise ValueError("Parameter \'{p.serialized_name}\' must not be None.")'
240
- for p in self.code_model.global_parameters.config_method
241
- 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)
242
296
  ]
243
297
 
244
- def property_descriptions(self) -> List[str]:
298
+ def property_descriptions(self, async_mode: bool) -> List[str]:
245
299
  retval: List[str] = []
246
- for p in self.code_model.global_parameters.config_method:
247
- retval.append(f":{p.description_keyword} {p.serialized_name}: {p.description}")
248
- 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
+ )
249
305
  retval.append('"""')
250
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_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
 
@@ -91,11 +70,15 @@ class GeneralSerializer:
91
70
  )
92
71
  file_import.add_submodule_import(
93
72
  "._configuration",
94
- f"{self.code_model.class_name}Configuration",
95
- ImportType.LOCAL
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
96
81
  )
97
- file_import.add_submodule_import("msrest", "Serializer", ImportType.THIRDPARTY, TypingSection.TYPING)
98
- file_import.add_submodule_import("msrest", "Deserializer", ImportType.THIRDPARTY, TypingSection.TYPING)
99
82
 
100
83
  return template.render(
101
84
  code_model=self.code_model,
@@ -106,29 +89,22 @@ class GeneralSerializer:
106
89
  async_mode=self.async_mode,
107
90
  )
108
91
 
109
-
110
92
  def serialize_config_file(self) -> str:
111
93
 
112
- package_name = self.code_model.options['package_name']
94
+ package_name = self.code_model.options["package_name"]
113
95
  if package_name and package_name.startswith("azure-"):
114
- package_name = package_name[len("azure-"):]
115
- sdk_moniker = package_name if package_name else self.code_model.class_name.lower()
116
-
117
- if (
118
- self.code_model.options['credential'] and
119
- isinstance(self.code_model.credential_model.credential_schema_policy.credential, TokenCredentialSchema)
120
- ):
121
- self._correct_credential_parameter()
122
-
96
+ package_name = package_name[len("azure-") :]
97
+ sdk_moniker = (
98
+ package_name if package_name else self.code_model.client.name.lower()
99
+ )
123
100
  template = self.env.get_template("config.py.jinja2")
124
101
  python3_only = self.code_model.options["python3_only"]
125
102
  return template.render(
126
103
  code_model=self.code_model,
127
104
  async_mode=self.async_mode,
128
105
  imports=FileImportSerializer(
129
- config_imports(
130
- self.code_model, self.code_model.global_parameters, self.async_mode
131
- ), 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,
132
108
  ),
133
109
  serializer=ConfigSerializer(self.code_model, is_python3_file=python3_only),
134
110
  sdk_moniker=sdk_moniker,