Mercurial > piecrust2
diff tests/test_fastpickle.py @ 450:298f8f46432a
internal: Add a `fastpickle` module to help with multiprocess serialization.
Looks like we're wasting a lot of time serializing custom class information
for the workers, so this new module helps to convert classes to standard
structures (dicts, lists, etc).
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Mon, 06 Jul 2015 21:29:17 -0700 |
parents | |
children | fcfbe103cfd1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test_fastpickle.py Mon Jul 06 21:29:17 2015 -0700 @@ -0,0 +1,53 @@ +import datetime +import pytest +from piecrust.fastpickle import pickle, unpickle + + +class Foo(object): + def __init__(self, name): + self.name = name + self.bars = [] + + +class Bar(object): + def __init__(self, value): + self.value = value + + +@pytest.mark.parametrize( + 'obj, expected', + [ + (True, True), + (42, 42), + (3.14, 3.14), + (datetime.date(2015, 5, 21), datetime.date(2015, 5, 21)), + (datetime.datetime(2015, 5, 21, 12, 55, 32), + datetime.datetime(2015, 5, 21, 12, 55, 32)), + (datetime.time(9, 25, 57), datetime.time(9, 25, 57)), + ((1, 2, 3), (1, 2, 3)), + ([1, 2, 3], [1, 2, 3]), + ({'foo': 1, 'bar': 2}, {'foo': 1, 'bar': 2}), + (set([1, 2, 3]), set([1, 2, 3])), + ({'foo': [1, 2, 3], 'bar': {'one': 1, 'two': 2}}, + {'foo': [1, 2, 3], 'bar': {'one': 1, 'two': 2}}) + ]) +def test_pickle_unpickle(obj, expected): + data = pickle(obj) + actual = unpickle(data) + assert actual == expected + + +def test_objects(): + f = Foo('foo') + f.bars.append(Bar(1)) + f.bars.append(Bar(2)) + + data = pickle(f) + o = unpickle(data) + + assert type(o) == Foo + assert o.name == 'foo' + assert len(o.bars) == 2 + for i in range(2): + assert f.bars[i].value == o.bars[i].value +