From 1868f39934933f3decf7c208bfa2012362c20953 Mon Sep 17 00:00:00 2001 From: tadelesh Date: Fri, 11 Apr 2025 16:53:42 +0800 Subject: [PATCH 1/5] python support optional path parameter --- .../http-client-python/emitter/src/http.ts | 14 +++++++++-- .../pygen/codegen/models/parameter.py | 3 +++ .../serializers/parameter_serializer.py | 7 +++++- packages/http-client-python/package-lock.json | 23 +++++++++---------- packages/http-client-python/package.json | 4 ++-- 5 files changed, 34 insertions(+), 17 deletions(-) diff --git a/packages/http-client-python/emitter/src/http.ts b/packages/http-client-python/emitter/src/http.ts index a383d63b66c..00320ca45e3 100644 --- a/packages/http-client-python/emitter/src/http.ts +++ b/packages/http-client-python/emitter/src/http.ts @@ -339,8 +339,18 @@ function emitFlattenedParameter( }; } -function emitHttpPathParameter(context: PythonSdkContext, parameter: SdkPathParameter) { +function emitHttpPathParameter( + context: PythonSdkContext, + parameter: SdkPathParameter, + operation: SdkHttpOperation, +): Record { const base = emitParamBase(context, parameter); + if (parameter.optional && operation.path.includes(`/{${parameter.serializedName}}`)) { + operation.path = operation.path.replace( + `/{${parameter.serializedName}}`, + `{${parameter.serializedName}}`, + ); + } return { ...base, wireName: parameter.serializedName, @@ -410,7 +420,7 @@ function emitHttpParameters( parameters.push(emitHttpQueryParameter(context, parameter, method)); break; case "path": - parameters.push(emitHttpPathParameter(context, parameter)); + parameters.push(emitHttpPathParameter(context, parameter, operation)); break; } } diff --git a/packages/http-client-python/generator/pygen/codegen/models/parameter.py b/packages/http-client-python/generator/pygen/codegen/models/parameter.py index 1805e9d2fb3..5da3d505803 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/parameter.py +++ b/packages/http-client-python/generator/pygen/codegen/models/parameter.py @@ -357,6 +357,9 @@ def method_location( # pylint: disable=too-many-return-statements ) if self.code_model.options["only_path_and_body_params_positional"] and query_or_header: return ParameterMethodLocation.KEYWORD_ONLY + # for optional path parameter, we need to use keyword only + if self.location == ParameterLocation.PATH and self.optional: + return ParameterMethodLocation.KEYWORD_ONLY return ParameterMethodLocation.POSITIONAL @classmethod diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/parameter_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/parameter_serializer.py index 1a94530a0f0..59dcbcff3aa 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/parameter_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/parameter_serializer.py @@ -122,7 +122,12 @@ def serialize_path( retval = ["path_format_arguments = {"] retval.extend( [ - ' "{}": {},'.format( + '{} "{}": {},'.format( + ( + f'"" if {path_parameter.full_client_name} is None else "/" + ' + if path_parameter.optional + else "" + ), path_parameter.wire_name, self.serialize_parameter(path_parameter, serializer_name), ) diff --git a/packages/http-client-python/package-lock.json b/packages/http-client-python/package-lock.json index 9902a8448aa..229d6ac508b 100644 --- a/packages/http-client-python/package-lock.json +++ b/packages/http-client-python/package-lock.json @@ -22,7 +22,7 @@ "@azure-tools/typespec-azure-core": "~0.54.0", "@azure-tools/typespec-azure-resource-manager": "~0.54.0", "@azure-tools/typespec-azure-rulesets": "~0.54.0", - "@azure-tools/typespec-client-generator-core": "~0.54.0", + "@azure-tools/typespec-client-generator-core": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc0NDM3OC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Fazure-tools-typespec-client-generator-core-0.55.0-pr-2520.20250410.3.tgz", "@types/js-yaml": "~4.0.5", "@types/node": "~22.13.14", "@types/semver": "7.5.8", @@ -51,7 +51,7 @@ "@azure-tools/typespec-azure-core": ">=0.54.0 <1.0.0", "@azure-tools/typespec-azure-resource-manager": ">=0.54.0 <1.0.0", "@azure-tools/typespec-azure-rulesets": ">=0.54.0 <1.0.0", - "@azure-tools/typespec-client-generator-core": ">=0.54.0 <1.0.0", + "@azure-tools/typespec-client-generator-core": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc0NDM3OC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Fazure-tools-typespec-client-generator-core-0.55.0-pr-2520.20250410.3.tgz", "@typespec/compiler": "^1.0.0-0", "@typespec/events": ">=0.68.0 <1.0.0", "@typespec/http": "^1.0.0-0", @@ -159,9 +159,8 @@ } }, "node_modules/@azure-tools/typespec-client-generator-core": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.54.0.tgz", - "integrity": "sha512-qZR6FgB+wKfF5aRQtEwjUo6xgw1MomqyFwJf6WL+xstHDs7np3jBja43OCdJaooPzAknYWh2V+Hv77/fLFd9Aw==", + "version": "0.55.0-pr-2520.20250410.3", + "resolved": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc0NDM3OC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Fazure-tools-typespec-client-generator-core-0.55.0-pr-2520.20250410.3.tgz", "dev": true, "license": "MIT", "dependencies": { @@ -173,16 +172,16 @@ "node": ">=20.0.0" }, "peerDependencies": { - "@azure-tools/typespec-azure-core": "^0.54.0", + "@azure-tools/typespec-azure-core": "^0.54.0 || >=0.55.0-0 <0.55.0", "@typespec/compiler": "^1.0.0-rc.0", - "@typespec/events": "^0.68.0", + "@typespec/events": "^0.68.0 || >=0.69.0-0 <0.69.0", "@typespec/http": "^1.0.0-rc.0", "@typespec/openapi": "^1.0.0-rc.0", - "@typespec/rest": "^0.68.0", - "@typespec/sse": "^0.68.0", - "@typespec/streams": "^0.68.0", - "@typespec/versioning": "^0.68.0", - "@typespec/xml": "^0.68.0" + "@typespec/rest": "^0.68.0 || >=0.69.0-0 <0.69.0", + "@typespec/sse": "^0.68.0 || >=0.69.0-0 <0.69.0", + "@typespec/streams": "^0.68.0 || >=0.69.0-0 <0.69.0", + "@typespec/versioning": "^0.68.0 || >=0.69.0-0 <0.69.0", + "@typespec/xml": "^0.68.0 || >=0.69.0-0 <0.69.0" } }, "node_modules/@azure/abort-controller": { diff --git a/packages/http-client-python/package.json b/packages/http-client-python/package.json index 635ebf8d8f6..6bedeba9361 100644 --- a/packages/http-client-python/package.json +++ b/packages/http-client-python/package.json @@ -58,7 +58,7 @@ "@azure-tools/typespec-azure-core": ">=0.54.0 <1.0.0", "@azure-tools/typespec-azure-resource-manager": ">=0.54.0 <1.0.0", "@azure-tools/typespec-azure-rulesets": ">=0.54.0 <1.0.0", - "@azure-tools/typespec-client-generator-core": ">=0.54.0 <1.0.0", + "@azure-tools/typespec-client-generator-core": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc0NDM3OC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Fazure-tools-typespec-client-generator-core-0.55.0-pr-2520.20250410.3.tgz", "@typespec/compiler": "^1.0.0-0", "@typespec/http": "^1.0.0-0", "@typespec/openapi": "^1.0.0-0", @@ -81,7 +81,7 @@ "@azure-tools/typespec-azure-core": "~0.54.0", "@azure-tools/typespec-azure-resource-manager": "~0.54.0", "@azure-tools/typespec-azure-rulesets": "~0.54.0", - "@azure-tools/typespec-client-generator-core": "~0.54.0", + "@azure-tools/typespec-client-generator-core": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc0NDM3OC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Fazure-tools-typespec-client-generator-core-0.55.0-pr-2520.20250410.3.tgz", "@azure-tools/azure-http-specs": "0.1.0-alpha.13", "@typespec/compiler": "^1.0.0-0", "@typespec/http": "^1.0.0-0", From dd279d56a5780c1de263fd97fc684daddc450534 Mon Sep 17 00:00:00 2001 From: tadelesh Date: Mon, 14 Apr 2025 13:23:31 +0800 Subject: [PATCH 2/5] refine impl --- .../serializers/parameter_serializer.py | 11 +++-- .../generator/test/azure/requirements.txt | 1 + .../asynctests/test_parameters_path_async.py | 24 +++++++++++ .../test_parameters_path.py | 22 ++++++++++ .../generator/test/unbranded/requirements.txt | 1 + packages/http-client-python/package-lock.json | 40 +++++++++---------- packages/http-client-python/package.json | 6 +-- 7 files changed, 76 insertions(+), 29 deletions(-) create mode 100644 packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_parameters_path_async.py create mode 100644 packages/http-client-python/generator/test/generic_mock_api_tests/test_parameters_path.py diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/parameter_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/parameter_serializer.py index 59dcbcff3aa..4aab6eae268 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/parameter_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/parameter_serializer.py @@ -122,14 +122,13 @@ def serialize_path( retval = ["path_format_arguments = {"] retval.extend( [ - '{} "{}": {},'.format( + ' "{}": {},'.format( + path_parameter.wire_name, ( - f'"" if {path_parameter.full_client_name} is None else "/" + ' - if path_parameter.optional - else "" + f'"" if {path_parameter.full_client_name} is None else "/" + {self.serialize_parameter(path_parameter, serializer_name)}' + if path_parameter.optional and isinstance(path_parameter, RequestBuilderParameter) + else self.serialize_parameter(path_parameter, serializer_name) ), - path_parameter.wire_name, - self.serialize_parameter(path_parameter, serializer_name), ) for path_parameter in parameters ] diff --git a/packages/http-client-python/generator/test/azure/requirements.txt b/packages/http-client-python/generator/test/azure/requirements.txt index 38c0d829c97..d71d61f18fd 100644 --- a/packages/http-client-python/generator/test/azure/requirements.txt +++ b/packages/http-client-python/generator/test/azure/requirements.txt @@ -38,6 +38,7 @@ azure-mgmt-core==1.3.2 -e ./generated/encode-numeric -e ./generated/parameters-basic -e ./generated/parameters-collection-format +-e ./generated/parameters-path -e ./generated/parameters-spread -e ./generated/serialization-encoded-name-json -e ./generated/server-endpoint-not-defined diff --git a/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_parameters_path_async.py b/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_parameters_path_async.py new file mode 100644 index 00000000000..eeef36a301a --- /dev/null +++ b/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_parameters_path_async.py @@ -0,0 +1,24 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import pytest +from parameters.path.aio import PathClient + + +@pytest.fixture +async def client(): + async with PathClient() as client: + yield client + + +@pytest.mark.asyncio +async def test_normal(client: PathClient): + await client.normal("foo") + + +@pytest.mark.asyncio +async def test_optional(client: PathClient): + await client.optional() + await client.optional(name="foo") diff --git a/packages/http-client-python/generator/test/generic_mock_api_tests/test_parameters_path.py b/packages/http-client-python/generator/test/generic_mock_api_tests/test_parameters_path.py new file mode 100644 index 00000000000..71c6257e67f --- /dev/null +++ b/packages/http-client-python/generator/test/generic_mock_api_tests/test_parameters_path.py @@ -0,0 +1,22 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import pytest +from parameters.path import PathClient + + +@pytest.fixture +def client(): + with PathClient() as client: + yield client + + +def test_normal(client: PathClient): + client.normal("foo") + + +def test_optional(client: PathClient): + client.optional() + client.optional(name="foo") diff --git a/packages/http-client-python/generator/test/unbranded/requirements.txt b/packages/http-client-python/generator/test/unbranded/requirements.txt index 3f8717118f4..28bc785caf9 100644 --- a/packages/http-client-python/generator/test/unbranded/requirements.txt +++ b/packages/http-client-python/generator/test/unbranded/requirements.txt @@ -10,6 +10,7 @@ -e ./generated/encode-numeric -e ./generated/parameters-basic -e ./generated/parameters-collection-format +-e ./generated/parameters-path -e ./generated/parameters-spread -e ./generated/serialization-encoded-name-json -e ./generated/server-endpoint-not-defined diff --git a/packages/http-client-python/package-lock.json b/packages/http-client-python/package-lock.json index 229d6ac508b..f76817915d6 100644 --- a/packages/http-client-python/package-lock.json +++ b/packages/http-client-python/package-lock.json @@ -22,14 +22,14 @@ "@azure-tools/typespec-azure-core": "~0.54.0", "@azure-tools/typespec-azure-resource-manager": "~0.54.0", "@azure-tools/typespec-azure-rulesets": "~0.54.0", - "@azure-tools/typespec-client-generator-core": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc0NDM3OC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Fazure-tools-typespec-client-generator-core-0.55.0-pr-2520.20250410.3.tgz", + "@azure-tools/typespec-client-generator-core": "0.55.0-dev.5", "@types/js-yaml": "~4.0.5", "@types/node": "~22.13.14", "@types/semver": "7.5.8", "@typespec/compiler": "^1.0.0-0", "@typespec/events": "~0.68.0", "@typespec/http": "^1.0.0-0", - "@typespec/http-specs": "0.1.0-alpha.17", + "@typespec/http-specs": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc1NTQyOC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Ftypespec-http-specs-0.1.0-alpha.18-pr-6943.20250413.10.tgz", "@typespec/openapi": "^1.0.0-0", "@typespec/rest": "~0.68.0", "@typespec/sse": "~0.68.0", @@ -51,7 +51,7 @@ "@azure-tools/typespec-azure-core": ">=0.54.0 <1.0.0", "@azure-tools/typespec-azure-resource-manager": ">=0.54.0 <1.0.0", "@azure-tools/typespec-azure-rulesets": ">=0.54.0 <1.0.0", - "@azure-tools/typespec-client-generator-core": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc0NDM3OC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Fazure-tools-typespec-client-generator-core-0.55.0-pr-2520.20250410.3.tgz", + "@azure-tools/typespec-client-generator-core": "0.55.0-dev.5", "@typespec/compiler": "^1.0.0-0", "@typespec/events": ">=0.68.0 <1.0.0", "@typespec/http": "^1.0.0-0", @@ -159,8 +159,9 @@ } }, "node_modules/@azure-tools/typespec-client-generator-core": { - "version": "0.55.0-pr-2520.20250410.3", - "resolved": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc0NDM3OC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Fazure-tools-typespec-client-generator-core-0.55.0-pr-2520.20250410.3.tgz", + "version": "0.55.0-dev.5", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.55.0-dev.5.tgz", + "integrity": "sha512-FBcTHwceHs8EriA4P44/XRhhDuHxRgKnPgbDuxJ3u7VfM3wbkrEfK0X14PR6vzFUbr1FGdp4wmtucATZBflBrg==", "dev": true, "license": "MIT", "dependencies": { @@ -172,16 +173,16 @@ "node": ">=20.0.0" }, "peerDependencies": { - "@azure-tools/typespec-azure-core": "^0.54.0 || >=0.55.0-0 <0.55.0", + "@azure-tools/typespec-azure-core": "^0.54.0 || >=0.55.0-dev <0.55.0", "@typespec/compiler": "^1.0.0-rc.0", - "@typespec/events": "^0.68.0 || >=0.69.0-0 <0.69.0", + "@typespec/events": "^0.68.0 || >=0.69.0-dev <0.69.0", "@typespec/http": "^1.0.0-rc.0", "@typespec/openapi": "^1.0.0-rc.0", - "@typespec/rest": "^0.68.0 || >=0.69.0-0 <0.69.0", - "@typespec/sse": "^0.68.0 || >=0.69.0-0 <0.69.0", - "@typespec/streams": "^0.68.0 || >=0.69.0-0 <0.69.0", - "@typespec/versioning": "^0.68.0 || >=0.69.0-0 <0.69.0", - "@typespec/xml": "^0.68.0 || >=0.69.0-0 <0.69.0" + "@typespec/rest": "^0.68.0 || >=0.69.0-dev <0.69.0", + "@typespec/sse": "^0.68.0 || >=0.69.0-dev <0.69.0", + "@typespec/streams": "^0.68.0 || >=0.69.0-dev <0.69.0", + "@typespec/versioning": "^0.68.0 || >=0.69.0-dev <0.69.0", + "@typespec/xml": "^0.68.0 || >=0.69.0-dev <0.69.0" } }, "node_modules/@azure/abort-controller": { @@ -2189,14 +2190,13 @@ } }, "node_modules/@typespec/http-specs": { - "version": "0.1.0-alpha.17", - "resolved": "https://registry.npmjs.org/@typespec/http-specs/-/http-specs-0.1.0-alpha.17.tgz", - "integrity": "sha512-nwifWlVfq5vDpfrLufaRAOw+vT9owBU9qlrJ2wtrki8Y5dognGnFwi7pEz23KgbySL3x/WmtwY6x40kSH4tHlg==", + "version": "0.1.0-alpha.18-pr-6943.20250413.10", + "resolved": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc1NTQyOC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Ftypespec-http-specs-0.1.0-alpha.18-pr-6943.20250413.10.tgz", "dev": true, "license": "MIT", "dependencies": { - "@typespec/spec-api": "^0.1.0-alpha.3", - "@typespec/spector": "^0.1.0-alpha.10", + "@typespec/spec-api": "^0.1.0-alpha.3 || >=0.1.0-alpha.4-0 <0.1.0-alpha.4", + "@typespec/spector": "^0.1.0-alpha.11 || >=0.1.0-alpha.12-0 <0.1.0-alpha.12", "deep-equal": "^2.2.0" }, "engines": { @@ -2205,9 +2205,9 @@ "peerDependencies": { "@typespec/compiler": "^1.0.0-rc.0", "@typespec/http": "^1.0.0-rc.0", - "@typespec/rest": "^0.68.0", - "@typespec/versioning": "^0.68.0", - "@typespec/xml": "^0.68.0" + "@typespec/rest": "^0.68.0 || >=0.69.0-0 <0.69.0", + "@typespec/versioning": "^0.68.0 || >=0.69.0-0 <0.69.0", + "@typespec/xml": "^0.68.0 || >=0.69.0-0 <0.69.0" } }, "node_modules/@typespec/openapi": { diff --git a/packages/http-client-python/package.json b/packages/http-client-python/package.json index 6bedeba9361..fff50c6004e 100644 --- a/packages/http-client-python/package.json +++ b/packages/http-client-python/package.json @@ -58,7 +58,7 @@ "@azure-tools/typespec-azure-core": ">=0.54.0 <1.0.0", "@azure-tools/typespec-azure-resource-manager": ">=0.54.0 <1.0.0", "@azure-tools/typespec-azure-rulesets": ">=0.54.0 <1.0.0", - "@azure-tools/typespec-client-generator-core": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc0NDM3OC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Fazure-tools-typespec-client-generator-core-0.55.0-pr-2520.20250410.3.tgz", + "@azure-tools/typespec-client-generator-core": "0.55.0-dev.5", "@typespec/compiler": "^1.0.0-0", "@typespec/http": "^1.0.0-0", "@typespec/openapi": "^1.0.0-0", @@ -81,7 +81,7 @@ "@azure-tools/typespec-azure-core": "~0.54.0", "@azure-tools/typespec-azure-resource-manager": "~0.54.0", "@azure-tools/typespec-azure-rulesets": "~0.54.0", - "@azure-tools/typespec-client-generator-core": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc0NDM3OC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Fazure-tools-typespec-client-generator-core-0.55.0-pr-2520.20250410.3.tgz", + "@azure-tools/typespec-client-generator-core": "0.55.0-dev.5", "@azure-tools/azure-http-specs": "0.1.0-alpha.13", "@typespec/compiler": "^1.0.0-0", "@typespec/http": "^1.0.0-0", @@ -92,7 +92,7 @@ "@typespec/sse": "~0.68.0", "@typespec/streams": "~0.68.0", "@typespec/xml": "~0.68.0", - "@typespec/http-specs": "0.1.0-alpha.17", + "@typespec/http-specs": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc1NTQyOC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Ftypespec-http-specs-0.1.0-alpha.18-pr-6943.20250413.10.tgz", "@types/js-yaml": "~4.0.5", "@types/node": "~22.13.14", "@types/semver": "7.5.8", From b2fe74a4fc535fd7eba94b390f1324fe2b2575d1 Mon Sep 17 00:00:00 2001 From: tadelesh Date: Fri, 18 Apr 2025 10:35:44 +0800 Subject: [PATCH 3/5] update dep --- packages/http-client-python/package-lock.json | 41 ++++++++++--------- packages/http-client-python/package.json | 6 +-- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/packages/http-client-python/package-lock.json b/packages/http-client-python/package-lock.json index f76817915d6..95d19fc7e49 100644 --- a/packages/http-client-python/package-lock.json +++ b/packages/http-client-python/package-lock.json @@ -22,14 +22,14 @@ "@azure-tools/typespec-azure-core": "~0.54.0", "@azure-tools/typespec-azure-resource-manager": "~0.54.0", "@azure-tools/typespec-azure-rulesets": "~0.54.0", - "@azure-tools/typespec-client-generator-core": "0.55.0-dev.5", + "@azure-tools/typespec-client-generator-core": "~0.54.1", "@types/js-yaml": "~4.0.5", "@types/node": "~22.13.14", "@types/semver": "7.5.8", "@typespec/compiler": "^1.0.0-0", "@typespec/events": "~0.68.0", "@typespec/http": "^1.0.0-0", - "@typespec/http-specs": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc1NTQyOC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Ftypespec-http-specs-0.1.0-alpha.18-pr-6943.20250413.10.tgz", + "@typespec/http-specs": "0.1.0-alpha.19", "@typespec/openapi": "^1.0.0-0", "@typespec/rest": "~0.68.0", "@typespec/sse": "~0.68.0", @@ -51,7 +51,7 @@ "@azure-tools/typespec-azure-core": ">=0.54.0 <1.0.0", "@azure-tools/typespec-azure-resource-manager": ">=0.54.0 <1.0.0", "@azure-tools/typespec-azure-rulesets": ">=0.54.0 <1.0.0", - "@azure-tools/typespec-client-generator-core": "0.55.0-dev.5", + "@azure-tools/typespec-client-generator-core": ">=0.54.1 <1.0.0", "@typespec/compiler": "^1.0.0-0", "@typespec/events": ">=0.68.0 <1.0.0", "@typespec/http": "^1.0.0-0", @@ -159,9 +159,9 @@ } }, "node_modules/@azure-tools/typespec-client-generator-core": { - "version": "0.55.0-dev.5", - "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.55.0-dev.5.tgz", - "integrity": "sha512-FBcTHwceHs8EriA4P44/XRhhDuHxRgKnPgbDuxJ3u7VfM3wbkrEfK0X14PR6vzFUbr1FGdp4wmtucATZBflBrg==", + "version": "0.54.1", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.54.1.tgz", + "integrity": "sha512-S14D5B9Qm+ORoznC0eY/hlEkvMP1mwGIbudAZWnsG/mp46iB9ooBMARPIAMq61otwuTyoA7SOm0dlqBeGoq6Mg==", "dev": true, "license": "MIT", "dependencies": { @@ -173,16 +173,16 @@ "node": ">=20.0.0" }, "peerDependencies": { - "@azure-tools/typespec-azure-core": "^0.54.0 || >=0.55.0-dev <0.55.0", + "@azure-tools/typespec-azure-core": "^0.54.0", "@typespec/compiler": "^1.0.0-rc.0", - "@typespec/events": "^0.68.0 || >=0.69.0-dev <0.69.0", + "@typespec/events": "^0.68.0", "@typespec/http": "^1.0.0-rc.0", "@typespec/openapi": "^1.0.0-rc.0", - "@typespec/rest": "^0.68.0 || >=0.69.0-dev <0.69.0", - "@typespec/sse": "^0.68.0 || >=0.69.0-dev <0.69.0", - "@typespec/streams": "^0.68.0 || >=0.69.0-dev <0.69.0", - "@typespec/versioning": "^0.68.0 || >=0.69.0-dev <0.69.0", - "@typespec/xml": "^0.68.0 || >=0.69.0-dev <0.69.0" + "@typespec/rest": "^0.68.0", + "@typespec/sse": "^0.68.0", + "@typespec/streams": "^0.68.0", + "@typespec/versioning": "^0.68.0", + "@typespec/xml": "^0.68.0" } }, "node_modules/@azure/abort-controller": { @@ -2190,13 +2190,14 @@ } }, "node_modules/@typespec/http-specs": { - "version": "0.1.0-alpha.18-pr-6943.20250413.10", - "resolved": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc1NTQyOC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Ftypespec-http-specs-0.1.0-alpha.18-pr-6943.20250413.10.tgz", + "version": "0.1.0-alpha.19", + "resolved": "https://registry.npmjs.org/@typespec/http-specs/-/http-specs-0.1.0-alpha.19.tgz", + "integrity": "sha512-kx3uOAQT3xJCYGuloVGG9kvDCKzw1SjYsqONFCm1BII06DCbDfkp1M/yrol/uGwNK3N23ITPC/rgErW8rtYRQg==", "dev": true, "license": "MIT", "dependencies": { - "@typespec/spec-api": "^0.1.0-alpha.3 || >=0.1.0-alpha.4-0 <0.1.0-alpha.4", - "@typespec/spector": "^0.1.0-alpha.11 || >=0.1.0-alpha.12-0 <0.1.0-alpha.12", + "@typespec/spec-api": "^0.1.0-alpha.4", + "@typespec/spector": "^0.1.0-alpha.12", "deep-equal": "^2.2.0" }, "engines": { @@ -2205,9 +2206,9 @@ "peerDependencies": { "@typespec/compiler": "^1.0.0-rc.0", "@typespec/http": "^1.0.0-rc.0", - "@typespec/rest": "^0.68.0 || >=0.69.0-0 <0.69.0", - "@typespec/versioning": "^0.68.0 || >=0.69.0-0 <0.69.0", - "@typespec/xml": "^0.68.0 || >=0.69.0-0 <0.69.0" + "@typespec/rest": "^0.68.0", + "@typespec/versioning": "^0.68.0", + "@typespec/xml": "^0.68.0" } }, "node_modules/@typespec/openapi": { diff --git a/packages/http-client-python/package.json b/packages/http-client-python/package.json index fff50c6004e..5c4fede58ab 100644 --- a/packages/http-client-python/package.json +++ b/packages/http-client-python/package.json @@ -58,7 +58,7 @@ "@azure-tools/typespec-azure-core": ">=0.54.0 <1.0.0", "@azure-tools/typespec-azure-resource-manager": ">=0.54.0 <1.0.0", "@azure-tools/typespec-azure-rulesets": ">=0.54.0 <1.0.0", - "@azure-tools/typespec-client-generator-core": "0.55.0-dev.5", + "@azure-tools/typespec-client-generator-core": ">=0.54.1 <1.0.0", "@typespec/compiler": "^1.0.0-0", "@typespec/http": "^1.0.0-0", "@typespec/openapi": "^1.0.0-0", @@ -81,7 +81,7 @@ "@azure-tools/typespec-azure-core": "~0.54.0", "@azure-tools/typespec-azure-resource-manager": "~0.54.0", "@azure-tools/typespec-azure-rulesets": "~0.54.0", - "@azure-tools/typespec-client-generator-core": "0.55.0-dev.5", + "@azure-tools/typespec-client-generator-core": "~0.54.1", "@azure-tools/azure-http-specs": "0.1.0-alpha.13", "@typespec/compiler": "^1.0.0-0", "@typespec/http": "^1.0.0-0", @@ -92,7 +92,7 @@ "@typespec/sse": "~0.68.0", "@typespec/streams": "~0.68.0", "@typespec/xml": "~0.68.0", - "@typespec/http-specs": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNDc1NTQyOC9hcnRpZmFjdE5hbWUvcGFja2FnZXM1/content?format=file&subPath=%2Ftypespec-http-specs-0.1.0-alpha.18-pr-6943.20250413.10.tgz", + "@typespec/http-specs": "0.1.0-alpha.19", "@types/js-yaml": "~4.0.5", "@types/node": "~22.13.14", "@types/semver": "7.5.8", From e564fe92ad6a508134ddf867b6b3b52f30e04208 Mon Sep 17 00:00:00 2001 From: tadelesh Date: Fri, 18 Apr 2025 10:47:45 +0800 Subject: [PATCH 4/5] lint and changeset --- .../changes/python-optional_path-2025-3-18-10-47-35.md | 7 +++++++ .../pygen/codegen/serializers/parameter_serializer.py | 1 + 2 files changed, 8 insertions(+) create mode 100644 .chronus/changes/python-optional_path-2025-3-18-10-47-35.md diff --git a/.chronus/changes/python-optional_path-2025-3-18-10-47-35.md b/.chronus/changes/python-optional_path-2025-3-18-10-47-35.md new file mode 100644 index 00000000000..dd1a35bf036 --- /dev/null +++ b/.chronus/changes/python-optional_path-2025-3-18-10-47-35.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@typespec/http-client-python" +--- + +Support optional path parameter. \ No newline at end of file diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/parameter_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/parameter_serializer.py index 4aab6eae268..2915c791f7d 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/parameter_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/parameter_serializer.py @@ -109,6 +109,7 @@ def serialize_parameter(self, parameter: ParameterType, serializer_name: str) -> return f"[{serialize_line} if q is not None else '' for q in {origin_name}]" return serialize_line + # pylint: disable=line-too-long def serialize_path( self, parameters: Union[ From 5a16833814076e26a19878dbee5e1b4a3cf22484 Mon Sep 17 00:00:00 2001 From: tadelesh Date: Fri, 18 Apr 2025 11:35:57 +0800 Subject: [PATCH 5/5] update --- .../asynctests/test_payload_json_merge_patch_async.py | 2 +- .../generic_mock_api_tests/test_payload_json_merge_patch.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_payload_json_merge_patch_async.py b/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_payload_json_merge_patch_async.py index 601a64482b3..e276944be33 100644 --- a/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_payload_json_merge_patch_async.py +++ b/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_payload_json_merge_patch_async.py @@ -28,7 +28,7 @@ async def test_create_resource(client: JsonMergePatchClient): map={"key": inner_madge}, array=[inner_madge], int_value=1, - float_value=1.1, + float_value=1.25, inner_model=inner_madge, int_array=[1, 2, 3], ) diff --git a/packages/http-client-python/generator/test/generic_mock_api_tests/test_payload_json_merge_patch.py b/packages/http-client-python/generator/test/generic_mock_api_tests/test_payload_json_merge_patch.py index af0a9afea8c..d4dcbedc036 100644 --- a/packages/http-client-python/generator/test/generic_mock_api_tests/test_payload_json_merge_patch.py +++ b/packages/http-client-python/generator/test/generic_mock_api_tests/test_payload_json_merge_patch.py @@ -27,7 +27,7 @@ def test_create_resource(client: JsonMergePatchClient): map={"key": inner_madge}, array=[inner_madge], int_value=1, - float_value=1.1, + float_value=1.25, inner_model=inner_madge, int_array=[1, 2, 3], )