diff --git a/sanic/base.py b/sanic/base.py index a8b78ec683..ac7f06c86a 100644 --- a/sanic/base.py +++ b/sanic/base.py @@ -33,4 +33,8 @@ class BaseSanic( ExceptionMixin, metaclass=Base, ): - ... + def __str__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(name="{self.name}")' diff --git a/sanic/blueprints.py b/sanic/blueprints.py index 3705eb3f0e..038dbd4b93 100644 --- a/sanic/blueprints.py +++ b/sanic/blueprints.py @@ -49,6 +49,23 @@ def __init__( self.version = version self.strict_slashes = strict_slashes + def __repr__(self) -> str: + args = ", ".join( + [ + f'{attr}="{getattr(self, attr)}"' + if isinstance(getattr(self, attr), str) + else f"{attr}={getattr(self, attr)}" + for attr in ( + "name", + "url_prefix", + "host", + "version", + "strict_slashes", + ) + ] + ) + return f"Blueprint({args})" + def route(self, *args, **kwargs): kwargs["apply"] = False return super().route(*args, **kwargs) diff --git a/tests/test_base.py b/tests/test_base.py new file mode 100644 index 0000000000..b7e1158a11 --- /dev/null +++ b/tests/test_base.py @@ -0,0 +1,43 @@ +import pytest + +from sanic import Blueprint, Sanic + + +@pytest.fixture +def app(): + return Sanic("my_app") + + +@pytest.fixture +def bp(app): + return Blueprint("my_bp") + + +def test_app_str(app): + assert str(app) == "" + + +def test_app_repr(app): + assert repr(app) == 'Sanic(name="my_app")' + + +def test_bp_str(bp): + assert str(bp) == "" + + +def test_bp_repr(bp): + assert repr(bp) == ( + 'Blueprint(name="my_bp", url_prefix=None, host=None, ' + "version=None, strict_slashes=None)" + ) + + +def test_bp_repr_with_values(bp): + bp.host = "example.com" + bp.url_prefix = "/foo" + bp.version = 3 + bp.strict_slashes = True + assert repr(bp) == ( + 'Blueprint(name="my_bp", url_prefix="/foo", host="example.com", ' + "version=3, strict_slashes=True)" + )