daviskirk · GitHub

I'm not sure if I understand the 'allow_unknown' rule correctly:

I can do this

import cerberus
schema = {
    'test': {
        'schema': {'a': {'type': 'string'}}, 'type': 'dict', 'allow_unknown':True
    }
}
validator = cerberus.Validator(schema)
validator.validate({'test': {'unknown_key': 'unknown_value'}})
validator.validate({'test': {}})

and both validations return True.

But if I nest the dictionary inside a list and try to do the same:

schema = {
    'test': {
        'type': 'list',
        'schema': {
            'type': 'dict',
            'allow_unknown':True,
            'schema': {'a': {'type': 'string'}}
        }
    }
}
validator = cerberus.Validator(schema)
validator.validate({'test': [{'unknown_key': 'unknown_value'}]})
validator.validate({'test': {}})

unexpected things (for me at least) happen.
The first validation results in True as expected. For the second however, I would have expected it to return False and indicate an error (because of the dict was used instead of the list) within the errors attribute. Instead, cerberus throws a TypeError while calling getitem on the schema using the 'allow_unknownvalueTrue` which of course fails.

Am I using the rule incorrectly? I am using cerberus 1.0rc0 pulled directly from github.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-44-bead38c40317> in <module>()
----> 1 validator.validate({'test': {}})
/pythonenv/lib/python3.5/site-packages/cerberus/validator.py in validate(self, document, schema, update, normalize)
    730         if normalize:
    731             self.__normalize_mapping(self.document, self.schema)
--> 732
    733         for field in self.document:
    734             if self.ignore_none_values and self.document[field] is None:
/pythonenv/lib/python3.5/site-packages/cerberus/validator.py in __normalize_mapping(self, mapping, schema)
    497         self.__normalize_default_fields(mapping, schema)
    498         self._normalize_coerce(mapping, schema)
--> 499         self.__normalize_containers(mapping, schema)
    500         return mapping
    501
/pythonenv/lib/python3.5/site-packages/cerberus/validator.py in __normalize_containers(self, mapping, schema)
    552                 if set(schema[field]) & set(('allow_unknown', 'purge_unknown',
    553                                              'schema')):
--> 554                     self.__normalize_mapping_per_schema(field, mapping, schema)
    555             elif isinstance(mapping[field], _str_type):
    556                 continue
/pythonenv/lib/python3.5/site-packages/cerberus/validator.py in __normalize_mapping_per_schema(self, field, mapping, schema)
    600             purge_unknown=schema[field].get('purge_unknown', self.purge_unknown))  # noqa
    601         mapping[field] = validator.normalized(mapping[field],
--> 602                                               always_return_document=True)
    603         if validator._errors:
    604             self._error(validator._errors)
/pythonenv/lib/python3.5/site-packages/cerberus/validator.py in normalized(self, document, schema, always_return_document)
    484         """
    485         self.__init_processing(document, schema)
--> 486         self.__normalize_mapping(self.document, self.schema)
    487         self.error_handler.end(self)
    488         if self._errors and not always_return_document:
/pythonenv/lib/python3.5/site-packages/cerberus/validator.py in __normalize_mapping(self, mapping, schema)
    495         if self.purge_unknown:
    496             self._normalize_purge_unknown(mapping, schema)
--> 497         self.__normalize_default_fields(mapping, schema)
    498         self._normalize_coerce(mapping, schema)
    499         self.__normalize_containers(mapping, schema)
/pythonenv/lib/python3.5/site-packages/cerberus/validator.py in __normalize_default_fields(self, mapping, schema)
    665
    666         for field in [x for x in fields if 'default' in schema[x]]:
--> 667             self._normalize_default(mapping, schema, field)
    668
    669         known_fields_states = set()
/pythonenv/lib/python3.5/site-packages/cerberus/validator.py in <listcomp>(.0)
    665
    666         for field in [x for x in fields if 'default' in schema[x]]:
--> 667             self._normalize_default(mapping, schema, field)
    668
    669         known_fields_states = set()
TypeError: argument of type 'bool' is not iterable

Read the original on github.com ↗