Coverage for kye/errors.py: 53%
55 statements
« prev ^ index » next coverage.py v7.3.2, created at 2024-01-16 14:23 -0700
« prev ^ index » next coverage.py v7.3.2, created at 2024-01-16 14:23 -0700
1ERROR_CLASSES = {}
3class Error:
4 def __init__(
5 self,
6 table_name,
7 column_name,
8 num_rows,
9 num_indexes,
10 num_values,
11 row_example,
12 idx_example,
13 val_example,
14 ):
15 self.table_name = table_name
16 self.column_name = column_name
17 self.num_rows = num_rows
18 self.num_indexes = num_indexes
19 self.num_values = num_values
20 self.row_example = row_example
21 self.idx_example = idx_example
22 self.val_example = val_example
24 def __init_subclass__(cls) -> None:
25 assert hasattr(cls, 'name')
26 ERROR_CLASSES[cls.name] = cls
28 @property
29 def message(self) -> str:
30 raise NotImplementedError('Not implemented for Abstract Class')
32class ConflictingIndexError(Error):
33 name = 'CONFLICTING_INDEX'
35 @property
36 def message(self):
37 if self.column_name is not None:
38 if self.num_rows > 1:
39 return f'''Found conflicting "{self.column_name}" values across {self.num_indexes} rows'''
40 else:
41 return f'''Found conflicting "{self.column_name}" values for row {self.row_example}'''
42 else:
43 return f'''Found conflicting index values across {self.num_rows} rows'''
46class IncompleteIndexError(Error):
47 name = 'INCOMPLETE_INDEX'
49 @property
50 def message(self):
51 return f'''Unable to complete multi-index for {self.num_rows} rows'''
53class MissingIndexError(Error):
54 name = 'MISSING_INDEX'
56 @property
57 def message(self):
58 if self.num_rows > 1:
59 return f'''Missing required "{self.column_name}" index in {self.num_rows} rows'''
60 else:
61 return f'''Missing the required "{self.column_name}" index for row {self.row_example}'''
63class MissingEdgeError(Error):
64 name = 'MISSING_EDGE'
66 @property
67 def message(self):
68 if self.num_indexes > 1:
69 return f'''Missing required "{self.column_name}" value in {self.num_indexes} rows'''
70 else:
71 return f'''Missing the required "{self.column_name}" value for row {self.row_example}'''
73class ConflictingEdgeError(Error):
74 name = 'CONFLICTING_EDGE'
76 @property
77 def message(self):
78 if self.num_indexes > 1:
79 return f'''Found conflicting "{self.column_name}" values across {self.num_indexes} rows'''
80 else:
81 return f'''Found conflicting "{self.column_name}" values for row {self.row_example}'''
83def error_factory(err_type, **kwargs):
84 assert err_type in ERROR_CLASSES
85 return ERROR_CLASSES[err_type](**kwargs)