1 ''' Asynchronous python bindings for the lircd socket interface. ''' 
   43 from lirc.client import AbstractConnection 
as AbstractConnection
 
   46 class AsyncConnection(object):
 
   47     ''' Asynchronous read interface on top of an AbstractConnection. 
   50        - connection: Typically a lirc.RawConnection or lirc.LircdConnection. 
   51        - loop: AbstractEventLoop, typically obtained using 
   52                asyncio.get_event_loop(). 
   55     def __init__(self, connection: AbstractConnection,
 
   56                  loop: asyncio.AbstractEventLoop):
 
   59             ''' Read data from the connection fd and put into queue. ''' 
   61                 line = self._conn.readline(0)
 
   63                     asyncio.ensure_future(self._queue.put(line))
 
   64             except Exception 
as e:
 
   66                 self._queue.put_nowait(e)
 
   68         self._conn = connection
 
   70         self._queue = asyncio.Queue()
 
   71         self._loop.add_reader(self._conn.fileno(), read_from_fd)
 
   74         ''' Clean up loop and the base connection. ''' 
   75         self._loop.remove_reader(self._conn.fileno())
 
   77     async 
def readline(self) -> str:
 
   78         ''' Asynchronous get next line from the connection. ''' 
   79         line = await self._queue.get()
 
   80         if isinstance(line, Exception):
 
   85         ''' Return async iterator. ''' 
   88     async 
def __anext__(self):
 
   89         ''' Implement async iterator.next(). ''' 
   90         line = await self._queue.get()
 
   91         if isinstance(line, Exception):
 
   92             raise StopAsyncIteration
 
   95     async 
def __aenter__(self):
 
   96         ''' Implement "async with". ''' 
   99     async 
def __aexit__(self, exc_type, exc, traceback):
 
  100         ''' Implement exit from "async with". '''