Skip to content

Commit 0356a3f

Browse files
committed
Merge error store messages without rebuilding collections
1 parent 4ab61bf commit 0356a3f

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

src/marshmallow/error_store.py

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
Users should not need to use this module directly.
77
"""
88

9+
from copy import deepcopy
10+
911
from marshmallow.exceptions import SCHEMA
1012

1113

@@ -18,6 +20,7 @@ def store_error(self, messages, field_name=SCHEMA, index=None):
1820
# field error -> store/merge error messages under field name key
1921
# schema error -> if string or list, store/merge under _schema key
2022
# -> if dict, store/merge with other top-level keys
23+
messages = deepcopy(messages)
2124
if field_name != SCHEMA or not isinstance(messages, dict):
2225
messages = {field_name: messages}
2326
if index is not None:
@@ -37,24 +40,26 @@ def merge_errors(errors1, errors2): # noqa: PLR0911
3740
return errors1
3841
if isinstance(errors1, list):
3942
if isinstance(errors2, list):
40-
return errors1 + errors2
43+
errors1.extend(errors2)
44+
return errors1
4145
if isinstance(errors2, dict):
42-
return dict(errors2, **{SCHEMA: merge_errors(errors1, errors2.get(SCHEMA))})
43-
return [*errors1, errors2]
46+
errors2[SCHEMA] = merge_errors(errors1, errors2.get(SCHEMA))
47+
return errors2
48+
errors1.append(errors2)
49+
return errors1
4450
if isinstance(errors1, dict):
45-
if isinstance(errors2, list):
46-
return dict(errors1, **{SCHEMA: merge_errors(errors1.get(SCHEMA), errors2)})
4751
if isinstance(errors2, dict):
48-
errors = dict(errors1)
4952
for key, val in errors2.items():
50-
if key in errors:
51-
errors[key] = merge_errors(errors[key], val)
53+
if key in errors1:
54+
errors1[key] = merge_errors(errors1[key], val)
5255
else:
53-
errors[key] = val
54-
return errors
55-
return dict(errors1, **{SCHEMA: merge_errors(errors1.get(SCHEMA), errors2)})
56+
errors1[key] = val
57+
return errors1
58+
errors1[SCHEMA] = merge_errors(errors1.get(SCHEMA), errors2)
59+
return errors1
5660
if isinstance(errors2, list):
5761
return [errors1, *errors2]
5862
if isinstance(errors2, dict):
59-
return dict(errors2, **{SCHEMA: merge_errors(errors1, errors2.get(SCHEMA))})
63+
errors2[SCHEMA] = merge_errors(errors1, errors2.get(SCHEMA))
64+
return errors2
6065
return [errors1, errors2]

0 commit comments

Comments
 (0)