Skip to content
This repository was archived by the owner on Jan 8, 2025. It is now read-only.

Commit bfbb926

Browse files
authored
Fix #191 - handle all date valueerror (#192)
1 parent 5ce7c3a commit bfbb926

File tree

16 files changed

+125
-84
lines changed

16 files changed

+125
-84
lines changed

idnumbers/nationalid/BEL.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,15 @@ def parse(id_number: str) -> Optional[ParseResult]:
6262
dd = int(match_obj.group('dd'))
6363
sn = match_obj.group('sn')
6464
year_base = 1900 if yy > 50 else 2000
65-
return {
66-
'yyyymmdd': date(yy + year_base, mm, dd),
67-
'gender': Gender.MALE if int(sn) % 2 == 1 else Gender.FEMALE,
68-
'sn': sn,
69-
'checksum': int(match_obj.group('checksum'))
70-
}
65+
try:
66+
return {
67+
'yyyymmdd': date(yy + year_base, mm, dd),
68+
'gender': Gender.MALE if int(sn) % 2 == 1 else Gender.FEMALE,
69+
'sn': sn,
70+
'checksum': int(match_obj.group('checksum'))
71+
}
72+
except ValueError:
73+
return None
7174

7275
@staticmethod
7376
def checksum(id_number) -> bool:

idnumbers/nationalid/BGR.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,14 @@ def parse(id_number: str) -> Optional[ParseResult]:
6565
yyyy = yy + 1800
6666
else:
6767
yyyy = yy + 1900
68-
return {
69-
'yyyymmdd': date(yyyy, mm, dd),
70-
"checksum": int(checksum),
71-
'gender': Gender.MALE if int(match_obj.group("gender")) % 2 == 0 else Gender.FEMALE
72-
}
68+
try:
69+
return {
70+
'yyyymmdd': date(yyyy, mm, dd),
71+
"checksum": int(checksum),
72+
'gender': Gender.MALE if int(match_obj.group("gender")) % 2 == 0 else Gender.FEMALE
73+
}
74+
except ValueError:
75+
return None
7376

7477
MULTIPLIER = [2, 4, 8, 5, 10, 9, 7, 3, 6]
7578

idnumbers/nationalid/CHN.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,16 @@ def parse(id_number: str) -> Optional[ParseResult]:
6868
checksum = ResidentID.checksum(id_number)
6969
if checksum is None or str(checksum) != checksum_str:
7070
return None
71-
else:
71+
try:
7272
return {
7373
'address_code': address_code,
7474
'yyyymmdd': date(int(match_obj.group('yyyy')), int(match_obj.group('mm')), int(match_obj.group('dd'))),
7575
'sn': sn,
7676
'gender': Gender.FEMALE if int(sn) % 2 == 0 else Gender.MALE,
7777
'checksum': checksum
7878
}
79+
except ValueError:
80+
return None
7981

8082
@staticmethod
8183
def checksum(id_number) -> Optional[Literal[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'X']]:

idnumbers/nationalid/FIN.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,15 @@ def parse(id_number: str) -> Optional[ParseResult]:
8585
century = match_obj.group('century')
8686
sn = match_obj.group('sn')
8787
yyyy_base = PersonalIdentityCode.DOB_BASE_MAP[century]
88-
return {
89-
'yyyymmdd': date(yyyy_base + yy, mm, dd),
90-
'gender': Gender.MALE if int(sn) % 2 == 1 else Gender.FEMALE,
91-
'sn': sn,
92-
'checksum': match_obj.group('check')
93-
}
88+
try:
89+
return {
90+
'yyyymmdd': date(yyyy_base + yy, mm, dd),
91+
'gender': Gender.MALE if int(sn) % 2 == 1 else Gender.FEMALE,
92+
'sn': sn,
93+
'checksum': match_obj.group('check')
94+
}
95+
except ValueError:
96+
return None
9497

9598
@staticmethod
9699
def checksum(id_number: str) -> bool:

idnumbers/nationalid/IDN.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import re
2-
from datetime import datetime
2+
from datetime import date
33
from types import SimpleNamespace
44
from typing import Optional, TypedDict
55
from .util import validate_regexp
@@ -69,8 +69,8 @@ def parse(id_number: str) -> Optional[ParseResult]:
6969

