@typespec/http-client-python 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/emitter/emitter.d.ts.map +1 -1
- package/dist/emitter/emitter.js +85 -24
- 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/run-python3.d.ts +2 -0
- package/dist/emitter/run-python3.d.ts.map +1 -0
- package/dist/emitter/run-python3.js +19 -0
- package/dist/emitter/run-python3.js.map +1 -0
- package/dist/emitter/system-requirements.d.ts +17 -0
- package/dist/emitter/system-requirements.d.ts.map +1 -0
- package/dist/emitter/system-requirements.js +167 -0
- package/dist/emitter/system-requirements.js.map +1 -0
- package/emitter/src/emitter.ts +88 -23
- package/emitter/src/lib.ts +2 -0
- package/emitter/src/run-python3.ts +20 -0
- package/emitter/src/system-requirements.ts +261 -0
- package/emitter/temp/tsconfig.tsbuildinfo +1 -1
- package/eng/scripts/ci/regenerate.ts +16 -4
- package/eng/scripts/setup/__pycache__/venvtools.cpython-38.pyc +0 -0
- package/eng/scripts/setup/build.ts +16 -0
- package/eng/scripts/setup/build_pygen_wheel.py +40 -0
- package/eng/scripts/setup/install.py +9 -3
- package/eng/scripts/setup/install.ts +32 -0
- package/eng/scripts/setup/prepare.py +3 -1
- package/eng/scripts/setup/prepare.ts +11 -0
- package/eng/scripts/setup/run-python3.ts +1 -6
- package/generator/build/lib/pygen/__init__.py +107 -0
- package/generator/build/lib/pygen/_version.py +7 -0
- package/generator/build/lib/pygen/black.py +71 -0
- package/generator/build/lib/pygen/codegen/__init__.py +357 -0
- package/generator/build/lib/pygen/codegen/_utils.py +17 -0
- package/generator/build/lib/pygen/codegen/models/__init__.py +204 -0
- package/generator/build/lib/pygen/codegen/models/base.py +186 -0
- package/generator/build/lib/pygen/codegen/models/base_builder.py +118 -0
- package/generator/build/lib/pygen/codegen/models/client.py +435 -0
- package/generator/build/lib/pygen/codegen/models/code_model.py +237 -0
- package/generator/build/lib/pygen/codegen/models/combined_type.py +149 -0
- package/generator/build/lib/pygen/codegen/models/constant_type.py +129 -0
- package/generator/build/lib/pygen/codegen/models/credential_types.py +214 -0
- package/generator/build/lib/pygen/codegen/models/dictionary_type.py +127 -0
- package/generator/build/lib/pygen/codegen/models/enum_type.py +238 -0
- package/generator/build/lib/pygen/codegen/models/imports.py +291 -0
- package/generator/build/lib/pygen/codegen/models/list_type.py +143 -0
- package/generator/build/lib/pygen/codegen/models/lro_operation.py +142 -0
- package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +32 -0
- package/generator/build/lib/pygen/codegen/models/model_type.py +357 -0
- package/generator/build/lib/pygen/codegen/models/operation.py +509 -0
- package/generator/build/lib/pygen/codegen/models/operation_group.py +184 -0
- package/generator/build/lib/pygen/codegen/models/paging_operation.py +155 -0
- package/generator/build/lib/pygen/codegen/models/parameter.py +412 -0
- package/generator/build/lib/pygen/codegen/models/parameter_list.py +387 -0
- package/generator/build/lib/pygen/codegen/models/primitive_types.py +659 -0
- package/generator/build/lib/pygen/codegen/models/property.py +170 -0
- package/generator/build/lib/pygen/codegen/models/request_builder.py +189 -0
- package/generator/build/lib/pygen/codegen/models/request_builder_parameter.py +115 -0
- package/generator/build/lib/pygen/codegen/models/response.py +348 -0
- package/generator/build/lib/pygen/codegen/models/utils.py +21 -0
- package/generator/build/lib/pygen/codegen/serializers/__init__.py +574 -0
- package/generator/build/lib/pygen/codegen/serializers/base_serializer.py +21 -0
- package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +1533 -0
- package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +294 -0
- package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +15 -0
- package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +213 -0
- package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +126 -0
- package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +198 -0
- package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +33 -0
- package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +335 -0
- package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +89 -0
- package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +44 -0
- package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +221 -0
- package/generator/build/lib/pygen/codegen/serializers/patch_serializer.py +19 -0
- package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +52 -0
- package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +168 -0
- package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +292 -0
- package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +31 -0
- package/generator/build/lib/pygen/codegen/serializers/utils.py +68 -0
- package/generator/build/lib/pygen/codegen/templates/client.py.jinja2 +37 -0
- package/generator/build/lib/pygen/codegen/templates/client_container.py.jinja2 +12 -0
- package/generator/build/lib/pygen/codegen/templates/config.py.jinja2 +73 -0
- package/generator/build/lib/pygen/codegen/templates/config_container.py.jinja2 +16 -0
- package/generator/build/lib/pygen/codegen/templates/conftest.py.jinja2 +28 -0
- package/generator/build/lib/pygen/codegen/templates/enum.py.jinja2 +13 -0
- package/generator/build/lib/pygen/codegen/templates/enum_container.py.jinja2 +10 -0
- package/generator/build/lib/pygen/codegen/templates/init.py.jinja2 +24 -0
- package/generator/build/lib/pygen/codegen/templates/keywords.jinja2 +27 -0
- package/generator/build/lib/pygen/codegen/templates/lro_operation.py.jinja2 +16 -0
- package/generator/build/lib/pygen/codegen/templates/lro_paging_operation.py.jinja2 +18 -0
- package/generator/build/lib/pygen/codegen/templates/macros.jinja2 +12 -0
- package/generator/build/lib/pygen/codegen/templates/metadata.json.jinja2 +167 -0
- package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +1174 -0
- package/generator/build/lib/pygen/codegen/templates/model_container.py.jinja2 +15 -0
- package/generator/build/lib/pygen/codegen/templates/model_dpg.py.jinja2 +97 -0
- package/generator/build/lib/pygen/codegen/templates/model_init.py.jinja2 +33 -0
- package/generator/build/lib/pygen/codegen/templates/model_msrest.py.jinja2 +92 -0
- package/generator/build/lib/pygen/codegen/templates/operation.py.jinja2 +21 -0
- package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +75 -0
- package/generator/build/lib/pygen/codegen/templates/operation_groups_container.py.jinja2 +19 -0
- package/generator/build/lib/pygen/codegen/templates/operation_tools.jinja2 +81 -0
- package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +17 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +6 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/LICENSE.jinja2 +21 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +8 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/README.md.jinja2 +107 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +9 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +108 -0
- package/generator/build/lib/pygen/codegen/templates/paging_operation.py.jinja2 +21 -0
- package/generator/build/lib/pygen/codegen/templates/patch.py.jinja2 +19 -0
- package/generator/build/lib/pygen/codegen/templates/pkgutil_init.py.jinja2 +1 -0
- package/generator/build/lib/pygen/codegen/templates/request_builder.py.jinja2 +28 -0
- package/generator/build/lib/pygen/codegen/templates/request_builders.py.jinja2 +10 -0
- package/generator/build/lib/pygen/codegen/templates/rest_init.py.jinja2 +12 -0
- package/generator/build/lib/pygen/codegen/templates/sample.py.jinja2 +44 -0
- package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +2117 -0
- package/generator/build/lib/pygen/codegen/templates/test.py.jinja2 +50 -0
- package/generator/build/lib/pygen/codegen/templates/testpreparer.py.jinja2 +26 -0
- package/generator/build/lib/pygen/codegen/templates/types.py.jinja2 +7 -0
- package/generator/build/lib/pygen/codegen/templates/validation.py.jinja2 +38 -0
- package/generator/build/lib/pygen/codegen/templates/vendor.py.jinja2 +96 -0
- package/generator/build/lib/pygen/codegen/templates/version.py.jinja2 +4 -0
- package/generator/build/lib/pygen/m2r.py +65 -0
- package/generator/build/lib/pygen/preprocess/__init__.py +515 -0
- package/generator/build/lib/pygen/preprocess/helpers.py +27 -0
- package/generator/build/lib/pygen/preprocess/python_mappings.py +226 -0
- package/generator/build/lib/pygen/utils.py +163 -0
- package/generator/component-detection-pip-report.json +134 -0
- package/generator/dev_requirements.txt +0 -1
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/m2r.py +1 -1
- package/generator/pygen.egg-info/PKG-INFO +7 -4
- package/generator/pygen.egg-info/requires.txt +7 -4
- package/generator/requirements.txt +5 -10
- package/generator/setup.py +7 -4
- package/generator/test/azure/requirements.txt +2 -0
- package/generator/test/generic_mock_api_tests/unittests/test_m2r.py +10 -0
- package/generator/test/unbranded/requirements.txt +2 -0
- package/package.json +6 -5
|
@@ -0,0 +1,170 @@
|
|
|
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 Any, Dict, Optional, TYPE_CHECKING, List, cast, Union
|
|
7
|
+
|
|
8
|
+
from .base import BaseModel
|
|
9
|
+
from .constant_type import ConstantType
|
|
10
|
+
from .enum_type import EnumType
|
|
11
|
+
from .base import BaseType
|
|
12
|
+
from .imports import FileImport, ImportType
|
|
13
|
+
from .utils import add_to_description, add_to_pylint_disable
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from .code_model import CodeModel
|
|
17
|
+
from .model_type import ModelType
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Property(BaseModel): # pylint: disable=too-many-instance-attributes
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
yaml_data: Dict[str, Any],
|
|
24
|
+
code_model: "CodeModel",
|
|
25
|
+
type: BaseType,
|
|
26
|
+
) -> None:
|
|
27
|
+
super().__init__(yaml_data, code_model)
|
|
28
|
+
self.wire_name: str = self.yaml_data["wireName"]
|
|
29
|
+
self.client_name: str = self.yaml_data["clientName"]
|
|
30
|
+
self.type = type
|
|
31
|
+
self.optional: bool = self.yaml_data["optional"]
|
|
32
|
+
self.readonly: bool = self.yaml_data.get("readonly", False)
|
|
33
|
+
self.visibility: List[str] = self.yaml_data.get("visibility", [])
|
|
34
|
+
self.is_polymorphic: bool = self.yaml_data.get("isPolymorphic", False)
|
|
35
|
+
self.is_discriminator: bool = yaml_data.get("isDiscriminator", False)
|
|
36
|
+
self.client_default_value = yaml_data.get("clientDefaultValue", None)
|
|
37
|
+
if self.client_default_value is None:
|
|
38
|
+
self.client_default_value = self.type.client_default_value
|
|
39
|
+
self.flattened_names: List[str] = yaml_data.get("flattenedNames", [])
|
|
40
|
+
self.is_multipart_file_input: bool = yaml_data.get("isMultipartFileInput", False)
|
|
41
|
+
self.flatten = self.yaml_data.get("flatten", False) and not getattr(self.type, "flattened_property", False)
|
|
42
|
+
|
|
43
|
+
def pylint_disable(self) -> str:
|
|
44
|
+
retval: str = ""
|
|
45
|
+
if self.yaml_data.get("pylintDisable"):
|
|
46
|
+
retval = add_to_pylint_disable(retval, self.yaml_data["pylintDisable"])
|
|
47
|
+
return retval
|
|
48
|
+
|
|
49
|
+
def description(self, *, is_operation_file: bool) -> str:
|
|
50
|
+
from .model_type import ModelType
|
|
51
|
+
|
|
52
|
+
description = self.yaml_data.get("description", "")
|
|
53
|
+
if not (self.optional or self.client_default_value):
|
|
54
|
+
description = add_to_description(description, "Required.")
|
|
55
|
+
# don't want model type documentation as part of property doc
|
|
56
|
+
type_description = (
|
|
57
|
+
"" if isinstance(self.type, ModelType) else self.type.description(is_operation_file=is_operation_file)
|
|
58
|
+
)
|
|
59
|
+
return add_to_description(description, type_description)
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def client_default_value_declaration(self) -> str:
|
|
63
|
+
if self.client_default_value is not None:
|
|
64
|
+
return self.get_declaration(self.client_default_value)
|
|
65
|
+
if self.type.client_default_value is not None:
|
|
66
|
+
return self.get_declaration(self.type.client_default_value)
|
|
67
|
+
return "None"
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def constant(self) -> bool:
|
|
71
|
+
# this bool doesn't consider you to be constant if you are a discriminator
|
|
72
|
+
# you also have to be required to be considered a constant
|
|
73
|
+
return isinstance(self.type, ConstantType) and not self.optional and not self.is_discriminator
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def is_input(self):
|
|
77
|
+
return not (self.constant or self.readonly or self.is_discriminator)
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def serialization_type(self) -> str:
|
|
81
|
+
return self.type.serialization_type
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def msrest_deserialization_key(self) -> str:
|
|
85
|
+
return self.type.msrest_deserialization_key
|
|
86
|
+
|
|
87
|
+
@property
|
|
88
|
+
def is_enum_discriminator(self) -> bool:
|
|
89
|
+
return self.is_discriminator and self.type.type == "enum"
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def is_base_discriminator(self) -> bool:
|
|
93
|
+
"""If this discriminator is on the base model for polymorphic inheritance"""
|
|
94
|
+
if self.is_enum_discriminator:
|
|
95
|
+
return self.is_polymorphic and self.client_default_value is None
|
|
96
|
+
return self.is_discriminator and self.is_polymorphic and cast(ConstantType, self.type).value is None
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def xml_metadata(self) -> Optional[Dict[str, Union[str, bool]]]:
|
|
100
|
+
return self.yaml_data.get("xmlMetadata")
|
|
101
|
+
|
|
102
|
+
def type_annotation(self, *, is_operation_file: bool = False) -> str:
|
|
103
|
+
if self.is_base_discriminator:
|
|
104
|
+
return "str"
|
|
105
|
+
types_type_annotation = self.type.type_annotation(is_operation_file=is_operation_file)
|
|
106
|
+
if self.optional and self.client_default_value is None:
|
|
107
|
+
return f"Optional[{types_type_annotation}]"
|
|
108
|
+
return types_type_annotation
|
|
109
|
+
|
|
110
|
+
def get_declaration(self, value: Any = None) -> Any:
|
|
111
|
+
return self.type.get_declaration(value)
|
|
112
|
+
|
|
113
|
+
def get_json_template_representation(
|
|
114
|
+
self,
|
|
115
|
+
*,
|
|
116
|
+
client_default_value_declaration: Optional[str] = None,
|
|
117
|
+
) -> Any:
|
|
118
|
+
if self.client_default_value:
|
|
119
|
+
client_default_value_declaration = self.get_declaration(self.client_default_value)
|
|
120
|
+
# make sure there is no \n otherwise the json template will be invalid
|
|
121
|
+
return self.type.get_json_template_representation(
|
|
122
|
+
client_default_value_declaration=client_default_value_declaration,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
def get_polymorphic_subtypes(self, polymorphic_subtypes: List["ModelType"]) -> None:
|
|
126
|
+
from .model_type import ModelType
|
|
127
|
+
|
|
128
|
+
if isinstance(self.type, ModelType):
|
|
129
|
+
self.type.get_polymorphic_subtypes(polymorphic_subtypes)
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def validation(self) -> Optional[Dict[str, Any]]:
|
|
133
|
+
retval: Dict[str, Any] = {}
|
|
134
|
+
if not self.optional:
|
|
135
|
+
retval["required"] = True
|
|
136
|
+
if self.readonly:
|
|
137
|
+
retval["readonly"] = True
|
|
138
|
+
if self.constant:
|
|
139
|
+
retval["constant"] = True
|
|
140
|
+
retval.update(self.type.validation or {})
|
|
141
|
+
return retval or None
|
|
142
|
+
|
|
143
|
+
def imports(self, **kwargs) -> FileImport:
|
|
144
|
+
file_import = FileImport(self.code_model)
|
|
145
|
+
if self.is_discriminator and isinstance(self.type, EnumType):
|
|
146
|
+
return file_import
|
|
147
|
+
file_import.merge(self.type.imports(**kwargs, relative_path="..", model_typing=True))
|
|
148
|
+
if self.optional and self.client_default_value is None:
|
|
149
|
+
file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB)
|
|
150
|
+
if self.code_model.options["models_mode"] == "dpg":
|
|
151
|
+
file_import.add_submodule_import(
|
|
152
|
+
".._model_base",
|
|
153
|
+
"rest_discriminator" if self.is_discriminator else "rest_field",
|
|
154
|
+
ImportType.LOCAL,
|
|
155
|
+
)
|
|
156
|
+
return file_import
|
|
157
|
+
|
|
158
|
+
@classmethod
|
|
159
|
+
def from_yaml(
|
|
160
|
+
cls,
|
|
161
|
+
yaml_data: Dict[str, Any],
|
|
162
|
+
code_model: "CodeModel",
|
|
163
|
+
) -> "Property":
|
|
164
|
+
from . import build_type # pylint: disable=import-outside-toplevel
|
|
165
|
+
|
|
166
|
+
return cls(
|
|
167
|
+
yaml_data=yaml_data,
|
|
168
|
+
code_model=code_model,
|
|
169
|
+
type=build_type(yaml_data["type"], code_model),
|
|
170
|
+
)
|
|
@@ -0,0 +1,189 @@
|
|
|
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 (
|
|
7
|
+
Any,
|
|
8
|
+
Callable,
|
|
9
|
+
Dict,
|
|
10
|
+
List,
|
|
11
|
+
TypeVar,
|
|
12
|
+
TYPE_CHECKING,
|
|
13
|
+
Union,
|
|
14
|
+
Optional,
|
|
15
|
+
)
|
|
16
|
+
from abc import abstractmethod
|
|
17
|
+
|
|
18
|
+
from .base_builder import BaseBuilder
|
|
19
|
+
from .utils import add_to_pylint_disable
|
|
20
|
+
from .parameter_list import (
|
|
21
|
+
RequestBuilderParameterList,
|
|
22
|
+
OverloadedRequestBuilderParameterList,
|
|
23
|
+
)
|
|
24
|
+
from .imports import FileImport, ImportType, TypingSection, MsrestImportType
|
|
25
|
+
from ...utils import NAME_LENGTH_LIMIT
|
|
26
|
+
|
|
27
|
+
if TYPE_CHECKING:
|
|
28
|
+
from .code_model import CodeModel
|
|
29
|
+
from .client import Client
|
|
30
|
+
|
|
31
|
+
ParameterListType = TypeVar(
|
|
32
|
+
"ParameterListType",
|
|
33
|
+
bound=Union[RequestBuilderParameterList, OverloadedRequestBuilderParameterList],
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class RequestBuilderBase(BaseBuilder[ParameterListType, List["RequestBuilder"]]):
|
|
38
|
+
def __init__(
|
|
39
|
+
self,
|
|
40
|
+
yaml_data: Dict[str, Any],
|
|
41
|
+
code_model: "CodeModel",
|
|
42
|
+
client: "Client",
|
|
43
|
+
name: str,
|
|
44
|
+
parameters: ParameterListType,
|
|
45
|
+
*,
|
|
46
|
+
overloads: Optional[List["RequestBuilder"]] = None,
|
|
47
|
+
) -> None:
|
|
48
|
+
super().__init__(
|
|
49
|
+
code_model=code_model,
|
|
50
|
+
client=client,
|
|
51
|
+
yaml_data=yaml_data,
|
|
52
|
+
name=name,
|
|
53
|
+
parameters=parameters,
|
|
54
|
+
overloads=overloads,
|
|
55
|
+
)
|
|
56
|
+
self.overloads: List["RequestBuilder"] = overloads or []
|
|
57
|
+
self.url: str = yaml_data["url"]
|
|
58
|
+
self.method: str = yaml_data["method"]
|
|
59
|
+
self.want_tracing = False
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def has_form_data_body(self):
|
|
63
|
+
return self.parameters.has_form_data_body
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def is_lro(self) -> bool:
|
|
67
|
+
return self.yaml_data.get("discriminator") in ("lro", "lropaging")
|
|
68
|
+
|
|
69
|
+
def pylint_disable(self, async_mode: bool) -> str:
|
|
70
|
+
if len(self.name) > NAME_LENGTH_LIMIT:
|
|
71
|
+
return add_to_pylint_disable("", "name-too-long")
|
|
72
|
+
return ""
|
|
73
|
+
|
|
74
|
+
def response_type_annotation(self, **kwargs) -> str:
|
|
75
|
+
return "HttpRequest"
|
|
76
|
+
|
|
77
|
+
def response_docstring_text(self, **kwargs) -> str:
|
|
78
|
+
return (
|
|
79
|
+
f"Returns an :class:`~{self.response_docstring_type()}` that you will pass to the client's "
|
|
80
|
+
+ "`send_request` method. See https://aka.ms/azsdk/dpcodegen/python/send_request for how to "
|
|
81
|
+
+ "incorporate this response into your code flow."
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
def response_docstring_type(self, **kwargs) -> str:
|
|
85
|
+
return f"~{self.code_model.core_library}.rest.HttpRequest"
|
|
86
|
+
|
|
87
|
+
def imports(self) -> FileImport:
|
|
88
|
+
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
|
+
if self.abstract:
|
|
93
|
+
return file_import
|
|
94
|
+
for parameter in self.parameters.method:
|
|
95
|
+
file_import.merge(parameter.imports(async_mode=False, relative_path=relative_path, operation=self))
|
|
96
|
+
|
|
97
|
+
file_import.add_submodule_import(
|
|
98
|
+
"rest",
|
|
99
|
+
"HttpRequest",
|
|
100
|
+
ImportType.SDKCORE,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
if self.parameters.headers or self.parameters.query:
|
|
104
|
+
file_import.add_submodule_import(
|
|
105
|
+
"utils",
|
|
106
|
+
"case_insensitive_dict",
|
|
107
|
+
ImportType.SDKCORE,
|
|
108
|
+
)
|
|
109
|
+
file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, typing_section=TypingSection.CONDITIONAL)
|
|
110
|
+
file_import.add_msrest_import(
|
|
111
|
+
relative_path=(
|
|
112
|
+
"..."
|
|
113
|
+
if (not self.code_model.options["builders_visibility"] == "embedded" and self.group_name)
|
|
114
|
+
else ".."
|
|
115
|
+
),
|
|
116
|
+
msrest_import_type=MsrestImportType.Serializer,
|
|
117
|
+
typing_section=TypingSection.REGULAR,
|
|
118
|
+
)
|
|
119
|
+
if self.overloads and self.code_model.options["builders_visibility"] != "embedded":
|
|
120
|
+
file_import.add_submodule_import("typing", "overload", ImportType.STDLIB)
|
|
121
|
+
return file_import
|
|
122
|
+
|
|
123
|
+
@staticmethod
|
|
124
|
+
@abstractmethod
|
|
125
|
+
def parameter_list_type() -> Callable[[Dict[str, Any], "CodeModel"], ParameterListType]: ...
|
|
126
|
+
|
|
127
|
+
@classmethod
|
|
128
|
+
def get_name(
|
|
129
|
+
cls,
|
|
130
|
+
name: str,
|
|
131
|
+
yaml_data: Dict[str, Any],
|
|
132
|
+
code_model: "CodeModel",
|
|
133
|
+
client: "Client",
|
|
134
|
+
) -> str:
|
|
135
|
+
additional_mark = ""
|
|
136
|
+
if code_model.options["combine_operation_files"] and code_model.options["builders_visibility"] == "embedded":
|
|
137
|
+
additional_mark = yaml_data["groupName"] or client.yaml_data["builderPadName"]
|
|
138
|
+
names = [
|
|
139
|
+
"build",
|
|
140
|
+
additional_mark,
|
|
141
|
+
name,
|
|
142
|
+
"request",
|
|
143
|
+
]
|
|
144
|
+
return "_".join([n for n in names if n])
|
|
145
|
+
|
|
146
|
+
@classmethod
|
|
147
|
+
def from_yaml(
|
|
148
|
+
cls,
|
|
149
|
+
yaml_data: Dict[str, Any],
|
|
150
|
+
code_model: "CodeModel",
|
|
151
|
+
client: "Client",
|
|
152
|
+
):
|
|
153
|
+
# when combine embedded builders into one operation file, we need to avoid duplicated build function name.
|
|
154
|
+
# So add operation group name is effective method
|
|
155
|
+
|
|
156
|
+
overloads = [
|
|
157
|
+
RequestBuilder.from_yaml(rb_yaml_data, code_model, client)
|
|
158
|
+
for rb_yaml_data in yaml_data.get("overloads", [])
|
|
159
|
+
]
|
|
160
|
+
parameter_list = cls.parameter_list_type()(yaml_data, code_model)
|
|
161
|
+
|
|
162
|
+
return cls(
|
|
163
|
+
yaml_data=yaml_data,
|
|
164
|
+
code_model=code_model,
|
|
165
|
+
client=client,
|
|
166
|
+
name=cls.get_name(yaml_data["name"], yaml_data, code_model, client),
|
|
167
|
+
parameters=parameter_list,
|
|
168
|
+
overloads=overloads,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class RequestBuilder(RequestBuilderBase[RequestBuilderParameterList]):
|
|
173
|
+
@staticmethod
|
|
174
|
+
def parameter_list_type() -> Callable[[Dict[str, Any], "CodeModel"], RequestBuilderParameterList]:
|
|
175
|
+
return RequestBuilderParameterList.from_yaml
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class OverloadedRequestBuilder(RequestBuilderBase[OverloadedRequestBuilderParameterList]):
|
|
179
|
+
@staticmethod
|
|
180
|
+
def parameter_list_type() -> Callable[[Dict[str, Any], "CodeModel"], OverloadedRequestBuilderParameterList]:
|
|
181
|
+
return OverloadedRequestBuilderParameterList.from_yaml
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def get_request_builder(
|
|
185
|
+
yaml_data: Dict[str, Any], code_model: "CodeModel", client: "Client"
|
|
186
|
+
) -> Union[RequestBuilder, OverloadedRequestBuilder]:
|
|
187
|
+
if yaml_data.get("overloads"):
|
|
188
|
+
return OverloadedRequestBuilder.from_yaml(yaml_data, code_model, client)
|
|
189
|
+
return RequestBuilder.from_yaml(yaml_data, code_model, client)
|
|
@@ -0,0 +1,115 @@
|
|
|
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 TYPE_CHECKING, Any, Dict
|
|
7
|
+
from .parameter import (
|
|
8
|
+
ParameterLocation,
|
|
9
|
+
ParameterMethodLocation,
|
|
10
|
+
Parameter,
|
|
11
|
+
BodyParameter,
|
|
12
|
+
)
|
|
13
|
+
from .base import BaseType
|
|
14
|
+
from .primitive_types import BinaryType, StringType
|
|
15
|
+
from .combined_type import CombinedType
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from .code_model import CodeModel
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class RequestBuilderBodyParameter(BodyParameter):
|
|
22
|
+
"""BOdy parmaeter for RequestBuilders"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, *args, **kwargs) -> None:
|
|
25
|
+
super().__init__(*args, **kwargs)
|
|
26
|
+
if (
|
|
27
|
+
isinstance(self.type, (BinaryType, StringType))
|
|
28
|
+
or any("xml" in ct for ct in self.content_types)
|
|
29
|
+
or self.code_model.options["models_mode"] == "dpg"
|
|
30
|
+
):
|
|
31
|
+
self.client_name = "content"
|
|
32
|
+
else:
|
|
33
|
+
self.client_name = "json"
|
|
34
|
+
|
|
35
|
+
def type_annotation(self, **kwargs: Any) -> str:
|
|
36
|
+
if self.type.is_xml:
|
|
37
|
+
return "Any" # xml type technically not in type signature for HttpRequest content param
|
|
38
|
+
return super().type_annotation(**kwargs)
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def in_method_signature(self) -> bool:
|
|
42
|
+
return (
|
|
43
|
+
super().in_method_signature and not self.is_partial_body and self.code_model.options["models_mode"] != "dpg"
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def method_location(self) -> ParameterMethodLocation:
|
|
48
|
+
return (
|
|
49
|
+
ParameterMethodLocation.KWARG
|
|
50
|
+
if (self.constant or isinstance(self.type, CombinedType))
|
|
51
|
+
else ParameterMethodLocation.KEYWORD_ONLY
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def from_yaml(cls, yaml_data: Dict[str, Any], code_model: "CodeModel") -> "RequestBuilderBodyParameter":
|
|
56
|
+
return super().from_yaml(yaml_data, code_model) # type: ignore
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def name_in_high_level_operation(self) -> str:
|
|
60
|
+
if self.client_name == "json":
|
|
61
|
+
return "_json"
|
|
62
|
+
return "_content"
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class RequestBuilderParameter(Parameter):
|
|
66
|
+
"""Basic RequestBuilder Parameter."""
|
|
67
|
+
|
|
68
|
+
def __init__(
|
|
69
|
+
self,
|
|
70
|
+
yaml_data: Dict[str, Any],
|
|
71
|
+
code_model: "CodeModel",
|
|
72
|
+
type: BaseType,
|
|
73
|
+
) -> None:
|
|
74
|
+
super().__init__(yaml_data, code_model, type)
|
|
75
|
+
# we don't want any default content type behavior in request builder
|
|
76
|
+
if self.is_content_type:
|
|
77
|
+
self.client_default_value = None
|
|
78
|
+
if self.grouped_by and self.client_name[0] == "_":
|
|
79
|
+
# we don't want hidden parameters for grouped by in request builders
|
|
80
|
+
self.client_name = self.client_name[1:]
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def hide_in_operation_signature(self) -> bool:
|
|
84
|
+
return False
|
|
85
|
+
|
|
86
|
+
@property
|
|
87
|
+
def in_method_signature(self) -> bool:
|
|
88
|
+
if self.grouped_by and not self.in_flattened_body:
|
|
89
|
+
return True
|
|
90
|
+
return super().in_method_signature and not (
|
|
91
|
+
self.location == ParameterLocation.ENDPOINT_PATH or self.in_flattened_body or self.grouper
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def full_client_name(self) -> str:
|
|
96
|
+
return self.client_name
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def method_location(self) -> ParameterMethodLocation:
|
|
100
|
+
super_method_location = super().method_location
|
|
101
|
+
if super_method_location == ParameterMethodLocation.KWARG:
|
|
102
|
+
return super_method_location
|
|
103
|
+
if self.in_overridden and super_method_location == ParameterMethodLocation.KEYWORD_ONLY:
|
|
104
|
+
return ParameterMethodLocation.KWARG
|
|
105
|
+
if self.location != ParameterLocation.PATH:
|
|
106
|
+
return ParameterMethodLocation.KEYWORD_ONLY
|
|
107
|
+
return super_method_location
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def name_in_high_level_operation(self) -> str:
|
|
111
|
+
if self.grouped_by:
|
|
112
|
+
return f"_{self.client_name}"
|
|
113
|
+
if self.implementation == "Client":
|
|
114
|
+
return f"self._config.{self.client_name}"
|
|
115
|
+
return self.client_name
|