Skip to content

Commit 7097446

Browse files
Merge pull request #16 from chinmay29hub/number-validators
New Number Validators
2 parents f91f7c2 + 860f384 commit 7097446

6 files changed

Lines changed: 248 additions & 22 deletions

File tree

docs/conf.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,11 @@
2828

2929
html_static_path = ['_static']
3030
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', '.venv']
31-
html_sidebars = {'**': ['globaltoc.html', 'relations.html', 'sourcelink.html', 'searchbox.html']}
31+
html_sidebars = {
32+
'**': [
33+
'globaltoc.html',
34+
'relations.html',
35+
'sourcelink.html',
36+
'searchbox.html'
37+
]
38+
}

docs/number/number_validation.rst

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,51 @@ The following functions are used to validate numbers.
2424
True
2525
>>> val.isDivisibleBy(10, 3)
2626
False
27+
28+
:code:`isPrime(value)`
29+
Returns true if the value is a prime number.
30+
31+
>>> val.isPrime(5)
32+
True
33+
>>> val.isPrime(4)
34+
False
35+
36+
:code:`isEven(value)`
37+
Returns true if the value is even.
38+
39+
>>> val.isEven(4)
40+
True
41+
>>> val.isEven(5)
42+
False
43+
44+
:code:`isOdd(value)`
45+
Returns true if the value is odd.
46+
47+
>>> val.isOdd(5)
48+
True
49+
>>> val.isOdd(4)
50+
False
51+
52+
:code:`isMultipleOf(value, multiple)`
53+
Returns true if the value is a multiple of another number.
54+
55+
>>> val.isMultipleOf(10, 2)
56+
True
57+
>>> val.isMultipleOf(10, 3)
58+
False
59+
60+
:code:`isSquare(value)`
61+
Returns true if the value is a perfect square.
62+
63+
>>> val.isSquare(4)
64+
True
65+
>>> val.isSquare(5)
66+
False
67+
68+
:code:`isCube(value)`
69+
Returns true if the value is a perfect cube.
70+
71+
>>> val.isCube(8)
72+
True
73+
>>> val.isCube(9)
74+
False

sanatio/number_validator.py

Lines changed: 65 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ def isDecimal(self, value: float) -> bool:
1212

1313
def isDivisibleBy(self, number: int, divisor: int) -> bool:
1414
""" check if the number is divisible by divisor or not """
15-
return self.isvalidNumber(number) and self.isvalidNumber(divisor) and divisor != 0 and number % divisor == 0
15+
return (self.isvalidNumber(number) and
16+
self.isvalidNumber(divisor) and
17+
divisor != 0 and
18+
number % divisor == 0)
1619

1720
def truncate(self, value: float, digits: int) -> float:
1821
""" truncate the float value """
@@ -59,21 +62,76 @@ def isNonZero(self, value):
5962

6063
def isGreaterThan(self, value, other):
6164
""" check if the value is greater than other or not """
62-
return self.isvalidNumber(value) and self.isvalidNumber(other) and value > other
65+
return (self.isvalidNumber(value) and
66+
self.isvalidNumber(other) and
67+
value > other)
6368

6469
def isGreaterThanOrEqual(self, value, other):
6570
""" check if the value is greater than or equal to other or not """
66-
return self.isvalidNumber(value) and self.isvalidNumber(other) and value >= other
71+
return (self.isvalidNumber(value) and
72+
self.isvalidNumber(other) and
73+
value >= other)
6774

6875
def isLessThan(self, value, other):
6976
""" check if the value is less than other or not """
70-
return self.isvalidNumber(value) and self.isvalidNumber(other) and value < other
77+
return (self.isvalidNumber(value) and
78+
self.isvalidNumber(other) and
79+
value < other)
7180

7281
def isLessThanOrEqual(self, value, other):
7382
""" check if the value is less than or equal to other or not """
74-
return self.isvalidNumber(value) and self.isvalidNumber(other) and value <= other
83+
return (self.isvalidNumber(value) and
84+
self.isvalidNumber(other) and
85+
value <= other)
7586

