@azure-tools/typespec-python 0.24.2 → 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,626 @@
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 datetime
7
+ import decimal
8
+ from typing import Any, Dict, List, Optional, Union, TYPE_CHECKING
9
+
10
+ from .base import BaseType
11
+ from .imports import FileImport, ImportType, TypingSection
12
+
13
+ if TYPE_CHECKING:
14
+ from .code_model import CodeModel
15
+
16
+
17
+ class RawString(object):
18
+ def __init__(self, string: str) -> None:
19
+ self.string = string
20
+
21
+ def __repr__(self) -> str:
22
+ return "r'{}'".format(self.string.replace("'", "\\'"))
23
+
24
+
25
+ class PrimitiveType(BaseType): # pylint: disable=abstract-method
26
+ def description(self, *, is_operation_file: bool) -> str: # pylint: disable=unused-argument
27
+ return ""
28
+
29
+ def type_annotation(self, **kwargs: Any) -> str:
30
+ return self.docstring_type(**kwargs)
31
+
32
+ def docstring_text(self, **kwargs: Any) -> str:
33
+ return self.docstring_type(**kwargs)
34
+
35
+ def get_json_template_representation(
36
+ self,
37
+ *,
38
+ client_default_value_declaration: Optional[str] = None,
39
+ ) -> Any:
40
+ if self.client_default_value is not None:
41
+ client_default_value_declaration = client_default_value_declaration or self.get_declaration(
42
+ self.client_default_value
43
+ )
44
+ return client_default_value_declaration or self.default_template_representation_declaration
45
+
46
+ @property
47
+ def default_template_representation_declaration(self) -> str:
48
+ return self.get_declaration(self.docstring_type())
49
+
50
+
51
+ class BooleanType(PrimitiveType):
52
+ @property
53
+ def serialization_type(self) -> str:
54
+ return "bool"
55
+
56
+ def docstring_type(self, **kwargs: Any) -> str:
57
+ return "bool"
58
+
59
+ @property
60
+ def instance_check_template(self) -> str:
61
+ return "isinstance({}, bool)"
62
+
63
+
64
+ class BinaryType(PrimitiveType):
65
+ def __init__(self, yaml_data: Dict[str, Any], code_model: "CodeModel") -> None:
66
+ super().__init__(yaml_data=yaml_data, code_model=code_model)
67
+ self.type = "IO"
68
+
69
+ @property
70
+ def serialization_type(self) -> str:
71
+ return self.type
72
+
73
+ def docstring_type(self, **kwargs: Any) -> str:
74
+ return f"{self.type}[bytes]"
75
+
76
+ def type_annotation(self, **kwargs: Any) -> str:
77
+ return f"{self.type}[bytes]"
78
+
79
+ def docstring_text(self, **kwargs: Any) -> str:
80
+ return f"{self.type}[bytes]"
81
+
82
+ @property
83
+ def default_template_representation_declaration(self) -> str:
84
+ return self.get_declaration(b"bytes")
85
+
86
+ def imports(self, **kwargs: Any) -> FileImport:
87
+ from .combined_type import CombinedType
88
+ from .operation import OperationBase
89
+
90
+ file_import = FileImport(self.code_model)
91
+ file_import.add_submodule_import("typing", "IO", ImportType.STDLIB)
92
+ operation = kwargs.get("operation")
93
+ if (
94
+ isinstance(operation, OperationBase)
95
+ and operation.parameters.has_body
96
+ and isinstance(operation.parameters.body_parameter.type, CombinedType)
97
+ ):
98
+ file_import.add_submodule_import("io", "IOBase", ImportType.STDLIB)
99
+ return file_import
100
+
101
+ @property
102
+ def instance_check_template(self) -> str:
103
+ return "isinstance({}, (IOBase, bytes))"
104
+
105
+
106
+ class BinaryIteratorType(PrimitiveType):
107
+ def _iterator_name(self, **kwargs: Any) -> str:
108
+ return "AsyncIterator" if kwargs.pop("async_mode") else "Iterator"
109
+
110
+ @property
111
+ def serialization_type(self) -> str:
112
+ return "IO"
113
+
114
+ def docstring_type(self, **kwargs: Any) -> str:
115
+ return f"{self._iterator_name(**kwargs)}[bytes]"
116
+
117
+ def type_annotation(self, **kwargs: Any) -> str:
118
+ return f"{self._iterator_name(**kwargs)}[bytes]"
119
+
120
+ def docstring_text(self, **kwargs: Any) -> str:
121
+ return f"{self._iterator_name(**kwargs)}[bytes]"
122
+
123
+ @property
124
+ def default_template_representation_declaration(self) -> str:
125
+ return self.get_declaration(b"bytes")
126
+
127
+ def imports(self, **kwargs: Any) -> FileImport:
128
+ file_import = FileImport(self.code_model)
129
+ file_import.add_submodule_import("typing", self._iterator_name(**kwargs), ImportType.STDLIB)
130
+ return file_import
131
+
132
+ @property
133
+ def instance_check_template(self) -> str:
134
+ return "getattr({}, '__aiter__', None) is not None or getattr({}, '__iter__', None) is not None"
135
+
136
+
137
+ class AnyType(PrimitiveType):
138
+ @property
139
+ def serialization_type(self) -> str:
140
+ return "object"
141
+
142
+ def docstring_type(self, **kwargs: Any) -> str:
143
+ return "any"
144
+
145
+ def type_annotation(self, **kwargs: Any) -> str:
146
+ return "Any"
147
+
148
+ @property
149
+ def default_template_representation_declaration(self) -> str:
150
+ return self.get_declaration({})
151
+
152
+ def imports(self, **kwargs: Any) -> FileImport:
153
+ file_import = FileImport(self.code_model)
154
+ file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL)
155
+ return file_import
156
+
157
+ @property
158
+ def instance_check_template(self) -> str:
159
+ raise ValueError("Shouldn't do instance check on an anytype, it can be anything")
160
+
161
+
162
+ class AnyObjectType(PrimitiveType):
163
+ @property
164
+ def serialization_type(self) -> str:
165
+ return "object"
166
+
167
+ def docstring_type(self, **kwargs: Any) -> str:
168
+ return "JSON"
169
+
170
+ def type_annotation(self, **kwargs: Any) -> str:
171
+ return "JSON"
172
+
173
+ @property
174
+ def default_template_representation_declaration(self) -> str:
175
+ return self.get_declaration({})
176
+
177
+ @property
178
+ def instance_check_template(self) -> str:
179
+ return "isinstance({}, MutableMapping)"
180
+
181
+ def imports(self, **kwargs: Any) -> FileImport:
182
+ file_import = FileImport(self.code_model)
183
+ file_import.define_mutable_mapping_type()
184
+ return file_import
185
+
186
+ @property
187
+ def type_description(self) -> str:
188
+ return "JSON"
189
+
190
+
191
+ class NumberType(PrimitiveType): # pylint: disable=abstract-method
192
+ def __init__(self, yaml_data: Dict[str, Any], code_model: "CodeModel") -> None:
193
+ super().__init__(yaml_data=yaml_data, code_model=code_model)
194
+ self.precision: Optional[int] = yaml_data.get("precision")
195
+ self.multiple: Optional[int] = yaml_data.get("multipleOf")
196
+ self.maximum: Optional[int] = yaml_data.get("maximum")
197
+ self.minimum: Optional[int] = yaml_data.get("minimum")
198
+ self.exclusive_maximum: Optional[int] = yaml_data.get("exclusiveMaximum")
199
+ self.exclusive_minimum: Optional[int] = yaml_data.get("exclusiveMinimum")
200
+
201
+ @property
202
+ def serialization_constraints(self) -> List[str]:
203
+ validation_constraints = [
204
+ (f"maximum_ex={self.maximum}" if self.maximum is not None and self.exclusive_maximum else None),
205
+ (f"maximum={self.maximum}" if self.maximum is not None and not self.exclusive_maximum else None),
206
+ (f"minimum_ex={self.minimum}" if self.minimum is not None and self.exclusive_minimum else None),
207
+ (f"minimum={self.minimum}" if self.minimum is not None and not self.exclusive_minimum else None),
208
+ f"multiple={self.multiple}" if self.multiple else None,
209
+ ]
210
+ return [x for x in validation_constraints if x is not None]
211
+
212
+ @property
213
+ def validation(self) -> Optional[Dict[str, Union[bool, int, str]]]:
214
+ validation: Dict[str, Union[bool, int, str]] = {}
215
+ if self.maximum is not None:
216
+ if self.exclusive_maximum:
217
+ validation["maximum_ex"] = self.maximum
218
+ else:
219
+ validation["maximum"] = self.maximum
220
+ if self.minimum is not None:
221
+ if self.exclusive_minimum:
222
+ validation["minimum_ex"] = self.minimum
223
+ else:
224
+ validation["minimum"] = self.minimum
225
+ if self.multiple:
226
+ validation["multiple"] = self.multiple
227
+ return validation or None
228
+
229
+ @property
230
+ def default_template_representation_declaration(self) -> str:
231
+ default_value = 0 if self.docstring_type() == "int" else 0.0
232
+ return self.get_declaration(default_value)
233
+
234
+
235
+ class IntegerType(NumberType):
236
+ @property
237
+ def serialization_type(self) -> str:
238
+ return "int"
239
+
240
+ def docstring_type(self, **kwargs: Any) -> str:
241
+ return "int"
242
+
243
+ def type_annotation(self, **kwargs: Any) -> str:
244
+ return "int"
245
+
246
+ @property
247
+ def default_template_representation_declaration(self) -> str:
248
+ return self.get_declaration(0)
249
+
250
+ @property
251
+ def instance_check_template(self) -> str:
252
+ return "isinstance({}, int)"
253
+
254
+
255
+ class FloatType(NumberType):
256
+ @property
257
+ def serialization_type(self) -> str:
258
+ return "float"
259
+
260
+ def docstring_type(self, **kwargs: Any) -> str:
261
+ return "float"
262
+
263
+ def type_annotation(self, **kwargs: Any) -> str:
264
+ return "float"
265
+
266
+ @property
267
+ def default_template_representation_declaration(self) -> str:
268
+ return self.get_declaration(0.0)
269
+
270
+ @property
271
+ def instance_check_template(self) -> str:
272
+ return "isinstance({}, float)"
273
+
274
+
275
+ class DecimalType(NumberType):
276
+ @property
277
+ def serialization_type(self) -> str:
278
+ return "decimal"
279
+
280
+ def docstring_type(self, **kwargs: Any) -> str:
281
+ return "~" + self.type_annotation()
282
+
283
+ def type_annotation(self, **kwargs: Any) -> str:
284
+ return "decimal.Decimal"
285
+
286
+ def docstring_text(self, **kwargs: Any) -> str:
287
+ return self.type_annotation()
288
+
289
+ def get_declaration(self, value: decimal.Decimal) -> str:
290
+ return str(value)
291
+
292
+ def imports(self, **kwargs: Any) -> FileImport:
293
+ file_import = FileImport(self.code_model)
294
+ file_import.add_import("decimal", ImportType.STDLIB)
295
+ return file_import
296
+
297
+ @property
298
+ def default_template_representation_declaration(self) -> str:
299
+ return self.get_declaration(decimal.Decimal("0.0"))
300
+
301
+ @property
302
+ def instance_check_template(self) -> str:
303
+ return "isinstance({}, decimal.Decimal)"
304
+
305
+
306
+ class StringType(PrimitiveType):
307
+ def __init__(self, yaml_data: Dict[str, Any], code_model: "CodeModel") -> None:
308
+ super().__init__(yaml_data=yaml_data, code_model=code_model)
309
+ self.max_length: Optional[int] = yaml_data.get("maxLength")
310
+ self.min_length: Optional[int] = (
311
+ yaml_data.get("minLength", 0) if yaml_data.get("maxLength") else yaml_data.get("minLength")
312
+ )
313
+ self.pattern: Optional[str] = yaml_data.get("pattern")
314
+
315
+ @property
316
+ def serialization_constraints(self) -> List[str]:
317
+ validation_constraints = [
318
+ f"max_length={self.max_length}" if self.max_length is not None else None,
319
+ f"min_length={self.min_length}" if self.min_length is not None else None,
320
+ f"pattern={RawString(self.pattern)}" if self.pattern else None,
321
+ ]
322
+ return [x for x in validation_constraints if x is not None]
323
+
324
+ @property
325
+ def validation(self) -> Optional[Dict[str, Union[bool, int, str]]]:
326
+ validation: Dict[str, Union[bool, int, str]] = {}
327
+ if self.max_length is not None:
328
+ validation["max_length"] = self.max_length
329
+ if self.min_length is not None:
330
+ validation["min_length"] = self.min_length
331
+ if self.pattern:
332
+ # https://github.com/Azure/autorest.python/issues/407
333
+ validation["pattern"] = RawString(self.pattern) # type: ignore
334
+ return validation or None
335
+
336
+ def get_declaration(self, value) -> str:
337
+ return f'"{value}"'
338
+
339
+ @property
340
+ def serialization_type(self) -> str:
341
+ return "str"
342
+
343
+ def docstring_type(self, **kwargs: Any) -> str:
344
+ return "str"
345
+
346
+ @property
347
+ def instance_check_template(self) -> str:
348
+ return "isinstance({}, str)"
349
+
350
+
351
+ class DatetimeType(PrimitiveType):
352
+ def __init__(self, yaml_data: Dict[str, Any], code_model: "CodeModel") -> None:
353
+ super().__init__(yaml_data=yaml_data, code_model=code_model)
354
+ self.encode = (
355
+ "rfc3339"
356
+ if yaml_data.get("encode", "date-time") == "date-time" or yaml_data.get("encode", "date-time") == "rfc3339"
357
+ else "rfc7231"
358
+ )
359
+
360
+ @property
361
+ def serialization_type(self) -> str:
362
+ formats_to_attribute_type = {
363
+ "rfc3339": "iso-8601",
364
+ "rfc7231": "rfc-1123",
365
+ }
366
+ return formats_to_attribute_type[self.encode]
367
+
368
+ def docstring_type(self, **kwargs: Any) -> str:
369
+ return "~" + self.type_annotation()
370
+
371
+ def type_annotation(self, **kwargs: Any) -> str:
372
+ return "datetime.datetime"
373
+
374
+ def docstring_text(self, **kwargs: Any) -> str:
375
+ return "datetime"
376
+
377
+ def get_declaration(self, value: datetime.datetime) -> str:
378
+ """Could be discussed, since technically I should return a datetime object,
379
+ but msrest will do fine.
380
+ """
381
+ return f'"{value}"'
382
+
383
+ def imports(self, **kwargs: Any) -> FileImport:
384
+ file_import = FileImport(self.code_model)
385
+ file_import.add_import("datetime", ImportType.STDLIB)
386
+ return file_import
387
+
388
+ @property
389
+ def default_template_representation_declaration(self):
390
+ return self.get_declaration(datetime.datetime(2020, 2, 20))
391
+
392
+ @property
393
+ def instance_check_template(self) -> str:
394
+ return "isinstance({}, datetime.datetime)"
395
+
396
+ def imports_for_sample(self) -> FileImport:
397
+ file_import = super().imports_for_sample()
398
+ file_import.add_import("isodate", ImportType.STDLIB)
399
+ return file_import
400
+
401
+ @staticmethod
402
+ def serialize_sample_value(value: Any) -> str:
403
+ return f"isodate.parse_datetime({repr(value)})"
404
+
405
+
406
+ class TimeType(PrimitiveType):
407
+ @property
408
+ def serialization_type(self) -> str:
409
+ return "time"
410
+
411
+ def docstring_type(self, **kwargs: Any) -> str:
412
+ return "~" + self.type_annotation()
413
+
414
+ def type_annotation(self, **kwargs: Any) -> str:
415
+ return "datetime.time"
416
+
417
+ def docstring_text(self, **kwargs: Any) -> str:
418
+ return "time"
419
+
420
+ def get_declaration(self, value: datetime.time) -> str:
421
+ """Could be discussed, since technically I should return a time object,
422
+ but msrest will do fine.
423
+ """
424
+ return f'"{value}"'
425
+
426
+ def imports(self, **kwargs: Any) -> FileImport:
427
+ file_import = FileImport(self.code_model)
428
+ file_import.add_import("datetime", ImportType.STDLIB)
429
+ return file_import
430
+
431
+ @property
432
+ def default_template_representation_declaration(self) -> str:
433
+ return self.get_declaration(datetime.time(12, 30, 0))
434
+
435
+ @property
436
+ def instance_check_template(self) -> str:
437
+ return "isinstance({}, datetime.time)"
438
+
439
+ def imports_for_sample(self) -> FileImport:
440
+ file_import = super().imports_for_sample()
441
+ file_import.add_import("isodate", ImportType.STDLIB)
442
+ return file_import
443
+
444
+ @staticmethod
445
+ def serialize_sample_value(value: Any) -> str:
446
+ return f"isodate.parse_time({repr(value)})"
447
+
448
+
449
+ class UnixTimeType(PrimitiveType):
450
+ @property
451
+ def encode(self) -> str:
452
+ return "unix-timestamp"
453
+
454
+ @property
455
+ def serialization_type(self) -> str:
456
+ return "unix-time"
457
+
458
+ def docstring_type(self, **kwargs: Any) -> str:
459
+ return "~" + self.type_annotation()
460
+
461
+ def type_annotation(self, **kwargs: Any) -> str:
462
+ return "datetime.datetime"
463
+
464
+ def docstring_text(self, **kwargs: Any) -> str:
465
+ return "datetime"
466
+
467
+ def get_declaration(self, value: datetime.datetime) -> str:
468
+ """Could be discussed, since technically I should return a datetime object,
469
+ but msrest will do fine.
470
+ """
471
+ return f'"{value}"'
472
+
473
+ def imports(self, **kwargs: Any) -> FileImport:
474
+ file_import = FileImport(self.code_model)
475
+ file_import.add_import("datetime", ImportType.STDLIB)
476
+ return file_import
477
+
478
+ @property
479
+ def default_template_representation_declaration(self) -> str:
480
+ return self.get_declaration(datetime.datetime(2020, 2, 20))
481
+
482
+ @property
483
+ def instance_check_template(self) -> str:
484
+ return "isinstance({}, datetime.time)"
485
+
486
+ def imports_for_sample(self) -> FileImport:
487
+ file_import = super().imports_for_sample()
488
+ file_import.add_import("datetime", ImportType.STDLIB)
489
+ return file_import
490
+
491
+ @staticmethod
492
+ def serialize_sample_value(value: Any) -> str:
493
+ return f"datetime.datetime.fromtimestamp({repr(value)}, datetime.timezone.utc)"
494
+
495
+
496
+ class DateType(PrimitiveType):
497
+ @property
498
+ def serialization_type(self) -> str:
499
+ return "date"
500
+
501
+ def docstring_type(self, **kwargs: Any) -> str:
502
+ return "~" + self.type_annotation()
503
+
504
+ def type_annotation(self, **kwargs: Any) -> str:
505
+ return "datetime.date"
506
+
507
+ def docstring_text(self, **kwargs: Any) -> str:
508
+ return "date"
509
+
510
+ def get_declaration(self, value: datetime.date) -> str:
511
+ """Could be discussed, since technically I should return a datetime object,
512
+ but msrest will do fine.
513
+ """
514
+ return f'"{value}"'
515
+
516
+ def imports(self, **kwargs: Any) -> FileImport:
517
+ file_import = FileImport(self.code_model)
518
+ file_import.add_import("datetime", ImportType.STDLIB)
519
+ return file_import
520
+
521
+ @property
522
+ def default_template_representation_declaration(self) -> str:
523
+ return self.get_declaration(datetime.date(2020, 2, 20))
524
+
525
+ @property
526
+ def instance_check_template(self) -> str:
527
+ return "isinstance({}, datetime.date)"
528
+
529
+ def imports_for_sample(self) -> FileImport:
530
+ file_import = super().imports_for_sample()
531
+ file_import.add_import("isodate", ImportType.STDLIB)
532
+ return file_import
533
+
534
+ @staticmethod
535
+ def serialize_sample_value(value: Any) -> str:
536
+ return f"isodate.parse_date({repr(value)})"
537
+
538
+
539
+ class DurationType(PrimitiveType):
540
+ @property
541
+ def serialization_type(self) -> str:
542
+ return "duration"
543
+
544
+ def docstring_type(self, **kwargs: Any) -> str:
545
+ return "~" + self.type_annotation()
546
+
547
+ def type_annotation(self, **kwargs: Any) -> str:
548
+ return "datetime.timedelta"
549
+
550
+ def docstring_text(self, **kwargs: Any) -> str:
551
+ return "timedelta"
552
+
553
+ def get_declaration(self, value: datetime.timedelta) -> str:
554
+ """Could be discussed, since technically I should return a datetime object,
555
+ but msrest will do fine.
556
+ """
557
+ return f'"{value}"'
558
+
559
+ def imports(self, **kwargs: Any) -> FileImport:
560
+ file_import = FileImport(self.code_model)
561
+ file_import.add_import("datetime", ImportType.STDLIB)
562
+ return file_import
563
+
564
+ @property
565
+ def default_template_representation_declaration(self) -> str:
566
+ return self.get_declaration(datetime.timedelta(1))
567
+
568
+ @property
569
+ def instance_check_template(self) -> str:
570
+ return "isinstance({}, datetime.timedelta)"
571
+
572
+ def imports_for_sample(self) -> FileImport:
573
+ file_import = super().imports_for_sample()
574
+ file_import.add_import("isodate", ImportType.STDLIB)
575
+ return file_import
576
+
577
+ @staticmethod
578
+ def serialize_sample_value(value: Any) -> str:
579
+ return f"isodate.parse_duration({repr(value)})"
580
+
581
+
582
+ class ByteArraySchema(PrimitiveType):
583
+ def __init__(self, yaml_data: Dict[str, Any], code_model: "CodeModel") -> None:
584
+ super().__init__(yaml_data=yaml_data, code_model=code_model)
585
+ self.encode = yaml_data.get("encode", "base64")
586
+
587
+ @property
588
+ def serialization_type(self) -> str:
589
+ if self.encode == "base64url":
590
+ return "base64"
591
+ return "bytearray"
592
+
593
+ def docstring_type(self, **kwargs: Any) -> str:
594
+ return "bytes"
595
+
596
+ def get_declaration(self, value: str) -> str:
597
+ return f'bytes("{value}", encoding="utf-8")'
598
+
599
+ @property
600
+ def instance_check_template(self) -> str:
601
+ return "isinstance({}, bytes)"
602
+
603
+
604
+ class SdkCoreType(PrimitiveType):
605
+ def __init__(self, yaml_data: Dict[str, Any], code_model: "CodeModel") -> None:
606
+ super().__init__(yaml_data=yaml_data, code_model=code_model)
607
+ self.name = yaml_data.get("name", "")
608
+
609
+ def docstring_type(self, **kwargs: Any) -> str:
610
+ return f"~{self.code_model.core_library}.{self.type_annotation(**kwargs)}"
611
+
612
+ def type_annotation(self, **kwargs: Any) -> str:
613
+ return self.name
614
+
615
+ def imports(self, **kwargs: Any) -> FileImport:
616
+ file_import = super().imports(**kwargs)
617
+ file_import.add_submodule_import("", self.name, ImportType.SDKCORE)
618
+ return file_import
619
+
620
+ @property
621
+ def instance_check_template(self) -> str:
622
+ return f"isinstance({{}}, {self.name})"
623
+
624
+ @property
625
+ def serialization_type(self) -> str:
626
+ return self.name