|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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'): |
|
assert len(s) is len(a) |
|
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() |
|
|