Skip to content

Commit cacafba

Browse files
authored
Merge pull request #67 from Aparna-BS/fixer
Validate the data type of iterable and number.
2 parents 64168e9 + 82f8cb6 commit cacafba

File tree

4 files changed

+68
-1
lines changed

4 files changed

+68
-1
lines changed

pyvalid/validators/__iterable.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,26 @@ def example([1, 3, 7, 10]):
2727
2828
"""
2929

30+
@classmethod
31+
def iterable_type_checker(cls, val, iterable_type):
32+
"""Checks if the iterable is of required data type.
33+
34+
Args:
35+
val (Iterable):
36+
Tensor whose type is to be validated.
37+
iterable_type (type):
38+
Expected data type of iterable.
39+
Ex: list, tuple, dict.
40+
41+
Returns (bool):
42+
True:
43+
If the type of given iterable matches the required type.
44+
False:
45+
If the type of given iterable does not match the required type.
46+
47+
"""
48+
return type(val) == iterable_type
49+
3050
@classmethod
3151
def empty_checker(cls, val, empty_allowed):
3252
"""Checks if the iterable is empty or not.
@@ -143,11 +163,14 @@ def __init__(self, **kwargs):
143163
max_val = kwargs.get('max_val', None)
144164
if min_val is not None and max_val is not None and min_val > max_val:
145165
raise ValueError('Min value can\'t be greater than max value!')
166+
iterable_type = kwargs.get('iterable_type', None)
146167
empty_allowed = kwargs.get('empty_allowed', None)
147168
elements_type = kwargs.get('elements_type', None)
169+
148170
self.__checkers = {
149171
IterableValidator.empty_checker: [empty_allowed],
150172
IterableValidator.element_type_checker: [elements_type],
173+
IterableValidator.iterable_type_checker: [iterable_type],
151174
IterableValidator.elements_min_val_checker: [min_val],
152175
IterableValidator.elements_max_val_checker: [max_val]
153176
}

pyvalid/validators/__number.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,26 @@ class NumberValidator(AbstractValidator):
1414
if version_info < (3, 0, 0):
1515
number_types += (long, ) # noqa: F821
1616

17+
@classmethod
18+
def number_type_checker(cls, val, number_type):
19+
"""Checks if the number is of required data type.
20+
21+
Args:
22+
val (number):
23+
Tensor whose type is to be validated.
24+
number_type (type):
25+
Expected data type of number.
26+
Ex: int, float, long.
27+
28+
Returns (bool):
29+
True:
30+
If the type of given number matches the required type.
31+
False:
32+
If the type of given number does not match the required type.
33+
34+
"""
35+
return type(val) == number_type
36+
1737
@classmethod
1838
def min_val_checker(cls, val, min_val):
1939
return val >= min_val
@@ -51,11 +71,14 @@ def __init__(self, **kwargs):
5171
max_val = kwargs.get('max_val', None)
5272
if min_val is not None and max_val is not None and min_val > max_val:
5373
raise ValueError('Min value can\'t be greater than max value!')
74+
number_type = kwargs.get('number_type', None)
5475
in_range = kwargs.get('in_range', None)
5576
not_in_range = kwargs.get('not_in_range', None)
77+
5678
self.__checkers = {
5779
NumberValidator.min_val_checker: [min_val],
5880
NumberValidator.max_val_checker: [max_val],
81+
NumberValidator.number_type_checker: [number_type],
5982
NumberValidator.in_range_checker: [in_range],
6083
NumberValidator.not_in_range_checker: [not_in_range]
6184
}

tests/test_iterable_validator.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@
55

66
class IterableValidatorTestCase(unittest.TestCase):
77

8+
def test_iterable_type(self):
9+
"""
10+
Verify iterable_type_checker() method.
11+
"""
12+
validator = IterableValidator(iterable_type=list)
13+
self.assertTrue(validator([1, 3, 25, 14]))
14+
self.assertFalse(validator({1: 'a', 2: 'b'}))
15+
16+
validator = IterableValidator(iterable_type=tuple)
17+
self.assertTrue(validator((1, 3, 25, 14)))
18+
self.assertFalse(validator([1, 3, 25, 14]))
19+
820
def test_empty_allowed(self):
921
"""
1022
Verify empty_checker() method.
@@ -96,7 +108,7 @@ def test_mixed(self):
96108
self.assertTrue(validator([1, 3, 25, 120])) # List
97109
self.assertTrue(validator((1, 3, 25, 3))) # Tuple
98110
self.assertTrue(validator({1: 'pyvalid', 2: 'cython'})) # Dictionary
99-
self.assertTrue(validator((1, 3, 25, 120))) # Set
111+
self.assertTrue(validator({1, 3, 25, 120})) # Set
100112
self.assertFalse(validator(8)) # Integer
101113
self.assertFalse(None)
102114

tests/test_number_validator.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@
55

66
class NumberValidatorTestCase(unittest.TestCase):
77

8+
def test_number_type(self):
9+
validator = NumberValidator(number_type=int)
10+
self.assertTrue(validator(12))
11+
self.assertFalse(validator(10.56))
12+
13+
validator = NumberValidator(number_type=float)
14+
self.assertTrue(validator(10.56))
15+
self.assertFalse(validator(12))
16+
817
def test_min_val(self):
918
validator = NumberValidator(min_val=-3.14)
1019
self.assertTrue(validator(3.14))

0 commit comments

Comments
 (0)