Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Per email from Brad Maggard on 2015-09-16, addfieldusingcontext() doe… #343

Merged
merged 1 commit into from Dec 3, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
33 changes: 33 additions & 0 deletions petl/test/transform/test_basics.py
Expand Up @@ -543,6 +543,39 @@ def downstream(prv, cur, nxt):
ieq(expect, table3)
ieq(expect, table3)

def test_addfieldusingcontext_stateful():

table1 = (('foo', 'bar'),
('A', 1),
('B', 4),
('C', 5),
('D', 9))

expect = (('foo', 'bar', 'baz', 'quux'),
('A', 1, 1, 5),
('B', 4, 5, 10),
('C', 5, 10, 19),
('D', 9, 19, 19))

def upstream(prv, cur, nxt):
if prv is None:
return cur.bar
else:
return cur.bar + prv.baz

def downstream(prv, cur, nxt):
if nxt is None:
return prv.quux
elif prv is None:
return nxt.bar + cur.bar
else:
return nxt.bar + prv.quux

table2 = addfieldusingcontext(table1, 'baz', upstream)
table3 = addfieldusingcontext(table2, 'quux', downstream)
ieq(expect, table3)
ieq(expect, table3)


def test_movefield():

Expand Down
5 changes: 3 additions & 2 deletions petl/transform/basics.py
Expand Up @@ -999,14 +999,15 @@ def iteraddfieldusingcontext(table, field, query):
hdr = tuple(next(it))
flds = list(map(text_type, hdr))
yield hdr + (field,)
flds.append(field)
it = (Record(row, flds) for row in it)
prv = None
cur = next(it)
for nxt in it:
v = query(prv, cur, nxt)
yield tuple(cur) + (v,)
prv = cur
prv = Record(tuple(cur) + (v,), flds)
cur = nxt
# handle last row
v = query(prv, cur, None)
yield tuple(cur) + (v,)
yield tuple(cur) + (v,)