@azure-tools/typespec-python 0.24.3 → 0.25.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 (132) hide show
  1. package/dist/src/code-model.d.ts.map +1 -1
  2. package/dist/src/code-model.js +1 -4
  3. package/dist/src/code-model.js.map +1 -1
  4. package/dist/src/emitter.d.ts.map +1 -1
  5. package/dist/src/emitter.js +5 -4
  6. package/dist/src/emitter.js.map +1 -1
  7. package/dist/src/external-process.d.ts +0 -9
  8. package/dist/src/external-process.d.ts.map +1 -1
  9. package/dist/src/external-process.js +1 -25
  10. package/dist/src/external-process.js.map +1 -1
  11. package/dist/src/types.d.ts.map +1 -1
  12. package/dist/src/types.js +2 -0
  13. package/dist/src/types.js.map +1 -1
  14. package/generator/LICENSE +21 -0
  15. package/generator/README.md +1 -0
  16. package/generator/dev_requirements.txt +5 -0
  17. package/generator/pygen/__init__.py +107 -0
  18. package/generator/pygen/_version.py +7 -0
  19. package/generator/pygen/black.py +71 -0
  20. package/generator/pygen/codegen/__init__.py +334 -0
  21. package/generator/pygen/codegen/_utils.py +16 -0
  22. package/generator/pygen/codegen/models/__init__.py +202 -0
  23. package/generator/pygen/codegen/models/base.py +186 -0
  24. package/generator/pygen/codegen/models/base_builder.py +119 -0
  25. package/generator/pygen/codegen/models/client.py +429 -0
  26. package/generator/pygen/codegen/models/code_model.py +239 -0
  27. package/generator/pygen/codegen/models/combined_type.py +149 -0
  28. package/generator/pygen/codegen/models/constant_type.py +129 -0
  29. package/generator/pygen/codegen/models/credential_types.py +221 -0
  30. package/generator/pygen/codegen/models/dictionary_type.py +127 -0
  31. package/generator/pygen/codegen/models/enum_type.py +238 -0
  32. package/generator/pygen/codegen/models/imports.py +291 -0
  33. package/generator/pygen/codegen/models/list_type.py +143 -0
  34. package/generator/pygen/codegen/models/lro_operation.py +143 -0
  35. package/generator/pygen/codegen/models/lro_paging_operation.py +32 -0
  36. package/generator/pygen/codegen/models/model_type.py +361 -0
  37. package/generator/pygen/codegen/models/operation.py +518 -0
  38. package/generator/pygen/codegen/models/operation_group.py +184 -0
  39. package/generator/pygen/codegen/models/paging_operation.py +156 -0
  40. package/generator/pygen/codegen/models/parameter.py +402 -0
  41. package/generator/pygen/codegen/models/parameter_list.py +390 -0
  42. package/generator/pygen/codegen/models/primitive_types.py +626 -0
  43. package/generator/pygen/codegen/models/property.py +175 -0
  44. package/generator/pygen/codegen/models/request_builder.py +189 -0
  45. package/generator/pygen/codegen/models/request_builder_parameter.py +115 -0
  46. package/generator/pygen/codegen/models/response.py +348 -0
  47. package/generator/pygen/codegen/models/utils.py +23 -0
  48. package/generator/pygen/codegen/serializers/__init__.py +570 -0
  49. package/generator/pygen/codegen/serializers/base_serializer.py +21 -0
  50. package/generator/pygen/codegen/serializers/builder_serializer.py +1454 -0
  51. package/generator/pygen/codegen/serializers/client_serializer.py +295 -0
  52. package/generator/pygen/codegen/serializers/enum_serializer.py +15 -0
  53. package/generator/pygen/codegen/serializers/general_serializer.py +212 -0
  54. package/generator/pygen/codegen/serializers/import_serializer.py +127 -0
  55. package/generator/pygen/codegen/serializers/metadata_serializer.py +198 -0
  56. package/generator/pygen/codegen/serializers/model_init_serializer.py +33 -0
  57. package/generator/pygen/codegen/serializers/model_serializer.py +287 -0
  58. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +89 -0
  59. package/generator/pygen/codegen/serializers/operations_init_serializer.py +44 -0
  60. package/generator/pygen/codegen/serializers/parameter_serializer.py +221 -0
  61. package/generator/pygen/codegen/serializers/patch_serializer.py +19 -0
  62. package/generator/pygen/codegen/serializers/request_builders_serializer.py +52 -0
  63. package/generator/pygen/codegen/serializers/sample_serializer.py +163 -0
  64. package/generator/pygen/codegen/serializers/test_serializer.py +287 -0
  65. package/generator/pygen/codegen/serializers/types_serializer.py +31 -0
  66. package/generator/pygen/codegen/serializers/utils.py +68 -0
  67. package/generator/pygen/codegen/templates/client.py.jinja2 +37 -0
  68. package/generator/pygen/codegen/templates/client_container.py.jinja2 +12 -0
  69. package/generator/pygen/codegen/templates/config.py.jinja2 +73 -0
  70. package/generator/pygen/codegen/templates/config_container.py.jinja2 +16 -0
  71. package/generator/pygen/codegen/templates/conftest.py.jinja2 +28 -0
  72. package/generator/pygen/codegen/templates/enum.py.jinja2 +13 -0
  73. package/generator/pygen/codegen/templates/enum_container.py.jinja2 +10 -0
  74. package/generator/pygen/codegen/templates/init.py.jinja2 +24 -0
  75. package/generator/pygen/codegen/templates/keywords.jinja2 +19 -0
  76. package/generator/pygen/codegen/templates/lro_operation.py.jinja2 +16 -0
  77. package/generator/pygen/codegen/templates/lro_paging_operation.py.jinja2 +18 -0
  78. package/generator/pygen/codegen/templates/macros.jinja2 +12 -0
  79. package/generator/pygen/codegen/templates/metadata.json.jinja2 +167 -0
  80. package/generator/pygen/codegen/templates/model_base.py.jinja2 +899 -0
  81. package/generator/pygen/codegen/templates/model_container.py.jinja2 +13 -0
  82. package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +92 -0
  83. package/generator/pygen/codegen/templates/model_init.py.jinja2 +28 -0
  84. package/generator/pygen/codegen/templates/model_msrest.py.jinja2 +92 -0
  85. package/generator/pygen/codegen/templates/operation.py.jinja2 +21 -0
  86. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +75 -0
  87. package/generator/pygen/codegen/templates/operation_groups_container.py.jinja2 +20 -0
  88. package/generator/pygen/codegen/templates/operation_tools.jinja2 +74 -0
  89. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +17 -0
  90. package/generator/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +6 -0
  91. package/generator/pygen/codegen/templates/packaging_templates/LICENSE.jinja2 +21 -0
  92. package/generator/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +8 -0
  93. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +107 -0
  94. package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +9 -0
  95. package/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +108 -0
  96. package/generator/pygen/codegen/templates/paging_operation.py.jinja2 +21 -0
  97. package/generator/pygen/codegen/templates/patch.py.jinja2 +19 -0
  98. package/generator/pygen/codegen/templates/pkgutil_init.py.jinja2 +1 -0
  99. package/generator/pygen/codegen/templates/request_builder.py.jinja2 +28 -0
  100. package/generator/pygen/codegen/templates/request_builders.py.jinja2 +10 -0
  101. package/generator/pygen/codegen/templates/rest_init.py.jinja2 +12 -0
  102. package/generator/pygen/codegen/templates/sample.py.jinja2 +44 -0
  103. package/generator/pygen/codegen/templates/serialization.py.jinja2 +2006 -0
  104. package/generator/pygen/codegen/templates/test.py.jinja2 +50 -0
  105. package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +26 -0
  106. package/generator/pygen/codegen/templates/types.py.jinja2 +8 -0
  107. package/generator/pygen/codegen/templates/validation.py.jinja2 +38 -0
  108. package/generator/pygen/codegen/templates/vendor.py.jinja2 +98 -0
  109. package/generator/pygen/codegen/templates/version.py.jinja2 +4 -0
  110. package/generator/pygen/m2r.py +65 -0
  111. package/generator/pygen/postprocess/__init__.py +183 -0
  112. package/generator/pygen/postprocess/get_all.py +19 -0
  113. package/generator/pygen/postprocess/venvtools.py +77 -0
  114. package/generator/pygen/preprocess/__init__.py +503 -0
  115. package/generator/pygen/preprocess/helpers.py +27 -0
  116. package/generator/pygen/preprocess/python_mappings.py +222 -0
  117. package/generator/pygen/utils.py +149 -0
  118. package/generator/pygen.egg-info/PKG-INFO +25 -0
  119. package/generator/pygen.egg-info/SOURCES.txt +66 -0
  120. package/generator/pygen.egg-info/dependency_links.txt +1 -0
  121. package/generator/pygen.egg-info/requires.txt +4 -0
  122. package/generator/pygen.egg-info/top_level.txt +1 -0
  123. package/generator/requirements.txt +12 -0
  124. package/generator/setup.py +55 -0
  125. package/package.json +10 -7
  126. package/scripts/__pycache__/venvtools.cpython-38.pyc +0 -0
  127. package/scripts/install.py +49 -0
  128. package/scripts/prepare.py +38 -0
  129. package/scripts/run-python3.cjs +22 -0
  130. package/scripts/run_tsp.py +40 -0
  131. package/scripts/system-requirements.cjs +180 -0
  132. package/scripts/venvtools.py +81 -0
