@typespec/http-client-python 0.20.3 → 0.22.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 (52) hide show
  1. package/dist/emitter/http.d.ts.map +1 -1
  2. package/dist/emitter/http.js +4 -2
  3. package/dist/emitter/http.js.map +1 -1
  4. package/dist/emitter/types.d.ts.map +1 -1
  5. package/dist/emitter/types.js +9 -1
  6. package/dist/emitter/types.js.map +1 -1
  7. package/emitter/src/http.ts +4 -2
  8. package/emitter/src/types.ts +10 -1
  9. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  10. package/eng/scripts/ci/regenerate.ts +1 -1
  11. package/eng/scripts/setup/__pycache__/package_manager.cpython-311.pyc +0 -0
  12. package/eng/scripts/setup/__pycache__/venvtools.cpython-311.pyc +0 -0
  13. package/generator/build/lib/pygen/codegen/models/__init__.py +2 -0
  14. package/generator/build/lib/pygen/codegen/models/code_model.py +15 -0
  15. package/generator/build/lib/pygen/codegen/models/imports.py +1 -1
  16. package/generator/build/lib/pygen/codegen/models/paging_operation.py +1 -0
  17. package/generator/build/lib/pygen/codegen/models/primitive_types.py +33 -0
  18. package/generator/build/lib/pygen/codegen/models/property.py +1 -0
  19. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +2 -3
  20. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +1 -1
  21. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +29 -11
  22. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +4 -3
  23. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +64 -1
  24. package/generator/build/lib/pygen/codegen/templates/operation_tools.jinja2 +1 -1
  25. package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +4 -1
  26. package/generator/build/lib/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +4 -1
  27. package/generator/build/lib/pygen/codegen/templates/utils.py.jinja2 +5 -4
  28. package/generator/build/lib/pygen/preprocess/__init__.py +23 -12
  29. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  30. package/generator/pygen/codegen/models/__init__.py +2 -0
  31. package/generator/pygen/codegen/models/code_model.py +15 -0
  32. package/generator/pygen/codegen/models/imports.py +1 -1
  33. package/generator/pygen/codegen/models/paging_operation.py +1 -0
  34. package/generator/pygen/codegen/models/primitive_types.py +33 -0
  35. package/generator/pygen/codegen/models/property.py +1 -0
  36. package/generator/pygen/codegen/serializers/builder_serializer.py +2 -3
  37. package/generator/pygen/codegen/serializers/client_serializer.py +1 -1
  38. package/generator/pygen/codegen/serializers/general_serializer.py +29 -11
  39. package/generator/pygen/codegen/serializers/model_serializer.py +4 -3
  40. package/generator/pygen/codegen/templates/model_base.py.jinja2 +64 -1
  41. package/generator/pygen/codegen/templates/operation_tools.jinja2 +1 -1
  42. package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +4 -1
  43. package/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +4 -1
  44. package/generator/pygen/codegen/templates/utils.py.jinja2 +5 -4
  45. package/generator/pygen/preprocess/__init__.py +23 -12
  46. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_next_link_verb_async.py +28 -0
  47. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_next_link_verb.py +27 -0
  48. package/generator/test/azure/mock_api_tests/test_model_base_flatten_compatibility.py +251 -0
  49. package/generator/test/azure/requirements.txt +3 -0
  50. package/generator/test/unbranded/requirements.txt +1 -0
  51. package/generator/test/unittests/test_name_converter.py +1 -1
  52. package/package.json +33 -33
