Skip to content

Commit

Permalink
Fix IT SSN generation with latin chars in name or surname (#1758)
Browse files Browse the repository at this point in the history
* Fix IT SSN generation with latin chars in name or surname

* Code linting

Co-authored-by: Flavio Curella <89607+fcurella@users.noreply.github.com>
  • Loading branch information
panicofr and fcurella authored Nov 30, 2022
1 parent 79228b9 commit 7f015d0
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 1 deletion.
11 changes: 11 additions & 0 deletions faker/providers/ssn/it_IT/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
"""it_IT ssn provider (yields italian fiscal codes)"""

import unicodedata

from string import ascii_uppercase, digits

from .. import Provider as SsnProvider
Expand Down Expand Up @@ -8051,6 +8053,8 @@ def _get_name_letters(self, sex: int) -> str:
else:
name = self.generator.first_name_female().upper()

name = self._transliterate_name(name)

if len(name) < 3:
return self._pad_shorter(name)

Expand All @@ -8074,6 +8078,8 @@ def _get_surname_letters(self) -> str:
str
"""
surname = self.generator.last_name().upper()
surname = self._transliterate_name(surname)

if len(surname) < 3:
return self._pad_shorter(surname)

Expand All @@ -8086,6 +8092,11 @@ def _get_surname_letters(self) -> str:
surname_part = "".join(surname_consonants)[:3]
return surname_part

@staticmethod
def _transliterate_name(name: str) -> str:
nfkd_form: str = unicodedata.normalize("NFKD", name)
return "".join([c for c in nfkd_form if unicodedata.combining(c) == 0])

@staticmethod
def _get_vowels(sequence: str) -> list:
"""
Expand Down
9 changes: 8 additions & 1 deletion tests/providers/test_ssn.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from validators.i18n.es import es_nie as is_nie
from validators.i18n.es import es_nif as is_nif

from faker import Faker
from faker import Factory, Faker
from faker.providers.ssn.el_GR import tin_checksum as gr_tin_checksum
from faker.providers.ssn.en_CA import checksum as ca_checksum
from faker.providers.ssn.es_CL import rut_check_digit as cl_rut_checksum
Expand Down Expand Up @@ -904,6 +904,13 @@ def test_ssn(self):
def test_checksum(self) -> None:
assert it_checksum("MDDMRA80L41H501") == "R"

def test_ssn_with_latin_chars(self):
generator = Factory.create("it_IT")
generator.last_name = mock.MagicMock(return_value="Foà")
ssn = generator.ssn()
self.assertEqual(len(ssn), 16)
self.assertEqual(ssn[:3], "FOA")


class TestPtBR(unittest.TestCase):
def setUp(self):
Expand Down

0 comments on commit 7f015d0

Please sign in to comment.