Skip to content

Commit b7353da

Browse files
authored
adding preserve area code (#113)
1 parent 9f612c7 commit b7353da

4 files changed

Lines changed: 36 additions & 1 deletion

File tree

docs/source/redact/generator_metadata.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ Phone number synthesis
105105

106106
* ``use_us_phone_number_generator`` (bool, default ``False``) -- When ``True``, generated telephone numbers use a US phone number format.
107107
* ``replace_invalid_numbers`` (bool, default ``True``) -- When ``True``, detected telephone numbers that are not valid are still replaced with synthesized values.
108+
* ``preserve_us_area_code`` (bool, default ``False``) -- When ``True`` and ``use_us_phone_number_generator`` is also ``True``, the area code of the original phone number is preserved in the synthesized value.
108109

109110
.. code-block:: python
110111
@@ -114,6 +115,7 @@ Phone number synthesis
114115
"PHONE_NUMBER": PhoneNumberGeneratorMetadata(
115116
use_us_phone_number_generator=True,
116117
replace_invalid_numbers=True,
118+
preserve_us_area_code=True,
117119
),
118120
}
119121

tests/tests/metadata_tests/test_payload_serialization.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,13 +379,15 @@ def test_to_payload_defaults(self):
379379
assert payload["swaps"] == {}
380380
assert payload["useUsPhoneNumberGenerator"] is False
381381
assert payload["replaceInvalidNumbers"] is True
382+
assert payload["preserveUsAreaCode"] is False
382383
assert payload["constantValue"] is None
383384

384385
def test_to_payload_with_values(self):
385386
metadata = PhoneNumberGeneratorMetadata(
386387
generator_version=GeneratorVersion.V2,
387388
use_us_phone_number_generator=True,
388389
replace_invalid_numbers=False,
390+
preserve_us_area_code=True,
389391
swaps={"555-1234": "555-5678"},
390392
constant_value="REDACTED"
391393
)
@@ -396,6 +398,7 @@ def test_to_payload_with_values(self):
396398
assert payload["swaps"] == {"555-1234": "555-5678"}
397399
assert payload["useUsPhoneNumberGenerator"] is True
398400
assert payload["replaceInvalidNumbers"] is False
401+
assert payload["preserveUsAreaCode"] is True
399402
assert payload["constantValue"] == "REDACTED"
400403

401404
def test_from_payload_defaults(self):
@@ -407,6 +410,7 @@ def test_from_payload_defaults(self):
407410
assert metadata.swaps == {}
408411
assert metadata.use_us_phone_number_generator is False
409412
assert metadata.replace_invalid_numbers is True
413+
assert metadata.preserve_us_area_code is False
410414
assert metadata.constant_value is None
411415

412416
def test_from_payload_with_values(self):
@@ -416,6 +420,7 @@ def test_from_payload_with_values(self):
416420
"swaps": {"111": "222"},
417421
"useUsPhoneNumberGenerator": True,
418422
"replaceInvalidNumbers": False,
423+
"preserveUsAreaCode": True,
419424
"constantValue": "REDACTED"
420425
}
421426
metadata = PhoneNumberGeneratorMetadata.from_payload(payload)
@@ -425,6 +430,7 @@ def test_from_payload_with_values(self):
425430
assert metadata.swaps == {"111": "222"}
426431
assert metadata.use_us_phone_number_generator is True
427432
assert metadata.replace_invalid_numbers is False
433+
assert metadata.preserve_us_area_code is True
428434
assert metadata.constant_value == "REDACTED"
429435

430436
def test_from_payload_invalid_generator_raises(self):
@@ -438,6 +444,7 @@ def test_roundtrip(self):
438444
generator_version=GeneratorVersion.V2,
439445
use_us_phone_number_generator=True,
440446
replace_invalid_numbers=False,
447+
preserve_us_area_code=True,
441448
swaps={"phone1": "phone2"},
442449
constant_value="REDACTED"
443450
)
@@ -450,6 +457,7 @@ def test_roundtrip(self):
450457
assert restored.swaps == original.swaps
451458
assert restored.use_us_phone_number_generator == original.use_us_phone_number_generator
452459
assert restored.replace_invalid_numbers == original.replace_invalid_numbers
460+
assert restored.preserve_us_area_code == original.preserve_us_area_code
453461
assert restored.constant_value == original.constant_value
454462

455463

tests/tests/metadata_tests/test_phone_number_generator_metadata_json.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ def test_json_dumps_works_directly(self):
1212
generator_version=GeneratorVersion.V2,
1313
use_us_phone_number_generator=True,
1414
replace_invalid_numbers=False,
15+
preserve_us_area_code=True,
1516
swaps={"555-1234": "555-5678"}
1617
)
1718
json_str = json.dumps(metadata)
@@ -22,6 +23,7 @@ def test_json_dumps_works_directly(self):
2223
assert parsed["generatorVersion"] == "V2"
2324
assert parsed["useUsPhoneNumberGenerator"] is True
2425
assert parsed["replaceInvalidNumbers"] is False
26+
assert parsed["preserveUsAreaCode"] is True
2527
assert parsed["swaps"] == {"555-1234": "555-5678"}
2628

