@typespec/http-client-python 0.5.1 → 0.6.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.
- package/dist/emitter/code-model.d.ts.map +1 -1
- package/dist/emitter/code-model.js +10 -7
- package/dist/emitter/code-model.js.map +1 -1
- package/dist/emitter/emitter.d.ts.map +1 -1
- package/dist/emitter/emitter.js +4 -1
- package/dist/emitter/emitter.js.map +1 -1
- package/dist/emitter/lib.d.ts +1 -0
- package/dist/emitter/lib.d.ts.map +1 -1
- package/dist/emitter/lib.js +1 -0
- package/dist/emitter/lib.js.map +1 -1
- package/dist/emitter/types.d.ts.map +1 -1
- package/dist/emitter/types.js +7 -4
- package/dist/emitter/types.js.map +1 -1
- package/dist/emitter/utils.d.ts +1 -0
- package/dist/emitter/utils.d.ts.map +1 -1
- package/dist/emitter/utils.js +19 -0
- package/dist/emitter/utils.js.map +1 -1
- package/emitter/src/code-model.ts +16 -6
- package/emitter/src/emitter.ts +4 -1
- package/emitter/src/lib.ts +4 -0
- package/emitter/src/types.ts +16 -4
- package/emitter/src/utils.ts +27 -0
- package/emitter/temp/tsconfig.tsbuildinfo +1 -1
- package/eng/scripts/ci/regenerate.ts +7 -0
- package/eng/scripts/setup/__pycache__/venvtools.cpython-38.pyc +0 -0
- package/generator/build/lib/pygen/black.py +2 -2
- package/generator/build/lib/pygen/codegen/__init__.py +2 -0
- package/generator/build/lib/pygen/codegen/_utils.py +4 -0
- package/generator/build/lib/pygen/codegen/models/base.py +2 -3
- package/generator/build/lib/pygen/codegen/models/base_builder.py +5 -3
- package/generator/build/lib/pygen/codegen/models/client.py +28 -19
- package/generator/build/lib/pygen/codegen/models/code_model.py +200 -33
- package/generator/build/lib/pygen/codegen/models/combined_type.py +8 -5
- package/generator/build/lib/pygen/codegen/models/constant_type.py +2 -3
- package/generator/build/lib/pygen/codegen/models/credential_types.py +1 -2
- package/generator/build/lib/pygen/codegen/models/dictionary_type.py +2 -3
- package/generator/build/lib/pygen/codegen/models/enum_type.py +47 -24
- package/generator/build/lib/pygen/codegen/models/imports.py +14 -12
- package/generator/build/lib/pygen/codegen/models/list_type.py +2 -3
- package/generator/build/lib/pygen/codegen/models/lro_operation.py +8 -4
- package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +2 -2
- package/generator/build/lib/pygen/codegen/models/model_type.py +34 -19
- package/generator/build/lib/pygen/codegen/models/operation.py +66 -29
- package/generator/build/lib/pygen/codegen/models/operation_group.py +56 -11
- package/generator/build/lib/pygen/codegen/models/paging_operation.py +9 -6
- package/generator/build/lib/pygen/codegen/models/parameter.py +10 -10
- package/generator/build/lib/pygen/codegen/models/parameter_list.py +7 -7
- package/generator/build/lib/pygen/codegen/models/primitive_types.py +23 -43
- package/generator/build/lib/pygen/codegen/models/property.py +7 -7
- package/generator/build/lib/pygen/codegen/models/request_builder.py +9 -15
- package/generator/build/lib/pygen/codegen/models/response.py +6 -8
- package/generator/build/lib/pygen/codegen/models/utils.py +11 -0
- package/generator/build/lib/pygen/codegen/serializers/__init__.py +201 -242
- package/generator/build/lib/pygen/codegen/serializers/base_serializer.py +19 -1
- package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +53 -35
- package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +9 -5
- package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +17 -3
- package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +26 -14
- package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +26 -8
- package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +9 -4
- package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +62 -22
- package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +19 -16
- package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +5 -10
- package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +10 -7
- package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +10 -1
- package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +7 -10
- package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +24 -28
- package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +6 -1
- package/generator/build/lib/pygen/codegen/serializers/utils.py +1 -15
- package/generator/build/lib/pygen/codegen/templates/client_container.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/config_container.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/enum_container.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/init.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/model_container.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -4
- package/generator/build/lib/pygen/codegen/templates/test.py.jinja2 +3 -3
- package/generator/build/lib/pygen/codegen/templates/testpreparer.py.jinja2 +2 -2
- package/generator/build/lib/pygen/codegen/templates/vendor.py.jinja2 +4 -4
- package/generator/build/lib/pygen/preprocess/__init__.py +0 -4
- package/generator/dev_requirements.txt +2 -2
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/black.py +2 -2
- package/generator/pygen/codegen/__init__.py +2 -0
- package/generator/pygen/codegen/_utils.py +4 -0
- package/generator/pygen/codegen/models/base.py +2 -3
- package/generator/pygen/codegen/models/base_builder.py +5 -3
- package/generator/pygen/codegen/models/client.py +28 -19
- package/generator/pygen/codegen/models/code_model.py +200 -33
- package/generator/pygen/codegen/models/combined_type.py +8 -5
- package/generator/pygen/codegen/models/constant_type.py +2 -3
- package/generator/pygen/codegen/models/credential_types.py +1 -2
- package/generator/pygen/codegen/models/dictionary_type.py +2 -3
- package/generator/pygen/codegen/models/enum_type.py +47 -24
- package/generator/pygen/codegen/models/imports.py +14 -12
- package/generator/pygen/codegen/models/list_type.py +2 -3
- package/generator/pygen/codegen/models/lro_operation.py +8 -4
- package/generator/pygen/codegen/models/lro_paging_operation.py +2 -2
- package/generator/pygen/codegen/models/model_type.py +34 -19
- package/generator/pygen/codegen/models/operation.py +66 -29
- package/generator/pygen/codegen/models/operation_group.py +56 -11
- package/generator/pygen/codegen/models/paging_operation.py +9 -6
- package/generator/pygen/codegen/models/parameter.py +10 -10
- package/generator/pygen/codegen/models/parameter_list.py +7 -7
- package/generator/pygen/codegen/models/primitive_types.py +23 -43
- package/generator/pygen/codegen/models/property.py +7 -7
- package/generator/pygen/codegen/models/request_builder.py +9 -15
- package/generator/pygen/codegen/models/response.py +6 -8
- package/generator/pygen/codegen/models/utils.py +11 -0
- package/generator/pygen/codegen/serializers/__init__.py +201 -242
- package/generator/pygen/codegen/serializers/base_serializer.py +19 -1
- package/generator/pygen/codegen/serializers/builder_serializer.py +53 -35
- package/generator/pygen/codegen/serializers/client_serializer.py +9 -5
- package/generator/pygen/codegen/serializers/enum_serializer.py +17 -3
- package/generator/pygen/codegen/serializers/general_serializer.py +26 -14
- package/generator/pygen/codegen/serializers/metadata_serializer.py +26 -8
- package/generator/pygen/codegen/serializers/model_init_serializer.py +9 -4
- package/generator/pygen/codegen/serializers/model_serializer.py +62 -22
- package/generator/pygen/codegen/serializers/operation_groups_serializer.py +19 -16
- package/generator/pygen/codegen/serializers/operations_init_serializer.py +5 -10
- package/generator/pygen/codegen/serializers/parameter_serializer.py +10 -7
- package/generator/pygen/codegen/serializers/request_builders_serializer.py +10 -1
- package/generator/pygen/codegen/serializers/sample_serializer.py +7 -10
- package/generator/pygen/codegen/serializers/test_serializer.py +24 -28
- package/generator/pygen/codegen/serializers/types_serializer.py +6 -1
- package/generator/pygen/codegen/serializers/utils.py +1 -15
- package/generator/pygen/codegen/templates/client_container.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/config_container.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/enum_container.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/init.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/model_container.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -4
- package/generator/pygen/codegen/templates/test.py.jinja2 +3 -3
- package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +2 -2
- package/generator/pygen/codegen/templates/vendor.py.jinja2 +4 -4
- package/generator/pygen/preprocess/__init__.py +0 -4
- package/generator/test/azure/mock_api_tests/asynctests/test_client_namespace_async.py +31 -0
- package/generator/test/azure/mock_api_tests/test_client_namespace.py +29 -0
- package/generator/test/azure/mock_api_tests/test_resiliency_srv_driven_async.py +1 -0
- package/generator/test/azure/requirements.txt +3 -2
- package/generator/test/azure/tox.ini +2 -2
- package/generator/test/unbranded/requirements.txt +2 -2
- package/generator/test/unbranded/tox.ini +2 -2
- package/package.json +1 -1
|
@@ -10,7 +10,7 @@ from .utils import OrderedSet
|
|
|
10
10
|
from .base import BaseModel
|
|
11
11
|
from .operation import get_operation
|
|
12
12
|
from .imports import FileImport, ImportType, TypingSection
|
|
13
|
-
from .utils import add_to_pylint_disable
|
|
13
|
+
from .utils import add_to_pylint_disable, NamespaceType
|
|
14
14
|
from .lro_operation import LROOperation
|
|
15
15
|
from .lro_paging_operation import LROPagingOperation
|
|
16
16
|
from ...utils import NAME_LENGTH_LIMIT
|
|
@@ -46,6 +46,10 @@ class OperationGroup(BaseModel):
|
|
|
46
46
|
for op_group in self.yaml_data.get("operationGroups", [])
|
|
47
47
|
]
|
|
48
48
|
self.link_lro_initial_operations()
|
|
49
|
+
self.client_namespace: str = self.yaml_data.get("clientNamespace", code_model.namespace)
|
|
50
|
+
self.has_parent_operation_group: bool = False
|
|
51
|
+
for og in self.operation_groups:
|
|
52
|
+
og.has_parent_operation_group = True
|
|
49
53
|
|
|
50
54
|
@property
|
|
51
55
|
def has_abstract_operations(self) -> bool:
|
|
@@ -66,11 +70,11 @@ class OperationGroup(BaseModel):
|
|
|
66
70
|
base_classes.append(f"{self.client.name}MixinABC")
|
|
67
71
|
return ", ".join(base_classes)
|
|
68
72
|
|
|
69
|
-
def imports_for_multiapi(self, async_mode: bool) -> FileImport:
|
|
73
|
+
def imports_for_multiapi(self, async_mode: bool, **kwargs) -> FileImport:
|
|
70
74
|
file_import = FileImport(self.code_model)
|
|
71
75
|
relative_path = ".." if async_mode else "."
|
|
72
76
|
for operation in self.operations:
|
|
73
|
-
file_import.merge(operation.imports_for_multiapi(async_mode,
|
|
77
|
+
file_import.merge(operation.imports_for_multiapi(async_mode, **kwargs))
|
|
74
78
|
if (self.code_model.model_types or self.code_model.enums) and self.code_model.options[
|
|
75
79
|
"models_mode"
|
|
76
80
|
] == "msrest":
|
|
@@ -94,30 +98,71 @@ class OperationGroup(BaseModel):
|
|
|
94
98
|
"""Whether any of its operations need validation"""
|
|
95
99
|
return any(o for o in self.operations if o.need_validation)
|
|
96
100
|
|
|
97
|
-
def imports(self, async_mode: bool) -> FileImport:
|
|
101
|
+
def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
|
|
98
102
|
file_import = FileImport(self.code_model)
|
|
99
103
|
|
|
100
|
-
|
|
104
|
+
serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace)
|
|
101
105
|
for operation in self.operations:
|
|
102
|
-
file_import.merge(operation.imports(async_mode,
|
|
106
|
+
file_import.merge(operation.imports(async_mode, **kwargs))
|
|
103
107
|
if not self.code_model.options["combine_operation_files"]:
|
|
104
108
|
for og in self.operation_groups:
|
|
105
109
|
file_import.add_submodule_import(
|
|
106
|
-
|
|
110
|
+
self.code_model.get_relative_import_path(
|
|
111
|
+
serialize_namespace,
|
|
112
|
+
self.code_model.get_imported_namespace_for_operation(self.client_namespace, async_mode),
|
|
113
|
+
),
|
|
107
114
|
og.class_name,
|
|
108
115
|
ImportType.LOCAL,
|
|
109
116
|
)
|
|
117
|
+
else:
|
|
118
|
+
for og in self.operation_groups:
|
|
119
|
+
namespace = self.code_model.get_serialize_namespace(
|
|
120
|
+
og.client_namespace, async_mode, NamespaceType.OPERATION
|
|
121
|
+
)
|
|
122
|
+
if namespace != serialize_namespace:
|
|
123
|
+
file_import.add_submodule_import(
|
|
124
|
+
self.code_model.get_relative_import_path(
|
|
125
|
+
serialize_namespace,
|
|
126
|
+
self.code_model.get_imported_namespace_for_operation(og.client_namespace, async_mode),
|
|
127
|
+
)
|
|
128
|
+
+ f".{og.filename}",
|
|
129
|
+
og.class_name,
|
|
130
|
+
ImportType.LOCAL,
|
|
131
|
+
)
|
|
110
132
|
# for multiapi
|
|
111
133
|
if (
|
|
112
134
|
(self.code_model.public_model_types)
|
|
113
135
|
and self.code_model.options["models_mode"] == "msrest"
|
|
114
136
|
and not self.is_mixin
|
|
115
137
|
):
|
|
116
|
-
file_import.add_submodule_import(
|
|
138
|
+
file_import.add_submodule_import(
|
|
139
|
+
self.code_model.get_relative_import_path(serialize_namespace),
|
|
140
|
+
"models",
|
|
141
|
+
ImportType.LOCAL,
|
|
142
|
+
alias="_models",
|
|
143
|
+
)
|
|
117
144
|
if self.is_mixin:
|
|
118
|
-
file_import.add_submodule_import(
|
|
145
|
+
file_import.add_submodule_import(
|
|
146
|
+
# XxxMixinABC is always defined in _vendor of client namespace
|
|
147
|
+
self.code_model.get_relative_import_path(
|
|
148
|
+
serialize_namespace,
|
|
149
|
+
self.code_model.get_imported_namespace_for_client(self.client.client_namespace, async_mode),
|
|
150
|
+
module_name="_vendor",
|
|
151
|
+
),
|
|
152
|
+
f"{self.client.name}MixinABC",
|
|
153
|
+
ImportType.LOCAL,
|
|
154
|
+
)
|
|
119
155
|
if self.has_abstract_operations:
|
|
120
|
-
file_import.add_submodule_import(
|
|
156
|
+
file_import.add_submodule_import(
|
|
157
|
+
# raise_if_not_implemented is always defined in _vendor of top namespace
|
|
158
|
+
self.code_model.get_relative_import_path(
|
|
159
|
+
serialize_namespace,
|
|
160
|
+
self.code_model.get_imported_namespace_for_client(self.code_model.namespace, async_mode),
|
|
161
|
+
module_name="_vendor",
|
|
162
|
+
),
|
|
163
|
+
"raise_if_not_implemented",
|
|
164
|
+
ImportType.LOCAL,
|
|
165
|
+
)
|
|
121
166
|
if all(o.abstract for o in self.operations):
|
|
122
167
|
return file_import
|
|
123
168
|
file_import.add_submodule_import("typing", "TypeVar", ImportType.STDLIB, TypingSection.CONDITIONAL)
|
|
@@ -128,7 +173,7 @@ class OperationGroup(BaseModel):
|
|
|
128
173
|
|
|
129
174
|
@property
|
|
130
175
|
def filename(self) -> str:
|
|
131
|
-
return self.operations[0].filename
|
|
176
|
+
return self.operations[0].filename if self.operations else "_operations"
|
|
132
177
|
|
|
133
178
|
@property
|
|
134
179
|
def is_mixin(self) -> bool:
|
|
@@ -103,8 +103,8 @@ class PagingOperationBase(OperationBase[PagingResponseType]):
|
|
|
103
103
|
def operation_type(self) -> str:
|
|
104
104
|
return "paging"
|
|
105
105
|
|
|
106
|
-
def cls_type_annotation(self, *, async_mode: bool) -> str:
|
|
107
|
-
return f"ClsType[{Response.type_annotation(self.responses[0], async_mode=async_mode)}]"
|
|
106
|
+
def cls_type_annotation(self, *, async_mode: bool, **kwargs: Any) -> str:
|
|
107
|
+
return f"ClsType[{Response.type_annotation(self.responses[0], async_mode=async_mode, **kwargs)}]"
|
|
108
108
|
|
|
109
109
|
def _imports_shared(self, async_mode: bool, **kwargs: Any) -> FileImport:
|
|
110
110
|
file_import = super()._imports_shared(async_mode, **kwargs)
|
|
@@ -117,7 +117,7 @@ class PagingOperationBase(OperationBase[PagingResponseType]):
|
|
|
117
117
|
and self.code_model.options["builders_visibility"] == "embedded"
|
|
118
118
|
and not async_mode
|
|
119
119
|
):
|
|
120
|
-
file_import.merge(self.next_request_builder.imports())
|
|
120
|
+
file_import.merge(self.next_request_builder.imports(**kwargs))
|
|
121
121
|
return file_import
|
|
122
122
|
|
|
123
123
|
@property
|
|
@@ -129,6 +129,7 @@ class PagingOperationBase(OperationBase[PagingResponseType]):
|
|
|
129
129
|
return FileImport(self.code_model)
|
|
130
130
|
file_import = self._imports_shared(async_mode, **kwargs)
|
|
131
131
|
file_import.merge(super().imports(async_mode, **kwargs))
|
|
132
|
+
serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace)
|
|
132
133
|
if self.code_model.options["tracing"] and self.want_tracing:
|
|
133
134
|
file_import.add_submodule_import(
|
|
134
135
|
"azure.core.tracing.decorator",
|
|
@@ -136,7 +137,9 @@ class PagingOperationBase(OperationBase[PagingResponseType]):
|
|
|
136
137
|
ImportType.SDKCORE,
|
|
137
138
|
)
|
|
138
139
|
if self.next_request_builder:
|
|
139
|
-
file_import.merge(
|
|
140
|
+
file_import.merge(
|
|
141
|
+
self.get_request_builder_import(self.next_request_builder, async_mode, serialize_namespace)
|
|
142
|
+
)
|
|
140
143
|
elif any(p.is_api_version for p in self.client.parameters):
|
|
141
144
|
file_import.add_import("urllib.parse", ImportType.STDLIB)
|
|
142
145
|
file_import.add_submodule_import(
|
|
@@ -145,10 +148,10 @@ class PagingOperationBase(OperationBase[PagingResponseType]):
|
|
|
145
148
|
ImportType.SDKCORE,
|
|
146
149
|
)
|
|
147
150
|
if self.code_model.options["models_mode"] == "dpg":
|
|
148
|
-
relative_path =
|
|
151
|
+
relative_path = self.code_model.get_relative_import_path(serialize_namespace, module_name="_model_base")
|
|
149
152
|
file_import.merge(self.item_type.imports(**kwargs))
|
|
150
153
|
if self.default_error_deserialization or any(r.type for r in self.responses):
|
|
151
|
-
file_import.add_submodule_import(
|
|
154
|
+
file_import.add_submodule_import(relative_path, "_deserialize", ImportType.LOCAL)
|
|
152
155
|
return file_import
|
|
153
156
|
|
|
154
157
|
|
|
@@ -155,23 +155,23 @@ class _ParameterBase(BaseModel, abc.ABC): # pylint: disable=too-many-instance-a
|
|
|
155
155
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
156
156
|
return self.type.docstring_type(**kwargs)
|
|
157
157
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
return self.type.serialization_type
|
|
158
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
159
|
+
return self.type.serialization_type(**kwargs)
|
|
161
160
|
|
|
162
|
-
def _imports_shared(self, async_mode: bool, **
|
|
161
|
+
def _imports_shared(self, async_mode: bool, **kwargs: Any) -> FileImport: # pylint: disable=unused-argument
|
|
163
162
|
file_import = FileImport(self.code_model)
|
|
164
163
|
if self.optional and self.client_default_value is None:
|
|
165
164
|
file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB)
|
|
165
|
+
serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace)
|
|
166
166
|
if self.added_on and self.implementation != "Client":
|
|
167
167
|
file_import.add_submodule_import(
|
|
168
|
-
|
|
168
|
+
self.code_model.get_relative_import_path(serialize_namespace, module_name="_validation"),
|
|
169
169
|
"api_version_validation",
|
|
170
170
|
ImportType.LOCAL,
|
|
171
171
|
)
|
|
172
172
|
if isinstance(self.type, CombinedType) and self.type.name:
|
|
173
173
|
file_import.add_submodule_import(
|
|
174
|
-
|
|
174
|
+
self.code_model.get_relative_import_path(serialize_namespace),
|
|
175
175
|
"_types",
|
|
176
176
|
ImportType.LOCAL,
|
|
177
177
|
TypingSection.TYPING,
|
|
@@ -212,8 +212,8 @@ class _ParameterBase(BaseModel, abc.ABC): # pylint: disable=too-many-instance-a
|
|
|
212
212
|
@abc.abstractmethod
|
|
213
213
|
def in_method_signature(self) -> bool: ...
|
|
214
214
|
|
|
215
|
-
def method_signature(self, async_mode: bool) -> str:
|
|
216
|
-
type_annotation = self.type_annotation(async_mode=async_mode)
|
|
215
|
+
def method_signature(self, async_mode: bool, **kwargs: Any) -> str:
|
|
216
|
+
type_annotation = self.type_annotation(async_mode=async_mode, **kwargs)
|
|
217
217
|
if self.client_default_value is not None or self.optional:
|
|
218
218
|
return f"{self.client_name}: {type_annotation} = {self.client_default_value_declaration},"
|
|
219
219
|
if self.default_to_unset_sentinel:
|
|
@@ -272,9 +272,9 @@ class BodyParameter(_ParameterBase):
|
|
|
272
272
|
def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
|
|
273
273
|
file_import = super().imports(async_mode, **kwargs)
|
|
274
274
|
if self.is_form_data:
|
|
275
|
-
|
|
275
|
+
serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace)
|
|
276
276
|
file_import.add_submodule_import(
|
|
277
|
-
|
|
277
|
+
self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor"),
|
|
278
278
|
"prepare_multipart_form_data",
|
|
279
279
|
ImportType.LOCAL,
|
|
280
280
|
)
|
|
@@ -200,22 +200,22 @@ class _ParameterListBase(
|
|
|
200
200
|
"""Sorted method params. First positional, then keyword only, then kwarg"""
|
|
201
201
|
return self.positional + self.keyword_only + self.kwarg
|
|
202
202
|
|
|
203
|
-
def method_signature(self, async_mode: bool) -> List[str]:
|
|
203
|
+
def method_signature(self, async_mode: bool, **kwargs: Any) -> List[str]:
|
|
204
204
|
"""Method signature for this parameter list."""
|
|
205
205
|
return method_signature_helper(
|
|
206
|
-
positional=self.method_signature_positional(async_mode),
|
|
207
|
-
keyword_only=self.method_signature_keyword_only(async_mode),
|
|
206
|
+
positional=self.method_signature_positional(async_mode, **kwargs),
|
|
207
|
+
keyword_only=self.method_signature_keyword_only(async_mode, **kwargs),
|
|
208
208
|
kwarg_params=self.method_signature_kwargs,
|
|
209
209
|
)
|
|
210
210
|
|
|
211
|
-
def method_signature_positional(self, async_mode: bool) -> List[str]:
|
|
211
|
+
def method_signature_positional(self, async_mode: bool, **kwargs: Any) -> List[str]:
|
|
212
212
|
"""Signature for positional parameters"""
|
|
213
|
-
return [parameter.method_signature(async_mode) for parameter in self.positional]
|
|
213
|
+
return [parameter.method_signature(async_mode, **kwargs) for parameter in self.positional]
|
|
214
214
|
|
|
215
|
-
def method_signature_keyword_only(self, async_mode: bool) -> List[str]:
|
|
215
|
+
def method_signature_keyword_only(self, async_mode: bool, **kwargs: Any) -> List[str]:
|
|
216
216
|
"""Signature for keyword only parameters"""
|
|
217
217
|
result = [
|
|
218
|
-
parameter.method_signature(async_mode)
|
|
218
|
+
parameter.method_signature(async_mode, **kwargs)
|
|
219
219
|
for parameter in self.keyword_only
|
|
220
220
|
if not parameter.hide_in_operation_signature
|
|
221
221
|
]
|
|
@@ -49,8 +49,7 @@ class PrimitiveType(BaseType):
|
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
class BooleanType(PrimitiveType):
|
|
52
|
-
|
|
53
|
-
def serialization_type(self) -> str:
|
|
52
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
54
53
|
return "bool"
|
|
55
54
|
|
|
56
55
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -66,8 +65,7 @@ class BinaryType(PrimitiveType):
|
|
|
66
65
|
super().__init__(yaml_data=yaml_data, code_model=code_model)
|
|
67
66
|
self.type = "IO"
|
|
68
67
|
|
|
69
|
-
|
|
70
|
-
def serialization_type(self) -> str:
|
|
68
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
71
69
|
return self.type
|
|
72
70
|
|
|
73
71
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -84,17 +82,9 @@ class BinaryType(PrimitiveType):
|
|
|
84
82
|
return self.get_declaration(b"bytes")
|
|
85
83
|
|
|
86
84
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
87
|
-
from .combined_type import CombinedType
|
|
88
|
-
from .operation import OperationBase
|
|
89
|
-
|
|
90
85
|
file_import = FileImport(self.code_model)
|
|
91
86
|
file_import.add_submodule_import("typing", "IO", ImportType.STDLIB)
|
|
92
|
-
|
|
93
|
-
if (
|
|
94
|
-
isinstance(operation, OperationBase)
|
|
95
|
-
and operation.parameters.has_body
|
|
96
|
-
and isinstance(operation.parameters.body_parameter.type, CombinedType)
|
|
97
|
-
):
|
|
87
|
+
if kwargs.get("need_import_iobase", False):
|
|
98
88
|
file_import.add_submodule_import("io", "IOBase", ImportType.STDLIB)
|
|
99
89
|
return file_import
|
|
100
90
|
|
|
@@ -107,8 +97,7 @@ class BinaryIteratorType(PrimitiveType):
|
|
|
107
97
|
def _iterator_name(self, **kwargs: Any) -> str:
|
|
108
98
|
return "AsyncIterator" if kwargs.pop("async_mode") else "Iterator"
|
|
109
99
|
|
|
110
|
-
|
|
111
|
-
def serialization_type(self) -> str:
|
|
100
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
112
101
|
return "IO"
|
|
113
102
|
|
|
114
103
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -135,8 +124,7 @@ class BinaryIteratorType(PrimitiveType):
|
|
|
135
124
|
|
|
136
125
|
|
|
137
126
|
class AnyType(PrimitiveType):
|
|
138
|
-
|
|
139
|
-
def serialization_type(self) -> str:
|
|
127
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
140
128
|
return "object"
|
|
141
129
|
|
|
142
130
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -160,8 +148,7 @@ class AnyType(PrimitiveType):
|
|
|
160
148
|
|
|
161
149
|
|
|
162
150
|
class AnyObjectType(PrimitiveType):
|
|
163
|
-
|
|
164
|
-
def serialization_type(self) -> str:
|
|
151
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
165
152
|
return "object"
|
|
166
153
|
|
|
167
154
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -239,8 +226,7 @@ class IntegerType(NumberType):
|
|
|
239
226
|
if yaml_data.get("encode") == "string":
|
|
240
227
|
self.encode = "str"
|
|
241
228
|
|
|
242
|
-
|
|
243
|
-
def serialization_type(self) -> str:
|
|
229
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
244
230
|
return "int"
|
|
245
231
|
|
|
246
232
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -259,8 +245,7 @@ class IntegerType(NumberType):
|
|
|
259
245
|
|
|
260
246
|
|
|
261
247
|
class FloatType(NumberType):
|
|
262
|
-
|
|
263
|
-
def serialization_type(self) -> str:
|
|
248
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
264
249
|
return "float"
|
|
265
250
|
|
|
266
251
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -279,8 +264,7 @@ class FloatType(NumberType):
|
|
|
279
264
|
|
|
280
265
|
|
|
281
266
|
class DecimalType(NumberType):
|
|
282
|
-
|
|
283
|
-
def serialization_type(self) -> str:
|
|
267
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
284
268
|
return "decimal"
|
|
285
269
|
|
|
286
270
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -342,8 +326,7 @@ class StringType(PrimitiveType):
|
|
|
342
326
|
def get_declaration(self, value) -> str:
|
|
343
327
|
return f"'{value}'" if value == '"' else f'"{value}"'
|
|
344
328
|
|
|
345
|
-
|
|
346
|
-
def serialization_type(self) -> str:
|
|
329
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
347
330
|
return "str"
|
|
348
331
|
|
|
349
332
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -363,8 +346,7 @@ class DatetimeType(PrimitiveType):
|
|
|
363
346
|
else "rfc7231"
|
|
364
347
|
)
|
|
365
348
|
|
|
366
|
-
|
|
367
|
-
def serialization_type(self) -> str:
|
|
349
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
368
350
|
formats_to_attribute_type = {
|
|
369
351
|
"rfc3339": "iso-8601",
|
|
370
352
|
"rfc7231": "rfc-1123",
|
|
@@ -410,8 +392,7 @@ class DatetimeType(PrimitiveType):
|
|
|
410
392
|
|
|
411
393
|
|
|
412
394
|
class TimeType(PrimitiveType):
|
|
413
|
-
|
|
414
|
-
def serialization_type(self) -> str:
|
|
395
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
415
396
|
return "time"
|
|
416
397
|
|
|
417
398
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -457,8 +438,7 @@ class UnixTimeType(PrimitiveType):
|
|
|
457
438
|
def encode(self) -> str:
|
|
458
439
|
return "unix-timestamp"
|
|
459
440
|
|
|
460
|
-
|
|
461
|
-
def serialization_type(self) -> str:
|
|
441
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
462
442
|
return "unix-time"
|
|
463
443
|
|
|
464
444
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -500,8 +480,7 @@ class UnixTimeType(PrimitiveType):
|
|
|
500
480
|
|
|
501
481
|
|
|
502
482
|
class DateType(PrimitiveType):
|
|
503
|
-
|
|
504
|
-
def serialization_type(self) -> str:
|
|
483
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
505
484
|
return "date"
|
|
506
485
|
|
|
507
486
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -543,8 +522,7 @@ class DateType(PrimitiveType):
|
|
|
543
522
|
|
|
544
523
|
|
|
545
524
|
class DurationType(PrimitiveType):
|
|
546
|
-
|
|
547
|
-
def serialization_type(self) -> str:
|
|
525
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
548
526
|
return "duration"
|
|
549
527
|
|
|
550
528
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
@@ -590,8 +568,7 @@ class ByteArraySchema(PrimitiveType):
|
|
|
590
568
|
super().__init__(yaml_data=yaml_data, code_model=code_model)
|
|
591
569
|
self.encode = yaml_data.get("encode", "base64")
|
|
592
570
|
|
|
593
|
-
|
|
594
|
-
def serialization_type(self) -> str:
|
|
571
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
595
572
|
if self.encode == "base64url":
|
|
596
573
|
return "base64"
|
|
597
574
|
return "bytearray"
|
|
@@ -628,8 +605,7 @@ class SdkCoreType(PrimitiveType):
|
|
|
628
605
|
def instance_check_template(self) -> str:
|
|
629
606
|
return f"isinstance({{}}, {self.name})"
|
|
630
607
|
|
|
631
|
-
|
|
632
|
-
def serialization_type(self) -> str:
|
|
608
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
633
609
|
return self.name
|
|
634
610
|
|
|
635
611
|
|
|
@@ -646,8 +622,12 @@ class MultiPartFileType(PrimitiveType):
|
|
|
646
622
|
|
|
647
623
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
648
624
|
file_import = super().imports(**kwargs)
|
|
649
|
-
|
|
650
|
-
file_import.add_submodule_import(
|
|
625
|
+
serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace)
|
|
626
|
+
file_import.add_submodule_import(
|
|
627
|
+
self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor"),
|
|
628
|
+
self.name,
|
|
629
|
+
ImportType.LOCAL,
|
|
630
|
+
)
|
|
651
631
|
return file_import
|
|
652
632
|
|
|
653
633
|
@property
|
|
@@ -76,9 +76,8 @@ class Property(BaseModel): # pylint: disable=too-many-instance-attributes
|
|
|
76
76
|
def is_input(self):
|
|
77
77
|
return not (self.constant or self.readonly or self.is_discriminator)
|
|
78
78
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
return self.type.serialization_type
|
|
79
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
80
|
+
return self.type.serialization_type(**kwargs)
|
|
82
81
|
|
|
83
82
|
@property
|
|
84
83
|
def msrest_deserialization_key(self) -> str:
|
|
@@ -99,10 +98,10 @@ class Property(BaseModel): # pylint: disable=too-many-instance-attributes
|
|
|
99
98
|
def xml_metadata(self) -> Optional[Dict[str, Union[str, bool]]]:
|
|
100
99
|
return self.yaml_data.get("xmlMetadata")
|
|
101
100
|
|
|
102
|
-
def type_annotation(self, *, is_operation_file: bool = False) -> str:
|
|
101
|
+
def type_annotation(self, *, is_operation_file: bool = False, **kwargs: Any) -> str:
|
|
103
102
|
if self.is_base_discriminator:
|
|
104
103
|
return "str"
|
|
105
|
-
types_type_annotation = self.type.type_annotation(is_operation_file=is_operation_file)
|
|
104
|
+
types_type_annotation = self.type.type_annotation(is_operation_file=is_operation_file, **kwargs)
|
|
106
105
|
if self.optional and self.client_default_value is None:
|
|
107
106
|
return f"Optional[{types_type_annotation}]"
|
|
108
107
|
return types_type_annotation
|
|
@@ -144,12 +143,13 @@ class Property(BaseModel): # pylint: disable=too-many-instance-attributes
|
|
|
144
143
|
file_import = FileImport(self.code_model)
|
|
145
144
|
if self.is_discriminator and isinstance(self.type, EnumType):
|
|
146
145
|
return file_import
|
|
147
|
-
file_import.merge(self.type.imports(**kwargs
|
|
146
|
+
file_import.merge(self.type.imports(**kwargs))
|
|
148
147
|
if self.optional and self.client_default_value is None:
|
|
149
148
|
file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB)
|
|
150
149
|
if self.code_model.options["models_mode"] == "dpg":
|
|
150
|
+
serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace)
|
|
151
151
|
file_import.add_submodule_import(
|
|
152
|
-
"
|
|
152
|
+
self.code_model.get_relative_import_path(serialize_namespace, module_name="_model_base"),
|
|
153
153
|
"rest_discriminator" if self.is_discriminator else "rest_field",
|
|
154
154
|
ImportType.LOCAL,
|
|
155
155
|
)
|
|
@@ -7,11 +7,12 @@ from typing import (
|
|
|
7
7
|
Any,
|
|
8
8
|
Callable,
|
|
9
9
|
Dict,
|
|
10
|
-
List,
|
|
11
10
|
TypeVar,
|
|
12
11
|
TYPE_CHECKING,
|
|
13
12
|
Union,
|
|
14
13
|
Optional,
|
|
14
|
+
Sequence,
|
|
15
|
+
cast,
|
|
15
16
|
)
|
|
16
17
|
from abc import abstractmethod
|
|
17
18
|
|
|
@@ -34,7 +35,7 @@ ParameterListType = TypeVar(
|
|
|
34
35
|
)
|
|
35
36
|
|
|
36
37
|
|
|
37
|
-
class RequestBuilderBase(BaseBuilder[ParameterListType,
|
|
38
|
+
class RequestBuilderBase(BaseBuilder[ParameterListType, Sequence["RequestBuilder"]]):
|
|
38
39
|
def __init__(
|
|
39
40
|
self,
|
|
40
41
|
yaml_data: Dict[str, Any],
|
|
@@ -43,7 +44,7 @@ class RequestBuilderBase(BaseBuilder[ParameterListType, List["RequestBuilder"]])
|
|
|
43
44
|
name: str,
|
|
44
45
|
parameters: ParameterListType,
|
|
45
46
|
*,
|
|
46
|
-
overloads: Optional[
|
|
47
|
+
overloads: Optional[Sequence["RequestBuilder"]] = None,
|
|
47
48
|
) -> None:
|
|
48
49
|
super().__init__(
|
|
49
50
|
code_model=code_model,
|
|
@@ -53,7 +54,7 @@ class RequestBuilderBase(BaseBuilder[ParameterListType, List["RequestBuilder"]])
|
|
|
53
54
|
parameters=parameters,
|
|
54
55
|
overloads=overloads,
|
|
55
56
|
)
|
|
56
|
-
self.overloads:
|
|
57
|
+
self.overloads: Sequence["RequestBuilder"] = overloads or []
|
|
57
58
|
self.url: str = yaml_data["url"]
|
|
58
59
|
self.method: str = yaml_data["method"]
|
|
59
60
|
self.want_tracing = False
|
|
@@ -84,15 +85,12 @@ class RequestBuilderBase(BaseBuilder[ParameterListType, List["RequestBuilder"]])
|
|
|
84
85
|
def response_docstring_type(self, **kwargs) -> str:
|
|
85
86
|
return f"~{self.code_model.core_library}.rest.HttpRequest"
|
|
86
87
|
|
|
87
|
-
def imports(self) -> FileImport:
|
|
88
|
+
def imports(self, **kwargs) -> FileImport:
|
|
88
89
|
file_import = FileImport(self.code_model)
|
|
89
|
-
relative_path = ".."
|
|
90
|
-
if not self.code_model.options["builders_visibility"] == "embedded" and self.group_name:
|
|
91
|
-
relative_path = "..." if self.group_name else ".."
|
|
92
90
|
if self.abstract:
|
|
93
91
|
return file_import
|
|
94
92
|
for parameter in self.parameters.method:
|
|
95
|
-
file_import.merge(parameter.imports(async_mode=False,
|
|
93
|
+
file_import.merge(parameter.imports(async_mode=False, **kwargs))
|
|
96
94
|
|
|
97
95
|
file_import.add_submodule_import(
|
|
98
96
|
"rest",
|
|
@@ -108,11 +106,7 @@ class RequestBuilderBase(BaseBuilder[ParameterListType, List["RequestBuilder"]])
|
|
|
108
106
|
)
|
|
109
107
|
file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, typing_section=TypingSection.CONDITIONAL)
|
|
110
108
|
file_import.add_msrest_import(
|
|
111
|
-
|
|
112
|
-
"..."
|
|
113
|
-
if (not self.code_model.options["builders_visibility"] == "embedded" and self.group_name)
|
|
114
|
-
else ".."
|
|
115
|
-
),
|
|
109
|
+
serialize_namespace=kwargs.get("serialize_namespace", self.code_model.namespace),
|
|
116
110
|
msrest_import_type=MsrestImportType.Serializer,
|
|
117
111
|
typing_section=TypingSection.REGULAR,
|
|
118
112
|
)
|
|
@@ -154,7 +148,7 @@ class RequestBuilderBase(BaseBuilder[ParameterListType, List["RequestBuilder"]])
|
|
|
154
148
|
# So add operation group name is effective method
|
|
155
149
|
|
|
156
150
|
overloads = [
|
|
157
|
-
RequestBuilder.from_yaml(rb_yaml_data, code_model, client)
|
|
151
|
+
cast(RequestBuilder, RequestBuilder.from_yaml(rb_yaml_data, code_model, client))
|
|
158
152
|
for rb_yaml_data in yaml_data.get("overloads", [])
|
|
159
153
|
]
|
|
160
154
|
parameter_list = cls.parameter_list_type()(yaml_data, code_model)
|
|
@@ -29,9 +29,8 @@ class ResponseHeader(BaseModel):
|
|
|
29
29
|
self.wire_name: str = yaml_data["wireName"]
|
|
30
30
|
self.type = type
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return self.type.serialization_type
|
|
32
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
33
|
+
return self.type.serialization_type(**kwargs)
|
|
35
34
|
|
|
36
35
|
@classmethod
|
|
37
36
|
def from_yaml(cls, yaml_data: Dict[str, Any], code_model: "CodeModel") -> "ResponseHeader":
|
|
@@ -88,10 +87,9 @@ class Response(BaseModel):
|
|
|
88
87
|
)
|
|
89
88
|
return retval
|
|
90
89
|
|
|
91
|
-
|
|
92
|
-
def serialization_type(self) -> str:
|
|
90
|
+
def serialization_type(self, **kwargs: Any) -> str:
|
|
93
91
|
if self.type:
|
|
94
|
-
return self.type.serialization_type
|
|
92
|
+
return self.type.serialization_type(**kwargs)
|
|
95
93
|
return "None"
|
|
96
94
|
|
|
97
95
|
def type_annotation(self, **kwargs: Any) -> str:
|
|
@@ -120,9 +118,9 @@ class Response(BaseModel):
|
|
|
120
118
|
if self.nullable:
|
|
121
119
|
file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB)
|
|
122
120
|
if isinstance(self.type, CombinedType) and self.type.name:
|
|
123
|
-
|
|
121
|
+
serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace)
|
|
124
122
|
file_import.add_submodule_import(
|
|
125
|
-
|
|
123
|
+
self.code_model.get_relative_import_path(serialize_namespace),
|
|
126
124
|
"_types",
|
|
127
125
|
ImportType.LOCAL,
|
|
128
126
|
TypingSection.TYPING,
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
from typing import TypeVar, Dict
|
|
7
7
|
|
|
8
|
+
from enum import Enum
|
|
9
|
+
|
|
8
10
|
T = TypeVar("T")
|
|
9
11
|
OrderedSet = Dict[T, None]
|
|
10
12
|
|
|
@@ -19,3 +21,12 @@ def add_to_pylint_disable(curr_str: str, entry: str) -> str:
|
|
|
19
21
|
if curr_str:
|
|
20
22
|
return f"{curr_str},{entry}"
|
|
21
23
|
return f" # pylint: disable={entry}"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class NamespaceType(str, Enum):
|
|
27
|
+
"""Special signal for impports"""
|
|
28
|
+
|
|
29
|
+
MODEL = "model"
|
|
30
|
+
OPERATION = "operation"
|
|
31
|
+
CLIENT = "client"
|
|
32
|
+
TYPES_FILE = "types_file"
|