Tipragot
628be439b8
Cela permet de ne pas avoir de problèmes de compatibilité car python est dans le git.
43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
from typing import Any, 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)
|