Search code examples
pythoncerberus

Validating that two params have same amount elements using Cerberus


Is there a way to have Cerberus validate that two fields have the same amount of elements?

For instance, this document would validate:

{'a': [1, 2, 3], b: [4, 5, 6]}

And this won't:

{'a': [1, 2, 3], 'b': [7, 8]}

So far I have come up with this schema:

{'a': {'required':False, 'type'= 'list', 'dependencies':'b'},
 'b': {'required':False, 'type'= 'list', 'dependencies':'a'}}

But there's no rule to test the equal length of two fields.


Solution

  • With a custom rule it is pretty straight-forward:

    >>> from cerberus import Validator
    
    >>> class MyValidator(Validator):
            def _validate_match_length(self, other, field, value):
                if other not in self.document:
                    return False
                if len(value) != len(self.document[other]):
                    self._error(field, 
                                "Length doesn't match field %s's length." % other)
    
    >>> schema = {'a': {'type': 'list', 'required': True},
                  'b': {'type': 'list', 'required': True, 'match_length': 'a'}}
    >>> validator = MyValidator(schema)
    >>> document = {'a': [1, 2, 3], 'b': [4, 5, 6]}
    >>> validator(document)
    True
    >>> document = {'a': [1, 2, 3], 'b': [7, 8]}
    >>> validator(document)
    False