@autorest/python 6.2.12 → 6.2.16

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 (52) hide show
  1. package/autorest/__init__.py +7 -5
  2. package/autorest/_utils.py +7 -1
  3. package/autorest/black/__init__.py +6 -1
  4. package/autorest/codegen/__init__.py +1 -1
  5. package/autorest/codegen/models/base.py +4 -13
  6. package/autorest/codegen/models/client.py +9 -11
  7. package/autorest/codegen/models/code_model.py +2 -2
  8. package/autorest/codegen/models/credential_types.py +7 -14
  9. package/autorest/codegen/models/dictionary_type.py +1 -1
  10. package/autorest/codegen/models/imports.py +3 -3
  11. package/autorest/codegen/models/lro_operation.py +5 -5
  12. package/autorest/codegen/models/model_type.py +11 -8
  13. package/autorest/codegen/models/operation.py +8 -8
  14. package/autorest/codegen/models/operation_group.py +3 -1
  15. package/autorest/codegen/models/paging_operation.py +2 -2
  16. package/autorest/codegen/models/parameter.py +27 -6
  17. package/autorest/codegen/models/parameter_list.py +1 -9
  18. package/autorest/codegen/models/primitive_types.py +1 -1
  19. package/autorest/codegen/models/property.py +15 -3
  20. package/autorest/codegen/models/response.py +2 -2
  21. package/autorest/codegen/serializers/__init__.py +2 -2
  22. package/autorest/codegen/serializers/builder_serializer.py +55 -25
  23. package/autorest/codegen/serializers/client_serializer.py +6 -4
  24. package/autorest/codegen/serializers/general_serializer.py +7 -2
  25. package/autorest/codegen/serializers/model_serializer.py +14 -4
  26. package/autorest/codegen/serializers/sample_serializer.py +2 -6
  27. package/autorest/codegen/templates/config.py.jinja2 +25 -6
  28. package/autorest/codegen/templates/enum.py.jinja2 +2 -2
  29. package/autorest/codegen/templates/metadata.json.jinja2 +18 -9
  30. package/autorest/codegen/templates/model_base.py.jinja2 +87 -70
  31. package/autorest/codegen/templates/model_dpg.py.jinja2 +6 -4
  32. package/autorest/codegen/templates/serialization.py.jinja2 +20 -15
  33. package/autorest/codegen/templates/vendor.py.jinja2 +3 -2
  34. package/autorest/jsonrpc/localapi.py +3 -3
  35. package/autorest/jsonrpc/server.py +3 -3
  36. package/autorest/m2r/__init__.py +1 -1
  37. package/autorest/m4reformatter/__init__.py +12 -2
  38. package/autorest/multiapi/models/__init__.py +2 -0
  39. package/autorest/multiapi/models/code_model.py +13 -0
  40. package/autorest/multiapi/models/global_parameter.py +1 -0
  41. package/autorest/multiapi/models/imports.py +3 -3
  42. package/autorest/multiapi/serializers/__init__.py +30 -3
  43. package/autorest/multiapi/templates/multiapi_service_client.py.jinja2 +8 -12
  44. package/autorest/postprocess/get_all.py +3 -1
  45. package/autorest/postprocess/venvtools.py +5 -4
  46. package/autorest/preprocess/__init__.py +16 -4
  47. package/autorest/preprocess/python_mappings.py +1 -0
  48. package/index.js +0 -0
  49. package/package.json +2 -1
  50. package/requirements.txt +6 -6
  51. package/setup.py +0 -1
  52. package/venvtools.py +2 -3
@@ -31,6 +31,8 @@ from ..models import (
31
31
  MultipartBodyParameter,
32
32
  Property,
33
33
  RequestBuilderType,
34
+ JSONModelType,
35
+ CombinedType,
34
36
  )
35
37
  from .parameter_serializer import ParameterSerializer, PopKwargType
36
38
  from . import utils
@@ -146,6 +148,25 @@ def _serialize_flattened_body(body_parameter: BodyParameter) -> List[str]:
146
148
  return retval
147
149
 
