Skip to content

Commit 40626d4

Browse files
authored
Merge pull request #13 from hawkfish/voila
Various fixes found working on the Voila example
2 parents ad06cfb + 6764acc commit 40626d4

5 files changed

Lines changed: 40 additions & 6 deletions

File tree

File renamed without changes.

src/textform/fold.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ def readrow(self):
7070
# Buffer empty, so pivot next row
7171
row = super().readrow()
7272

73+
# Rebuild the buffer because the rows we return are not ours.
74+
self._buffer = [{self.tag: tag} for tag in self.tags]
75+
7376
# Update the folds
7477
for g, group in enumerate(self._groups):
7578
output = self.outputs[g+1]

src/textform/iterate.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class Iterate(Transform):
2929
def __init__(self, source, input, tags, strings, layout='csv', **config):
3030
super().__init__('iterate', input, (tags, strings,), source)
3131

32-
self._validateOutputs()
32+
self._validateOutputs(self.inputs)
3333

3434
self.function = bind_iterate(self.name, layout, strings, **config)
3535
self._buffer = []
@@ -54,12 +54,13 @@ def readrow(self):
5454
if self._position < len(self._buffer):
5555
return self._unbuffer()
5656

57-
# Buffer empty, so expand the next row
57+
# Buffer flushed, so expand the next row
5858
row = self.source.readrow()
5959
ragged = self.function(row[self.input])
6060
del row[self.input]
6161

6262
# Update the buffer
63+
self._buffer = []
6364
for tag in ragged:
6465
buffered = dict(zip(self.outputs, (str(tag), str(ragged[tag]),)))
6566
buffered.update(row)

src/textform/unfold.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ def __init__(self, source, inputs, outputs):
1515

1616
self.fixed = [f for f in filter(lambda input: input not in self.inputs, self.source.fieldnames)]
1717

18+
# Ragged group buffer
19+
self._ragged = None
20+
1821
def _schema(self):
1922
schema = super()._schema()
2023

@@ -46,10 +49,28 @@ def readrow(self):
4649
# and emitting a row whenever it is complete
4750
row = None
4851
for g in range(len(self._groups[0])):
49-
folded = super().readrow()
50-
51-
if row is None: row = {fixed: folded[fixed] for fixed in self.fixed}
52-
row.update({self._groups[f][g]: folded[self.folds[f]] for f in range(len(self.folds))})
52+
folded = self._ragged
53+
self._ragged = None
54+
if not folded:
55+
try:
56+
folded = super().readrow()
57+
except StopIteration:
58+
if row: break
59+
raise
60+
61+
if row is None:
62+
row = {output: None for output in self.outputs}
63+
row.update({fixed: folded[fixed] for fixed in self.fixed})
64+
65+
elif not all([folded[fixed] == row[fixed] for fixed in self.fixed]):
66+
self._ragged = {output: None for output in self.outputs}
67+
self._ragged.update(folded)
68+
break
69+
70+
try:
71+
row.update({self._groups[f][g]: folded[self.folds[f]] for f in range(len(self.folds))})
72+
except:
73+
raise
5374

5475
self._updateSchemaTypes(row, self.outputs)
5576

tests/test_fold.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,12 @@ def test_voila_6(self):
129129
self.assertEqual(5 + actual // len(unfolded), row['#BLENDs'], actual)
130130
actual += 1
131131
self.assertEqual((len(csv) - 1) * len(unfolded), actual)
132+
133+
def test_drop_tags(self):
134+
s = None
135+
s = txf.Sequence(s, 'Fold 1')
136+
s = txf.Sequence(s, 'Fold 2')
137+
s = txf.Limit(s, 4)
138+
s = txf.Fold(s, ('Fold 1', 'Fold 2',), ('Tags', 'Group',))
139+
s = txf.Drop(s, 'Tags')
140+
s.pump()

0 commit comments

Comments
 (0)