Skip to content

Commit

Permalink
Merge 3cd3474 into b404c58
Browse files Browse the repository at this point in the history
  • Loading branch information
akariv committed Sep 13, 2018
2 parents b404c58 + 3cd3474 commit 9f36432
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 7 deletions.
7 changes: 6 additions & 1 deletion tableschema/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ class DataPackageException(Exception):

# Public

def __init__(self, message, errors=[]):
def __init__(self, message, errors=[], **metadata):
self.__errors = errors
self.__metadata = metadata
super(Exception, self).__init__(message)

@property
Expand All @@ -23,6 +24,10 @@ def multiple(self):
def errors(self):
return self.__errors

@property
def metadata(self):
return self.__metadata


class TableSchemaException(DataPackageException):
pass
Expand Down
10 changes: 8 additions & 2 deletions tableschema/field.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,10 @@ def cast_value(self, value, constraints=True):
raise exceptions.CastError((
'Field "{field.name}" can\'t cast value "{value}" '
'for type "{field.type}" with format "{field.format}"'
).format(field=self, value=value))
).format(field=self, value=value),
field=dict(name=self.name, type=self.type, format=self.format),
value=value
)

# Check value
if constraints:
Expand All @@ -97,7 +100,10 @@ def cast_value(self, value, constraints=True):
raise exceptions.CastError((
'Field "{field.name}" has constraint "{name}" '
'which is not satisfied for value "{value}"'
).format(field=self, name=name, value=value))
).format(field=self, name=name, value=value),
field=dict(name=self.name, type=self.type, format=self.format),
value=value
)

return cast_value

Expand Down
3 changes: 2 additions & 1 deletion tableschema/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,8 @@ def cast_row(self, row, fail_fast=False):
if len(row) != len(self.fields):
message = 'Row length %s doesn\'t match fields count %s'
message = message % (len(row), len(self.fields))
raise exceptions.CastError(message)
raise exceptions.CastError(message,
row_length=len(row), field_count=len(self.fields))

# Cast row
for field, value in zip(self.fields, row):
Expand Down
8 changes: 6 additions & 2 deletions tableschema/table.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,9 @@ def iter(self, keyed=False, extended=False, cast=True, relations=False):
if self.headers != self.schema.field_names:
self.__stream.close()
message = 'Table headers don\'t match schema field names'
raise exceptions.CastError(message)
raise exceptions.CastError(message,
table_headers=self.headers,
schema_field_names=self.schema.field_names)

# Check unique
if cast:
Expand All @@ -100,7 +102,9 @@ def iter(self, keyed=False, extended=False, cast=True, relations=False):
self.__stream.close()
message = 'Field(s) "%s" duplicates in row "%s"'
message = message % (cache['name'], row_number)
raise exceptions.CastError(message)
raise exceptions.CastError(message,
duplicate_field=cache['name'],
duplicate_row=row_number)
cache['data'].add(values)

# Resolve relations
Expand Down
8 changes: 7 additions & 1 deletion tests/test_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,14 @@ def test_cast_value():


def test_cast_value_constraint_error():
with pytest.raises(exceptions.CastError):
try:
Field(DESCRIPTOR_MAX).cast_value('')
assert False
except exceptions.CastError as e:
assert e.metadata['field']['name'] == DESCRIPTOR_MAX['name']
assert e.metadata['field']['format'] == DESCRIPTOR_MAX['format']
assert e.metadata['field']['type'] == DESCRIPTOR_MAX['type']
assert e.metadata['value'] is None


def test_cast_value_constraints_false():
Expand Down

0 comments on commit 9f36432

Please sign in to comment.