@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.
Files changed (143) hide show
  1. package/dist/emitter/code-model.d.ts.map +1 -1
  2. package/dist/emitter/code-model.js +10 -7
  3. package/dist/emitter/code-model.js.map +1 -1
  4. package/dist/emitter/emitter.d.ts.map +1 -1
  5. package/dist/emitter/emitter.js +4 -1
  6. package/dist/emitter/emitter.js.map +1 -1
  7. package/dist/emitter/lib.d.ts +1 -0
  8. package/dist/emitter/lib.d.ts.map +1 -1
  9. package/dist/emitter/lib.js +1 -0
  10. package/dist/emitter/lib.js.map +1 -1
  11. package/dist/emitter/types.d.ts.map +1 -1
  12. package/dist/emitter/types.js +7 -4
  13. package/dist/emitter/types.js.map +1 -1
  14. package/dist/emitter/utils.d.ts +1 -0
  15. package/dist/emitter/utils.d.ts.map +1 -1
  16. package/dist/emitter/utils.js +19 -0
  17. package/dist/emitter/utils.js.map +1 -1
  18. package/emitter/src/code-model.ts +16 -6
  19. package/emitter/src/emitter.ts +4 -1
  20. package/emitter/src/lib.ts +4 -0
  21. package/emitter/src/types.ts +16 -4
  22. package/emitter/src/utils.ts +27 -0
  23. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  24. package/eng/scripts/ci/regenerate.ts +7 -0
  25. package/eng/scripts/setup/__pycache__/venvtools.cpython-38.pyc +0 -0
  26. package/generator/build/lib/pygen/black.py +2 -2
  27. package/generator/build/lib/pygen/codegen/__init__.py +2 -0
  28. package/generator/build/lib/pygen/codegen/_utils.py +4 -0
  29. package/generator/build/lib/pygen/codegen/models/base.py +2 -3
  30. package/generator/build/lib/pygen/codegen/models/base_builder.py +5 -3
  31. package/generator/build/lib/pygen/codegen/models/client.py +28 -19
  32. package/generator/build/lib/pygen/codegen/models/code_model.py +200 -33
  33. package/generator/build/lib/pygen/codegen/models/combined_type.py +8 -5
  34. package/generator/build/lib/pygen/codegen/models/constant_type.py +2 -3
  35. package/generator/build/lib/pygen/codegen/models/credential_types.py +1 -2
  36. package/generator/build/lib/pygen/codegen/models/dictionary_type.py +2 -3
  37. package/generator/build/lib/pygen/codegen/models/enum_type.py +47 -24
  38. package/generator/build/lib/pygen/codegen/models/imports.py +14 -12
  39. package/generator/build/lib/pygen/codegen/models/list_type.py +2 -3
  40. package/generator/build/lib/pygen/codegen/models/lro_operation.py +8 -4
  41. package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +2 -2
  42. package/generator/build/lib/pygen/codegen/models/model_type.py +34 -19
  43. package/generator/build/lib/pygen/codegen/models/operation.py +66 -29
  44. package/generator/build/lib/pygen/codegen/models/operation_group.py +56 -11
  45. package/generator/build/lib/pygen/codegen/models/paging_operation.py +9 -6
  46. package/generator/build/lib/pygen/codegen/models/parameter.py +10 -10
  47. package/generator/build/lib/pygen/codegen/models/parameter_list.py +7 -7
  48. package/generator/build/lib/pygen/codegen/models/primitive_types.py +23 -43
  49. package/generator/build/lib/pygen/codegen/models/property.py +7 -7
  50. package/generator/build/lib/pygen/codegen/models/request_builder.py +9 -15
  51. package/generator/build/lib/pygen/codegen/models/response.py +6 -8
  52. package/generator/build/lib/pygen/codegen/models/utils.py +11 -0
  53. package/generator/build/lib/pygen/codegen/serializers/__init__.py +201 -242
  54. package/generator/build/lib/pygen/codegen/serializers/base_serializer.py +19 -1
  55. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +53 -35
  56. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +9 -5
  57. package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +17 -3
  58. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +26 -14
  59. package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +26 -8
  60. package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +9 -4
  61. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +62 -22
  62. package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +19 -16
  63. package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +5 -10
  64. package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +10 -7
  65. package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +10 -1
  66. package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +7 -10
  67. package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +24 -28
  68. package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +6 -1
  69. package/generator/build/lib/pygen/codegen/serializers/utils.py +1 -15
  70. package/generator/build/lib/pygen/codegen/templates/client_container.py.jinja2 +1 -1
  71. package/generator/build/lib/pygen/codegen/templates/config_container.py.jinja2 +1 -1
  72. package/generator/build/lib/pygen/codegen/templates/enum_container.py.jinja2 +1 -1
  73. package/generator/build/lib/pygen/codegen/templates/init.py.jinja2 +1 -1
  74. package/generator/build/lib/pygen/codegen/templates/model_container.py.jinja2 +1 -1
  75. package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -4
  76. package/generator/build/lib/pygen/codegen/templates/test.py.jinja2 +3 -3
  77. package/generator/build/lib/pygen/codegen/templates/testpreparer.py.jinja2 +2 -2
  78. package/generator/build/lib/pygen/codegen/templates/vendor.py.jinja2 +4 -4
  79. package/generator/build/lib/pygen/preprocess/__init__.py +0 -4
  80. package/generator/dev_requirements.txt +2 -2
  81. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  82. package/generator/pygen/black.py +2 -2
  83. package/generator/pygen/codegen/__init__.py +2 -0
  84. package/generator/pygen/codegen/_utils.py +4 -0
  85. package/generator/pygen/codegen/models/base.py +2 -3
  86. package/generator/pygen/codegen/models/base_builder.py +5 -3
  87. package/generator/pygen/codegen/models/client.py +28 -19
  88. package/generator/pygen/codegen/models/code_model.py +200 -33
  89. package/generator/pygen/codegen/models/combined_type.py +8 -5
  90. package/generator/pygen/codegen/models/constant_type.py +2 -3
  91. package/generator/pygen/codegen/models/credential_types.py +1 -2
  92. package/generator/pygen/codegen/models/dictionary_type.py +2 -3
  93. package/generator/pygen/codegen/models/enum_type.py +47 -24
  94. package/generator/pygen/codegen/models/imports.py +14 -12
  95. package/generator/pygen/codegen/models/list_type.py +2 -3
  96. package/generator/pygen/codegen/models/lro_operation.py +8 -4
  97. package/generator/pygen/codegen/models/lro_paging_operation.py +2 -2
  98. package/generator/pygen/codegen/models/model_type.py +34 -19
  99. package/generator/pygen/codegen/models/operation.py +66 -29
  100. package/generator/pygen/codegen/models/operation_group.py +56 -11
  101. package/generator/pygen/codegen/models/paging_operation.py +9 -6
  102. package/generator/pygen/codegen/models/parameter.py +10 -10
  103. package/generator/pygen/codegen/models/parameter_list.py +7 -7
  104. package/generator/pygen/codegen/models/primitive_types.py +23 -43
  105. package/generator/pygen/codegen/models/property.py +7 -7
  106. package/generator/pygen/codegen/models/request_builder.py +9 -15
  107. package/generator/pygen/codegen/models/response.py +6 -8
  108. package/generator/pygen/codegen/models/utils.py +11 -0
  109. package/generator/pygen/codegen/serializers/__init__.py +201 -242
  110. package/generator/pygen/codegen/serializers/base_serializer.py +19 -1
  111. package/generator/pygen/codegen/serializers/builder_serializer.py +53 -35
  112. package/generator/pygen/codegen/serializers/client_serializer.py +9 -5
  113. package/generator/pygen/codegen/serializers/enum_serializer.py +17 -3
  114. package/generator/pygen/codegen/serializers/general_serializer.py +26 -14
  115. package/generator/pygen/codegen/serializers/metadata_serializer.py +26 -8
  116. package/generator/pygen/codegen/serializers/model_init_serializer.py +9 -4
  117. package/generator/pygen/codegen/serializers/model_serializer.py +62 -22
  118. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +19 -16
  119. package/generator/pygen/codegen/serializers/operations_init_serializer.py +5 -10
  120. package/generator/pygen/codegen/serializers/parameter_serializer.py +10 -7
  121. package/generator/pygen/codegen/serializers/request_builders_serializer.py +10 -1
  122. package/generator/pygen/codegen/serializers/sample_serializer.py +7 -10
  123. package/generator/pygen/codegen/serializers/test_serializer.py +24 -28
  124. package/generator/pygen/codegen/serializers/types_serializer.py +6 -1
  125. package/generator/pygen/codegen/serializers/utils.py +1 -15
  126. package/generator/pygen/codegen/templates/client_container.py.jinja2 +1 -1
  127. package/generator/pygen/codegen/templates/config_container.py.jinja2 +1 -1
  128. package/generator/pygen/codegen/templates/enum_container.py.jinja2 +1 -1
  129. package/generator/pygen/codegen/templates/init.py.jinja2 +1 -1
  130. package/generator/pygen/codegen/templates/model_container.py.jinja2 +1 -1
  131. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -4
  132. package/generator/pygen/codegen/templates/test.py.jinja2 +3 -3
  133. package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +2 -2
  134. package/generator/pygen/codegen/templates/vendor.py.jinja2 +4 -4
  135. package/generator/pygen/preprocess/__init__.py +0 -4
  136. package/generator/test/azure/mock_api_tests/asynctests/test_client_namespace_async.py +31 -0
  137. package/generator/test/azure/mock_api_tests/test_client_namespace.py +29 -0
  138. package/generator/test/azure/mock_api_tests/test_resiliency_srv_driven_async.py +1 -0
  139. package/generator/test/azure/requirements.txt +3 -2
  140. package/generator/test/azure/tox.ini +2 -2
  141. package/generator/test/unbranded/requirements.txt +2 -2
  142. package/generator/test/unbranded/tox.ini +2 -2
  143. 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, relative_path=relative_path))
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
- relative_path = ("..." if async_mode else "..") + ("." if self.client.is_subclient else "")
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, relative_path=relative_path))
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(relative_path, "models", ImportType.LOCAL, alias="_models")
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(".._vendor", f"{self.client.name}MixinABC", ImportType.LOCAL)
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(".._vendor", "raise_if_not_implemented", ImportType.LOCAL)
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(self.get_request_builder_import(self.next_request_builder, async_mode))
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 = "..." if async_mode else ".."
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(f"{relative_path}_model_base", "_deserialize", ImportType.LOCAL)
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
- @property
159
- def serialization_type(self) -> str:
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, **_: Any) -> FileImport:
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
- f"{'.' if async_mode else ''}.._validation",
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
- "..." if async_mode else "..",
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
- relative_path = "..." if async_mode else ".."
275
+ serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace)
276
276
  file_import.add_submodule_import(
277
- f"{relative_path}_vendor",
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
- @property
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
- @property
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
- operation = kwargs.get("operation")
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
- @property
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
- @property
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
- @property
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
- @property
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
- @property
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
- @property
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
- @property
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
- @property
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
- @property
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
- @property
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
- @property
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
- @property
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
- @property
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
- @property
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
- relative_path = "..." if kwargs.get("async_mode") else ".."
650
- file_import.add_submodule_import(f"{relative_path}_vendor", self.name, ImportType.LOCAL)
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
- @property
80
- def serialization_type(self) -> str:
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, relative_path="..", model_typing=True))
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
- ".._model_base",
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, List["RequestBuilder"]]):
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[List["RequestBuilder"]] = None,
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: List["RequestBuilder"] = overloads or []
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, relative_path=relative_path, operation=self))
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
- relative_path=(
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
- @property
33
- def serialization_type(self) -> str:
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
- @property
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
- async_mode = kwargs.get("async_mode", False)
121
+ serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace)
124
122
  file_import.add_submodule_import(
125
- "..." if async_mode else "..",
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"