| |
| |
| |
| |
| |
| |
| |
|
|
| from dill.detect import baditems, badobjects, badtypes, errors, parent, at, globalvars |
| from dill import settings |
| from dill._dill import IS_PYPY |
| from pickle import PicklingError |
|
|
| import inspect |
| import sys |
| import os |
|
|
| def test_bad_things(): |
| f = inspect.currentframe() |
| assert baditems(f) == [f] |
| |
| assert badobjects(f) is f |
| assert badtypes(f) == type(f) |
| assert type(errors(f)) is TypeError |
| d = badtypes(f, 1) |
| assert isinstance(d, dict) |
| assert list(badobjects(f, 1).keys()) == list(d.keys()) |
| assert list(errors(f, 1).keys()) == list(d.keys()) |
| s = set([(err.__class__.__name__,err.args[0]) for err in list(errors(f, 1).values())]) |
| a = dict(s) |
| if not os.environ.get('COVERAGE'): |
| proxy = 0 if type(f.f_locals) is dict else 1 |
| assert len(s) == len(a) + proxy |
| n = 2 |
| assert len(a) is n if 'PicklingError' in a.keys() else n-1 |
|
|
| def test_parent(): |
| x = [4,5,6,7] |
| listiter = iter(x) |
| obj = parent(listiter, list) |
| assert obj is x |
|
|
| if IS_PYPY: assert parent(obj, int) is None |
| else: assert parent(obj, int) is x[-1] |
| assert at(id(at)) is at |
|
|
| a, b, c = 1, 2, 3 |
|
|
| def squared(x): |
| return a+x**2 |
|
|
| def foo(x): |
| def bar(y): |
| return squared(x)+y |
| return bar |
|
|
| class _class: |
| def _method(self): |
| pass |
| def ok(self): |
| return True |
|
|
| def test_globals(): |
| def f(): |
| a |
| def g(): |
| b |
| def h(): |
| c |
| assert globalvars(f) == dict(a=1, b=2, c=3) |
|
|
| res = globalvars(foo, recurse=True) |
| assert set(res) == set(['squared', 'a']) |
| res = globalvars(foo, recurse=False) |
| assert res == {} |
| zap = foo(2) |
| res = globalvars(zap, recurse=True) |
| assert set(res) == set(['squared', 'a']) |
| res = globalvars(zap, recurse=False) |
| assert set(res) == set(['squared']) |
| del zap |
| res = globalvars(squared) |
| assert set(res) == set(['a']) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| |
| bar = [0] |
|
|
| class Foo(object): |
| def __init__(self): |
| pass |
| def __getstate__(self): |
| bar[0] = bar[0]+1 |
| return {} |
| def __setstate__(self, data): |
| pass |
|
|
| f = Foo() |
|
|
| def test_getstate(): |
| from dill import dumps, loads |
| dumps(f) |
| b = bar[0] |
| dumps(lambda: f, recurse=False) |
| assert bar[0] == b |
| dumps(lambda: f, recurse=True) |
| assert bar[0] == b + 1 |
|
|
| |
| def test_deleted(): |
| global sin |
| from dill import dumps, loads |
| from math import sin, pi |
|
|
| def sinc(x): |
| return sin(x)/x |
|
|
| settings['recurse'] = True |
| _sinc = dumps(sinc) |
| sin = globals().pop('sin') |
| sin = 1 |
| del sin |
| sinc_ = loads(_sinc) |
| res = sinc_(1) |
| from math import sin |
| assert sinc(1) == res |
|
|
|
|
| def test_lambdify(): |
| try: |
| from sympy import symbols, lambdify |
| except ImportError: |
| return |
| settings['recurse'] = True |
| x = symbols("x") |
| y = x**2 |
| f = lambdify([x], y) |
| z = min |
| d = globals() |
| globalvars(f, recurse=True, builtin=True) |
| assert z is min |
| assert d is globals() |
|
|
|
|
| if __name__ == '__main__': |
| test_bad_things() |
| test_parent() |
| test_globals() |
| test_getstate() |
| test_deleted() |
| test_lambdify() |
|
|