From 6c7f00741b4ae5b1d4ee181d53f05ae76bd6d0dd Mon Sep 17 00:00:00 2001 From: Cycloctane Date: Mon, 23 Sep 2024 09:18:04 +0000 Subject: [PATCH 1/2] fix zero dates converting issue - change return type of converters functions from datetime/timedelta/date to `object` to accept str type. invalid datetime will be accepted and returned as str. - update docstring. --- asyncmy/converters.pyx | 44 +++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/asyncmy/converters.pyx b/asyncmy/converters.pyx index 22d5665..66ad3f8 100644 --- a/asyncmy/converters.pyx +++ b/asyncmy/converters.pyx @@ -131,7 +131,7 @@ DATETIME_RE = re.compile( r"(\d{1,4})-(\d{1,2})-(\d{1,2})[T ](\d{1,2}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?" ) -cpdef datetime.datetime convert_datetime(str obj): +cpdef object convert_datetime(str obj): """Returns a DATETIME or TIMESTAMP column value as a datetime object: >>> convert_datetime('2007-02-25 23:06:20') @@ -139,12 +139,12 @@ cpdef datetime.datetime convert_datetime(str obj): >>> convert_datetime('2007-02-25T23:06:20') datetime.datetime(2007, 2, 25, 23, 6, 20) - Illegal values are returned as None: + Illegal values are returned as str: - >>> convert_datetime('2007-02-31T23:06:20') is None - True - >>> convert_datetime('0000-00-00 00:00:00') is None - True + >>> convert_datetime('2007-02-31T23:06:20') + '2007-02-31T23:06:20' + >>> convert_datetime('0000-00-00 00:00:00') + '0000-00-00 00:00:00' """ if isinstance(obj, (bytes, bytearray)): @@ -163,7 +163,7 @@ cpdef datetime.datetime convert_datetime(str obj): TIMEDELTA_RE = re.compile(r"(-)?(\d{1,3}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?") -cpdef datetime.timedelta convert_timedelta(str obj): +cpdef object convert_timedelta(str obj): """Returns a TIME column as a timedelta object: >>> convert_timedelta('25:06:17') @@ -171,10 +171,10 @@ cpdef datetime.timedelta convert_timedelta(str obj): >>> convert_timedelta('-25:06:17') datetime.timedelta(-2, 83177) - Illegal values are returned as None: + Illegal values are returned as str: - >>> convert_timedelta('random crap') is None - True + >>> convert_timedelta('random crap') + 'random crap' Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but can accept values as (+|-)DD HH:MM:SS. The latter format will not @@ -208,18 +208,18 @@ cpdef datetime.timedelta convert_timedelta(str obj): TIME_RE = re.compile(r"(\d{1,2}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?") -cpdef datetime.time convert_time(str obj): +cpdef object convert_time(str obj): """Returns a TIME column as a time object: >>> convert_time('15:06:17') datetime.time(15, 6, 17) - Illegal values are returned as None: + Illegal values are returned as str: - >>> convert_time('-25:06:17') is None - True - >>> convert_time('random crap') is None - True + >>> convert_time('-25:06:17') + '-25:06:17' + >>> convert_time('random crap') + 'random crap' Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but can accept values as (+|-)DD HH:MM:SS. The latter format will not @@ -250,18 +250,18 @@ cpdef datetime.time convert_time(str obj): except ValueError: return obj -cpdef datetime.date convert_date(obj): +cpdef object convert_date(obj): """Returns a DATE column as a date object: >>> convert_date('2007-02-26') datetime.date(2007, 2, 26) - Illegal values are returned as None: + Illegal values are returned as str: - >>> convert_date('2007-02-31') is None - True - >>> convert_date('0000-00-00') is None - True + >>> convert_date('2007-02-31') + '2007-02-31' + >>> convert_date('0000-00-00') + '0000-00-00' """ if isinstance(obj, (bytes, bytearray)): From a00eab0ca22bed05f60b5559431b42700f01b1d3 Mon Sep 17 00:00:00 2001 From: Cycloctane Date: Mon, 23 Sep 2024 10:05:39 +0000 Subject: [PATCH 2/2] add test to verify if convert_datetime() accepts zero dates. --- tests/test_converters.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/test_converters.py b/tests/test_converters.py index debb262..1927457 100644 --- a/tests/test_converters.py +++ b/tests/test_converters.py @@ -1,6 +1,6 @@ import datetime -from asyncmy.converters import escape_item, escape_str +from asyncmy.converters import convert_datetime, escape_item, escape_str class CustomDate(datetime.date): @@ -20,3 +20,11 @@ def test_escape_str(): # so it should accept values that are not strings as well. assert escape_str(datetime.date(2023, 6, 2)) == "'2023-06-02'" assert escape_str(CustomDate(2023, 6, 2)) == "'2023-06-02'" + + +def test_convert_datetime(): + assert convert_datetime("2023-06-02T23:06:20") == datetime.datetime(2023, 6, 2, 23, 6, 20) + assert convert_datetime("2023-06-02 23:06:20") == datetime.datetime(2023, 6, 2, 23, 6, 20) + + # invalid datetime should be returned as str + assert convert_datetime("0000-00-00 00:00:00") == "0000-00-00 00:00:00"