def test_jedi_method_completion(config): # Over the 'y' in 'print Hello().every' com_position = {'line': 20, 'character': 19} doc = Document(DOC_URI, DOC) completions = pyls_jedi_completions(config, doc, com_position) everyone_method = [ completion for completion in completions if completion['label'] == 'everyone(a, b, c, d)' ][0] assert everyone_method['insertTextFormat'] == lsp.InsertTextFormat.Snippet assert everyone_method[ 'insertText'] == 'everyone(${1:a}, ${2:b}, ${3:c}, ${4:d})$0' # Disable param snippets config.update({'plugins': {'jedi_completion': {'include_params': False}}}) completions = pyls_jedi_completions(config, doc, com_position) everyone_method = [ completion for completion in completions if completion['label'] == 'everyone(a, b, c, d)' ][0] assert 'insertTextFormat' not in everyone_method assert everyone_method['insertText'] == 'everyone'
def test_jedi_completion_extra_paths(config, tmpdir, workspace): # Create a tempfile with some content and pass to extra_paths temp_doc_content = ''' def spam(): pass ''' p = tmpdir.mkdir("extra_path") extra_paths = [str(p)] p = p.join("foo.py") p.write(temp_doc_content) # Content of doc to test completion doc_content = """import foo foo.s""" doc = Document(DOC_URI, workspace, doc_content) # After 'foo.s' without extra paths com_position = {'line': 1, 'character': 5} completions = pyls_jedi_completions(config, doc, com_position) assert completions is None # Update config extra paths config.update({'plugins': {'jedi': {'extra_paths': extra_paths}}}) doc.update_config(config) # After 'foo.s' with extra paths com_position = {'line': 1, 'character': 5} completions = pyls_jedi_completions(config, doc, com_position) assert completions[0]['label'] == 'spam()'
def test_jedi_completion_environment(config): # Content of doc to test completion doc_content = '''import logh ''' doc = Document(DOC_URI, MockWorkspace(), doc_content) # After 'import logh' with default environment com_position = {'line': 0, 'character': 11} assert os.path.isdir('/tmp/pyenv/') config.update({'plugins': {'jedi': {'environment': None}}}) doc.update_config(config) completions = pyls_jedi_completions(config, doc, com_position) assert completions is None # Update config extra environment env_path = '/tmp/pyenv/bin/python' config.update({'plugins': {'jedi': {'environment': env_path}}}) doc.update_config(config) # After 'import logh' with new environment completions = pyls_jedi_completions(config, doc, com_position) assert completions[0]['label'] == 'loghub' assert 'changelog generator' in completions[0]['documentation'].lower()
def test_jedi_method_completion(config, workspace): # Over the 'y' in 'print Hello().every' com_position = {'line': 20, 'character': 19} doc = Document(DOC_URI, workspace, DOC) config.capabilities['textDocument'] = { 'completion': { 'completionItem': { 'snippetSupport': True } } } config.update({'plugins': {'jedi_completion': {'include_params': True}}}) completions = pyls_jedi_completions(config, doc, com_position) everyone_method = [ completion for completion in completions if completion['label'] == 'everyone(a, b, c, d)' ][0] # Ensure we only generate snippets for positional args assert everyone_method['insertTextFormat'] == lsp.InsertTextFormat.Snippet assert everyone_method['insertText'] == 'everyone(${1:a}, ${2:b})$0' # Disable param snippets config.update({'plugins': {'jedi_completion': {'include_params': False}}}) completions = pyls_jedi_completions(config, doc, com_position) everyone_method = [ completion for completion in completions if completion['label'] == 'everyone(a, b, c, d)' ][0] assert 'insertTextFormat' not in everyone_method assert everyone_method['insertText'] == 'everyone'
def test_jedi_completion(): # Over 'i' in os.path.isabs(...) com_position = {'line': 1, 'character': 15} doc = Document(DOC_URI, DOC) items = pyls_jedi_completions(doc, com_position) assert items assert items[0]['label'] == 'isabs(s)' # Test we don't throw with big character pyls_jedi_completions(doc, {'line': 1, 'character': 1000})
def test_jedi_completion(config, workspace): # Over 'i' in os.path.isabs(...) com_position = {'line': 1, 'character': 15} doc = Document(DOC_URI, workspace, DOC) items = pyls_jedi_completions(config, doc, com_position) assert items labels = [i['label'] for i in items] assert 'isabs(path)' in labels # Test we don't throw with big character pyls_jedi_completions(config, doc, {'line': 1, 'character': 1000})
def test_snippets_completion(config, workspace): doc_snippets = 'from collections import defaultdict \na=defaultdict' com_position = {'line': 0, 'character': 35} doc = Document(DOC_URI, workspace, doc_snippets) config.capabilities['textDocument'] = { 'completion': {'completionItem': {'snippetSupport': True}}} config.update({'plugins': {'jedi_completion': {'include_params': True}}}) completions = pyls_jedi_completions(config, doc, com_position) assert completions[0]['insertText'] == 'defaultdict' com_position = {'line': 1, 'character': len(doc_snippets)} completions = pyls_jedi_completions(config, doc, com_position) assert completions[0]['insertText'] == 'defaultdict($0)'
def test_jedi_completion_with_fuzzy_enabled(config, workspace): # Over 'i' in os.path.isabs(...) config.update({'plugins': {'jedi_completion': {'fuzzy': True}}}) com_position = {'line': 1, 'character': 15} doc = Document(DOC_URI, workspace, DOC) items = pyls_jedi_completions(config, doc, com_position) assert items assert items[0]['label'] == 'commonprefix(list)' # Test we don't throw with big character pyls_jedi_completions(config, doc, {'line': 1, 'character': 1000})
def test_multiline_snippets(config, workspace): document = 'from datetime import\\\n date,\\\n datetime \na=date' doc = Document(DOC_URI, workspace, document) config.capabilities['textDocument'] = { 'completion': {'completionItem': {'snippetSupport': True}}} config.update({'plugins': {'jedi_completion': {'include_params': True}}}) position = {'line': 1, 'character': 5} completions = pyls_jedi_completions(config, doc, position) assert completions[0]['insertText'] == 'date' position = {'line': 2, 'character': 9} completions = pyls_jedi_completions(config, doc, position) assert completions[0]['insertText'] == 'datetime'
def test_completion_with_class_objects(config, workspace): doc_text = 'class FOOBAR(Object): pass\nFOOB' com_position = {'line': 1, 'character': 4} doc = Document(DOC_URI, workspace, doc_text) config.capabilities['textDocument'] = { 'completion': { 'completionItem': { 'snippetSupport': True } } } config.update({ 'plugins': { 'jedi_completion': { 'include_params': True, 'include_class_objects': True, } } }) completions = pyls_jedi_completions(config, doc, com_position) assert len(completions) == 2 assert completions[0]['label'] == 'FOOBAR' assert completions[0]['kind'] == lsp.CompletionItemKind.Class assert completions[1]['label'] == 'FOOBAR object' assert completions[1]['kind'] == lsp.CompletionItemKind.TypeParameter
def test_multistatement_snippet(config, workspace): config.capabilities['textDocument'] = { 'completion': {'completionItem': {'snippetSupport': True}}} config.update({'plugins': {'jedi_completion': {'include_params': True}}}) document = 'a = 1; from datetime import date' doc = Document(DOC_URI, workspace, document) position = {'line': 0, 'character': len(document)} completions = pyls_jedi_completions(config, doc, position) assert completions[0]['insertText'] == 'date' document = 'from datetime import date; a = date' doc = Document(DOC_URI, workspace, document) position = {'line': 0, 'character': len(document)} completions = pyls_jedi_completions(config, doc, position) assert completions[0]['insertText'] == 'date(${1:year}, ${2:month}, ${3:day})$0'
def test_jedi_completion(): # Over 'i' in os.path.isabs(...) com_position = {'line': 1, 'character': 15} doc = Document(DOC_URI, DOC) items = pyls_jedi_completions(doc, com_position) assert len(items) > 0 assert items[0]['label'] == 'isabs(s)'
def test_pandas_completions(config, workspace): doc_pandas = "import pandas as pd; pd." com_position = {'line': 0, 'character': len(doc_pandas)} doc = Document(DOC_URI, workspace, doc_pandas) items = pyls_jedi_completions(config, doc, com_position) assert items assert any(['DataFrame' in i['label'] for i in items])
def test_numpy_completions(config, workspace): doc_numpy = "import numpy as np; np." com_position = {'line': 0, 'character': len(doc_numpy)} doc = Document(DOC_URI, workspace, doc_numpy) items = pyls_jedi_completions(config, doc, com_position) assert items assert any(['array' in i['label'] for i in items])
def test_pyqt_completion(config, workspace): # Over 'QA' in 'from PyQt5.QtWidgets import QApplication' doc_pyqt = "from PyQt5.QtWidgets import QA" com_position = {'line': 0, 'character': len(doc_pyqt)} doc = Document(DOC_URI, workspace, doc_pyqt) completions = pyls_jedi_completions(config, doc, com_position) assert completions is not None
def test_pyqt_completion(config): # Over 'QA' in 'from PyQt5.QtWidgets import QApplication' doc_pyqt = "from PyQt5.QtWidgets import QA" com_position = {'line': 0, 'character': len(doc_pyqt)} doc = Document(DOC_URI, doc_pyqt) # Test we don't throw importing elements from PyQt5 assert pyls_jedi_completions(config, doc, com_position) is None
def test_matplotlib_completions(config, workspace): doc_mpl = "import matplotlib.pyplot as plt; plt." com_position = {'line': 0, 'character': len(doc_mpl)} doc = Document(DOC_URI, workspace, doc_mpl) items = pyls_jedi_completions(config, doc, com_position) assert items assert any(['plot' in i['label'] for i in items])
def test_jedi_completion_ordering(): # Over the blank line com_position = {'line': 8, 'character': 0} doc = Document(DOC_URI, DOC) completions = pyls_jedi_completions(doc, com_position) items = {c['label']: c['sortText'] for c in completions} # And that 'hidden' functions come after unhidden ones assert items['hello()'] < items['_a_hello()']
def test_jedi_property_completion(): # Over the 'w' in 'print Hello().world' com_position = {'line': 15, 'character': 15} doc = Document(DOC_URI, DOC) completions = pyls_jedi_completions(doc, com_position) items = {c['label']: c['sortText'] for c in completions} # Ensure we can complete the 'world' property assert 'world' in items
def test_jedi_property_completion(config, workspace): # Over the 'w' in 'print Hello().world' com_position = {'line': 18, 'character': 15} doc = Document(DOC_URI, workspace, DOC) completions = pyls_jedi_completions(config, doc, com_position) items = {c['label']: c['sortText'] for c in completions} # Ensure we can complete the 'world' property assert 'world' in list(items.keys())[0]
def test_snippet_parsing(config, workspace): doc = 'import numpy as np\nnp.logical_and' completion_position = {'line': 1, 'character': 14} doc = Document(DOC_URI, workspace, doc) config.capabilities['textDocument'] = { 'completion': {'completionItem': {'snippetSupport': True}}} config.update({'plugins': {'jedi_completion': {'include_params': True}}}) completions = pyls_jedi_completions(config, doc, completion_position) out = 'logical_and(${1:x1}, ${2:x2})$0' assert completions[0]['insertText'] == out
def test_jedi_completion_ordering(): # Over the blank line com_position = {'line': 8, 'character': 0} doc = Document(DOC_URI, DOC) completions = pyls_jedi_completions(doc, com_position) items = {c['label']: c['sortText'] for c in completions} # Assert that builtins come after our own functions even if alphabetically they're before assert items['hello()'] < items['dict'] # And that 'hidden' functions come after unhidden ones assert items['hello()'] < items['_a_hello()']
def test_pyqt_completion(config): # Over 'QA' in 'from PyQt5.QtWidgets import QApplication' doc_pyqt = "from PyQt5.QtWidgets import QA" com_position = {'line': 0, 'character': len(doc_pyqt)} doc = Document(DOC_URI, doc_pyqt) completions = pyls_jedi_completions(config, doc, com_position) # Test we don't throw an error for Jedi < 0.15.2 and get completions # for Jedi 0.15.2+ if LooseVersion(JEDI_VERSION) < LooseVersion('0.15.2'): assert completions is None else: assert completions is not None
def test_document_path_completions(tmpdir, workspace_other_root_path): # Create a dummy module out of the workspace's root_path and try to get # completions for it in another file placed next to it. module_content = ''' def foo(): pass ''' p = tmpdir.join("mymodule.py") p.write(module_content) # Content of doc to test completion doc_content = """import mymodule mymodule.f""" doc_path = str(tmpdir) + os.path.sep + 'myfile.py' doc_uri = uris.from_fs_path(doc_path) doc = Document(doc_uri, workspace_other_root_path, doc_content) com_position = {'line': 1, 'character': 10} completions = pyls_jedi_completions(doc._config, doc, com_position) assert completions[0]['label'] == 'foo()'