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
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-08 20:26 +0000
1from collections import OrderedDict
2import re
4from lunchbox.enforce import Enforce
5# ------------------------------------------------------------------------------
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)]
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
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.
36 Args:
37 key (str): Key.
38 value (str): Value.
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)
53 super().__setitem__(key, value)
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())
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())