Commit 01b1844c authored by Rolf H. B. van Kleef's avatar Rolf H. B. van Kleef

Added support for lists.

parent eda5934b
from typing import Optional, Union from typing import Optional, Union, List
from typeguard import check_type from typeguard import check_type
...@@ -114,7 +114,20 @@ def deserialize(rule: Rule, data, try_all=False, key=None): ...@@ -114,7 +114,20 @@ def deserialize(rule: Rule, data, try_all=False, key=None):
return deserialize(Rule(arg), data, try_all, key) return deserialize(Rule(arg), data, try_all, key)
except TypeError: except TypeError:
pass pass
raise TypeError('{} did not match any of {}.'.format(type(data), rule.type.__args__)) raise TypeError('{} did not match any of {} for key {}.'.format(type(data), rule.type.__args__, key))
if type(rule.type) is type(List):
if len(rule.type.__args__) != 1:
raise TypeError(
'Cannot handle list with 0 or more than 1 type arguments.')
if type(data) != list:
raise TypeError(
'Cannot deserialize non-list into list.')
t = rule.type.__args__[0]
result = []
for i, v in enumerate(data):
result.append(deserialize(Rule(t), v, try_all, i))
return result
if issubclass(rule.type, Deserializable): if issubclass(rule.type, Deserializable):
if not isinstance(data, dict): if not isinstance(data, dict):
......
from time import sleep from time import sleep
from typing import Optional from typing import Optional, List
from serializer_utils.deserializer import Deserializable, Rule from serializer_utils.deserializer import Deserializable, Rule
from serializer_utils.annotations import abstract, discriminate from serializer_utils.annotations import abstract, discriminate
...@@ -32,12 +32,13 @@ class RefundLine(ReceiptLine): ...@@ -32,12 +32,13 @@ class RefundLine(ReceiptLine):
return 'RefundLine(super={})'.format(super(RefundLine, self).__repr__()) return 'RefundLine(super={})'.format(super(RefundLine, self).__repr__())
class Test(Deserializable): class Test(Deserializable):
tf: Optional[ReceiptLine] tf: Optional[ReceiptLine]
ns: List[int]
def __repr__(self): def __repr__(self):
return 'Test(tf={})'.format(self.tf.__repr__()) return 'Test(tf={},ns={})'\
.format(self.tf.__repr__(), self.ns.__repr__())
if __name__ == '__main__': if __name__ == '__main__':
...@@ -59,7 +60,8 @@ if __name__ == '__main__': ...@@ -59,7 +60,8 @@ if __name__ == '__main__':
[Rule(ReceiptLine), {'type': 'other', 'name': 'asdf'}], [Rule(ReceiptLine), {'type': 'other', 'name': 'asdf'}],
[Rule(ReceiptLine), {'type': 'transaction'}], [Rule(ReceiptLine), {'type': 'transaction'}],
[Rule(ReceiptLine), {'type': 'transaction', 'name': 'asdf', 'pk': 'no'}], [Rule(ReceiptLine), {'type': 'transaction', 'name': 'asdf', 'pk': 'no'}],
[Rule(Test), {'tf': {'type': 'refund', 'name': 'asdf', 'pk': 5}}] [Rule(Test), {'tf': {'type': 'refund', 'name': 'asdf', 'pk': 5},
'ns': [1, 2, 4, 7, 9]}]
] ]
[print_result(deserialize, *entry) for entry in fns] [print_result(deserialize, *entry) for entry in fns]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment