Hello community,

here is the log from the commit of package python-rope for openSUSE:Leap:15.2 
checked in at 2020-05-11 08:40:30
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/python-rope (Old)
 and      /work/SRC/openSUSE:Leap:15.2/.python-rope.new.2738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-rope"

Mon May 11 08:40:30 2020 rev:14 rq:802241 version:0.17.0

Changes:
--------
--- /work/SRC/openSUSE:Leap:15.2/python-rope/python-rope.changes        
2020-03-15 13:35:55.482822466 +0100
+++ /work/SRC/openSUSE:Leap:15.2/.python-rope.new.2738/python-rope.changes      
2020-05-11 08:40:31.807177918 +0200
@@ -1,0 +2,26 @@
+Tue May  5 16:25:43 UTC 2020 - Matej Cepl <[email protected]>
+
+- Update to 0.17.0:
+  - Make tests compatible with Python 3.8
+  - Use context manager for open()
+  - Don’t use UserDict (!!!) and collections.MutableMapping.
+  - assertEquals has been deprecated for long time (-> assertEqual)
+  - Remove weird escpaing of 's' character, which is the syntax
+    error these days.
+  - Add testing for Python 3.8 as well
+  - Fix pattern for matching short strings
+  - Work with deprecated types and using aliased ones.
+  - Don't use underscored _ast, but use ast instead
+  - Direct import from collections is getting deprecated.
+  - Use .is_alive method instead of a deprecated .isAlive
+    in threading.Thread
+  - Fix simple typo: sitaution -> situation (#287)
+  - Two more assertEquals happened.
+- Remove all patches, which were now included in the upstream
+  tarball:
+  - Python38-compatibility.patch
+  - assertEquals.patch
+  - isAlive_failed_test.patch
+  - obsolete_escape_strings.patch
+
+-------------------------------------------------------------------

Old:
----
  Python38-compatibility.patch
  assertEquals.patch
  isAlive_failed_test.patch
  obsolete_escape_strings.patch
  rope-0.16.0.tar.gz

New:
----
  rope-0.17.0.tar.gz

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

Other differences:
------------------
++++++ python-rope.spec ++++++
--- /var/tmp/diff_new_pack.QDqwgM/_old  2020-05-11 08:40:32.611179658 +0200
+++ /var/tmp/diff_new_pack.QDqwgM/_new  2020-05-11 08:40:32.615179666 +0200
@@ -19,26 +19,13 @@
 %define upname rope
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-rope
-Version:        0.16.0
+Version:        0.17.0
 Release:        0
 Summary:        A python refactoring library
 License:        LGPL-3.0-or-later
 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
-# PATCH-FIX-UPSTREAM Python38-compatibility.patch [email protected]
-# Remove Python 3.8 incompatibilities
-Patch1:         Python38-compatibility.patch
-# PATCH-FIX-UPSTREAM obsolete_escape_strings.patch [email protected]
-# Remove weird escpaing of 's' character, which is the syntax error
-# these days.
-Patch2:         obsolete_escape_strings.patch
-# PATCH-FIX-UPSTREAM assertEquals.patch [email protected]
-# assertEquals has been deprecated for long time
-Patch3:         assertEquals.patch
 BuildRequires:  %{python_module pytest}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  fdupes
@@ -66,7 +53,7 @@
 
 %check
 export LANG=en_US.UTF-8
-%pytest -k 'not (test_textual_transformations or 
test_call_function_and_parameters or test_soi_on_literal_assignment)'
+%pytest
 
 %files %{python_files}
 %license COPYING

++++++ rope-0.16.0.tar.gz -> rope-0.17.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/PKG-INFO new/rope-0.17.0/PKG-INFO
--- old/rope-0.16.0/PKG-INFO    2020-01-11 01:28:56.000000000 +0100
+++ new/rope-0.17.0/PKG-INFO    2020-05-05 18:24:19.501011400 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: rope
-Version: 0.16.0
+Version: 0.17.0
 Summary: a python refactoring library...
 Home-page: https://github.com/python-rope/rope
 Author: Ali Gholami Rudi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/__init__.py 
new/rope-0.17.0/rope/__init__.py
--- old/rope-0.16.0/rope/__init__.py    2020-01-11 01:27:29.000000000 +0100
+++ new/rope-0.17.0/rope/__init__.py    2020-05-05 18:19:23.000000000 +0200
@@ -1,7 +1,7 @@
 """rope, a python refactoring library"""
 
 INFO = __doc__
-VERSION = '0.16.0'
+VERSION = '0.17.0'
 COPYRIGHT = """\
 Copyright (C) 2019-2020 Matej Cepl
 Copyright (C) 2015-2018 Nicholas Smith
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/ast.py 
new/rope-0.17.0/rope/base/ast.py
--- old/rope-0.16.0/rope/base/ast.py    2018-02-27 21:54:30.000000000 +0100
+++ new/rope-0.17.0/rope/base/ast.py    2020-01-30 17:02:09.000000000 +0100
@@ -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 @@
     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 @@
     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 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 @@
             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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/change.py 
new/rope-0.17.0/rope/base/change.py
--- old/rope-0.16.0/rope/base/change.py 2018-02-27 21:54:30.000000000 +0100
+++ new/rope-0.17.0/rope/base/change.py 2020-04-27 11:29:13.000000000 +0200
@@ -116,10 +116,10 @@
 
 
 def _handle_job_set(function):
-    """A decorator for handling `taskhandle.JobSet`\s
+    """A decorator for handling `taskhandle.JobSet`
 
-    A decorator for handling `taskhandle.JobSet`\s for `do` and `undo`
-    methods of `Change`\s.
+    A decorator for handling `taskhandle.JobSet` for `do` and `undo`
+    methods of `Change`.
     """
     def call(self, job_set=taskhandle.NullJobSet()):
         job_set.started_job(str(self))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/codeanalyze.py 
