Coverage for kye/errors.py: 53%

55 statements  

« prev     ^ index     » next       coverage.py v7.3.2, created at 2024-01-16 14:23 -0700

1ERROR_CLASSES = {} 

2 

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 

23 

24 def __init_subclass__(cls) -> None: 

25 assert hasattr(cls, 'name') 

26 ERROR_CLASSES[cls.name] = cls 

27 

28 @property 

29 def message(self) -> str: 

30 raise NotImplementedError('Not implemented for Abstract Class') 

31 

32class ConflictingIndexError(Error): 

33 name = 'CONFLICTING_INDEX' 

34 

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''' 

44 

45 

46class IncompleteIndexError(Error): 

47 name = 'INCOMPLETE_INDEX' 

48 

49 @property 

50 def message(self): 

51 return f'''Unable to complete multi-index for {self.num_rows} rows''' 

52 

53class MissingIndexError(Error): 

54 name = 'MISSING_INDEX' 

55 

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}''' 

62 

63class MissingEdgeError(Error): 

64 name = 'MISSING_EDGE' 

65 

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}''' 

72 

73class ConflictingEdgeError(Error): 

74 name = 'CONFLICTING_EDGE' 

75 

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}''' 

82 

83def error_factory(err_type, **kwargs): 

84 assert err_type in ERROR_CLASSES 

85 return ERROR_CLASSES[err_type](**kwargs)