2729
def test_json_includes_type_field(self):
@@ -43,6 +45,7 @@ def test_json_roundtrip_with_defaults(self):
4345
assert restored.generator_version == original.generator_version
4446
assert restored.use_us_phone_number_generator == original.use_us_phone_number_generator
4547
assert restored.replace_invalid_numbers == original.replace_invalid_numbers
48+
assert restored.preserve_us_area_code == original.preserve_us_area_code
4649
assert restored.swaps == original.swaps
4750

4851
def test_json_roundtrip_with_custom_values(self):
@@ -51,6 +54,7 @@ def test_json_roundtrip_with_custom_values(self):
5154
generator_version=GeneratorVersion.V2,
5255
use_us_phone_number_generator=True,
5356
replace_invalid_numbers=False,
57+
preserve_us_area_code=True,
5458
swaps={"phone1": "phone2"}
5559
)
5660
json_str = json.dumps(original)
@@ -61,29 +65,35 @@ def test_json_roundtrip_with_custom_values(self):
6165
assert restored.generator_version == GeneratorVersion.V2
6266
assert restored.use_us_phone_number_generator is True
6367
assert restored.replace_invalid_numbers is False
68+
assert restored.preserve_us_area_code is True
6469
assert restored.swaps == {"phone1": "phone2"}
6570

6671
def test_attribute_access_works(self):
6772
"""Property-based attribute access should work."""
6873
metadata = PhoneNumberGeneratorMetadata(
6974
use_us_phone_number_generator=True,
70-
replace_invalid_numbers=False
75+
replace_invalid_numbers=False,
76+
preserve_us_area_code=True
7177
)
7278

7379
assert metadata.use_us_phone_number_generator is True
7480
assert metadata.replace_invalid_numbers is False
81+
assert metadata.preserve_us_area_code is True
7582
assert metadata.custom_generator == GeneratorType.PhoneNumber
7683

7784
def test_attribute_setter_works(self):
7885
"""Property setter should update the underlying dict."""
7986
metadata = PhoneNumberGeneratorMetadata()
8087
metadata.use_us_phone_number_generator = True
8188
metadata.replace_invalid_numbers = False
89+
metadata.preserve_us_area_code = True
8290

8391
assert metadata.use_us_phone_number_generator is True
8492
assert metadata["useUsPhoneNumberGenerator"] is True
8593
assert metadata.replace_invalid_numbers is False
8694
assert metadata["replaceInvalidNumbers"] is False
95+
assert metadata.preserve_us_area_code is True
96+
assert metadata["preserveUsAreaCode"] is True
8797

8898
def test_dict_access_works(self):
8999
"""Direct dict access should work."""

tonic_textual/classes/generator_metadata/phone_number_generator_metadata.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,18 @@ class PhoneNumberGeneratorMetadata(BaseMetadata):
2020
When ``True``, phone numbers that are detected but are not valid
2121
phone numbers are replaced with synthesized values. Default
2222
is ``True``.
23+
preserve_us_area_code : bool
24+
When ``True`` and ``use_us_phone_number_generator`` is also ``True``,
25+
the area code of the original phone number is preserved in the
26+
synthesized value. Default is ``False``.
2327
"""
2428

2529
def __init__(
2630
self,
2731
generator_version: GeneratorVersion = GeneratorVersion.V1,
2832
use_us_phone_number_generator: bool = False,
2933
replace_invalid_numbers: bool = True,
34+
preserve_us_area_code: bool = False,
3035
swaps: Optional[Dict[str,str]] = {},
3136
constant_value: Optional[str] = None,
3237
):
@@ -38,6 +43,7 @@ def __init__(
3843
)
3944
self["useUsPhoneNumberGenerator"] = use_us_phone_number_generator
4045
self["replaceInvalidNumbers"] = replace_invalid_numbers
46+
self["preserveUsAreaCode"] = preserve_us_area_code
4147

4248
@property
4349
def use_us_phone_number_generator(self) -> bool:
@@ -55,6 +61,14 @@ def replace_invalid_numbers(self) -> bool:
5561
def replace_invalid_numbers(self, value: bool):
5662
self["replaceInvalidNumbers"] = value
5763

64+
@property
65+
def preserve_us_area_code(self) -> bool:
66+
return self["preserveUsAreaCode"]
67+
68+
@preserve_us_area_code.setter
69+
def preserve_us_area_code(self, value: bool):
70+
self["preserveUsAreaCode"] = value
71+
5872
def to_payload(self) -> Dict:
5973
return dict(self)
6074

@@ -72,6 +86,7 @@ def from_payload(payload: Dict) -> "PhoneNumberGeneratorMetadata":
7286
generator_version=base_metadata.generator_version,
7387
use_us_phone_number_generator=payload.get("useUsPhoneNumberGenerator", False),
7488
replace_invalid_numbers=payload.get("replaceInvalidNumbers", True),
89+
preserve_us_area_code=payload.get("preserveUsAreaCode", False),
7590
swaps=base_metadata.swaps,
7691
constant_value=base_metadata.constant_value
7792
)

0 commit comments

Comments
 (0)