diff --git a/.chronus/changes/python-etagMatchCondition-2026-04-27-13-33-08.md b/.chronus/changes/python-etagMatchCondition-2026-04-27-13-33-08.md new file mode 100644 index 0000000000..0d0d01b0f8 --- /dev/null +++ b/.chronus/changes/python-etagMatchCondition-2026-04-27-13-33-08.md @@ -0,0 +1,8 @@ +--- +changeKind: fix +packages: + - "@autorest/python" + - "@azure-tools/typespec-python" +--- + +Support custom wire names for etags defined with `Azure.Core.eTag` (e.g. `x-ms-blob-if-match`) diff --git a/.chronus/changes/python-fix-azure-spec-detection-2026-3-29-12-59-39.md b/.chronus/changes/python-fix-azure-spec-detection-2026-3-29-12-59-39.md new file mode 100644 index 0000000000..8b3e509929 --- /dev/null +++ b/.chronus/changes/python-fix-azure-spec-detection-2026-3-29-12-59-39.md @@ -0,0 +1,8 @@ +--- +changeKind: internal +packages: + - "@autorest/python" + - "@azure-tools/typespec-python" +--- + +Consolidate regenerate-common.ts into regenerate.ts and fix azure spec detection using azure-http-specs path check \ No newline at end of file diff --git a/.chronus/changes/python-module-loading-2026-3-29-14-53-8.md b/.chronus/changes/python-module-loading-2026-3-29-14-53-8.md new file mode 100644 index 0000000000..4825347f3b --- /dev/null +++ b/.chronus/changes/python-module-loading-2026-3-29-14-53-8.md @@ -0,0 +1,8 @@ +--- +changeKind: fix +packages: + - "@autorest/python" + - "@azure-tools/typespec-python" +--- + +Update Python emitter browser behavior to only load Pyodide once instead of on every emit diff --git a/packages/autorest.python/package.json b/packages/autorest.python/package.json index 4230d517fa..bd2fccfc21 100644 --- a/packages/autorest.python/package.json +++ b/packages/autorest.python/package.json @@ -29,7 +29,7 @@ }, "homepage": "https://github.com/Azure/autorest.python/blob/main/README.md", "dependencies": { - "@typespec/http-client-python": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIyNTU3My9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz", + "@typespec/http-client-python": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIzNTE1OC9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz", "@autorest/system-requirements": "~1.0.2", "fs-extra": "~11.2.0", "tsx": "^4.21.0" diff --git a/packages/typespec-python/package.json b/packages/typespec-python/package.json index f98a367616..d13c65f42b 100644 --- a/packages/typespec-python/package.json +++ b/packages/typespec-python/package.json @@ -65,7 +65,7 @@ "@typespec/xml": ">=0.81.0 <1.0.0" }, "dependencies": { - "@typespec/http-client-python": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIyNTU3My9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz", + "@typespec/http-client-python": "https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIzNTE1OC9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz", "fs-extra": "~11.2.0", "js-yaml": "~4.1.0", "semver": "~7.6.2", diff --git a/packages/typespec-python/tests/generated/azure/special-headers-conditional-request/specialheaders/conditionalrequest/_operations/_operations.py b/packages/typespec-python/tests/generated/azure/special-headers-conditional-request/specialheaders/conditionalrequest/_operations/_operations.py index 1f39544c60..1bd7534e74 100644 --- a/packages/typespec-python/tests/generated/azure/special-headers-conditional-request/specialheaders/conditionalrequest/_operations/_operations.py +++ b/packages/typespec-python/tests/generated/azure/special-headers-conditional-request/specialheaders/conditionalrequest/_operations/_operations.py @@ -49,7 +49,7 @@ def build_conditional_request_post_if_match_request( # pylint: disable=name-too _headers["If-Match"] = _SERIALIZER.header("if_match", if_match, "str") if_none_match = prep_if_none_match(etag, match_condition) if if_none_match is not None: - _headers["If-None-Match"] = _SERIALIZER.header("if_none_match", if_none_match, "str") + _headers["if-none-match"] = _SERIALIZER.header("if_none_match", if_none_match, "str") return HttpRequest(method="POST", url=_url, headers=_headers, **kwargs) @@ -65,7 +65,7 @@ def build_conditional_request_post_if_none_match_request( # pylint: disable=nam # Construct headers if_match = prep_if_match(etag, match_condition) if if_match is not None: - _headers["If-Match"] = _SERIALIZER.header("if_match", if_match, "str") + _headers["if-match"] = _SERIALIZER.header("if_match", if_match, "str") if_none_match = prep_if_none_match(etag, match_condition) if if_none_match is not None: _headers["If-None-Match"] = _SERIALIZER.header("if_none_match", if_none_match, "str") diff --git a/packages/typespec-python/tests/generated/unbranded/special-headers-conditional-request/specialheaders/conditionalrequest/_operations/_operations.py b/packages/typespec-python/tests/generated/unbranded/special-headers-conditional-request/specialheaders/conditionalrequest/_operations/_operations.py index 68b1dcde5e..d7fd3a44dc 100644 --- a/packages/typespec-python/tests/generated/unbranded/special-headers-conditional-request/specialheaders/conditionalrequest/_operations/_operations.py +++ b/packages/typespec-python/tests/generated/unbranded/special-headers-conditional-request/specialheaders/conditionalrequest/_operations/_operations.py @@ -43,7 +43,7 @@ def build_conditional_request_post_if_match_request( # pylint: disable=name-too _headers["If-Match"] = _SERIALIZER.header("if_match", if_match, "str") if_none_match = prep_if_none_match(etag, match_condition) if if_none_match is not None: - _headers["If-None-Match"] = _SERIALIZER.header("if_none_match", if_none_match, "str") + _headers["if-none-match"] = _SERIALIZER.header("if_none_match", if_none_match, "str") return HttpRequest(method="POST", url=_url, headers=_headers, **kwargs) @@ -59,7 +59,7 @@ def build_conditional_request_post_if_none_match_request( # pylint: disable=nam # Construct headers if_match = prep_if_match(etag, match_condition) if if_match is not None: - _headers["If-Match"] = _SERIALIZER.header("if_match", if_match, "str") + _headers["if-match"] = _SERIALIZER.header("if_match", if_match, "str") if_none_match = prep_if_none_match(etag, match_condition) if if_none_match is not None: _headers["If-None-Match"] = _SERIALIZER.header("if_none_match", if_none_match, "str") diff --git a/packages/typespec-python/tests/mock_api/azure/asynctests/test_azure_client_generator_core_client_default_value_async.py b/packages/typespec-python/tests/mock_api/azure/asynctests/test_azure_client_generator_core_client_default_value_async.py index 99060e4f09..f4bbaaae04 100644 --- a/packages/typespec-python/tests/mock_api/azure/asynctests/test_azure_client_generator_core_client_default_value_async.py +++ b/packages/typespec-python/tests/mock_api/azure/asynctests/test_azure_client_generator_core_client_default_value_async.py @@ -15,16 +15,15 @@ async def client(): yield client -# will reopen after bug fixed -# @pytest.mark.asyncio -# async def test_put_model_property(client: ClientDefaultValueClient): -# """Test case 1: @clientDefaultValue for model property.""" -# body = ModelWithDefaultValues(name="test") -# result = await client.put_model_property(body=body) -# assert result.name == "test" -# assert result.timeout == 30 -# assert result.tier == "standard" -# assert result.retry is True +@pytest.mark.asyncio +async def test_put_model_property(client: ClientDefaultValueClient): + """Test case 1: @clientDefaultValue for model property.""" + body = ModelWithDefaultValues(name="test") + result = await client.put_model_property(body=body) + assert result.name == "test" + assert result.timeout == 30 + assert result.tier == "standard" + assert result.retry is True @pytest.mark.asyncio diff --git a/packages/typespec-python/tests/mock_api/azure/test_azure_client_generator_core_client_default_value.py b/packages/typespec-python/tests/mock_api/azure/test_azure_client_generator_core_client_default_value.py index a89e0f188a..730c6a74b3 100644 --- a/packages/typespec-python/tests/mock_api/azure/test_azure_client_generator_core_client_default_value.py +++ b/packages/typespec-python/tests/mock_api/azure/test_azure_client_generator_core_client_default_value.py @@ -13,15 +13,15 @@ def client(): with ClientDefaultValueClient() as client: yield client -# will reopen after bug fixed -# def test_put_model_property(client: ClientDefaultValueClient): -# """Test case 1: @clientDefaultValue for model property.""" -# body = ModelWithDefaultValues(name="test") -# result = client.put_model_property(body=body) -# assert result.name == "test" -# assert result.timeout == 30 -# assert result.tier == "standard" -# assert result.retry is True + +def test_put_model_property(client: ClientDefaultValueClient): + """Test case 1: @clientDefaultValue for model property.""" + body = ModelWithDefaultValues(name="test") + result = client.put_model_property(body=body) + assert result.name == "test" + assert result.timeout == 30 + assert result.tier == "standard" + assert result.retry is True def test_get_operation_parameter(client: ClientDefaultValueClient): diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 362bd689bf..87ba71ecc0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,8 +60,8 @@ importers: specifier: ~1.0.2 version: 1.0.2 '@typespec/http-client-python': - specifier: https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIyNTU3My9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz - version: https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIyNTU3My9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz(y2blksstlsblh3iqmgy3brbone) + specifier: https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIzNTE1OC9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz + version: https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIzNTE1OC9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz(y2blksstlsblh3iqmgy3brbone) fs-extra: specifier: ~11.2.0 version: 11.2.0 @@ -82,8 +82,8 @@ importers: packages/typespec-python: dependencies: '@typespec/http-client-python': - specifier: https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIyNTU3My9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz - version: https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIyNTU3My9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz(y2blksstlsblh3iqmgy3brbone) + specifier: https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIzNTE1OC9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz + version: https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIzNTE1OC9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz(y2blksstlsblh3iqmgy3brbone) fs-extra: specifier: ~11.2.0 version: 11.2.0 @@ -1723,8 +1723,8 @@ packages: peerDependencies: '@typespec/compiler': ^1.11.0 - '@typespec/http-client-python@https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIyNTU3My9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz': - resolution: {tarball: https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIyNTU3My9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz} + '@typespec/http-client-python@https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIzNTE1OC9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz': + resolution: {tarball: https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIzNTE1OC9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz} version: 0.28.3 engines: {node: '>=20.0.0'} peerDependencies: @@ -6708,7 +6708,7 @@ snapshots: dependencies: '@typespec/compiler': 1.11.0(@types/node@25.0.10) - '@typespec/http-client-python@https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIyNTU3My9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz(y2blksstlsblh3iqmgy3brbone)': + '@typespec/http-client-python@https://artprodcus3.artifacts.visualstudio.com/A0fb41ef4-5012-48a9-bf39-4ee3de03ee35/29ec6040-b234-4e31-b139-33dc4287b756/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL2F6dXJlLXNkay9wcm9qZWN0SWQvMjllYzYwNDAtYjIzNC00ZTMxLWIxMzktMzNkYzQyODdiNzU2L2J1aWxkSWQvNjIzNTE1OC9hcnRpZmFjdE5hbWUvYnVpbGRfYXJ0aWZhY3RzX3B5dGhvbg2/content?format=file&subPath=%2Fpackages%2Ftypespec-http-client-python-0.28.3.tgz(y2blksstlsblh3iqmgy3brbone)': dependencies: '@azure-tools/typespec-autorest': 0.67.0(7o3sem7p6i3t4jykacdovvl7ii) '@azure-tools/typespec-azure-core': 0.67.0(@typespec/compiler@1.11.0(@types/node@25.0.10))(@typespec/http@1.11.0(@typespec/compiler@1.11.0(@types/node@25.0.10))(@typespec/streams@0.81.0(@typespec/compiler@1.11.0(@types/node@25.0.10))))(@typespec/rest@0.81.0(@typespec/compiler@1.11.0(@types/node@25.0.10))(@typespec/http@1.11.0(@typespec/compiler@1.11.0(@types/node@25.0.10))(@typespec/streams@0.81.0(@typespec/compiler@1.11.0(@types/node@25.0.10)))))