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
« 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
4from decouple import text_type, undefined
7class FromStr:
8 """Placeholder for values parsed from strings into more complex objects."""
10 def __init__(self, type, cast):
11 self._type = type
12 self.cast = cast
14 def __call__(self, arg) -> Any:
15 if arg is not undefined:
16 return self.cast(arg)
17 else:
18 return undefined
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)
28def no_cast(value):
29 return value
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
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
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)
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
86class ConfiDelay:
87 """Delay loaded confi entry default values."""
89 def __init__(self, value, index=-1) -> None:
90 self._value = value
91 # sorting index
92 self.index = index
94 @property
95 def value(self):
96 return self._value
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)
107 def __repr__(self) -> str:
108 try:
109 return f"<Delayed {self.eval()}>"
110 except:
111 return f"<Delayed {self._value}>"