7070
# Validate the date
7171
try:
72-
datetime(int(f'20{yy}'), int(mm), int(dd))
73-
datetime(int(f'19{yy}'), int(mm), int(dd))
72+
date(int(f'20{yy}'), int(mm), int(dd))
73+
date(int(f'19{yy}'), int(mm), int(dd))
7474
except ValueError:
7575
return None
7676

idnumbers/nationalid/ITA.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,10 @@ def extract_birthday(yy_str: str, m: str, dd_str: str) -> Optional[Tuple[date, G
158158
mm = FiscalCode.MONTH_MAP[m]
159159
day = dd if dd < 40 else dd - 40
160160
gender = Gender.MALE if dd < 40 else Gender.FEMALE
161-
return date(year_base + yy, mm, day), gender
161+
try:
162+
return date(year_base + yy, mm, day), gender
163+
except ValueError:
164+
return None
162165

163166
@staticmethod
164167
def sterilize_numbers(source: str) -> Optional[str]:

idnumbers/nationalid/KOR.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,15 @@ def build_parse_result(match_obj: re.Match[str]) -> Optional[ParseResult]:
102102
gender = int(match_obj.group('gender'))
103103
sn = match_obj.group('sn')
104104
yyyy_base = NationalID.DOB_BASE_MAP[gender]
105-
106-
return {
107-
'yyyymmdd': date(yyyy_base + yy, mm, dd),
108-
'gender': Gender.MALE if gender % 2 == 1 else Gender.FEMALE,
109-
'citizenship': NationalID.CITIZENSHIP_MAP[gender],
110-
'sn': sn
111-
}
105+
try:
106+
return {
107+
'yyyymmdd': date(yyyy_base + yy, mm, dd),
108+
'gender': Gender.MALE if gender % 2 == 1 else Gender.FEMALE,
109+
'citizenship': NationalID.CITIZENSHIP_MAP[gender],
110+
'sn': sn
111+
}
112+
except ValueError:
113+
return None
112114

113115

114116
"""

idnumbers/nationalid/LKA.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,16 @@ def parse(id_number: str) -> Optional[ParseResult]:
6666
checksum = NationalID.checksum(id_number)
6767
if not checksum:
6868
return None
69-
else:
69+
try:
7070
yyyymmdd = date(year, 1, 1) + timedelta(days - 501 if days > 500 else days - 1)
7171
return {
7272
'yyyymmdd': yyyymmdd,
7373
'gender': Gender.MALE if days < 500 else Gender.FEMALE,
7474
'sn': sn,
7575
'checksum': int(match_obj.group('checksum'))
7676
}
77+
except ValueError:
78+
return None
7779

7880
@staticmethod
7981
def checksum(id_number) -> bool:

idnumbers/nationalid/MEX.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,14 @@ def parse(id_number: str) -> Optional[ParseResult]:
8282
return None
8383
elif location not in CURP.ALLOW_LOCATIONS:
8484
return None
85-
else:
86-
yy = int(match_obj.group('yy'))
87-
mm = int(match_obj.group('mm'))
88-
dd = int(match_obj.group('dd'))
89-
sn = match_obj.group('sn')
90-
year_base = 1900 if ord(sn) < 65 else 2000
91-
gender = match_obj.group('gender')
85+
86+
yy = int(match_obj.group('yy'))
87+
mm = int(match_obj.group('mm'))
88+
dd = int(match_obj.group('dd'))
89+
sn = match_obj.group('sn')
90+
year_base = 1900 if ord(sn) < 65 else 2000
91+
gender = match_obj.group('gender')
92+
try:
9293
return {
9394
'name_initial_chars': match_obj.group('initial'),
9495
'name_consonants': match_obj.group('consonant'),
@@ -98,6 +99,8 @@ def parse(id_number: str) -> Optional[ParseResult]:
9899
'sn': sn,
99100
'checksum': int(match_obj.group('checksum'))
100101
}
102+
except ValueError:
103+
return None
101104

102105
@staticmethod
103106
def checksum(id_number) -> bool:

idnumbers/nationalid/MYS.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,15 @@ def parse(id_number: str) -> Optional[ParseResult]:
6767
return None
6868
sn = match_obj.group('sn')
6969
yyyy_base = 1900 if int(sn[0]) > 4 else 2000
70-
71-
return {
72-
'yyyymmdd': date(yyyy_base + yy, mm, dd),
73-
'location': location,
74-
'citizenship': Citizenship.CITIZEN if int(location) < 60 else Citizenship.RESIDENT,
75-
'sn': sn
76-
}
70+
try:
71+
return {
72+
'yyyymmdd': date(yyyy_base + yy, mm, dd),
73+
'location': location,
74+
'citizenship': Citizenship.CITIZEN if int(location) < 60 else Citizenship.RESIDENT,
75+
'sn': sn
76+
}
77+
except ValueError:
78+
return None
7779

7880
@staticmethod
7981
def check_location_code(location_code: str) -> bool:

idnumbers/nationalid/POL.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,15 @@ def parse(id_number: str) -> Optional[ParseResult]:
7171
dd = int(match_obj.group('dd'))
7272
year_base, mm = PESEL.get_year_base_month(mm_coded)
7373
sn = match_obj.group('sn')
74-
return {
75-
'yyyymmdd': date(year_base + yy, mm, dd),
76-
'gender': Gender.MALE if int(sn[-1]) % 2 == 1 else Gender.FEMALE,
77-
'sn': sn,
78-
'checksum': checksum
79-
}
74+
try:
75+
return {
76+
'yyyymmdd': date(year_base + yy, mm, dd),
77+
'gender': Gender.MALE if int(sn[-1]) % 2 == 1 else Gender.FEMALE,
78+
'sn': sn,
79+
'checksum': checksum
80+
}
81+
except ValueError:
82+
return None
8083

8184
@staticmethod
8285
def get_year_base_month(month: int) -> YEAR_MONTH_TYPE:

idnumbers/nationalid/ROU.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,17 @@ def parse(id_number: str) -> Optional[ParseResult]:
7676
mm = int(match_obj.group('mm'))
7777
dd = int(match_obj.group('dd'))
7878
sn = match_obj.group('sn')
79-
return {
80-
'yyyymmdd': date(year_base + yy, mm, dd),
81-
'location': location,
82-
'gender': gender,
83-
'citizenship': citizenship,
84-
'sn': sn,
85-
'checksum': int(match_obj.group('checksum'))
86-
}
79+
try:
80+
return {
81+
'yyyymmdd': date(year_base + yy, mm, dd),
82+
'location': location,
83+
'gender': gender,
84+
'citizenship': citizenship,
85+
'sn': sn,
86+
'checksum': int(match_obj.group('checksum'))
87+
}
88+
except ValueError:
89+
return None
8790

8891
@staticmethod
8992
def get_gender_citizenship_year_base(gender_century: int, yy: int) -> Optional[Tuple[Gender, Citizenship, int]]:

idnumbers/nationalid/SVK.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,14 @@ def parse(id_number: str) -> Optional[BirthNumberParseResult]:
6464
mm = mm_code if mm_code < 50 else mm_code - 50
6565
year_base = 2000 if yy < 50 else 1900
6666
sn = match_obj.group('sn')
67-
return {
68-
'yyyymmdd': date(year_base + yy, mm, dd),
69-
'gender': Gender.MALE if mm_code < 50 else Gender.FEMALE,
70-
'sn': sn
71-
}
67+
try:
68+
return {
69+
'yyyymmdd': date(year_base + yy, mm, dd),
70+
'gender': Gender.MALE if mm_code < 50 else Gender.FEMALE,
71+
'sn': sn
72+
}
73+
except ValueError:
74+
return None
7275

7376
@staticmethod
7477
def checksum(id_number: str) -> bool:

idnumbers/nationalid/SWE.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import datetime
21
import re
2+
from datetime import date
33
from types import SimpleNamespace
44
from .util import validate_regexp, luhn_digit
55
from typing import Optional, TypedDict
@@ -15,7 +15,7 @@ class ParseResult(TypedDict):
1515
"""parse result of PersonalIdentityNumber"""
1616
gender: Gender
1717
"""gender, possible value: male, female"""
18-
yyyymmdd: datetime.date
18+
yyyymmdd: date
1919
"""dob"""
2020
checksum: str
2121
"""checksum digit"""
@@ -57,21 +57,24 @@ def parse(id_number: str) -> Optional[ParseResult]:
5757
match_obj = PersonalIdentityNumber.METADATA.regexp.match(id_number)
5858
if not match_obj:
5959
return None
60+
checksum = match_obj.group('checksum')
61+
if PersonalIdentityNumber.checksum(id_number) != int(checksum):
62+
return None
6063
yy = match_obj.group('yy')
6164
mm = match_obj.group('mm')
6265
dd = match_obj.group('dd')
6366
birth_number = match_obj.group('birth_number')
6467
sep = match_obj.group('sep')
65-
base_year = datetime.datetime.now().year if sep == '-' else datetime.datetime.now().year - 100
68+
base_year = date.today().year if sep == '-' else date.today().year - 100
6669
yyyy = int((base_year - ((base_year - int(yy)) % 100)) / 100) * 100 + int(yy)
67-
checksum = match_obj.group('checksum')
68-
if PersonalIdentityNumber.checksum(id_number) != int(checksum):
70+
try:
71+
return {
72+
"gender": Gender.FEMALE if int(birth_number) % 2 == 0 else Gender.MALE,
73+
"yyyymmdd": date(yyyy, int(mm), int(dd)),
74+
'checksum': match_obj.group('checksum')
75+
}
76+
except ValueError:
6977
return None
70-
return {
71-
"gender": Gender.FEMALE if int(birth_number) % 2 == 0 else Gender.MALE,
72-
"yyyymmdd": datetime.date(yyyy, int(mm), int(dd)),
73-
'checksum': match_obj.group('checksum')
74-
}
7578

7679
@staticmethod
7780
def checksum(id_number: str) -> Optional[int]:

idnumbers/nationalid/ZAF.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,19 @@ def parse(id_number: str) -> Optional[ParseResult]:
6060
return None
6161
elif check_digit != int(id_number[-1:]):
6262
return None
63-
else:
64-
year = int(match_obj.group('yy'))
65-
year += 2000 if year < 50 else 1900
63+
64+
year = int(match_obj.group('yy'))
65+
year += 2000 if year < 50 else 1900
66+
try:
6667
return {
6768
'yyyymmdd': date(year, int(match_obj.group('mm')), int(match_obj.group('dd'))),
6869
'sn': match_obj.group('sn'),
6970
'gender': Gender.MALE if int(match_obj.group('sn')[0]) > 4 else Gender.FEMALE,
7071
'citizenship': Citizenship.CITIZEN if match_obj.group('citizenship') == '0' else Citizenship.RESIDENT,
7172
'checksum': check_digit
7273
}
74+
except ValueError:
75+
return None
7376

7477
@staticmethod
7578
def checksum(id_number: str) -> CHECK_DIGIT:

idnumbers/nationalid/yugoslavia.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,17 @@ def parse(id_number: str) -> Optional[ParseResult]:
7575
dd = int(match_obj.group('dd'))
7676
year_base = 2000 if yyy < 800 else 1000
7777
sn = match_obj.group('sn')
78-
return {
79-
'yyyymmdd': date(year_base + yyy, mm, dd),
80-
'location': location,
81-
'citizenship': citizenship,
82-
'gender': Gender.MALE if int(sn) < 500 else Gender.FEMALE,
83-
'sn': sn,
84-
'checksum': int(match_obj.group('checksum'))
85-
}
78+
try:
79+
return {
80+
'yyyymmdd': date(year_base + yyy, mm, dd),
81+
'location': location,
82+
'citizenship': citizenship,
83+
'gender': Gender.MALE if int(sn) < 500 else Gender.FEMALE,
84+
'sn': sn,
85+
'checksum': int(match_obj.group('checksum'))
86+
}
87+
except ValueError:
88+
return None
8689

8790
@staticmethod
8891
def checksum(id_number) -> bool:

0 commit comments

Comments
 (0)