Python
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
docs
.coveragerc
.gitignore
.travis.yml
LICENSE
MANIFEST.in
README
README.rst
ohneio.py
pytest.ini
setup.py
test_ohneio.py
tox.ini

README.rst

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).