@typespec/http-client-python 0.4.3 → 0.5.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 (139) hide show
  1. package/dist/emitter/emitter.d.ts.map +1 -1
  2. package/dist/emitter/emitter.js +85 -24
  3. package/dist/emitter/emitter.js.map +1 -1
  4. package/dist/emitter/lib.d.ts +1 -0
  5. package/dist/emitter/lib.d.ts.map +1 -1
  6. package/dist/emitter/lib.js +1 -0
  7. package/dist/emitter/lib.js.map +1 -1
  8. package/dist/emitter/run-python3.d.ts +2 -0
  9. package/dist/emitter/run-python3.d.ts.map +1 -0
  10. package/dist/emitter/run-python3.js +19 -0
  11. package/dist/emitter/run-python3.js.map +1 -0
  12. package/dist/emitter/system-requirements.d.ts +17 -0
  13. package/dist/emitter/system-requirements.d.ts.map +1 -0
  14. package/dist/emitter/system-requirements.js +167 -0
  15. package/dist/emitter/system-requirements.js.map +1 -0
  16. package/emitter/src/emitter.ts +88 -23
  17. package/emitter/src/lib.ts +2 -0
  18. package/emitter/src/run-python3.ts +20 -0
  19. package/emitter/src/system-requirements.ts +261 -0
  20. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  21. package/eng/scripts/ci/regenerate.ts +16 -4
  22. package/eng/scripts/setup/__pycache__/venvtools.cpython-38.pyc +0 -0
  23. package/eng/scripts/setup/build.ts +16 -0
  24. package/eng/scripts/setup/build_pygen_wheel.py +40 -0
  25. package/eng/scripts/setup/install.py +9 -3
  26. package/eng/scripts/setup/install.ts +32 -0
  27. package/eng/scripts/setup/prepare.py +3 -1
  28. package/eng/scripts/setup/prepare.ts +11 -0
  29. package/eng/scripts/setup/run-python3.ts +1 -6
  30. package/generator/build/lib/pygen/__init__.py +107 -0
  31. package/generator/build/lib/pygen/_version.py +7 -0
  32. package/generator/build/lib/pygen/black.py +71 -0
  33. package/generator/build/lib/pygen/codegen/__init__.py +357 -0
  34. package/generator/build/lib/pygen/codegen/_utils.py +17 -0
  35. package/generator/build/lib/pygen/codegen/models/__init__.py +204 -0
  36. package/generator/build/lib/pygen/codegen/models/base.py +186 -0
  37. package/generator/build/lib/pygen/codegen/models/base_builder.py +118 -0
  38. package/generator/build/lib/pygen/codegen/models/client.py +435 -0
  39. package/generator/build/lib/pygen/codegen/models/code_model.py +237 -0
  40. package/generator/build/lib/pygen/codegen/models/combined_type.py +149 -0
  41. package/generator/build/lib/pygen/codegen/models/constant_type.py +129 -0
  42. package/generator/build/lib/pygen/codegen/models/credential_types.py +214 -0
  43. package/generator/build/lib/pygen/codegen/models/dictionary_type.py +127 -0
  44. package/generator/build/lib/pygen/codegen/models/enum_type.py +238 -0
  45. package/generator/build/lib/pygen/codegen/models/imports.py +291 -0
  46. package/generator/build/lib/pygen/codegen/models/list_type.py +143 -0
  47. package/generator/build/lib/pygen/codegen/models/lro_operation.py +142 -0
  48. package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +32 -0
  49. package/generator/build/lib/pygen/codegen/models/model_type.py +357 -0
  50. package/generator/build/lib/pygen/codegen/models/operation.py +509 -0
  51. package/generator/build/lib/pygen/codegen/models/operation_group.py +184 -0
  52. package/generator/build/lib/pygen/codegen/models/paging_operation.py +155 -0
  53. package/generator/build/lib/pygen/codegen/models/parameter.py +412 -0
  54. package/generator/build/lib/pygen/codegen/models/parameter_list.py +387 -0
  55. package/generator/build/lib/pygen/codegen/models/primitive_types.py +659 -0
  56. package/generator/build/lib/pygen/codegen/models/property.py +170 -0
  57. package/generator/build/lib/pygen/codegen/models/request_builder.py +189 -0
  58. package/generator/build/lib/pygen/codegen/models/request_builder_parameter.py +115 -0
  59. package/generator/build/lib/pygen/codegen/models/response.py +348 -0
  60. package/generator/build/lib/pygen/codegen/models/utils.py +21 -0
  61. package/generator/build/lib/pygen/codegen/serializers/__init__.py +574 -0
  62. package/generator/build/lib/pygen/codegen/serializers/base_serializer.py +21 -0
  63. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +1533 -0
  64. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +294 -0
  65. package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +15 -0
  66. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +213 -0
  67. package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +126 -0
  68. package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +198 -0
  69. package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +33 -0
  70. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +335 -0
  71. package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +89 -0
  72. package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +44 -0
  73. package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +221 -0
  74. package/generator/build/lib/pygen/codegen/serializers/patch_serializer.py +19 -0
  75. package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +52 -0
  76. package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +168 -0
  77. package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +292 -0
  78. package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +31 -0
  79. package/generator/build/lib/pygen/codegen/serializers/utils.py +68 -0
  80. package/generator/build/lib/pygen/codegen/templates/client.py.jinja2 +37 -0
  81. package/generator/build/lib/pygen/codegen/templates/client_container.py.jinja2 +12 -0
  82. package/generator/build/lib/pygen/codegen/templates/config.py.jinja2 +73 -0
  83. package/generator/build/lib/pygen/codegen/templates/config_container.py.jinja2 +16 -0
  84. package/generator/build/lib/pygen/codegen/templates/conftest.py.jinja2 +28 -0
  85. package/generator/build/lib/pygen/codegen/templates/enum.py.jinja2 +13 -0
  86. package/generator/build/lib/pygen/codegen/templates/enum_container.py.jinja2 +10 -0
  87. package/generator/build/lib/pygen/codegen/templates/init.py.jinja2 +24 -0
  88. package/generator/build/lib/pygen/codegen/templates/keywords.jinja2 +27 -0
  89. package/generator/build/lib/pygen/codegen/templates/lro_operation.py.jinja2 +16 -0
  90. package/generator/build/lib/pygen/codegen/templates/lro_paging_operation.py.jinja2 +18 -0
  91. package/generator/build/lib/pygen/codegen/templates/macros.jinja2 +12 -0
  92. package/generator/build/lib/pygen/codegen/templates/metadata.json.jinja2 +167 -0
  93. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +1174 -0
  94. package/generator/build/lib/pygen/codegen/templates/model_container.py.jinja2 +15 -0
  95. package/generator/build/lib/pygen/codegen/templates/model_dpg.py.jinja2 +97 -0
  96. package/generator/build/lib/pygen/codegen/templates/model_init.py.jinja2 +33 -0
  97. package/generator/build/lib/pygen/codegen/templates/model_msrest.py.jinja2 +92 -0
  98. package/generator/build/lib/pygen/codegen/templates/operation.py.jinja2 +21 -0
  99. package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +75 -0
  100. package/generator/build/lib/pygen/codegen/templates/operation_groups_container.py.jinja2 +19 -0
  101. package/generator/build/lib/pygen/codegen/templates/operation_tools.jinja2 +81 -0
  102. package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +17 -0
  103. package/generator/build/lib/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +6 -0
  104. package/generator/build/lib/pygen/codegen/templates/packaging_templates/LICENSE.jinja2 +21 -0
  105. package/generator/build/lib/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +8 -0
  106. package/generator/build/lib/pygen/codegen/templates/packaging_templates/README.md.jinja2 +107 -0
  107. package/generator/build/lib/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +9 -0
  108. package/generator/build/lib/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +108 -0
  109. package/generator/build/lib/pygen/codegen/templates/paging_operation.py.jinja2 +21 -0
  110. package/generator/build/lib/pygen/codegen/templates/patch.py.jinja2 +19 -0
  111. package/generator/build/lib/pygen/codegen/templates/pkgutil_init.py.jinja2 +1 -0
  112. package/generator/build/lib/pygen/codegen/templates/request_builder.py.jinja2 +28 -0
  113. package/generator/build/lib/pygen/codegen/templates/request_builders.py.jinja2 +10 -0
  114. package/generator/build/lib/pygen/codegen/templates/rest_init.py.jinja2 +12 -0
  115. package/generator/build/lib/pygen/codegen/templates/sample.py.jinja2 +44 -0
  116. package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +2117 -0
  117. package/generator/build/lib/pygen/codegen/templates/test.py.jinja2 +50 -0
  118. package/generator/build/lib/pygen/codegen/templates/testpreparer.py.jinja2 +26 -0
  119. package/generator/build/lib/pygen/codegen/templates/types.py.jinja2 +7 -0
  120. package/generator/build/lib/pygen/codegen/templates/validation.py.jinja2 +38 -0
  121. package/generator/build/lib/pygen/codegen/templates/vendor.py.jinja2 +96 -0
  122. package/generator/build/lib/pygen/codegen/templates/version.py.jinja2 +4 -0
  123. package/generator/build/lib/pygen/m2r.py +65 -0
  124. package/generator/build/lib/pygen/preprocess/__init__.py +515 -0
  125. package/generator/build/lib/pygen/preprocess/helpers.py +27 -0
  126. package/generator/build/lib/pygen/preprocess/python_mappings.py +226 -0
  127. package/generator/build/lib/pygen/utils.py +163 -0
  128. package/generator/component-detection-pip-report.json +134 -0
  129. package/generator/dev_requirements.txt +0 -1
  130. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  131. package/generator/pygen/m2r.py +1 -1
  132. package/generator/pygen.egg-info/PKG-INFO +7 -4
  133. package/generator/pygen.egg-info/requires.txt +7 -4
  134. package/generator/requirements.txt +5 -10
  135. package/generator/setup.py +7 -4
  136. package/generator/test/azure/requirements.txt +2 -0
  137. package/generator/test/generic_mock_api_tests/unittests/test_m2r.py +10 -0
  138. package/generator/test/unbranded/requirements.txt +2 -0
  139. package/package.json +6 -5
