1from abc import ABC
2
3
4class RichRenderable(ABC):
5    """An abstract base class for Rich renderables.
6
7    Note that there is no need to extend this class, the intended use is to check if an
8    object supports the Rich renderable protocol. For example::
9
10        if isinstance(my_object, RichRenderable):
11            console.print(my_object)
12
13    """
14
15    @classmethod
16    def __subclasshook__(cls, other: type) -> bool:
17        """Check if this class supports the rich render protocol."""
18        return hasattr(other, "__rich_console__") or hasattr(other, "__rich__")
19
20
21if __name__ == "__main__":  # pragma: no cover
22    from rich.text import Text
23
24    t = Text()
25    print(isinstance(Text, RichRenderable))
26    print(isinstance(t, RichRenderable))
27
28    class Foo:
29        pass
30
31    f = Foo()
32    print(isinstance(f, RichRenderable))
33    print(isinstance("", RichRenderable))
34