Add handler names for websockets for url_for usage (#1880)

This commit is contained in:
Adam Hopkins 2020-06-28 14:45:52 +03:00 committed by GitHub
parent 761eef7d96
commit 938c49b899
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 100 additions and 14 deletions

View File

@ -283,6 +283,13 @@ class Blueprint:
strict_slashes = self.strict_slashes strict_slashes = self.strict_slashes
def decorator(handler): def decorator(handler):
nonlocal uri
nonlocal host
nonlocal strict_slashes
nonlocal version
nonlocal name
name = f"{self.name}.{name or handler.__name__}"
route = FutureRoute( route = FutureRoute(
handler, uri, [], host, strict_slashes, False, version, name handler, uri, [], host, strict_slashes, False, version, name
) )

View File

@ -253,7 +253,11 @@ def test_several_bp_with_host(app):
def test_bp_with_host_list(app): def test_bp_with_host_list(app):
bp = Blueprint("test_bp_host", url_prefix="/test1", host=["example.com", "sub.example.com"]) bp = Blueprint(
"test_bp_host",
url_prefix="/test1",
host=["example.com", "sub.example.com"],
)
@bp.route("/") @bp.route("/")
def handler1(request): def handler1(request):
@ -279,8 +283,16 @@ def test_bp_with_host_list(app):
def test_several_bp_with_host_list(app): def test_several_bp_with_host_list(app):
bp = Blueprint("test_text", url_prefix="/test", host=["example.com", "sub.example.com"]) bp = Blueprint(
bp2 = Blueprint("test_text2", url_prefix="/test", host=["sub1.example.com", "sub2.example.com"]) "test_text",
url_prefix="/test",
host=["example.com", "sub.example.com"],
)
bp2 = Blueprint(
"test_text2",
url_prefix="/test",
host=["sub1.example.com", "sub2.example.com"],
)
@bp.route("/") @bp.route("/")
def handler(request): def handler(request):

View File

@ -88,10 +88,11 @@ def test_pickle_app_with_bp(app, protocol):
assert up_p_app.is_request_stream is False assert up_p_app.is_request_stream is False
assert response.text == "Hello" assert response.text == "Hello"
@pytest.mark.parametrize("protocol", [3, 4]) @pytest.mark.parametrize("protocol", [3, 4])
def test_pickle_app_with_static(app, protocol): def test_pickle_app_with_static(app, protocol):
app.route("/")(handler) app.route("/")(handler)
app.static('/static', "/tmp/static") app.static("/static", "/tmp/static")
p_app = pickle.dumps(app, protocol=protocol) p_app = pickle.dumps(app, protocol=protocol)
del app del app
up_p_app = pickle.loads(p_app) up_p_app = pickle.loads(p_app)

View File

@ -1,8 +1,8 @@
import os import os
import secrets import secrets
import sys import sys
from contextlib import suppress
from contextlib import suppress
from subprocess import PIPE, Popen, TimeoutExpired from subprocess import PIPE, Popen, TimeoutExpired
from tempfile import TemporaryDirectory from tempfile import TemporaryDirectory
from textwrap import dedent from textwrap import dedent
@ -23,16 +23,20 @@ try:
except ImportError: except ImportError:
flags = 0 flags = 0
def terminate(proc): def terminate(proc):
if flags: if flags:
proc.send_signal(CTRL_BREAK_EVENT) proc.send_signal(CTRL_BREAK_EVENT)
else: else:
proc.terminate() proc.terminate()
def write_app(filename, **runargs): def write_app(filename, **runargs):
text = secrets.token_urlsafe() text = secrets.token_urlsafe()
with open(filename, "w") as f: with open(filename, "w") as f:
f.write(dedent(f"""\ f.write(
dedent(
f"""\
import os import os
from sanic import Sanic from sanic import Sanic
@ -45,9 +49,11 @@ def write_app(filename, **runargs):
if __name__ == "__main__": if __name__ == "__main__":
app.run(**{runargs!r}) app.run(**{runargs!r})
""" """
)) )
)
return text return text
def scanner(proc): def scanner(proc):
for line in proc.stdout: for line in proc.stdout:
line = line.decode().strip() line = line.decode().strip()
@ -59,14 +65,26 @@ def scanner(proc):
argv = dict( argv = dict(
script=[sys.executable, "reloader.py"], script=[sys.executable, "reloader.py"],
module=[sys.executable, "-m", "reloader"], module=[sys.executable, "-m", "reloader"],
sanic=[sys.executable, "-m", "sanic", "--port", "42104", "--debug", "reloader.app"], sanic=[
sys.executable,
"-m",
"sanic",
"--port",
"42104",
"--debug",
"reloader.app",
],
) )
@pytest.mark.parametrize("runargs, mode", [
@pytest.mark.parametrize(
"runargs, mode",
[
(dict(port=42102, auto_reload=True), "script"), (dict(port=42102, auto_reload=True), "script"),
(dict(port=42103, debug=True), "module"), (dict(port=42103, debug=True), "module"),
(dict(), "sanic"), (dict(), "sanic"),
]) ],
)
async def test_reloader_live(runargs, mode): async def test_reloader_live(runargs, mode):
with TemporaryDirectory() as tmpdir: with TemporaryDirectory() as tmpdir:
filename = os.path.join(tmpdir, "reloader.py") filename = os.path.join(tmpdir, "reloader.py")

View File

@ -614,7 +614,7 @@ def test_response_body_bytes_deprecated(app):
with warnings.catch_warnings(record=True) as w: with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always") warnings.simplefilter("always")
HTTPResponse(body_bytes=b'bytes') HTTPResponse(body_bytes=b"bytes")
assert len(w) == 1 assert len(w) == 1
assert issubclass(w[0].category, DeprecationWarning) assert issubclass(w[0].category, DeprecationWarning)

View File

@ -1,3 +1,8 @@
import asyncio
from sanic.blueprints import Blueprint
def test_routes_with_host(app): def test_routes_with_host(app):
@app.route("/") @app.route("/")
@app.route("/", name="hostindex", host="example.com") @app.route("/", name="hostindex", host="example.com")
@ -13,3 +18,46 @@ def test_routes_with_host(app):
app.url_for("hostpath", _external=True) app.url_for("hostpath", _external=True)
== "http://path.example.com/path" == "http://path.example.com/path"
) )
def test_websocket_bp_route_name(app):
"""Tests that blueprint websocket route is named."""
event = asyncio.Event()
bp = Blueprint("test_bp", url_prefix="/bp")
@bp.get("/main")
async def main(request):
...
@bp.websocket("/route")
async def test_route(request, ws):
event.set()
@bp.websocket("/route2")
async def test_route2(request, ws):
event.set()
@bp.websocket("/route3", name="foobar_3")
async def test_route3(request, ws):
event.set()
app.blueprint(bp)
uri = app.url_for("test_bp.main")
assert uri == "/bp/main"
uri = app.url_for("test_bp.test_route")
assert uri == "/bp/route"
request, response = app.test_client.websocket(uri)
assert response.opened is True
assert event.is_set()
event.clear()
uri = app.url_for("test_bp.test_route2")
assert uri == "/bp/route2"
request, response = app.test_client.websocket(uri)
assert response.opened is True
assert event.is_set()
uri = app.url_for("test_bp.foobar_3")
assert uri == "/bp/route3"