Skip to content

acatton/ohneio

Repository files navigation

Ohne I/O

https://travis-ci.org/acatton/ohneio.svg?branch=master

Utility library to write network protocol parser, sans I/O.

Ohne I/O (without I/O in German) is a library using asyncio corouting programming style.

This library only supports Python 3.4+ (including Python 3.6 nightly)

ohneio allows you to write protocol parsers the way you would write an asyncio protocol:

>>> import base64
>>> import ohneio
>>>
>>> def wait_for(s):
...     while True:
...         data = yield from ohneio.peek()
...         pos = data.find(s)
...         if pos >= 0:
...             return pos
...         yield from ohneio.wait()
...
>>> def read_until(s):
...     pos = yield from wait_for(s)
...     data = yield from ohneio.read(pos)
...     return data
...
>>> @ohneio.protocol
... def echo_base64(separator):
...     while True:
...         segment = yield from read_until(separator)
...         yield from ohneio.read(len(separator))
...         yield from ohneio.write(base64.b64encode(segment) + separator)
...
>>> connection = echo_base64(b'\r\n')
>>> connection.send(b'hello')
>>> connection.read()
b''
>>> connection.send(b'\r\nworld\r\n')
>>> connection.read()
b'aGVsbG8=\r\nd29ybGQ=\r\n'

The example above also shows how ohneio allows you to combine primitives into bigger parsing functions (like wait_for and read_until).