Add two new events on the reloader process (#2413)
This commit is contained in:
@@ -58,6 +58,36 @@ def write_app(filename, **runargs):
|
||||
return text
|
||||
|
||||
|
||||
def write_listener_app(filename, **runargs):
|
||||
start_text = secrets.token_urlsafe()
|
||||
stop_text = secrets.token_urlsafe()
|
||||
with open(filename, "w") as f:
|
||||
f.write(
|
||||
dedent(
|
||||
f"""\
|
||||
import os
|
||||
from sanic import Sanic
|
||||
|
||||
app = Sanic(__name__)
|
||||
|
||||
app.route("/")(lambda x: x)
|
||||
|
||||
@app.reload_process_start
|
||||
async def reload_start(*_):
|
||||
print("reload_start", os.getpid(), {start_text!r})
|
||||
|
||||
@app.reload_process_stop
|
||||
async def reload_stop(*_):
|
||||
print("reload_stop", os.getpid(), {stop_text!r})
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(**{runargs!r})
|
||||
"""
|
||||
)
|
||||
)
|
||||
return start_text, stop_text
|
||||
|
||||
|
||||
def write_json_config_app(filename, jsonfile, **runargs):
|
||||
with open(filename, "w") as f:
|
||||
f.write(
|
||||
@@ -92,10 +122,10 @@ def write_file(filename):
|
||||
return text
|
||||
|
||||
|
||||
def scanner(proc):
|
||||
def scanner(proc, trigger="complete"):
|
||||
for line in proc.stdout:
|
||||
line = line.decode().strip()
|
||||
if line.startswith("complete"):
|
||||
if line.startswith(trigger):
|
||||
yield line
|
||||
|
||||
|
||||
@@ -108,7 +138,7 @@ argv = dict(
|
||||
"sanic",
|
||||
"--port",
|
||||
"42204",
|
||||
"--debug",
|
||||
"--auto-reload",
|
||||
"reloader.app",
|
||||
],
|
||||
)
|
||||
@@ -118,7 +148,7 @@ argv = dict(
|
||||
"runargs, mode",
|
||||
[
|
||||
(dict(port=42202, auto_reload=True), "script"),
|
||||
(dict(port=42203, debug=True), "module"),
|
||||
(dict(port=42203, auto_reload=True), "module"),
|
||||
({}, "sanic"),
|
||||
],
|
||||
)
|
||||
@@ -151,7 +181,7 @@ async def test_reloader_live(runargs, mode):
|
||||
"runargs, mode",
|
||||
[
|
||||
(dict(port=42302, auto_reload=True), "script"),
|
||||
(dict(port=42303, debug=True), "module"),
|
||||
(dict(port=42303, auto_reload=True), "module"),
|
||||
({}, "sanic"),
|
||||
],
|
||||
)
|
||||
@@ -183,3 +213,30 @@ async def test_reloader_live_with_dir(runargs, mode):
|
||||
terminate(proc)
|
||||
with suppress(TimeoutExpired):
|
||||
proc.wait(timeout=3)
|
||||
|
||||
|
||||
def test_reload_listeners():
|
||||
with TemporaryDirectory() as tmpdir:
|
||||
filename = os.path.join(tmpdir, "reloader.py")
|
||||
start_text, stop_text = write_listener_app(
|
||||
filename, port=42305, auto_reload=True
|
||||
)
|
||||
|
||||
proc = Popen(
|
||||
argv["script"], cwd=tmpdir, stdout=PIPE, creationflags=flags
|
||||
)
|
||||
try:
|
||||
timeout = Timer(TIMER_DELAY, terminate, [proc])
|
||||
timeout.start()
|
||||
# Python apparently keeps using the old source sometimes if
|
||||
# we don't sleep before rewrite (pycache timestamp problem?)
|
||||
sleep(1)
|
||||
line = scanner(proc, "reload_start")
|
||||
assert start_text in next(line)
|
||||
line = scanner(proc, "reload_stop")
|
||||
assert stop_text in next(line)
|
||||
finally:
|
||||
timeout.cancel()
|
||||
terminate(proc)
|
||||
with suppress(TimeoutExpired):
|
||||
proc.wait(timeout=3)
|
||||
|
||||
@@ -199,3 +199,16 @@ async def test_missing_startup_raises_exception(app):
|
||||
|
||||
with pytest.raises(SanicException):
|
||||
await srv.before_start()
|
||||
|
||||
|
||||
def test_reload_listeners_attached(app):
|
||||
async def dummy(*_):
|
||||
...
|
||||
|
||||
app.reload_process_start(dummy)
|
||||
app.reload_process_stop(dummy)
|
||||
app.listener("reload_process_start")(dummy)
|
||||
app.listener("reload_process_stop")(dummy)
|
||||
|
||||
assert len(app.listeners.get("reload_process_start")) == 2
|
||||
assert len(app.listeners.get("reload_process_stop")) == 2
|
||||
|
||||
Reference in New Issue
Block a user