69 lines
1.6 KiB
Python
69 lines
1.6 KiB
Python
|
|
"""Abstract classes."""
|
||
|
|
import abc
|
||
|
|
from collections.abc import Callable
|
||
|
|
|
||
|
|
__all__ = ['Thenable']
|
||
|
|
|
||
|
|
|
||
|
|
class Thenable(Callable, metaclass=abc.ABCMeta): # pragma: no cover
|
||
|
|
"""Object that supports ``.then()``."""
|
||
|
|
|
||
|
|
__slots__ = ()
|
||
|
|
|
||
|
|
@abc.abstractmethod
|
||
|
|
def then(self, on_success, on_error=None):
|
||
|
|
raise NotImplementedError()
|
||
|
|
|
||
|
|
@abc.abstractmethod
|
||
|
|
def throw(self, exc=None, tb=None, propagate=True):
|
||
|
|
raise NotImplementedError()
|
||
|
|
|
||
|
|
@abc.abstractmethod
|
||
|
|
def cancel(self):
|
||
|
|
raise NotImplementedError()
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def __subclasshook__(cls, C):
|
||
|
|
if cls is Thenable:
|
||
|
|
if any('then' in B.__dict__ for B in C.__mro__):
|
||
|
|
return True
|
||
|
|
return NotImplemented
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def register(cls, other):
|
||
|
|
# overide to return other so `register` can be used as a decorator
|
||
|
|
type(cls).register(cls, other)
|
||
|
|
return other
|
||
|
|
|
||
|
|
|
||
|
|
@Thenable.register
|
||
|
|
class ThenableProxy:
|
||
|
|
"""Proxy to object that supports ``.then()``."""
|
||
|
|
|
||
|
|
def _set_promise_target(self, p):
|
||
|
|
self._p = p
|
||
|
|
|
||
|
|
def then(self, on_success, on_error=None):
|
||
|
|
return self._p.then(on_success, on_error)
|
||
|
|
|
||
|
|
def cancel(self):
|
||
|
|
return self._p.cancel()
|
||
|
|
|
||
|
|
def throw1(self, exc=None):
|
||
|
|
return self._p.throw1(exc)
|
||
|
|
|
||
|
|
def throw(self, exc=None, tb=None, propagate=True):
|
||
|
|
return self._p.throw(exc, tb=tb, propagate=propagate)
|
||
|
|
|
||
|
|
@property
|
||
|
|
def cancelled(self):
|
||
|
|
return self._p.cancelled
|
||
|
|
|
||
|
|
@property
|
||
|
|
def ready(self):
|
||
|
|
return self._p.ready
|
||
|
|
|
||
|
|
@property
|
||
|
|
def failed(self):
|
||
|
|
return self._p.failed
|