Skip to content

Commit

Permalink
Removes that Spanish DOI / NIE / NIF / CIF validation from source (#959)
Browse files Browse the repository at this point in the history
  • Loading branch information
kingbuzzman authored and fcurella committed May 22, 2019
1 parent 16e164c commit 9071f74
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 99 deletions.
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
"text-unidecode==1.2",
],
tests_require=[
"email_validator>=1.0.1,<1.1.0",
"validators>=0.13.0",
"ukpostcodeparser>=1.1.1",
"mock ; python_version < '3.3'",
"pytest>=3.8.0,<3.9",
Expand Down
24 changes: 12 additions & 12 deletions tests/providers/test_internet.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import pytest
import six

from email_validator import validate_email
from validators import email as validate_email

from faker import Faker
from faker.providers.person.ja_JP import Provider as JaProvider
Expand Down Expand Up @@ -120,7 +120,7 @@ def setUp(self):

def test_email(self):
email = self.factory.email()
validate_email(email, check_deliverability=False)
validate_email(email)

def test_domain_word(self):
domain_word = self.factory.domain_word()
Expand Down Expand Up @@ -155,7 +155,7 @@ def setUp(self):

def test_email(self):
email = self.factory.email()
validate_email(email, check_deliverability=False)
validate_email(email)


class TestHuHU(unittest.TestCase):
Expand Down Expand Up @@ -200,7 +200,7 @@ def setUp(self):
)
def test_ascii_safe_email(self):
email = self.factory.ascii_safe_email()
validate_email(email, check_deliverability=False)
validate_email(email)
assert email.split('@')[0] == 'fabienne'

@mock.patch(
Expand All @@ -209,7 +209,7 @@ def test_ascii_safe_email(self):
)
def test_ascii_free_email(self):
email = self.factory.ascii_free_email()
validate_email(email, check_deliverability=False)
validate_email(email)
assert email.split('@')[0] == 'fabienne'

@mock.patch(
Expand All @@ -218,7 +218,7 @@ def test_ascii_free_email(self):
)
def test_ascii_company_email(self):
email = self.factory.ascii_company_email()
validate_email(email, check_deliverability=False)
validate_email(email)
assert email.split('@')[0] == 'fabienne'


Expand All @@ -234,7 +234,7 @@ def setUp(self):
)
def test_ascii_safe_email(self):
email = self.factory.ascii_safe_email()
validate_email(email, check_deliverability=False)
validate_email(email)
assert email.split('@')[0] == 'asyl'

@mock.patch(
Expand All @@ -243,7 +243,7 @@ def test_ascii_safe_email(self):
)
def test_ascii_free_email(self):
email = self.factory.ascii_free_email()
validate_email(email, check_deliverability=False)
validate_email(email)
assert email.split('@')[0] == 'asyl'

@mock.patch(
Expand All @@ -252,7 +252,7 @@ def test_ascii_free_email(self):
)
def test_ascii_company_email(self):
email = self.factory.ascii_company_email()
validate_email(email, check_deliverability=False)
validate_email(email)
assert email.split('@')[0] == 'asyl'


Expand All @@ -268,7 +268,7 @@ def setUp(self):
)
def test_ascii_safe_email(self):
email = self.factory.ascii_safe_email()
validate_email(email, check_deliverability=False)
validate_email(email)
assert email.split('@')[0] == 'vitoriamagalhaes'

@mock.patch(
Expand All @@ -277,7 +277,7 @@ def test_ascii_safe_email(self):
)
def test_ascii_free_email(self):
email = self.factory.ascii_free_email()
validate_email(email, check_deliverability=False)
validate_email(email)
assert email.split('@')[0] == 'joaosimoes'

@mock.patch(
Expand All @@ -286,5 +286,5 @@ def test_ascii_free_email(self):
)
def test_ascii_company_email(self):
email = self.factory.ascii_company_email()
validate_email(email, check_deliverability=False)
validate_email(email)
assert email.split('@')[0] == 'andrecaua'
87 changes: 1 addition & 86 deletions tests/providers/test_ssn.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import freezegun
import pytest
import random2
from validators.i18n.es import es_cif as is_cif, es_nif as is_nif, es_nie as is_nie

from faker import Faker
from faker.providers.ssn.en_CA import checksum as ca_checksum
Expand Down Expand Up @@ -268,92 +269,6 @@ def test_wrong_tin_type_case(self):
self.factory.ssn(taxpayer_identification_number_type='ssn')


def nif_nie_validation(doi, number_by_letter, special_cases):
"""
Validate if the doi is a NIF or a NIE.
:param doi: DOI to validate.
:return: boolean if it's valid.
"""
doi = doi.upper()
if doi in special_cases:
return False

table = 'TRWAGMYFPDXBNJZSQVHLCKE'

if len(doi) == 9:
control = doi[8]

# If it is not a DNI, convert the first letter to the corresponding digit
numbers = number_by_letter.get(doi[0], doi[0]) + doi[1:8]

return numbers.isdigit() and control == table[int(numbers) % 23]

return False


def is_cif(doi):
"""
Validate if the doi is a CIF.
:param doi: DOI to validate.
:return: boolean if it's valid.
"""
doi = doi.upper()

if len(doi) != 9:
return False

table = 'JABCDEFGHI'
first_chr = doi[0]
doi_body = doi[1:8]
control = doi[8]

if not doi_body.isdigit():
return False

# Multiply each each odd position doi digit by 2 and sum it all together
odd_result = sum(int(x) for x in ''.join(str(int(x) * 2) for x in doi_body[0::2]))
# Sum all even doi digits
even_result = sum(map(int, doi_body[1::2]))

res = (10 - (even_result + odd_result) % 10) % 10

if first_chr in 'ABEH': # Number type
return str(res) == control
elif first_chr in 'PSQW': # Letter type
return table[res] == control
elif first_chr not in 'CDFGJNRUV':
return False

return control == str(res) or control == table[res]


def is_nif(doi):
"""
Validate if the doi is a NIF.
:param doi: DOI to validate.
:return: boolean if it's valid.
"""
number_by_letter = {'L': '0', 'M': '0', 'K': '0'}
special_cases = ['X0000000T', '00000000T', '00000001R', '00000001R']
return nif_nie_validation(doi, number_by_letter, special_cases)


def is_nie(doi):
"""
Validate if the doi is a NIE.
:param doi: DOI to validate.
:return: boolean if it's valid.
"""
number_by_letter = {'X': '0', 'Y': '1', 'Z': '2'}
special_cases = ['X0000000T']

# NIE must must start with X Y or Z
if not doi or doi[0] not in number_by_letter.keys():
return False

return nif_nie_validation(doi, number_by_letter, special_cases)


class TestEsES(unittest.TestCase):
def setUp(self):
self.factory = Faker('es_ES')
Expand Down

0 comments on commit 9071f74

Please sign in to comment.