From 14af4a7a90f9b05fb7ee9517eda320fe1b1a7808 Mon Sep 17 00:00:00 2001 From: Tomasz Prus Date: Sun, 1 Sep 2019 00:35:00 +0200 Subject: [PATCH] fix: parse microseconds in data-time fields --- kubernetes_asyncio/config/dateutil.py | 9 +++++-- kubernetes_asyncio/config/dateutil_test.py | 31 ++++++++++++++++------ 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/kubernetes_asyncio/config/dateutil.py b/kubernetes_asyncio/config/dateutil.py index ed88cba8b..75fce2a37 100644 --- a/kubernetes_asyncio/config/dateutil.py +++ b/kubernetes_asyncio/config/dateutil.py @@ -45,6 +45,9 @@ def dst(self, dt): _re_timezone = re.compile(r"([-+])(\d\d?):?(\d\d)?") +MICROSEC_PER_SEC = 1000000 + + def parse_rfc3339(s): if isinstance(s, datetime.datetime): # no need to parse it, just make sure it has a timezone. @@ -55,8 +58,10 @@ def parse_rfc3339(s): dt = [0] * 7 for x in range(6): dt[x] = int(groups[x]) + us = 0 if groups[6] is not None: - dt[6] = int(groups[6]) + partial_sec = float(groups[6].replace(",", ".")) + us = int(MICROSEC_PER_SEC * partial_sec) tz = UTC if groups[7] is not None and groups[7] != 'Z' and groups[7] != 'z': tz_groups = _re_timezone.search(groups[7]).groups() @@ -70,7 +75,7 @@ def parse_rfc3339(s): return datetime.datetime( year=dt[0], month=dt[1], day=dt[2], hour=dt[3], minute=dt[4], second=dt[5], - microsecond=dt[6], tzinfo=tz) + microsecond=us, tzinfo=tz) def format_rfc3339(date_time): diff --git a/kubernetes_asyncio/config/dateutil_test.py b/kubernetes_asyncio/config/dateutil_test.py index deb0ea880..933360d9f 100644 --- a/kubernetes_asyncio/config/dateutil_test.py +++ b/kubernetes_asyncio/config/dateutil_test.py @@ -20,24 +20,39 @@ class DateUtilTest(unittest.TestCase): - def _parse_rfc3339_test(self, st, y, m, d, h, mn, s): + def _parse_rfc3339_test(self, st, y, m, d, h, mn, s, us): actual = parse_rfc3339(st) - expected = datetime(y, m, d, h, mn, s, 0, UTC) + expected = datetime(y, m, d, h, mn, s, us, UTC) self.assertEqual(expected, actual) def test_parse_rfc3339(self): self._parse_rfc3339_test("2017-07-25T04:44:21Z", - 2017, 7, 25, 4, 44, 21) + 2017, 7, 25, 4, 44, 21, 0) self._parse_rfc3339_test("2017-07-25 04:44:21Z", - 2017, 7, 25, 4, 44, 21) + 2017, 7, 25, 4, 44, 21, 0) self._parse_rfc3339_test("2017-07-25T04:44:21", - 2017, 7, 25, 4, 44, 21) + 2017, 7, 25, 4, 44, 21, 0) self._parse_rfc3339_test("2017-07-25T04:44:21z", - 2017, 7, 25, 4, 44, 21) + 2017, 7, 25, 4, 44, 21, 0) self._parse_rfc3339_test("2017-07-25T04:44:21+03:00", - 2017, 7, 25, 1, 44, 21) + 2017, 7, 25, 1, 44, 21, 0) self._parse_rfc3339_test("2017-07-25T04:44:21-03:00", - 2017, 7, 25, 7, 44, 21) + 2017, 7, 25, 7, 44, 21, 0) + + self._parse_rfc3339_test("2017-07-25T04:44:21,005Z", + 2017, 7, 25, 4, 44, 21, 5000) + self._parse_rfc3339_test("2017-07-25T04:44:21.005Z", + 2017, 7, 25, 4, 44, 21, 5000) + self._parse_rfc3339_test("2017-07-25 04:44:21.0050Z", + 2017, 7, 25, 4, 44, 21, 5000) + self._parse_rfc3339_test("2017-07-25T04:44:21.5", + 2017, 7, 25, 4, 44, 21, 500000) + self._parse_rfc3339_test("2017-07-25T04:44:21.005z", + 2017, 7, 25, 4, 44, 21, 5000) + self._parse_rfc3339_test("2017-07-25T04:44:21.005+03:00", + 2017, 7, 25, 1, 44, 21, 5000) + self._parse_rfc3339_test("2017-07-25T04:44:21.005-03:00", + 2017, 7, 25, 7, 44, 21, 5000) def test_format_rfc3339(self): self.assertEqual(