@@ -0,0 +1,251 @@
1
+ # ------------------------------------
2
+ # Copyright (c) Microsoft Corporation.
3
+ # Licensed under the MIT License.
4
+ # ------------------------------------
5
+ import datetime
6
+ from typing import (
7
+ Any,
8
+ Mapping,
9
+ Optional,
10
+ overload,
11
+ )
12
+
13
+ from specs.azure.clientgenerator.core.flattenproperty._utils.model_base import (
14
+ Model,
15
+ rest_field,
16
+ )
17
+ from azure.core.serialization import attribute_list
18
+
19
+
20
+ class ModelProperty(Model):
21
+ """This is a test model."""
22
+
23
+ value: str = rest_field()
24
+ """Required."""
25
+
26
+ @overload
27
+ def __init__(
28
+ self,
29
+ *,
30
+ value: str,
31
+ ) -> None: ...
32
+
33
+ @overload
34
+ def __init__(self, mapping: Mapping[str, Any]) -> None:
35
+ """
36
+ :param mapping: raw JSON to initialize the model.
37
+ :type mapping: Mapping[str, Any]
38
+ """
39
+
40
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
41
+ super().__init__(*args, **kwargs)
42
+
43
+
44
+ class ChildModel(Model):
45
+ """This is the child model to be flattened.
46
+
47
+ :ivar description: Required.
48
+ :vartype description: str
49
+ :ivar age: Required.
50
+ :vartype age: int
51
+ """
52
+
53
+ description: str = rest_field()
54
+ """Required."""
55
+ age: int = rest_field()
56
+ """Required."""
57
+ model_property: "ModelProperty" = rest_field(name="modelProperty")
58
+ """Required."""
59
+ datetime_default: datetime.datetime = rest_field(name="datetimeDefault")
60
+ datetime_rfc3339: datetime.datetime = rest_field(name="datetimeRfc3339", format="rfc3339")
61
+ datetime_rfc7231: datetime.datetime = rest_field(name="datetimeRfc7231", format="rfc7231")
62
+ datetime_unix_timestamp: datetime.datetime = rest_field(name="datetimeUnixTimestamp", format="unix-timestamp")
63
+
64
+ @overload
65
+ def __init__(
66
+ self,
67
+ *,
68
+ description: str,
69
+ age: int,
70
+ model_property: "ModelProperty",
71
+ datetime_default: datetime.datetime,
72
+ datetime_rfc3339: datetime.datetime,
73
+ datetime_rfc7231: datetime.datetime,
74
+ datetime_unix_timestamp: datetime.datetime,
75
+ ) -> None: ...
76
+
77
+ @overload
78
+ def __init__(self, mapping: Mapping[str, Any]) -> None:
79
+ """
80
+ :param mapping: raw JSON to initialize the model.
81
+ :type mapping: Mapping[str, Any]
82
+ """
83
+
84
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
85
+ super().__init__(*args, **kwargs)
86
+
87
+
88
+ class FlattenModel(Model):
89
+ """This is the model with one level of flattening."""
90
+
91
+ name: str = rest_field()
92
+ """Required."""
93
+ properties: "ChildModel" = rest_field()
94
+ """Required."""
95
+
96
+ __flattened_items = [
97
+ "description",
98
+ "age",
99
+ "model_property",
100
+ "datetime_default",
101
+ "datetime_rfc3339",
102
+ "datetime_rfc7231",
103
+ "datetime_unix_timestamp",
104
+ ]
105
+
106
+ @overload
107
+ def __init__(
108
+ self,
109
+ *,
110
+ name: str,
111
+ properties: "ChildModel",
112
+ ) -> None: ...
113
+
114
+ @overload
115
+ def __init__(self, mapping: Mapping[str, Any]) -> None:
116
+ """
117
+ :param mapping: raw JSON to initialize the model.
118
+ :type mapping: Mapping[str, Any]
119
+ """
120
+
121
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
122
+ _flattened_input = {k: kwargs.pop(k) for k in kwargs.keys() & self.__flattened_items}
123
+ super().__init__(*args, **kwargs)
124
+ for k, v in _flattened_input.items():
125
+ setattr(self, k, v)
126
+
127
+ def __getattr__(self, name: str) -> Any:
128
+ if name in self.__flattened_items:
129
+ if self.properties is None:
130
+ return None
131
+ return getattr(self.properties, name)
132
+ raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")
133
+
134
+ def __setattr__(self, key: str, value: Any) -> None:
135
+ if key in self.__flattened_items:
136
+ if self.properties is None:
137
+ self.properties = self._attr_to_rest_field["properties"]._class_type()
138
+ setattr(self.properties, key, value)
139
+ else:
140
+ super().__setattr__(key, value)
141
+
142
+
143
+ def test_model_initialization():
144
+ model = FlattenModel(
145
+ name="test",
146
+ description="a description",
147
+ age=30,
148
+ model_property=ModelProperty(value="test value"),
149
+ datetime_default=datetime.datetime(2023, 1, 12, 0, 0, 0, tzinfo=datetime.timezone.utc),
150
+ datetime_rfc3339=datetime.datetime(2023, 1, 12, 0, 0, 0, tzinfo=datetime.timezone.utc),
151
+ datetime_rfc7231=datetime.datetime(2023, 1, 12, 0, 0, 0, tzinfo=datetime.timezone.utc),
152
+ datetime_unix_timestamp=datetime.datetime(2023, 1, 12, 0, 0, 0, tzinfo=datetime.timezone.utc),
153
+ )
154
+
155
+ assert model.name == "test"
156
+
157
+ assert model.description == "a description"
158
+ assert model.properties.description == "a description"
159
+
160
+ assert model.age == 30
161
+ assert model.properties.age == 30
162
+
163
+ assert model.model_property.value == "test value"
164
+ assert model.properties.model_property == ModelProperty(value="test value")
165
+ assert model.properties.model_property.value == "test value"
166
+
167
+ assert model.datetime_default == datetime.datetime(2023, 1, 12, 0, 0, 0, tzinfo=datetime.timezone.utc)
168
+ assert model.properties.datetime_default == datetime.datetime(2023, 1, 12, 0, 0, 0, tzinfo=datetime.timezone.utc)
169
+ assert model.properties["datetimeDefault"] == "2023-01-12T00:00:00Z"
170
+
171
+ assert model.datetime_rfc3339 == datetime.datetime(2023, 1, 12, 0, 0, 0, tzinfo=datetime.timezone.utc)
172
+ assert model.properties.datetime_rfc3339 == datetime.datetime(2023, 1, 12, 0, 0, 0, tzinfo=datetime.timezone.utc)
173
+ assert model.properties["datetimeRfc3339"] == "2023-01-12T00:00:00Z"
174
+
175
+ assert model.datetime_rfc7231 == datetime.datetime(2023, 1, 12, 0, 0, 0, tzinfo=datetime.timezone.utc)
176
+ assert model.properties.datetime_rfc7231 == datetime.datetime(2023, 1, 12, 0, 0, 0, tzinfo=datetime.timezone.utc)
177
+ assert model.properties["datetimeRfc7231"] == "Thu, 12 Jan 2023 00:00:00 GMT"
178
+
179
+ assert model.datetime_unix_timestamp == datetime.datetime(2023, 1, 12, 0, 0, 0, tzinfo=datetime.timezone.utc)
180
+ assert model.properties.datetime_unix_timestamp == datetime.datetime(
181
+ 2023, 1, 12, 0, 0, 0, tzinfo=datetime.timezone.utc
182
+ )
183
+ assert model.properties["datetimeUnixTimestamp"] == 1673481600
184
+
185
+
186
+ class FlattenModelWithOptionalProperties(Model):
187
+ """This is the model with one level of flattening and optional properties."""
188
+
189
+ name: str = rest_field()
190
+ """Required."""
191
+ properties: Optional["ModelProperty"] = rest_field()
192
+ """Optional."""
193
+
194
+ __flattened_items = ["value"]
195
+
196
+ @overload
197
+ def __init__(
198
+ self,
199
+ *,
200
+ name: str,
201
+ properties: Optional["ModelProperty"],
202
+ ) -> None: ...
203
+
204
+ @overload
205
+ def __init__(self, mapping: Mapping[str, Any]) -> None:
206
+ """
207
+ :param mapping: raw JSON to initialize the model.
208
+ :type mapping: Mapping[str, Any]
209
+ """
210
+
211
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
212
+ _flattened_input = {k: kwargs.pop(k) for k in kwargs.keys() & self.__flattened_items}
213
+ super().__init__(*args, **kwargs)
214
+ for k, v in _flattened_input.items():
215
+ setattr(self, k, v)
216
+
217
+ def __getattr__(self, name: str) -> Any:
218
+ if name in self.__flattened_items:
219
+ if self.properties is None:
220
+ return None
221
+ return getattr(self.properties, name)
222
+ raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")
223
+
224
+ def __setattr__(self, key: str, value: Any) -> None:
225
+ if key in self.__flattened_items:
226
+ if self.properties is None:
227
+ self.properties = self._attr_to_rest_field["properties"]._class_type()
228
+ setattr(self.properties, key, value)
229
+ else:
230
+ super().__setattr__(key, value)
231
+
232
+
233
+ def test_model_with_optional_properties_initialization():
234
+ model = FlattenModelWithOptionalProperties(
235
+ name="test",
236
+ value="test value",
237
+ )
238
+
239
+ assert model.name == "test"
240
+
241
+ assert model.value == "test value"
242
+ assert model.properties.value == "test value"
243
+
244
+
245
+ def test_model_with_optional_properties_attribute_list():
246
+ model = FlattenModelWithOptionalProperties(
247
+ name="test",
248
+ )
249
+
250
+ attrs = attribute_list(model)
251
+ assert sorted(attrs) == sorted(["name", "value"])
@@ -14,6 +14,8 @@ azure-mgmt-core==1.6.0
14
14
  -e ./generated/azure-client-generator-core-usage
