From 0d8375a0f970a3ad271939d1b8fe46e8c711dbb0 Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Sun, 29 Jan 2023 17:01:11 +0800 Subject: [PATCH] fix: parse datetime followed by a space --- CHANGELOG.md | 1 + tests/test_items.py | 11 +++++++++++ tomlkit/parser.py | 9 +++++---- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59b335e..1d6ac55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Parse empty table name if it is quoted. ([#258](https://github.com/sdispater/tomlkit/issues/258)) - Fix a bug that remove last element of an Inline Table leaves a comma. ([#259](https://github.com/sdispater/tomlkit/issues/259)) +- Parse datetime when it is followed by a space. ([#260](https://github.com/sdispater/tomlkit/issues/260)) - Fix the `unwrap()` method for `Container` children values which sometimes returns an internal object if the table is an out-of-order table. ([#264](https://github.com/sdispater/tomlkit/issues/264)) ## [0.11.6] - 2022-10-27 diff --git a/tests/test_items.py b/tests/test_items.py index dfb632e..6ac06d8 100644 --- a/tests/test_items.py +++ b/tests/test_items.py @@ -677,6 +677,17 @@ def test_dates_behave_like_dates(): assert doc.as_string() == "dt = 2018-07-23 # Comment" +def test_parse_datetime_followed_by_space(): + # issue #260 + doc = parse("dt = 2018-07-22 ") + assert doc["dt"] == date(2018, 7, 22) + assert doc.as_string() == "dt = 2018-07-22 " + + doc = parse("dt = 2013-01-24 13:48:01.123456 ") + assert doc["dt"] == datetime(2013, 1, 24, 13, 48, 1, 123456) + assert doc.as_string() == "dt = 2013-01-24 13:48:01.123456 " + + def test_times_behave_like_times(): i = item(time(12, 34, 56)) diff --git a/tomlkit/parser.py b/tomlkit/parser.py index 478834c..097aceb 100644 --- a/tomlkit/parser.py +++ b/tomlkit/parser.py @@ -497,11 +497,12 @@ def _parse_value(self) -> Item: pass time_raw = self.extract() - if not time_raw.strip(): - trivia.comment_ws = time_raw + time_part = time_raw.rstrip() + trivia.comment_ws = time_raw[len(time_part) :] + if not time_part: return date - dt = parse_rfc3339(raw + time_raw) + dt = parse_rfc3339(raw + time_part) assert isinstance(dt, datetime.datetime) return DateTime( dt.year, @@ -513,7 +514,7 @@ def _parse_value(self) -> Item: dt.microsecond, dt.tzinfo, trivia, - raw + time_raw, + raw + time_part, ) except ValueError: raise self.parse_error(InvalidDateError)