From 33b73d7fbc27095a75c3ef9dd8674ffe611529c0 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sun, 16 Dec 2018 17:26:56 +0100 Subject: [PATCH] Typing does not need to be installed for Jedi to work, vendored typeshed is enough --- jedi/evaluate/__init__.py | 7 ++++++- jedi/plugins/typeshed.py | 22 +++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 209c5450..db7d32b5 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -161,7 +161,12 @@ class Evaluator(object): @evaluator_function_cache() def typing_module(self): typing_module, = self.import_module((u'typing',)) - return typing_module.stub_context + try: + return typing_module.stub_context + except AttributeError: + # Python 2 and 3.4: In some cases there is no non-stub module, + # because the module was not installed with `pip install typing`. + return typing_module def reset_recursion_limitations(self): self.recursion_detector = recursion.RecursionDetector() diff --git a/jedi/plugins/typeshed.py b/jedi/plugins/typeshed.py index 7f322272..dc47152e 100644 --- a/jedi/plugins/typeshed.py +++ b/jedi/plugins/typeshed.py @@ -17,8 +17,9 @@ from jedi.evaluate.context.klass import ClassMixin from jedi.evaluate.context.module import ModuleMixin from jedi.evaluate.context.typing import TypingModuleFilterWrapper, \ TypingModuleName -from jedi.evaluate.compiled.context import CompiledObject, CompiledName +from jedi.evaluate.compiled.context import CompiledName from jedi.evaluate.utils import to_list, safe_property +from jedi.evaluate.imports import JediImportError _jedi_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) _TYPESHED_PATH = os.path.join(_jedi_path, 'third_party', 'typeshed') @@ -130,12 +131,19 @@ class TypeshedPlugin(BasePlugin): parent_module_context, = evaluator.import_module(('os',)) return parent_module_context.py__getattribute__('path') - context_set = callback( - evaluator, - import_names, - parent_module_context, - sys_path - ) + try: + context_set = callback( + evaluator, + import_names, + parent_module_context, + sys_path + ) + except JediImportError: + if import_names == ('typing',): + # TODO this is also quite ugly, please refactor. + context_set = NO_CONTEXTS + else: + raise import_name = import_names[-1] map_ = None