Skip to content

Commit 62988ac

Browse files
committed
v2.2.5 Ensure 4-digit years
1 parent 3c2d3ed commit 62988ac

File tree

3 files changed

+33
-21
lines changed

3 files changed

+33
-21
lines changed

datapackage_pipelines/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
2.2.4
1+
2.2.5
22

datapackage_pipelines/lib/dump/file_formats.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import isodate
55
import logging
66

7-
from datapackage_pipelines.utilities.extended_json import DATETIME_FORMAT, DATE_FORMAT, TIME_FORMAT
7+
from datapackage_pipelines.utilities.extended_json import (
8+
DATETIME_F_FORMAT, DATE_F_FORMAT, TIME_F_FORMAT,
9+
DATETIME_P_FORMAT, DATE_P_FORMAT, TIME_P_FORMAT,
10+
)
811
from datapackage_pipelines.utilities.resources import get_path
912

1013

@@ -47,9 +50,9 @@ class CSVFormat(FileFormat):
4750
SERIALIZERS = {
4851
'array': json_dumps,
4952
'object': json_dumps,
50-
'datetime': lambda d: d.strftime(DATETIME_FORMAT),
51-
'date': lambda d: d.strftime(DATE_FORMAT),
52-
'time': lambda d: d.strftime(TIME_FORMAT),
53+
'datetime': lambda d: d.strftime(DATETIME_F_FORMAT),
54+
'date': lambda d: d.strftime(DATE_F_FORMAT),
55+
'time': lambda d: d.strftime(TIME_F_FORMAT),
5356
'duration': lambda d: isodate.duration_isoformat(d),
5457
'geopoint': lambda d: '{}, {}'.format(*d),
5558
'geojson': json.dumps,
@@ -65,13 +68,13 @@ class CSVFormat(FileFormat):
6568
'groupChar': ''
6669
},
6770
'date': {
68-
'format': DATE_FORMAT
71+
'format': DATE_P_FORMAT
6972
},
7073
'time': {
71-
'format': TIME_FORMAT
74+
'format': TIME_P_FORMAT
7275
},
7376
'datetime': {
74-
'format': DATETIME_FORMAT
77+
'format': DATETIME_P_FORMAT
7578
},
7679
}
7780

@@ -104,9 +107,9 @@ def finalize_file(self, writer):
104107
class JSONFormat(FileFormat):
105108

106109
SERIALIZERS = {
107-
'datetime': lambda d: d.strftime(DATETIME_FORMAT),
108-
'date': lambda d: d.strftime(DATE_FORMAT),
109-
'time': lambda d: d.strftime(TIME_FORMAT),
110+
'datetime': lambda d: d.strftime(DATETIME_F_FORMAT),
111+
'date': lambda d: d.strftime(DATE_F_FORMAT),
112+
'time': lambda d: d.strftime(TIME_F_FORMAT),
110113
'number': float,
111114
'duration': lambda d: isodate.duration_isoformat(d),
112115
'geopoint': lambda d: list(map(float, d)),
@@ -117,13 +120,13 @@ class JSONFormat(FileFormat):
117120

118121
PYTHON_DIALECT = {
119122
'date': {
120-
'format': DATE_FORMAT
123+
'format': DATE_P_FORMAT
121124
},
122125
'time': {
123-
'format': TIME_FORMAT
126+
'format': TIME_P_FORMAT
124127
},
125128
'datetime': {
126-
'format': DATETIME_FORMAT
129+
'format': DATETIME_P_FORMAT
127130
},
128131
}
129132

datapackage_pipelines/utilities/extended_json.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,20 @@
66

77
from .lazy_dict import LazyDict
88

9-
10-
DATE_FORMAT = '%Y-%m-%d'
11-
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
9+
if datetime.date(1, 1, 1).strftime('%04Y') == '4Y':
10+
DATE_F_FORMAT = '%Y-%m-%d'
11+
DATETIME_F_FORMAT = '%Y-%m-%d %H:%M:%S'
12+
else:
13+
DATE_F_FORMAT = '%04Y-%m-%d'
14+
DATETIME_F_FORMAT = '%04Y-%m-%d %H:%M:%S'
15+
DATE_FORMAT = DATE_F_FORMAT
16+
DATETIME_FORMAT = DATETIME_F_FORMAT
1217
TIME_FORMAT = '%H:%M:%S'
1318

19+
DATE_P_FORMAT = '%Y-%m-%d'
20+
DATETIME_P_FORMAT = '%Y-%m-%d %H:%M:%S'
21+
TIME_P_FORMAT = TIME_F_FORMAT = TIME_FORMAT
22+
1423

1524
class LazyJsonLine(LazyDict):
1625

@@ -57,13 +66,13 @@ def object_hook(cls, obj):
5766
if 'type{datetime}' in obj:
5867
try:
5968
return datetime.datetime \
60-
.strptime(obj["type{datetime}"], DATETIME_FORMAT)
69+
.strptime(obj["type{datetime}"], DATETIME_P_FORMAT)
6170
except ValueError:
6271
pass
6372
if 'type{date}' in obj:
6473
try:
6574
return datetime.datetime \
66-
.strptime(obj["type{date}"], DATE_FORMAT) \
75+
.strptime(obj["type{date}"], DATE_P_FORMAT) \
6776
.date()
6877
except ValueError:
6978
pass
@@ -98,9 +107,9 @@ def default(self, obj):
98107
elif isinstance(obj, datetime.time):
99108
return {'type{time}': obj.strftime(TIME_FORMAT)}
100109
elif isinstance(obj, datetime.datetime):
101-
return {'type{datetime}': obj.strftime(DATETIME_FORMAT)}
110+
return {'type{datetime}': obj.strftime(DATETIME_F_FORMAT)}
102111
elif isinstance(obj, datetime.date):
103-
return {'type{date}': obj.strftime(DATE_FORMAT)}
112+
return {'type{date}': obj.strftime(DATE_F_FORMAT)}
104113
elif isinstance(obj, (isodate.Duration, datetime.timedelta)):
105114
return {'type{duration}': isodate.duration_isoformat(obj)}
106115
elif isinstance(obj, set):

0 commit comments

Comments
 (0)