diff options
Diffstat (limited to '.venv/lib/python3.12/site-packages/marshmallow/error_store.py')
-rw-r--r-- | .venv/lib/python3.12/site-packages/marshmallow/error_store.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/marshmallow/error_store.py b/.venv/lib/python3.12/site-packages/marshmallow/error_store.py new file mode 100644 index 00000000..61320ab2 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/marshmallow/error_store.py @@ -0,0 +1,60 @@ +"""Utilities for storing collections of error messages. + +.. warning:: + + This module is treated as private API. + Users should not need to use this module directly. +""" + +from marshmallow.exceptions import SCHEMA + + +class ErrorStore: + def __init__(self): + #: Dictionary of errors stored during serialization + self.errors = {} + + def store_error(self, messages, field_name=SCHEMA, index=None): + # field error -> store/merge error messages under field name key + # schema error -> if string or list, store/merge under _schema key + # -> if dict, store/merge with other top-level keys + if field_name != SCHEMA or not isinstance(messages, dict): + messages = {field_name: messages} + if index is not None: + messages = {index: messages} + self.errors = merge_errors(self.errors, messages) + + +def merge_errors(errors1, errors2): # noqa: PLR0911 + """Deeply merge two error messages. + + The format of ``errors1`` and ``errors2`` matches the ``message`` + parameter of :exc:`marshmallow.exceptions.ValidationError`. + """ + if not errors1: + return errors2 + if not errors2: + return errors1 + if isinstance(errors1, list): + if isinstance(errors2, list): + return errors1 + errors2 + if isinstance(errors2, dict): + return dict(errors2, **{SCHEMA: merge_errors(errors1, errors2.get(SCHEMA))}) + return [*errors1, errors2] + if isinstance(errors1, dict): + if isinstance(errors2, list): + return dict(errors1, **{SCHEMA: merge_errors(errors1.get(SCHEMA), errors2)}) + if isinstance(errors2, dict): + errors = dict(errors1) + for key, val in errors2.items(): + if key in errors: + errors[key] = merge_errors(errors[key], val) + else: + errors[key] = val + return errors + return dict(errors1, **{SCHEMA: merge_errors(errors1.get(SCHEMA), errors2)}) + if isinstance(errors2, list): + return [errors1, *errors2] + if isinstance(errors2, dict): + return dict(errors2, **{SCHEMA: merge_errors(errors1, errors2.get(SCHEMA))}) + return [errors1, errors2] |