Warn on duplicate route names (#2525)

This commit is contained in:
Adam Hopkins 2022-08-10 20:36:47 +03:00 committed by GitHub
parent 2f6f2bfa76
commit 8e9342e188
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 0 deletions

View File

@ -1521,6 +1521,18 @@ class Sanic(BaseSanic, RunnerMixin, metaclass=TouchUpMeta):
self.signalize(self.config.TOUCHUP) self.signalize(self.config.TOUCHUP)
self.finalize() self.finalize()
route_names = [route.name for route in self.router.routes]
duplicates = {
name for name in route_names if route_names.count(name) > 1
}
if duplicates:
names = ", ".join(duplicates)
deprecation(
f"Duplicate route names detected: {names}. In the future, "
"Sanic will enforce uniqueness in route naming.",
23.3,
)
# TODO: Replace in v22.6 to check against apps in app registry # TODO: Replace in v22.6 to check against apps in app registry
if ( if (
self.__class__._uvloop_setting is not None self.__class__._uvloop_setting is not None

View File

@ -1266,3 +1266,22 @@ async def test_added_callable_route_ctx_kwargs(app):
assert request.route.ctx.foo() == "foo" assert request.route.ctx.foo() == "foo"
assert await request.route.ctx.bar() == 99 assert await request.route.ctx.bar() == 99
@pytest.mark.asyncio
async def test_duplicate_route_deprecation(app):
@app.route("/foo", name="duped")
async def handler_foo(request):
return text("...")
@app.route("/bar", name="duped")
async def handler_bar(request):
return text("...")
message = (
r"\[DEPRECATION v23\.3\] Duplicate route names detected: "
r"test_duplicate_route_deprecation\.duped\. In the future, "
r"Sanic will enforce uniqueness in route naming\."
)
with pytest.warns(DeprecationWarning, match=message):
await app._startup()