15
15
  -e ./generated/azure-client-generator-core-override
16
16
  -e ./generated/azure-client-generator-core-client-location
17
+ -e ./generated/azure-client-generator-core-alternate-type
18
+ -e ./generated/azure-client-generator-core-next-link-verb
17
19
  -e ./generated/azure-core-basic
18
20
  -e ./generated/azure-core-scalar
19
21
  -e ./generated/azure-core-lro-rpc
@@ -52,6 +54,7 @@ azure-mgmt-core==1.6.0
52
54
  -e ./generated/setuppy-authentication-union
53
55
  -e ./generated/encode-duration
54
56
  -e ./generated/encode-numeric
57
+ -e ./generated/encode-array
55
58
  -e ./generated/parameters-basic
56
59
  -e ./generated/parameters-collection-format
57
60
  -e ./generated/parameters-path
@@ -9,6 +9,7 @@
9
9
  -e ./generated/setuppy-authentication-union
10
10
  -e ./generated/encode-duration
11
11
  -e ./generated/encode-numeric
12
+ -e ./generated/encode-array
12
13
  -e ./generated/parameters-basic
13
14
  -e ./generated/parameters-collection-format
14
15
  -e ./generated/parameters-path
@@ -8,7 +8,7 @@ from pygen.preprocess.python_mappings import PadType
8
8
 
