Skip to content

Commit a69af9d

Browse files
authored
Merge pull request #358 from yozachar/workshop
feat: adds indian aadhar and pan validator
2 parents 11b083b + 10c2787 commit a69af9d

File tree

6 files changed

+101
-4
lines changed

6 files changed

+101
-4
lines changed

docs/api/i18n.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@
88
::: validators.i18n.fi_ssn
99
::: validators.i18n.fr_department
1010
::: validators.i18n.fr_ssn
11+
::: validators.i18n.ind_aadhar
12+
::: validators.i18n.ind_pan

docs/api/i18n.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,5 @@ i18n
1010
.. autofunction:: fi_ssn
1111
.. autofunction:: fr_department
1212
.. autofunction:: fr_ssn
13+
.. autofunction:: ind_aadhar
14+
.. autofunction:: ind_pan

src/validators/__init__.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,18 @@
1111
from .encoding import base58, base64
1212
from .hashes import md5, sha1, sha224, sha256, sha512
1313
from .hostname import hostname
14-
from .i18n import es_cif, es_doi, es_nie, es_nif, fi_business_id, fi_ssn, fr_department, fr_ssn
14+
from .i18n import (
15+
es_cif,
16+
es_doi,
17+
es_nie,
18+
es_nif,
19+
fi_business_id,
20+
fi_ssn,
21+
fr_department,
22+
fr_ssn,
23+
ind_aadhar,
24+
ind_pan,
25+
)
1526
from .iban import iban
1627
from .ip_address import ipv4, ipv6
1728
from .length import length
@@ -67,6 +78,8 @@
6778
"fi_ssn",
6879
"fr_department",
6980
"fr_ssn",
81+
"ind_aadhar",
82+
"ind_pan",
7083
# ...
7184
"iban",
7285
# ip_addresses

src/validators/i18n/__init__.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
"""Country."""
2-
3-
# isort: skip_file
1+
"""i18n."""
42

53
# local
64
from .es import es_cif, es_doi, es_nie, es_nif
75
from .fi import fi_business_id, fi_ssn
86
from .fr import fr_department, fr_ssn
7+
from .ind import ind_aadhar, ind_pan
98

109
__all__ = (
1110
"fi_business_id",
@@ -16,4 +15,6 @@
1615
"es_nif",
1716
"fr_department",
1817
"fr_ssn",
18+
"ind_aadhar",
19+
"ind_pan",
1920
)

src/validators/i18n/ind.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
"""India."""
2+
3+
# standard
4+
import re
5+
6+
# local
7+
from validators.utils import validator
8+
9+
10+
@validator
11+
def ind_aadhar(value: str):
12+
"""Validate an indian aadhar card number.
13+
14+
Examples:
15+
>>> ind_aadhar('3675 9834 6015')
16+
True
17+
>>> ind_aadhar('3675 ABVC 2133')
18+
ValidationFailure(func=aadhar, args={'value': '3675 ABVC 2133'})
19+
20+
Args:
21+
value: Aadhar card number string to validate.
22+
23+
Returns:
24+
(Literal[True]): If `value` is a valid aadhar card number.
25+
(ValidationError): If `value` is an invalid aadhar card number.
26+
"""
27+
return re.match(r"^[2-9]{1}\d{3}\s\d{4}\s\d{4}$", value)
28+
29+
30+
@validator
31+
def ind_pan(value: str):
32+
"""Validate a pan card number.
33+
34+
Examples:
35+
>>> ind_pan('ABCDE9999K')
36+
True
37+
>>> ind_pan('ABC5d7896B')
38+
ValidationFailure(func=pan, args={'value': 'ABC5d7896B'})
39+
40+
Args:
41+
value: PAN card number string to validate.
42+
43+
Returns:
44+
(Literal[True]): If `value` is a valid PAN card number.
45+
(ValidationError): If `value` is an invalid PAN card number.
46+
"""
47+
return re.match(r"[A-Z]{5}\d{4}[A-Z]{1}", value)

tests/i18n/test_ind.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""Test Indian validators."""
2+
3+
# external
4+
import pytest
5+
6+
# local
7+
from validators import ValidationError
8+
from validators.i18n import ind_aadhar, ind_pan
9+
10+
11+
@pytest.mark.parametrize("value", ["3675 9834 6012", "5046 3182 4299"])
12+
def test_returns_true_on_valid_ind_aadhar(value: str):
13+
"""Test returns true on valid ind aadhar."""
14+
assert ind_aadhar(value)
15+
16+
17+
@pytest.mark.parametrize("value", ["3675 9834 6012 8", "417598346012", "3675 98AF 60#2"])
18+
def test_returns_failed_validation_on_invalid_ind_aadhar(value: str):
19+
"""Test returns failed validation on invalid ind aadhar."""
20+
assert isinstance(ind_aadhar(value), ValidationError)
21+
22+
23+
@pytest.mark.parametrize("value", ["ABCDE9999K", "AAAPL1234C"])
24+
def test_returns_true_on_valid_ind_pan(value: str):
25+
"""Test returns true on valid ind pan."""
26+
assert ind_pan(value)
27+
28+
29+
@pytest.mark.parametrize("value", ["ABC5d7896B", "417598346012", "AaaPL1234C"])
30+
def test_returns_failed_validation_on_invalid_ind_pan(value: str):
31+
"""Test returns failed validation on invalid ind pan."""
32+
assert isinstance(ind_pan(value), ValidationError)

0 commit comments

Comments
 (0)