2022-01-24 04:07:52 +00:00
|
|
|
from typing import Any, Callable, cast, Set, TYPE_CHECKING
|
|
|
|
from inspect import isclass
|
2021-04-13 04:02:29 +00:00
|
|
|
|
2022-01-24 04:07:52 +00:00
|
|
|
if TYPE_CHECKING:
|
|
|
|
from rich.console import RenderableType
|
|
|
|
|
|
|
|
_GIBBERISH = """aihwerij235234ljsdnp34ksodfipwoe234234jlskjdf"""
|
2021-04-13 04:02:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
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__")
|
|
|
|
)
|
2022-01-24 04:07:52 +00:00
|
|
|
|
|
|
|
|
|
|
|
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)
|