Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions cl_sii/libs/mm_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,48 @@
import marshmallow.utils


###############################################################################
# validators
###############################################################################

def validate_no_unexpected_input_fields(
schema: marshmallow.Schema,
data: dict,
original_data: dict,
) -> None:
"""
Fail validation if there was an unexpected input field.

Usage::

class MySchema(marshmallow.Schema):

class Meta:
strict = True

folio = marshmallow.fields.Integer()

@marshmallow.validates_schema(pass_original=True)
def validate_schema(self, data: dict, original_data: dict) -> None:
validate_no_unexpected_input_fields(self, data, original_data)

"""
# Original inspiration from
# https://marshmallow.readthedocs.io/en/2.x-line/extending.html#validating-original-input-data
fields_name_or_load_from = {
field.name if field.load_from is None else field.load_from
for field_key, field in schema.fields.items()
}
unexpected_input_fields = set(original_data) - fields_name_or_load_from
if unexpected_input_fields:
raise marshmallow.ValidationError(
"Unexpected input field.", field_names=list(unexpected_input_fields))


###############################################################################
# fields
###############################################################################

class CustomMarshmallowDateField(marshmallow.fields.Field):
"""
A formatted date string.
Expand Down
13 changes: 11 additions & 2 deletions tests/test_libs_mm_utils.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
import unittest

from cl_sii.libs.mm_utils import CustomMarshmallowDateField # noqa: F401
from cl_sii.libs.mm_utils import ( # noqa: F401
CustomMarshmallowDateField, validate_no_unexpected_input_fields,
)


class CustomMarshmallowDateFieldTest(unittest.TestCase):

def test_x(self) -> None:
# TODO: implement!
# TODO: implement for 'CustomMarshmallowDateField'.
pass


class FunctionsTest(unittest.TestCase):

def test_validate_no_unexpected_input_fields(self):
# TODO: implement for 'validate_no_unexpected_input_fields'.
pass