@typespec/http-client-python 0.23.1 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/emitter/code-model.d.ts.map +1 -1
- package/dist/emitter/code-model.js +40 -25
- package/dist/emitter/code-model.js.map +1 -1
- package/dist/emitter/http.d.ts +4 -4
- package/dist/emitter/http.d.ts.map +1 -1
- package/dist/emitter/http.js +41 -35
- package/dist/emitter/http.js.map +1 -1
- package/dist/emitter/types.d.ts +1 -1
- package/dist/emitter/types.d.ts.map +1 -1
- package/dist/emitter/types.js +2 -2
- package/dist/emitter/types.js.map +1 -1
- package/dist/emitter/utils.d.ts +2 -2
- package/dist/emitter/utils.d.ts.map +1 -1
- package/dist/emitter/utils.js +7 -6
- package/dist/emitter/utils.js.map +1 -1
- package/emitter/src/code-model.ts +65 -18
- package/emitter/src/http.ts +107 -22
- package/emitter/src/types.ts +2 -1
- package/emitter/src/utils.ts +11 -9
- package/emitter/temp/tsconfig.tsbuildinfo +1 -1
- package/eng/scripts/ci/dev_requirements.txt +3 -3
- package/eng/scripts/ci/pylintrc +1 -1
- package/eng/scripts/ci/regenerate.ts +8 -1
- package/eng/scripts/setup/__pycache__/package_manager.cpython-311.pyc +0 -0
- package/eng/scripts/setup/__pycache__/venvtools.cpython-311.pyc +0 -0
- package/generator/build/lib/pygen/codegen/models/code_model.py +4 -0
- package/generator/build/lib/pygen/codegen/models/enum_type.py +8 -1
- package/generator/build/lib/pygen/codegen/models/list_type.py +6 -2
- package/generator/build/lib/pygen/codegen/models/model_type.py +2 -2
- package/generator/build/lib/pygen/codegen/models/operation.py +10 -1
- package/generator/build/lib/pygen/codegen/models/operation_group.py +3 -1
- package/generator/build/lib/pygen/codegen/models/request_builder.py +20 -3
- package/generator/build/lib/pygen/codegen/models/response.py +2 -2
- package/generator/build/lib/pygen/codegen/models/utils.py +7 -0
- package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +20 -11
- package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +1 -2
- package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +1 -1
- package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +3 -0
- package/generator/build/lib/pygen/codegen/templates/enum.py.jinja2 +3 -1
- package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +10 -7
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/codegen/models/code_model.py +4 -0
- package/generator/pygen/codegen/models/enum_type.py +8 -1
- package/generator/pygen/codegen/models/list_type.py +6 -2
- package/generator/pygen/codegen/models/model_type.py +2 -2
- package/generator/pygen/codegen/models/operation.py +10 -1
- package/generator/pygen/codegen/models/operation_group.py +3 -1
- package/generator/pygen/codegen/models/request_builder.py +20 -3
- package/generator/pygen/codegen/models/response.py +2 -2
- package/generator/pygen/codegen/models/utils.py +7 -0
- package/generator/pygen/codegen/serializers/builder_serializer.py +20 -11
- package/generator/pygen/codegen/serializers/client_serializer.py +1 -2
- package/generator/pygen/codegen/serializers/general_serializer.py +1 -1
- package/generator/pygen/codegen/serializers/model_serializer.py +3 -0
- package/generator/pygen/codegen/templates/enum.py.jinja2 +3 -1
- package/generator/pygen/codegen/templates/model_base.py.jinja2 +10 -7
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_operationtemplates_async.py +17 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_default_value_async.py +46 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_location_async.py +48 -21
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_async.py +110 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_payload_multipart_async.py +33 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_service_multi_service_async.py +31 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_special_words_async.py +18 -0
- package/generator/test/azure/mock_api_tests/test_azure_arm_operationtemplates.py +15 -0
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_default_value.py +42 -0
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_location.py +44 -19
- package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service.py +104 -0
- package/generator/test/azure/mock_api_tests/test_payload_multipart.py +31 -0
- package/generator/test/azure/mock_api_tests/test_service_multi_service.py +29 -0
- package/generator/test/azure/mock_api_tests/test_special_words.py +17 -0
- package/generator/test/azure/requirements.txt +10 -1
- package/generator/test/generic_mock_api_tests/asynctests/test_parameters_query_async.py +18 -0
- package/generator/test/generic_mock_api_tests/test_parameters_query.py +17 -0
- package/generator/test/generic_mock_api_tests/test_typetest_scalar.py +0 -5
- package/generator/test/generic_mock_api_tests/test_typetest_union_discriminated.py +290 -0
- package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_multipart_async.py +33 -0
- package/generator/test/unbranded/mock_api_tests/test_payload_multipart.py +31 -0
- package/generator/test/unbranded/mock_api_tests/test_unbranded.py +8 -3
- package/generator/test/unbranded/requirements.txt +3 -0
- package/generator/test/unittests/test_model_base_serialization.py +66 -0
- package/package.json +33 -33
|
@@ -152,3 +152,36 @@ async def test_complex_with_http_part(client: MultiPartClient):
|
|
|
152
152
|
@pytest.mark.asyncio
|
|
153
153
|
async def test_http_parts_non_string_float(client: MultiPartClient):
|
|
154
154
|
await client.form_data.http_parts.non_string.float(FloatRequest(temperature=0.5))
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
@pytest.mark.asyncio
|
|
158
|
+
async def test_with_wire_name(client: MultiPartClient):
|
|
159
|
+
await client.form_data.with_wire_name(
|
|
160
|
+
models.MultiPartRequestWithWireName(
|
|
161
|
+
identifier="123",
|
|
162
|
+
image=open(str(JPG), "rb"),
|
|
163
|
+
)
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
@pytest.mark.asyncio
|
|
168
|
+
async def test_optional_parts(client: MultiPartClient):
|
|
169
|
+
# First time with only id
|
|
170
|
+
await client.form_data.optional_parts(
|
|
171
|
+
models.MultiPartOptionalRequest(
|
|
172
|
+
id="123",
|
|
173
|
+
)
|
|
174
|
+
)
|
|
175
|
+
# Second time with only profileImage
|
|
176
|
+
await client.form_data.optional_parts(
|
|
177
|
+
models.MultiPartOptionalRequest(
|
|
178
|
+
profile_image=open(str(JPG), "rb"),
|
|
179
|
+
)
|
|
180
|
+
)
|
|
181
|
+
# Third time with both id and profileImage
|
|
182
|
+
await client.form_data.optional_parts(
|
|
183
|
+
models.MultiPartOptionalRequest(
|
|
184
|
+
id="123",
|
|
185
|
+
profile_image=open(str(JPG), "rb"),
|
|
186
|
+
)
|
|
187
|
+
)
|
|
@@ -139,3 +139,34 @@ def test_complex_with_http_part(client: MultiPartClient):
|
|
|
139
139
|
|
|
140
140
|
def test_http_parts_non_string_float(client: MultiPartClient):
|
|
141
141
|
client.form_data.http_parts.non_string.float(FloatRequest(temperature=0.5))
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def test_with_wire_name(client: MultiPartClient):
|
|
145
|
+
client.form_data.with_wire_name(
|
|
146
|
+
models.MultiPartRequestWithWireName(
|
|
147
|
+
identifier="123",
|
|
148
|
+
image=open(str(JPG), "rb"),
|
|
149
|
+
)
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def test_optional_parts(client: MultiPartClient):
|
|
154
|
+
# First time with only id
|
|
155
|
+
client.form_data.optional_parts(
|
|
156
|
+
models.MultiPartOptionalRequest(
|
|
157
|
+
id="123",
|
|
158
|
+
)
|
|
159
|
+
)
|
|
160
|
+
# Second time with only profileImage
|
|
161
|
+
client.form_data.optional_parts(
|
|
162
|
+
models.MultiPartOptionalRequest(
|
|
163
|
+
profile_image=open(str(JPG), "rb"),
|
|
164
|
+
)
|
|
165
|
+
)
|
|
166
|
+
# Third time with both id and profileImage
|
|
167
|
+
client.form_data.optional_parts(
|
|
168
|
+
models.MultiPartOptionalRequest(
|
|
169
|
+
id="123",
|
|
170
|
+
profile_image=open(str(JPG), "rb"),
|
|
171
|
+
)
|
|
172
|
+
)
|
|
@@ -54,6 +54,11 @@ def test_sensitive_word():
|
|
|
54
54
|
check_folder = (Path(os.path.dirname(__file__)) / "../generated").resolve()
|
|
55
55
|
assert [] == check_sensitive_word(check_folder, "azure")
|
|
56
56
|
# after update spector, it shall also equal to []
|
|
57
|
-
assert
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
assert sorted(
|
|
58
|
+
[
|
|
59
|
+
"authentication-oauth2",
|
|
60
|
+
"authentication-noauth-union",
|
|
61
|
+
"authentication-union",
|
|
62
|
+
"setuppy-authentication-union",
|
|
63
|
+
]
|
|
64
|
+
) == sorted(check_sensitive_word(check_folder, "microsoft"))
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
# common test case
|
|
5
5
|
-e ./generated/authentication-api-key
|
|
6
6
|
-e ./generated/authentication-http-custom
|
|
7
|
+
-e ./generated/authentication-noauth-union
|
|
7
8
|
-e ./generated/authentication-oauth2
|
|
8
9
|
-e ./generated/authentication-union
|
|
9
10
|
-e ./generated/setuppy-authentication-union
|
|
@@ -14,6 +15,7 @@
|
|
|
14
15
|
-e ./generated/parameters-basic
|
|
15
16
|
-e ./generated/parameters-collection-format
|
|
16
17
|
-e ./generated/parameters-path
|
|
18
|
+
-e ./generated/parameters-query
|
|
17
19
|
-e ./generated/parameters-spread
|
|
18
20
|
-e ./generated/serialization-encoded-name-json
|
|
19
21
|
-e ./generated/server-endpoint-not-defined
|
|
@@ -40,6 +42,7 @@
|
|
|
40
42
|
-e ./generated/typetest-property-additionalproperties
|
|
41
43
|
-e ./generated/typetest-scalar
|
|
42
44
|
-e ./generated/typetest-union
|
|
45
|
+
-e ./generated/typetest-discriminatedunion
|
|
43
46
|
-e ./generated/typetest-model-empty
|
|
44
47
|
-e ./generated/headasbooleantrue
|
|
45
48
|
-e ./generated/headasbooleanfalse
|
|
@@ -332,6 +332,72 @@ def test_property_is_a_type():
|
|
|
332
332
|
assert fishery.fish.species == fishery.fish["species"] == fishery["fish"]["species"] == "Salmon"
|
|
333
333
|
|
|
334
334
|
|
|
335
|
+
def test_model_initialization():
|
|
336
|
+
class DatetimeModel(Model):
|
|
337
|
+
datetime_value: datetime.datetime = rest_field(name="datetimeValue")
|
|
338
|
+
|
|
339
|
+
@overload
|
|
340
|
+
def __init__(self, *, datetime_value: datetime.datetime): ...
|
|
341
|
+
|
|
342
|
+
@overload
|
|
343
|
+
def __init__(self, mapping: Mapping[str, Any], /): ...
|
|
344
|
+
|
|
345
|
+
def __init__(self, *args, **kwargs):
|
|
346
|
+
super().__init__(*args, **kwargs)
|
|
347
|
+
|
|
348
|
+
val_str = "9999-12-31T23:59:59.999000Z"
|
|
349
|
+
val = isodate.parse_datetime(val_str)
|
|
350
|
+
|
|
351
|
+
# when initialize model with dict, the dict value is shall be serialized value
|
|
352
|
+
model1 = DatetimeModel({"datetimeValue": val_str})
|
|
353
|
+
assert model1["datetimeValue"] == val_str
|
|
354
|
+
assert model1.datetime_value == val
|
|
355
|
+
|
|
356
|
+
# when initialize model with keyword args, the value is deserialized value
|
|
357
|
+
model2 = DatetimeModel(datetime_value=val)
|
|
358
|
+
assert model2["datetimeValue"] == val_str
|
|
359
|
+
assert model2.datetime_value == val
|
|
360
|
+
|
|
361
|
+
# what if we initialize with dict but the dict has deserialized value? this case show what happens.
|
|
362
|
+
# Since we always serialize the value before initializing the model from dict, we could still get correct result
|
|
363
|
+
model3 = DatetimeModel({"datetimeValue": val})
|
|
364
|
+
assert model3["datetimeValue"] == val_str
|
|
365
|
+
assert model3.datetime_value == val
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def test_model_dict_prop_initialization():
|
|
369
|
+
class DatetimeModel(Model):
|
|
370
|
+
dict_prop: dict[str, datetime.datetime] = rest_field(name="dictProp")
|
|
371
|
+
|
|
372
|
+
@overload
|
|
373
|
+
def __init__(self, *, dict_prop: dict[str, datetime.datetime]): ...
|
|
374
|
+
|
|
375
|
+
@overload
|
|
376
|
+
def __init__(self, mapping: Mapping[str, Any], /): ...
|
|
377
|
+
|
|
378
|
+
def __init__(self, *args, **kwargs):
|
|
379
|
+
super().__init__(*args, **kwargs)
|
|
380
|
+
|
|
381
|
+
val_str = "9999-12-31T23:59:59.999000Z"
|
|
382
|
+
val = isodate.parse_datetime(val_str)
|
|
383
|
+
|
|
384
|
+
# when initialize model with dict, the dict value is shall be serialized value
|
|
385
|
+
model1 = DatetimeModel({"dictProp": {"key1": val_str}})
|
|
386
|
+
assert model1["dictProp"] == {"key1": val_str}
|
|
387
|
+
assert model1.dict_prop == {"key1": val}
|
|
388
|
+
|
|
389
|
+
# when initialize model with keyword args, the value is deserialized value
|
|
390
|
+
model2 = DatetimeModel(dict_prop={"key1": val})
|
|
391
|
+
assert model2["dictProp"] == {"key1": val_str}
|
|
392
|
+
assert model2.dict_prop == {"key1": val}
|
|
393
|
+
|
|
394
|
+
# what if we initialize with dict but the dict has deserialized value? this case show what happens.
|
|
395
|
+
# Since we always serialize the value before initializing the model from dict, we could still get correct result
|
|
396
|
+
model3 = DatetimeModel({"dictProp": {"key1": val}})
|
|
397
|
+
assert model3["dictProp"] == {"key1": val_str}
|
|
398
|
+
assert model3.dict_prop == {"key1": val}
|
|
399
|
+
|
|
400
|
+
|
|
335
401
|
def test_datetime_deserialization():
|
|
336
402
|
class DatetimeModel(Model):
|
|
337
403
|
datetime_value: datetime.datetime = rest_field(name="datetimeValue")
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typespec/http-client-python",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.1",
|
|
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.
|
|
58
|
-
"@azure-tools/typespec-azure-core": ">=0.
|
|
59
|
-
"@azure-tools/typespec-azure-resource-manager": ">=0.
|
|
60
|
-
"@azure-tools/typespec-azure-rulesets": ">=0.
|
|
61
|
-
"@azure-tools/typespec-client-generator-core": ">=0.
|
|
62
|
-
"@typespec/compiler": "^1.
|
|
63
|
-
"@typespec/http": "^1.
|
|
64
|
-
"@typespec/openapi": "^1.
|
|
65
|
-
"@typespec/rest": ">=0.
|
|
66
|
-
"@typespec/versioning": ">=0.
|
|
67
|
-
"@typespec/events": ">=0.
|
|
68
|
-
"@typespec/sse": ">=0.
|
|
69
|
-
"@typespec/streams": ">=0.
|
|
70
|
-
"@typespec/xml": ">=0.
|
|
57
|
+
"@azure-tools/typespec-autorest": ">=0.64.0 <1.0.0",
|
|
58
|
+
"@azure-tools/typespec-azure-core": ">=0.64.0 <1.0.0",
|
|
59
|
+
"@azure-tools/typespec-azure-resource-manager": ">=0.64.0 <1.0.0",
|
|
60
|
+
"@azure-tools/typespec-azure-rulesets": ">=0.64.0 <1.0.0",
|
|
61
|
+
"@azure-tools/typespec-client-generator-core": ">=0.64.1 <1.0.0",
|
|
62
|
+
"@typespec/compiler": "^1.8.0",
|
|
63
|
+
"@typespec/http": "^1.8.0",
|
|
64
|
+
"@typespec/openapi": "^1.8.0",
|
|
65
|
+
"@typespec/rest": ">=0.78.0 <1.0.0",
|
|
66
|
+
"@typespec/versioning": ">=0.78.0 <1.0.0",
|
|
67
|
+
"@typespec/events": ">=0.78.0 <1.0.0",
|
|
68
|
+
"@typespec/sse": ">=0.78.0 <1.0.0",
|
|
69
|
+
"@typespec/streams": ">=0.78.0 <1.0.0",
|
|
70
|
+
"@typespec/xml": ">=0.78.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.
|
|
81
|
-
"@azure-tools/typespec-azure-core": "~0.
|
|
82
|
-
"@azure-tools/typespec-azure-resource-manager": "~0.
|
|
83
|
-
"@azure-tools/typespec-azure-rulesets": "~0.
|
|
84
|
-
"@azure-tools/typespec-client-generator-core": "~0.
|
|
85
|
-
"@azure-tools/azure-http-specs": "0.1.0-alpha.
|
|
86
|
-
"@typespec/compiler": "^1.
|
|
87
|
-
"@typespec/http": "^1.
|
|
88
|
-
"@typespec/openapi": "^1.
|
|
89
|
-
"@typespec/rest": "~0.
|
|
90
|
-
"@typespec/versioning": "~0.
|
|
91
|
-
"@typespec/events": "~0.
|
|
92
|
-
"@typespec/spector": "0.1.0-alpha.
|
|
93
|
-
"@typespec/spec-api": "0.1.0-alpha.
|
|
94
|
-
"@typespec/sse": "~0.
|
|
95
|
-
"@typespec/streams": "~0.
|
|
96
|
-
"@typespec/xml": "~0.
|
|
97
|
-
"@typespec/http-specs": "0.1.0-alpha.
|
|
80
|
+
"@azure-tools/typespec-autorest": "~0.64.0",
|
|
81
|
+
"@azure-tools/typespec-azure-core": "~0.64.0",
|
|
82
|
+
"@azure-tools/typespec-azure-resource-manager": "~0.64.0",
|
|
83
|
+
"@azure-tools/typespec-azure-rulesets": "~0.64.0",
|
|
84
|
+
"@azure-tools/typespec-client-generator-core": "~0.64.1",
|
|
85
|
+
"@azure-tools/azure-http-specs": "0.1.0-alpha.35",
|
|
86
|
+
"@typespec/compiler": "^1.8.0",
|
|
87
|
+
"@typespec/http": "^1.8.0",
|
|
88
|
+
"@typespec/openapi": "^1.8.0",
|
|
89
|
+
"@typespec/rest": "~0.78.0",
|
|
90
|
+
"@typespec/versioning": "~0.78.0",
|
|
91
|
+
"@typespec/events": "~0.78.0",
|
|
92
|
+
"@typespec/spector": "0.1.0-alpha.22",
|
|
93
|
+
"@typespec/spec-api": "0.1.0-alpha.12",
|
|
94
|
+
"@typespec/sse": "~0.78.0",
|
|
95
|
+
"@typespec/streams": "~0.78.0",
|
|
96
|
+
"@typespec/xml": "~0.78.0",
|
|
97
|
+
"@typespec/http-specs": "0.1.0-alpha.30",
|
|
98
98
|
"@types/js-yaml": "~4.0.5",
|
|
99
99
|
"@types/node": "~24.1.0",
|
|
100
100
|
"@types/semver": "7.5.8",
|