Skip to content

Commit

Permalink
iterable_loader: store exception and reraise if needed
Browse files Browse the repository at this point in the history
resource.infer() might silently discard exceptions.
fixes datahq#54
  • Loading branch information
akariv committed Jan 11, 2019
1 parent 9e7bd7c commit 556e435
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 9 deletions.
25 changes: 16 additions & 9 deletions dataflows/helpers/iterable_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,18 +68,23 @@ def __init__(self, iterable, name=None):
super(iterable_loader, self).__init__()
self.iterable = iterable
self.name = name
self.exc = None

def handle_iterable(self):
mode = None
for x in self.iterable:
if mode is None:
assert isinstance(x, (dict, list))
mode = dict if isinstance(x, dict) else list
assert isinstance(x, mode)
if mode == dict:
yield x
else:
yield dict(zip(('col{}'.format(i) for i in range(len(x))), x))
try:
for x in self.iterable:
if mode is None:
assert isinstance(x, (dict, list))
mode = dict if isinstance(x, dict) else list
assert isinstance(x, mode)
if mode == dict:
yield x
else:
yield dict(zip(('col{}'.format(i) for i in range(len(x))), x))
except Exception as e:
self.exc = e
raise

def process_datapackage(self, dp: Package):
name = self.name
Expand All @@ -90,6 +95,8 @@ def process_datapackage(self, dp: Package):
path='{}.csv'.format(name)
), storage=iterable_storage(self.handle_iterable()))
self.res.infer()
if self.exc is not None:
raise self.exc
dp.descriptor.setdefault('resources', []).append(self.res.descriptor)
return dp

Expand Down
15 changes: 15 additions & 0 deletions tests/test_edge_cases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import pytest

def test_exception_in_generator():
from dataflows import Flow, printer

class MyException(Exception):
pass

def generator():
for i in range(5):
raise MyException()
yield {"i": i}

with pytest.raises(MyException):
Flow(generator(), printer()).process()

0 comments on commit 556e435

Please sign in to comment.