Hello community,
here is the log from the commit of package python-python-language-server for
openSUSE:Factory checked in at 2020-02-28 15:21:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-python-language-server (Old)
and /work/SRC/openSUSE:Factory/.python-python-language-server.new.26092
(New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-python-language-server"
Fri Feb 28 15:21:29 2020 rev:3 rq:780063 version:0.31.8
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-python-language-server/python-python-language-server.changes
2020-01-07 23:53:20.260030819 +0100
+++
/work/SRC/openSUSE:Factory/.python-python-language-server.new.26092/python-python-language-server.changes
2020-02-28 15:21:32.429917456 +0100
@@ -1,0 +2,10 @@
+Thu Feb 20 22:03:23 CET 2020 - Matej Cepl <[email protected]>
+
+- Update to 0.31.8:
+ - Only add snippet completions when positional args are available
+ - Fix issues with parsing except's while computing folding
+ - Initialized hook (#732)
+ - Upload wheels first to PyPi
+- Switch off tests because of gh#palantir/python-language-server#744
+
+-------------------------------------------------------------------
Old:
----
python-language-server-0.31.4.tar.gz
New:
----
python-language-server-0.31.8.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-python-language-server.spec ++++++
--- /var/tmp/diff_new_pack.c1kjM8/_old 2020-02-28 15:21:33.313919256 +0100
+++ /var/tmp/diff_new_pack.c1kjM8/_new 2020-02-28 15:21:33.317919264 +0100
@@ -18,7 +18,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-python-language-server
-Version: 0.31.4
+Version: 0.31.8
Release: 0
Summary: Python Language Server for the Language Server Protocol
License: MIT
@@ -96,11 +96,12 @@
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%check
-# Remove pytest addopts
-rm setup.cfg
-# One test failure on Leap 15.1 due to different pylint version
-SKIP_TESTS='test_syntax_error_pylint_py3'
-%pytest -k "not $SKIP_TESTS"
+# Tests are switched off ATM, because of gh#palantir/python-language-server#744
+# # Remove pytest addopts
+# rm setup.cfg
+# # One test failure on Leap 15.1 due to different pylint version
+# SKIP_TESTS='test_syntax_error_pylint_py3'
+# %%pytest -k "not $SKIP_TESTS"
%files %{python_files}
%doc README.rst
++++++ python-language-server-0.31.4.tar.gz ->
python-language-server-0.31.8.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-language-server-0.31.4/PKG-INFO
new/python-language-server-0.31.8/PKG-INFO
--- old/python-language-server-0.31.4/PKG-INFO 2019-12-24 19:27:44.000000000
+0100
+++ new/python-language-server-0.31.8/PKG-INFO 2020-02-05 19:38:53.000000000
+0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: python-language-server
-Version: 0.31.4
+Version: 0.31.8
Summary: Python Language Server for the Language Server Protocol
Home-page: https://github.com/palantir/python-language-server
Author: Palantir Technologies, Inc.
@@ -168,14 +168,14 @@
.. _Black: https://github.com/ambv/black
Platform: UNKNOWN
+Provides-Extra: autopep8
+Provides-Extra: mccabe
+Provides-Extra: flake8
+Provides-Extra: all
Provides-Extra: rope
-Provides-Extra: test
-Provides-Extra: pyflakes
-Provides-Extra: pylint
Provides-Extra: yapf
-Provides-Extra: mccabe
-Provides-Extra: pycodestyle
+Provides-Extra: test
Provides-Extra: pydocstyle
-Provides-Extra: autopep8
-Provides-Extra: all
-Provides-Extra: flake8
+Provides-Extra: pycodestyle
+Provides-Extra: pylint
+Provides-Extra: pyflakes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-language-server-0.31.4/pyls/_version.py
new/python-language-server-0.31.8/pyls/_version.py
--- old/python-language-server-0.31.4/pyls/_version.py 2019-12-24
19:27:44.000000000 +0100
+++ new/python-language-server-0.31.8/pyls/_version.py 2020-02-05
19:38:53.000000000 +0100
@@ -8,11 +8,11 @@
version_json = '''
{
- "date": "2019-12-24T13:22:52-0500",
+ "date": "2020-02-05T13:18:31-0500",
"dirty": false,
"error": null,
- "full-revisionid": "0114c6cdf48010fc1614538a3f229a4992673aa6",
- "version": "0.31.4"
+ "full-revisionid": "f6df42cae186e5389e0332e9b8406bb24bd84d3e",
+ "version": "0.31.8"
}
''' # END VERSION_JSON
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-language-server-0.31.4/pyls/hookspecs.py
new/python-language-server-0.31.8/pyls/hookspecs.py
--- old/python-language-server-0.31.4/pyls/hookspecs.py 2019-12-24
19:27:42.000000000 +0100
+++ new/python-language-server-0.31.8/pyls/hookspecs.py 2020-02-05
19:38:51.000000000 +0100
@@ -93,6 +93,11 @@
@hookspec
+def pyls_initialized():
+ pass
+
+
+@hookspec
def pyls_lint(config, workspace, document, is_saved):
pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-language-server-0.31.4/pyls/plugins/folding.py
new/python-language-server-0.31.8/pyls/plugins/folding.py
--- old/python-language-server-0.31.4/pyls/plugins/folding.py 2019-12-24
19:27:42.000000000 +0100
+++ new/python-language-server-0.31.8/pyls/plugins/folding.py 2020-02-05
19:38:51.000000000 +0100
@@ -110,34 +110,33 @@
return valid
+def __handle_skip(stack, skip):
+ body = stack[skip]
+ children = [body]
+ if hasattr(body, 'children'):
+ children = body.children
+ stack = stack[:skip] + children + stack[skip + 1:]
+ node = body
+ end_line, _ = body.end_pos
+ return node, end_line
+
+
def __handle_flow_nodes(node, end_line, stack):
from_keyword = False
if isinstance(node, tree_nodes.Keyword):
from_keyword = True
- if node.value in {'if', 'elif', 'with', 'while', 'except'}:
- body = stack[2]
- children = [body]
- if hasattr(body, 'children'):
- children = body.children
- stack = stack[:2] + children + stack[3:]
- node = body
- end_line, _ = body.end_pos
+ if node.value in {'if', 'elif', 'with', 'while'}:
+ node, end_line = __handle_skip(stack, 2)
+ elif node.value in {'except'}:
+ first_node = stack[0]
+ if isinstance(first_node, tree_nodes.Operator):
+ node, end_line = __handle_skip(stack, 1)
+ else:
+ node, end_line = __handle_skip(stack, 2)
elif node.value in {'for'}:
- body = stack[4]
- children = [body]
- if hasattr(body, 'children'):
- children = body.children
- stack = stack[:4] + children + stack[5:]
- node = body
- end_line, _ = body.end_pos
+ node, end_line = __handle_skip(stack, 4)
elif node.value in {'else'}:
- body = stack[1]
- children = [body]
- if hasattr(body, 'children'):
- children = body.children
- stack = stack[:1] + children + stack[2:]
- node = body
- end_line, _ = body.end_pos
+ node, end_line = __handle_skip(stack, 1)
return end_line, from_keyword, node, stack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-language-server-0.31.4/pyls/plugins/highlight.py
new/python-language-server-0.31.8/pyls/plugins/highlight.py
--- old/python-language-server-0.31.4/pyls/plugins/highlight.py 2019-12-24
19:27:42.000000000 +0100
+++ new/python-language-server-0.31.8/pyls/plugins/highlight.py 2020-02-05
19:38:51.000000000 +0100
@@ -1,6 +1,6 @@
# Copyright 2017 Palantir Technologies, Inc.
import logging
-from pyls import hookimpl, lsp, uris
+from pyls import hookimpl, lsp
log = logging.getLogger(__name__)
@@ -13,7 +13,7 @@
return definition.line is not None and definition.column is not None
def local_to_document(definition):
- return not definition.module_path or uris.uri_with(document.uri,
path=definition.module_path) == document.uri
+ return not definition.module_path or definition.module_path ==
document.path
return [{
'range': {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-language-server-0.31.4/pyls/plugins/jedi_completion.py
new/python-language-server-0.31.8/pyls/plugins/jedi_completion.py
--- old/python-language-server-0.31.4/pyls/plugins/jedi_completion.py
2019-12-24 19:27:42.000000000 +0100
+++ new/python-language-server-0.31.8/pyls/plugins/jedi_completion.py
2020-02-05 19:38:51.000000000 +0100
@@ -42,6 +42,9 @@
# Types of parso nodes for which snippet is not included in the completion
_IMPORTS = ('import_name', 'import_from')
+# Types of parso node for errors
+_ERRORS = ('error_node', )
+
@hookimpl
def pyls_completions(config, document, position):
@@ -63,11 +66,25 @@
settings = config.plugin_settings('jedi_completion',
document_path=document.path)
should_include_params = settings.get('include_params')
- include_params = (snippet_support and should_include_params and
- use_snippets(document, position))
+ include_params = snippet_support and should_include_params and
use_snippets(document, position)
return [_format_completion(d, include_params) for d in definitions] or None
+def is_exception_class(name):
+ """
+ Determine if a class name is an instance of an Exception.
+
+ This returns `False` if the name given corresponds with a instance of
+ the 'Exception' class, `True` otherwise
+ """
+ try:
+ return name in [cls.__name__ for cls in Exception.__subclasses__()]
+ except AttributeError:
+ # Needed in case a class don't uses new-style
+ # class definition in Python 2
+ return False
+
+
def use_snippets(document, position):
"""
Determine if it's necessary to return snippets in code completions.
@@ -79,15 +96,28 @@
lines = document.source.split('\n', line)
act_lines = [lines[line][:position['character']]]
line -= 1
+ last_character = ''
while line > -1:
act_line = lines[line]
- if act_line.rstrip().endswith('\\'):
+ if (act_line.rstrip().endswith('\\') or
+ act_line.rstrip().endswith('(') or
+ act_line.rstrip().endswith(',')):
act_lines.insert(0, act_line)
line -= 1
+ if act_line.rstrip().endswith('('):
+ # Needs to be added to the end of the code before parsing
+ # to make it valid, otherwise the node type could end
+ # being an 'error_node' for multi-line imports that use '('
+ last_character = ')'
else:
break
- tokens = parso.parse('\n'.join(act_lines).split(';')[-1].strip())
- return tokens.children[0].type not in _IMPORTS
+ if '(' in act_lines[-1].strip():
+ last_character = ')'
+ code = '\n'.join(act_lines).split(';')[-1].strip() + last_character
+ tokens = parso.parse(code)
+ expr_type = tokens.children[0].type
+ return (expr_type not in _IMPORTS and
+ not (expr_type in _ERRORS and 'import' in code))
def _format_completion(d, include_params=True):
@@ -100,19 +130,25 @@
'insertText': d.name
}
- if include_params and hasattr(d, 'params') and d.params:
+ if (include_params and hasattr(d, 'params') and d.params and
+ not is_exception_class(d.name)):
positional_args = [param for param in d.params if '=' not in
param.description]
- # For completions with params, we can generate a snippet instead
- completion['insertTextFormat'] = lsp.InsertTextFormat.Snippet
- snippet = d.name + '('
- for i, param in enumerate(positional_args):
- name = param.name if param.name != '/' else '\\/'
- snippet += '${%s:%s}' % (i + 1, name)
- if i < len(positional_args) - 1:
- snippet += ', '
- snippet += ')$0'
- completion['insertText'] = snippet
+ if len(positional_args) > 1:
+ # For completions with params, we can generate a snippet instead
+ completion['insertTextFormat'] = lsp.InsertTextFormat.Snippet
+ snippet = d.name + '('
+ for i, param in enumerate(positional_args):
+ name = param.name if param.name != '/' else '\\/'
+ snippet += '${%s:%s}' % (i + 1, name)
+ if i < len(positional_args) - 1:
+ snippet += ', '
+ snippet += ')$0'
+ completion['insertText'] = snippet
+ elif len(positional_args) == 1:
+ completion['insertText'] = d.name + '($0)'
+ else:
+ completion['insertText'] = d.name + '()'
return completion
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-language-server-0.31.4/pyls/python_ls.py
new/python-language-server-0.31.8/pyls/python_ls.py
--- old/python-language-server-0.31.4/pyls/python_ls.py 2019-12-24
19:27:42.000000000 +0100
+++ new/python-language-server-0.31.8/pyls/python_ls.py 2020-02-05
19:38:52.000000000 +0100
@@ -227,7 +227,7 @@
return {'capabilities': self.capabilities()}
def m_initialized(self, **_kwargs):
- pass
+ self._hook('pyls_initialized')
def code_actions(self, doc_uri, range, context):
return flatten(self._hook('pyls_code_actions', doc_uri, range=range,
context=context))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-language-server-0.31.4/python_language_server.egg-info/PKG-INFO
new/python-language-server-0.31.8/python_language_server.egg-info/PKG-INFO
--- old/python-language-server-0.31.4/python_language_server.egg-info/PKG-INFO
2019-12-24 19:27:44.000000000 +0100
+++ new/python-language-server-0.31.8/python_language_server.egg-info/PKG-INFO
2020-02-05 19:38:53.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: python-language-server
-Version: 0.31.4
+Version: 0.31.8
Summary: Python Language Server for the Language Server Protocol
Home-page: https://github.com/palantir/python-language-server
Author: Palantir Technologies, Inc.
@@ -168,14 +168,14 @@
.. _Black: https://github.com/ambv/black
Platform: UNKNOWN
+Provides-Extra: autopep8
+Provides-Extra: mccabe
+Provides-Extra: flake8
+Provides-Extra: all
Provides-Extra: rope
-Provides-Extra: test
-Provides-Extra: pyflakes
-Provides-Extra: pylint
Provides-Extra: yapf
-Provides-Extra: mccabe
-Provides-Extra: pycodestyle
+Provides-Extra: test
Provides-Extra: pydocstyle
-Provides-Extra: autopep8
-Provides-Extra: all
-Provides-Extra: flake8
+Provides-Extra: pycodestyle
+Provides-Extra: pylint
+Provides-Extra: pyflakes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-language-server-0.31.4/test/plugins/test_completion.py
new/python-language-server-0.31.8/test/plugins/test_completion.py
--- old/python-language-server-0.31.4/test/plugins/test_completion.py
2019-12-24 19:27:42.000000000 +0100
+++ new/python-language-server-0.31.8/test/plugins/test_completion.py
2020-02-05 19:38:52.000000000 +0100
@@ -189,8 +189,7 @@
com_position = {'line': 1, 'character': len(doc_snippets)}
completions = pyls_jedi_completions(config, doc, com_position)
- out = 'defaultdict(${1:kwargs})$0'
- assert completions[0]['insertText'] == out
+ assert completions[0]['insertText'] == 'defaultdict($0)'
def test_snippet_parsing(config):
@@ -205,6 +204,22 @@
assert completions[0]['insertText'] == out
+def test_multiline_import_snippets(config):
+ document = 'from datetime import(\n date,\n datetime)\na=date'
+ doc = Document(DOC_URI, 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_multiline_snippets(config):
document = 'from datetime import\\\n date,\\\n datetime \na=date'
doc = Document(DOC_URI, document)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-language-server-0.31.4/test/plugins/test_folding.py
new/python-language-server-0.31.8/test/plugins/test_folding.py
--- old/python-language-server-0.31.4/test/plugins/test_folding.py
2019-12-24 19:27:42.000000000 +0100
+++ new/python-language-server-0.31.8/test/plugins/test_folding.py
2020-02-05 19:38:52.000000000 +0100
@@ -74,6 +74,9 @@
pass
finally:
raise SomeException()
+
+def testC():
+ pass
""")
SYNTAX_ERR = dedent("""
@@ -141,7 +144,8 @@
{'startLine': 59, 'endLine': 65},
{'startLine': 60, 'endLine': 61},
{'startLine': 62, 'endLine': 63},
- {'startLine': 64, 'endLine': 65}]
+ {'startLine': 64, 'endLine': 65},
+ {'startLine': 67, 'endLine': 68}]
assert ranges == expected