From 200d29713e048dcb6b79299bf070a85e39ddf164 Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Sun, 19 May 2013 05:08:06 +0200 Subject: [PATCH 1/5] Make defined_names importable at top-level --- jedi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jedi/__init__.py b/jedi/__init__.py index 0c29bca1..9c37f07c 100644 --- a/jedi/__init__.py +++ b/jedi/__init__.py @@ -43,7 +43,7 @@ import sys sys.path.insert(0, __path__[0]) from .api import Script, Interpreter, NotFoundError, set_debug_function, \ - preload_module + preload_module, defined_names from . import settings sys.path.pop(0) From 29f74c245d20990dd0e51dfd835285ce4a13d2d0 Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Sun, 19 May 2013 04:42:01 +0200 Subject: [PATCH 2/5] Move tests for defined_names to test_defined_names.py --- test/test_defined_names.py | 60 ++++++++++++++++++++++++++++++++++++++ test/test_regression.py | 54 ---------------------------------- 2 files changed, 60 insertions(+), 54 deletions(-) create mode 100644 test/test_defined_names.py diff --git a/test/test_defined_names.py b/test/test_defined_names.py new file mode 100644 index 00000000..ee04d38e --- /dev/null +++ b/test/test_defined_names.py @@ -0,0 +1,60 @@ +""" +Tests for `api.defined_names`. +""" + +from jedi import api +from .base import TestBase + + +class TestDefinedNames(TestBase): + + def test_get_definitions_flat(self): + definitions = api.defined_names(""" + import module + class Class: + pass + def func(): + pass + data = None + """) + self.assertEqual([d.name for d in definitions], + ['module', 'Class', 'func', 'data']) + + def test_dotted_assignment(self): + definitions = api.defined_names(""" + x = Class() + x.y.z = None + """) + self.assertEqual([d.name for d in definitions], + ['x']) + + def test_multiple_assignment(self): + definitions = api.defined_names(""" + x = y = None + """) + self.assertEqual([d.name for d in definitions], + ['x', 'y']) + + def test_multiple_imports(self): + definitions = api.defined_names(""" + from module import a, b + from another_module import * + """) + self.assertEqual([d.name for d in definitions], + ['a', 'b']) + + def test_nested_definitions(self): + definitions = api.defined_names(""" + class Class: + def f(): + pass + def g(): + pass + """) + self.assertEqual([d.name for d in definitions], + ['Class']) + subdefinitions = definitions[0].defined_names() + self.assertEqual([d.name for d in subdefinitions], + ['f', 'g']) + self.assertEqual([d.full_name for d in subdefinitions], + ['Class.f', 'Class.g']) diff --git a/test/test_regression.py b/test/test_regression.py index 5e111310..cc55773b 100755 --- a/test/test_regression.py +++ b/test/test_regression.py @@ -454,60 +454,6 @@ class TestFeature(TestBase): cache.parser_cache = temp_cache -class TestGetDefinitions(TestBase): - - def test_get_definitions_flat(self): - definitions = api.defined_names(""" - import module - class Class: - pass - def func(): - pass - data = None - """) - self.assertEqual([d.name for d in definitions], - ['module', 'Class', 'func', 'data']) - - def test_dotted_assignment(self): - definitions = api.defined_names(""" - x = Class() - x.y.z = None - """) - self.assertEqual([d.name for d in definitions], - ['x']) - - def test_multiple_assignment(self): - definitions = api.defined_names(""" - x = y = None - """) - self.assertEqual([d.name for d in definitions], - ['x', 'y']) - - def test_multiple_imports(self): - definitions = api.defined_names(""" - from module import a, b - from another_module import * - """) - self.assertEqual([d.name for d in definitions], - ['a', 'b']) - - def test_nested_definitions(self): - definitions = api.defined_names(""" - class Class: - def f(): - pass - def g(): - pass - """) - self.assertEqual([d.name for d in definitions], - ['Class']) - subdefinitions = definitions[0].defined_names() - self.assertEqual([d.name for d in subdefinitions], - ['f', 'g']) - self.assertEqual([d.full_name for d in subdefinitions], - ['Class.f', 'Class.g']) - - class TestSpeed(TestBase): def _check_speed(time_per_run, number=4, run_warm=True): """ Speed checks should typically be very tolerant. Some machines are From 6fadfb573caa7519429f784b6ccde05686cfe8e9 Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Sun, 19 May 2013 04:46:27 +0200 Subject: [PATCH 3/5] Refactor TestDefinedNames --- test/test_defined_names.py | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/test/test_defined_names.py b/test/test_defined_names.py index ee04d38e..419252ed 100644 --- a/test/test_defined_names.py +++ b/test/test_defined_names.py @@ -8,51 +8,46 @@ from .base import TestBase class TestDefinedNames(TestBase): + def check_defined_names(self, source, names): + definitions = api.defined_names(source) + self.assertEqual([d.name for d in definitions], names) + return definitions + def test_get_definitions_flat(self): - definitions = api.defined_names(""" + self.check_defined_names(""" import module class Class: pass def func(): pass data = None - """) - self.assertEqual([d.name for d in definitions], - ['module', 'Class', 'func', 'data']) + """, ['module', 'Class', 'func', 'data']) def test_dotted_assignment(self): - definitions = api.defined_names(""" + self.check_defined_names(""" x = Class() x.y.z = None - """) - self.assertEqual([d.name for d in definitions], - ['x']) + """, ['x']) def test_multiple_assignment(self): - definitions = api.defined_names(""" + self.check_defined_names(""" x = y = None - """) - self.assertEqual([d.name for d in definitions], - ['x', 'y']) + """, ['x', 'y']) def test_multiple_imports(self): - definitions = api.defined_names(""" + self.check_defined_names(""" from module import a, b from another_module import * - """) - self.assertEqual([d.name for d in definitions], - ['a', 'b']) + """, ['a', 'b']) def test_nested_definitions(self): - definitions = api.defined_names(""" + definitions = self.check_defined_names(""" class Class: def f(): pass def g(): pass - """) - self.assertEqual([d.name for d in definitions], - ['Class']) + """, ['Class']) subdefinitions = definitions[0].defined_names() self.assertEqual([d.name for d in subdefinitions], ['f', 'g']) From e011683ea462e6ebc8fd7e08527b1cbf936ce508 Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Sun, 19 May 2013 04:48:44 +0200 Subject: [PATCH 4/5] dedent source before passing it to defined_names test_nested_definitions fails now --- test/test_defined_names.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test_defined_names.py b/test/test_defined_names.py index 419252ed..aeb13972 100644 --- a/test/test_defined_names.py +++ b/test/test_defined_names.py @@ -2,6 +2,8 @@ Tests for `api.defined_names`. """ +import textwrap + from jedi import api from .base import TestBase @@ -9,7 +11,7 @@ from .base import TestBase class TestDefinedNames(TestBase): def check_defined_names(self, source, names): - definitions = api.defined_names(source) + definitions = api.defined_names(textwrap.dedent(source)) self.assertEqual([d.name for d in definitions], names) return definitions From 6acf34efd3737cf72a5a44c5a49475d1a78a06c1 Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Sun, 19 May 2013 05:07:23 +0200 Subject: [PATCH 5/5] Fix: api.defined_names was run against wrong scope when there is only one class is defined in the module. --- jedi/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jedi/api.py b/jedi/api.py index e148f350..5d2095e4 100644 --- a/jedi/api.py +++ b/jedi/api.py @@ -563,7 +563,7 @@ def defined_names(source, source_path=None, source_encoding='utf-8'): modules.source_to_unicode(source, source_encoding), module_path=source_path, ) - return api_classes._defined_names(parser.scope) + return api_classes._defined_names(parser.module) def preload_module(*modules):