@typespec/http-client-python 0.4.4 → 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.
Files changed (137) hide show
  1. package/dist/emitter/emitter.d.ts.map +1 -1
  2. package/dist/emitter/emitter.js +85 -24
  3. package/dist/emitter/emitter.js.map +1 -1
  4. package/dist/emitter/lib.d.ts +1 -0
  5. package/dist/emitter/lib.d.ts.map +1 -1
  6. package/dist/emitter/lib.js +1 -0
  7. package/dist/emitter/lib.js.map +1 -1
  8. package/dist/emitter/run-python3.d.ts +2 -0
  9. package/dist/emitter/run-python3.d.ts.map +1 -0
  10. package/dist/emitter/run-python3.js +19 -0
  11. package/dist/emitter/run-python3.js.map +1 -0
  12. package/dist/emitter/system-requirements.d.ts +17 -0
  13. package/dist/emitter/system-requirements.d.ts.map +1 -0
  14. package/dist/emitter/system-requirements.js +167 -0
  15. package/dist/emitter/system-requirements.js.map +1 -0
  16. package/emitter/src/emitter.ts +88 -23
  17. package/emitter/src/lib.ts +2 -0
  18. package/emitter/src/run-python3.ts +20 -0
  19. package/emitter/src/system-requirements.ts +261 -0
  20. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  21. package/eng/scripts/ci/regenerate.ts +16 -4
  22. package/eng/scripts/setup/__pycache__/venvtools.cpython-38.pyc +0 -0
  23. package/eng/scripts/setup/build.ts +16 -0
  24. package/eng/scripts/setup/build_pygen_wheel.py +40 -0
  25. package/eng/scripts/setup/install.py +9 -3
  26. package/eng/scripts/setup/install.ts +32 -0
  27. package/eng/scripts/setup/prepare.py +3 -1
  28. package/eng/scripts/setup/prepare.ts +11 -0
  29. package/eng/scripts/setup/run-python3.ts +1 -6
  30. package/generator/build/lib/pygen/__init__.py +107 -0
  31. package/generator/build/lib/pygen/_version.py +7 -0
  32. package/generator/build/lib/pygen/black.py +71 -0
  33. package/generator/build/lib/pygen/codegen/__init__.py +357 -0
  34. package/generator/build/lib/pygen/codegen/_utils.py +17 -0
  35. package/generator/build/lib/pygen/codegen/models/__init__.py +204 -0
  36. package/generator/build/lib/pygen/codegen/models/base.py +186 -0
  37. package/generator/build/lib/pygen/codegen/models/base_builder.py +118 -0
  38. package/generator/build/lib/pygen/codegen/models/client.py +435 -0
  39. package/generator/build/lib/pygen/codegen/models/code_model.py +237 -0
  40. package/generator/build/lib/pygen/codegen/models/combined_type.py +149 -0
  41. package/generator/build/lib/pygen/codegen/models/constant_type.py +129 -0
  42. package/generator/build/lib/pygen/codegen/models/credential_types.py +214 -0
  43. package/generator/build/lib/pygen/codegen/models/dictionary_type.py +127 -0
  44. package/generator/build/lib/pygen/codegen/models/enum_type.py +238 -0
  45. package/generator/build/lib/pygen/codegen/models/imports.py +291 -0
  46. package/generator/build/lib/pygen/codegen/models/list_type.py +143 -0
  47. package/generator/build/lib/pygen/codegen/models/lro_operation.py +142 -0
  48. package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +32 -0
  49. package/generator/build/lib/pygen/codegen/models/model_type.py +357 -0
  50. package/generator/build/lib/pygen/codegen/models/operation.py +509 -0
  51. package/generator/build/lib/pygen/codegen/models/operation_group.py +184 -0
  52. package/generator/build/lib/pygen/codegen/models/paging_operation.py +155 -0
  53. package/generator/build/lib/pygen/codegen/models/parameter.py +412 -0
  54. package/generator/build/lib/pygen/codegen/models/parameter_list.py +387 -0
  55. package/generator/build/lib/pygen/codegen/models/primitive_types.py +659 -0
  56. package/generator/build/lib/pygen/codegen/models/property.py +170 -0
  57. package/generator/build/lib/pygen/codegen/models/request_builder.py +189 -0
  58. package/generator/build/lib/pygen/codegen/models/request_builder_parameter.py +115 -0
  59. package/generator/build/lib/pygen/codegen/models/response.py +348 -0
  60. package/generator/build/lib/pygen/codegen/models/utils.py +21 -0
  61. package/generator/build/lib/pygen/codegen/serializers/__init__.py +574 -0
  62. package/generator/build/lib/pygen/codegen/serializers/base_serializer.py +21 -0
  63. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +1533 -0
  64. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +294 -0
  65. package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +15 -0
  66. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +213 -0
  67. package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +126 -0
  68. package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +198 -0
  69. package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +33 -0
  70. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +335 -0
  71. package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +89 -0
  72. package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +44 -0
  73. package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +221 -0
  74. package/generator/build/lib/pygen/codegen/serializers/patch_serializer.py +19 -0
  75. package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +52 -0
  76. package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +168 -0
  77. package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +292 -0
  78. package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +31 -0
  79. package/generator/build/lib/pygen/codegen/serializers/utils.py +68 -0
  80. package/generator/build/lib/pygen/codegen/templates/client.py.jinja2 +37 -0
  81. package/generator/build/lib/pygen/codegen/templates/client_container.py.jinja2 +12 -0
  82. package/generator/build/lib/pygen/codegen/templates/config.py.jinja2 +73 -0
  83. package/generator/build/lib/pygen/codegen/templates/config_container.py.jinja2 +16 -0
  84. package/generator/build/lib/pygen/codegen/templates/conftest.py.jinja2 +28 -0
  85. package/generator/build/lib/pygen/codegen/templates/enum.py.jinja2 +13 -0
  86. package/generator/build/lib/pygen/codegen/templates/enum_container.py.jinja2 +10 -0
  87. package/generator/build/lib/pygen/codegen/templates/init.py.jinja2 +24 -0
  88. package/generator/build/lib/pygen/codegen/templates/keywords.jinja2 +27 -0
  89. package/generator/build/lib/pygen/codegen/templates/lro_operation.py.jinja2 +16 -0
  90. package/generator/build/lib/pygen/codegen/templates/lro_paging_operation.py.jinja2 +18 -0
  91. package/generator/build/lib/pygen/codegen/templates/macros.jinja2 +12 -0
  92. package/generator/build/lib/pygen/codegen/templates/metadata.json.jinja2 +167 -0
  93. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +1174 -0
  94. package/generator/build/lib/pygen/codegen/templates/model_container.py.jinja2 +15 -0
  95. package/generator/build/lib/pygen/codegen/templates/model_dpg.py.jinja2 +97 -0
  96. package/generator/build/lib/pygen/codegen/templates/model_init.py.jinja2 +33 -0
  97. package/generator/build/lib/pygen/codegen/templates/model_msrest.py.jinja2 +92 -0
  98. package/generator/build/lib/pygen/codegen/templates/operation.py.jinja2 +21 -0
  99. package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +75 -0
  100. package/generator/build/lib/pygen/codegen/templates/operation_groups_container.py.jinja2 +19 -0
  101. package/generator/build/lib/pygen/codegen/templates/operation_tools.jinja2 +81 -0
  102. package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +17 -0
  103. package/generator/build/lib/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +6 -0
  104. package/generator/build/lib/pygen/codegen/templates/packaging_templates/LICENSE.jinja2 +21 -0
  105. package/generator/build/lib/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +8 -0
  106. package/generator/build/lib/pygen/codegen/templates/packaging_templates/README.md.jinja2 +107 -0
  107. package/generator/build/lib/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +9 -0
  108. package/generator/build/lib/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +108 -0
  109. package/generator/build/lib/pygen/codegen/templates/paging_operation.py.jinja2 +21 -0
  110. package/generator/build/lib/pygen/codegen/templates/patch.py.jinja2 +19 -0
  111. package/generator/build/lib/pygen/codegen/templates/pkgutil_init.py.jinja2 +1 -0
  112. package/generator/build/lib/pygen/codegen/templates/request_builder.py.jinja2 +28 -0
  113. package/generator/build/lib/pygen/codegen/templates/request_builders.py.jinja2 +10 -0
  114. package/generator/build/lib/pygen/codegen/templates/rest_init.py.jinja2 +12 -0
  115. package/generator/build/lib/pygen/codegen/templates/sample.py.jinja2 +44 -0
  116. package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +2117 -0
  117. package/generator/build/lib/pygen/codegen/templates/test.py.jinja2 +50 -0
  118. package/generator/build/lib/pygen/codegen/templates/testpreparer.py.jinja2 +26 -0
  119. package/generator/build/lib/pygen/codegen/templates/types.py.jinja2 +7 -0
  120. package/generator/build/lib/pygen/codegen/templates/validation.py.jinja2 +38 -0
  121. package/generator/build/lib/pygen/codegen/templates/vendor.py.jinja2 +96 -0
  122. package/generator/build/lib/pygen/codegen/templates/version.py.jinja2 +4 -0
  123. package/generator/build/lib/pygen/m2r.py +65 -0
  124. package/generator/build/lib/pygen/preprocess/__init__.py +515 -0
  125. package/generator/build/lib/pygen/preprocess/helpers.py +27 -0
  126. package/generator/build/lib/pygen/preprocess/python_mappings.py +226 -0
  127. package/generator/build/lib/pygen/utils.py +163 -0
  128. package/generator/component-detection-pip-report.json +134 -0
  129. package/generator/dev_requirements.txt +0 -1
  130. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  131. package/generator/pygen.egg-info/PKG-INFO +7 -4
  132. package/generator/pygen.egg-info/requires.txt +7 -4
  133. package/generator/requirements.txt +5 -10
  134. package/generator/setup.py +7 -4
  135. package/generator/test/azure/requirements.txt +1 -1
  136. package/generator/test/unbranded/requirements.txt +1 -1
  137. 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