@@ -0,0 +1,387 @@
1
+ # -------------------------------------------------------------------------
2
+ # Copyright (c) Microsoft Corporation. All rights reserved.
3
+ # Licensed under the MIT License. See License.txt in the project root for
4
+ # license information.
5
+ # --------------------------------------------------------------------------
6
+ import logging
7
+ from typing import (
8
+ Any,
9
+ Callable,
10
+ Dict,
11
+ List,
12
+ Optional,
13
+ TYPE_CHECKING,
14
+ Union,
15
+ Generic,
16
+ TypeVar,
17
+ cast,
18
+ )
19
+ from abc import abstractmethod
20
+ from collections.abc import MutableSequence
21
+ from enum import Enum
22
+
23
+ from .request_builder_parameter import (
24
+ RequestBuilderBodyParameter,
25
+ RequestBuilderParameter,
26
+ )
27
+ from .parameter import (
28
+ ParameterLocation,
29
+ BodyParameter,
30
+ Parameter,
31
+ ParameterMethodLocation,
32
+ ClientParameter,
33
+ ConfigParameter,
34
+ )
35
+
36
+ ParameterType = TypeVar("ParameterType", bound=Union[Parameter, RequestBuilderParameter])
37
+ BodyParameterType = TypeVar("BodyParameterType", bound=Union[BodyParameter, RequestBuilderBodyParameter])
38
+
39
+ if TYPE_CHECKING:
40
+ from .code_model import CodeModel
41
+
42
+
43
+ class ParameterImplementation(Enum):
44
+ METHOD = "method"
45
+ CLIENT = "client"
46
+
47
+
48
+ _LOGGER = logging.getLogger(__name__)
49
+
50
+
51
+ def method_signature_helper(positional: List[str], keyword_only: Optional[List[str]], kwarg_params: List[str]):
52
+ keyword_only = keyword_only or []
53
+ return positional + keyword_only + kwarg_params
54
+
55
+
56
+ def _sort(params):
57
+ return sorted(params, key=lambda x: not (x.client_default_value or x.optional), reverse=True)
58
+
59
+
60
+ class _ParameterListBase(
61
+ MutableSequence, Generic[ParameterType, BodyParameterType]
62
+ ): # pylint: disable=too-many-public-methods
63
+ """Base class for all of our different ParameterList classes"""
64
+
65
+ def __init__(
66
+ self,
67
+ yaml_data: Dict[str, Any],
68
+ code_model: "CodeModel",
69
+ parameters: List[ParameterType],
70
+ body_parameter: Optional[BodyParameterType] = None,
71
+ ) -> None:
72
+ self.yaml_data = yaml_data
73
+ self.code_model = code_model
74
+ self.parameters = parameters or []
75
+ self._body_parameter = body_parameter
76
+
77
+ # MutableSequence
78
+
79
+ def __getitem__(self, index):
80
+ if isinstance(index, str):
81
+ raise TypeError(f"{index} is invalid type")
82
+ return self.parameters[index]
83
+
84
+ def __len__(self) -> int:
85
+ return len(self.parameters)
86
+
87
+ def __setitem__(self, index, parameter):
88
+ self.parameters[index] = parameter
89
+
90
+ def __delitem__(self, index):
91
+ del self.parameters[index]
92
+
93
+ def insert(self, index: int, value: ParameterType) -> None:
94
+ self.parameters.insert(index, value)
95
+
96
+ # Parameter helpers
97
+
98
+ @staticmethod
99
+ @abstractmethod
100
+ def parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], ParameterType]:
101
+ """Callable for creating parameters"""
102
+
103
+ @staticmethod
104
+ @abstractmethod
105
+ def body_parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], BodyParameterType]:
106
+ """Callable for creating body parameters"""
107
+
108
+ @property
109
+ def grouped(self) -> List[Union[ParameterType, BodyParameterType]]:
110
+ """All parameters that are inside a parameter group"""
111
+ params: List[Union[ParameterType, BodyParameterType]] = [p for p in self.parameters if p.grouped_by]
112
+ if self.has_body and self.body_parameter.grouped_by:
113
+ params.append(self.body_parameter)
114
+ return params
115
+
116
+ @property
117
+ def has_form_data_body(self):
118
+ return self.has_body and self.body_parameter.is_form_data
119
+
120
+ @property
121
+ def has_body(self) -> bool:
122
+ """Whether there is a body parameter in the parameter list"""
123
+ return bool(self._body_parameter)
124
+
125
+ @property
126
+ def path(self) -> List[ParameterType]:
127
+ """All path parameters"""
128
+ return [p for p in self.parameters if p.location in (ParameterLocation.PATH, ParameterLocation.ENDPOINT_PATH)]
129
+
130
+ @property
131
+ def query(self) -> List[ParameterType]:
132
+ """All query parameters"""
133
+ return [p for p in self.parameters if p.location == ParameterLocation.QUERY]
134
+
135
+ @property
136
+ def headers(self) -> List[ParameterType]:
137
+ """All header parameters"""
138
+ return [p for p in self.parameters if p.location == ParameterLocation.HEADER]
139
+
140
+ @property
141
+ def constant(self) -> List[Union[ParameterType, BodyParameterType]]:
142
+ """All constant parameters"""
143
+ return [p for p in self.parameters if p.constant]
144
+
145
+ @property
146
+ def positional(self) -> List[Union[ParameterType, BodyParameterType]]:
147
+ """All positional parameters"""
148
+ return _sort(
149
+ [p for p in self.unsorted_method_params if p.method_location == ParameterMethodLocation.POSITIONAL]
150
+ )
151
+
152
+ @property
153
+ def keyword_only(self) -> List[Union[ParameterType, BodyParameterType]]:
154
+ """All keyword only parameters"""
155
+ return _sort(
156
+ [p for p in self.unsorted_method_params if p.method_location == ParameterMethodLocation.KEYWORD_ONLY]
157
+ )
158
+
159
+ @property
160
+ def kwarg(self) -> List[Union[ParameterType, BodyParameterType]]:
161
+ """All kwargs"""
162
+ return _sort([p for p in self.unsorted_method_params if p.method_location == ParameterMethodLocation.KWARG])
163
+
164
+ @property
165
+ def body_parameter(self) -> BodyParameterType:
166
+ """The body parameter of the parameter list. Will only ever be at most one."""
167
+ if not self._body_parameter:
168
+ raise ValueError("There is no body parameter")
169
+ return self._body_parameter
170
+
171
+ @property
172
+ @abstractmethod
173
+ def implementation(self) -> str:
174
+ """Whether this is a client or a method parameter"""
175
+
176
+ @property
177
+ def unsorted_method_params(self) -> List[Union[ParameterType, BodyParameterType]]:
178
+ """Method params before sorting"""
179
+ method_params: List[Union[ParameterType, BodyParameterType]] = [
180
+ p
181
+ for p in self.parameters
182
+ if p.in_method_signature
183
+ and p.implementation == self.implementation
184
+ and (self.code_model.is_legacy or not p.hide_in_method)
185
+ ]
186
+ if self._body_parameter:
187
+ if self._body_parameter.in_method_signature:
188
+ method_params.append(self._body_parameter)
189
+ try:
190
+ # i am a multipart body parameter
191
+ # Only legacy generates operations with me, so I will follow the legacy rules
192
+ # I will splat out my entries as individual entries
193
+ method_params.extend(self._body_parameter.entries) # type: ignore
194
+ except AttributeError:
195
+ pass
196
+ return method_params
197
+
198
+ @property
199
+ def method(self) -> List[Union[ParameterType, BodyParameterType]]:
200
+ """Sorted method params. First positional, then keyword only, then kwarg"""
201
+ return self.positional + self.keyword_only + self.kwarg
202
+
203
+ def method_signature(self, async_mode: bool) -> List[str]:
204
+ """Method signature for this parameter list."""
205
+ return method_signature_helper(
206
+ positional=self.method_signature_positional(async_mode),
207
+ keyword_only=self.method_signature_keyword_only(async_mode),
208
+ kwarg_params=self.method_signature_kwargs,
209
+ )
210
+
211
+ def method_signature_positional(self, async_mode: bool) -> List[str]:
212
+ """Signature for positional parameters"""
213
+ return [parameter.method_signature(async_mode) for parameter in self.positional]
214
+
215
+ def method_signature_keyword_only(self, async_mode: bool) -> List[str]:
216
+ """Signature for keyword only parameters"""
217
+ result = [
218
+ parameter.method_signature(async_mode)
219
+ for parameter in self.keyword_only
220
+ if not parameter.hide_in_operation_signature
221
+ ]
222
+ return ["*,"] + result if result else []
223
+
224
+ @property
225
+ def method_signature_kwargs(self) -> List[str]:
226
+ """Signature for kwargs"""
227
+ return ["**kwargs: Any"]
228
+
229
+ @property
230
+ def kwargs_to_pop(self) -> List[Union[ParameterType, BodyParameterType]]:
231
+ """Method kwargs we want to pop"""
232
+ # don't want to pop bodies unless it's a constant
233
+ kwargs_to_pop = self.kwarg
234
+ return [k for k in kwargs_to_pop if k.location != ParameterLocation.BODY or k.constant]
235
+
236
+ @property
237
+ def call(self) -> List[str]:
238
+ """How to pass in parameters to call the operation"""
239
+ retval = [p.client_name for p in self.method if p.method_location == ParameterMethodLocation.POSITIONAL]
240
+ retval.extend(
241
+ [
242
+ f"{p.client_name}={p.client_name}"
243
+ for p in self.method
244
+ if p.method_location == ParameterMethodLocation.KEYWORD_ONLY
245
+ ]
246
+ )
247
+ retval.append("**kwargs")
248
+ return retval
249
+
250
+ @classmethod
251
+ def from_yaml(cls, yaml_data: Dict[str, Any], code_model: "CodeModel"):
252
+ parameters = [cls.parameter_creator()(parameter, code_model) for parameter in yaml_data["parameters"]]
253
+ body_parameter = None
254
+ if yaml_data.get("bodyParameter"):
255
+ body_parameter = cls.body_parameter_creator()(yaml_data["bodyParameter"], code_model)
256
+ return cls(
257
+ yaml_data,
258
+ code_model,
259
+ parameters=parameters,
260
+ body_parameter=body_parameter,
261
+ )
262
+
263
+
264
+ class _ParameterList(_ParameterListBase[Parameter, BodyParameter]):
265
+
266
+ @staticmethod
267
+ def parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], Parameter]:
268
+ return Parameter.from_yaml
269
+
270
+ @staticmethod
271
+ def body_parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], BodyParameter]:
272
+ return BodyParameter.from_yaml
273
+
274
+ @property
275
+ def implementation(self) -> str:
276
+ return "Method"
277
+
278
+ @property
279
+ def path(self) -> List[Parameter]:
280
+ return [k for k in super().path if k.location == ParameterLocation.ENDPOINT_PATH]
281
+
282
+
283
+ class ParameterList(_ParameterList):
284
+ """ParameterList is the parameter list for Operation classes"""
285
+
286
+
287
+ class _RequestBuilderParameterList(_ParameterListBase[RequestBuilderParameter, RequestBuilderBodyParameter]):
288
+ """_RequestBuilderParameterList is base parameter list for RequestBuilder classes"""
289
+
290
+ @staticmethod
291
+ def parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], RequestBuilderParameter]:
292
+ return RequestBuilderParameter.from_yaml
293
+
294
+ @staticmethod
295
+ def body_parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], RequestBuilderBodyParameter]:
296
+ return RequestBuilderBodyParameter.from_yaml
297
+
298
+ @property
299
+ def implementation(self) -> str:
300
+ return "Method"
301
+
302
+ @property
303
+ def unsorted_method_params(
304
+ self,
305
+ ) -> List[Union[RequestBuilderParameter, RequestBuilderBodyParameter]]:
306
+ # don't have access to client params in request builder
307
+ retval = [
308
+ p
309
+ for p in super().unsorted_method_params
310
+ if not (p.location == ParameterLocation.BODY and cast(RequestBuilderBodyParameter, p).is_partial_body)
311
+ ]
312
+ retval.extend([p for p in self.parameters if p.implementation == "Client" and p.in_method_signature])
313
+ return retval
314
+
315
+ @property
316
+ def path(self) -> List[RequestBuilderParameter]:
317
+ return [p for p in super().path if p.location != ParameterLocation.ENDPOINT_PATH]
318
+
319
+ @property
320
+ def constant(
321
+ self,
322
+ ) -> List[Union[RequestBuilderParameter, RequestBuilderBodyParameter]]:
323
+ """All constant parameters"""
324
+ return [p for p in super().constant if p.location != ParameterLocation.ENDPOINT_PATH]
325
+
326
+
327
+ class RequestBuilderParameterList(_RequestBuilderParameterList):
328
+ """Parameter list for Request Builder"""
329
+
330
+
331
+ class OverloadedRequestBuilderParameterList(_RequestBuilderParameterList):
332
+ """Parameter list for OverloadedRequestBuilder"""
333
+
334
+
335
+ class _ClientGlobalParameterList(_ParameterListBase[ParameterType, BodyParameter]): # pylint: disable=abstract-method
336
+ """Base parameter list for client and config classes"""
337
+
338
+ @staticmethod
339
+ def body_parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], BodyParameter]:
340
+ return BodyParameter.from_yaml
341
+
342
+ @property
343
+ def implementation(self) -> str:
344
+ return "Client"
345
+
346
+ @property
347
+ def credential(self) -> Optional[ParameterType]:
348
+ try:
349
+ return next(p for p in self.parameters if p.client_name == "credential")
350
+ except StopIteration:
351
+ return None
352
+
353
+ @property
354
+ def path(self) -> List[ParameterType]:
355
+ return [p for p in super().path if p.location == ParameterLocation.ENDPOINT_PATH]
356
+
357
+
358
+ class ClientGlobalParameterList(_ClientGlobalParameterList[ClientParameter]):
359
+ """Parameter list for Client class"""
360
+
361
+ @staticmethod
362
+ def parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], ClientParameter]:
363
+ return ClientParameter.from_yaml
364
+
365
+ @property
366
+ def path(self) -> List[ClientParameter]:
367
+ return [p for p in super().path if not p.is_host]
368
+
369
+ @property
370
+ def host(self) -> Optional[ClientParameter]:
371
+ """Get the host parameter"""
372
+ try:
373
+ return next(p for p in self.parameters if p.is_host)
374
+ except StopIteration:
375
+ return None
376
+
377
+
378
+ class ConfigGlobalParameterList(_ClientGlobalParameterList[ConfigParameter]):
379
+ """Parameter list for config"""
380
+
381
+ @staticmethod
382
+ def parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], ConfigParameter]:
383
+ return ConfigParameter.from_yaml
384
+
385
+ @property
386
+ def implementation(self) -> str:
387
+ return "Client"