Hello community,

here is the log from the commit of package python-rope for openSUSE:Factory 
checked in at 2020-01-14 21:12:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-rope (Old)
 and      /work/SRC/openSUSE:Factory/.python-rope.new.6675 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-rope"

Tue Jan 14 21:12:08 2020 rev:18 rq:764326 version:0.14.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-rope/python-rope.changes  2020-01-02 
14:44:22.848983862 +0100
+++ /work/SRC/openSUSE:Factory/.python-rope.new.6675/python-rope.changes        
2020-01-14 21:13:59.906948687 +0100
@@ -1,0 +2,5 @@
+Tue Jan 14 15:29:21 CET 2020 - Matej Cepl <[email protected]>
+
+- Add isAlive_failed_test.patch as a fix for gh#python-rope/rope#283
+
+-------------------------------------------------------------------

New:
----
  isAlive_failed_test.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-rope.spec ++++++
--- /var/tmp/diff_new_pack.SIZrRm/_old  2020-01-14 21:14:00.550948981 +0100
+++ /var/tmp/diff_new_pack.SIZrRm/_new  2020-01-14 21:14:00.550948981 +0100
@@ -26,6 +26,9 @@
 Group:          Development/Languages/Python
 URL:            https://github.com/python-rope/rope
 Source:         
https://files.pythonhosted.org/packages/source/r/rope/rope-%{version}.tar.gz
+# PATCH-FIX-UPSTREAM isAlive_failed_test.patch gh#python-rope/rope#283 
[email protected]
+# Fix problems with aliased collections -> collections.abc
+Patch0:         isAlive_failed_test.patch
 BuildRequires:  %{python_module pytest}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  fdupes
@@ -38,6 +41,7 @@
 
 %prep
 %setup -q -n rope-%{version}
+%autopatch -p1
 
 %build
 export LANG=en_US.UTF-8
@@ -52,8 +56,7 @@
 
 %check
 export LANG=en_US.UTF-8
-# Work around gh#python-rope/rope#247
-%pytest -k 'not (test_hint_parametrized_iterable or 
test_hint_parametrized_iterator)'
+%pytest
 
 %files %{python_files}
 %license COPYING

++++++ isAlive_failed_test.patch ++++++
diff --git a/rope/base/ast.py b/rope/base/ast.py
index d43c83c5..d24524e7 100644
--- 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
 
diff --git a/rope/base/oi/type_hinting/utils.py 
b/rope/base/oi/type_hinting/utils.py
index aec82ac0..ce90dfeb 100644
--- 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):
diff --git a/rope/base/utils/datastructures.py 
b/rope/base/utils/datastructures.py
index 0cb16cf2..3790a6e1 100644
--- 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 = []
diff --git a/rope/base/utils/pycompat.py b/rope/base/utils/pycompat.py
index 1214658f..de7cf2e4 100644
--- 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):
diff --git a/ropetest/type_hinting_test.py b/ropetest/type_hinting_test.py
index 7cc02bb1..afb98e19 100644
--- a/ropetest/type_hinting_test.py
+++ b/ropetest/type_hinting_test.py
@@ -198,18 +198,18 @@ class AbstractAssignmentHintingTest(AbstractHintingTest):
                + 
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' \

Reply via email to