|
6 | 6 | import datetime |
7 | 7 | import re |
8 | 8 | from typing import Dict, Optional, Union, Tuple, Mapping, Any |
| 9 | +import logging |
9 | 10 |
|
10 | 11 | from ._jsonutils import json |
11 | 12 | from ._thirdparty import typing_inspect |
|
14 | 15 | try_parse_timedelta_with_formats |
15 | 16 | ) |
16 | 17 |
|
| 18 | +_logger = logging.getLogger('azure.functions.AsgiMiddleware') |
| 19 | + |
17 | 20 |
|
18 | 21 | def is_iterable_type_annotation(annotation: object, pytype: object) -> bool: |
19 | 22 | is_iterable_anno = ( |
@@ -90,14 +93,17 @@ def __new__(mcls, name, bases, dct, *, |
90 | 93 | trigger: Optional[str] = None): |
91 | 94 | cls = super().__new__(mcls, name, bases, dct) |
92 | 95 | cls._trigger = trigger # type: ignore |
| 96 | + cls._binding = binding # type: ignore |
| 97 | + |
93 | 98 | if binding is None: |
94 | 99 | return cls |
95 | 100 |
|
96 | 101 | 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') |
101 | 107 |
|
102 | 108 | mcls._bindings[binding] = cls |
103 | 109 | if trigger is not None: |
@@ -407,3 +413,24 @@ def encode(cls, obj: Any, *, |
407 | 413 |
|
408 | 414 | def get_binding_registry(): |
409 | 415 | 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