Skip to content

Commit 4c0946c

Browse files
committed
adding converter registration hook
1 parent 8bd30d3 commit 4c0946c

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

azure/functions/__init__.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from ._http_asgi import AsgiMiddleware
2121
from .kafka import KafkaEvent, KafkaConverter, KafkaTriggerConverter
2222
from .mcp import MCPToolContext
23-
from .meta import get_binding_registry
23+
from .meta import get_binding_registry, register_converter, InConverter, OutConverter
2424
from ._queue import QueueMessage
2525
from ._servicebus import ServiceBusMessage
2626
from ._sql import SqlRow, SqlRowList
@@ -46,6 +46,9 @@
4646
__all__ = (
4747
# Functions
4848
'get_binding_registry',
49+
'register_converter',
50+
'InConverter',
51+
'OutConverter',
4952

5053
# Generics.
5154
'Context',
@@ -106,4 +109,4 @@
106109
'McpPropertyType'
107110
)
108111

109-
__version__ = '1.25.0b2'
112+
__version__ = '1.25.0b3dev1'

azure/functions/meta.py

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import datetime
77
import re
88
from typing import Dict, Optional, Union, Tuple, Mapping, Any
9+
import logging
910

1011
from ._jsonutils import json
1112
from ._thirdparty import typing_inspect
@@ -14,6 +15,8 @@
1415
try_parse_timedelta_with_formats
1516
)
1617

18+
_logger = logging.getLogger('azure.functions.AsgiMiddleware')
19+
1720

1821
def is_iterable_type_annotation(annotation: object, pytype: object) -> bool:
1922
is_iterable_anno = (
@@ -90,14 +93,17 @@ def __new__(mcls, name, bases, dct, *,
9093
trigger: Optional[str] = None):
9194
cls = super().__new__(mcls, name, bases, dct)
9295
cls._trigger = trigger # type: ignore
96+
cls._binding = binding # type: ignore
97+
9398
if binding is None:
9499
return cls
95100

96101
if binding in mcls._bindings:
97-
raise RuntimeError(
98-
f'cannot register a converter for {binding!r} binding: '
99-
f'another converter for this binding has already been '
100-
f'registered')
102+
_logger.warning("Binding %r already registered. Overwriting to %s", binding, cls)
103+
# raise RuntimeError(
104+
# f'cannot register a converter for {binding!r} binding: '
105+
# f'another converter for this binding has already been '
106+
# f'registered')
101107

102108
mcls._bindings[binding] = cls
103109
if trigger is not None:
@@ -407,3 +413,24 @@ def encode(cls, obj: Any, *,
407413

408414
def get_binding_registry():
409415
return _ConverterMeta
416+
417+
418+
def register_converter(converter_cls):
419+
"""Public API for third-party packages to register new converters."""
420+
if not hasattr(converter_cls, "_trigger"):
421+
raise RuntimeError("Converter class missing required metadata")
422+
423+
# Use the metaclass registry
424+
binding = getattr(converter_cls, "_binding", None)
425+
trigger = getattr(converter_cls, "_trigger", None)
426+
427+
if binding is None:
428+
raise RuntimeError("Converter has no binding name")
429+
430+
# Reuse the metaclass-level registry
431+
if binding in _ConverterMeta._bindings:
432+
_logger.warning("Binding %r already registered. Overwriting to %s", binding, converter_cls)
433+
434+
_ConverterMeta._bindings[binding] = converter_cls
435+
if trigger:
436+
_ConverterMeta._bindings[trigger] = converter_cls

0 commit comments

Comments
 (0)