@azure-tools/typespec-python 0.33.0 → 0.34.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 (147) hide show
  1. package/dist/scripts/copy-scripts.d.ts +2 -0
  2. package/dist/scripts/copy-scripts.d.ts.map +1 -0
  3. package/dist/scripts/copy-scripts.js +24 -0
  4. package/dist/scripts/copy-scripts.js.map +1 -0
  5. package/dist/src/emitter.d.ts +0 -2
  6. package/dist/src/emitter.d.ts.map +1 -1
  7. package/dist/src/emitter.js +2 -102
  8. package/dist/src/emitter.js.map +1 -1
  9. package/dist/src/index.d.ts +1 -1
  10. package/dist/src/index.d.ts.map +1 -1
  11. package/dist/src/index.js +1 -1
  12. package/dist/src/index.js.map +1 -1
  13. package/package.json +14 -11
  14. package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
  15. package/scripts/copy-scripts.ts +26 -0
  16. package/scripts/eng/pylintrc +2 -1
  17. package/dist/src/code-model.d.ts +0 -4
  18. package/dist/src/code-model.d.ts.map +0 -1
  19. package/dist/src/code-model.js +0 -190
  20. package/dist/src/code-model.js.map +0 -1
  21. package/dist/src/external-process.d.ts +0 -20
  22. package/dist/src/external-process.d.ts.map +0 -1
  23. package/dist/src/external-process.js +0 -44
  24. package/dist/src/external-process.js.map +0 -1
  25. package/dist/src/http.d.ts +0 -7
  26. package/dist/src/http.d.ts.map +0 -1
  27. package/dist/src/http.js +0 -266
  28. package/dist/src/http.js.map +0 -1
  29. package/dist/src/types.d.ts +0 -36
  30. package/dist/src/types.d.ts.map +0 -1
  31. package/dist/src/types.js +0 -489
  32. package/dist/src/types.js.map +0 -1
  33. package/dist/src/utils.d.ts +0 -26
  34. package/dist/src/utils.d.ts.map +0 -1
  35. package/dist/src/utils.js +0 -151
  36. package/dist/src/utils.js.map +0 -1
  37. package/generator/LICENSE +0 -21
  38. package/generator/README.md +0 -1
  39. package/generator/dev_requirements.txt +0 -5
  40. package/generator/pygen/__init__.py +0 -107
  41. package/generator/pygen/_version.py +0 -7
  42. package/generator/pygen/black.py +0 -69
  43. package/generator/pygen/codegen/__init__.py +0 -338
  44. package/generator/pygen/codegen/_utils.py +0 -16
  45. package/generator/pygen/codegen/models/__init__.py +0 -204
  46. package/generator/pygen/codegen/models/base.py +0 -186
  47. package/generator/pygen/codegen/models/base_builder.py +0 -119
  48. package/generator/pygen/codegen/models/client.py +0 -430
  49. package/generator/pygen/codegen/models/code_model.py +0 -237
  50. package/generator/pygen/codegen/models/combined_type.py +0 -149
  51. package/generator/pygen/codegen/models/constant_type.py +0 -129
  52. package/generator/pygen/codegen/models/credential_types.py +0 -214
  53. package/generator/pygen/codegen/models/dictionary_type.py +0 -127
  54. package/generator/pygen/codegen/models/enum_type.py +0 -238
  55. package/generator/pygen/codegen/models/imports.py +0 -291
  56. package/generator/pygen/codegen/models/list_type.py +0 -143
  57. package/generator/pygen/codegen/models/lro_operation.py +0 -142
  58. package/generator/pygen/codegen/models/lro_paging_operation.py +0 -32
  59. package/generator/pygen/codegen/models/model_type.py +0 -362
  60. package/generator/pygen/codegen/models/operation.py +0 -530
  61. package/generator/pygen/codegen/models/operation_group.py +0 -184
  62. package/generator/pygen/codegen/models/paging_operation.py +0 -155
  63. package/generator/pygen/codegen/models/parameter.py +0 -412
  64. package/generator/pygen/codegen/models/parameter_list.py +0 -387
  65. package/generator/pygen/codegen/models/primitive_types.py +0 -659
  66. package/generator/pygen/codegen/models/property.py +0 -171
  67. package/generator/pygen/codegen/models/request_builder.py +0 -189
  68. package/generator/pygen/codegen/models/request_builder_parameter.py +0 -115
  69. package/generator/pygen/codegen/models/response.py +0 -348
  70. package/generator/pygen/codegen/models/utils.py +0 -23
  71. package/generator/pygen/codegen/serializers/__init__.py +0 -574
  72. package/generator/pygen/codegen/serializers/base_serializer.py +0 -21
  73. package/generator/pygen/codegen/serializers/builder_serializer.py +0 -1513
  74. package/generator/pygen/codegen/serializers/client_serializer.py +0 -295
  75. package/generator/pygen/codegen/serializers/enum_serializer.py +0 -15
  76. package/generator/pygen/codegen/serializers/general_serializer.py +0 -213
  77. package/generator/pygen/codegen/serializers/import_serializer.py +0 -127
  78. package/generator/pygen/codegen/serializers/metadata_serializer.py +0 -198
  79. package/generator/pygen/codegen/serializers/model_init_serializer.py +0 -33
  80. package/generator/pygen/codegen/serializers/model_serializer.py +0 -300
  81. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +0 -89
  82. package/generator/pygen/codegen/serializers/operations_init_serializer.py +0 -44
  83. package/generator/pygen/codegen/serializers/parameter_serializer.py +0 -221
  84. package/generator/pygen/codegen/serializers/patch_serializer.py +0 -19
  85. package/generator/pygen/codegen/serializers/request_builders_serializer.py +0 -52
  86. package/generator/pygen/codegen/serializers/sample_serializer.py +0 -168
  87. package/generator/pygen/codegen/serializers/test_serializer.py +0 -293
  88. package/generator/pygen/codegen/serializers/types_serializer.py +0 -31
  89. package/generator/pygen/codegen/serializers/utils.py +0 -68
  90. package/generator/pygen/codegen/templates/client.py.jinja2 +0 -37
  91. package/generator/pygen/codegen/templates/client_container.py.jinja2 +0 -12
  92. package/generator/pygen/codegen/templates/config.py.jinja2 +0 -73
  93. package/generator/pygen/codegen/templates/config_container.py.jinja2 +0 -16
  94. package/generator/pygen/codegen/templates/conftest.py.jinja2 +0 -28
  95. package/generator/pygen/codegen/templates/enum.py.jinja2 +0 -13
  96. package/generator/pygen/codegen/templates/enum_container.py.jinja2 +0 -10
  97. package/generator/pygen/codegen/templates/init.py.jinja2 +0 -24
  98. package/generator/pygen/codegen/templates/keywords.jinja2 +0 -19
  99. package/generator/pygen/codegen/templates/lro_operation.py.jinja2 +0 -16
  100. package/generator/pygen/codegen/templates/lro_paging_operation.py.jinja2 +0 -18
  101. package/generator/pygen/codegen/templates/macros.jinja2 +0 -12
  102. package/generator/pygen/codegen/templates/metadata.json.jinja2 +0 -167
  103. package/generator/pygen/codegen/templates/model_base.py.jinja2 +0 -1158
  104. package/generator/pygen/codegen/templates/model_container.py.jinja2 +0 -13
  105. package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +0 -98
  106. package/generator/pygen/codegen/templates/model_init.py.jinja2 +0 -28
  107. package/generator/pygen/codegen/templates/model_msrest.py.jinja2 +0 -92
  108. package/generator/pygen/codegen/templates/operation.py.jinja2 +0 -21
  109. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +0 -75
  110. package/generator/pygen/codegen/templates/operation_groups_container.py.jinja2 +0 -20
  111. package/generator/pygen/codegen/templates/operation_tools.jinja2 +0 -81
  112. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +0 -17
  113. package/generator/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +0 -6
  114. package/generator/pygen/codegen/templates/packaging_templates/LICENSE.jinja2 +0 -21
  115. package/generator/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +0 -8
  116. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +0 -107
  117. package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +0 -9
  118. package/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +0 -108
  119. package/generator/pygen/codegen/templates/paging_operation.py.jinja2 +0 -21
  120. package/generator/pygen/codegen/templates/patch.py.jinja2 +0 -19
  121. package/generator/pygen/codegen/templates/pkgutil_init.py.jinja2 +0 -1
  122. package/generator/pygen/codegen/templates/request_builder.py.jinja2 +0 -28
  123. package/generator/pygen/codegen/templates/request_builders.py.jinja2 +0 -10
  124. package/generator/pygen/codegen/templates/rest_init.py.jinja2 +0 -12
  125. package/generator/pygen/codegen/templates/sample.py.jinja2 +0 -44
  126. package/generator/pygen/codegen/templates/serialization.py.jinja2 +0 -2115
  127. package/generator/pygen/codegen/templates/test.py.jinja2 +0 -50
  128. package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +0 -26
  129. package/generator/pygen/codegen/templates/types.py.jinja2 +0 -8
  130. package/generator/pygen/codegen/templates/validation.py.jinja2 +0 -38
  131. package/generator/pygen/codegen/templates/vendor.py.jinja2 +0 -96
  132. package/generator/pygen/codegen/templates/version.py.jinja2 +0 -4
  133. package/generator/pygen/m2r.py +0 -65
  134. package/generator/pygen/postprocess/__init__.py +0 -183
  135. package/generator/pygen/postprocess/get_all.py +0 -19
  136. package/generator/pygen/postprocess/venvtools.py +0 -75
  137. package/generator/pygen/preprocess/__init__.py +0 -509
  138. package/generator/pygen/preprocess/helpers.py +0 -27
  139. package/generator/pygen/preprocess/python_mappings.py +0 -224
  140. package/generator/pygen/utils.py +0 -160
  141. package/generator/pygen.egg-info/PKG-INFO +0 -25
  142. package/generator/pygen.egg-info/SOURCES.txt +0 -66
  143. package/generator/pygen.egg-info/dependency_links.txt +0 -1
  144. package/generator/pygen.egg-info/requires.txt +0 -4
  145. package/generator/pygen.egg-info/top_level.txt +0 -1
  146. package/generator/requirements.txt +0 -12
  147. package/generator/setup.py +0 -55
