Replace the exception dance with light input validation.

This commit is contained in:
Ionel Cristian Mărieș 2013-08-28 14:38:53 +03:00
parent c76a2bea1e
commit a4eecf646e
2 changed files with 31 additions and 15 deletions

View File

@ -35,22 +35,15 @@ class TableData(object):
self.queryset = data
# otherwise it must be convertable to a list
else:
try:
# do some light validation
if hasattr(data, '__iter__') or (hasattr(data, '__len__') and hasattr(data, '__getitem__')):
self.list = list(data)
except Exception as ex:
if six.PY3:
raise ValueError(
'data must be QuerySet-like (have count and '
'order_by) or support list(data) -- %s has '
'neither' % type(data).__name__
)
else:
# really horrible, but this syntax is not supported on PY3 and would not work otherwise
exec("""raise ValueError, (
'data must be QuerySet-like (have count and '
'order_by) or support list(data) -- %s has '
'neither. Original exception: %s' % (type(data).__name__, ex)
), sys.exc_info()[2]""")
else:
raise ValueError(
'data must be QuerySet-like (have count and '
'order_by) or support list(data) -- %s has '
'neither' % type(data).__name__
)
def __len__(self):
if not hasattr(self, "_length"):

View File

@ -165,7 +165,30 @@ def should_support_haystack_data_source():
table = PersonTable(SearchQuerySet().all())
table.as_html()
@core.test
def data_validation():
with raises(ValueError):
table = OrderedTable(None)
class Bad:
def __len__(self):
pass
with raises(ValueError):
table = OrderedTable(Bad())
class Ok:
def __len__(self):
return 1
def __getitem__(self, pos):
if pos != 0:
raise IndexError()
return {'a': 1}
table = OrderedTable(Ok())
assert len(table.rows) == 1
@core.test
def ordering():