From 7a5f2be9cf75bd88640fb4bddf14571d48e6e2a6 Mon Sep 17 00:00:00 2001 From: Victoria Hall Date: Tue, 9 Sep 2025 16:09:55 -0500 Subject: [PATCH 1/4] base changes for message settlement --- .../extensions/base/__init__.py | 2 ++ .../extensions/base/grpcClientType.py | 7 ++++++ .../azurefunctions/extensions/base/meta.py | 12 ++++++++- .../tests/test_meta.py | 25 ++++++++++++++++++- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 azurefunctions-extensions-base/azurefunctions/extensions/base/grpcClientType.py diff --git a/azurefunctions-extensions-base/azurefunctions/extensions/base/__init__.py b/azurefunctions-extensions-base/azurefunctions/extensions/base/__init__.py index cf1eb24..a6abbf3 100644 --- a/azurefunctions-extensions-base/azurefunctions/extensions/base/__init__.py +++ b/azurefunctions-extensions-base/azurefunctions/extensions/base/__init__.py @@ -1,6 +1,7 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. +from .grpcClientType import GrpcClientType from .meta import ( Datum, InConverter, @@ -31,6 +32,7 @@ "get_binding_registry", "ModuleTrackerMeta", "RequestTrackerMeta", + "GrpcClientType", "ResponseTrackerMeta", "HttpV2FeatureChecker", "ResponseLabels", diff --git a/azurefunctions-extensions-base/azurefunctions/extensions/base/grpcClientType.py b/azurefunctions-extensions-base/azurefunctions/extensions/base/grpcClientType.py new file mode 100644 index 0000000..5a63c4e --- /dev/null +++ b/azurefunctions-extensions-base/azurefunctions/extensions/base/grpcClientType.py @@ -0,0 +1,7 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + + +class GrpcClientType: + def __init__(self, *, data: dict = None): + self._data = data or {} \ No newline at end of file diff --git a/azurefunctions-extensions-base/azurefunctions/extensions/base/meta.py b/azurefunctions-extensions-base/azurefunctions/extensions/base/meta.py index a771a9f..212f47b 100644 --- a/azurefunctions-extensions-base/azurefunctions/extensions/base/meta.py +++ b/azurefunctions-extensions-base/azurefunctions/extensions/base/meta.py @@ -6,7 +6,7 @@ import json from typing import Any, Dict, Mapping, Optional, Tuple, Union, get_args, get_origin -from . import sdkType, utils +from . import grpcClientType, sdkType, utils class Datum: @@ -99,6 +99,16 @@ def check_supported_type(cls, annotation: type) -> bool: # An iterable who only has one inner type and is a subclass of SdkType return cls._is_iterable_supported_type(annotation) + @classmethod + def check_supported_grpc_client_type(cls, annotation: type) -> bool: + if annotation is None: + return False + + # The annotation is a class/type (not an object) - not iterable + return (isinstance(annotation, type) + and issubclass(annotation, grpcClientType.GrpcClientType)) + + @classmethod def _is_iterable_supported_type(cls, annotation: type) -> bool: # Check base type from type hint. Ex: List from List[SdkType] diff --git a/azurefunctions-extensions-base/tests/test_meta.py b/azurefunctions-extensions-base/tests/test_meta.py index cb493ff..f86d35d 100644 --- a/azurefunctions-extensions-base/tests/test_meta.py +++ b/azurefunctions-extensions-base/tests/test_meta.py @@ -5,7 +5,7 @@ from typing import List, Mapping from unittest.mock import patch -from azurefunctions.extensions.base import meta, sdkType +from ..azurefunctions.extensions.base import meta, grpcClientType, sdkType class TestMeta(unittest.TestCase): @@ -162,6 +162,29 @@ class MockIndexedFunction: self.assertTrue(registry.check_supported_type(set[sdkType.SdkType])) self.assertFalse(registry.check_supported_type(dict[str, sdkType.SdkType])) + def test_registry_grpc_client(self): + registry = meta.get_binding_registry() + self.assertIsInstance(registry, type(meta._ConverterMeta)) + self.assertIsNone(registry.get("test")) + + class MockIndexedFunction: + _bindings = {} + _trigger = None + + self.assertEqual(registry.get_raw_bindings(MockIndexedFunction, []), ([], {})) + + self.assertFalse(registry.check_supported_grpc_client_type(None)) + self.assertFalse(registry.check_supported_grpc_client_type("hello")) + self.assertTrue(registry.check_supported_grpc_client_type(grpcClientType.GrpcClientType)) + self.assertTrue(registry.check_supported_grpc_client_type(List[grpcClientType.GrpcClientType])) + + # Generic types are not subscriptable in Python <3.9 + if sys.version_info >= (3, 9): + self.assertTrue(registry.check_supported_grpc_client_type(list[grpcClientType.GrpcClientType])) + self.assertTrue(registry.check_supported_grpc_client_type(tuple[grpcClientType.GrpcClientType])) + self.assertTrue(registry.check_supported_grpc_client_type(set[grpcClientType.GrpcClientType])) + self.assertFalse(registry.check_supported_grpc_client_type(dict[str, grpcClientType.GrpcClientType])) + def test_decode_typed_data(self): # Case 1: data is None self.assertIsNone( From 0b173866585247514ad084dc7165f54cdbdb44da Mon Sep 17 00:00:00 2001 From: Victoria Hall Date: Thu, 11 Sep 2025 10:11:27 -0500 Subject: [PATCH 2/4] fix import --- azurefunctions-extensions-base/tests/test_meta.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/azurefunctions-extensions-base/tests/test_meta.py b/azurefunctions-extensions-base/tests/test_meta.py index f86d35d..5c71e39 100644 --- a/azurefunctions-extensions-base/tests/test_meta.py +++ b/azurefunctions-extensions-base/tests/test_meta.py @@ -5,7 +5,8 @@ from typing import List, Mapping from unittest.mock import patch -from ..azurefunctions.extensions.base import meta, grpcClientType, sdkType +from azurefunctions.extensions.base import meta, sdkType +from azurefunctions.extensions.base.grpcClientType import GrpcClientType class TestMeta(unittest.TestCase): @@ -175,15 +176,15 @@ class MockIndexedFunction: self.assertFalse(registry.check_supported_grpc_client_type(None)) self.assertFalse(registry.check_supported_grpc_client_type("hello")) - self.assertTrue(registry.check_supported_grpc_client_type(grpcClientType.GrpcClientType)) - self.assertTrue(registry.check_supported_grpc_client_type(List[grpcClientType.GrpcClientType])) + self.assertTrue(registry.check_supported_grpc_client_type(GrpcClientType)) + self.assertTrue(registry.check_supported_grpc_client_type(List[GrpcClientType])) # Generic types are not subscriptable in Python <3.9 if sys.version_info >= (3, 9): - self.assertTrue(registry.check_supported_grpc_client_type(list[grpcClientType.GrpcClientType])) - self.assertTrue(registry.check_supported_grpc_client_type(tuple[grpcClientType.GrpcClientType])) - self.assertTrue(registry.check_supported_grpc_client_type(set[grpcClientType.GrpcClientType])) - self.assertFalse(registry.check_supported_grpc_client_type(dict[str, grpcClientType.GrpcClientType])) + self.assertTrue(registry.check_supported_grpc_client_type(list[GrpcClientType])) + self.assertTrue(registry.check_supported_grpc_client_type(tuple[GrpcClientType])) + self.assertTrue(registry.check_supported_grpc_client_type(set[GrpcClientType])) + self.assertFalse(registry.check_supported_grpc_client_type(dict[str, GrpcClientType])) def test_decode_typed_data(self): # Case 1: data is None From 5f257b4d66bb50e728730ac17dd4cb16c3cfcc3d Mon Sep 17 00:00:00 2001 From: Victoria Hall Date: Thu, 11 Sep 2025 13:39:40 -0500 Subject: [PATCH 3/4] flake --- .../extensions/base/grpcClientType.py | 2 +- .../azurefunctions/extensions/base/meta.py | 1 - azurefunctions-extensions-base/tests/test_meta.py | 13 ++++++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/azurefunctions-extensions-base/azurefunctions/extensions/base/grpcClientType.py b/azurefunctions-extensions-base/azurefunctions/extensions/base/grpcClientType.py index 5a63c4e..03f851f 100644 --- a/azurefunctions-extensions-base/azurefunctions/extensions/base/grpcClientType.py +++ b/azurefunctions-extensions-base/azurefunctions/extensions/base/grpcClientType.py @@ -4,4 +4,4 @@ class GrpcClientType: def __init__(self, *, data: dict = None): - self._data = data or {} \ No newline at end of file + self._data = data or {} diff --git a/azurefunctions-extensions-base/azurefunctions/extensions/base/meta.py b/azurefunctions-extensions-base/azurefunctions/extensions/base/meta.py index 212f47b..1535c69 100644 --- a/azurefunctions-extensions-base/azurefunctions/extensions/base/meta.py +++ b/azurefunctions-extensions-base/azurefunctions/extensions/base/meta.py @@ -108,7 +108,6 @@ def check_supported_grpc_client_type(cls, annotation: type) -> bool: return (isinstance(annotation, type) and issubclass(annotation, grpcClientType.GrpcClientType)) - @classmethod def _is_iterable_supported_type(cls, annotation: type) -> bool: # Check base type from type hint. Ex: List from List[SdkType] diff --git a/azurefunctions-extensions-base/tests/test_meta.py b/azurefunctions-extensions-base/tests/test_meta.py index 5c71e39..6956ffa 100644 --- a/azurefunctions-extensions-base/tests/test_meta.py +++ b/azurefunctions-extensions-base/tests/test_meta.py @@ -177,14 +177,17 @@ class MockIndexedFunction: self.assertFalse(registry.check_supported_grpc_client_type(None)) self.assertFalse(registry.check_supported_grpc_client_type("hello")) self.assertTrue(registry.check_supported_grpc_client_type(GrpcClientType)) - self.assertTrue(registry.check_supported_grpc_client_type(List[GrpcClientType])) # Generic types are not subscriptable in Python <3.9 if sys.version_info >= (3, 9): - self.assertTrue(registry.check_supported_grpc_client_type(list[GrpcClientType])) - self.assertTrue(registry.check_supported_grpc_client_type(tuple[GrpcClientType])) - self.assertTrue(registry.check_supported_grpc_client_type(set[GrpcClientType])) - self.assertFalse(registry.check_supported_grpc_client_type(dict[str, GrpcClientType])) + self.assertTrue(registry.check_supported_grpc_client_type( + list[GrpcClientType])) + self.assertTrue(registry.check_supported_grpc_client_type( + tuple[GrpcClientType])) + self.assertTrue(registry.check_supported_grpc_client_type( + set[GrpcClientType])) + self.assertFalse(registry.check_supported_grpc_client_type( + dict[str, GrpcClientType])) def test_decode_typed_data(self): # Case 1: data is None From fcda545bc27e35b82ce8580cea4265bbf9545801 Mon Sep 17 00:00:00 2001 From: Victoria Hall Date: Thu, 11 Sep 2025 14:07:35 -0500 Subject: [PATCH 4/4] test fix --- azurefunctions-extensions-base/tests/test_meta.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/azurefunctions-extensions-base/tests/test_meta.py b/azurefunctions-extensions-base/tests/test_meta.py index 6956ffa..6dca666 100644 --- a/azurefunctions-extensions-base/tests/test_meta.py +++ b/azurefunctions-extensions-base/tests/test_meta.py @@ -178,17 +178,6 @@ class MockIndexedFunction: self.assertFalse(registry.check_supported_grpc_client_type("hello")) self.assertTrue(registry.check_supported_grpc_client_type(GrpcClientType)) - # Generic types are not subscriptable in Python <3.9 - if sys.version_info >= (3, 9): - self.assertTrue(registry.check_supported_grpc_client_type( - list[GrpcClientType])) - self.assertTrue(registry.check_supported_grpc_client_type( - tuple[GrpcClientType])) - self.assertTrue(registry.check_supported_grpc_client_type( - set[GrpcClientType])) - self.assertFalse(registry.check_supported_grpc_client_type( - dict[str, GrpcClientType])) - def test_decode_typed_data(self): # Case 1: data is None self.assertIsNone(