@azure-tools/typespec-python 0.24.2 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/dist/src/code-model.d.ts.map +1 -1
  2. package/dist/src/code-model.js +1 -4
  3. package/dist/src/code-model.js.map +1 -1
  4. package/dist/src/emitter.d.ts.map +1 -1
  5. package/dist/src/emitter.js +5 -4
  6. package/dist/src/emitter.js.map +1 -1
  7. package/dist/src/external-process.d.ts +0 -9
  8. package/dist/src/external-process.d.ts.map +1 -1
  9. package/dist/src/external-process.js +1 -25
  10. package/dist/src/external-process.js.map +1 -1
  11. package/dist/src/types.d.ts.map +1 -1
  12. package/dist/src/types.js +2 -0
  13. package/dist/src/types.js.map +1 -1
  14. package/generator/LICENSE +21 -0
  15. package/generator/README.md +1 -0
  16. package/generator/dev_requirements.txt +5 -0
  17. package/generator/pygen/__init__.py +107 -0
  18. package/generator/pygen/_version.py +7 -0
  19. package/generator/pygen/black.py +71 -0
  20. package/generator/pygen/codegen/__init__.py +334 -0
  21. package/generator/pygen/codegen/_utils.py +16 -0
  22. package/generator/pygen/codegen/models/__init__.py +202 -0
  23. package/generator/pygen/codegen/models/base.py +186 -0
  24. package/generator/pygen/codegen/models/base_builder.py +119 -0
  25. package/generator/pygen/codegen/models/client.py +429 -0
  26. package/generator/pygen/codegen/models/code_model.py +239 -0
  27. package/generator/pygen/codegen/models/combined_type.py +149 -0
  28. package/generator/pygen/codegen/models/constant_type.py +129 -0
  29. package/generator/pygen/codegen/models/credential_types.py +221 -0
  30. package/generator/pygen/codegen/models/dictionary_type.py +127 -0
  31. package/generator/pygen/codegen/models/enum_type.py +238 -0
  32. package/generator/pygen/codegen/models/imports.py +291 -0
  33. package/generator/pygen/codegen/models/list_type.py +143 -0
  34. package/generator/pygen/codegen/models/lro_operation.py +143 -0
  35. package/generator/pygen/codegen/models/lro_paging_operation.py +32 -0
  36. package/generator/pygen/codegen/models/model_type.py +361 -0
  37. package/generator/pygen/codegen/models/operation.py +518 -0
  38. package/generator/pygen/codegen/models/operation_group.py +184 -0
  39. package/generator/pygen/codegen/models/paging_operation.py +156 -0
  40. package/generator/pygen/codegen/models/parameter.py +402 -0
  41. package/generator/pygen/codegen/models/parameter_list.py +390 -0
  42. package/generator/pygen/codegen/models/primitive_types.py +626 -0
  43. package/generator/pygen/codegen/models/property.py +175 -0
  44. package/generator/pygen/codegen/models/request_builder.py +189 -0
  45. package/generator/pygen/codegen/models/request_builder_parameter.py +115 -0
  46. package/generator/pygen/codegen/models/response.py +348 -0
  47. package/generator/pygen/codegen/models/utils.py +23 -0
  48. package/generator/pygen/codegen/serializers/__init__.py +570 -0
  49. package/generator/pygen/codegen/serializers/base_serializer.py +21 -0
  50. package/generator/pygen/codegen/serializers/builder_serializer.py +1454 -0
  51. package/generator/pygen/codegen/serializers/client_serializer.py +295 -0
  52. package/generator/pygen/codegen/serializers/enum_serializer.py +15 -0
  53. package/generator/pygen/codegen/serializers/general_serializer.py +212 -0
  54. package/generator/pygen/codegen/serializers/import_serializer.py +127 -0
  55. package/generator/pygen/codegen/serializers/metadata_serializer.py +198 -0
  56. package/generator/pygen/codegen/serializers/model_init_serializer.py +33 -0
  57. package/generator/pygen/codegen/serializers/model_serializer.py +287 -0
  58. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +89 -0
  59. package/generator/pygen/codegen/serializers/operations_init_serializer.py +44 -0
  60. package/generator/pygen/codegen/serializers/parameter_serializer.py +221 -0
  61. package/generator/pygen/codegen/serializers/patch_serializer.py +19 -0
  62. package/generator/pygen/codegen/serializers/request_builders_serializer.py +52 -0
  63. package/generator/pygen/codegen/serializers/sample_serializer.py +163 -0
  64. package/generator/pygen/codegen/serializers/test_serializer.py +287 -0
  65. package/generator/pygen/codegen/serializers/types_serializer.py +31 -0
  66. package/generator/pygen/codegen/serializers/utils.py +68 -0
  67. package/generator/pygen/codegen/templates/client.py.jinja2 +37 -0
  68. package/generator/pygen/codegen/templates/client_container.py.jinja2 +12 -0
  69. package/generator/pygen/codegen/templates/config.py.jinja2 +73 -0
  70. package/generator/pygen/codegen/templates/config_container.py.jinja2 +16 -0
  71. package/generator/pygen/codegen/templates/conftest.py.jinja2 +28 -0
  72. package/generator/pygen/codegen/templates/enum.py.jinja2 +13 -0
  73. package/generator/pygen/codegen/templates/enum_container.py.jinja2 +10 -0
  74. package/generator/pygen/codegen/templates/init.py.jinja2 +24 -0
  75. package/generator/pygen/codegen/templates/keywords.jinja2 +19 -0
  76. package/generator/pygen/codegen/templates/lro_operation.py.jinja2 +16 -0
  77. package/generator/pygen/codegen/templates/lro_paging_operation.py.jinja2 +18 -0
  78. package/generator/pygen/codegen/templates/macros.jinja2 +12 -0
  79. package/generator/pygen/codegen/templates/metadata.json.jinja2 +167 -0
  80. package/generator/pygen/codegen/templates/model_base.py.jinja2 +899 -0
  81. package/generator/pygen/codegen/templates/model_container.py.jinja2 +13 -0
  82. package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +92 -0
  83. package/generator/pygen/codegen/templates/model_init.py.jinja2 +28 -0
  84. package/generator/pygen/codegen/templates/model_msrest.py.jinja2 +92 -0
  85. package/generator/pygen/codegen/templates/operation.py.jinja2 +21 -0
  86. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +75 -0
  87. package/generator/pygen/codegen/templates/operation_groups_container.py.jinja2 +20 -0
  88. package/generator/pygen/codegen/templates/operation_tools.jinja2 +74 -0
  89. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +17 -0
  90. package/generator/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +6 -0
  91. package/generator/pygen/codegen/templates/packaging_templates/LICENSE.jinja2 +21 -0
  92. package/generator/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +8 -0
  93. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +107 -0
  94. package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +9 -0
  95. package/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +108 -0
  96. package/generator/pygen/codegen/templates/paging_operation.py.jinja2 +21 -0
  97. package/generator/pygen/codegen/templates/patch.py.jinja2 +19 -0
  98. package/generator/pygen/codegen/templates/pkgutil_init.py.jinja2 +1 -0
  99. package/generator/pygen/codegen/templates/request_builder.py.jinja2 +28 -0
  100. package/generator/pygen/codegen/templates/request_builders.py.jinja2 +10 -0
  101. package/generator/pygen/codegen/templates/rest_init.py.jinja2 +12 -0
  102. package/generator/pygen/codegen/templates/sample.py.jinja2 +44 -0
  103. package/generator/pygen/codegen/templates/serialization.py.jinja2 +2006 -0
  104. package/generator/pygen/codegen/templates/test.py.jinja2 +50 -0
  105. package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +26 -0
  106. package/generator/pygen/codegen/templates/types.py.jinja2 +8 -0
  107. package/generator/pygen/codegen/templates/validation.py.jinja2 +38 -0
  108. package/generator/pygen/codegen/templates/vendor.py.jinja2 +98 -0
  109. package/generator/pygen/codegen/templates/version.py.jinja2 +4 -0
  110. package/generator/pygen/m2r.py +65 -0
  111. package/generator/pygen/postprocess/__init__.py +183 -0
  112. package/generator/pygen/postprocess/get_all.py +19 -0
  113. package/generator/pygen/postprocess/venvtools.py +77 -0
  114. package/generator/pygen/preprocess/__init__.py +503 -0
  115. package/generator/pygen/preprocess/helpers.py +27 -0
  116. package/generator/pygen/preprocess/python_mappings.py +222 -0
  117. package/generator/pygen/utils.py +149 -0
  118. package/generator/pygen.egg-info/PKG-INFO +25 -0
  119. package/generator/pygen.egg-info/SOURCES.txt +66 -0
  120. package/generator/pygen.egg-info/dependency_links.txt +1 -0
  121. package/generator/pygen.egg-info/requires.txt +4 -0
  122. package/generator/pygen.egg-info/top_level.txt +1 -0
  123. package/generator/requirements.txt +12 -0
  124. package/generator/setup.py +55 -0
  125. package/package.json +10 -7
  126. package/scripts/__pycache__/venvtools.cpython-38.pyc +0 -0
  127. package/scripts/install.py +49 -0
  128. package/scripts/prepare.py +38 -0
  129. package/scripts/run-python3.cjs +22 -0
  130. package/scripts/run_tsp.py +40 -0
  131. package/scripts/system-requirements.cjs +180 -0
  132. package/scripts/venvtools.py +81 -0
