Coverage for src/es_testbed/classes/args.py: 98%

35 statements  

« prev     ^ index     » next       coverage.py v7.5.0, created at 2024-04-23 13:32 -0600

1"""Args Parent Class""" 

2import typing as t 

3import logging 

4from es_testbed.defaults import ARGSCLASSES 

5 

6class Args(t.Dict): 

7 """ 

8 Initialize with None values for all accepted settings 

9 

10 Contains :py:meth:`update_settings` and :py:meth:`asdict` methods 

11 """ 

12 def __init__( 

13 self, 

14 settings: t.Dict[str, t.Any] = None, 

15 defaults: t.Dict[str, t.Any] = None, 

16 ): 

17 """Updatable object that will contain arguments for connecting to Elasticsearch""" 

18 self.logger = logging.getLogger(__name__) 

19 self.settings = settings 

20 if defaults is None: 

21 defaults = {} 

22 self.set_defaults(defaults) 

23 if settings is None: 

24 self.settings = defaults 

25 else: 

26 # Only do this if we sent actual settings 

27 self.update_settings(self.settings) 

28 

29 def set_defaults(self, defaults: dict) -> None: 

30 """Set attr values from defaults""" 

31 for key, value in defaults.items(): 

32 setattr(self, key, value) 

33 # Override self.settings if no default for key is found 

34 if key not in self.settings: 

35 self.settings[key] = value 

36 

37 def update_settings(self, new_settings: dict) -> None: 

38 """Update individual settings from provided new_settings dict""" 

39 for key, value in new_settings.items(): 

40 setattr(self, key, value) 

41 

42 def _object_class(self, val: t.Any) -> str: 

43 """ 

44 Where type(val) = <class 'base.secondary.tertiary.ClassName'> 

45 Extract 'ClassName' from type(val) 

46 """ 

47 return str(type(val)).split("'")[1].split('.')[-1] 

48 

49 def _expand_args(self, setting: str) -> t.Union[str, t.Dict[str, str]]: 

50 val = getattr(self, setting, None) 

51 if self._object_class(val) in ARGSCLASSES: # These have a .asdict like this 

52 return val.asdict 

53 return val 

54 

55 @property 

56 def asdict(self) -> dict: 

57 """Return as a dictionary""" 

58 retval = {} 

59 if isinstance(self.settings, dict): 59 ↛ 62line 59 didn't jump to line 62, because the condition on line 59 was never false

60 for setting in self.settings: 

61 retval[setting] = self._expand_args(setting) 

62 return retval