This commit is contained in:
Ross Lawley
2012-05-01 09:42:25 +01:00
4 changed files with 41 additions and 7 deletions

View File

@@ -25,7 +25,15 @@ class InvalidDocumentError(Exception):
class ValidationError(AssertionError):
"""Validation exception.
May represent an error validating a field or a
document containing fields with validation errors.
:ivar errors: A dictionary of errors for fields within this
document or list, or None if the error is for an
individual field.
"""
errors = {}
field_name = None
_message = None
@@ -43,10 +51,12 @@ class ValidationError(AssertionError):
def __getattribute__(self, name):
message = super(ValidationError, self).__getattribute__(name)
if name == 'message' and self.field_name:
return message + ' ("%s")' % self.field_name
else:
return message
if name == 'message':
if self.field_name:
message += ' ("%s")' % self.field_name
if self.errors:
message += ':\n' + self._format_errors()
return message
def _get_message(self):
return self._message
@@ -57,6 +67,13 @@ class ValidationError(AssertionError):
message = property(_get_message, _set_message)
def to_dict(self):
"""Returns a dictionary of all errors within a document
Keys are field names or list indices and values are the
validation error messages, or a nested dictionary of
errors for an embedded document or list.
"""
def build_dict(source):
errors_dict = {}
if not source:
@@ -73,6 +90,20 @@ class ValidationError(AssertionError):
return {}
return build_dict(self.errors)
def _format_errors(self):
"""Returns a string listing all errors within a document"""
def format_error(field, value, prefix=''):
if isinstance(value, dict):
new_prefix = (prefix + '.' if prefix else '') + str(field)
return '\n'.join(
[format_error(k, value[k], new_prefix) for k in value])
else:
return (prefix + ": " if prefix else '') + str(value)
return '\n'.join(
[format_error(k, v) for k, v in self.to_dict().items()])
_document_registry = {}