2022-01-24 04:07:52 +00:00
|
|
|
import typing as t
|
2019-11-28 11:40:45 +00:00
|
|
|
|
|
|
|
try:
|
|
|
|
from blinker import Namespace
|
|
|
|
|
|
|
|
signals_available = True
|
|
|
|
except ImportError:
|
|
|
|
signals_available = False
|
|
|
|
|
2022-01-24 04:07:52 +00:00
|
|
|
class Namespace: # type: ignore
|
|
|
|
def signal(self, name: str, doc: t.Optional[str] = None) -> "_FakeSignal":
|
2019-11-28 11:40:45 +00:00
|
|
|
return _FakeSignal(name, doc)
|
|
|
|
|
2022-01-24 04:07:52 +00:00
|
|
|
class _FakeSignal:
|
2019-11-28 11:40:45 +00:00
|
|
|
"""If blinker is unavailable, create a fake class with the same
|
|
|
|
interface that allows sending of signals but will fail with an
|
|
|
|
error on anything else. Instead of doing anything on send, it
|
|
|
|
will just ignore the arguments and do nothing instead.
|
|
|
|
"""
|
|
|
|
|
2022-01-24 04:07:52 +00:00
|
|
|
def __init__(self, name: str, doc: t.Optional[str] = None) -> None:
|
2019-11-28 11:40:45 +00:00
|
|
|
self.name = name
|
|
|
|
self.__doc__ = doc
|
|
|
|
|
2022-01-24 04:07:52 +00:00
|
|
|
def send(self, *args: t.Any, **kwargs: t.Any) -> t.Any:
|
2019-11-28 11:40:45 +00:00
|
|
|
pass
|
|
|
|
|
2022-01-24 04:07:52 +00:00
|
|
|
def _fail(self, *args: t.Any, **kwargs: t.Any) -> t.Any:
|
2019-11-28 11:40:45 +00:00
|
|
|
raise RuntimeError(
|
|
|
|
"Signalling support is unavailable because the blinker"
|
|
|
|
" library is not installed."
|
2022-01-24 04:07:52 +00:00
|
|
|
) from None
|
2019-11-28 11:40:45 +00:00
|
|
|
|
|
|
|
connect = connect_via = connected_to = temporarily_connected_to = _fail
|
|
|
|
disconnect = _fail
|
|
|
|
has_receivers_for = receivers_for = _fail
|
|
|
|
del _fail
|
|
|
|
|
|
|
|
|
|
|
|
# The namespace for code signals. If you are not Flask code, do
|
|
|
|
# not put signals in here. Create your own namespace instead.
|
|
|
|
_signals = Namespace()
|
|
|
|
|
|
|
|
|
|
|
|
# Core signals. For usage examples grep the source code or consult
|
|
|
|
# the API documentation in docs/api.rst as well as docs/signals.rst
|
|
|
|
template_rendered = _signals.signal("template-rendered")
|
|
|
|
before_render_template = _signals.signal("before-render-template")
|
|
|
|
request_started = _signals.signal("request-started")
|
|
|
|
request_finished = _signals.signal("request-finished")
|
|
|
|
request_tearing_down = _signals.signal("request-tearing-down")
|
|
|
|
got_request_exception = _signals.signal("got-request-exception")
|
|
|
|
appcontext_tearing_down = _signals.signal("appcontext-tearing-down")
|
|
|
|
appcontext_pushed = _signals.signal("appcontext-pushed")
|
|
|
|
appcontext_popped = _signals.signal("appcontext-popped")
|
|
|
|
message_flashed = _signals.signal("message-flashed")
|