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