From 665666d6f4213da8db57ebb480947b7caf1fe382 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 17 Dec 2023 15:36:26 +0100 Subject: Merging upstream version 3.0.0. Signed-off-by: Daniel Baumann --- tests/parsing/test_parse_iso8601.py | 485 +++++++++--------------------------- 1 file changed, 115 insertions(+), 370 deletions(-) (limited to 'tests/parsing/test_parse_iso8601.py') diff --git a/tests/parsing/test_parse_iso8601.py b/tests/parsing/test_parse_iso8601.py index 0047791..c15b9bd 100644 --- a/tests/parsing/test_parse_iso8601.py +++ b/tests/parsing/test_parse_iso8601.py @@ -8,83 +8,86 @@ import pytest from pendulum.parsing import parse_iso8601 + try: - from pendulum.parsing._extension import TZFixedOffset as FixedTimezone + from pendulum._pendulum import FixedTimezone except ImportError: from pendulum.tz.timezone import FixedTimezone -def test_parse_iso8601(): - # Date - assert date(2016, 1, 1) == parse_iso8601("2016") - assert date(2016, 10, 1) == parse_iso8601("2016-10") - assert date(2016, 10, 6) == parse_iso8601("2016-10-06") - assert date(2016, 10, 6) == parse_iso8601("20161006") - - # Time - assert time(20, 16, 10, 0) == parse_iso8601("201610") - - # Datetime - assert datetime(2016, 10, 6, 12, 34, 56, 123456) == parse_iso8601( - "2016-10-06T12:34:56.123456" - ) - assert datetime(2016, 10, 6, 12, 34, 56, 123000) == parse_iso8601( - "2016-10-06T12:34:56.123" - ) - assert datetime(2016, 10, 6, 12, 34, 56, 123) == parse_iso8601( - "2016-10-06T12:34:56.000123" - ) - assert datetime(2016, 10, 6, 12, 0, 0, 0) == parse_iso8601("2016-10-06T12") - assert datetime(2016, 10, 6, 12, 34, 56, 0) == parse_iso8601("2016-10-06T123456") - assert datetime(2016, 10, 6, 12, 34, 56, 123456) == parse_iso8601( - "2016-10-06T123456.123456" - ) - assert datetime(2016, 10, 6, 12, 34, 56, 123456) == parse_iso8601( - "20161006T123456.123456" - ) - assert datetime(2016, 10, 6, 12, 34, 56, 123456) == parse_iso8601( - "20161006 123456.123456" - ) - - # Datetime with offset - assert datetime( - 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(19800) - ) == parse_iso8601("2016-10-06T12:34:56.123456+05:30") - assert datetime( - 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(19800) - ) == parse_iso8601("2016-10-06T12:34:56.123456+0530") - assert datetime( - 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-19800) - ) == parse_iso8601("2016-10-06T12:34:56.123456-05:30") - assert datetime( - 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-19800) - ) == parse_iso8601("2016-10-06T12:34:56.123456-0530") - assert datetime( - 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(18000) - ) == parse_iso8601("2016-10-06T12:34:56.123456+05") - assert datetime( - 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-18000) - ) == parse_iso8601("2016-10-06T12:34:56.123456-05") - assert datetime( - 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-18000) - ) == parse_iso8601("20161006T123456,123456-05") - assert datetime( - 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(+19800) - ) == parse_iso8601("2016-10-06T12:34:56.123456789+05:30") - - # Ordinal date - assert date(2012, 1, 7) == parse_iso8601("2012-007") - assert date(2012, 1, 7) == parse_iso8601("2012007") - assert date(2017, 3, 20) == parse_iso8601("2017-079") - - # Week date - assert date(2012, 1, 30) == parse_iso8601("2012-W05") - assert date(2008, 9, 27) == parse_iso8601("2008-W39-6") - assert date(2010, 1, 3) == parse_iso8601("2009-W53-7") - assert date(2008, 12, 29) == parse_iso8601("2009-W01-1") - - # Week date wth time - assert datetime(2008, 9, 27, 9, 0, 0, 0) == parse_iso8601("2008-W39-6T09") +@pytest.mark.parametrize( + ["text", "expected"], + [ + ("2016-10", date(2016, 10, 1)), + ("2016-10-06", date(2016, 10, 6)), + # Ordinal date + ("2012-007", date(2012, 1, 7)), + ("2012007", date(2012, 1, 7)), + ("2017-079", date(2017, 3, 20)), + # Week date + ("2012-W05", date(2012, 1, 30)), + ("2008-W39-6", date(2008, 9, 27)), + ("2009-W53-7", date(2010, 1, 3)), + ("2009-W01-1", date(2008, 12, 29)), + # Time + ("12:34", time(12, 34, 0)), + ("12:34:56", time(12, 34, 56)), + ("12:34:56.123", time(12, 34, 56, 123000)), + ("12:34:56.123456", time(12, 34, 56, 123456)), + ("12:34+05:30", time(12, 34, 0, tzinfo=FixedTimezone(19800))), + ("12:34:56+05:30", time(12, 34, 56, tzinfo=FixedTimezone(19800))), + ("12:34:56.123+05:30", time(12, 34, 56, 123000, tzinfo=FixedTimezone(19800))), + ( + "12:34:56.123456+05:30", + time(12, 34, 56, 123456, tzinfo=FixedTimezone(19800)), + ), + # Datetime + ("2016-10-06T12:34:56.123456", datetime(2016, 10, 6, 12, 34, 56, 123456)), + ("2016-10-06T12:34:56.123", datetime(2016, 10, 6, 12, 34, 56, 123000)), + ("2016-10-06T12:34:56.000123", datetime(2016, 10, 6, 12, 34, 56, 123)), + ("20161006T12", datetime(2016, 10, 6, 12, 0, 0, 0)), + ("20161006T123456", datetime(2016, 10, 6, 12, 34, 56, 0)), + ("20161006T123456.123456", datetime(2016, 10, 6, 12, 34, 56, 123456)), + ("20161006 123456.123456", datetime(2016, 10, 6, 12, 34, 56, 123456)), + # Datetime with offset + ( + "2016-10-06T12:34:56.123456+05:30", + datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(19800)), + ), + ( + "2016-10-06T12:34:56.123456+0530", + datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(19800)), + ), + ( + "2016-10-06T12:34:56.123456-05:30", + datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-19800)), + ), + ( + "2016-10-06T12:34:56.123456-0530", + datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-19800)), + ), + ( + "2016-10-06T12:34:56.123456+05", + datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(18000)), + ), + ( + "2016-10-06T12:34:56.123456-05", + datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-18000)), + ), + ( + "20161006T123456,123456-05", + datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-18000)), + ), + ( + "2016-10-06T12:34:56.123456789+05:30", + datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(+19800)), + ), + # Week date with time + ("2008-W39-6T09", datetime(2008, 9, 27, 9, 0, 0, 0)), + ], +) +def test_parse_iso8601(text: str, expected: date) -> None: + assert parse_iso8601(text) == expected def test_parse_ios8601_invalid(): @@ -165,301 +168,43 @@ def test_parse_ios8601_invalid(): parse_iso8601("2012-W123") # Missing separator -def test_parse_ios8601_duration(): - text = "P2Y3M4DT5H6M7S" - parsed = parse_iso8601(text) - - assert parsed.years == 2 - assert parsed.months == 3 - assert parsed.weeks == 0 - assert parsed.remaining_days == 4 - assert parsed.hours == 5 - assert parsed.minutes == 6 - assert parsed.remaining_seconds == 7 - assert parsed.microseconds == 0 - - text = "P1Y2M3DT4H5M6.5S" - parsed = parse_iso8601(text) - - assert parsed.years == 1 - assert parsed.months == 2 - assert parsed.weeks == 0 - assert parsed.remaining_days == 3 - assert parsed.hours == 4 - assert parsed.minutes == 5 - assert parsed.remaining_seconds == 6 - assert parsed.microseconds == 500000 - - text = "P1Y2M3DT4H5M6,5S" - parsed = parse_iso8601(text) - - assert parsed.years == 1 - assert parsed.months == 2 - assert parsed.weeks == 0 - assert parsed.remaining_days == 3 - assert parsed.hours == 4 - assert parsed.minutes == 5 - assert parsed.remaining_seconds == 6 - assert parsed.microseconds == 500000 - - text = "P1Y2M3D" - parsed = parse_iso8601(text) - - assert parsed.years == 1 - assert parsed.months == 2 - assert parsed.weeks == 0 - assert parsed.remaining_days == 3 - assert parsed.hours == 0 - assert parsed.minutes == 0 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "P1Y2M3.5D" - parsed = parse_iso8601(text) - - assert parsed.years == 1 - assert parsed.months == 2 - assert parsed.weeks == 0 - assert parsed.remaining_days == 3 - assert parsed.hours == 12 - assert parsed.minutes == 0 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "P1Y2M3,5D" - parsed = parse_iso8601(text) - - assert parsed.years == 1 - assert parsed.months == 2 - assert parsed.weeks == 0 - assert parsed.remaining_days == 3 - assert parsed.hours == 12 - assert parsed.minutes == 0 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "PT4H54M6.5S" - parsed = parse_iso8601(text) - - assert parsed.years == 0 - assert parsed.months == 0 - assert parsed.weeks == 0 - assert parsed.remaining_days == 0 - assert parsed.hours == 4 - assert parsed.minutes == 54 - assert parsed.remaining_seconds == 6 - assert parsed.microseconds == 500000 - - text = "PT4H54M6,5S" - parsed = parse_iso8601(text) - - assert parsed.years == 0 - assert parsed.months == 0 - assert parsed.weeks == 0 - assert parsed.remaining_days == 0 - assert parsed.hours == 4 - assert parsed.minutes == 54 - assert parsed.remaining_seconds == 6 - assert parsed.microseconds == 500000 - - text = "P1Y" - parsed = parse_iso8601(text) - - assert parsed.years == 1 - assert parsed.months == 0 - assert parsed.weeks == 0 - assert parsed.remaining_days == 0 - assert parsed.hours == 0 - assert parsed.minutes == 0 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "P1.5Y" - with pytest.raises(ValueError): - parse_iso8601(text) - - text = "P1,5Y" - with pytest.raises(ValueError): - parse_iso8601(text) - - text = "P1M" - parsed = parse_iso8601(text) - - assert parsed.years == 0 - assert parsed.months == 1 - assert parsed.weeks == 0 - assert parsed.remaining_days == 0 - assert parsed.hours == 0 - assert parsed.minutes == 0 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "P1.5M" - with pytest.raises(ValueError): - parse_iso8601(text) - - text = "P1,5M" - with pytest.raises(ValueError): - parse_iso8601(text) - - text = "P1W" - parsed = parse_iso8601(text) - - assert parsed.years == 0 - assert parsed.months == 0 - assert parsed.weeks == 1 - assert parsed.remaining_days == 0 - assert parsed.hours == 0 - assert parsed.minutes == 0 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "P1.5W" - parsed = parse_iso8601(text) - - assert parsed.years == 0 - assert parsed.months == 0 - assert parsed.weeks == 1 - assert parsed.remaining_days == 3 - assert parsed.hours == 12 - assert parsed.minutes == 0 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "P1,5W" - parsed = parse_iso8601(text) - - assert parsed.years == 0 - assert parsed.months == 0 - assert parsed.weeks == 1 - assert parsed.remaining_days == 3 - assert parsed.hours == 12 - assert parsed.minutes == 0 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "P1D" - parsed = parse_iso8601(text) - - assert parsed.years == 0 - assert parsed.months == 0 - assert parsed.weeks == 0 - assert parsed.remaining_days == 1 - assert parsed.hours == 0 - assert parsed.minutes == 0 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "P1.5D" - parsed = parse_iso8601(text) - - assert parsed.years == 0 - assert parsed.months == 0 - assert parsed.weeks == 0 - assert parsed.remaining_days == 1 - assert parsed.hours == 12 - assert parsed.minutes == 0 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "P1,5D" - parsed = parse_iso8601(text) - - assert parsed.years == 0 - assert parsed.months == 0 - assert parsed.weeks == 0 - assert parsed.remaining_days == 1 - assert parsed.hours == 12 - assert parsed.minutes == 0 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "PT1H" - parsed = parse_iso8601(text) - - assert parsed.years == 0 - assert parsed.months == 0 - assert parsed.weeks == 0 - assert parsed.remaining_days == 0 - assert parsed.hours == 1 - assert parsed.minutes == 0 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "PT1.5H" - parsed = parse_iso8601(text) - - assert parsed.years == 0 - assert parsed.months == 0 - assert parsed.weeks == 0 - assert parsed.remaining_days == 0 - assert parsed.hours == 1 - assert parsed.minutes == 30 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - text = "PT1,5H" - parsed = parse_iso8601(text) - - assert parsed.years == 0 - assert parsed.months == 0 - assert parsed.weeks == 0 - assert parsed.remaining_days == 0 - assert parsed.hours == 1 - assert parsed.minutes == 30 - assert parsed.remaining_seconds == 0 - assert parsed.microseconds == 0 - - # Double digit with 0 - text = "P2Y30M4DT5H6M7S" - parsed = parse_iso8601(text) - - assert parsed.years == 2 - assert parsed.months == 30 - assert parsed.weeks == 0 - assert parsed.remaining_days == 4 - assert parsed.hours == 5 - assert parsed.minutes == 6 - assert parsed.remaining_seconds == 7 - assert parsed.microseconds == 0 - - # No P operator - with pytest.raises(ValueError): - parse_iso8601("2Y3M4DT5H6M7S") - - # Week and other units combined - with pytest.raises(ValueError): - parse_iso8601("P1Y2W") - - # Invalid units order - with pytest.raises(ValueError): - parse_iso8601("P1S") - - with pytest.raises(ValueError): - parse_iso8601("P1D1S") - - with pytest.raises(ValueError): - parse_iso8601("1Y2M3D1SPT1M") - - with pytest.raises(ValueError): - parse_iso8601("P1Y2M3D2MT1S") - - with pytest.raises(ValueError): - parse_iso8601("P2M3D1ST1Y1M") - - with pytest.raises(ValueError): - parse_iso8601("P1Y2M2MT3D1S") - - with pytest.raises(ValueError): - parse_iso8601("P1D1Y1M") - - with pytest.raises(ValueError): - parse_iso8601("PT1S1H") - - # Invalid - with pytest.raises(ValueError): - parse_iso8601("P1Dasdfasdf") - - # Invalid fractional - with pytest.raises(ValueError): - parse_iso8601("P2Y3M4DT5.5H6M7S") +@pytest.mark.parametrize( + ["text", "expected"], + [ + ("P2Y3M4DT5H6M7S", (2, 3, 0, 4, 5, 6, 7, 0)), + ("P1Y2M3DT4H5M6.5S", (1, 2, 0, 3, 4, 5, 6, 500_000)), + ("P1Y2M3DT4H5M6,5S", (1, 2, 0, 3, 4, 5, 6, 500_000)), + ("P1Y2M3D", (1, 2, 0, 3, 0, 0, 0, 0)), + ("P1Y2M3.5D", (1, 2, 0, 3, 12, 0, 0, 0)), + ("P1Y2M3,5D", (1, 2, 0, 3, 12, 0, 0, 0)), + ("PT4H54M6.5S", (0, 0, 0, 0, 4, 54, 6, 500_000)), + ("PT4H54M6,5S", (0, 0, 0, 0, 4, 54, 6, 500_000)), + ("P1Y", (1, 0, 0, 0, 0, 0, 0, 0)), + ("P1M", (0, 1, 0, 0, 0, 0, 0, 0)), + ("P1W", (0, 0, 1, 0, 0, 0, 0, 0)), + ("P1.5W", (0, 0, 1, 3, 12, 0, 0, 0)), + ("P1,5W", (0, 0, 1, 3, 12, 0, 0, 0)), + ("P1D", (0, 0, 0, 1, 0, 0, 0, 0)), + ("P1.5D", (0, 0, 0, 1, 12, 0, 0, 0)), + ("P1,5D", (0, 0, 0, 1, 12, 0, 0, 0)), + ("PT1H", (0, 0, 0, 0, 1, 0, 0, 0)), + ("PT1.5H", (0, 0, 0, 0, 1, 30, 0, 0)), + ("PT1,5H", (0, 0, 0, 0, 1, 30, 0, 0)), + ("P2Y30M4DT5H6M7S", (2, 30, 0, 4, 5, 6, 7, 0)), + ], +) +def test_parse_ios8601_duration( + text: str, expected: tuple[int, int, int, int, int, int, int, int] +) -> None: + parsed = parse_iso8601(text) + + assert ( + parsed.years, + parsed.months, + parsed.weeks, + parsed.remaining_days, + parsed.hours, + parsed.minutes, + parsed.remaining_seconds, + parsed.microseconds, + ) == expected -- cgit v1.2.3