123456789101112131415161718192021222324252627282930313233343536373839404142 |
- from typing import Any, Callable, cast, Set, TYPE_CHECKING
- from inspect import isclass
- if TYPE_CHECKING:
- from pip._vendor.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 pip._vendor.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)
|