148
150
 
151
+ def _serialize_json_model_body(body_parameter: BodyParameter) -> List[str]:
152
+ retval: List[str] = []
153
+ if not body_parameter.property_to_parameter_name:
154
+ raise ValueError(
155
+ "This method can't be called if the operation doesn't need parameter flattening"
156
+ )
157
+
158
+ retval.append(f"if {body_parameter.client_name} is None:")
159
+ parameter_string = ", \n".join(
160
+ f'"{property_name}": {parameter_name}'
161
+ for property_name, parameter_name in body_parameter.property_to_parameter_name.items()
162
+ )
163
+ model_type = cast(ModelType, body_parameter.type)
164
+ if isinstance(model_type, CombinedType):
165
+ model_type = next(t for t in model_type.types if isinstance(t, JSONModelType))
166
+ retval.append(f" {body_parameter.client_name} = {{{parameter_string}}}")
167
+ return retval
168
+
169
+
149
170
  def _serialize_multipart_body(builder: BuilderType) -> List[str]:
150
171
  retval: List[str] = []
151
172
  body_param = cast(MultipartBodyParameter, builder.parameters.body_parameter)
@@ -184,7 +205,7 @@ def _api_version_validation(builder: OperationType) -> str:
184
205
  retval.append(f" params_added_on={dict(params_added_on)},")
185
206
  if retval:
186
207
  retval_str = "\n".join(retval)
187
- return f"@api_version_validation(\n{retval_str}\n)"
208
+ return f"@api_version_validation(\n{retval_str}\n){builder.pylint_disable}"
188
209
  return ""
189
210
 
190
211
 
@@ -203,23 +224,20 @@ class _BuilderBaseSerializer(Generic[BuilderType]): # pylint: disable=abstract-
203
224
  @abstractmethod
204
225
  def _function_def(self) -> str:
205
226
  """The def keyword for the builder we're serializing, i.e. 'def' or 'async def'"""
206
- ...
207
227
 
208
228
  @property
209
229
  @abstractmethod
210
230
  def _call_method(self) -> str:
211
231
  """How to call network calls. Await if we have to await network calls"""
212
- ...
213
232
 
214
233
  @property
215
234
  @abstractmethod
216
235
  def serializer_name(self) -> str:
217
- ...
236
+ """Name of serializer"""
218
237
 
219
238
  @abstractmethod
220
239
  def response_docstring(self, builder: BuilderType) -> List[str]:
221
240
  """Response portion of the docstring"""
222
- ...
223
241
 
224
242
  def decorators(self, builder: BuilderType) -> List[str]:
225
243
  """Decorators for the method"""
@@ -258,9 +276,7 @@ class _BuilderBaseSerializer(Generic[BuilderType]): # pylint: disable=abstract-
258
276
  )
259
277
  )
260
278
 
261
- def description_and_summary( # pylint: disable=no-self-use
262
- self, builder: BuilderType
263
- ) -> List[str]:
279
+ def description_and_summary(self, builder: BuilderType) -> List[str]:
264
280
  description_list: List[str] = []
