File size: 1,367 Bytes
9c6594c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
from typing import Any, cast, Set, TYPE_CHECKING
from inspect import isclass
if TYPE_CHECKING:
from rich.console import RenderableType
_GIBBERISH = """aihwerij235234ljsdnp34ksodfipwoe234234jlskjdf"""
def is_renderable(check_object: Any) -> bool:
"""Check if an object may be rendered by Rich."""
return (
isinstance(check_object, str)
or hasattr(check_object, "__rich__")
or hasattr(check_object, "__rich_console__")
)
def rich_cast(renderable: object) -> "RenderableType":
"""Cast an object to a renderable by calling __rich__ if present.
Args:
renderable (object): A potentially renderable object
Returns:
object: The result of recursively calling __rich__.
"""
from rich.console import RenderableType
rich_visited_set: Set[type] = set() # Prevent potential infinite loop
while hasattr(renderable, "__rich__") and not isclass(renderable):
# Detect object which claim to have all the attributes
if hasattr(renderable, _GIBBERISH):
return repr(renderable)
cast_method = getattr(renderable, "__rich__")
renderable = cast_method()
renderable_type = type(renderable)
if renderable_type in rich_visited_set:
break
rich_visited_set.add(renderable_type)
return cast(RenderableType, renderable)
|