Compare commits

..

1 Commits

Author SHA1 Message Date
Adam Hopkins
dcea7da2e1 Allow for simple signals 2023-08-30 12:48:04 +03:00
3 changed files with 30 additions and 32 deletions

View File

@@ -1,13 +1,6 @@
name: Tests name: Tests
on: on:
push:
branches:
- main
- current-release
- "*LTS"
tags:
- "!*"
pull_request: pull_request:
branches: branches:
- main - main

View File

@@ -657,9 +657,10 @@ class StartupMixin(metaclass=SanicMeta):
def get_server_location( def get_server_location(
server_settings: Optional[Dict[str, Any]] = None server_settings: Optional[Dict[str, Any]] = None
) -> str: ) -> str:
serve_location = ""
proto = "http" proto = "http"
if not server_settings: if not server_settings:
return "" return serve_location
host = server_settings["host"] host = server_settings["host"]
port = server_settings["port"] port = server_settings["port"]
@@ -667,33 +668,16 @@ class StartupMixin(metaclass=SanicMeta):
if server_settings.get("ssl") is not None: if server_settings.get("ssl") is not None:
proto = "https" proto = "https"
if server_settings.get("unix"): if server_settings.get("unix"):
return f'{server_settings["unix"]} {proto}://localhost' serve_location = f'{server_settings["unix"]} {proto}://...'
if server_settings.get("sock"): elif server_settings.get("sock"):
host, port, *_ = server_settings["sock"].getsockname() host, port, *_ = server_settings["sock"].getsockname()
if not host or not port:
return ""
# colon(:) is legal for a host only in an ipv6 address if not serve_location and host and port:
url_host = f"[{host}]" if ":" in host else host # colon(:) is legal for a host only in an ipv6 address
url_port = ( display_host = f"[{host}]" if ":" in host else host
"" serve_location = f"{proto}://{display_host}:{port}"
if (
(proto == "https" and port == 443)
or (proto == "http" and port == 80)
)
else f":{port}"
)
special = { return serve_location
"127.0.0.1": "IPv4",
"0.0.0.0": "IPv4 wildcard",
"::1": "IPv6",
"::": "IPv6 wildcard",
}.get(host, "")
if special:
return f"({special}) {proto}://localhost{url_port}"
return f"{proto}://{url_host}{url_port}"
@staticmethod @staticmethod
def get_address( def get_address(

View File

@@ -39,6 +39,7 @@ class Event(Enum):
RESERVED_NAMESPACES = { RESERVED_NAMESPACES = {
"sanic": ("sanic.__signal__.__init__",),
"server": ( "server": (
Event.SERVER_EXCEPTION_REPORT.value, Event.SERVER_EXCEPTION_REPORT.value,
Event.SERVER_INIT_AFTER.value, Event.SERVER_INIT_AFTER.value,
@@ -65,6 +66,8 @@ RESERVED_NAMESPACES = {
), ),
} }
GENERIC_SIGNAL_FORMAT = "__generic__.__signal__.%s"
def _blank(): def _blank():
... ...
@@ -89,11 +92,26 @@ class SignalRouter(BaseRouter):
self.allow_fail_builtin = True self.allow_fail_builtin = True
self.ctx.loop = None self.ctx.loop = None
@staticmethod
def format_event(event: str) -> str:
"""Ensure event strings in proper format
Args:
event (str): event string
Returns:
str: formatted event string
"""
if "." not in event:
event = GENERIC_SIGNAL_FORMAT % event
return event
def get( # type: ignore def get( # type: ignore
self, self,
event: str, event: str,
condition: Optional[Dict[str, str]] = None, condition: Optional[Dict[str, str]] = None,
): ):
event = self.format_event(event)
extra = condition or {} extra = condition or {}
try: try:
group, param_basket = self.find_route( group, param_basket = self.find_route(
@@ -133,6 +151,7 @@ class SignalRouter(BaseRouter):
fail_not_found: bool = True, fail_not_found: bool = True,
reverse: bool = False, reverse: bool = False,
) -> Any: ) -> Any:
event = self.format_event(event)
try: try:
group, handlers, params = self.get(event, condition=condition) group, handlers, params = self.get(event, condition=condition)
except NotFound as e: except NotFound as e:
@@ -195,6 +214,7 @@ class SignalRouter(BaseRouter):
inline: bool = False, inline: bool = False,
reverse: bool = False, reverse: bool = False,
) -> Union[asyncio.Task, Any]: ) -> Union[asyncio.Task, Any]:
event = self.format_event(event)
dispatch = self._dispatch( dispatch = self._dispatch(
event, event,
context=context, context=context,
@@ -218,6 +238,7 @@ class SignalRouter(BaseRouter):
condition: Optional[Dict[str, Any]] = None, condition: Optional[Dict[str, Any]] = None,
exclusive: bool = True, exclusive: bool = True,
) -> Signal: ) -> Signal:
event = self.format_event(event)
event_definition = event event_definition = event
parts = self._build_event_parts(event) parts = self._build_event_parts(event)
if parts[2].startswith("<"): if parts[2].startswith("<"):