15
0
forked from pool/python-rope
Files
python-rope/isAlive_failed_test.patch
Matej Cepl dcbe97ef6d - Add assertEquals.patch, obsolete_escape_strings.patch, and
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
2020-03-09 09:55:16 +00:00

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' \