Coverage for /usr/local/lib/python3.10/site-packages/opal_common-0.0.0-py3.10.egg/opal_common/confi/types.py: 58%

71 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 11:54 +0000

1import inspect 

2from typing import Any, Callable, List, Type 

3 

4from decouple import text_type, undefined 

5 

6 

7class FromStr: 

8 """Placeholder for values parsed from strings into more complex objects.""" 

9 

10 def __init__(self, type, cast): 

11 self._type = type 

12 self.cast = cast 

13 

14 def __call__(self, arg) -> Any: 

15 if arg is not undefined: 

16 return self.cast(arg) 

17 else: 

18 return undefined 

19 

20 @property 

21 def __name__(self) -> str: 

22 if hasattr(self._type, "__name__"): 

23 return f"<{self._type.__name__}>" 

24 else: 

25 return repr(self._type) 

26 

27 

28def no_cast(value): 

29 return value 

30 

31 

32class ConfiEntry: 

33 key: str 

34 type: Type 

35 default: Any 

36 description: str 

37 cast: Callable 

38 cast_from_json: Callable 

39 kwargs: dict 

40 flags: List[str] 

41 value: Any 

42 

43 def __init__( 

44 self, 

45 key, 

46 *, 

47 default=undefined, 

48 description=None, 

49 cast=no_cast, 

50 cast_from_json=no_cast, 

51 type=str, 

52 index=-1, 

53 flags: List[str] = None, 

54 **kwargs, 

55 ) -> None: 

56 self.key = key 

57 # sorting index 

58 self.index = index 

59 self.default = default 

60 self.description = description 

61 self.cast = cast 

62 self.cast_from_json = cast_from_json 

63 self.type = type 

64 self.kwargs = kwargs 

65 self.flags = flags 

66 self.value = undefined 

67 

68 def get_cli_type(self): 

69 if self.type in {str, int, float, list, dict, bool}: 

70 return self.type 

71 else: 

72 return FromStr(self.type, self.cast) 

73 

74 def get_cli_option_kwargs(self): 

75 res = { 

76 "type": self.get_cli_type(), 

77 } 

78 if self.description is not None: 

79 res["help"] = self.description 

80 if self.default is not undefined: 

81 res["default"] = self.value if self.value is not undefined else self.default 

82 res["show_default"] = self.default 

83 return res 

84 

85 

86class ConfiDelay: 

87 """Delay loaded confi entry default values.""" 

88 

89 def __init__(self, value, index=-1) -> None: 

90 self._value = value 

91 # sorting index 

92 self.index = index 

93 

94 @property 

95 def value(self): 

96 return self._value 

97 

98 def eval(self, config=None): 

99 values = {k: v.value for k, v in config.entries.items()} if config else {} 

100 if isinstance(self._value, str): 100 ↛ 101line 100 didn't jump to line 101 because the condition on line 100 was never true

101 return self._value.format(**values) 

102 if callable(self._value): 102 ↛ exitline 102 didn't return from function 'eval' because the condition on line 102 was always true

103 callargs = inspect.getcallargs(self._value) 

104 args = {k: values.get(k, undefined) for k, v in callargs.items()} 

105 return self._value(**args) 

106 

107 def __repr__(self) -> str: 

108 try: 

109 return f"<Delayed {self.eval()}>" 

110 except: 

111 return f"<Delayed {self._value}>"