Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/rich/protocol.py: 50%

20 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-06-07 06:35 +0000

1from typing import Any, cast, Set, TYPE_CHECKING 

2from inspect import isclass 

3 

4if TYPE_CHECKING: 

5 from rich.console import RenderableType 

6 

7_GIBBERISH = """aihwerij235234ljsdnp34ksodfipwoe234234jlskjdf""" 

8 

9 

10def is_renderable(check_object: Any) -> bool: 

11 """Check if an object may be rendered by Rich.""" 

12 return ( 

13 isinstance(check_object, str) 

14 or hasattr(check_object, "__rich__") 

15 or hasattr(check_object, "__rich_console__") 

16 ) 

17 

18 

19def rich_cast(renderable: object) -> "RenderableType": 

20 """Cast an object to a renderable by calling __rich__ if present. 

21 

22 Args: 

23 renderable (object): A potentially renderable object 

24 

25 Returns: 

26 object: The result of recursively calling __rich__. 

27 """ 

28 from rich.console import RenderableType 

29 

30 rich_visited_set: Set[type] = set() # Prevent potential infinite loop 

31 while hasattr(renderable, "__rich__") and not isclass(renderable): 

32 # Detect object which claim to have all the attributes 

33 if hasattr(renderable, _GIBBERISH): 

34 return repr(renderable) 

35 cast_method = getattr(renderable, "__rich__") 

36 renderable = cast_method() 

37 renderable_type = type(renderable) 

38 if renderable_type in rich_visited_set: 

39 break 

40 rich_visited_set.add(renderable_type) 

41 

42 return cast(RenderableType, renderable)