From 4d57bb16acbf34eaeab560c36587df79471a3675 Mon Sep 17 00:00:00 2001 From: BenYamin Salimi Date: Mon, 17 Dec 2018 13:47:39 +0330 Subject: [PATCH 1/7] add ir national code validator --- validators/i18n/__init__.py | 1 + validators/i18n/ir.py | 38 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 validators/i18n/ir.py diff --git a/validators/i18n/__init__.py b/validators/i18n/__init__.py index 49652f68..0bd4e2b9 100644 --- a/validators/i18n/__init__.py +++ b/validators/i18n/__init__.py @@ -1 +1,2 @@ from .fi import fi_business_id, fi_ssn # noqa +from .ir import ir_national_code \ No newline at end of file diff --git a/validators/i18n/ir.py b/validators/i18n/ir.py new file mode 100644 index 00000000..d83c72ee --- /dev/null +++ b/validators/i18n/ir.py @@ -0,0 +1,38 @@ +import re + +from validators.utils import validator + +@validator +def ir_national_code(input): # forked from : https://gist.github.com/ebraminio/5292017 + """ + Validate a Iranian National Code. + + Each person in Iran has a uniq national code. For more + information see `Identity Number`_ + + .. _Identity Number: + https://en.wikipedia.org/wiki/Iranian_passport#Identity_Number + + Examples:: + + >>> ir_national_code('4608968882') # Generated by random generator + True + + >>> ir_national_code('4608968872') + False + + + :param national_code: national_code to validate + """ + if input == '0000000000': + return False + + if re.search(r'^\d{10}$', input): + pass + if not re.search(r'^\d{10}$', input): + return False + + check = int(input[9]) + s = sum([int(input[x]) * (10 - x) for x in range(9)]) % 11 + return (s < 2 and check == s) or (s >= 2 and check + s == 11) + From cebf3ede741d16fc35441ef1b8174595a4d7a390 Mon Sep 17 00:00:00 2001 From: BenYamin Salimi Date: Mon, 17 Dec 2018 13:48:08 +0330 Subject: [PATCH 2/7] add iranian national code validator test --- tests/i18n/test_ir.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tests/i18n/test_ir.py diff --git a/tests/i18n/test_ir.py b/tests/i18n/test_ir.py new file mode 100644 index 00000000..9363b3c3 --- /dev/null +++ b/tests/i18n/test_ir.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +import pytest + +from validators import ir_national_code +import random + +# from https://gist.github.com/Alireza2n/5708c361ca8417dec0f355d8eb51bc2b +def random_national_code_generator(): + number_list = [] + _sum = 0 + out = "" + for i in reversed(range(2, 11)): + _j = random.randint(0, 9) + number_list.append(str(_j)) + _sum += _j * i + _m = _sum % 11 + if _m < 2: + number_list.append(str(_m)) + elif _m >= 2: + number_list.append(str(11 - _m)) + return out.join(number_list) + +@pytest.mark.parametrize(('value',), [ + (random_national_code_generator(),), + (random_national_code_generator(),), + ('1111111111',), # same number is not invalid http://www.fardanews.com/fa/news/127747 + +]) +def test_returns_true_on_valid_national_code(value): + assert ir_national_code(value) + + +@pytest.mark.parametrize(('value',), [ + (None,), + ('0000000000',), + ('1234567890',), + ('123456789',), + ('',), +]) +def test_returns_failed_validation_on_national_code(value): + assert isinstance(ir_national_code(value), ValidationFailure) + From 146041d5d3700795370bbff1ef7d7b0f73f1fcb6 Mon Sep 17 00:00:00 2001 From: BenYamin Salimi Date: Mon, 17 Dec 2018 13:48:23 +0330 Subject: [PATCH 3/7] add iranian national code validator documnet --- docs/index.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index 212302b7..070a201b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -208,6 +208,16 @@ fi_ssn .. autofunction:: fi_ssn +Iran +------- + +.. module:: validators.i18n.ir + +ir_national_code +^^^^^^^^^^^^^^ + +.. autofunction:: ir_national_code + Internals ========= From 01df1802c0b3a5f7ce44655fcd18685128d609d3 Mon Sep 17 00:00:00 2001 From: BenYamin Salimi Date: Mon, 17 Dec 2018 13:52:40 +0330 Subject: [PATCH 4/7] new version and add ir_national_code --- validators/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/validators/__init__.py b/validators/__init__.py index e4ccfd53..88aaa9e9 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -3,7 +3,7 @@ from .email import email # noqa from .extremes import Max, Min # noqa from .hashes import md5, sha1, sha224, sha256, sha512 # noqa -from .i18n import fi_business_id, fi_ssn # noqa +from .i18n import fi_business_id, fi_ssn, ir_national_code # noqa from .iban import iban # noqa from .ip_address import ipv4, ipv6 # noqa from .length import length # noqa @@ -14,4 +14,4 @@ from .utils import ValidationFailure, validator # noqa from .uuid import uuid # noqa -__version__ = '0.12.3' +__version__ = '0.12.4' From 73eedff4ab12af9bf687c21d6739878ddd919283 Mon Sep 17 00:00:00 2001 From: BenYamin Salimi Date: Mon, 17 Dec 2018 14:03:53 +0330 Subject: [PATCH 5/7] fix test --- tests/i18n/test_ir.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/i18n/test_ir.py b/tests/i18n/test_ir.py index 9363b3c3..e8339886 100644 --- a/tests/i18n/test_ir.py +++ b/tests/i18n/test_ir.py @@ -38,5 +38,4 @@ def test_returns_true_on_valid_national_code(value): ('',), ]) def test_returns_failed_validation_on_national_code(value): - assert isinstance(ir_national_code(value), ValidationFailure) - + assert isinstance(ir_national_code(value), False) From 1b658b3f1c44a2829a758502917ef27079902612 Mon Sep 17 00:00:00 2001 From: BenYamin Salimi Date: Mon, 17 Dec 2018 14:17:43 +0330 Subject: [PATCH 6/7] fix test --- tests/i18n/test_ir.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/i18n/test_ir.py b/tests/i18n/test_ir.py index e8339886..bb41ee8c 100644 --- a/tests/i18n/test_ir.py +++ b/tests/i18n/test_ir.py @@ -29,7 +29,6 @@ def random_national_code_generator(): def test_returns_true_on_valid_national_code(value): assert ir_national_code(value) - @pytest.mark.parametrize(('value',), [ (None,), ('0000000000',), @@ -37,5 +36,5 @@ def test_returns_true_on_valid_national_code(value): ('123456789',), ('',), ]) -def test_returns_failed_validation_on_national_code(value): - assert isinstance(ir_national_code(value), False) +def test_returns_True_on_not_valid_national_code(value): + assert not ir_national_code(value) From 468595f339effbb7c24f2b4c79c67fb40d8930fb Mon Sep 17 00:00:00 2001 From: BenYamin Salimi Date: Mon, 17 Dec 2018 14:18:02 +0330 Subject: [PATCH 7/7] fix documnet --- validators/i18n/ir.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validators/i18n/ir.py b/validators/i18n/ir.py index d83c72ee..d73481df 100644 --- a/validators/i18n/ir.py +++ b/validators/i18n/ir.py @@ -19,7 +19,7 @@ def ir_national_code(input): # forked from : https://gist.github.com/ebraminio/5 True >>> ir_national_code('4608968872') - False + ValidationFailure(func=ir_national_code, args={'input': '4608968872'}) :param national_code: national_code to validate