9
9
 
10
10
  def pad_reserved_words(name: str, pad_type: PadType) -> str:
11
- return PreProcessPlugin(output_folder="").pad_reserved_words(name, pad_type)
11
+ return PreProcessPlugin(output_folder="").pad_reserved_words(name, pad_type, {})
12
12
 
13
13
 
14
14
  def test_escaped_reserved_words():
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typespec/http-client-python",
3
- "version": "0.20.3",
3
+ "version": "0.22.0",
4
4
  "author": "Microsoft Corporation",
5
5
  "description": "TypeSpec emitter for Python SDKs",
6
6
  "homepage": "https://typespec.io",
@@ -54,20 +54,20 @@
54
54
  "emitter"
55
55
  ],
56
56
  "peerDependencies": {
57
- "@azure-tools/typespec-autorest": ">=0.62.0 <1.0.0",
58
- "@azure-tools/typespec-azure-core": ">=0.62.0 <1.0.0",
59
- "@azure-tools/typespec-azure-resource-manager": ">=0.62.0 <1.0.0",
60
- "@azure-tools/typespec-azure-rulesets": ">=0.62.0 <1.0.0",
61
- "@azure-tools/typespec-client-generator-core": ">=0.62.0 <1.0.0",
62
- "@typespec/compiler": "^1.6.0",
63
- "@typespec/http": "^1.6.0",
64
- "@typespec/openapi": "^1.6.0",
65
- "@typespec/rest": ">=0.76.0 <1.0.0",
66
- "@typespec/versioning": ">=0.76.0 <1.0.0",
67
- "@typespec/events": ">=0.76.0 <1.0.0",
68
- "@typespec/sse": ">=0.76.0 <1.0.0",
69
- "@typespec/streams": ">=0.76.0 <1.0.0",
70
- "@typespec/xml": ">=0.76.0 <1.0.0"
57
+ "@azure-tools/typespec-autorest": ">=0.63.0 <1.0.0",
58
+ "@azure-tools/typespec-azure-core": ">=0.63.0 <1.0.0",
59
+ "@azure-tools/typespec-azure-resource-manager": ">=0.63.0 <1.0.0",
60
+ "@azure-tools/typespec-azure-rulesets": ">=0.63.0 <1.0.0",
61
+ "@azure-tools/typespec-client-generator-core": ">=0.63.0 <1.0.0",
62
+ "@typespec/compiler": "^1.7.0",
63
+ "@typespec/http": "^1.7.0",
64
+ "@typespec/openapi": "^1.7.0",
65
+ "@typespec/rest": ">=0.77.0 <1.0.0",
66
+ "@typespec/versioning": ">=0.77.0 <1.0.0",
67
+ "@typespec/events": ">=0.77.0 <1.0.0",
68
+ "@typespec/sse": ">=0.77.0 <1.0.0",
69
+ "@typespec/streams": ">=0.77.0 <1.0.0",
70
+ "@typespec/xml": ">=0.77.0 <1.0.0"
71
71
  },
