From 3a9dc0ca2e2f9fd35b3a30a1cfb1653cb600bb4c Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 6 Aug 2019 01:07:42 +0200 Subject: [PATCH] Fix bytes issue with file path adding --- jedi/api/file_name.py | 4 ++-- jedi/evaluate/context/module.py | 5 +++-- test/test_api/test_completion.py | 3 +++ test/test_evaluate/test_context.py | 7 +++++-- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/jedi/api/file_name.py b/jedi/api/file_name.py index 6dfaf7ea..2ff766d6 100644 --- a/jedi/api/file_name.py +++ b/jedi/api/file_name.py @@ -1,6 +1,6 @@ import os -from jedi._compatibility import FileNotFoundError +from jedi._compatibility import FileNotFoundError, force_unicode from jedi.evaluate.names import AbstractArbitraryName from jedi.api import classes from jedi.evaluate.helpers import get_str_or_none @@ -54,7 +54,7 @@ def _get_string_additions(module_context, start_leaf): s = get_str_or_none(c) if s is None: return string - string = s + string + string = force_unicode(s) + string continue if child_node != '+': diff --git a/jedi/evaluate/context/module.py b/jedi/evaluate/context/module.py index f12964e5..44b9f991 100644 --- a/jedi/evaluate/context/module.py +++ b/jedi/evaluate/context/module.py @@ -27,8 +27,9 @@ class _ModuleAttributeName(AbstractNameDefinition): def infer(self): if self._string_value is not None: s = self._string_value - if self.parent_context.evaluator.environment.version_info.major == 2: - s = bytes(s) + if self.parent_context.evaluator.environment.version_info.major == 2 \ + and not isinstance(s, bytes): + s = bytes(s, 'utf-8') return ContextSet([ create_simple_object(self.parent_context.evaluator, s) ]) diff --git a/test/test_api/test_completion.py b/test/test_api/test_completion.py index 33917aec..68d5a45e 100644 --- a/test/test_api/test_completion.py +++ b/test/test_api/test_completion.py @@ -195,6 +195,9 @@ def test_keyword_completion(Script, code, has_keywords): ('example.py', 'x = f("te" + "st"', 16, [s]), ('example.py', 'x = f("te" + "st")', 16, [s]), ('example.py', 'x = f("t" + "est")', 16, [s]), + # This is actually not correct, but for now leave it here, because of + # Python 2. + ('example.py', 'x = f(b"t" + "est")', 17, [s]), ('example.py', '"test" + "', None, [s]), ] ) diff --git a/test/test_evaluate/test_context.py b/test/test_evaluate/test_context.py index 27d83509..a5ed8ce0 100644 --- a/test/test_evaluate/test_context.py +++ b/test/test_evaluate/test_context.py @@ -1,3 +1,6 @@ +from jedi._compatibility import force_unicode + + def test_module_attributes(Script): def_, = Script('__name__').completions() assert def_.name == '__name__' @@ -10,9 +13,9 @@ def test_module_attributes(Script): def test_module__file__(Script, environment): assert not Script('__file__').goto_definitions() def_, = Script('__file__', path='example.py').goto_definitions() - value = def_._name._context.get_safe_value() + value = force_unicode(def_._name._context.get_safe_value()) assert value.endswith('example.py') def_, = Script('import antigravity; antigravity.__file__').goto_definitions() - value = def_._name._context.get_safe_value() + value = force_unicode(def_._name._context.get_safe_value()) assert value.endswith('.py')