forked from pool/python-rope
Python38-compatibility.patch to deal with various deprecated warnings. - Switch off three tests to make the test suite pass under Python 3.8. OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-rope?expand=0&rev=35
200 lines
7.0 KiB
Diff
200 lines
7.0 KiB
Diff
--- a/rope/base/ast.py
|
|
+++ b/rope/base/ast.py
|
|
@@ -1,5 +1,6 @@
|
|
-import _ast
|
|
-from _ast import *
|
|
+from __future__ import absolute_import
|
|
+import ast
|
|
+from ast import *
|
|
|
|
from rope.base import fscommands
|
|
|
|
@@ -18,7 +19,7 @@ def parse(source, filename='<string>'):
|
|
if not source.endswith(b'\n'):
|
|
source += b'\n'
|
|
try:
|
|
- return compile(source, filename, 'exec', _ast.PyCF_ONLY_AST)
|
|
+ return ast.parse(source, filename='<unknown>')
|
|
except (TypeError, ValueError) as e:
|
|
error = SyntaxError()
|
|
error.lineno = 1
|
|
@@ -32,7 +33,7 @@ def walk(node, walker):
|
|
method_name = '_' + node.__class__.__name__
|
|
method = getattr(walker, method_name, None)
|
|
if method is not None:
|
|
- if isinstance(node, _ast.ImportFrom) and node.module is None:
|
|
+ if isinstance(node, ast.ImportFrom) and node.module is None:
|
|
# In python < 2.7 ``node.module == ''`` for relative imports
|
|
# but for python 2.7 it is None. Generalizing it to ''.
|
|
node.module = ''
|
|
@@ -42,7 +43,7 @@ def walk(node, walker):
|
|
|
|
|
|
def get_child_nodes(node):
|
|
- if isinstance(node, _ast.Module):
|
|
+ if isinstance(node, ast.Module):
|
|
return node.body
|
|
result = []
|
|
if node._fields is not None:
|
|
@@ -50,9 +51,9 @@ def get_child_nodes(node):
|
|
child = getattr(node, name)
|
|
if isinstance(child, list):
|
|
for entry in child:
|
|
- if isinstance(entry, _ast.AST):
|
|
+ if isinstance(entry, ast.AST):
|
|
result.append(entry)
|
|
- if isinstance(child, _ast.AST):
|
|
+ if isinstance(child, ast.AST):
|
|
result.append(child)
|
|
return result
|
|
|
|
--- a/rope/base/oi/type_hinting/utils.py
|
|
+++ b/rope/base/oi/type_hinting/utils.py
|
|
@@ -1,8 +1,12 @@
|
|
-import rope.base.builtins
|
|
+import logging
|
|
+try:
|
|
+ from typing import Union, Optional
|
|
+except ImportError:
|
|
+ pass
|
|
import rope.base.utils as base_utils
|
|
from rope.base.evaluate import ScopeNameFinder
|
|
from rope.base.exceptions import AttributeNotFoundError
|
|
-from rope.base.pyobjects import PyClass, PyFunction
|
|
+from rope.base.pyobjects import PyClass, PyDefinedObject, PyFunction, PyObject
|
|
from rope.base.utils import pycompat
|
|
|
|
|
|
@@ -66,33 +70,47 @@ def get_lineno_for_node(assign_node):
|
|
|
|
def get_mro(pyclass):
|
|
# FIXME: to use real mro() result
|
|
- l = [pyclass]
|
|
- for cls in l:
|
|
+ class_list = [pyclass]
|
|
+ for cls in class_list:
|
|
for super_cls in cls.get_superclasses():
|
|
- if isinstance(super_cls, PyClass) and super_cls not in l:
|
|
- l.append(super_cls)
|
|
- return l
|
|
+ if isinstance(super_cls, PyClass) and super_cls not in class_list:
|
|
+ class_list.append(super_cls)
|
|
+ return class_list
|
|
|
|
|
|
def resolve_type(type_name, pyobject):
|
|
+ # type: (str, Union[PyDefinedObject, PyObject]) -> Optional[PyDefinedObject, PyObject]
|
|
"""
|
|
- :type type_name: str
|
|
- :type pyobject: rope.base.pyobjects.PyDefinedObject | rope.base.pyobjects.PyObject
|
|
- :rtype: rope.base.pyobjects.PyDefinedObject | rope.base.pyobjects.PyObject or None
|
|
+ Find proper type object from its name.
|
|
"""
|
|
+ deprecated_aliases = {'collections': 'collections.abc'}
|
|
+ ret_type = None
|
|
+ logging.debug('Looking for %s', type_name)
|
|
if '.' not in type_name:
|
|
try:
|
|
- return pyobject.get_module().get_scope().get_name(type_name).get_object()
|
|
- except Exception:
|
|
- pass
|
|
+ ret_type = pyobject.get_module().get_scope().get_name(
|
|
+ type_name).get_object()
|
|
+ except AttributeNotFoundError:
|
|
+ logging.exception('Cannot resolve type %s', type_name)
|
|
else:
|
|
mod_name, attr_name = type_name.rsplit('.', 1)
|
|
try:
|
|
mod_finder = ScopeNameFinder(pyobject.get_module())
|
|
mod = mod_finder._find_module(mod_name).get_object()
|
|
- return mod.get_attribute(attr_name).get_object()
|
|
- except Exception:
|
|
- pass
|
|
+ ret_type = mod.get_attribute(attr_name).get_object()
|
|
+ except AttributeNotFoundError:
|
|
+ if mod_name in deprecated_aliases:
|
|
+ try:
|
|
+ logging.debug('Looking for %s in %s',
|
|
+ attr_name, deprecated_aliases[mod_name])
|
|
+ mod = mod_finder._find_module(
|
|
+ deprecated_aliases[mod_name]).get_object()
|
|
+ ret_type = mod.get_attribute(attr_name).get_object()
|
|
+ except AttributeNotFoundError:
|
|
+ logging.exception('Cannot resolve type %s in %s',
|
|
+ attr_name, dir(mod))
|
|
+ logging.debug('ret_type = %s', ret_type)
|
|
+ return ret_type
|
|
|
|
|
|
class ParametrizeType(object):
|
|
--- a/rope/base/utils/datastructures.py
|
|
+++ b/rope/base/utils/datastructures.py
|
|
@@ -1,10 +1,13 @@
|
|
# this snippet was taken from this link
|
|
# http://code.activestate.com/recipes/576694/
|
|
|
|
-import collections
|
|
+try:
|
|
+ from collections import MutableSet
|
|
+except ImportError:
|
|
+ from collections.abc import MutableSet
|
|
|
|
|
|
-class OrderedSet(collections.MutableSet):
|
|
+class OrderedSet(MutableSet):
|
|
|
|
def __init__(self, iterable=None):
|
|
self.end = end = []
|
|
--- a/rope/base/utils/pycompat.py
|
|
+++ b/rope/base/utils/pycompat.py
|
|
@@ -1,5 +1,5 @@
|
|
import sys
|
|
-import _ast
|
|
+import ast
|
|
# from rope.base import ast
|
|
|
|
PY2 = sys.version_info[0] == 2
|
|
@@ -15,7 +15,7 @@ except NameError: # PY3
|
|
str = str
|
|
string_types = (str,)
|
|
import builtins
|
|
- ast_arg_type = _ast.arg
|
|
+ ast_arg_type = ast.arg
|
|
|
|
def execfile(fn, global_vars=None, local_vars=None):
|
|
with open(fn) as f:
|
|
@@ -34,7 +34,7 @@ else: # PY2
|
|
|
|
string_types = (basestring,)
|
|
builtins = __import__('__builtin__')
|
|
- ast_arg_type = _ast.Name
|
|
+ ast_arg_type = ast.Name
|
|
execfile = execfile
|
|
|
|
def get_ast_arg_arg(node):
|
|
--- a/ropetest/type_hinting_test.py
|
|
+++ b/ropetest/type_hinting_test.py
|
|
@@ -198,18 +198,18 @@ class AbstractAssignmentHintingTest(Abst
|
|
+ self._make_class_hint('collections.Iterable[threading.Thread]') + \
|
|
' def a_method(self):\n' \
|
|
' for i in self.a_attr:\n' \
|
|
- ' i.isA'
|
|
+ ' i.is_a'
|
|
result = self._assist(code)
|
|
- self.assert_completion_in_result('isAlive', 'attribute', result)
|
|
+ self.assert_completion_in_result('is_alive', 'attribute', result)
|
|
|
|
def test_hint_parametrized_iterator(self):
|
|
code = 'class Sample(object):\n' \
|
|
+ self._make_class_hint('collections.Iterator[threading.Thread]') + \
|
|
' def a_method(self):\n' \
|
|
' for i in self.a_attr:\n' \
|
|
- ' i.isA'
|
|
+ ' i.is_a'
|
|
result = self._assist(code)
|
|
- self.assert_completion_in_result('isAlive', 'attribute', result)
|
|
+ self.assert_completion_in_result('is_alive', 'attribute', result)
|
|
|
|
def test_hint_parametrized_dict_key(self):
|
|
code = 'class Sample(object):\n' \
|