7687
def isBetween(self, value, min_value, max_value):
7788
""" check if the value is between min_value and max_value or not """
78-
return self.isvalidNumber(value) and self.isvalidNumber(min_value) and \
79-
self.isvalidNumber(max_value) and min_value <= value <= max_value
89+
return (self.isvalidNumber(value) and
90+
self.isvalidNumber(min_value) and
91+
self.isvalidNumber(max_value) and
92+
min_value <= value <= max_value)
93+
94+
def isPrime(self, value) -> bool:
95+
""" check if the value is a prime number or not """
96+
if not self.isvalidNumber(value) or value < 2:
97+
return False
98+
for i in range(2, int(value ** 0.5) + 1):
99+
if value % i == 0:
100+
return False
101+
return True
102+
103+
def isEven(self, value) -> bool:
104+
""" check if the value is even or not """
105+
return self.isvalidNumber(value) and value % 2 == 0
106+
107+
def isOdd(self, value) -> bool:
108+
""" check if the value is odd or not """
109+
return self.isvalidNumber(value) and value % 2 != 0
110+
111+
def isMultipleOf(self, value, multiple) -> bool:
112+
""" check if the value is a multiple of another number """
113+
if (not self.isvalidNumber(value) or
114+
not self.isvalidNumber(multiple) or
115+
multiple == 0):
116+
return False
117+
return value % multiple == 0
118+
119+
def isSquare(self, value) -> bool:
120+
""" Check if the value is a perfect square or not """
121+
if not self.isvalidNumber(value):
122+
return False
123+
if value < 0:
124+
return False
125+
square_root = round(value ** 0.5)
126+
return square_root ** 2 == value
127+
128+
def isCube(self, value) -> bool:
129+
""" Check if the value is a perfect cube or not """
130+
if not self.isvalidNumber(value):
131+
return False
132+
if value < 0:
133+
cube_root = round((-value) ** (1/3))
134+
return -cube_root ** 3 == value
135+
else:
136+
cube_root = round(value ** (1/3))
137+
return cube_root ** 3 == value

tests/document/aadhar_card_test.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sys
22
import unittest
3-
sys.path.append('.')
43
from sanatio import Sanatio
4+
sys.path.append('.')
55

66
validator = Sanatio()
77

@@ -10,13 +10,21 @@ class AadharCardTest(unittest.TestCase):
1010
def test_isAadharCard_True(self):
1111
self.assertTrue(validator.isAadharCard('9284 9436 2499'))
1212
self.assertTrue(validator.isAadharCard(' 9284 9436 2499 '))
13-
13+
1414
def test_isAadharCard_False(self):
15-
self.assertFalse(validator.isAadharCard('9284 9436 2493')) # checksum false
15+
self.assertFalse(
16+
validator.isAadharCard('9284 9436 2493')
17+
) # checksum false
1618
self.assertFalse(validator.isAadharCard('9284 9436 249')) # too short
17-
self.assertFalse(validator.isAadharCard('9284 9436 24999')) # too long
18-
self.assertFalse(validator.isAadharCard('1234 5678 9012')) # starts with 0/1
19-
self.assertFalse(validator.isAadharCard('9284 9436 249a')) # contains non-digit
20-
19+
self.assertFalse(
20+
validator.isAadharCard('9284 9436 24999')
21+
) # too long
22+
self.assertFalse(
23+
validator.isAadharCard('1234 5678 9012')) # starts with 0/1
24+
self.assertFalse(
25+
validator.isAadharCard('9284 9436 249a')
26+
) # contains non-digit
27+
28+
2129
if __name__ == '__main__':
22-
unittest.main()
30+
unittest.main()

tests/document/credit_card_test.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sys
22
import unittest
3-
sys.path.append('.')
43
from sanatio import Sanatio
4+
sys.path.append('.')
55

66
validator = Sanatio()
77

@@ -11,10 +11,12 @@ def test_credit_card_true(self):
1111
self.assertTrue(validator.isCreditCard('4578423013769219'))
1212
self.assertTrue(validator.isCreditCard('4569403961014710'))
1313
self.assertTrue(validator.isCreditCard('6011000990139424'))
14-
14+
1515
def test_credit_card_false(self):
16-
self.assertFalse(validator.isCreditCard('370341378581368')) # checksome false
16+
self.assertFalse(
17+
validator.isCreditCard('370341378581368')
18+
) # checksome false
1719

1820

1921
if __name__ == '__main__':
20-
unittest.main()
22+
unittest.main()

tests/number_test.py

Lines changed: 105 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sys
22
import unittest
3-
sys.path.append('.')
43
from sanatio import Sanatio
4+
sys.path.append('.')
55

66
validator = Sanatio()
77

@@ -181,6 +181,109 @@ def test_isBetween_false(self):
181181
self.assertFalse(validator.isBetween(5, 10.0, 5))
182182
self.assertFalse(validator.isBetween(5.0, 10.0, 5))
183183

