Skip to content

Commit

Permalink
Allow for custom name generation
Browse files Browse the repository at this point in the history
  • Loading branch information
ahopkins committed Jun 23, 2024
1 parent f04c5ab commit 0dbcd86
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 20 deletions.
2 changes: 1 addition & 1 deletion sanic/blueprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ def register(self, app, options):
name = future.name
if opt_name_prefix:
name = f"{opt_name_prefix}_{future.name}"
name = app._generate_name(name)
name = app.generate_name(name)
host = future.host or self.host
if isinstance(host, list):
host = tuple(host)
Expand Down
36 changes: 20 additions & 16 deletions sanic/mixins/base.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,41 @@
from typing import Optional
from typing import Optional, Protocol, Union

from sanic.base.meta import SanicMeta


class NameProtocol(Protocol):
name: str


class DunderNameProtocol(Protocol):
__name__: str


class BaseMixin(metaclass=SanicMeta):
"""Base class for some other mixins."""
"""Base class for various mixins."""

name: str
strict_slashes: Optional[bool]

def _generate_name(self, *objects) -> str:
name = None

def _generate_name(
self, *objects: Union[NameProtocol, DunderNameProtocol, str]
) -> str:
for obj in objects:
if obj:
if isinstance(obj, str):
name = obj
break

try:
name = obj.name
except AttributeError:
try:
name = obj.__name__
except AttributeError:
continue
else:
break
name = getattr(obj, "name", getattr(obj, "__name__", None))

if not name: # noqa
if name:
break
else:
raise ValueError("Could not generate a name for handler")

if not name.startswith(f"{self.name}."):
name = f"{self.name}.{name}"

return name

def generate_name(self, *objects) -> str:
return self._generate_name(*objects)
2 changes: 1 addition & 1 deletion sanic/mixins/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ def decorator(handler):
# variable will be a tuple of (existing routes, handler fn)
_, handler = handler

name = self._generate_name(name, handler)
name = self.generate_name(name, handler)

if isinstance(host, str):
host = frozenset([host])
Expand Down
2 changes: 1 addition & 1 deletion sanic/mixins/static.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ def static(
```
""" # noqa: E501

name = self._generate_name(name)
name = self.generate_name(name)

if strict_slashes is None and self.strict_slashes is not None:
strict_slashes = self.strict_slashes
Expand Down
2 changes: 1 addition & 1 deletion sanic/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ def find_route_by_view_name(

route = self.name_index.get(view_name)
if not route:
full_name = self.ctx.app._generate_name(view_name)
full_name = self.ctx.app.generate_name(view_name)
route = self.name_index.get(full_name)

if not route:
Expand Down

0 comments on commit 0dbcd86

Please sign in to comment.