xeroc/python-graphenelib

View on GitHub
docs/asyncio.rst

Summary

Maintainability
Test Coverage
Asyncio support
===============

The library has full support of asyncio, though you need to be aware it has some limitations.

Example
-------

A very basic example on how to do raw API call:

.. code-block:: python

    import asyncio
    from grapheneapi.aio.websocket import Websocket

    import logging
    logger = logging.getLogger('websockets')
    logger.setLevel(logging.DEBUG)
    logger.addHandler(logging.StreamHandler())

    loop = asyncio.get_event_loop()
    ws = Websocket('wss://eu.nodes.bitshares.ws', loop=loop)
    props = loop.run_until_complete(ws.get_dynamic_global_properties())
    print(props)

Limitations
-----------

* Most of the classes requires async init because during instantiation some API calls has to be performed:

.. code-block:: python

    await Amount('10 FOO')

* Several math operations are not available for :class:`graphenecommon.aio.Amount`, :class:`graphenecommon.aio.Price`
  objects. This includes multiplication, division etc. This limitation is due to unability to define python magic
  methods (``__mul__``, ``__div__``, etc) as async coroutines

Concurrent RPC calls
--------------------

When using async version, you can perform multiple RPC calls from different coroutines concurrently. The library will
send requests immediately in non-blocking manner. Incoming responses will be properly matched with queries by using "id"
field of json-rpc query.

Subscriptions
-------------

In asyncio version subscription notifications are not handled in callback-based manner. Instead, they are available in
`self.notifications` queue which is :class:`asyncio.Queue`.

Debugging
---------

To enable debugging on RPC level, you can raise loglevel on following loggers (don't forget to set formatter as well):

.. code-block:: python

    log = logging.getLogger("websockets")
    log.setLevel(logging.DEBUG)

    log = logging.getLogger("grapheneapi")
    log.setLevel(logging.DEBUG)

Tests
-----

Current testsuite uses pre-populated object cache, so it doesn't cover lots of functionality. Asyncio-specific tests
could be run via ``pytest -v tests/test_*aio*.py``