72
72
  "dependencies": {
73
73
  "js-yaml": "~4.1.0",
@@ -77,24 +77,24 @@
77
77
  "tsx": "~4.19.1"
78
78
  },
79
79
  "devDependencies": {
80
- "@azure-tools/typespec-autorest": "~0.62.0",
81
- "@azure-tools/typespec-azure-core": "~0.62.0",
82
- "@azure-tools/typespec-azure-resource-manager": "~0.62.0",
83
- "@azure-tools/typespec-azure-rulesets": "~0.62.0",
84
- "@azure-tools/typespec-client-generator-core": "~0.62.0",
85
- "@azure-tools/azure-http-specs": "0.1.0-alpha.32",
86
- "@typespec/compiler": "^1.6.0",
87
- "@typespec/http": "^1.6.0",
88
- "@typespec/openapi": "^1.6.0",
89
- "@typespec/rest": "~0.76.0",
90
- "@typespec/versioning": "~0.76.0",
91
- "@typespec/events": "~0.76.0",
92
- "@typespec/spector": "0.1.0-alpha.20",
93
- "@typespec/spec-api": "0.1.0-alpha.10",
94
- "@typespec/sse": "~0.76.0",
95
- "@typespec/streams": "~0.76.0",
96
- "@typespec/xml": "~0.76.0",
97
- "@typespec/http-specs": "0.1.0-alpha.28",
80
+ "@azure-tools/typespec-autorest": "~0.63.0",
81
+ "@azure-tools/typespec-azure-core": "~0.63.0",
82
+ "@azure-tools/typespec-azure-resource-manager": "~0.63.0",
83
+ "@azure-tools/typespec-azure-rulesets": "~0.63.0",
84
+ "@azure-tools/typespec-client-generator-core": "~0.63.0",
85
+ "@azure-tools/azure-http-specs": "0.1.0-alpha.33",
86
+ "@typespec/compiler": "^1.7.0",
87
+ "@typespec/http": "^1.7.0",
88
+ "@typespec/openapi": "^1.7.0",
89
+ "@typespec/rest": "~0.77.0",
90
+ "@typespec/versioning": "~0.77.0",
91
+ "@typespec/events": "~0.77.0",
92
+ "@typespec/spector": "0.1.0-alpha.21",
93
+ "@typespec/spec-api": "0.1.0-alpha.11",
94
+ "@typespec/sse": "~0.77.0",
95
+ "@typespec/streams": "~0.77.0",
96
+ "@typespec/xml": "~0.77.0",
97
+ "@typespec/http-specs": "0.1.0-alpha.29",
98
98
  "@types/js-yaml": "~4.0.5",
99
99
  "@types/node": "~24.1.0",
100
100
  "@types/semver": "7.5.8",