265
281
  description_list.append(
266
282
  f"{ builder.summary.strip() if builder.summary else builder.description.strip() }"
@@ -280,9 +296,7 @@ class _BuilderBaseSerializer(Generic[BuilderType]): # pylint: disable=abstract-
280
296
  template += self._json_input_example_template(builder)
281
297
  return template
282
298
 
283
- def param_description( # pylint: disable=no-self-use
284
- self, builder: BuilderType
285
- ) -> List[str]:
299
+ def param_description(self, builder: BuilderType) -> List[str]:
286
300
  description_list: List[str] = []
287
301
  for param in builder.parameters.method:
288
302
  if not param.in_docstring:
@@ -446,11 +460,11 @@ class RequestBuilderSerializer(
446
460
 
447
461
  def response_docstring(self, builder: RequestBuilderType) -> List[str]:
448
462
  response_str = (
449
- f":return: Returns an :class:`~azure.core.rest.HttpRequest` that you will pass to the client's "
463
+ ":return: Returns an :class:`~azure.core.rest.HttpRequest` that you will pass to the client's "
450
464
  + "`send_request` method. See https://aka.ms/azsdk/dpcodegen/python/send_request for how to "
451
465
  + "incorporate this response into your code flow."
452
466
  )
453
- rtype_str = f":rtype: ~azure.core.rest.HttpRequest"
467
+ rtype_str = ":rtype: ~azure.core.rest.HttpRequest"
454
468
  return [response_str, rtype_str]
455
469
 
456
470
  def pop_kwargs_from_signature(self, builder: RequestBuilderType) -> List[str]:
@@ -618,9 +632,7 @@ class _OperationSerializer(
618
632
  retval.append(_api_version_validation(builder))
619
633
  return retval
620
634
 
621
- def param_description(
622
- self, builder: OperationType
623
- ) -> List[str]: # pylint: disable=no-self-use
635
+ def param_description(self, builder: OperationType) -> List[str]:
624
636
  description_list = super().param_description(builder)
625
637
  if not self.code_model.options["version_tolerant"]:
626
638
  description_list.append(
@@ -689,7 +701,10 @@ class _OperationSerializer(
689
701
  f"'{body_param.type.serialization_type}'{is_xml_cmd}{serialization_ctxt_cmd})"
690
702
  )
691
703
  elif self.code_model.options["models_mode"] == "dpg":
692
- create_body_call = f"_{body_kwarg_name} = json.dumps({body_param.client_name}, cls=AzureJSONEncoder)"
704
+ create_body_call = (
705
+ f"_{body_kwarg_name} = json.dumps({body_param.client_name}, "
706
+ "cls=AzureJSONEncoder) # type: ignore"
707
+ )
693
708
  else:
694
709
  create_body_call = f"_{body_kwarg_name} = {body_param.client_name}"
695
710
  if body_param.optional:
@@ -891,7 +906,7 @@ class _OperationSerializer(
891
906
  retval.append(f" template_url={template_url},")
892
907
  retval.append(" headers=_headers,")
893
908
  retval.append(" params=_params,")
894
- retval.append(f")")
909
+ retval.append(")")
895
910
  return retval
896
911
 
897
912
  def _postprocess_http_request(
@@ -934,6 +949,12 @@ class _OperationSerializer(
934
949
  if builder.parameters.has_body and builder.parameters.body_parameter.flattened:
935
950
  # unflatten before passing to request builder as well
936
951
  retval.extend(_serialize_flattened_body(builder.parameters.body_parameter))
952
+ if (
953
+ builder.parameters.has_body
954
+ and builder.parameters.body_parameter.has_json_model_type
955
+ and any(p.in_flattened_body for p in builder.parameters.parameters)
956
+ ):
957
+ retval.extend(_serialize_json_model_body(builder.parameters.body_parameter))
937
958
  if builder.overloads:
938
959
  # we are only dealing with two overloads. If there are three, we generate an abstract operation
939
960
  retval.extend(self._initialize_overloads(builder, is_paging=is_paging))
@@ -993,10 +1014,10 @@ class _OperationSerializer(
993
1014
  if response.type.is_xml
994
1015
  else "response.json()"
995
1016
  )
996
- retval.append(f"if response.content:")
1017
+ retval.append("if response.content:")
997
1018
  retval.append(f" deserialized = {deserialized_value}")
998
1019
  retval.append("else:")
999
- retval.append(f" deserialized = None")
1020
+ retval.append(" deserialized = None")
1000
1021
  return retval
1001
1022
 
1002
1023
  def handle_error_response(self, builder: OperationType) -> List[str]:
@@ -1304,11 +1325,20 @@ class _PagingOperationSerializer(
1304
1325
  deserialize_type = f'"{response.serialization_type}"'
1305
1326
  pylint_disable = ""
1306
1327
  deserialized = f"self._deserialize(\n {deserialize_type}, pipeline_response{pylint_disable}\n)"
1328
+ retval.append(f" deserialized = {deserialized}")
1307
1329
  elif self.code_model.options["models_mode"] == "dpg":
1308
- deserialized = (
1309
- f"_deserialize({response.serialization_type}, pipeline_response)"
1330
+ pylint_disable = (
1331
+ " # pylint: disable=protected-access\n"
1332
+ if isinstance(response.type, ModelType) and not response.type.is_public
1333
+ else ""
1310
1334
  )
1311
- retval.append(f" deserialized = {deserialized}")
1335
+ deserialized = f"_deserialize({response.serialization_type}{pylint_disable}, pipeline_response)"
1336
+ retval.append(
1337
+ f" deserialized: {response.serialization_type} = ({pylint_disable}"
1338
+ )
1339
+ retval.append(f" {deserialized})")
1340
+ else:
1341
+ retval.append(f" deserialized = {deserialized}")
1312
1342
  item_name = builder.item_name
1313
1343
  list_of_elem = (
1314
1344
  f".{item_name}"
@@ -1453,7 +1483,7 @@ class _LROOperationSerializer(_OperationSerializer[LROOperationType]):
1453
1483
  f" {lro_options_str}",
1454
1484
  f" {path_format_arguments_str}",
1455
1485
  " **kwargs",
1456
- f"))",
1486
+ "))",
1457
1487
  ]
1458
1488
  )
1459
1489
  retval.append(
@@ -1510,7 +1540,7 @@ class _LROOperationSerializer(_OperationSerializer[LROOperationType]):
1510
1540
  " # type: ignore"
1511
1541
  if builder.lro_response
1512
1542
  and builder.lro_response.type
1513
- and not self.code_model.options["models_mode"]
1543
+ and self.code_model.options["models_mode"] != "msrest"
1514
1544
  else "",
1515
1545
  )
1516
1546
  )
@@ -137,7 +137,9 @@ class ClientSerializer:
137
137
  f" = {_get_client_models_value(model_dict_name)}"
138
138
  )
139
139
  if add_private_models and self.client.code_model.model_types:
140
- update_dict = f"{{k: v for k, v in _models.__dict__.items() if isinstance(v, type)}}"
140
+ update_dict = (
141
+ "{k: v for k, v in _models.__dict__.items() if isinstance(v, type)}"
142
+ )
141
143
  retval.append(f"client_models.update({update_dict})")
142
144
  client_models_str = "client_models" if is_msrest_model else ""
143
145
  retval.append(f"self._serialize = Serializer({client_models_str})")
@@ -221,7 +223,7 @@ class ClientSerializer:
221
223
  def _rest_request_example(self, async_mode: bool) -> List[str]:
222
224
  retval = [">>> from azure.core.rest import HttpRequest"]
223
225
  retval.append('>>> request = HttpRequest("GET", "https://www.example.org/")')
224
- retval.append(f"<HttpRequest [GET], url: 'https://www.example.org/'>")
226
+ retval.append("<HttpRequest [GET], url: 'https://www.example.org/'>")
225
227
  retval.extend(self._example_make_call(async_mode))
226
228
  return retval
227
229
 
@@ -236,9 +238,9 @@ class ClientSerializer:
236
238
  retval.append(
237
239
  "For more information on this code flow, see https://aka.ms/azsdk/dpcodegen/python/send_request"
238
240
  )
239
- retval.append(f"")
241
+ retval.append("")
240
242
  retval.append(":param request: The network request you want to make. Required.")
241
- retval.append(f":type request: ~azure.core.rest.HttpRequest")
243
+ retval.append(":type request: ~azure.core.rest.HttpRequest")
242
244
  retval.append(
243
245
  ":keyword bool stream: Whether the response payload will be streamed. Defaults to False."
244
246
  )
@@ -98,7 +98,7 @@ class GeneralSerializer:
98
98
  imports=FileImportSerializer(imports),
99
99
  )
100
100
 
101
- def serialize_vendor_file(self) -> str:
101
+ def serialize_vendor_file(self, clients: List[Client]) -> str:
102
102
  template = self.env.get_template("vendor.py.jinja2")
103
103
 
104
104
  # configure imports
@@ -110,6 +110,10 @@ class GeneralSerializer:
110
110
  ImportType.AZURECORE,
111
111
  )
112
112
 
113
+ if self.code_model.need_format_url and not self.async_mode:
114
+ file_import.add_submodule_import("typing", "List", ImportType.STDLIB)
115
+ file_import.add_submodule_import("typing", "cast", ImportType.STDLIB)
116
+
113
117
  if self.code_model.need_mixin_abc:
114
118
  file_import.add_submodule_import(
115
119
  "abc",
@@ -128,7 +132,7 @@ class GeneralSerializer:
128
132
  MsrestImportType.SerializerDeserializer,
129
133
  TypingSection.TYPING,
130
134
  )
131
- for client in self.code_model.clients:
135
+ for client in clients:
132
136
  file_import.add_submodule_import(
133
137
  "._configuration",
134
138
  f"{client.name}Configuration",
@@ -141,6 +145,7 @@ class GeneralSerializer:
141
145
  file_import,
142
146
  ),
143
147
  async_mode=self.async_mode,
148
+ clients=clients,
144
149
  )
145
150
 
146
151
  def serialize_config_file(self, clients: List[Client]) -> str:
@@ -208,14 +208,19 @@ class DpgModelSerializer(_ModelSerializer):
208
208
  ImportType.LOCAL,
209
209
  TypingSection.REGULAR,
210
210
  )
211
- file_import.add_submodule_import("typing", "overload", ImportType.STDLIB)
212
- file_import.add_submodule_import("typing", "Mapping", ImportType.STDLIB)
213
- file_import.add_submodule_import("typing", "Any", ImportType.STDLIB)
214
211
 
215
212
  for model in self.code_model.model_types:
216
213
  file_import.merge(model.imports(is_operation_file=False))
217
214
  for prop in model.properties:
218
215
  file_import.merge(prop.imports())
216
+ if model.is_polymorphic:
217
+ file_import.add_submodule_import("typing", "Dict", ImportType.STDLIB)
218
+ if model.is_public and self.init_line(model):
219
+ file_import.add_submodule_import(
220
+ "typing", "overload", ImportType.STDLIB
221
+ )
222
+ file_import.add_submodule_import("typing", "Mapping", ImportType.STDLIB)
223
+ file_import.add_submodule_import("typing", "Any", ImportType.STDLIB)
219
224
  return file_import
220
225
 
221
226
  def declare_model(self, model: ModelType) -> str:
@@ -256,9 +261,14 @@ class DpgModelSerializer(_ModelSerializer):
256
261
  args.append(f"default={prop.client_default_value_declaration}")
257
262
 
258
263
  field = "rest_discriminator" if prop.is_discriminator else "rest_field"
264
+ type_ignore = (
265
+ prop.is_discriminator
266
+ and prop.is_discriminator
267
+ and cast(ConstantType, prop.type).value
268
+ )
259
269
  ret = [
260
270
  f"{prop.client_name}: {prop.type_annotation()} ="
261
- f' {field}({", ".join(args)})'
271
+ f' {field}({", ".join(args)}){" # type: ignore" if type_ignore else ""}'
262
272
  ]
263
273
  comment = prop.description(is_operation_file=False).replace('"', '\\"')
264
274
  if comment:
@@ -65,7 +65,7 @@ class SampleSerializer:
65
65
 
66
66
  def _client_params(self) -> Dict[str, Any]:
67
67
  # client params
68
- special_param = dict()
68
+ special_param = {}
69
69
  credential_type = getattr(self.code_model.clients[0].credential, "type", None)
70
70
  if isinstance(credential_type, TokenCredentialType):
71
71
  special_param.update({"credential": "DefaultAzureCredential()"})
@@ -79,14 +79,10 @@ class SampleSerializer:
79
79
  for p in self.code_model.clients[0].parameters.positional
80
80
  if not (p.optional or p.client_default_value)
81
81
  ]
82
- cls = lambda x: f'"{x}"'
83
82
  client_params = {
84
83
  p.client_name: special_param.get(
85
84
  p.client_name,
86
- cls(
87
- self.sample["parameters"].get(p.rest_api_name)
88
- or p.client_name.upper()
89
- ),
85
+ f'"{self.sample["parameters"].get(p.rest_api_name) or p.client_name.upper()}"',
90
86
  )
91
87
  for p in params_positional
92
88
  }
@@ -22,12 +22,27 @@ class {{ client.name }}Configuration(Configuration): # pylint: disable=too-many
22
22
  {% if serializer.set_constants() %}
23
23
  {{ op_tools.serialize(serializer.set_constants()) | indent(8) -}}
24
24
  {% endif %}
25
- {% if client.credential and client.credential.type.policy.credential_scopes is defined %}
26
- self.credential_scopes = kwargs.pop('credential_scopes', {{ client.credential.type.policy.credential_scopes }})
25
+ {% if client.credential %}
26
+ {% set cred_scopes = client.credential.type if client.credential.type.policy is defined and client.credential.type.policy.credential_scopes is defined %}
27
+ {% if not cred_scopes %}
28
+ {% set cred_scopes = client.credential.type.types | selectattr("policy.credential_scopes") | first if client.credential.type.types is defined %}
29
+ {% endif %}
30
+ {% if cred_scopes %}
31
+ self.credential_scopes = kwargs.pop('credential_scopes', {{ cred_scopes.policy.credential_scopes }})
32
+ {% endif %}
27
33
  {% endif %}
28
34
  kwargs.setdefault('sdk_moniker', '{{ client.config.sdk_moniker }}/{}'.format(VERSION))
29
35
  self._configure(**kwargs)
30
36
 
37
+ {% if client.credential and client.credential.type.types is defined %}
38
+ def _infer_policy(self, **kwargs):
39
+ {% for cred_type in client.credential.type.types %}
40
+ if {{ cred_type.instance_check_template.format("self.credential") }}:
41
+ return {{ cred_type.policy.call(async_mode) }}
42
+ {% endfor %}
43
+ raise TypeError(f"Unsupported credential: {self.credential}")
44
+ {% endif %}
45
+
31
46
  def _configure(
32
47
  self,
33
48
  **kwargs: Any
@@ -41,12 +56,16 @@ class {{ client.name }}Configuration(Configuration): # pylint: disable=too-many
41
56
  self.custom_hook_policy = kwargs.get('custom_hook_policy') or policies.CustomHookPolicy(**kwargs)
42
57
  self.redirect_policy = kwargs.get('redirect_policy') or policies.{{ keywords.async_class }}RedirectPolicy(**kwargs)
43
58
  self.authentication_policy = kwargs.get('authentication_policy')
44
- {% if client.credential %}
45
- {# only adding this if credential_scopes is not passed during code generation #}
46
- {% if client.credential.type.policy.credential_scopes is defined and client.credential.type.policy.credential_scopes | length == 0 %}
59
+ {% if client.credential and client.credential.type.policy is defined %}
60
+ {# only adding this if credential_scopes is not passed during code generation #}
61
+ {% if client.credential.type.policy.credential_scopes is defined and client.credential.type.policy.credential_scopes | length == 0 %}
47
62
  if not self.credential_scopes and not self.authentication_policy:
48
63
  raise ValueError("You must provide either credential_scopes or authentication_policy as kwargs")
49
- {% endif %}
64
+ {% endif %}
50
65
  if self.credential and not self.authentication_policy:
51
66
  self.authentication_policy = {{ client.credential.type.policy.call(async_mode) }}
52
67
  {% endif %}
68
+ {% if client.credential and client.credential.type.types is defined %}
69
+ if self.credential and not self.authentication_policy:
70
+ self.authentication_policy = self._infer_policy(**kwargs)
71
+ {% endif %}
@@ -6,8 +6,8 @@ class {{ enum.name }}({{ enum.value_type.type_annotation(is_operation_file=False
6
6
  {% endif %}
7
7
 
8
8
  {% for value in enum.values %}
9
+ {{ value.name }} = {{ enum.value_type.get_declaration(value.value) }}
9
10
  {% if value.description %}
10
- #: {{ value.description | wordwrap(width=95, break_long_words=False, break_on_hyphens=False, wrapstring='\n #: ') }}
11
+ """{{ value.description | wordwrap(width=95, break_long_words=False, break_on_hyphens=False, wrapstring='\n #: ') }}"""
11
12
  {% endif %}
12
- {{ value.name }} = {{ enum.value_type.get_declaration(value.value) }}
13
13
  {% endfor %}
@@ -1,5 +1,7 @@
1
1
  {% import 'operation_tools.jinja2' as op_tools %}
2
2
  {% import 'keywords.jinja2' as keywords %}
3
+ {% set only_path = client.code_model.options["only_path_and_body_params_positional"] %}
4
+ {% set method_location = "keywordOnly" if only_path else "positional" %}
3
5
  {
4
6
  "chosen_version": {{ chosen_version | tojson }},
5
7
  "total_api_version_list": {{ total_api_version_list | tojson }},
@@ -22,7 +24,8 @@
22
24
  "signature": {{ gp.method_signature(async_mode=False) | tojson }},
23
25
  "description": {{ gp.description | tojson }},
24
26
  "docstring_type": {{ gp.docstring_type(async_mode=False) | tojson }},
25
- "required": {{ (not gp.optional) | tojson }}
27
+ "required": {{ (not gp.optional) | tojson }},
28
+ "method_location": {{ gp.method_location | tojson }}
26
29
  }{{ "," if not loop.last else "" }}
27
30
  {% endfor %}
28
31
  },
@@ -48,21 +51,24 @@
48
51
  "signature": "api_version: Optional[str]=None,",
49
52
  "description": "API version to use if no profile is provided, or if missing in profile.",
50
53
  "docstring_type": "str",
51
- "required": false
54
+ "required": false,
55
+ "method_location": {{ method_location | tojson }}
52
56
  },
53
57
  {% if not client.has_parameterized_host %}
54
- "base_url": {
58
+ "{{ "endpoint" if only_path else "base_url" }}": {
55
59
  "signature": {{ client.parameters.host.method_signature(async_mode=False) | tojson }},
56
60
  "description": "Service URL",
57
61
  "docstring_type": "str",
58
- "required": false
62
+ "required": false,
63
+ "method_location": {{ method_location | tojson }}
59
64
  },
60
65
  {% endif %}
61
66
  "profile": {
62
67
  "signature": "profile: KnownProfiles=KnownProfiles.default,",
63
68
  "description": "A profile definition, from KnownProfiles to dict.",
64
69
  "docstring_type": "azure.profiles.KnownProfiles",
65
- "required": false
70
+ "required": false,
71
+ "method_location": {{ method_location | tojson }}
66
72
  }
67
73
  },
68
74
  "async": {
@@ -70,21 +76,24 @@
70
76
  "signature": "api_version: Optional[str] = None,",
71
77
  "description": "API version to use if no profile is provided, or if missing in profile.",
72
78
  "docstring_type": "str",
73
- "required": false
79
+ "required": false,
80
+ "method_location": {{ method_location | tojson }}
74
81
  },
75
82
  {% if not client.has_parameterized_host %}
76
- "base_url": {
83
+ "{{ "endpoint" if only_path else "base_url" }}": {
77
84
  "signature": {{ client.parameters.host.method_signature(async_mode=True) | tojson }},
78
85
  "description": "Service URL",
79
86
  "docstring_type": "str",
80
- "required": false
87
+ "required": false,
88
+ "method_location": {{ method_location | tojson }}
81
89
  },
82
90
  {% endif %}
83
91
  "profile": {
84
92
  "signature": "profile: KnownProfiles = KnownProfiles.default,",
85
93
  "description": "A profile definition, from KnownProfiles to dict.",
86
94
  "docstring_type": "azure.profiles.KnownProfiles",
87
- "required": false
95
+ "required": false,
96
+ "method_location": {{ method_location | tojson }}
88
97
  }
89
98
  }
90
99
  }