Skip to content

Commit d1a5b22

Browse files
committed
fix: between and length validators
1 parent 3ac4baa commit d1a5b22

File tree

4 files changed

+21
-30
lines changed

4 files changed

+21
-30
lines changed

src/validators/between.py

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -57,42 +57,25 @@ def between(
5757
If `value` is not in between the given conditions.
5858
5959
Raises:
60-
ValueError: If both `min_val` and `max_val` are `None`,
61-
or if `min_val` is greater than `max_val`.
62-
TypeError: If there's a type mismatch before comparison.
60+
(ValueError): If `min_val` is greater than `max_val`.
61+
(TypeError): If there's a type mismatch during comparison.
6362
6463
Note:
6564
- `PossibleValueTypes` = `TypeVar("PossibleValueTypes", int, float, str, datetime)`
66-
- Either one of `min_val` or `max_val` must be provided.
67-
68-
> *New in version 0.2.0*.
65+
- If neither `min_val` nor `max_val` is provided, result will always be `True`.
6966
"""
7067
if value is None:
7168
return False
7269

73-
if min_val is max_val is None:
74-
raise ValueError("At least one of either `min_val` or `max_val` must be specified")
75-
7670
if max_val is None:
7771
max_val = AbsMax()
7872
if min_val is None:
7973
min_val = AbsMin()
8074

81-
if isinstance(min_val, AbsMin):
82-
if type(value) is type(max_val):
83-
return min_val <= value <= max_val
84-
raise TypeError("`value` and `max_val` must be of same type")
85-
86-
if isinstance(max_val, AbsMax):
87-
if type(value) is type(min_val):
88-
return min_val <= value <= max_val
89-
raise TypeError("`value` and `min_val` must be of same type")
90-
91-
if type(min_val) is type(max_val):
75+
try:
9276
if min_val > max_val:
93-
raise ValueError("`min_val` cannot be more than `max_val`")
94-
if type(value) is type(min_val): # or is type(max_val)
95-
return min_val <= value <= max_val
96-
raise TypeError("`value` and (`min_val` or `max_val`) must be of same type")
77+
raise ValueError("`min_val` cannot be greater than `max_val`")
78+
except TypeError as err:
79+
raise TypeError("Comparison type mismatch") from err
9780

98-
raise TypeError("`value` and `min_val` and `max_val` must be of same type")
81+
return min_val <= value <= max_val

src/validators/length.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
"""Length."""
22

3+
# standard
4+
from typing import Union
5+
36
# local
47
from .between import between
58
from .utils import validator
69

710

811
@validator
9-
def length(value: str, /, *, min_val: int = 0, max_val: int = 0):
12+
def length(value: str, /, *, min_val: Union[int, None] = None, max_val: Union[int, None] = None):
1013
"""Return whether or not the length of given string is within a specified range.
1114
1215
Examples:
@@ -33,6 +36,12 @@ def length(value: str, /, *, min_val: int = 0, max_val: int = 0):
3336
(ValidationError):
3437
If `len(value)` is not in between the given conditions.
3538
36-
> *New in version 0.2.0*.
39+
Raises:
40+
(ValueError): If either `min_val` or `max_val` is negative.
3741
"""
38-
return between(len(value), min_val=min_val, max_val=max_val) if value else False
42+
if min_val is not None and min_val < 0:
43+
raise ValueError("Length cannot be negative. `min_val` is less than zero.")
44+
if max_val is not None and max_val < 0:
45+
raise ValueError("Length cannot be negative. `max_val` is less than zero.")
46+
47+
return bool(between(len(value), min_val=min_val, max_val=max_val))

tests/test_between.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ def test_returns_true_on_valid_range(value: T, min_val: T, max_val: T):
2828
(None, 13, 14),
2929
(12, 13, 14),
3030
(12, None, 11),
31-
(12, None, None),
3231
(12, 13, None),
3332
(12, "13.5", datetime(1970, 1, 1)),
3433
("12", 20.5, "None"),

tests/test_length.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
@pytest.mark.parametrize(
1111
("value", "min_val", "max_val"),
12-
[("password", 2, 10), ("password", 0, 10), ("password", 8, 8)],
12+
[("password", 2, None), ("password", None, None), ("password", 0, 10), ("password", 8, 8)],
1313
)
1414
def test_returns_true_on_valid_length(value: str, min_val: int, max_val: int):
1515
"""Test returns true on valid length."""

0 commit comments

Comments
 (0)