From a4fd27fe4b8638c2667d5c1ddef9f41a90671f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=BCndler?= Date: Sat, 22 Apr 2023 15:43:29 +0200 Subject: [PATCH 1/3] Add test that fails for Datum type --- test/pycardano/test_serialization.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/pycardano/test_serialization.py b/test/pycardano/test_serialization.py index 6df869b7..d693aa44 100644 --- a/test/pycardano/test_serialization.py +++ b/test/pycardano/test_serialization.py @@ -1,4 +1,6 @@ from dataclasses import dataclass, field + +from pycardano import Datum from test.pycardano.util import check_two_way_cbor from typing import Any, Dict, List, Optional, Set, Tuple, Union @@ -174,6 +176,16 @@ class Test1(MapCBORSerializable): check_two_way_cbor(t) +def test_datum_type(): + @dataclass + class Test1(MapCBORSerializable): + b: Datum + + t = Test1(b=1) + + check_two_way_cbor(t) + + def test_wrong_primitive_type(): @dataclass class Test1(MapCBORSerializable): From 45c646b66bd3e0213e8df43954921712f5cdccb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=BCndler?= Date: Sat, 22 Apr 2023 15:43:40 +0200 Subject: [PATCH 2/3] Fix deserialization to make type annotation datum work --- pycardano/serialization.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pycardano/serialization.py b/pycardano/serialization.py index 8d8d35e2..9aa9bff0 100644 --- a/pycardano/serialization.py +++ b/pycardano/serialization.py @@ -496,7 +496,10 @@ def _restore_typed_primitive( raise DeserializeException(f"Expected type list but got {type(v)}") return IndefiniteList([_restore_typed_primitive(t, w) for w in v]) elif isclass(t) and issubclass(t, IndefiniteList): - return IndefiniteList(v) + try: + return IndefiniteList(v) + except TypeError: + raise DeserializeException(f"Can not initialize IndefiniteList from {v}") elif hasattr(t, "__origin__") and (t.__origin__ is dict): t_args = t.__args__ if len(t_args) != 2: From 1308e8d606df9dc164cf1efe925c278a9685c2d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=BCndler?= Date: Sat, 22 Apr 2023 15:53:13 +0200 Subject: [PATCH 3/3] Fix deserialization test, add iterable case --- pycardano/plutus.py | 2 +- test/pycardano/test_serialization.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/pycardano/plutus.py b/pycardano/plutus.py index 1d70bcca..3f64400b 100644 --- a/pycardano/plutus.py +++ b/pycardano/plutus.py @@ -693,7 +693,7 @@ def from_primitive(cls: Type[RawPlutusData], value: CBORTag) -> RawPlutusData: return cls(value) -Datum = Union[PlutusData, dict, IndefiniteList, int, bytes, RawCBOR, RawPlutusData] +Datum = Union[PlutusData, dict, int, bytes, IndefiniteList, RawCBOR, RawPlutusData] """Plutus Datum type. A Union type that contains all valid datum types.""" diff --git a/test/pycardano/test_serialization.py b/test/pycardano/test_serialization.py index d693aa44..db0f10c6 100644 --- a/test/pycardano/test_serialization.py +++ b/test/pycardano/test_serialization.py @@ -1,6 +1,7 @@ +import cbor2 from dataclasses import dataclass, field -from pycardano import Datum +from pycardano import Datum, RawPlutusData from test.pycardano.util import check_two_way_cbor from typing import Any, Dict, List, Optional, Set, Tuple, Union @@ -181,7 +182,13 @@ def test_datum_type(): class Test1(MapCBORSerializable): b: Datum - t = Test1(b=1) + # make sure that no "not iterable" error is thrown + t = Test1(b=RawPlutusData(cbor2.CBORTag(125, []))) + + check_two_way_cbor(t) + + # Make sure that iterable objects are not deserialized to the wrong object + t = Test1(b=b"hello!") check_two_way_cbor(t)