Skip to content

Commit f16628f

Browse files
authored
Merge pull request #104 from Cycloctane/dev2
Fix zero dates issue
2 parents 2497b7b + a00eab0 commit f16628f

File tree

2 files changed

+31
-23
lines changed

2 files changed

+31
-23
lines changed

asyncmy/converters.pyx

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -131,20 +131,20 @@ DATETIME_RE = re.compile(
131131
r"(\d{1,4})-(\d{1,2})-(\d{1,2})[T ](\d{1,2}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?"
132132
)
133133

134-
cpdef datetime.datetime convert_datetime(str obj):
134+
cpdef object convert_datetime(str obj):
135135
"""Returns a DATETIME or TIMESTAMP column value as a datetime object:
136136
137137
>>> convert_datetime('2007-02-25 23:06:20')
138138
datetime.datetime(2007, 2, 25, 23, 6, 20)
139139
>>> convert_datetime('2007-02-25T23:06:20')
140140
datetime.datetime(2007, 2, 25, 23, 6, 20)
141141
142-
Illegal values are returned as None:
142+
Illegal values are returned as str:
143143
144-
>>> convert_datetime('2007-02-31T23:06:20') is None
145-
True
146-
>>> convert_datetime('0000-00-00 00:00:00') is None
147-
True
144+
>>> convert_datetime('2007-02-31T23:06:20')
145+
'2007-02-31T23:06:20'
146+
>>> convert_datetime('0000-00-00 00:00:00')
147+
'0000-00-00 00:00:00'
148148
149149
"""
150150
if isinstance(obj, (bytes, bytearray)):
@@ -163,18 +163,18 @@ cpdef datetime.datetime convert_datetime(str obj):
163163

164164
TIMEDELTA_RE = re.compile(r"(-)?(\d{1,3}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?")
165165

166-
cpdef datetime.timedelta convert_timedelta(str obj):
166+
cpdef object convert_timedelta(str obj):
167167
"""Returns a TIME column as a timedelta object:
168168
169169
>>> convert_timedelta('25:06:17')
170170
datetime.timedelta(1, 3977)
171171
>>> convert_timedelta('-25:06:17')
172172
datetime.timedelta(-2, 83177)
173173
174-
Illegal values are returned as None:
174+
Illegal values are returned as str:
175175
176-
>>> convert_timedelta('random crap') is None
177-
True
176+
>>> convert_timedelta('random crap')
177+
'random crap'
178178
179179
Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but
180180
can accept values as (+|-)DD HH:MM:SS. The latter format will not
@@ -208,18 +208,18 @@ cpdef datetime.timedelta convert_timedelta(str obj):
208208

209209
TIME_RE = re.compile(r"(\d{1,2}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?")
210210

211-
cpdef datetime.time convert_time(str obj):
211+
cpdef object convert_time(str obj):
212212
"""Returns a TIME column as a time object:
213213
214214
>>> convert_time('15:06:17')
215215
datetime.time(15, 6, 17)
216216
217-
Illegal values are returned as None:
217+
Illegal values are returned as str:
218218
219-
>>> convert_time('-25:06:17') is None
220-
True
221-
>>> convert_time('random crap') is None
222-
True
219+
>>> convert_time('-25:06:17')
220+
'-25:06:17'
221+
>>> convert_time('random crap')
222+
'random crap'
223223
224224
Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but
225225
can accept values as (+|-)DD HH:MM:SS. The latter format will not
@@ -250,18 +250,18 @@ cpdef datetime.time convert_time(str obj):
250250
except ValueError:
251251
return obj
252252

253-
cpdef datetime.date convert_date(obj):
253+
cpdef object convert_date(obj):
254254
"""Returns a DATE column as a date object:
255255
256256
>>> convert_date('2007-02-26')
257257
datetime.date(2007, 2, 26)
258258
259-
Illegal values are returned as None:
259+
Illegal values are returned as str:
260260
261-
>>> convert_date('2007-02-31') is None
262-
True
263-
>>> convert_date('0000-00-00') is None
264-
True
261+
>>> convert_date('2007-02-31')
262+
'2007-02-31'
263+
>>> convert_date('0000-00-00')
264+
'0000-00-00'
265265
266266
"""
267267
if isinstance(obj, (bytes, bytearray)):

tests/test_converters.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import datetime
22

3-
from asyncmy.converters import escape_item, escape_str
3+
from asyncmy.converters import convert_datetime, escape_item, escape_str
44

55

66
class CustomDate(datetime.date):
@@ -20,3 +20,11 @@ def test_escape_str():
2020
# so it should accept values that are not strings as well.
2121
assert escape_str(datetime.date(2023, 6, 2)) == "'2023-06-02'"
2222
assert escape_str(CustomDate(2023, 6, 2)) == "'2023-06-02'"
23+
24+
25+
def test_convert_datetime():
26+
assert convert_datetime("2023-06-02T23:06:20") == datetime.datetime(2023, 6, 2, 23, 6, 20)
27+
assert convert_datetime("2023-06-02 23:06:20") == datetime.datetime(2023, 6, 2, 23, 6, 20)
28+
29+
# invalid datetime should be returned as str
30+
assert convert_datetime("0000-00-00 00:00:00") == "0000-00-00 00:00:00"

0 commit comments

Comments
 (0)