Skip to content

Commit 30f5a42

Browse files
rodrigo.nogueiralk-geimfari
authored andcommitted
feat: add e164 parameter to phone_number for E.164 format output
1 parent 672700d commit 30f5a42

2 files changed

Lines changed: 35 additions & 3 deletions

File tree

mimesis/providers/person.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -480,23 +480,33 @@ def language(self) -> str:
480480
languages: list[str] = self._extract(["language"])
481481
return self.random.choice(languages)
482482

483-
def phone_number(self, mask: str = "", placeholder: str = "#") -> str:
483+
def phone_number(
484+
self,
485+
mask: str = "",
486+
placeholder: str = "#",
487+
e164: bool = False,
488+
) -> str:
484489
"""Generates a random phone number.
485490
486491
:param mask: Mask for formatting number.
487492
:param placeholder: A placeholder for a mask (default is #).
493+
:param e164: If True, returns phone number in E.164 format (e.g., +14155552671).
488494
:return: Phone number.
489495
490496
:Example:
491-
+7-(963)-409-11-22.
497+
Default: +7-(963)-409-11-22
498+
E.164: +79634091122
492499
"""
493500
if not mask:
494501
code = self.random.choice(CALLING_CODES)
495502
default = f"{code}-(###)-###-####"
496503
masks = self._extract(["telephone_fmt"], default=[default])
497504
mask = self.random.choice(masks)
498505

499-
return self.random.generate_string_by_mask(mask=mask, digit=placeholder)
506+
result = self.random.generate_string_by_mask(mask=mask, digit=placeholder)
507+
if e164:
508+
return "+" + "".join(c for c in result if c.isdigit())
509+
return result
500510

501511
def telephone(self, *args: t.Any, **kwargs: t.Any) -> str:
502512
"""An alias for :meth:`~.phone_number`."""

tests/test_providers/test_localized/test_person.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,27 @@ def test_telephone(self, person):
206206
head = result.split(" ")[0]
207207
assert head == "+5"
208208

209+
def test_telephone_e164(self, _person):
210+
result = _person.telephone(e164=True)
211+
assert re.match(
212+
r"^\+\d+$", result
213+
), f"E.164 format should be +digits, got: {result}"
214+
assert len(result) >= 8, "E.164 number should have at least 7 digits plus +"
215+
216+
mask = "+1 (555)-123-4567"
217+
result = _person.telephone(mask=mask, e164=True)
218+
assert result == "+15551234567"
219+
220+
mask_with_separators = "+1-(###)-###-####"
221+
result_e164 = _person.telephone(mask=mask_with_separators, e164=True)
222+
assert re.match(
223+
r"^\+\d+$", result_e164
224+
), f"Should be E.164 format, got: {result_e164}"
225+
result_default = _person.telephone(mask=mask_with_separators, e164=False)
226+
assert (
227+
"-" in result_default or "(" in result_default
228+
), f"Default should have separators: {result_default}"
229+
209230
@pytest.mark.parametrize(
210231
"gender",
211232
[
@@ -407,6 +428,7 @@ def test_telephone(self, p1, p2):
407428
assert p1.telephone(mask="(x)-xx-xxx", placeholder="x") == p2.telephone(
408429
mask="(x)-xx-xxx", placeholder="x"
409430
)
431+
assert p1.telephone(e164=True) == p2.telephone(e164=True)
410432

411433
def test_surname(self, p1, p2):
412434
assert p1.surname() == p2.surname()

0 commit comments

Comments
 (0)