@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.
Files changed (81) hide show
  1. package/dist/emitter/code-model.d.ts.map +1 -1
  2. package/dist/emitter/code-model.js +40 -25
  3. package/dist/emitter/code-model.js.map +1 -1
  4. package/dist/emitter/http.d.ts +4 -4
  5. package/dist/emitter/http.d.ts.map +1 -1
  6. package/dist/emitter/http.js +41 -35
  7. package/dist/emitter/http.js.map +1 -1
  8. package/dist/emitter/types.d.ts +1 -1
  9. package/dist/emitter/types.d.ts.map +1 -1
  10. package/dist/emitter/types.js +2 -2
  11. package/dist/emitter/types.js.map +1 -1
  12. package/dist/emitter/utils.d.ts +2 -2
  13. package/dist/emitter/utils.d.ts.map +1 -1
  14. package/dist/emitter/utils.js +7 -6
  15. package/dist/emitter/utils.js.map +1 -1
  16. package/emitter/src/code-model.ts +65 -18
  17. package/emitter/src/http.ts +107 -22
  18. package/emitter/src/types.ts +2 -1
  19. package/emitter/src/utils.ts +11 -9
  20. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  21. package/eng/scripts/ci/dev_requirements.txt +3 -3
  22. package/eng/scripts/ci/pylintrc +1 -1
  23. package/eng/scripts/ci/regenerate.ts +8 -1
  24. package/eng/scripts/setup/__pycache__/package_manager.cpython-311.pyc +0 -0
  25. package/eng/scripts/setup/__pycache__/venvtools.cpython-311.pyc +0 -0
  26. package/generator/build/lib/pygen/codegen/models/code_model.py +4 -0
  27. package/generator/build/lib/pygen/codegen/models/enum_type.py +8 -1
  28. package/generator/build/lib/pygen/codegen/models/list_type.py +6 -2
  29. package/generator/build/lib/pygen/codegen/models/model_type.py +2 -2
  30. package/generator/build/lib/pygen/codegen/models/operation.py +10 -1
  31. package/generator/build/lib/pygen/codegen/models/operation_group.py +3 -1
  32. package/generator/build/lib/pygen/codegen/models/request_builder.py +20 -3
  33. package/generator/build/lib/pygen/codegen/models/response.py +2 -2
  34. package/generator/build/lib/pygen/codegen/models/utils.py +7 -0
  35. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +20 -11
  36. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +1 -2
  37. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +1 -1
  38. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +3 -0
  39. package/generator/build/lib/pygen/codegen/templates/enum.py.jinja2 +3 -1
  40. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +10 -7
  41. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  42. package/generator/pygen/codegen/models/code_model.py +4 -0
  43. package/generator/pygen/codegen/models/enum_type.py +8 -1
  44. package/generator/pygen/codegen/models/list_type.py +6 -2
  45. package/generator/pygen/codegen/models/model_type.py +2 -2
  46. package/generator/pygen/codegen/models/operation.py +10 -1
  47. package/generator/pygen/codegen/models/operation_group.py +3 -1
  48. package/generator/pygen/codegen/models/request_builder.py +20 -3
  49. package/generator/pygen/codegen/models/response.py +2 -2
  50. package/generator/pygen/codegen/models/utils.py +7 -0
  51. package/generator/pygen/codegen/serializers/builder_serializer.py +20 -11
  52. package/generator/pygen/codegen/serializers/client_serializer.py +1 -2
  53. package/generator/pygen/codegen/serializers/general_serializer.py +1 -1
  54. package/generator/pygen/codegen/serializers/model_serializer.py +3 -0
  55. package/generator/pygen/codegen/templates/enum.py.jinja2 +3 -1
  56. package/generator/pygen/codegen/templates/model_base.py.jinja2 +10 -7
  57. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_operationtemplates_async.py +17 -0
  58. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_default_value_async.py +46 -0
  59. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_location_async.py +48 -21
  60. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_async.py +110 -0
  61. package/generator/test/azure/mock_api_tests/asynctests/test_payload_multipart_async.py +33 -0
  62. package/generator/test/azure/mock_api_tests/asynctests/test_service_multi_service_async.py +31 -0
  63. package/generator/test/azure/mock_api_tests/asynctests/test_special_words_async.py +18 -0
  64. package/generator/test/azure/mock_api_tests/test_azure_arm_operationtemplates.py +15 -0
  65. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_default_value.py +42 -0
  66. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_location.py +44 -19
  67. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service.py +104 -0
  68. package/generator/test/azure/mock_api_tests/test_payload_multipart.py +31 -0
  69. package/generator/test/azure/mock_api_tests/test_service_multi_service.py +29 -0
  70. package/generator/test/azure/mock_api_tests/test_special_words.py +17 -0
  71. package/generator/test/azure/requirements.txt +10 -1
  72. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_query_async.py +18 -0
  73. package/generator/test/generic_mock_api_tests/test_parameters_query.py +17 -0
  74. package/generator/test/generic_mock_api_tests/test_typetest_scalar.py +0 -5
  75. package/generator/test/generic_mock_api_tests/test_typetest_union_discriminated.py +290 -0
  76. package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_multipart_async.py +33 -0
  77. package/generator/test/unbranded/mock_api_tests/test_payload_multipart.py +31 -0
  78. package/generator/test/unbranded/mock_api_tests/test_unbranded.py +8 -3
  79. package/generator/test/unbranded/requirements.txt +3 -0
  80. package/generator/test/unittests/test_model_base_serialization.py +66 -0
  81. 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 ["authentication-oauth2", "authentication-union", "setuppy-authentication-union"] == check_sensitive_word(
58
- check_folder, "microsoft"
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.23.1",
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.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"
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.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",
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",