1
0
forked from VimPlug/jedi

Implement all remaining Path issues and use it instead of strings

This commit is contained in:
Dave Halter
2020-07-12 01:14:00 +02:00
parent db0e90763b
commit 480a464179
23 changed files with 131 additions and 97 deletions

View File

@@ -142,7 +142,7 @@ class Script(object):
if project is None:
# Load the Python grammar of the current interpreter.
project = get_default_project(self.path)
project = get_default_project(None if self.path is None else self.path.parent)
# TODO deprecate and remove sys_path from the Script API.
if sys_path is not None:
project._sys_path = sys_path
@@ -192,7 +192,7 @@ class Script(object):
file_io = None
else:
file_io = KnownContentFileIO(cast_path(self.path), self._code)
if self.path is not None and self.path.suffix == 'pyi':
if self.path is not None and self.path.suffix == '.pyi':
# We are in a stub file. Try to load the stub properly.
stub_module = load_proper_stub_module(
self._inference_state,

View File

@@ -15,6 +15,7 @@ the interesting information about all operations.
"""
import re
import warnings
from typing import Optional
from parso.python.tree import search_ancestor
@@ -92,7 +93,7 @@ class BaseName(object):
return self._name.get_root_context()
@property
def module_path(self):
def module_path(self) -> Optional[str]:
"""
Shows the file path of a module. e.g. ``/usr/lib/python3.9/os.py``
@@ -102,7 +103,9 @@ class BaseName(object):
if module.is_stub() or not module.is_compiled():
# Compiled modules should not return a module path even if they
# have one.
return self._get_module_context().py__file__()
path = self._get_module_context().py__file__()
if path is not None:
return path
return None

View File

@@ -44,7 +44,7 @@ def match(string, like_name, fuzzy=False):
def sorted_definitions(defs):
# Note: `or ''` below is required because `module_path` could be
return sorted(defs, key=lambda x: (str(x.module_path) or '',
return sorted(defs, key=lambda x: (str(x.module_path or ''),
x.line or 0,
x.column or 0,
x.name))

View File

@@ -80,6 +80,8 @@ class Project(object):
:param path: The path of the directory you want to use as a project.
"""
if isinstance(path, str):
path = Path(path)
with open(cls._get_json_path(path)) as f:
version, data = json.load(f)
@@ -98,8 +100,9 @@ class Project(object):
data.pop('_environment', None)
data.pop('_django', None) # TODO make django setting public?
data = {k.lstrip('_'): v for k, v in data.items()}
data['path'] = str(data['path'])
self._path.mkdir(parents=True, exist_ok=True)
self._get_config_folder_path(self._path).mkdir(parents=True, exist_ok=True)
with open(self._get_json_path(self._path), 'w') as f:
return json.dump((_SERIALIZER_VERSION, data), f)
@@ -129,11 +132,15 @@ class Project(object):
self._path = path
self._environment_path = environment_path
if sys_path is not None:
# Remap potential pathlib.Path entries
sys_path = list(map(str, sys_path))
self._sys_path = sys_path
self._smart_sys_path = smart_sys_path
self._load_unsafe_extensions = load_unsafe_extensions
self._django = False
self.added_sys_path = list(added_sys_path)
# Remap potential pathlib.Path entries
self.added_sys_path = list(map(str, added_sys_path))
"""The sys path that is going to be added at the end of the """
py2_comp(path, **kwargs)
@@ -173,10 +180,10 @@ class Project(object):
prefixed.append(str(self._path))
if inference_state.script_path is not None:
suffixed += discover_buildout_paths(
suffixed += map(str, discover_buildout_paths(
inference_state,
inference_state.script_path
)
))
if add_parent_paths:
# Collect directories in upward search by:
@@ -362,6 +369,8 @@ def get_default_project(path=None):
"""
if path is None:
path = Path.cwd()
elif isinstance(path, str):
path = Path(path)
check = path.absolute()
probable_path = None
@@ -379,7 +388,7 @@ def get_default_project(path=None):
# In the case that a __init__.py exists, it's in 99% just a
# Python package and the project sits at least one level above.
continue
else:
elif not dir.is_file():
first_no_init_file = dir
if _is_django_path(dir):

View File

@@ -1,4 +1,6 @@
import difflib
from pathlib import Path
from typing import Dict
from parso import split_lines
@@ -47,8 +49,8 @@ class ChangedFile(object):
to_p = self._to_path.relative_to(project_path)
diff = difflib.unified_diff(
old_lines, new_lines,
fromfile=from_p,
tofile=to_p,
fromfile=str(from_p),
tofile=str(to_p),
)
# Apparently there's a space at the end of the diff - for whatever
# reason.
@@ -76,17 +78,15 @@ class Refactoring(object):
self._renames = renames
self._file_to_node_changes = file_to_node_changes
def get_changed_files(self):
"""
Returns a path to ``ChangedFile`` map.
"""
def get_changed_files(self) -> Dict[Path, ChangedFile]:
def calculate_to_path(p):
if p is None:
return p
p = str(p)
for from_, to in renames:
if p.startswith(from_):
p = to + p[len(from_):]
return p
if p.startswith(str(from_)):
p = str(to) + p[len(str(from_)):]
return Path(p)
renames = self.get_renames()
return {
@@ -144,7 +144,8 @@ def rename(inference_state, definitions, new_name):
for d in definitions:
tree_name = d._name.tree_name
if d.type == 'module' and tree_name is None:
file_renames.add(_calculate_rename(d.module_path, new_name))
p = None if d.module_path is None else Path(d.module_path)
file_renames.add(_calculate_rename(p, new_name))
else:
# This private access is ok in a way. It's not public to
# protect Jedi users from seeing it.