@@ -0,0 +1,184 @@
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 Dict, List, Any, TYPE_CHECKING
7
+
8
+ from .utils import OrderedSet
9
+
10
+ from .base import BaseModel
11
+ from .operation import get_operation
12
+ from .imports import FileImport, ImportType, TypingSection
13
+ from .utils import add_to_pylint_disable, NAME_LENGTH_LIMIT
14
+ from .lro_operation import LROOperation
15
+ from .lro_paging_operation import LROPagingOperation
16
+
17
+ if TYPE_CHECKING:
18
+ from .code_model import CodeModel
19
+ from .client import Client
20
+ from . import OperationType
21
+
22
+
23
+ class OperationGroup(BaseModel):
24
+ """Represent an operation group."""
25
+
26
+ def __init__(
27
+ self,
28
+ yaml_data: Dict[str, Any],
29
+ code_model: "CodeModel",
30
+ client: "Client",
31
+ operations: List["OperationType"],
32
+ api_versions: List[str],
33
+ ) -> None:
34
+ super().__init__(yaml_data, code_model)
35
+ self.client = client
36
+ self.class_name: str = yaml_data["className"]
37
+ self.identify_name: str = yaml_data["identifyName"]
38
+ self.property_name: str = yaml_data["propertyName"]
39
+ self.operations = operations
40
+ self.api_versions = api_versions
41
+ self.operation_groups: List[OperationGroup] = []
42
+ if self.code_model.options["show_operations"]:
43
+ self.operation_groups = [
44
+ OperationGroup.from_yaml(op_group, code_model, client)
45
+ for op_group in self.yaml_data.get("operationGroups", [])
46
+ ]
47
+ self.link_lro_initial_operations()
48
+
49
+ @property
50
+ def has_abstract_operations(self) -> bool:
51
+ return any(o for o in self.operations if o.abstract) or any(
52
+ operation_group.has_abstract_operations for operation_group in self.operation_groups
53
+ )
54
+
55
+ @property
56
+ def has_non_abstract_operations(self) -> bool:
57
+ return any(o for o in self.operations if not o.abstract) or any(
58
+ operation_group.has_non_abstract_operations for operation_group in self.operation_groups
59
+ )
60
+
61
+ @property
62
+ def base_class(self) -> str:
63
+ base_classes: List[str] = []
64
+ if self.is_mixin:
65
+ base_classes.append(f"{self.client.name}MixinABC")
66
+ return ", ".join(base_classes)
67
+
68
+ def imports_for_multiapi(self, async_mode: bool) -> FileImport:
69
+ file_import = FileImport(self.code_model)
70
+ relative_path = ".." if async_mode else "."
71
+ for operation in self.operations:
72
+ file_import.merge(operation.imports_for_multiapi(async_mode, relative_path=relative_path))
73
+ if (self.code_model.model_types or self.code_model.enums) and self.code_model.options[
74
+ "models_mode"
75
+ ] == "msrest":
76
+ file_import.add_submodule_import(relative_path, "models", ImportType.LOCAL, alias="_models")
77
+ return file_import
78
+
79
+ @property
80
+ def pylint_disable(self) -> str:
81
+ retval: str = ""
82
+ if self.has_abstract_operations:
83
+ retval = add_to_pylint_disable(retval, "abstract-class-instantiated")
84
+ if len(self.operations) > 20:
85
+ retval = add_to_pylint_disable(retval, "too-many-public-methods")
86
+ if len(self.class_name) > NAME_LENGTH_LIMIT:
87
+ retval = add_to_pylint_disable(retval, "name-too-long")
88
+ if len(self.operation_groups) > 6:
89
+ retval = add_to_pylint_disable(retval, "too-many-instance-attributes")
90
+ return retval
91
+
92
+ @property
93
+ def need_validation(self) -> bool:
94
+ """Whether any of its operations need validation"""
95
+ return any(o for o in self.operations if o.need_validation)
96
+
97
+ def imports(self, async_mode: bool) -> FileImport:
98
+ file_import = FileImport(self.code_model)
99
+
100
+ relative_path = ("..." if async_mode else "..") + ("." if self.client.is_subclient else "")
101
+ for operation in self.operations:
102
+ file_import.merge(operation.imports(async_mode, relative_path=relative_path))
103
+ if not self.code_model.options["combine_operation_files"]:
104
+ for og in self.operation_groups:
105
+ file_import.add_submodule_import(
106
+ ".",
107
+ og.class_name,
108
+ ImportType.LOCAL,
109
+ )
110
+ # for multiapi
111
+ if (
112
+ (self.code_model.public_model_types)
113
+ and self.code_model.options["models_mode"] == "msrest"
114
+ and not self.is_mixin
115
+ ):
116
+ file_import.add_submodule_import(relative_path, "models", ImportType.LOCAL, alias="_models")
117
+ if self.code_model.need_mixin_abc:
118
+ file_import.add_submodule_import(".._vendor", f"{self.client.name}MixinABC", ImportType.LOCAL)
119
+ if self.has_abstract_operations:
120
+ file_import.add_submodule_import(".._vendor", "raise_if_not_implemented", ImportType.LOCAL)
121
+ if all(o.abstract for o in self.operations):
122
+ return file_import
123
+ file_import.add_submodule_import("typing", "TypeVar", ImportType.STDLIB, TypingSection.CONDITIONAL)
124
+ file_import.define_mypy_type("T", "TypeVar('T')")
125
+ type_value = "Optional[Callable[[PipelineResponse[HttpRequest, {}HttpResponse], T, Dict[str, Any]], Any]]"
126
+ file_import.define_mypy_type("ClsType", type_value.format(""), type_value.format("Async"))
127
+ return file_import
128
+
129
+ @property
130
+ def filename(self) -> str:
131
+ return self.operations[0].filename
132
+
133
+ @property
134
+ def is_mixin(self) -> bool:
135
+ """The operation group with no name is the direct client methods."""
136
+ return self.identify_name == ""
137
+
138
+ def link_lro_initial_operations(self) -> None:
139
+ """Link each LRO operation to its initial operation"""
140
+ for operation_group in self.operation_groups:
141
+ for operation in operation_group.operations:
142
+ if isinstance(operation, (LROOperation, LROPagingOperation)):
143
+ operation.initial_operation = self.lookup_operation(id(operation.yaml_data["initialOperation"]))
144
+
145
+ def lookup_operation(self, operation_id: int) -> "OperationType":
146
+ try:
147
+ return next(o for og in self.operation_groups for o in og.operations if id(o.yaml_data) == operation_id)
148
+ except StopIteration as exc:
149
+ raise KeyError(f"No operation with id {operation_id} found.") from exc
150
+
151
+ @property
152
+ def lro_operations(self) -> List["OperationType"]:
153
+ return [operation for operation in self.operations if operation.operation_type in ("lro", "lropaging")] + [
154
+ operation for operation_group in self.operation_groups for operation in operation_group.lro_operations
155
+ ]
156
+
157
+ @property
158
+ def has_operations(self) -> bool:
159
+ return any(operation_group.has_operations for operation_group in self.operation_groups) or bool(self.operations)
160
+
161
+ @property
162
+ def has_form_data_body(self) -> bool:
163
+ operations = self.operations + [o for og in self.operation_groups for o in og.operations]
164
+ return any(operation.has_form_data_body for operation in operations)
165
+
166
+ @classmethod
167
+ def from_yaml(
168
+ cls,
169
+ yaml_data: Dict[str, Any],
170
+ code_model: "CodeModel",
171
+ client: "Client",
172
+ ) -> "OperationGroup":
173
+ operations = [get_operation(o, code_model, client) for o in yaml_data["operations"]]
174
+ api_versions: OrderedSet[str] = {}
175
+ for operation in operations:
176
+ for api_version in operation.api_versions:
177
+ api_versions[api_version] = None
178
+ return cls(
179
+ yaml_data=yaml_data,
180
+ code_model=code_model,
181
+ client=client,
182
+ operations=operations,
183
+ api_versions=list(api_versions.keys()),
184
+ )
@@ -0,0 +1,156 @@
1
+ # pylint: disable=multiple-statements
2
+ # -------------------------------------------------------------------------
3
+ # Copyright (c) Microsoft Corporation. All rights reserved.
4
+ # Licensed under the MIT License. See License.txt in the project root for
5
+ # license information.
6
+ # --------------------------------------------------------------------------
7
+ from typing import Dict, List, Any, Optional, Union, TYPE_CHECKING, cast, TypeVar
8
+
9
+ from .operation import Operation, OperationBase
10
+ from .response import PagingResponse, LROPagingResponse, Response
11
+ from .request_builder import (
12
+ OverloadedRequestBuilder,
13
+ RequestBuilder,
14
+ get_request_builder,
15
+ )
16
+ from .imports import ImportType, FileImport, TypingSection
17
+ from .parameter_list import ParameterList
18
+ from .model_type import ModelType
19
+ from .list_type import ListType
20
+
21
+ if TYPE_CHECKING:
22
+ from .code_model import CodeModel
23
+ from .client import Client
24
+
25
+ PagingResponseType = TypeVar("PagingResponseType", bound=Union[PagingResponse, LROPagingResponse])
26
+
27
+
28
+ class PagingOperationBase(OperationBase[PagingResponseType]):
29
+ def __init__(
30
+ self,
31
+ yaml_data: Dict[str, Any],
32
+ code_model: "CodeModel",
33
+ client: "Client",
34
+ name: str,
35
+ request_builder: RequestBuilder,
36
+ parameters: ParameterList,
37
+ responses: List[PagingResponseType],
38
+ exceptions: List[Response],
39
+ *,
40
+ overloads: Optional[List[Operation]] = None,
41
+ override_success_response_to_200: bool = False,
42
+ ) -> None:
43
+ super().__init__(
44
+ code_model=code_model,
45
+ client=client,
46
+ yaml_data=yaml_data,
47
+ name=name,
48
+ request_builder=request_builder,
49
+ parameters=parameters,
50
+ responses=responses,
51
+ exceptions=exceptions,
52
+ overloads=overloads,
53
+ )
54
+ self.next_request_builder: Optional[Union[RequestBuilder, OverloadedRequestBuilder]] = (
55
+ get_request_builder(self.yaml_data["nextOperation"], code_model, client)
56
+ if self.yaml_data.get("nextOperation")
57
+ else None
58
+ )
59
+ self.override_success_response_to_200 = override_success_response_to_200
60
+ self.pager_sync: str = yaml_data.get("pagerSync") or f"{self.code_model.core_library}.paging.ItemPaged"
61
+ self.pager_async: str = yaml_data.get("pagerAsync") or f"{self.code_model.core_library}.paging.AsyncItemPaged"
62
+
63
+ def _get_attr_name(self, wire_name: str) -> str:
64
+ response_type = self.responses[0].type
65
+ if not response_type:
66
+ raise ValueError(f"Can't find a matching property in response for {wire_name}")
67
+ if response_type.type == "list":
68
+ response_type = cast(ListType, response_type).element_type
69
+ try:
70
+ return next(p.client_name for p in cast(ModelType, response_type).properties if p.wire_name == wire_name)
71
+ except StopIteration as exc:
72
+ raise ValueError(f"Can't find a matching property in response for {wire_name}") from exc
73
+
74
+ def get_pager(self, async_mode: bool) -> str:
75
+ return self.responses[0].get_pager(async_mode)
76
+
77
+ @property
78
+ def continuation_token_name(self) -> Optional[str]:
79
+ wire_name = self.yaml_data.get("continuationTokenName")
80
+ if not wire_name:
81
+ # That's an ok scenario, it just means no next page possible
82
+ return None
83
+ if self.code_model.options["models_mode"] == "msrest":
84
+ return self._get_attr_name(wire_name)
85
+ return wire_name
86
+
87
+ @property
88
+ def item_name(self) -> str:
89
+ wire_name = self.yaml_data["itemName"]
90
+ if self.code_model.options["models_mode"] == "msrest":
91
+ # we don't use the paging model for dpg
92
+ return self._get_attr_name(wire_name)
93
+ return wire_name
94
+
95
+ @property
96
+ def item_type(self) -> ModelType:
97
+ try:
98
+ item_type_yaml = self.yaml_data["itemType"]
99
+ except KeyError as e:
100
+ raise ValueError("Only call this for DPG paging model deserialization") from e
101
+ return cast(ModelType, self.code_model.types_map[id(item_type_yaml)])
102
+
103
+ @property
104
+ def operation_type(self) -> str:
105
+ return "paging"
106
+
107
+ def cls_type_annotation(self, *, async_mode: bool) -> str:
108
+ return f"ClsType[{Response.type_annotation(self.responses[0], async_mode=async_mode)}]"
109
+
110
+ def _imports_shared(self, async_mode: bool, **kwargs: Any) -> FileImport:
111
+ file_import = super()._imports_shared(async_mode, **kwargs)
112
+ if async_mode:
113
+ file_import.add_submodule_import("typing", "AsyncIterable", ImportType.STDLIB, TypingSection.CONDITIONAL)
114
+ else:
115
+ file_import.add_submodule_import("typing", "Iterable", ImportType.STDLIB, TypingSection.CONDITIONAL)
116
+ if (
117
+ self.next_request_builder
118
+ and self.code_model.options["builders_visibility"] == "embedded"
119
+ and not async_mode
120
+ ):
121
+ file_import.merge(self.next_request_builder.imports())
122
+ return file_import
123
+
124
+ @property
125
+ def has_optional_return_type(self) -> bool:
126
+ return False
127
+
128
+ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
129
+ if self.abstract:
130
+ return FileImport(self.code_model)
131
+ file_import = self._imports_shared(async_mode, **kwargs)
132
+ file_import.merge(super().imports(async_mode, **kwargs))
133
+ if self.code_model.options["tracing"] and self.want_tracing:
134
+ file_import.add_submodule_import(
135
+ "azure.core.tracing.decorator",
136
+ "distributed_trace",
137
+ ImportType.SDKCORE,
138
+ )
139
+ if self.next_request_builder:
140
+ file_import.merge(self.get_request_builder_import(self.next_request_builder, async_mode))
141
+ elif any(p.is_api_version for p in self.client.parameters):
142
+ file_import.add_import("urllib.parse", ImportType.STDLIB)
143
+ file_import.add_submodule_import(
144
+ "utils",
145
+ "case_insensitive_dict",
146
+ ImportType.SDKCORE,
147
+ )
148
+ if self.code_model.options["models_mode"] == "dpg":
149
+ relative_path = "..." if async_mode else ".."
150
+ file_import.merge(self.item_type.imports(**kwargs))
151
+ if self.default_error_deserialization or any(r.type for r in self.responses):
152
+ file_import.add_submodule_import(f"{relative_path}_model_base", "_deserialize", ImportType.LOCAL)
153
+ return file_import
154
+
155
+
156
+ class PagingOperation(PagingOperationBase[PagingResponse]): ...