diff --git a/IPython/core/completer.py b/IPython/core/completer.py index f2428e8..da2a866 100644 --- a/IPython/core/completer.py +++ b/IPython/core/completer.py @@ -336,6 +336,7 @@ class Completer(Configurable): #io.rprint('Completer->attr_matches, txt=%r' % text) # dbg # Another option, seems to work great. Catches things like ''. m = re.match(r"(\S+(\.\w+)*)\.(\w*)$", text) + if m: expr, attr = m.group(1, 3) elif self.greedy: @@ -345,7 +346,7 @@ class Completer(Configurable): expr, attr = m2.group(1,2) else: return [] - + try: obj = eval(expr, self.namespace) except: diff --git a/IPython/core/tests/test_completer.py b/IPython/core/tests/test_completer.py index 2f9ea48..ab2c7b6 100644 --- a/IPython/core/tests/test_completer.py +++ b/IPython/core/tests/test_completer.py @@ -18,7 +18,6 @@ from IPython.core import completer from IPython.external.decorators import knownfailureif from IPython.utils.tempdir import TemporaryDirectory from IPython.utils.generics import complete_object -from IPython.testing.globalipapp import get_ipython #----------------------------------------------------------------------------- # Test functions @@ -241,4 +240,4 @@ def test_get__all__entries_no__all__ok(): class A(object): pass words = completer.get__all__entries(A()) - nt.assert_equal(words, []) \ No newline at end of file + nt.assert_equal(words, []) diff --git a/IPython/utils/tests/test_dir2.py b/IPython/utils/tests/test_dir2.py new file mode 100644 index 0000000..c06e982 --- /dev/null +++ b/IPython/utils/tests/test_dir2.py @@ -0,0 +1,51 @@ +import nose.tools as nt +from IPython.utils.dir2 import dir2 + + +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) + nt.assert_equal(res.count('x'), 2) # duplicates + nt.assert_equal(res.count('__class__'), 4) # duplicates + +def test_SubClass(): + + class SubClass(Base): + y = 2 + + res = dir2(SubClass()) + assert ('y' in res) + nt.assert_equal(res.count('y'), 2) # duplicates, + nt.assert_equal(res.count('x'), 3) # duplicates, but fewer than above! + + +def test_SubClass_with_trait_names_method(): + + class SubClass(Base): + y = 2 + def trait_names(self): + return ['t', 'umbrella'] + + res = dir2(SubClass()) + assert('trait_names' in res) + assert('umbrella' in res) + nt.assert_equal(res.count('t'), 1) + + +def test_SubClass_with_trait_names_attr(): + # usecase: trait_names is used in a class describing psychological classification + + class SubClass(Base): + y = 2 + trait_names = 44 + + res = dir2(SubClass()) + assert('trait_names' in res)