Fixed parsing corner case
This commit is contained in:
parent
4c94cffe1b
commit
0f3ccb7b7d
|
@ -27,7 +27,6 @@ import personal_data.fetchers.crunchyroll
|
||||||
import personal_data.fetchers.ffxiv_lodestone
|
import personal_data.fetchers.ffxiv_lodestone
|
||||||
import personal_data.fetchers.partisia_blockchain
|
import personal_data.fetchers.partisia_blockchain
|
||||||
import personal_data.fetchers.psnprofiles
|
import personal_data.fetchers.psnprofiles
|
||||||
from personal_data import mailgun
|
|
||||||
|
|
||||||
from . import mailgun
|
from . import mailgun
|
||||||
|
|
||||||
|
@ -41,7 +40,7 @@ logger.setLevel('INFO')
|
||||||
def try_value(fn, s: str) -> object:
|
def try_value(fn, s: str) -> object:
|
||||||
try:
|
try:
|
||||||
return fn(s)
|
return fn(s)
|
||||||
except ValueError:
|
except ValueError as e:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
@ -49,7 +48,9 @@ def to_value(s: str) -> object:
|
||||||
s = s.strip()
|
s = s.strip()
|
||||||
if len(s) == 0:
|
if len(s) == 0:
|
||||||
return None
|
return None
|
||||||
if v := try_value(int, s):
|
if (v := try_value(int, s)) is not None:
|
||||||
|
return v
|
||||||
|
if (v := try_value(float, s)) is not None:
|
||||||
return v
|
return v
|
||||||
if v := try_value(datetime.date.fromisoformat, s):
|
if v := try_value(datetime.date.fromisoformat, s):
|
||||||
return v
|
return v
|
||||||
|
@ -76,10 +77,13 @@ def extend_csv_file(
|
||||||
reader = csv.DictReader(csvfile, dialect=CSV_DIALECT)
|
reader = csv.DictReader(csvfile, dialect=CSV_DIALECT)
|
||||||
for row in reader:
|
for row in reader:
|
||||||
for k in list(row.keys()):
|
for k in list(row.keys()):
|
||||||
row[k] = to_value(row[k])
|
orig = row[k]
|
||||||
|
row[k] = to_value(orig)
|
||||||
if row[k] is None:
|
if row[k] is None:
|
||||||
del row[k]
|
del row[k]
|
||||||
|
del k, orig
|
||||||
dicts.append(frozendict(row))
|
dicts.append(frozendict(row))
|
||||||
|
del row
|
||||||
del csvfile
|
del csvfile
|
||||||
except FileNotFoundError as e:
|
except FileNotFoundError as e:
|
||||||
logger.info('Creating file: %s', filename)
|
logger.info('Creating file: %s', filename)
|
||||||
|
|
34
test/test_parsing.py
Normal file
34
test/test_parsing.py
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from personal_data.main import to_value
|
||||||
|
|
||||||
|
PARSE_MAPPINGS = [
|
||||||
|
(
|
||||||
|
'2024-04-28 21:35:40+00:00',
|
||||||
|
datetime.datetime(2024, 4, 28, 21, 35, 40, tzinfo=datetime.timezone.utc),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'0003791e9f5f3691b8bbbe0d12a7ae9c3f2e89db38',
|
||||||
|
'0003791e9f5f3691b8bbbe0d12a7ae9c3f2e89db38',
|
||||||
|
),
|
||||||
|
('', None),
|
||||||
|
('0', 0),
|
||||||
|
('200', 200),
|
||||||
|
('52.5474', 52.5474),
|
||||||
|
('true', True),
|
||||||
|
('True', True),
|
||||||
|
('TRUE', True),
|
||||||
|
('false', False),
|
||||||
|
('False', False),
|
||||||
|
('FALSE', False),
|
||||||
|
('none', None),
|
||||||
|
('None', None),
|
||||||
|
('NONE', None),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('text,parsed', PARSE_MAPPINGS)
|
||||||
|
def test_to_value(text, parsed):
|
||||||
|
assert to_value(text) == parsed, text
|
Loading…
Reference in New Issue
Block a user