new/rope-0.17.0/rope/base/codeanalyze.py
--- old/rope-0.16.0/rope/base/codeanalyze.py    2019-04-11 20:17:58.000000000 
+0200
+++ new/rope-0.17.0/rope/base/codeanalyze.py    2020-02-15 01:43:49.000000000 
+0100
@@ -352,7 +352,7 @@
 
 def get_string_pattern_with_prefix(prefix):
     longstr = r'%s"""(\\.|"(?!"")|\\\n|[^"\\])*"""' % prefix
-    shortstr = r'%s"(\\.|\\\n|[^"\\])*"' % prefix
+    shortstr = r'%s"(\\.|\\\n|[^"\\\n])*"' % prefix
     return '|'.join([longstr, longstr.replace('"', "'"),
                      shortstr, shortstr.replace('"', "'")])
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/evaluate.py 
new/rope-0.17.0/rope/base/evaluate.py
--- old/rope-0.16.0/rope/base/evaluate.py       2018-05-11 20:56:15.000000000 
+0200
+++ new/rope-0.17.0/rope/base/evaluate.py       2020-04-27 11:29:13.000000000 
+0200
@@ -196,6 +196,14 @@
         type_name = type(node.n).__name__
         self.result = self._get_builtin_name(type_name)
 
+    def _Constant(self, node):
+        type_name = type(node.n).__name__
+        try:
+            self.result = self._get_builtin_name(type_name)
+        except exceptions.AttributeNotFoundError:
+            # XXX: Right way to fix this is to add missing NoneType to 
builtins?
+            pass
+
     def _get_builtin_name(self, type_name):
         pytype = rope.base.builtins.builtins[type_name].get_object()
         return rope.base.pynames.UnboundName(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/libutils.py 
new/rope-0.17.0/rope/base/libutils.py
--- old/rope-0.16.0/rope/base/libutils.py       2018-02-27 21:54:30.000000000 
+0100
+++ new/rope-0.17.0/rope/base/libutils.py       2020-04-27 11:29:13.000000000 
+0200
@@ -35,6 +35,7 @@
 def path_relative_to_project_root(project, path):
     return relative(project.address, path)
 
+
 @utils.deprecated()
 def relative(root, path):
     root = rope.base.project._realpath(root).replace(os.path.sep, '/')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/oi/__init__.py 
new/rope-0.17.0/rope/base/oi/__init__.py
--- old/rope-0.16.0/rope/base/oi/__init__.py    2018-02-27 21:54:30.000000000 
+0100
+++ new/rope-0.17.0/rope/base/oi/__init__.py    2020-04-27 11:29:13.000000000 
+0200
@@ -32,7 +32,7 @@
 that is returned from it (we usually need the returned value for the
 given parameter objects).
 
-Rope might collect and store information for other `PyName`\s, too.
+Rope might collect and store information for other `PyName`, too.
 For instance rope stores the object builtin containers hold.
 
 """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/oi/objectdb.py 
new/rope-0.17.0/rope/base/oi/objectdb.py
--- old/rope-0.16.0/rope/base/oi/objectdb.py    2018-02-27 21:54:30.000000000 
+0100
+++ new/rope-0.17.0/rope/base/oi/objectdb.py    2020-04-27 11:29:13.000000000 
+0200
@@ -1,8 +1,4 @@
 from __future__ import print_function
-try:
-    from collections import MutableMapping
-except ImportError:
-    from UserDict import DictMixin as MutableMapping
 
 
 class ObjectDB(object):
@@ -124,13 +120,13 @@
             raise NotImplementedError()
 
 
-class FileInfo(MutableMapping):
+class FileInfo(dict):
 
     def create_scope(self, key):
         pass
 
 
-class FileDict(MutableMapping):
+class FileDict(dict):
 
     def create(self, key):
         pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/oi/soi.py 
new/rope-0.17.0/rope/base/oi/soi.py
--- old/rope-0.16.0/rope/base/oi/soi.py 2020-01-11 01:16:28.000000000 +0100
+++ new/rope-0.17.0/rope/base/oi/soi.py 2020-04-27 11:29:13.000000000 +0200
@@ -40,7 +40,7 @@
 
 @_ignore_inferred
 def infer_parameter_objects(pyfunction):
-    """Infer the `PyObject`\s of parameters of this `PyFunction`"""
+    """Infer the `PyObject` of parameters of this `PyFunction`"""
     object_info = pyfunction.pycore.object_info
     result = object_info.get_parameter_objects(pyfunction)
     if result is None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/oi/transform.py 
new/rope-0.17.0/rope/base/oi/transform.py
--- old/rope-0.16.0/rope/base/oi/transform.py   2018-02-27 21:54:30.000000000 
+0100
+++ new/rope-0.17.0/rope/base/oi/transform.py   2020-04-27 11:29:13.000000000 
+0200
@@ -1,4 +1,4 @@
-"""Provides classes for persisting `PyObject`\s"""
+"""Provides classes for persisting `PyObject`"""
 import os
 import re
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/oi/type_hinting/utils.py 
new/rope-0.17.0/rope/base/oi/type_hinting/utils.py
--- old/rope-0.16.0/rope/base/oi/type_hinting/utils.py  2018-02-27 
21:54:30.000000000 +0100
+++ new/rope-0.17.0/rope/base/oi/type_hinting/utils.py  2020-01-30 
17:02:09.000000000 +0100
@@ -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_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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/project.py 
new/rope-0.17.0/rope/base/project.py
--- old/rope-0.16.0/rope/base/project.py        2018-08-08 21:04:57.000000000 
+0200
+++ new/rope-0.17.0/rope/base/project.py        2020-04-27 11:29:13.000000000 
+0200
@@ -33,7 +33,7 @@
         folder address is an empty string.  If the resource does not
         exist a `exceptions.ResourceNotFound` exception would be
         raised.  Use `get_file()` and `get_folder()` when you need to
-        get nonexistent `Resource`\s.
+        get nonexistent `Resource`.
 
         """
         path = self._get_resource_path(resource_name)
@@ -459,7 +459,7 @@
     Is equivalent to ``realpath(abspath(expanduser(path)))``.
 
     Of the particular notice is the hack dealing with the unfortunate
-    sitaution of running native-Windows python (os.name == 'nt') inside
+    situation of running native-Windows python (os.name == 'nt') inside
     of Cygwin (abspath starts with '/'), which apparently normal
     os.path.realpath completely messes up.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/pynames.py 
new/rope-0.17.0/rope/base/pynames.py
--- old/rope-0.16.0/rope/base/pynames.py        2020-01-11 01:16:28.000000000 
+0100
+++ new/rope-0.17.0/rope/base/pynames.py        2020-04-27 11:29:13.000000000 
+0200
@@ -3,7 +3,7 @@
 
 
 class PyName(object):
-    """References to `PyObject`\s inside python programs"""
+    """References to `PyObject` inside python programs"""
 
     def get_object(self):
         """Return the `PyObject` object referenced by this `PyName`"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/pyobjects.py 
new/rope-0.17.0/rope/base/pyobjects.py
--- old/rope-0.16.0/rope/base/pyobjects.py      2018-02-27 21:54:30.000000000 
+0100
+++ new/rope-0.17.0/rope/base/pyobjects.py      2020-04-27 11:32:19.000000000 
+0200
@@ -32,7 +32,7 @@
         return key in self.get_attributes()
 
     def __eq__(self, obj):
-        """Check the equality of two `PyObject`\s
+        """Check the equality of two `PyObject`
 
         Currently it is assumed that instances (the direct instances
         of `PyObject`, not the instances of its subclasses) are equal
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/resourceobserver.py 
new/rope-0.17.0/rope/base/resourceobserver.py
--- old/rope-0.16.0/rope/base/resourceobserver.py       2018-02-27 
21:54:30.000000000 +0100
+++ new/rope-0.17.0/rope/base/resourceobserver.py       2020-04-27 
11:29:13.000000000 +0200
@@ -4,9 +4,9 @@
 class ResourceObserver(object):
     """Provides the interface for observing resources
 
-    `ResourceObserver`\s can be registered using `Project.
+    `ResourceObserver` can be registered using `Project.
     add_observer()`.  But most of the time `FilteredResourceObserver`
-    should be used.  `ResourceObserver`\s report all changes passed
+    should be used.  `ResourceObserver` report all changes passed
     to them and they don't report changes to all resources.  For
     example if a folder is removed, it only calls `removed()` for that
     folder and not its contents.  You can use
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/resources.py 
new/rope-0.17.0/rope/base/resources.py
--- old/rope-0.16.0/rope/base/resources.py      2018-12-10 22:20:16.000000000 
+0100
+++ new/rope-0.17.0/rope/base/resources.py      2020-04-27 11:29:13.000000000 
+0200
@@ -214,7 +214,7 @@
     def set_patterns(self, patterns):
         """Specify which resources to match
 
-        `patterns` is a `list` of `str`\s that can contain ``*`` and
+        `patterns` is a `list` of `str` that can contain ``*`` and
         ``?`` signs for matching resource names.
 
         """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/utils/datastructures.py 
new/rope-0.17.0/rope/base/utils/datastructures.py
--- old/rope-0.16.0/rope/base/utils/datastructures.py   2018-02-27 
21:54:30.000000000 +0100
+++ new/rope-0.17.0/rope/base/utils/datastructures.py   2020-04-27 
11:29:13.000000000 +0200
@@ -1,10 +1,13 @@
 # this snippet was taken from this link
 # http://code.activestate.com/recipes/576694/
 
-import collections
+try:
+    from collections.abc import MutableSet
+except ImportError:
+    from collections import MutableSet
 
 
-class OrderedSet(collections.MutableSet):
+class OrderedSet(MutableSet):
 
     def __init__(self, iterable=None):
         self.end = end = []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/base/utils/pycompat.py 
new/rope-0.17.0/rope/base/utils/pycompat.py
--- old/rope-0.16.0/rope/base/utils/pycompat.py 2019-04-11 20:17:58.000000000 
+0200
+++ new/rope-0.17.0/rope/base/utils/pycompat.py 2020-01-30 17:02:09.000000000 
+0100
@@ -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 @@
     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 @@
 
     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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/contrib/autoimport.py 
new/rope-0.17.0/rope/contrib/autoimport.py
--- old/rope-0.16.0/rope/contrib/autoimport.py  2018-02-27 21:54:30.000000000 
+0100
+++ new/rope-0.17.0/rope/contrib/autoimport.py  2020-04-27 11:29:13.000000000 
+0200
@@ -90,7 +90,7 @@
                        task_handle=taskhandle.NullTaskHandle()):
         """Generate global name cache for project files
 
-        If `resources` is a list of `rope.base.resource.File`\s, only
+        If `resources` is a list of `rope.base.resource.File`, only
         those files are searched; otherwise all python modules in the
         project are cached.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/contrib/codeassist.py 
new/rope-0.17.0/rope/contrib/codeassist.py
--- old/rope-0.16.0/rope/contrib/codeassist.py  2018-02-27 21:54:30.000000000 
+0100
+++ new/rope-0.17.0/rope/contrib/codeassist.py  2020-04-27 11:29:13.000000000 
+0200
@@ -19,7 +19,7 @@
 
 def code_assist(project, source_code, offset, resource=None,
                 templates=None, maxfixes=1, later_locals=True):
-    """Return python code completions as a list of `CodeAssistProposal`\s
+    """Return python code completions as a list of `CodeAssistProposal`
 
     `resource` is a `rope.base.resources.Resource` object.  If
     provided, relative imports are handled.
@@ -317,7 +317,7 @@
 def sorted_proposals(proposals, scopepref=None, typepref=None):
     """Sort a list of proposals
 
-    Return a sorted list of the given `CodeAssistProposal`\s.
+    Return a sorted list of the given `CodeAssistProposal`.
 
     `scopepref` can be a list of proposal scopes.  Defaults to
     ``['parameter_keyword', 'local', 'global', 'imported',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/contrib/finderrors.py 
new/rope-0.17.0/rope/contrib/finderrors.py
--- old/rope-0.16.0/rope/contrib/finderrors.py  2018-02-27 21:54:30.000000000 
+0100
+++ new/rope-0.17.0/rope/contrib/finderrors.py  2020-04-27 11:29:13.000000000 
+0200
@@ -29,7 +29,7 @@
 def find_errors(project, resource):
     """Find possible bad name and attribute accesses
 
-    It returns a list of `Error`\s.
+    It returns a list of `Error`.
     """
     pymodule = project.get_pymodule(resource)
     finder = _BadAccessFinder(pymodule)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/contrib/findit.py 
new/rope-0.17.0/rope/contrib/findit.py
--- old/rope-0.16.0/rope/contrib/findit.py      2018-02-27 21:54:30.000000000 
+0100
+++ new/rope-0.17.0/rope/contrib/findit.py      2020-04-27 11:29:13.000000000 
+0200
@@ -9,11 +9,11 @@
 def find_occurrences(project, resource, offset, unsure=False, resources=None,
                      in_hierarchy=False,
                      task_handle=taskhandle.NullTaskHandle()):
-    """Return a list of `Location`\s
+    """Return a list of `Location`
 
     If `unsure` is `True`, possible matches are returned, too.  You
     can use `Location.unsure` to see which are unsure occurrences.
-    `resources` can be a list of `rope.base.resource.File`\s that
+    `resources` can be a list of `rope.base.resource.File` that
     should be searched for occurrences; if `None` all python files
     in the project are searched.
 
@@ -40,7 +40,7 @@
     """Find the places a given method is overridden.
 
     Finds the places a method is implemented.  Returns a list of
-    `Location`\s.
+    `Location`.
     """
     name = worder.get_name_at(resource, offset)
     this_pymodule = project.get_pymodule(resource)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/refactor/change_signature.py 
new/rope-0.17.0/rope/refactor/change_signature.py
--- old/rope-0.16.0/rope/refactor/change_signature.py   2018-02-27 
21:54:30.000000000 +0100
+++ new/rope-0.17.0/rope/refactor/change_signature.py   2020-04-27 
11:29:13.000000000 +0200
@@ -127,10 +127,10 @@
                     task_handle=taskhandle.NullTaskHandle()):
         """Get changes caused by this refactoring
 
-        `changers` is a list of `_ArgumentChanger`\s.  If `in_hierarchy`
+        `changers` is a list of `_ArgumentChanger`.  If `in_hierarchy`
         is `True` the changers are applyed to all matching methods in
         the class hierarchy.
-        `resources` can be a list of `rope.base.resource.File`\s that
+        `resources` can be a list of `rope.base.resource.File` that
         should be searched for occurrences; if `None` all python files
         in the project are searched.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/refactor/encapsulate_field.py 
new/rope-0.17.0/rope/refactor/encapsulate_field.py
--- old/rope-0.16.0/rope/refactor/encapsulate_field.py  2018-02-27 
21:54:30.000000000 +0100
+++ new/rope-0.17.0/rope/refactor/encapsulate_field.py  2020-04-27 
11:29:13.000000000 +0200
@@ -30,7 +30,7 @@
         same is true for `setter` and if it is None set_${field_name} is
         used.
 
-        `resources` can be a list of `rope.base.resource.File`\s that
+        `resources` can be a list of `rope.base.resource.File` that
         the refactoring should be applied on; if `None` all python
         files in the project are searched.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/refactor/importutils/__init__.py 
new/rope-0.17.0/rope/refactor/importutils/__init__.py
--- old/rope-0.16.0/rope/refactor/importutils/__init__.py       2018-02-27 
21:54:30.000000000 +0100
+++ new/rope-0.17.0/rope/refactor/importutils/__init__.py       2020-04-27 
11:29:13.000000000 +0200
@@ -261,7 +261,7 @@
 
 
 def get_imports(project, pydefined):
-    """A shortcut for getting the `ImportInfo`\s used in a scope"""
+    """A shortcut for getting the `ImportInfo` used in a scope"""
     pymodule = pydefined.get_module()
     module = module_imports.ModuleImports(project, pymodule)
     if pymodule == pydefined:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/refactor/importutils/actions.py 
new/rope-0.17.0/rope/refactor/importutils/actions.py
--- old/rope-0.16.0/rope/refactor/importutils/actions.py        2018-02-27 
21:54:30.000000000 +0100
+++ new/rope-0.17.0/rope/refactor/importutils/actions.py        2020-04-27 
11:29:13.000000000 +0200
@@ -126,7 +126,7 @@
 class AddingVisitor(ImportInfoVisitor):
     """A class for adding imports
 
-    Given a list of `ImportInfo`\s, it tries to add each import to the
+    Given a list of `ImportInfo`, it tries to add each import to the
     module and returns `True` and gives up when an import can be added
     to older ones.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/refactor/introduce_factory.py 
new/rope-0.17.0/rope/refactor/introduce_factory.py
--- old/rope-0.16.0/rope/refactor/introduce_factory.py  2018-02-27 
21:54:30.000000000 +0100
+++ new/rope-0.17.0/rope/refactor/introduce_factory.py  2020-04-27 
11:29:13.000000000 +0200
@@ -31,7 +31,7 @@
         be added.  If `global_factory` is `True` the factory will be
         global otherwise a static method is added to the class.
 
-        `resources` can be a list of `rope.base.resource.File`\s that
+        `resources` can be a list of `rope.base.resource.File` that
         this refactoring should be applied on; if `None` all python
         files in the project are searched.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/refactor/move.py 
new/rope-0.17.0/rope/refactor/move.py
--- old/rope-0.16.0/rope/refactor/move.py       2018-02-27 21:54:30.000000000 
+0100
+++ new/rope-0.17.0/rope/refactor/move.py       2020-04-27 11:29:13.000000000 
+0200
@@ -67,7 +67,7 @@
         - `dest_attr`: the name of the destination attribute
         - `new_name`: the name of the new method; if `None` uses
           the old name
-        - `resources` can be a list of `rope.base.resources.File`\s to
+        - `resources` can be a list of `rope.base.resources.File` to
           apply this refactoring on.  If `None`, the restructuring
           will be applied to all python files.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/refactor/rename.py 
new/rope-0.17.0/rope/refactor/rename.py
--- old/rope-0.16.0/rope/refactor/rename.py     2018-02-27 21:54:30.000000000 
+0100
+++ new/rope-0.17.0/rope/refactor/rename.py     2020-04-27 11:29:13.000000000 
+0200
@@ -59,7 +59,7 @@
           called with an instance of `occurrence.Occurrence` as
           parameter.  If it returns `True`, the occurrence is
           considered to be a match.
-        - `resources` can be a list of `rope.base.resources.File`\s to
+        - `resources` can be a list of `rope.base.resources.File` to
           apply this refactoring on.  If `None`, the restructuring
           will be applied to all python files.
         - `in_file`: this argument has been deprecated; use
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope/refactor/restructure.py 
new/rope-0.17.0/rope/refactor/restructure.py
--- old/rope-0.16.0/rope/refactor/restructure.py        2018-02-27 
21:54:30.000000000 +0100
+++ new/rope-0.17.0/rope/refactor/restructure.py        2020-04-27 
11:29:13.000000000 +0200
@@ -95,7 +95,7 @@
                     task_handle=taskhandle.NullTaskHandle()):
         """Get the changes needed by this restructuring
 
-        `resources` can be a list of `rope.base.resources.File`\s to
+        `resources` can be a list of `rope.base.resources.File` to
         apply the restructuring on.  If `None`, the restructuring will
         be applied to all python files.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/rope.egg-info/PKG-INFO 
new/rope-0.17.0/rope.egg-info/PKG-INFO
--- old/rope-0.16.0/rope.egg-info/PKG-INFO      2020-01-11 01:28:56.000000000 
+0100
+++ new/rope-0.17.0/rope.egg-info/PKG-INFO      2020-05-05 18:24:19.000000000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: rope
-Version: 0.16.0
+Version: 0.17.0
 Summary: a python refactoring library...
 Home-page: https://github.com/python-rope/rope
 Author: Ali Gholami Rudi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/ropetest/advanced_oi_test.py 
new/rope-0.17.0/ropetest/advanced_oi_test.py
--- old/rope-0.16.0/ropetest/advanced_oi_test.py        2020-01-11 
01:16:28.000000000 +0100
+++ new/rope-0.17.0/ropetest/advanced_oi_test.py        2020-04-27 
11:29:13.000000000 +0200
@@ -238,15 +238,25 @@
         def complex_to_textual(pyobject):
             return to_textual.transform(
                 to_pyobject.transform(to_textual.transform(pyobject)))
-        for name in ('C', 'f', 'a_var', 'a_list', 'a_str', 'a_file'):
-            var = pymod[name].get_object()
-            self.assertEqual(to_textual.transform(var),
-                              complex_to_textual(var))
-        self.assertEqual(to_textual.transform(pymod),
-                          complex_to_textual(pymod))
-        enumerate_func = rope.base.builtins.builtins['enumerate'].get_object()
-        self.assertEqual(to_textual.transform(enumerate_func),
-                          complex_to_textual(enumerate_func))
+
+        test_variables = [
+            ('C', ('defined', 'mod.py', 'C')),
+            ('f', ('defined', 'mod.py', 'f')),
+            ('a_var', ('instance', ('defined', 'mod.py', 'C'))),
+            ('a_list',
+             ('builtin', 'list', ('instance', ('defined', 'mod.py', 'C')))),
+            ('a_str', ('builtin', 'str')),
+            ('a_file', ('builtin', 'file')),
+        ]
+        test_cases = [(pymod[v].get_object(), r) for v, r in test_variables]
+        test_cases += [
+            (pymod, ('defined', 'mod.py')),
+            (rope.base.builtins.builtins['enumerate'].get_object(),
+             ('builtin', 'function', 'enumerate'))
+        ]
+        for var, result in test_cases:
+            self.assertEqual(to_textual.transform(var), result)
+            self.assertEqual(complex_to_textual(var), result)
 
     def test_arguments_with_keywords(self):
         mod = testutils.create_module(self.project, 'mod')
@@ -644,7 +654,7 @@
         self.pycore.analyze_module(self.mod)
         pymod = self.project.get_pymodule(self.mod)
         a_var = pymod['a_var'].get_object()
-        self.assertEquals(Str, type(a_var.get_type()))
+        self.assertEqual(Str, type(a_var.get_type()))
 
     @testutils.only_for_versions_higher('3.6')
     def test_soi_on_typed_assignment(self):
@@ -653,7 +663,7 @@
         self.pycore.analyze_module(self.mod)
         pymod = self.project.get_pymodule(self.mod)
         a_var = pymod['a_var'].get_object()
-        self.assertEquals(Str, type(a_var.get_type()))
+        self.assertEqual(Str, type(a_var.get_type()))
 
     def test_not_saving_unknown_function_returns(self):
         mod2 = testutils.create_module(self.project, 'mod2')
@@ -696,9 +706,9 @@
     def test_report_change_in_libutils(self):
         self.project.prefs['automatic_soa'] = True
         code = 'class C(object):\n    pass\ndef f(p):\n    pass\nf(C())\n'
-        mod_file = open(self.mod.real_path, 'w')
-        mod_file.write(code)
-        mod_file.close()
+        with open(self.mod.real_path, 'w') as mod_file:
+            mod_file.write(code)
+
         rope.base.libutils.report_change(self.project, self.mod.real_path, '')
         pymod = self.project.get_pymodule(self.mod)
         c_class = pymod['C'].get_object()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/ropetest/codeanalyzetest.py 
new/rope-0.17.0/ropetest/codeanalyzetest.py
--- old/rope-0.16.0/ropetest/codeanalyzetest.py 2020-01-07 00:46:04.000000000 
+0100
+++ new/rope-0.17.0/ropetest/codeanalyzetest.py 2020-02-15 01:43:49.000000000 
+0100
@@ -342,6 +342,11 @@
         finder = worder.Worder(code)
         self.assertTrue(finder.is_on_function_call_keyword(len(code) - 1))
 
+    def test_get_word_range_with_fstring(self):
+        code = 'auth = 8\nmy_var = f"some value 
{auth}"\nprint(auth)\nother_val = "some other"'
+        finder = worder.Worder(code)
+        self.assertEqual(finder.get_word_range(45), (45, 49))
+
 
 class ScopeNameFinderTest(unittest.TestCase):
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/ropetest/contrib/codeassisttest.py 
new/rope-0.17.0/ropetest/contrib/codeassisttest.py
--- old/rope-0.16.0/ropetest/contrib/codeassisttest.py  2018-02-27 
21:54:30.000000000 +0100
+++ new/rope-0.17.0/ropetest/contrib/codeassisttest.py  2020-04-27 
11:29:13.000000000 +0200
@@ -91,7 +91,7 @@
         result = self._assist(code)
         count = len([x for x in result
                      if x.name == 'variable' and x.scope == 'global'])
-        self.assertEquals(1, count)
+        self.assertEqual(1, count)
 
     def test_throwing_exception_in_case_of_syntax_errors(self):
         code = 'sample (sdf+)\n'
@@ -115,7 +115,7 @@
 
     def test_completion_result(self):
         code = 'my_global = 10\nt = my'
-        self.assertEquals(len(code) - 2, starting_offset(code, len(code)))
+        self.assertEqual(len(code) - 2, starting_offset(code, len(code)))
 
     def test_completing_imported_names(self):
         code = 'import sys\na = sy'
@@ -345,12 +345,12 @@
     def test_get_definition_location(self):
         code = 'def a_func():\n    pass\na_func()'
         result = get_definition_location(self.project, code, len(code) - 3)
-        self.assertEquals((None, 1), result)
+        self.assertEqual((None, 1), result)
 
     def test_get_definition_location_underlined_names(self):
         code = 'def a_sample_func():\n    pass\na_sample_func()'
         result = get_definition_location(self.project, code, len(code) - 11)
-        self.assertEquals((None, 1), result)
+        self.assertEqual((None, 1), result)
 
     def test_get_definition_location_dotted_names(self):
         code = 'class AClass(object):\n' \
@@ -359,14 +359,14 @@
                '        pass\n' \
                'AClass.a_method()'
         result = get_definition_location(self.project, code, len(code) - 3)
-        self.assertEquals((None, 2), result)
+        self.assertEqual((None, 2), result)
 
     def test_get_definition_location_dotted_module_names(self):
         module_resource = testutils.create_module(self.project, 'mod')
         module_resource.write('def a_func():\n    pass\n')
         code = 'import mod\nmod.a_func()'
         result = get_definition_location(self.project, code, len(code) - 3)
-        self.assertEquals((module_resource, 1), result)
+        self.assertEqual((module_resource, 1), result)
 
     def test_get_definition_location_for_nested_packages(self):
         mod1 = testutils.create_module(self.project, 'mod1')
@@ -377,33 +377,33 @@
         init_dot_py = pkg2.get_child('__init__.py')
         found_pyname = get_definition_location(self.project, mod1.read(),
                                                mod1.read().index('pkg2') + 1)
-        self.assertEquals(init_dot_py, found_pyname[0])
+        self.assertEqual(init_dot_py, found_pyname[0])
 
     def test_get_definition_location_unknown(self):
         code = 'a_func()\n'
         result = get_definition_location(self.project, code, len(code) - 3)
-        self.assertEquals((None, None), result)
+        self.assertEqual((None, None), result)
 
     def test_get_definition_location_dot_spaces(self):
         code = 'class AClass(object):\n    ' \
                '@staticmethod\n    def a_method():\n' \
                '        pass\nAClass.\\\n     a_method()'
         result = get_definition_location(self.project, code, len(code) - 3)
-        self.assertEquals((None, 2), result)
+        self.assertEqual((None, 2), result)
 
     def test_get_definition_location_dot_line_break_inside_parens(self):
         code = 'class A(object):\n    def a_method(self):\n        pass\n' + \
                '(A.\na_method)'
         result = get_definition_location(self.project, code,
                                          code.rindex('a_method') + 1)
-        self.assertEquals((None, 2), result)
+        self.assertEqual((None, 2), result)
 
     def test_if_scopes_in_other_scopes_for_get_definition_location(self):
         code = 'def f(a_var):\n    pass\na_var = 10\n' + \
                'if True:\n' + \
                '    print(a_var)\n'
         result = get_definition_location(self.project, code, len(code) - 3)
-        self.assertEquals((None, 3), result)
+        self.assertEqual((None, 3), result)
 
     def test_code_assists_in_parens(self):
         code = 'def a_func(a_var):\n    pass\na_var = 10\na_func(a_'
@@ -425,8 +425,8 @@
                '    my_sample_var = 20\n' + \
                '    my_sample_'
         proposals = sorted_proposals(self._assist(code))
-        self.assertEquals('my_sample_var', proposals[0].name)
-        self.assertEquals('my_sample_function', proposals[1].name)
+        self.assertEqual('my_sample_var', proposals[0].name)
+        self.assertEqual('my_sample_function', proposals[1].name)
 
     def test_proposals_sorter_for_methods_and_attributes(self):
         code = 'class A(object):\n' + \
@@ -439,9 +439,9 @@
                'a_var = A()\n' + \
                'a_var.my_'
         proposals = sorted_proposals(self._assist(code))
-        self.assertEquals('my_b_func', proposals[0].name)
-        self.assertEquals('my_c_func', proposals[1].name)
-        self.assertEquals('my_a_var', proposals[2].name)
+        self.assertEqual('my_b_func', proposals[0].name)
+        self.assertEqual('my_c_func', proposals[1].name)
+        self.assertEqual('my_a_var', proposals[2].name)
 
     def test_proposals_sorter_for_global_methods_and_funcs(self):
         code = 'def my_b_func(self):\n' + \
@@ -449,8 +449,8 @@
                'my_a_var = 10\n' + \
                'my_'
         proposals = sorted_proposals(self._assist(code))
-        self.assertEquals('my_b_func', proposals[0].name)
-        self.assertEquals('my_a_var', proposals[1].name)
+        self.assertEqual('my_b_func', proposals[0].name)
+        self.assertEqual('my_a_var', proposals[1].name)
 
     def test_proposals_sorter_underlined_methods(self):
         code = 'class A(object):\n' + \
@@ -461,8 +461,8 @@
                'a_var = A()\n' + \
                'a_var.'
         proposals = sorted_proposals(self._assist(code))
-        self.assertEquals('my_func', proposals[0].name)
-        self.assertEquals('_my_func', proposals[1].name)
+        self.assertEqual('my_func', proposals[0].name)
+        self.assertEqual('_my_func', proposals[1].name)
 
     def test_proposals_sorter_and_scope_prefs(self):
         code = 'my_global_var = 1\n' \
@@ -471,8 +471,8 @@
                '    my_'
         result = self._assist(code)
         proposals = sorted_proposals(result, scopepref=['global', 'local'])
-        self.assertEquals('my_global_var', proposals[0].name)
-        self.assertEquals('my_local_var', proposals[1].name)
+        self.assertEqual('my_global_var', proposals[0].name)
+        self.assertEqual('my_local_var', proposals[1].name)
 
     def test_proposals_sorter_and_type_prefs(self):
         code = 'my_global_var = 1\n' \
@@ -481,8 +481,8 @@
                'my_'
         result = self._assist(code)
         proposals = sorted_proposals(result, typepref=['instance', 'function'])
-        self.assertEquals('my_global_var', proposals[0].name)
-        self.assertEquals('my_global_func', proposals[1].name)
+        self.assertEqual('my_global_var', proposals[0].name)
+        self.assertEqual('my_global_func', proposals[1].name)
 
     def test_proposals_sorter_and_missing_type_in_typepref(self):
         code = 'my_global_var = 1\n' \
@@ -525,7 +525,7 @@
         mod = testutils.create_module(self.project, 'mod')
         mod.write('"""a module"""\n')
         src = 'import mod\nmod'
-        self.assertEquals('a module', get_doc(self.project, src, len(src) - 1))
+        self.assertEqual('a module', get_doc(self.project, src, len(src) - 1))
 
     def test_get_pydoc_for_builtins(self):
         src = 'print(object)\n'
@@ -685,20 +685,20 @@
     def test_simple_get_calltips(self):
         src = 'def f():\n    pass\nvar = f()\n'
         doc = get_calltip(self.project, src, src.rindex('f'))
-        self.assertEquals('f()', doc)
+        self.assertEqual('f()', doc)
 
     def test_get_calltips_for_classes(self):
         src = 'class C(object):\n' \
               '    def __init__(self):\n        pass\nC('
         doc = get_calltip(self.project, src, len(src) - 1)
-        self.assertEquals('C.__init__(self)', doc)
+        self.assertEqual('C.__init__(self)', doc)
 
     def test_get_calltips_for_objects_with_call(self):
         src = 'class C(object):\n' \
               '    def __call__(self, p):\n        pass\n' \
               'c = C()\nc(1,'
         doc = get_calltip(self.project, src, src.rindex('c'))
-        self.assertEquals('C.__call__(self, p)', doc)
+        self.assertEqual('C.__call__(self, p)', doc)
 
     def test_get_calltips_and_including_module_name(self):
         src = 'class C(object):\n' \
@@ -707,7 +707,7 @@
         mod = testutils.create_module(self.project, 'mod')
         mod.write(src)
         doc = get_calltip(self.project, src, src.rindex('c'), mod)
-        self.assertEquals('mod.C.__call__(self, p)', doc)
+        self.assertEqual('mod.C.__call__(self, p)', doc)
 
     def test_get_calltips_and_including_module_name_2(self):
         src = 'range()\n'
@@ -720,7 +720,7 @@
               '        pass\n' \
               'C().f()'
         doc = get_calltip(self.project, src, src.rindex('f'), remove_self=True)
-        self.assertEquals('C.f()', doc)
+        self.assertEqual('C.f()', doc)
 
     def test_removing_self_parameter_and_more_than_one_parameter(self):
         src = 'class C(object):\n' \
@@ -728,7 +728,7 @@
               '        pass\n' \
               'C().f()'
         doc = get_calltip(self.project, src, src.rindex('f'), remove_self=True)
-        self.assertEquals('C.f(p1)', doc)
+        self.assertEqual('C.f(p1)', doc)
 
     def test_lambda_calltip(self):
         src = 'foo = lambda x, y=1: None\n' \
@@ -859,7 +859,7 @@
         resource.write(code)
         result = get_canonical_path(self.project, resource, 1)
         mod_path = os.path.join(self.project.address, 'mod.py')
-        self.assertEquals(
+        self.assertEqual(
             result, [(mod_path, 'MODULE'),
                      ('GLOBAL_VARIABLE', 'VARIABLE')])
 
@@ -870,7 +870,7 @@
         resource.write(code)
         result = get_canonical_path(self.project, resource, 24)
         mod_path = os.path.join(self.project.address, 'mod.py')
-        self.assertEquals(
+        self.assertEqual(
             result, [(mod_path, 'MODULE'), ('Foo', 'CLASS'),
                      ('attr', 'VARIABLE')])
 
@@ -882,7 +882,7 @@
         resource.write(code)
         result = get_canonical_path(self.project, resource, 30)
         mod_path = os.path.join(self.project.address, 'mod.py')
-        self.assertEquals(
+        self.assertEqual(
             result, [(mod_path, 'MODULE'), ('Foo', 'CLASS'),
                      ('Bar', 'CLASS')])
 
@@ -894,7 +894,7 @@
         resource.write(code)
         result = get_canonical_path(self.project, resource, 41)
         mod_path = os.path.join(self.project.address, 'mod.py')
-        self.assertEquals(
+        self.assertEqual(
             result, [(mod_path, 'MODULE'), ('Foo', 'CLASS'),
                      ('bar', 'FUNCTION'), ('b', 'PARAMETER')])
 
@@ -905,7 +905,7 @@
         resource.write(code)
         result = get_canonical_path(self.project, resource, 17)
         mod_path = os.path.join(self.project.address, 'mod.py')
-        self.assertEquals(
+        self.assertEqual(
             result, [(mod_path, 'MODULE'), ('bar', 'FUNCTION'),
                      ('x', 'VARIABLE')])
 
@@ -1027,7 +1027,7 @@
                '    def method1(self):\n' \
                '        pass\n' \
                'Sample.me'
-        self.assertEquals(len(code) - 2, starting_offset(code, len(code)))
+        self.assertEqual(len(code) - 2, starting_offset(code, len(code)))
 
     def test_backslash_after_dots(self):
         code = 'class Sample(object):\n' \
@@ -1062,13 +1062,13 @@
         code = 'import mod1\nmod1.a_func\n'
         result = get_definition_location(self.project, code,
                                          len(code) - 2, mod2)
-        self.assertEquals((mod1, 1), result)
+        self.assertEqual((mod1, 1), result)
 
     def test_get_definition_location_for_builtins(self):
         code = 'import sys\n'
         result = get_definition_location(self.project, code,
                                          len(code) - 2)
-        self.assertEquals((None, None), result)
+        self.assertEqual((None, None), result)
 
     def test_get_doc_on_relative_imports(self):
         pkg = testutils.create_package(self.project, 'pkg')
@@ -1120,7 +1120,7 @@
 
     def test_starting_expression(self):
         code = 'l = list()\nl.app'
-        self.assertEquals('l.app', starting_expression(code, len(code)))
+        self.assertEqual('l.app', starting_expression(code, len(code)))
 
 
 def suite():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rope-0.16.0/ropetest/type_hinting_test.py 
new/rope-0.17.0/ropetest/type_hinting_test.py
--- old/rope-0.16.0/ropetest/type_hinting_test.py       2018-02-27 
21:54:30.000000000 +0100
+++ new/rope-0.17.0/ropetest/type_hinting_test.py       2020-05-05 
18:18:09.000000000 +0200
@@ -198,18 +198,18 @@
                + 
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