-
Notifications
You must be signed in to change notification settings - Fork 2
/
rules.py
69 lines (59 loc) · 1.75 KB
/
rules.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
"""
Copyright 2021 Schoening Consulting, LLC
"""
import re
import datetime
def clipl(s, n):
"""
Clip a string on the left to the n right-most characters
"""
return s[:n]
def clipr(s, n):
"""
Clip a string on the right to the n right-most characters
"""
return s[len(s)-n:]
def date_generalize(dt):
"""
Generalize a date to a year
"""
return datetime.date(dt.year, 1, 1)
def fpe(c, s):
"""
Return a format preserving encrypted value
"""
# print(s,type(s))
if not isinstance(s, str) or len(s) < 2:
# Original FF3 minLen was 2
# TODO: compare c.minLen instead of constant, add test cases
# raise ValueError(f'length {len(s)}, but fpe requires 3 or more')
return ""
a = re.sub(r"[^\d]", "", s)
res = c.encrypt(a)
return res
def mask(s, width, mchar="X"):
"""
Return a string masking all but the last width characters
"""
return len(s[:-width]) * mchar + s[-width:]
def mask_ssn(s, mchar="X"):
"""
Mask US SSN with separators intact
"""
return mchar*3 + '-' + mchar*2 + '-' + s[-4:]
def redact(s):
return ""
zip_blacklist = ('03600', '05900', '06300', '10200', '20300', '55600', '69200', '79000',
'82100', '82300', '83000', '83100', '87800', '87900', '88400', '89000', '89300')
def us_zipcode(zipcode: str) -> str:
"""
Return a five digit zipcode with the last two digits replaced by zeros.
Input may be either a five digit or 9 digit zip+4
"""
if len(zipcode) not in (5, 10):
raise ValueError(f'zipcode length was {len(zipcode)}, but valid zipcodes are 5 or 10 digits')
newz = zipcode[0:3] + '00'
if newz in zip_blacklist:
return '00000'
else:
return newz