Coverage for /home/ubuntu/cv-depot/python/cv_depot/core/channel_map.py: 100%

29 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-08 20:26 +0000

1from collections import OrderedDict 

2import re 

3 

4from lunchbox.enforce import Enforce 

5# ------------------------------------------------------------------------------ 

6 

7 

8class ChannelMap(OrderedDict): 

9 ''' 

10 A channel to channel mapping between multiple source images and one target 

11 image. 

12 ''' 

13 def __repr__(self): 

14 # type () -> str 

15 ''' 

16 Returns a table of with columns: order, target and source. 

17 ''' 

18 max_i = max(len(self.items()) - 1, len('order')) 

19 max_k = max(max(map(len, self.keys())), len('target')) 

20 header = f'{ i:<{max_i}} { k:<{max_k}} { v} ' 

21 header = header.format(i='order', k='target', v='source') 

22 output = [header, '-' * len(header)] 

23 

24 pattern = f'{ i:<{max_i}} { k:<{max_k}} <-- { v} ' 

25 for i, (k, v) in enumerate(self.items()): 

26 output.append(pattern.format(i=i, k=k, v=v)) 

27 output = '\n'.join(output) 

28 return output 

29 

30 def __setitem__(self, key, value): 

31 # type: (str, str) -> None 

32 ''' 

33 Sets given key to given value. 

34 Ensures that given key and value are legal. 

35 

36 Args: 

37 key (str): Key. 

38 value (str): Value. 

39 

40 Raises: 

41 EnforceError: If key is not a string. 

42 EnforceError: If value is not a string. 

43 EnforceError: If value is not one of: b, w, black, white, 

44 [frame].[channel] 

45 ''' 

46 Enforce(key, 'instance of', str) 

47 Enforce(value, 'instance of', str) 

48 result = re.match(r'^(b|w|black|white|\d+\..+)$', value.lower()) 

49 msg = 'ChannelMap values must match: b, w, black, white, or ' 

50 msg += fr'[frame].[channel]. Illegal value: {value}.' 

51 Enforce(result, '!=', None, message=msg) 

52 

53 super().__setitem__(key, value) 

54 

55 @property 

56 def source(self): 

57 # type: () -> list[str] 

58 ''' 

59 list[str]: Ordered list of source channels. 

60 ''' 

61 return list(self.values()) 

62 

63 @property 

64 def target(self): 

65 # type: () -> list[str] 

66 ''' 

67 list[str]: Ordered list of target channels. 

68 ''' 

69 return list(self.keys())