Skip to content

Commit 19ddc5c

Browse files
Fix marshmallow imports for 4.x compatibility
Co-authored-by: kshitij-microsoft <[email protected]>
1 parent 4585ec9 commit 19ddc5c

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

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

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

1717
from marshmallow import RAISE, fields
18-
from marshmallow.exceptions import ValidationError
18+
from marshmallow.exceptions import ValidationError, FieldInstanceResolutionError
1919
from marshmallow.fields import Field, Nested
20-
from marshmallow.utils import FieldInstanceResolutionError, from_iso_datetime, resolve_field_instance
20+
21+
try:
22+
# marshmallow 4.x
23+
from marshmallow.class_registry import resolve_field_instance
24+
except ImportError:
25+
# marshmallow 3.x
26+
from marshmallow.utils import resolve_field_instance
27+
28+
# Custom implementation for from_iso_datetime compatibility
29+
def from_iso_datetime(value):
30+
"""Parse an ISO8601 datetime string, handling the 'Z' suffix."""
31+
from datetime import datetime
32+
if isinstance(value, str):
33+
# Replace 'Z' with '+00:00' for compatibility with datetime.fromisoformat
34+
if value.endswith('Z'):
35+
value = value[:-1] + '+00:00'
36+
return datetime.fromisoformat(value)
37+
return value
2138

2239
from ..._utils._arm_id_utils import AMLVersionedArmId, is_ARM_id_for_resource, parse_name_label, parse_name_version
2340
from ..._utils._experimental import _is_warning_cached
@@ -435,13 +452,13 @@ def __init__(self, union_fields: List[fields.Field], is_strict=False, **kwargs):
435452
super().__init__(**kwargs)
436453
try:
437454
# add the validation and make sure union_fields must be subclasses or instances of
438-
# marshmallow.base.FieldABC
455+
# marshmallow fields
439456
self._union_fields = [resolve_field_instance(cls_or_instance) for cls_or_instance in union_fields]
440457
# TODO: make serialization/de-serialization work in the same way as json schema when is_strict is True
441458
self.is_strict = is_strict # S\When True, combine fields with oneOf instead of anyOf at schema generation
442459
except FieldInstanceResolutionError as error:
443460
raise ValueError(
444-
'Elements of "union_fields" must be subclasses or instances of marshmallow.base.FieldABC.'
461+
'Elements of "union_fields" must be subclasses or instances of marshmallow fields.'
445462
) from error
446463

447464
@property
@@ -878,7 +895,7 @@ def __init__(self, experimental_field: fields.Field, **kwargs):
878895
self.required = experimental_field.required
879896
except FieldInstanceResolutionError as error:
880897
raise ValueError(
881-
'"experimental_field" must be subclasses or instances of marshmallow.base.FieldABC.'
898+
'"experimental_field" must be subclasses or instances of marshmallow fields.'
882899
) from error
883900

884901
@property

sdk/ml/azure-ai-ml/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
"msrest>=0.6.18,<1.0.0",
7373
"azure-core>=1.23.0",
7474
"azure-mgmt-core>=1.3.0",
75-
"marshmallow>=3.5,<4.0.0",
75+
"marshmallow>=3.5,<5.0.0",
7676
"jsonschema>=4.0.0,<5.0.0",
7777
"tqdm<5.0.0",
7878
# Used for PR 825138

0 commit comments

Comments
 (0)