diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index 1d0eb873..a2f4b89e 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -563,11 +563,10 @@ class Script(object): match = re.match(r'^(.*?)(\.|)(\w?[\w\d]*)$', path, flags=re.S) return match.groups() - @staticmethod - def _sorted_defs(d): + def _sorted_defs(self, d): # Note: `or ''` below is required because `module_path` could be # None and you can't compare None and str in Python 3. - return sorted(d, key=lambda x: (x.module_path or '', x.line, x.column)) + return sorted(d, key=lambda x: (x.module_path or '', x.line or 0, x.column or 0)) class Interpreter(Script): diff --git a/jedi/api/classes.py b/jedi/api/classes.py index 875baba7..c3f5d0b1 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -173,11 +173,11 @@ class BaseDefinition(object): The module name. >>> from jedi import Script - >>> source = 'import datetime' - >>> script = Script(source, 1, len(source), 'example.py') + >>> source = 'import json' + >>> script = Script(source, path='example.py') >>> d = script.goto_definitions()[0] >>> print(d.module_name) # doctest: +ELLIPSIS - datetime + json """ return str(self._module.name) diff --git a/jedi/evaluate/compiled/__init__.py b/jedi/evaluate/compiled/__init__.py index e13fab91..cddf675f 100644 --- a/jedi/evaluate/compiled/__init__.py +++ b/jedi/evaluate/compiled/__init__.py @@ -154,6 +154,9 @@ def load_module(path, name): name = os.path.basename(path) name = name.rpartition('.')[0] # cut file type (normally .so) + # sometimes there are endings like `_sqlite3.cpython-32mu` + name = re.sub(r'\..*', '', name) + sys_path = get_sys_path() if path: sys_path.insert(0, path) diff --git a/jedi/evaluate/compiled/fake.py b/jedi/evaluate/compiled/fake.py index 65367b10..73734e5c 100644 --- a/jedi/evaluate/compiled/fake.py +++ b/jedi/evaluate/compiled/fake.py @@ -45,9 +45,6 @@ def _load_fakes(module_name): raise NotImplementedError() return funcs - # sometimes there are stupid endings like `_sqlite3.cpython-32mu` - module_name = re.sub(r'\..*', '', module_name) - if module_name == '__builtin__' and not is_py3k: module_name = 'builtins' path = os.path.dirname(os.path.abspath(__file__)) diff --git a/test/test_api.py b/test/test_api.py index 74c81a9e..44f94c7b 100644 --- a/test/test_api.py +++ b/test/test_api.py @@ -2,24 +2,23 @@ Test all things related to the ``jedi.api`` module. """ -from jedi import common, api +from jedi import api from pytest import raises def test_preload_modules(): def check_loaded(*modules): # +1 for None module (currently used) - assert len(new) == len(modules) + 1 - for i in modules + ('__builtin__',): - assert [i in k for k in new.keys() if k is not None] + assert len(parser_cache) == len(modules) + 1 + for i in modules: + assert [i in k for k in parser_cache.keys() if k is not None] from jedi import cache temp_cache, cache.parser_cache = cache.parser_cache, {} - new = cache.parser_cache - with common.ignored(KeyError): # performance of tests -> no reload - new['__builtin__'] = temp_cache['__builtin__'] + parser_cache = cache.parser_cache - api.preload_module('datetime') + api.preload_module('sys') + check_loaded() # compiled (c_builtin) modules shouldn't be in the cache. api.preload_module('json', 'token') check_loaded('json', 'token') @@ -29,6 +28,7 @@ def test_preload_modules(): def test_empty_script(): assert api.Script('') + def test_line_number_errors(): """ Script should raise a ValueError if line/column numbers are not in a