|
|
from IPython.utils.dir2 import dir2 |
|
|
|
|
|
import pytest |
|
|
|
|
|
|
|
|
class Base(object): |
|
|
x = 1 |
|
|
z = 23 |
|
|
|
|
|
|
|
|
def test_base(): |
|
|
res = dir2(Base()) |
|
|
assert "x" in res |
|
|
assert "z" in res |
|
|
assert "y" not in res |
|
|
assert "__class__" in res |
|
|
assert res.count("x") == 1 |
|
|
assert res.count("__class__") == 1 |
|
|
|
|
|
|
|
|
def test_SubClass(): |
|
|
class SubClass(Base): |
|
|
y = 2 |
|
|
|
|
|
res = dir2(SubClass()) |
|
|
assert "y" in res |
|
|
assert res.count("y") == 1 |
|
|
assert res.count("x") == 1 |
|
|
|
|
|
|
|
|
def test_SubClass_with_trait_names_attr(): |
|
|
|
|
|
|
|
|
class SubClass(Base): |
|
|
y = 2 |
|
|
trait_names = 44 |
|
|
|
|
|
res = dir2(SubClass()) |
|
|
assert "trait_names" in res |
|
|
|
|
|
|
|
|
def test_misbehaving_object_without_trait_names(): |
|
|
|
|
|
|
|
|
|
|
|
class MisbehavingGetattr: |
|
|
def __getattr__(self, attr): |
|
|
raise KeyError("I should be caught") |
|
|
|
|
|
def some_method(self): |
|
|
return True |
|
|
|
|
|
class SillierWithDir(MisbehavingGetattr): |
|
|
def __dir__(self): |
|
|
return ["some_method"] |
|
|
|
|
|
for bad_klass in (MisbehavingGetattr, SillierWithDir): |
|
|
obj = bad_klass() |
|
|
|
|
|
assert obj.some_method() |
|
|
|
|
|
with pytest.raises(KeyError): |
|
|
obj.other_method() |
|
|
|
|
|
res = dir2(obj) |
|
|
assert "some_method" in res |
|
|
|