@@ -0,0 +1,390 @@
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]): # pylint: disable=unsubscriptable-object
265
+ """Base Parameter class for the two operation ParameterLists"""
266
+
267
+ @staticmethod
268
+ def parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], Parameter]:
269
+ return Parameter.from_yaml
270
+
271
+ @staticmethod
272
+ def body_parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], BodyParameter]:
273
+ return BodyParameter.from_yaml
274
+
275
+ @property
276
+ def implementation(self) -> str:
277
+ return "Method"
278
+
279
+ @property
280
+ def path(self) -> List[Parameter]:
281
+ return [k for k in super().path if k.location == ParameterLocation.ENDPOINT_PATH]
282
+
283
+
284
+ class ParameterList(_ParameterList):
285
+ """ParameterList is the parameter list for Operation classes"""
286
+
287
+
288
+ class _RequestBuilderParameterList(
289
+ _ParameterListBase[RequestBuilderParameter, RequestBuilderBodyParameter] # pylint: disable=unsubscriptable-object
290
+ ):
291
+ """_RequestBuilderParameterList is base parameter list for RequestBuilder classes"""
292
+
293
+ @staticmethod
294
+ def parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], RequestBuilderParameter]:
295
+ return RequestBuilderParameter.from_yaml
296
+
297
+ @staticmethod
298
+ def body_parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], RequestBuilderBodyParameter]:
299
+ return RequestBuilderBodyParameter.from_yaml
300
+
301
+ @property
302
+ def implementation(self) -> str:
303
+ return "Method"
304
+
305
+ @property
306
+ def unsorted_method_params(
307
+ self,
308
+ ) -> List[Union[RequestBuilderParameter, RequestBuilderBodyParameter]]:
309
+ # don't have access to client params in request builder
310
+ retval = [
311
+ p
312
+ for p in super().unsorted_method_params
313
+ if not (p.location == ParameterLocation.BODY and cast(RequestBuilderBodyParameter, p).is_partial_body)
314
+ ]
315
+ retval.extend([p for p in self.parameters if p.implementation == "Client" and p.in_method_signature])
316
+ return retval
317
+
318
+ @property
319
+ def path(self) -> List[RequestBuilderParameter]:
320
+ return [p for p in super().path if p.location != ParameterLocation.ENDPOINT_PATH]
321
+
322
+ @property
323
+ def constant(
324
+ self,
325
+ ) -> List[Union[RequestBuilderParameter, RequestBuilderBodyParameter]]:
326
+ """All constant parameters"""
327
+ return [p for p in super().constant if p.location != ParameterLocation.ENDPOINT_PATH]
328
+
329
+
330
+ class RequestBuilderParameterList(_RequestBuilderParameterList):
331
+ """Parameter list for Request Builder"""
332
+
333
+
334
+ class OverloadedRequestBuilderParameterList(_RequestBuilderParameterList):
335
+ """Parameter list for OverloadedRequestBuilder"""
336
+
337
+
338
+ class _ClientGlobalParameterList(_ParameterListBase[ParameterType, BodyParameter]): # pylint: disable=abstract-method
339
+ """Base parameter list for client and config classes"""
340
+
341
+ @staticmethod
342
+ def body_parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], BodyParameter]:
343
+ return BodyParameter.from_yaml
344
+
345
+ @property
346
+ def implementation(self) -> str:
347
+ return "Client"
348
+
349
+ @property
350
+ def credential(self) -> Optional[ParameterType]:
351
+ try:
352
+ return next(p for p in self.parameters if p.client_name == "credential")
353
+ except StopIteration:
354
+ return None
355
+
356
+ @property
357
+ def path(self) -> List[ParameterType]:
358
+ return [p for p in super().path if p.location == ParameterLocation.ENDPOINT_PATH]
359
+
360
+
361
+ class ClientGlobalParameterList(_ClientGlobalParameterList[ClientParameter]):
362
+ """Parameter list for Client class"""
363
+
364
+ @staticmethod
365
+ def parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], ClientParameter]:
366
+ return ClientParameter.from_yaml
367
+
368
+ @property
369
+ def path(self) -> List[ClientParameter]:
370
+ return [p for p in super().path if not p.is_host]
371
+
372
+ @property
373
+ def host(self) -> Optional[ClientParameter]:
374
+ """Get the host parameter"""
375
+ try:
376
+ return next(p for p in self.parameters if p.is_host)
377
+ except StopIteration:
378
+ return None
379
+
380
+
381
+ class ConfigGlobalParameterList(_ClientGlobalParameterList[ConfigParameter]):
382
+ """Parameter list for config"""
383
+
384
+ @staticmethod
385
+ def parameter_creator() -> Callable[[Dict[str, Any], "CodeModel"], ConfigParameter]:
386
+ return ConfigParameter.from_yaml
387
+
388
+ @property
389
+ def implementation(self) -> str:
390
+ return "Client"