@@ -1,198 +0,0 @@
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 functools
7
- import json
8
- from typing import List, Optional, Set, Tuple, Dict, Union, Any
9
- from jinja2 import Environment
10
- from ..models import (
11
- OperationGroup,
12
- LROOperation,
13
- PagingOperation,
14
- TypingSection,
15
- ImportType,
16
- CodeModel,
17
- )
18
- from .builder_serializer import get_operation_serializer
19
- from .import_serializer import FileImportSerializer
20
-
21
-
22
- def _to_string(data: Union[Tuple[Any], List[Any], str]) -> str:
23
- if isinstance(data, (list, tuple)):
24
- return "".join([_to_string(item) for item in data])
25
- return str(data)
26
-
27
-
28
- def _json_serialize_imports(
29
- imports: Dict[
30
- TypingSection,
31
- Dict[
32
- ImportType,
33
- Dict[
34
- str,
35
- Set[
36
- Optional[
37
- Union[
38
- str,
39
- Tuple[str, str],
40
- Tuple[
41
- str,
42
- Optional[str],
43
- Tuple[Tuple[Tuple[int, int], str, Optional[str]]],
44
- ],
45
- ]
46
- ]
47
- ],
48
- ],
49
- ],
50
- ]
51
- ) -> str:
52
- if not imports:
53
- return ""
54
-
55
- json_serialize_imports = {}
56
- # need to make name_import set -> list to make the dictionary json serializable
57
- # not using an OrderedDict since we're iterating through a set and the order there varies
58
- # going to sort the list instead
59
-
60
- for typing_section_key, typing_section_value in imports.items():
61
- json_import_type_dictionary = {}
62
- for import_type_key, import_type_value in typing_section_value.items():
63
- json_package_name_dictionary = {}
64
- for package_name, name_imports in import_type_value.items():
65
- name_import_ordered_list = []
66
- if name_imports:
67
- name_import_ordered_list = list(name_imports)
68
- name_import_ordered_list.sort(
69
- key=lambda e: (
70
- _to_string(e) # type: ignore
71
- if isinstance(e, (list, tuple))
72
- else e if isinstance(e, str) else ""
73
- )
74
- )
75
- json_package_name_dictionary[package_name] = name_import_ordered_list
76
- json_import_type_dictionary[import_type_key] = json_package_name_dictionary
77
- json_serialize_imports[typing_section_key] = json_import_type_dictionary
78
- return json.dumps(json_serialize_imports)
79
-
80
-
81
- def _mixin_imports(
82
- mixin_operation_group: Optional[OperationGroup],
83
- ) -> Tuple[Optional[str], Optional[str]]:
84
- if not mixin_operation_group:
85
- return None, None
86
-
87
- sync_mixin_imports = mixin_operation_group.imports_for_multiapi(async_mode=False)
88
- async_mixin_imports = mixin_operation_group.imports_for_multiapi(async_mode=True)
89
-
90
- return _json_serialize_imports(sync_mixin_imports.to_dict()), _json_serialize_imports(async_mixin_imports.to_dict())
91
-
92
-
93
- def _mixin_typing_definitions(
94
- mixin_operation_group: Optional[OperationGroup],
95
- ) -> Tuple[Optional[str], Optional[str]]:
96
- if not mixin_operation_group:
97
- return None, None
98
-
99
- sync_mixin_imports = mixin_operation_group.imports_for_multiapi(async_mode=False)
100
- async_mixin_imports = mixin_operation_group.imports_for_multiapi(async_mode=True)
101
- sync_mixin_typing_definitions = FileImportSerializer(sync_mixin_imports, False).get_typing_definitions()
102
- async_mixin_typing_definitions = FileImportSerializer(async_mixin_imports, True).get_typing_definitions()
103
-
104
- return sync_mixin_typing_definitions, async_mixin_typing_definitions
105
-
106
-
107
- class MetadataSerializer:
108
- def __init__(self, code_model: CodeModel, env: Environment) -> None:
109
- self.code_model = code_model
110
- self.client = self.code_model.clients[0] # we only do one client for multiapi
111
- self.env = env
112
-
113
- def _choose_api_version(self) -> Tuple[str, List[str]]:
114
- chosen_version = ""
115
- total_api_version_set: Set[str] = set()
116
- for client in self.code_model.clients:
117
- for operation_group in client.operation_groups:
118
- total_api_version_set.update(operation_group.api_versions)
119
-
120
- total_api_version_list = list(total_api_version_set)
121
- total_api_version_list.sort()
122
-
123
- # switching ' to " so json can decode the dict we end up writing to file
124
- total_api_version_list = [str(api_version).replace("'", '"') for api_version in total_api_version_list]
125
- if len(total_api_version_list) == 1:
126
- chosen_version = total_api_version_list[0]
127
- elif len(total_api_version_list) > 1:
128
- module_version = self.code_model.namespace.split(".")[-1]
129
- for api_version in total_api_version_list:
130
- if "v{}".format(api_version.replace("-", "_")) == module_version:
131
- chosen_version = api_version
132
-
133
- return chosen_version, total_api_version_list
134
-
135
- def serialize(self) -> str:
136
- def _is_lro(operation):
137
- return isinstance(operation, LROOperation)
138
-
139
- def _is_paging(operation):
140
- return isinstance(operation, PagingOperation)
141
-
142
- mixin_operation_group: Optional[OperationGroup] = next(
143
- (
144
- operation_group
145
- for client in self.code_model.clients
146
- for operation_group in client.operation_groups
147
- if operation_group.is_mixin
148
- ),
149
- None,
150
- )
151
- mixin_operations = mixin_operation_group.operations if mixin_operation_group else []
152
- sync_mixin_imports, async_mixin_imports = _mixin_imports(mixin_operation_group)
153
- (
154
- sync_mixin_typing_definitions,
155
- async_mixin_typing_definitions,
156
- ) = _mixin_typing_definitions(mixin_operation_group)
157
-
158
- chosen_version, total_api_version_list = self._choose_api_version()
159
-
160
- # setting to true, because for multiapi we always generate with a version file with version 0.1.0
161
- self.code_model.options["package_version"] = "0.1.0"
162
- template = self.env.get_template("metadata.json.jinja2")
163
-
164
- return template.render(
165
- code_model=self.code_model,
166
- chosen_version=chosen_version,
167
- total_api_version_list=total_api_version_list,
168
- client=self.client,
169
- global_parameters=self.client.parameters,
170
- mixin_operations=mixin_operations,
171
- any=any,
172
- is_lro=_is_lro,
173
- is_paging=_is_paging,
174
- str=str,
175
- sync_mixin_imports=sync_mixin_imports,
176
- async_mixin_imports=async_mixin_imports,
177
- sync_mixin_typing_definitions=sync_mixin_typing_definitions,
178
- async_mixin_typing_definitions=async_mixin_typing_definitions,
179
- sync_client_imports=_json_serialize_imports(self.client.imports_for_multiapi(async_mode=False).to_dict()),
180
- async_client_imports=_json_serialize_imports(self.client.imports_for_multiapi(async_mode=True).to_dict()),
181
- sync_config_imports=_json_serialize_imports(
182
- self.client.config.imports_for_multiapi(async_mode=False).to_dict()
183
- ),
184
- async_config_imports=_json_serialize_imports(
185
- self.client.config.imports_for_multiapi(async_mode=True).to_dict()
186
- ),
187
- get_async_operation_serializer=functools.partial(
188
- get_operation_serializer,
189
- code_model=self.client.code_model,
190
- async_mode=True,
191
- ),
192
- get_sync_operation_serializer=functools.partial(
193
- get_operation_serializer,
194
- code_model=self.client.code_model,
195
- async_mode=False,
196
- ),
197
- has_credential=bool(self.client.credential),
198
- )
@@ -1,33 +0,0 @@
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
- from jinja2 import Environment
7
- from ..models import CodeModel
8
-
9
-
10
- class ModelInitSerializer:
11
- def __init__(self, code_model: CodeModel, env: Environment) -> None:
12
- self.code_model = code_model
13
- self.env = env
14
-
15
- def serialize(self) -> str:
16
- schemas = [s.name for s in self.code_model.public_model_types]
17
- schemas.sort()
18
- enums = [e.name for e in self.code_model.enums if not e.internal] if self.code_model.enums else None
19
-
20
- if enums:
21
- enums.sort()
22
-
23
- # check to see if we have any duplicate names between enum and object schemas
24
- model_enum_name_intersection = set(schemas).intersection(set(enums))
25
- if model_enum_name_intersection:
26
- raise ValueError(
27
- "We have models and enums sharing the following names: {}".format(
28
- ", ".join(model_enum_name_intersection)
29
- )
30
- )
31
-
32
- template = self.env.get_template("model_init.py.jinja2")
33
- return template.render(code_model=self.code_model, schemas=schemas, enums=enums)
@@ -1,300 +0,0 @@
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
- from typing import List
7
- from abc import ABC, abstractmethod
8
-
9
- from ..models import ModelType, Property, ConstantType, EnumValue
10
- from ..models.imports import FileImport, TypingSection, MsrestImportType, ImportType
11
- from .import_serializer import FileImportSerializer
12
- from .base_serializer import BaseSerializer
13
-
14
-
15
- def _documentation_string(prop: Property, description_keyword: str, docstring_type_keyword: str) -> List[str]:
16
- retval: List[str] = []
17
- sphinx_prefix = f":{description_keyword} {prop.client_name}:"
18
- description = prop.description(is_operation_file=False).replace("\\", "\\\\")
19
- retval.append(f"{sphinx_prefix} {description}" if description else sphinx_prefix)
20
- retval.append(f":{docstring_type_keyword} {prop.client_name}: {prop.type.docstring_type()}")
21
- return retval
22
-
23
-
24
- class _ModelSerializer(BaseSerializer, ABC):
25
- @abstractmethod
26
- def imports(self) -> FileImport: ...
27
-
28
- def serialize(self) -> str:
29
- # Generate the models
30
- template = self.env.get_template("model_container.py.jinja2")
31
- return template.render(
32
- code_model=self.code_model,
33
- imports=FileImportSerializer(self.imports()),
34
- str=str,
35
- serializer=self,
36
- )
37
-
38
- @abstractmethod
39
- def declare_model(self, model: ModelType) -> str: ...
40
-
41
- @staticmethod
42
- def escape_dot(s: str):
43
- return s.replace(".", "\\\\.")
44
-
45
- @staticmethod
46
- def input_documentation_string(prop: Property) -> List[str]:
47
- # building the param line of the property doc
48
- return _documentation_string(prop, "keyword", "paramtype")
49
-
50
- @staticmethod
51
- def variable_documentation_string(prop: Property) -> List[str]:
52
- return _documentation_string(prop, "ivar", "vartype")
53
-
54
- def super_call(self, model: ModelType) -> List[str]:
55
- return [f"super().__init__({self.properties_to_pass_to_super(model)})"]
56
-
57
- @staticmethod
58
- def initialize_discriminator_property(model: ModelType, prop: Property) -> str:
59
- discriminator_value = f"'{model.discriminator_value}'" if model.discriminator_value else None
60
- if not discriminator_value:
61
- typing = "Optional[str]"
62
- else:
63
- typing = "str"
64
- return f"self.{prop.client_name}: {typing} = {discriminator_value}"
65
-
66
- @staticmethod
67
- def initialize_standard_property(prop: Property):
68
- if not (prop.optional or prop.client_default_value is not None):
69
- return f"{prop.client_name}: {prop.type_annotation()},{prop.pylint_disable}"
70
- return (
71
- f"{prop.client_name}: {prop.type_annotation()} = "
72
- f"{prop.client_default_value_declaration},{prop.pylint_disable}"
73
- )
74
-
75
- @staticmethod
76
- def discriminator_docstring(model: ModelType) -> str:
77
- return (
78
- "You probably want to use the sub-classes and not this class directly. "
79
- f"Known sub-classes are: {', '.join(v.name for v in model.discriminated_subtypes.values())}"
80
- )
81
-
82
- @staticmethod
83
- def _init_line_parameters(model: ModelType):
84
- return [p for p in model.properties if not p.readonly and not p.is_discriminator and not p.constant]
85
-
86
- def init_line(self, model: ModelType) -> List[str]:
87
- init_properties_declaration = []
88
- init_line_parameters = self._init_line_parameters(model)
89
- init_line_parameters.sort(key=lambda x: x.optional)
90
- if init_line_parameters:
91
- init_properties_declaration.append("*,")
92
- for param in init_line_parameters:
93
- init_properties_declaration.append(self.initialize_standard_property(param))
94
-
95
- return init_properties_declaration
96
-
97
- @staticmethod
98
- def properties_to_pass_to_super(model: ModelType) -> str:
99
- properties_to_pass_to_super = []
100
- for parent in model.parents:
101
- for prop in model.properties:
102
- if prop in parent.properties and not prop.is_discriminator and not prop.constant and not prop.readonly:
103
- properties_to_pass_to_super.append(f"{prop.client_name}={prop.client_name}")
104
- properties_to_pass_to_super.append("**kwargs")
105
- return ", ".join(properties_to_pass_to_super)
106
-
107
-
108
- class MsrestModelSerializer(_ModelSerializer):
109
- def imports(self) -> FileImport:
110
- file_import = FileImport(self.code_model)
111
- file_import.add_msrest_import(
112
- relative_path="..",
113
- msrest_import_type=MsrestImportType.Module,
114
- typing_section=TypingSection.REGULAR,
115
- )
116
- for model in self.code_model.model_types:
117
- file_import.merge(model.imports(is_operation_file=False))
118
- for param in self._init_line_parameters(model):
119
- file_import.merge(param.imports())
120
-
121
- return file_import
122
-
123
- def declare_model(self, model: ModelType) -> str:
124
- basename = (
125
- "msrest.serialization.Model"
126
- if self.code_model.options["client_side_validation"]
127
- else "_serialization.Model"
128
- )
129
- if model.parents:
130
- basename = ", ".join([m.name for m in model.parents])
131
- return f"class {model.name}({basename}):{model.pylint_disable}"
132
-
133
- @staticmethod
134
- def get_properties_to_initialize(model: ModelType) -> List[Property]:
135
- if model.parents:
136
- properties_to_initialize = list(
137
- {
138
- p.client_name: p
139
- for bm in model.parents
140
- for p in model.properties
141
- if p not in bm.properties or p.is_discriminator or p.constant
142
- }.values()
143
- )
144
- else:
145
- properties_to_initialize = model.properties
146
- return properties_to_initialize
147
-
148
- def initialize_properties(self, model: ModelType) -> List[str]:
149
- init_args = []
150
- for prop in self.get_properties_to_initialize(model):
151
- if prop.is_discriminator:
152
- init_args.append(self.initialize_discriminator_property(model, prop))
153
- elif prop.readonly:
154
- init_args.append(f"self.{prop.client_name} = None")
155
- elif not prop.constant:
156
- init_args.append(f"self.{prop.client_name} = {prop.client_name}")
157
- return init_args
158
-
159
- @staticmethod
160
- def declare_property(prop: Property) -> str:
161
- if prop.flattened_names:
162
- attribute_key = ".".join(_ModelSerializer.escape_dot(n) for n in prop.flattened_names)
163
- else:
164
- attribute_key = _ModelSerializer.escape_dot(prop.wire_name)
165
- if prop.type.xml_serialization_ctxt:
166
- xml_metadata = f", 'xml': {{{prop.type.xml_serialization_ctxt}}}"
167
- else:
168
- xml_metadata = ""
169
- return (
170
- f'"{prop.client_name}": {{"key": "{attribute_key}",'
171
- f' "type": "{prop.msrest_deserialization_key}"{xml_metadata}}},'
172
- )
173
-
174
-
175
- class DpgModelSerializer(_ModelSerializer):
176
- def super_call(self, model: ModelType) -> List[str]:
177
- super_call = f"super().__init__({self.properties_to_pass_to_super(model)})"
178
- if model.flattened_property:
179
- return [
180
- "_flattened_input = {k: kwargs.pop(k) for k in kwargs.keys() & self.__flattened_items}",
181
- super_call,
182
- "for k, v in _flattened_input.items():",
183
- " setattr(self, k, v)",
184
- ]
185
- return [super_call]
186
-
187
- def imports(self) -> FileImport:
188
- file_import = FileImport(self.code_model)
189
- file_import.add_submodule_import(
190
- "..",
191
- "_model_base",
192
- ImportType.LOCAL,
193
- TypingSection.REGULAR,
194
- )
195
-
196
- for model in self.code_model.model_types:
197
- if model.base == "json":
198
- continue
199
- file_import.merge(model.imports(is_operation_file=False))
200
- for prop in model.properties:
201
- file_import.merge(prop.imports())
202
- if model.is_polymorphic:
203
- file_import.add_submodule_import("typing", "Dict", ImportType.STDLIB)
204
- if not model.internal and self.init_line(model):
205
- file_import.add_submodule_import("typing", "overload", ImportType.STDLIB)
206
- file_import.add_submodule_import("typing", "Mapping", ImportType.STDLIB)
207
- file_import.add_submodule_import("typing", "Any", ImportType.STDLIB)
208
- return file_import
209
-
210
- def declare_model(self, model: ModelType) -> str:
211
- basename = "_model_base.Model"
212
- if model.parents:
213
- basename = ", ".join([m.name for m in model.parents])
214
- if model.discriminator_value:
215
- basename += f", discriminator='{model.discriminator_value}'"
216
- return f"class {model.name}({basename}):{model.pylint_disable}"
217
-
218
- @staticmethod
219
- def get_properties_to_declare(model: ModelType) -> List[Property]:
220
- if model.parents:
221
- parent_properties = [p for bm in model.parents for p in bm.properties]
222
- properties_to_declare = [
223
- p
224
- for p in model.properties
225
- if not any(
226
- p.client_name == pp.client_name
227
- and p.type_annotation() == pp.type_annotation()
228
- and not p.is_base_discriminator
229
- for pp in parent_properties
230
- )
231
- ]
232
- else:
233
- properties_to_declare = model.properties
234
- if any(p for p in properties_to_declare if p.client_name == "_"):
235
- raise ValueError("We do not generate anonymous properties")
236
- return properties_to_declare
237
-
238
- @staticmethod
239
- def declare_property(prop: Property) -> str:
240
- args = []
241
- if prop.client_name != prop.wire_name or prop.is_discriminator:
242
- args.append(f'name="{prop.wire_name}"')
243
- if prop.visibility:
244
- v_list = ", ".join(f'"{x}"' for x in prop.visibility)
245
- args.append(f"visibility=[{v_list}]")
246
- if prop.client_default_value is not None:
247
- args.append(f"default={prop.client_default_value_declaration}")
248
-
249
- if prop.is_multipart_file_input:
250
- args.append("is_multipart_file_input=True")
251
- elif hasattr(prop.type, "encode") and prop.type.encode: # type: ignore
252
- args.append(f'format="{prop.type.encode}"') # type: ignore
253
-
254
- if prop.xml_metadata:
255
- args.append(f"xml={prop.xml_metadata}")
256
-
257
- field = "rest_discriminator" if prop.is_discriminator else "rest_field"
258
- type_ignore = (
259
- " # type: ignore"
260
- if prop.is_discriminator and isinstance(prop.type, (ConstantType, EnumValue)) and prop.type.value
261
- else ""
262
- )
263
- generated_code = f'{prop.client_name}: {prop.type_annotation()} = {field}({", ".join(args)})'
264
- # there is 4 spaces indentation so original line length limit 120 - 4 = 116
265
- pylint_disable = (
266
- " # pylint: disable=line-too-long"
267
- if len(generated_code) <= 116 < (len(generated_code) + len(type_ignore))
268
- else ""
269
- )
270
- return f"{generated_code}{type_ignore}{pylint_disable}"
271
-
272
- def initialize_properties(self, model: ModelType) -> List[str]:
273
- init_args = []
274
- for prop in self.get_properties_to_declare(model):
275
- if prop.constant and not prop.is_base_discriminator:
276
- init_args.append(f"self.{prop.client_name}: {prop.type_annotation()} = " f"{prop.get_declaration()}")
277
- return init_args
278
-
279
- @staticmethod
280
- def _init_line_parameters(model: ModelType):
281
- return [
282
- p
283
- for p in model.properties
284
- if p.is_base_discriminator or not p.is_discriminator and not p.constant and p.visibility != ["read"]
285
- ]
286
-
287
- @staticmethod
288
- def properties_to_pass_to_super(model: ModelType) -> str:
289
- properties_to_pass_to_super = ["*args"]
290
- for parent in model.parents:
291
- for prop in model.properties:
292
- if (
293
- prop.client_name in [prop.client_name for prop in parent.properties if prop.is_base_discriminator]
294
- and prop.is_discriminator
295
- and not prop.constant
296
- and not prop.readonly
297
- ):
298
- properties_to_pass_to_super.append(f"{prop.client_name}={prop.get_declaration()}")
299
- properties_to_pass_to_super.append("**kwargs")
300
- return ", ".join(properties_to_pass_to_super)
@@ -1,89 +0,0 @@
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
- from typing import Optional, List, Union
7
- import functools
8
- from jinja2 import Environment
9
-
10
- from .utils import get_all_operation_groups_recursively
11
- from ..models import (
12
- CodeModel,
13
- OperationGroup,
14
- RequestBuilder,
15
- OverloadedRequestBuilder,
16
- Client,
17
- FileImport,
18
- )
19
- from .import_serializer import FileImportSerializer
20
- from .builder_serializer import (
21
- get_operation_serializer,
22
- RequestBuilderSerializer,
23
- )
24
- from .base_serializer import BaseSerializer
25
-
26
-
27
- class OperationGroupsSerializer(BaseSerializer):
28
- def __init__(
29
- self,
30
- code_model: CodeModel,
31
- clients: List[Client],
32
- env: Environment,
33
- async_mode: bool,
34
- operation_group: Optional[OperationGroup] = None,
35
- ):
36
- super().__init__(code_model, env)
37
- self.clients = clients
38
- self.async_mode = async_mode
39
- self.operation_group = operation_group
40
-
41
- def _get_request_builders(
42
- self, operation_group: OperationGroup
43
- ) -> List[Union[OverloadedRequestBuilder, RequestBuilder]]:
44
- return [
45
- r
46
- for client in self.clients
47
- for r in client.request_builders
48
- if r.client.name == operation_group.client.name
49
- and r.group_name == operation_group.identify_name
50
- and not r.is_overload
51
- and not r.abstract
52
- and not r.is_lro # lro has already initial builder
53
- ]
54
-
55
- def serialize(self) -> str:
56
- if self.operation_group:
57
- operation_groups = [self.operation_group]
58
- else:
59
- operation_groups = get_all_operation_groups_recursively(self.clients)
60
-
61
- imports = FileImport(self.code_model)
62
- for operation_group in operation_groups:
63
- imports.merge(
64
- operation_group.imports(
65
- async_mode=self.async_mode,
66
- )
67
- )
68
-
69
- template = self.env.get_or_select_template("operation_groups_container.py.jinja2")
70
-
71
- return template.render(
72
- code_model=self.code_model,
73
- operation_groups=operation_groups,
74
- imports=FileImportSerializer(
75
- imports,
76
- async_mode=self.async_mode,
77
- ),
78
- async_mode=self.async_mode,
79
- get_operation_serializer=functools.partial(
80
- get_operation_serializer,
81
- code_model=self.code_model,
82
- async_mode=self.async_mode,
83
- ),
84
- request_builder_serializer=RequestBuilderSerializer(
85
- self.code_model,
86
- async_mode=False,
87
- ),
88
- get_request_builders=self._get_request_builders,
89
- )
@@ -1,44 +0,0 @@
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
- from typing import List
7
- from jinja2 import Environment
8
-
9
- from ..models.operation_group import OperationGroup
10
- from ..models import CodeModel, Client
11
-
12
-
13
- class OperationsInitSerializer:
14
- def __init__(
15
- self,
16
- code_model: CodeModel,
17
- clients: List[Client],
18
- env: Environment,
19
- async_mode: bool,
20
- ) -> None:
21
- self.code_model = code_model
22
- self.clients = clients
23
- self.env = env
24
- self.async_mode = async_mode
25
-
26
- def operation_group_imports(self) -> List[str]:
27
- def _get_filename(operation_group: OperationGroup) -> str:
28
- return "_operations" if self.code_model.options["combine_operation_files"] else operation_group.filename
29
-
30
- return [
31
- f"from .{_get_filename(og)} import {og.class_name}"
32
- for client in self.clients
33
- for og in client.operation_groups
34
- ]
35
-
36
- def serialize(self) -> str:
37
- operation_group_init_template = self.env.get_template("operations_folder_init.py.jinja2")
38
-
39
- return operation_group_init_template.render(
40
- code_model=self.code_model,
41
- async_mode=self.async_mode,
42
- operation_group_imports=self.operation_group_imports,
43
- clients=self.clients,
44
- )