Skip to content

Commit

Permalink
Merge pull request #358 from yozachar/workshop
Browse files Browse the repository at this point in the history
feat: adds indian aadhar and pan validator
  • Loading branch information
yozachar committed Apr 3, 2024
2 parents 11b083b + 10c2787 commit a69af9d
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 4 deletions.
2 changes: 2 additions & 0 deletions docs/api/i18n.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@
::: validators.i18n.fi_ssn
::: validators.i18n.fr_department
::: validators.i18n.fr_ssn
::: validators.i18n.ind_aadhar
::: validators.i18n.ind_pan
2 changes: 2 additions & 0 deletions docs/api/i18n.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,5 @@ i18n
.. autofunction:: fi_ssn
.. autofunction:: fr_department
.. autofunction:: fr_ssn
.. autofunction:: ind_aadhar
.. autofunction:: ind_pan
15 changes: 14 additions & 1 deletion src/validators/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,18 @@
from .encoding import base58, base64
from .hashes import md5, sha1, sha224, sha256, sha512
from .hostname import hostname
from .i18n import es_cif, es_doi, es_nie, es_nif, fi_business_id, fi_ssn, fr_department, fr_ssn
from .i18n import (
es_cif,
es_doi,
es_nie,
es_nif,
fi_business_id,
fi_ssn,
fr_department,
fr_ssn,
ind_aadhar,
ind_pan,
)
from .iban import iban
from .ip_address import ipv4, ipv6
from .length import length
Expand Down Expand Up @@ -67,6 +78,8 @@
"fi_ssn",
"fr_department",
"fr_ssn",
"ind_aadhar",
"ind_pan",
# ...
"iban",
# ip_addresses
Expand Down
7 changes: 4 additions & 3 deletions src/validators/i18n/__init__.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
"""Country."""

# isort: skip_file
"""i18n."""

# local
from .es import es_cif, es_doi, es_nie, es_nif
from .fi import fi_business_id, fi_ssn
from .fr import fr_department, fr_ssn
from .ind import ind_aadhar, ind_pan

__all__ = (
"fi_business_id",
Expand All @@ -16,4 +15,6 @@
"es_nif",
"fr_department",
"fr_ssn",
"ind_aadhar",
"ind_pan",
)
47 changes: 47 additions & 0 deletions src/validators/i18n/ind.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
"""India."""

# standard
import re

# local
from validators.utils import validator


@validator
def ind_aadhar(value: str):
"""Validate an indian aadhar card number.
Examples:
>>> ind_aadhar('3675 9834 6015')
True
>>> ind_aadhar('3675 ABVC 2133')
ValidationFailure(func=aadhar, args={'value': '3675 ABVC 2133'})
Args:
value: Aadhar card number string to validate.
Returns:
(Literal[True]): If `value` is a valid aadhar card number.
(ValidationError): If `value` is an invalid aadhar card number.
"""
return re.match(r"^[2-9]{1}\d{3}\s\d{4}\s\d{4}$", value)


@validator
def ind_pan(value: str):
"""Validate a pan card number.
Examples:
>>> ind_pan('ABCDE9999K')
True
>>> ind_pan('ABC5d7896B')
ValidationFailure(func=pan, args={'value': 'ABC5d7896B'})
Args:
value: PAN card number string to validate.
Returns:
(Literal[True]): If `value` is a valid PAN card number.
(ValidationError): If `value` is an invalid PAN card number.
"""
return re.match(r"[A-Z]{5}\d{4}[A-Z]{1}", value)
32 changes: 32 additions & 0 deletions tests/i18n/test_ind.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""Test Indian validators."""

# external
import pytest

# local
from validators import ValidationError
from validators.i18n import ind_aadhar, ind_pan


@pytest.mark.parametrize("value", ["3675 9834 6012", "5046 3182 4299"])
def test_returns_true_on_valid_ind_aadhar(value: str):
"""Test returns true on valid ind aadhar."""
assert ind_aadhar(value)


@pytest.mark.parametrize("value", ["3675 9834 6012 8", "417598346012", "3675 98AF 60#2"])
def test_returns_failed_validation_on_invalid_ind_aadhar(value: str):
"""Test returns failed validation on invalid ind aadhar."""
assert isinstance(ind_aadhar(value), ValidationError)


@pytest.mark.parametrize("value", ["ABCDE9999K", "AAAPL1234C"])
def test_returns_true_on_valid_ind_pan(value: str):
"""Test returns true on valid ind pan."""
assert ind_pan(value)


@pytest.mark.parametrize("value", ["ABC5d7896B", "417598346012", "AaaPL1234C"])
def test_returns_failed_validation_on_invalid_ind_pan(value: str):
"""Test returns failed validation on invalid ind pan."""
assert isinstance(ind_pan(value), ValidationError)

0 comments on commit a69af9d

Please sign in to comment.