protocol.py 1.3 KB

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