Skip to content

Commit 5739988

Browse files
Fix marshmallow 4.x compatibility: replace FieldInstanceResolutionError with MarshmallowError
Co-authored-by: kshitij-microsoft <[email protected]>
1 parent 9fc59a8 commit 5739988

File tree

1 file changed

+26
-7
lines changed
  • sdk/ml/azure-ai-ml/azure/ai/ml/_schema/core

1 file changed

+26
-7
lines changed

sdk/ml/azure-ai-ml/azure/ai/ml/_schema/core/fields.py

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,34 @@
1515
from typing import List, Optional, Union
1616

1717
from marshmallow import RAISE, fields
18-
from marshmallow.exceptions import ValidationError, FieldInstanceResolutionError
18+
from marshmallow.exceptions import ValidationError, MarshmallowError
1919
from marshmallow.fields import Field, Nested
2020

21+
def resolve_field_instance(cls_or_instance):
22+
"""Resolve a field class or instance to a field instance.
23+
24+
This replaces the marshmallow resolve_field_instance utility which
25+
was removed in marshmallow 4.x.
26+
27+
:param cls_or_instance: Field class or instance
28+
:return: Field instance
29+
"""
30+
if isinstance(cls_or_instance, Field):
31+
return cls_or_instance
32+
elif isinstance(cls_or_instance, type) and issubclass(cls_or_instance, Field):
33+
return cls_or_instance()
34+
else:
35+
raise MarshmallowError(f"Expected Field class or instance, got {type(cls_or_instance)}")
36+
37+
2138
try:
22-
# marshmallow 4.x
23-
from marshmallow.class_registry import resolve_field_instance
39+
# marshmallow 3.x fallback - try to import if available
40+
from marshmallow.utils import resolve_field_instance as _original_resolve_field_instance
41+
# If import succeeds, use the original function
42+
resolve_field_instance = _original_resolve_field_instance
2443
except ImportError:
25-
# marshmallow 3.x
26-
from marshmallow.utils import resolve_field_instance
44+
# marshmallow 4.x or function not available - use our implementation above
45+
pass
2746

2847
from ..._utils._arm_id_utils import (
2948
AMLVersionedArmId,
@@ -481,7 +500,7 @@ def __init__(self, union_fields: List[fields.Field], is_strict=False, **kwargs):
481500
self._union_fields = [resolve_field_instance(cls_or_instance) for cls_or_instance in union_fields]
482501
# TODO: make serialization/de-serialization work in the same way as json schema when is_strict is True
483502
self.is_strict = is_strict # S\When True, combine fields with oneOf instead of anyOf at schema generation
484-
except FieldInstanceResolutionError as error:
503+
except MarshmallowError as error:
485504
raise ValueError(
486505
'Elements of "union_fields" must be subclasses or instances of marshmallow fields.'
487506
) from error
@@ -924,7 +943,7 @@ def __init__(self, experimental_field: fields.Field, **kwargs):
924943
try:
925944
self._experimental_field = resolve_field_instance(experimental_field)
926945
self.required = experimental_field.required
927-
except FieldInstanceResolutionError as error:
946+
except MarshmallowError as error:
928947
raise ValueError('"experimental_field" must be subclasses or instances of marshmallow fields.') from error
929948

930949
@property

0 commit comments

Comments
 (0)