86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
from __future__ import unicode_literals
|
|
from abc import ABCMeta, abstractmethod
|
|
from six import with_metaclass
|
|
|
|
__all__ = (
|
|
'EventLoop',
|
|
'INPUT_TIMEOUT',
|
|
)
|
|
|
|
|
|
#: When to trigger the `onInputTimeout` event.
|
|
INPUT_TIMEOUT = .5
|
|
|
|
|
|
class EventLoop(with_metaclass(ABCMeta, object)):
|
|
"""
|
|
Eventloop interface.
|
|
"""
|
|
def run(self, stdin, callbacks):
|
|
"""
|
|
Run the eventloop until stop() is called. Report all
|
|
input/timeout/terminal-resize events to the callbacks.
|
|
|
|
:param stdin: :class:`~libs.prompt_toolkit.input.Input` instance.
|
|
:param callbacks: :class:`~libs.prompt_toolkit.eventloop.callbacks.EventLoopCallbacks` instance.
|
|
"""
|
|
raise NotImplementedError("This eventloop doesn't implement synchronous 'run()'.")
|
|
|
|
def run_as_coroutine(self, stdin, callbacks):
|
|
"""
|
|
Similar to `run`, but this is a coroutine. (For asyncio integration.)
|
|
"""
|
|
raise NotImplementedError("This eventloop doesn't implement 'run_as_coroutine()'.")
|
|
|
|
@abstractmethod
|
|
def stop(self):
|
|
"""
|
|
Stop the `run` call. (Normally called by
|
|
:class:`~libs.prompt_toolkit.interface.CommandLineInterface`, when a result
|
|
is available, or Abort/Quit has been called.)
|
|
"""
|
|
|
|
@abstractmethod
|
|
def close(self):
|
|
"""
|
|
Clean up of resources. Eventloop cannot be reused a second time after
|
|
this call.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def add_reader(self, fd, callback):
|
|
"""
|
|
Start watching the file descriptor for read availability and then call
|
|
the callback.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def remove_reader(self, fd):
|
|
"""
|
|
Stop watching the file descriptor for read availability.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def run_in_executor(self, callback):
|
|
"""
|
|
Run a long running function in a background thread. (This is
|
|
recommended for code that could block the event loop.)
|
|
Similar to Twisted's ``deferToThread``.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def call_from_executor(self, callback, _max_postpone_until=None):
|
|
"""
|
|
Call this function in the main event loop. Similar to Twisted's
|
|
``callFromThread``.
|
|
|
|
:param _max_postpone_until: `None` or `time.time` value. For interal
|
|
use. If the eventloop is saturated, consider this task to be low
|
|
priority and postpone maximum until this timestamp. (For instance,
|
|
repaint is done using low priority.)
|
|
|
|
Note: In the past, this used to be a datetime.datetime instance,
|
|
but apparently, executing `time.time` is more efficient: it
|
|
does fewer system calls. (It doesn't read /etc/localtime.)
|
|
"""
|