Coverage for src/synthetic_data_generators/utils/validators.py: 100%

24 statements  

« prev     ^ index     » next       coverage.py v7.11.3, created at 2025-11-16 20:54 +0000

1# ============================================================================ # 

2# # 

3# Title: Validators Utility Module # 

4# Purpose: Provides validation functions and classes for numeric ranges # 

5# # 

6# ============================================================================ # 

7 

8 

9# ---------------------------------------------------------------------------- # 

10# # 

11# Setup #### 

12# # 

13# ---------------------------------------------------------------------------- # 

14 

15 

16## --------------------------------------------------------------------------- # 

17## Imports #### 

18## --------------------------------------------------------------------------- # 

19 

20 

21# ## Future Python Library Imports ---- 

22from __future__ import annotations 

23 

24# ## Python StdLib Imports ---- 

25from collections.abc import Sequence 

26 

27# ## Python Third Party Imports ---- 

28from toolbox_python.checkers import is_valid 

29 

30 

31## --------------------------------------------------------------------------- # 

32## Exports #### 

33## --------------------------------------------------------------------------- # 

34 

35 

36__all__: list[str] = ["Validators", "number"] 

37 

38 

39## --------------------------------------------------------------------------- # 

40## Types #### 

41## --------------------------------------------------------------------------- # 

42 

43 

44number = float | int 

45 

46 

47# ---------------------------------------------------------------------------- # 

48# # 

49# Validators #### 

50# # 

51# ---------------------------------------------------------------------------- # 

52 

53 

54class Validators: 

55 

56 @staticmethod 

57 def _value_is_between(value: number, min_value: number, max_value: number) -> bool: 

58 """ 

59 !!! note "Summary" 

60 Check if a value is between two other values. 

61 

62 Params: 

63 value (number): 

64 The value to check. 

65 min_value (number): 

66 The minimum value. 

67 max_value (number): 

68 The maximum value. 

69 

70 Returns: 

71 (bool): 

72 True if the value is between the minimum and maximum values, False otherwise. 

73 """ 

74 if not is_valid(min_value, "<=", max_value): 

75 raise ValueError( 

76 f"Invalid range: min_value `{min_value}` must be less than or equal to max_value `{max_value}`" 

77 ) 

78 result: bool = is_valid(value, ">=", min_value) and is_valid(value, "<=", max_value) 

79 return result 

80 

81 @staticmethod 

82 def _assert_value_is_between( 

83 value: number, 

84 min_value: number, 

85 max_value: number, 

86 ) -> None: 

87 """ 

88 !!! note "Summary" 

89 Assert that a value is between two other values. 

90 

91 Params: 

92 value (number): 

93 The value to check. 

94 min_value (number): 

95 The minimum value. 

96 max_value (number): 

97 The maximum value. 

98 

99 Raises: 

100 (AssertionError): 

101 If the value is not between the minimum and maximum values. 

102 """ 

103 if not Validators._value_is_between(value, min_value, max_value): 

104 raise AssertionError(f"Invalid Value: `{value}`. Must be between `{min_value}` and `{max_value}`") 

105 

106 @staticmethod 

107 def _all_values_are_between( 

108 values: Sequence[number], 

109 min_value: number, 

110 max_value: number, 

111 ) -> bool: 

112 """ 

113 !!! note "Summary" 

114 Check if all values in an array are between two other values. 

115 

116 Params: 

117 values (Sequence[number]): 

118 The array of values to check. 

119 min_value (number): 

120 The minimum value. 

121 max_value (number): 

122 The maximum value. 

123 

124 Returns: 

125 (bool): 

126 True if all values are between the minimum and maximum values, False otherwise. 

127 """ 

128 return all(Validators._value_is_between(value, min_value, max_value) for value in values) 

129 

130 @staticmethod 

131 def _assert_all_values_are_between( 

132 values: Sequence[number], 

133 min_value: number, 

134 max_value: number, 

135 ) -> None: 

136 """ 

137 !!! note "Summary" 

138 Assert that all values in an array are between two other values. 

139 

140 Params: 

141 values (Sequence[number]): 

142 The array of values to check. 

143 min_value (number): 

144 The minimum value. 

145 max_value (number): 

146 The maximum value. 

147 

148 Raises: 

149 (AssertionError): 

150 If any value is not between the minimum and maximum values. 

151 """ 

152 values_not_between: list[number] = [ 

153 value for value in values if not Validators._value_is_between(value, min_value, max_value) 

154 ] 

155 if not len(values_not_between) == 0: 

156 raise AssertionError(f"Values not between `{min_value}` and `{max_value}`: {values_not_between}")