From e1c8591ad15a63d86bb0b585595fc03a63d9d334fe1445a6fc6bf7dd71ed4d51 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Wed, 4 Dec 2024 19:02:44 +0300 Subject: [PATCH] Check that leapsecUTCAllow is propagated everywhere --- pyac/pyac.py | 4 ++-- pyac/tests/test_map.py | 6 ++++++ pyac/tests/test_tai.py | 12 ++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/pyac/pyac.py b/pyac/pyac.py index 5502d16..6763243 100755 --- a/pyac/pyac.py +++ b/pyac/pyac.py @@ -362,7 +362,7 @@ def loads(v, sets=False, leapsecUTCAllow=False): ret = [] v = v[1:] while True: - i, v = loads(v, sets=sets) + i, v = loads(v, sets=sets, leapsecUTCAllow=leapsecUTCAllow) if i == _EOC: break ret.append(i) @@ -382,7 +382,7 @@ def loads(v, sets=False, leapsecUTCAllow=False): if len(k) == 0: raise DecodeError("empty key") raise DecodeError("unsorted keys") - i, v = loads(v, sets=sets) + i, v = loads(v, sets=sets, leapsecUTCAllow=leapsecUTCAllow) if i == _EOC: raise DecodeError("unexpected EOC") ret[k] = i diff --git a/pyac/tests/test_map.py b/pyac/tests/test_map.py index ef99fae..0f3da4c 100644 --- a/pyac/tests/test_map.py +++ b/pyac/tests/test_map.py @@ -145,3 +145,9 @@ class TestSet(TestCase): with self.assertRaises(ValueError) as err: dumps(set((123,))) self.assertEqual(str(err.exception), "set can contain only strings") + + def test_sets_are_passed_through_containers(self) -> None: + test = {"deep": [{"in map": [set(("foo", "bar"))]}]} + encoded = dumps(test) + decoded, tail = loads(encoded, sets=True) + self.assertEqual(decoded, test) diff --git a/pyac/tests/test_tai.py b/pyac/tests/test_tai.py index a04220e..ca7f0cd 100644 --- a/pyac/tests/test_tai.py +++ b/pyac/tests/test_tai.py @@ -20,6 +20,7 @@ from unittest import TestCase from hypothesis import given from hypothesis.strategies import datetimes +from pyac import _byte from pyac import DecodeError from pyac import dumps from pyac import Leapsecs @@ -90,6 +91,17 @@ class TestTAI64(TestCase): loads(bytes.fromhex("188000000065195F65")) self.assertEqual(str(err.exception), "reserved TAI64 value is in use") + def test_leapsecUTCAllow_is_passed_through_containers(self) -> None: + leaped = _byte(TagTAI64) + (Leapsecs[8] + TAI64Base).to_bytes(8, "big") + raw, _ = loads(leaped) + self.assertIsInstance(raw, Raw) + decoded, _ = loads(leaped, leapsecUTCAllow=True) + self.assertIsInstance(decoded, datetime) + decoded, _ = loads(dumps([raw]), leapsecUTCAllow=True) + self.assertIsInstance(decoded[0], datetime) + decoded, _ = loads(dumps({"try that": [raw]}), leapsecUTCAllow=True) + self.assertIsInstance(decoded["try that"][0], datetime) + class TestTAI64N(TestCase): @given(datetimes(), junk_st) -- 2.50.0