Skip to content
Snippets Groups Projects
Commit 02bdb870 authored by Piotr Maślanka's avatar Piotr Maślanka
Browse files

IterableReader for TQM

parent eaf62f6c
No related branches found
No related tags found
No related merge requests found
...@@ -36,6 +36,34 @@ class TQM(object): ...@@ -36,6 +36,34 @@ class TQM(object):
def put_nowait(self, item): def put_nowait(self, item):
self.put(item, False) self.put(item, False)
class IterableReader(object):
"""A wrapper around a Queue with additional property:
you can iterate over it. It will return messages received, and terminate
iteration when it has no more. You can use it like this:
while not terminating: # main program loop
for msg in myIterableReader:
process(msg)
.. do other stuff ..
"""
def __init__(self, queue):
self.queue = queue
def get(self, block=False, timeout=None):
return self.queue.get(block, timeout)
def get_nowait(self):
return self.queue.get_nowait()
def __iter__(self):
return self
def next(self):
try:
return self.queue.get_nowait()
except Queue.Empty:
raise StopIteration()
def __init__(self): def __init__(self):
self.db = {} # name => queue self.db = {} # name => queue
self.interfaces = {} # name => sugarcoat object self.interfaces = {} # name => sugarcoat object
...@@ -56,7 +84,7 @@ class TQM(object): ...@@ -56,7 +84,7 @@ class TQM(object):
return self.interfaces[name] return self.interfaces[name]
def get_reader_for(self, name): def get_reader_for(self, name):
return self._get_queue_for(name) return TQM.IterableReader(self._get_queue_for(name))
def get_writer_for(self, name): def get_writer_for(self, name):
return self._get_queue_for(name) return self._get_queue_for(name)
......
...@@ -50,4 +50,26 @@ class TQMTest(unittest.TestCase): ...@@ -50,4 +50,26 @@ class TQMTest(unittest.TestCase):
self.assertEquals(reader.get(), 10) self.assertEquals(reader.get(), 10)
self.assertEquals(reader.get(), 12) self.assertEquals(reader.get(), 12)
def test_tqm_iterablereader(self):
tqm = TQM()
reader = tqm.get_reader_for('dupa')
writer = tqm.get_writer_for('dupa')
writer.put('A')
writer.put('B')
i = 0
for msg in reader:
self.assertEquals(msg, {0: 'A', 1: 'B'}[i])
i += 1
writer.put('C')
writer.put('D')
i = 0
for msg in reader:
self.assertEquals(msg, {0: 'C', 1: 'D'}[i])
i += 1
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment