Skip to content

Commit 30bf53b

Browse files
edges() and iteredges() now work for all applicable dawgs; tests added for all new edges methods
1 parent 0211c19 commit 30bf53b

File tree

2 files changed

+47
-10
lines changed

2 files changed

+47
-10
lines changed

dawg_python/dawgs.py

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,24 @@ def items(self, prefix=""):
332332

333333
return res
334334

335+
def iteritems(self, prefix=""):
336+
index = self.dct.ROOT
337+
if not isinstance(prefix, bytes):
338+
prefix = prefix.encode('utf8')
339+
if prefix:
340+
index = self.dct.follow_bytes(prefix, index)
341+
if not index:
342+
return
343+
344+
completer = wrapper.Completer(self.dct, self.guide)
345+
completer.start(index, prefix)
346+
347+
while completer.next():
348+
key, value = completer.key.split(self._payload_separator)
349+
# bytes() cast is a python 2.6 fix
350+
item = (key.decode('utf8'), a2b_base64(bytes(value)))
351+
yield item
352+
335353
def edges(self, prefix=""):
336354
index = self.dct.ROOT
337355
if not isinstance(prefix, bytes):
@@ -346,13 +364,15 @@ def edges(self, prefix=""):
346364
if not edge_follower.start(index, prefix):
347365
return res
348366

349-
res.append(edge_follower.decoded_key)
367+
vals = self.b_get_value(edge_follower.decoded_key) or [False]
368+
res.extend([(edge_follower.decoded_key, val) for val in vals])
350369
while edge_follower.next():
351-
res.append(edge_follower.decoded_key)
370+
vals = self.b_get_value(edge_follower.decoded_key) or [False]
371+
res.extend([(edge_follower.decoded_key, val) for val in vals])
352372

353373
return res
354374

355-
def iteritems(self, prefix=""):
375+
def iteredges(self, prefix=""):
356376
index = self.dct.ROOT
357377
if not isinstance(prefix, bytes):
358378
prefix = prefix.encode('utf8')
@@ -361,14 +381,17 @@ def iteritems(self, prefix=""):
361381
if not index:
362382
return
363383

364-
completer = wrapper.Completer(self.dct, self.guide)
365-
completer.start(index, prefix)
366-
367-
while completer.next():
368-
key, value = completer.key.split(self._payload_separator)
369-
item = (key.decode('utf8'), a2b_base64(bytes(value))) # bytes() cast is a python 2.6 fix
370-
yield item
384+
edge_follower = wrapper.EdgeFollower(self.dct, self.guide)
385+
if not edge_follower.start(index, prefix):
386+
return
371387

388+
vals = self.b_get_value(edge_follower.decoded_key) or [False]
389+
for val in vals:
390+
yield (edge_follower.decoded_key, val or False)
391+
while edge_follower.next():
392+
vals = self.b_get_value(edge_follower.decoded_key) or [False]
393+
for val in vals:
394+
yield (edge_follower.decoded_key, val or False)
372395

373396
def _has_value(self, index):
374397
return self.dct.follow_bytes(PAYLOAD_SEPARATOR, index)

tests/test_payload_dawg.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,18 @@ def test_iterkeys(self):
5858
d = self.dawg()
5959
assert list(d.iterkeys()) == d.keys()
6060

61+
def test_edges(self):
62+
d = self.dawg()
63+
assert d.edges('foob') == [('fooba', False)]
64+
assert d.edges('fooba') == [('foobar', b'data4')]
65+
assert d.edges('fo') == [('foo', b'data1'), ('foo', b'data3')]
66+
67+
def test_iteredges(self):
68+
d = self.dawg()
69+
assert list(d.iteredges('foob')) == [('fooba', False)]
70+
assert list(d.iteredges('fooba')) == [('foobar', b'data4')]
71+
assert list(d.iteredges('fo')) == [('foo', b'data1'), ('foo', b'data3')]
72+
6173
def test_key_completion(self):
6274
d = self.dawg()
6375
assert d.keys('fo') == ['foo', 'foo', 'foobar']
@@ -75,6 +87,8 @@ def test_iteritems(self):
7587
def test_items_completion(self):
7688
d = self.dawg()
7789
assert d.items('foob') == [('foobar', b'data4')]
90+
assert d.items('foo') == [('foo', b'data1'), ('foo', b'data3'),
91+
('foobar', b'data4')]
7892

7993
def test_prefixes(self):
8094
d = self.dawg()

0 commit comments

Comments
 (0)