184+
def test_isPrime_true(self):
185+
self.assertTrue(validator.isPrime(2))
186+
self.assertTrue(validator.isPrime(3))
187+
self.assertTrue(validator.isPrime(5))
188+
self.assertTrue(validator.isPrime(7))
189+
self.assertTrue(validator.isPrime(7919))
190+
self.assertTrue(validator.isPrime(97))
191+
192+
def test_isPrime_false(self):
193+
self.assertFalse(validator.isPrime(1))
194+
self.assertFalse(validator.isPrime(4))
195+
self.assertFalse(validator.isPrime(6))
196+
self.assertFalse(validator.isPrime(8))
197+
self.assertFalse(validator.isPrime(-1))
198+
self.assertFalse(validator.isPrime(0))
199+
self.assertFalse(validator.isPrime(1))
200+
self.assertFalse(validator.isPrime(1001))
201+
self.assertFalse(validator.isPrime(-17))
202+
203+
def test_isEven_true(self):
204+
self.assertTrue(validator.isEven(2))
205+
self.assertTrue(validator.isEven(4))
206+
self.assertTrue(validator.isEven(6))
207+
self.assertTrue(validator.isEven(8))
208+
self.assertTrue(validator.isEven(0))
209+
self.assertTrue(validator.isEven(-2))
210+
211+
def test_isEven_false(self):
212+
self.assertFalse(validator.isEven(1))
213+
self.assertFalse(validator.isEven(3))
214+
self.assertFalse(validator.isEven(5))
215+
self.assertFalse(validator.isEven(7))
216+
self.assertFalse(validator.isEven(-3))
217+
218+
def test_isOdd_true(self):
219+
self.assertTrue(validator.isOdd(1))
220+
self.assertTrue(validator.isOdd(3))
221+
self.assertTrue(validator.isOdd(5))
222+
self.assertTrue(validator.isOdd(7))
223+
self.assertTrue(validator.isOdd(-3))
224+
225+
def test_isOdd_false(self):
226+
self.assertFalse(validator.isOdd(2))
227+
self.assertFalse(validator.isOdd(4))
228+
self.assertFalse(validator.isOdd(6))
229+
self.assertFalse(validator.isOdd(8))
230+
self.assertFalse(validator.isOdd(0))
231+
self.assertFalse(validator.isOdd(-2))
232+
233+
def test_isMultipleOf_true(self):
234+
self.assertTrue(validator.isMultipleOf(10, 2))
235+
self.assertTrue(validator.isMultipleOf(15, 3))
236+
self.assertTrue(validator.isMultipleOf(20, 5))
237+
self.assertTrue(validator.isMultipleOf(25, 5))
238+
self.assertTrue(validator.isMultipleOf(0, 1))
239+
self.assertTrue(validator.isMultipleOf(-10, 2))
240+
self.assertTrue(validator.isMultipleOf(-10, -2))
241+
self.assertTrue(validator.isMultipleOf(0, -3))
242+
243+
def test_isMultipleOf_false(self):
244+
self.assertFalse(validator.isMultipleOf(10, 3))
245+
self.assertFalse(validator.isMultipleOf(15, 4))
246+
self.assertFalse(validator.isMultipleOf(20, 6))
247+
self.assertFalse(validator.isMultipleOf(25, 4))
248+
self.assertFalse(validator.isMultipleOf(1, 0))
249+
self.assertFalse(validator.isMultipleOf(10, -3))
250+
self.assertFalse(validator.isMultipleOf(10, 0))
251+
252+
def test_isSquare_true(self):
253+
self.assertTrue(validator.isSquare(4))
254+
self.assertTrue(validator.isSquare(9))
255+
self.assertTrue(validator.isSquare(16))
256+
self.assertTrue(validator.isSquare(25))
257+
self.assertTrue(validator.isSquare(0))
258+
self.assertTrue(validator.isSquare(1000000))
259+
260+
def test_isSquare_false(self):
261+
self.assertFalse(validator.isSquare(3))
262+
self.assertFalse(validator.isSquare(8))
263+
self.assertFalse(validator.isSquare(10))
264+
self.assertFalse(validator.isSquare(15))
265+
self.assertFalse(validator.isSquare(-15))
266+
self.assertFalse(validator.isSquare(-1))
267+
self.assertFalse(validator.isSquare(18))
268+
269+
def test_isCube_true(self):
270+
self.assertTrue(validator.isCube(8))
271+
self.assertTrue(validator.isCube(-8))
272+
self.assertTrue(validator.isCube(27))
273+
self.assertTrue(validator.isCube(64))
274+
self.assertTrue(validator.isCube(125))
275+
self.assertTrue(validator.isCube(0))
276+
self.assertTrue(validator.isCube(1000000000))
277+
self.assertTrue(validator.isCube(-125))
278+
279+
def test_isCube_false(self):
280+
self.assertFalse(validator.isCube(9))
281+
self.assertFalse(validator.isCube(16))
282+
self.assertFalse(validator.isCube(20))
283+
self.assertFalse(validator.isCube(30))
284+
self.assertFalse(validator.isCube(-23))
285+
self.assertFalse(validator.isCube(-100))
286+
184287

185288
if __name__ == '__main__':
186-
unittest.main()
289+
unittest.main()

0 commit comments

Comments
 (0)