mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-02-04 09:00:05 +08:00
186 lines
7.3 KiB
Python
186 lines
7.3 KiB
Python
import os
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from ..helpers import get_example_dir, set_cwd, root_dir, test_dir
|
|
from jedi import Interpreter
|
|
from jedi.api import Project, get_default_project
|
|
from jedi.api.project import _is_potential_project, _CONTAINS_POTENTIAL_PROJECT
|
|
|
|
|
|
def test_django_default_project(Script):
|
|
dir = get_example_dir('django')
|
|
|
|
script = Script(
|
|
"from app import models\nmodels.SomeMo",
|
|
path=os.path.join(dir, 'models/x.py')
|
|
)
|
|
c, = script.complete()
|
|
assert c.name == "SomeModel"
|
|
|
|
project = script._inference_state.project
|
|
assert project._django is True
|
|
assert project.sys_path is None
|
|
assert project.smart_sys_path is True
|
|
assert project.load_unsafe_extensions is False
|
|
|
|
|
|
def test_django_default_project_of_file(Script):
|
|
project = get_default_project(__file__)
|
|
assert project._path == Path(__file__).parent.parent.parent
|
|
|
|
|
|
def test_interpreter_project_path():
|
|
# Run from anywhere it should be the cwd.
|
|
dir = Path(root_dir).joinpath('test')
|
|
with set_cwd(dir):
|
|
project = Interpreter('', [locals()])._inference_state.project
|
|
assert project._path == dir
|
|
|
|
|
|
def test_added_sys_path(inference_state):
|
|
project = get_default_project()
|
|
p = '/some_random_path'
|
|
project.added_sys_path = [p]
|
|
assert p in project._get_sys_path(inference_state)
|
|
|
|
|
|
def test_load_save_project(tmpdir):
|
|
project = Project(tmpdir.strpath, added_sys_path=['/foo'])
|
|
project.save()
|
|
|
|
loaded = Project.load(tmpdir.strpath)
|
|
assert loaded.added_sys_path == ['/foo']
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
'string, full_names, kwargs', [
|
|
('test_load_save_project', ['test_api.test_project.test_load_save_project'], {}),
|
|
('test_load_savep', [], dict(complete=True)),
|
|
('test_load_save_p', ['test_api.test_project.test_load_save_project'],
|
|
dict(complete=True)),
|
|
('test_load_save_p', ['test_api.test_project.test_load_save_project'],
|
|
dict(complete=True, all_scopes=True)),
|
|
|
|
('some_search_test_var', [], {}),
|
|
('some_search_test_var', ['test_api.test_project.test_search.some_search_test_var'],
|
|
dict(all_scopes=True)),
|
|
('some_search_test_var', ['test_api.test_project.test_search.some_search_test_var'],
|
|
dict(complete=True, all_scopes=True)),
|
|
# Make sure that the searched name is not part of the file, by
|
|
# splitting it up.
|
|
('some_search_test_v' + 'a', ['test_api.test_project.test_search.some_search_test_var'],
|
|
dict(complete=True, all_scopes=True)),
|
|
|
|
('sample_int', ['helpers.sample_int'], {}),
|
|
('sample_int', ['helpers.sample_int'], dict(all_scopes=True)),
|
|
('sample_int.real', ['stub:builtins.int.real'], {}),
|
|
|
|
('class sample_int.real', [], {}),
|
|
('foo sample_int.real', [], {}),
|
|
('def sample_int.to_bytes', ['stub:builtins.int.to_bytes'], {}),
|
|
('function sample_int.to_bytes', ['stub:builtins.int.to_bytes'], {}),
|
|
('property sample_int.real', ['stub:builtins.int.real'], {}),
|
|
|
|
# With modules
|
|
('test_project.test_search', ['test_api.test_project.test_search'], {}),
|
|
('test_project.test_searc', ['test_api.test_project.test_search'], dict(complete=True)),
|
|
('test_api.test_project.test_search', ['test_api.test_project.test_search'], {}),
|
|
('test_api.test_project.test_sear', ['test_api.test_project.test_search'],
|
|
dict(complete=True)),
|
|
|
|
# With namespace
|
|
('implicit_namespace_package.ns1.pkg',
|
|
['examples.implicit_namespace_package.ns1.pkg'], {}),
|
|
('implicit_namespace_package.ns1.pkg.ns1_file',
|
|
['examples.implicit_namespace_package.ns1.pkg.ns1_file'], {}),
|
|
('examples.implicit_namespace_package.ns1.pkg.ns1_file',
|
|
['examples.implicit_namespace_package.ns1.pkg.ns1_file'], {}),
|
|
('implicit_namespace_package.ns1.pkg.',
|
|
['examples.implicit_namespace_package.ns1.pkg.ns1_file'],
|
|
dict(complete=True)),
|
|
('implicit_namespace_package.',
|
|
['examples.implicit_namespace_package.ns1',
|
|
'examples.implicit_namespace_package.ns2'],
|
|
dict(complete=True)),
|
|
|
|
# With stubs
|
|
('with_python.module', ['examples.stub_packages.with_python.module'], {}),
|
|
('with_python.modul', ['examples.stub_packages.with_python.module'],
|
|
dict(complete=True)),
|
|
('no_python.foo', ['stub:examples.stub_packages.no_python.foo'], {}),
|
|
('no_python.fo', ['stub:examples.stub_packages.no_python.foo'],
|
|
dict(complete=True)),
|
|
('with_python-stubs.module', [], {}),
|
|
('no_python-stubs.foo', [], {}),
|
|
# Both locations are given, because they live in separate folders (one
|
|
# suffixed with -stubs.
|
|
('with_python', ['examples.stub_packages.with_python'], {}),
|
|
('no_python', ['stub:examples.stub_packages.no_python'], {}),
|
|
# Completion stubs
|
|
('stub_only', ['stub:completion.stub_folder.stub_only',
|
|
'stub:examples.stub_packages.with_python.stub_only'], {}),
|
|
('with_stub', ['completion.stub_folder.with_stub'], {}),
|
|
('with_stub.in_with_stub_both',
|
|
['completion.stub_folder.with_stub.in_with_stub_both'], {}),
|
|
('with_stub.in_with_stub_python',
|
|
['completion.stub_folder.with_stub.in_with_stub_python'], {}),
|
|
('with_stub.in_with_stub_stub',
|
|
['stub:completion.stub_folder.with_stub.in_with_stub_stub'], {}),
|
|
# Completion stubs: Folder
|
|
('with_stub_folder', ['completion.stub_folder.with_stub_folder'], {}),
|
|
('with_stub_folder.nested_with_stub',
|
|
['completion.stub_folder.with_stub_folder.nested_with_stub'], {}),
|
|
('nested_with_stub',
|
|
['completion.stub_folder.stub_only_folder.nested_with_stub',
|
|
'completion.stub_folder.with_stub_folder.nested_with_stub'], {}),
|
|
|
|
# On sys path
|
|
('sys.path', ['stub:sys.path'], {}),
|
|
('json.dumps', ['json.dumps'], {}), # stdlib + stub
|
|
('multiprocessing', ['multiprocessing'], {}),
|
|
('multiprocessin', ['multiprocessing'], dict(complete=True)),
|
|
]
|
|
)
|
|
def test_search(string, full_names, kwargs):
|
|
some_search_test_var = 1.0
|
|
project = Project(test_dir)
|
|
if kwargs.pop('complete', False) is True:
|
|
defs = project.complete_search(string, **kwargs)
|
|
else:
|
|
defs = project.search(string, **kwargs)
|
|
assert sorted([('stub:' if d.is_stub() else '') + (d.full_name or d.name) for d in defs]) == full_names
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
'string, completions, all_scopes', [
|
|
('SomeCl', ['ass'], False),
|
|
('twic', [], False),
|
|
('twic', ['e', 'e'], True),
|
|
('test_load_save_p', ['roject'], False),
|
|
]
|
|
)
|
|
def test_complete_search(Script, string, completions, all_scopes):
|
|
project = Project(test_dir)
|
|
defs = project.complete_search(string, all_scopes=all_scopes)
|
|
assert [d.complete for d in defs] == completions
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
'path,expected', [
|
|
(Path(__file__).parents[2], True), # The path of the project
|
|
(Path(__file__).parents[1], False), # The path of the tests, not a project
|
|
(Path.home(), None)
|
|
]
|
|
)
|
|
def test_is_potential_project(path, expected):
|
|
|
|
if expected is None:
|
|
try:
|
|
expected = _CONTAINS_POTENTIAL_PROJECT in os.listdir(path)
|
|
except OSError:
|
|
expected = False
|
|
|
|
assert _is_potential_project(path) == expected
|