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
« 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# ============================================================================ #
9# ---------------------------------------------------------------------------- #
10# #
11# Setup ####
12# #
13# ---------------------------------------------------------------------------- #
16## --------------------------------------------------------------------------- #
17## Imports ####
18## --------------------------------------------------------------------------- #
21# ## Future Python Library Imports ----
22from __future__ import annotations
24# ## Python StdLib Imports ----
25from collections.abc import Sequence
27# ## Python Third Party Imports ----
28from toolbox_python.checkers import is_valid
31## --------------------------------------------------------------------------- #
32## Exports ####
33## --------------------------------------------------------------------------- #
36__all__: list[str] = ["Validators", "number"]
39## --------------------------------------------------------------------------- #
40## Types ####
41## --------------------------------------------------------------------------- #
44number = float | int
47# ---------------------------------------------------------------------------- #
48# #
49# Validators ####
50# #
51# ---------------------------------------------------------------------------- #
54class Validators:
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.
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.
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
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.
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.
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}`")
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.
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.
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)
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.
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.
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}")