import StringIO """ SimpleChannel. Kept simple and small.. """ class SCAccesor: """An accesor over a SimpleChannel""" def __init__(self, strtuple): self.readfrom, self.writeto = strtuple self.rpos = self.wpos = 0 def _handle_rpos(self, func, args): self.readfrom.seek(self.rpos) ret = func(*args) self.rpos = self.readfrom.tell() return ret def _handle_wpos(self, func, args): self.writeto.seek(self.wpos) ret = func(*args) self.wpos = self.writeto.tell() return ret def read(self, *args): return self._handle_rpos(self.readfrom.read, args) def readline(self, *args): return self._handle_rpos(self.readfrom.readline, args) def write(self, *args): return self._handle_wpos(self.writeto.write, args) def seek(self, *args): #return self._handle_pos(self.file.seek, args) raise 'must implement' def tell(self, *args): #return self._keep_pos(self.file.tell, args) raise 'must implement' def truncate(self, *args): #return self._keep_pos(self.file.truncate, args) raise 'must implement' def close(self): #do something here self.readfrom = self.writefrom = None class SimpleChannel: """ A Channel for accessing a file at two places.. as a bidireccional socket """ def __init__(self, twoway=False, strclass=StringIO.StringIO): self.twoway = twoway self.st1 = strclass() if self.twoway: self.st2 = strclass() else: self.st2 = None def get_reader(self): return ( SCAccesor( (self.st1, self.st2) )) def get_writer(self): return ( SCAccesor( (self.st2, self.st1) )) def likepopen(self): return (self.get_reader(), self.get_writer()) if __name__=='__main__': import unittest class genTester(unittest.TestCase): def _test_instances(self, reader, writer): """ This is used to check that any instance keep it's position pointer """ t = writer.write('hola carlos') t = reader.read(5) self.assertEqual(t, 'hola ') t = writer.write(' -> chau') t = reader.read() self.assertEqual(t, 'carlos -> chau') class testChannel(genTester): """Test Channel""" def test_1(self): """Test that a channel reader/writer works as I want :-)""" c = SimpleChannel() r = c.get_reader() w = c.get_writer() self._test_instances(r,w) def test_twosided(self): """Test bi-dir""" c = SimpleChannel(True) r = c.get_reader() w = c.get_writer() self._test_instances(r,w) self._test_instances(w,r) suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(testChannel)) unittest.TextTestRunner(verbosity=2).run(suite)