Hello community, here is the log from the commit of package python-rope for openSUSE:Factory checked in at 2012-06-07 15:39:44 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-rope (Old) and /work/SRC/openSUSE:Factory/.python-rope.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-rope", Maintainer is "" Changes: -------- --- /work/SRC/openSUSE:Factory/python-rope/python-rope.changes 2012-03-16 13:23:42.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.python-rope.new/python-rope.changes 2012-06-07 15:39:46.000000000 +0200 @@ -1,0 +2,6 @@ +Wed Jun 6 11:07:01 UTC 2012 - [email protected] + +- Update to version 0.9.4: + + Upstream provides no changelog + +------------------------------------------------------------------- Old: ---- rope-0.9.3.tar.gz New: ---- rope-0.9.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-rope.spec ++++++ --- /var/tmp/diff_new_pack.C2Xuxd/_old 2012-06-07 15:39:48.000000000 +0200 +++ /var/tmp/diff_new_pack.C2Xuxd/_new 2012-06-07 15:39:48.000000000 +0200 @@ -11,17 +11,18 @@ # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# + # Please submit bugfixes or comments via http://bugs.opensuse.org/ # + Name: python-rope -Version: 0.9.3 +Version: 0.9.4 Release: 0 -License: GPL-2.0+ Summary: A python refactoring library -Url: http://rope.sf.net/ +License: GPL-2.0+ Group: Development/Languages/Python +Url: http://rope.sf.net/ Source: http://pypi.python.org/packages/source/r/rope/rope-%{version}.tar.gz BuildRequires: python-devel BuildRoot: %{_tmppath}/%{name}-%{version}-build ++++++ rope-0.9.3.tar.gz -> rope-0.9.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/PKG-INFO new/rope-0.9.4/PKG-INFO --- old/rope-0.9.3/PKG-INFO 2010-02-04 20:42:26.000000000 +0100 +++ new/rope-0.9.4/PKG-INFO 2012-05-16 22:43:10.000000000 +0200 @@ -1,6 +1,6 @@ -Metadata-Version: 1.0 +Metadata-Version: 1.1 Name: rope -Version: 0.9.3 +Version: 0.9.4 Summary: a python refactoring library... Home-page: http://rope.sf.net/ Author: Ali Gholami Rudi @@ -8,7 +8,7 @@ License: GNU GPL Description: ======================================== - rope, a python refactoring library ... + rope, a python refactoring library ... ======================================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/__init__.py new/rope-0.9.4/rope/__init__.py --- old/rope-0.9.3/rope/__init__.py 2010-02-03 20:41:34.000000000 +0100 +++ new/rope-0.9.4/rope/__init__.py 2012-05-16 22:33:47.000000000 +0200 @@ -1,10 +1,10 @@ """rope, a python refactoring library""" INFO = __doc__ -VERSION = '0.9.3' +VERSION = '0.9.4' COPYRIGHT = """\ -Copyright (C) 2006-2010 Ali Gholami Rudi -Copyright (C) 2009-2010 Anton Gritsay +Copyright (C) 2006-2012 Ali Gholami Rudi +Copyright (C) 2009-2012 Anton Gritsay This program is free software; you can redistribute it and/or modify it under the terms of GNU General Public License as published by the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/base/ast.py new/rope-0.9.4/rope/base/ast.py --- old/rope-0.9.3/rope/base/ast.py 2009-08-16 17:26:02.000000000 +0200 +++ new/rope-0.9.4/rope/base/ast.py 2011-04-12 22:51:03.000000000 +0200 @@ -27,6 +27,10 @@ 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: + # In python < 2.7 ``node.module == ''`` for relative imports + # but for python 2.7 it is None. Generalizing it to ''. + node.module = '' return method(node) for child in get_child_nodes(node): walk(child, walker) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/base/builtins.py new/rope-0.9.4/rope/base/builtins.py --- old/rope-0.9.3/rope/base/builtins.py 2010-01-26 20:55:36.000000000 +0100 +++ new/rope-0.9.4/rope/base/builtins.py 2011-09-10 17:08:11.000000000 +0200 @@ -2,7 +2,7 @@ import inspect import rope.base.evaluate -from rope.base import pynames, pyobjects, arguments, utils +from rope.base import pynames, pyobjects, arguments, utils, ast class BuiltinModule(pyobjects.AbstractModule): @@ -110,6 +110,9 @@ self.builtin = builtin self.type = pyobjects.get_unknown() + def get_name(self): + return getattr(type(self.builtin), '__name__', None) + @utils.saveit def get_attributes(self): return _object_attributes(self.builtin, self) @@ -120,7 +123,12 @@ for name in dir(obj): if name == 'None': continue - child = getattr(obj, name) + try: + child = getattr(obj, name) + except AttributeError: + # descriptors are allowed to raise AttributeError + # even if they are in dir() + continue pyobject = None if inspect.isclass(child): pyobject = BuiltinClass(child, {}, parent=parent) @@ -597,6 +605,7 @@ def __init__(self, node, scope): super(Lambda, self).__init__() self.node = node + self.arguments = node.args self.scope = scope def get_returned_object(self, args): @@ -606,9 +615,37 @@ else: return pyobjects.get_unknown() - def get_pattributes(self): + def get_module(self): + return self.parent.get_module() + + def get_scope(self): + return self.scope + + def get_kind(self): + return 'lambda' + + def get_ast(self): + return self.node + + def get_attributes(self): return {} + def get_name(self): + return 'lambda' + + def get_param_names(self, special_args=True): + result = [node.id for node in self.arguments.args + if isinstance(node, ast.Name)] + if self.arguments.vararg: + result.append('*' + self.arguments.vararg) + if self.arguments.kwarg: + result.append('**' + self.arguments.kwarg) + return result + + @property + def parent(self): + return self.scope.pyobject + class BuiltinObject(BuiltinClass): @@ -628,8 +665,10 @@ seq = pyname.get_object() args = arguments.ObjectArguments([pyname]) if '__iter__' in seq: - iter = seq['__iter__'].get_object().\ - get_returned_object(args) + obj = seq['__iter__'].get_object() + if not isinstance(obj, pyobjects.AbstractFunction): + return None + iter = obj.get_returned_object(args) if iter is not None and 'next' in iter: holding = iter['next'].get_object().\ get_returned_object(args) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/base/evaluate.py new/rope-0.9.4/rope/base/evaluate.py --- old/rope-0.9.3/rope/base/evaluate.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/rope/base/evaluate.py 2011-03-03 11:37:34.000000000 +0100 @@ -199,8 +199,10 @@ self._get_object_for_node(node.left)) def _BoolOp(self, node): - self.result = rope.base.pynames.UnboundName( - self._get_object_for_node(node.values[0])) + pyobject = self._get_object_for_node(node.values[0]) + if pyobject is None: + pyobject = self._get_object_for_node(node.values[1]) + self.result = rope.base.pynames.UnboundName(pyobject) def _Repr(self, node): self.result = self._get_builtin_name('str') @@ -292,13 +294,15 @@ else: return if function_name in pyobject: - call_function = pyobject[function_name].get_object() + called = pyobject[function_name].get_object() + if not called or not isinstance(called, pyobjects.AbstractFunction): + return args = [node] if other_args: args += other_args arguments_ = arguments.Arguments(args, self.scope) self.result = rope.base.pynames.UnboundName( - pyobject=call_function.get_returned_object(arguments_)) + pyobject=called.get_returned_object(arguments_)) def _Lambda(self, node): self.result = rope.base.pynames.UnboundName( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/base/oi/runmod.py new/rope-0.9.4/rope/base/oi/runmod.py --- old/rope-0.9.3/rope/base/oi/runmod.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/rope/base/oi/runmod.py 2011-04-04 23:42:04.000000000 +0200 @@ -187,6 +187,7 @@ def close(self): self.sender.close() + sys.settrace(None) def _realpath(path): return os.path.realpath(os.path.abspath(os.path.expanduser(path))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/base/project.py new/rope-0.9.4/rope/base/project.py --- old/rope-0.9.3/rope/base/project.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/rope/base/project.py 2011-03-03 11:37:34.000000000 +0100 @@ -257,84 +257,31 @@ def __init__(self, project): self.project = project - self.needs_gc = True - self.files = set() - self.folders = set() + self.files = None + rawobserver = ResourceObserver( + self._changed, self._invalid, self._invalid, + self._invalid, self._invalid) + self.project.add_observer(rawobserver) def get_files(self): - if self.needs_gc: - # forcing the creation of the observer - self.observer - for file in list(self.files): - if not file.exists(): - self.files.remove(file) - for folder in list(self.folders): - if not folder.exists(): - self.folders.remove(folder) - self.observer.remove_resource(folder) - self.needs_gc = False + if self.files is None: + self.files = set() + self._add_files(self.project.root) return self.files - def _updated_resources(self, folder): - if not folder.exists(): - return set(), set() - files = set() - folders = set([folder]) - files.update(folder.get_files()) - for child in folder.get_folders(): - if child not in self.folders: - newfiles, newfolders = self._updated_resources(child) - files.update(newfiles) - folders.update(newfolders) - return files, folders - - def _update_folder(self, folder): - files, folders = self._updated_resources(folder) - self.files.update(files) - for child in folders - self.folders: - self.folders.add(child) - self.observer.add_resource(child) - self.needs_gc = True - - @property - @utils.saveit - def observer(self): - rawobserver = ResourceObserver( - self._changed, self._moved, self._created, - self._removed, self._validate) - observer = FilteredResourceObserver(rawobserver) - self.project.add_observer(observer) - self._update_folder(self.project.root) - return observer + def _add_files(self, folder): + for child in folder.get_children(): + if child.is_folder(): + self._add_files(child) + elif not self.project.is_ignored(child): + self.files.add(child) def _changed(self, resource): if resource.is_folder(): - self._update_folder(resource) - - def _moved(self, resource, new_resource): - if resource.is_folder(): - self._update_folder(resource) - self._update_folder(new_resource) - else: - self._removed(resource) - self._created(new_resource) - - def _created(self, resource): - if resource.is_folder(): - self._update_folder(resource) - else: - if not self.project.is_ignored(resource): - self.files.add(resource) - - def _removed(self, resource): - if resource.is_folder(): - self._update_folder(resource) - else: - if resource in self.files: - self.files.remove(resource) + self.files = None - def _validate(self, resource): - pass + def _invalid(self, resource, new_resource=None): + self.files = None class _DataFiles(object): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/base/pycore.py new/rope-0.9.4/rope/base/pycore.py --- old/rope-0.9.3/rope/base/pycore.py 2009-12-30 19:48:48.000000000 +0100 +++ new/rope-0.9.4/rope/base/pycore.py 2012-05-06 22:29:38.000000000 +0200 @@ -75,12 +75,13 @@ def get_module(self, name, folder=None): """Returns a `PyObject` if the module was found.""" + # check if this is a builtin module + pymod = self._builtin_module(name) + if pymod is not None: + return pymod module = self.find_module(name, folder) if module is None: - module = self._builtin_module(name) - if module is None: - raise ModuleNotFoundError('Module %s not found' % name) - return module + raise ModuleNotFoundError('Module %s not found' % name) return self.resource_to_pyobject(module) def _builtin_submodules(self, modname): @@ -318,6 +319,8 @@ else: result = PyModule(self.pycore, resource=resource, force_errors=force_errors) + if result.has_errors: + return result self.module_map[resource] = result self.observer.add_resource(resource) return result diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/base/pyobjectsdef.py new/rope-0.9.4/rope/base/pyobjectsdef.py --- old/rope-0.9.3/rope/base/pyobjectsdef.py 2009-08-19 21:45:34.000000000 +0200 +++ new/rope-0.9.4/rope/base/pyobjectsdef.py 2011-04-04 22:11:54.000000000 +0200 @@ -148,9 +148,11 @@ resource=None, force_errors=False): ignore = pycore.project.prefs.get('ignore_syntax_errors', False) syntax_errors = force_errors or not ignore + self.has_errors = False try: source, node = self._init_source(pycore, source, resource) except exceptions.ModuleSyntaxError: + self.has_errors = True if syntax_errors: raise else: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/base/stdmods.py new/rope-0.9.4/rope/base/stdmods.py --- old/rope-0.9.3/rope/base/stdmods.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/rope/base/stdmods.py 2011-09-04 23:01:08.000000000 +0200 @@ -5,8 +5,8 @@ def _stdlib_path(): - import inspect - return os.path.dirname(inspect.getsourcefile(inspect)) + import distutils.sysconfig + return distutils.sysconfig.get_python_lib(standard_lib=True) @utils.cached(1) def standard_modules(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/base/worder.py new/rope-0.9.4/rope/base/worder.py --- old/rope-0.9.3/rope/base/worder.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/rope/base/worder.py 2011-09-04 23:01:08.000000000 +0200 @@ -1,4 +1,5 @@ import bisect +import keyword import rope.base.simplify @@ -112,6 +113,9 @@ def get_function_and_args_in_header(self, offset): return self.code_finder.get_function_and_args_in_header(offset) + def get_lambda_and_args(self, offset): + return self.code_finder.get_lambda_and_args(offset) + def find_function_offset(self, offset): return self.code_finder.find_function_offset(offset) @@ -201,7 +205,9 @@ offset = self._find_last_non_space_char(last_atom - 1) if offset >= 0 and (self.code[offset] in '"\'})]' or self._is_id_char(offset)): - return self._find_atom_start(offset) + atom_start = self._find_atom_start(offset) + if not keyword.iskeyword(self.code[atom_start:offset + 1]): + return atom_start return last_atom def _find_primary_start(self, offset): @@ -331,7 +337,10 @@ def is_a_name_after_from_import(self, offset): try: - line_start = self._get_line_start(offset) + if len(self.code) > offset and self.code[offset] == '\n': + line_start = self._get_line_start(offset - 1) + else: + line_start = self._get_line_start(offset) last_from = self.code.rindex('from ', line_start, offset) from_import = self.code.index(' import ', last_from) from_names = from_import + 8 @@ -431,15 +440,15 @@ end = self._find_word_end(offset) + 1 return (start, end) - def get_word_parens_range(self, offset): + def get_word_parens_range(self, offset, opening='(', closing=')'): end = self._find_word_end(offset) - start_parens = self.code.index('(', end) + start_parens = self.code.index(opening, end) index = start_parens open_count = 0 while index < len(self.code): - if self.code[index] == '(': + if self.code[index] == opening: open_count += 1 - if self.code[index] == ')': + if self.code[index] == closing: open_count -= 1 if open_count == 0: return (start_parens, index + 1) @@ -499,11 +508,17 @@ lparens, rparens = self.get_word_parens_range(offset) return self.raw[offset:rparens + 1] - def find_function_offset(self, offset): + def find_function_offset(self, offset, definition='def '): while True: - offset = self.code.index('def ', offset) + offset = self.code.index(definition, offset) if offset == 0 or not self._is_id_char(offset - 1): break offset += 1 def_ = offset + 4 return self._find_first_non_space_char(def_) + + def get_lambda_and_args(self, offset): + offset = self.find_function_offset(offset, definition = 'lambda ') + lparens, rparens = self.get_word_parens_range(offset, opening=' ', closing=':') + return self.raw[offset:rparens + 1] + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/contrib/codeassist.py new/rope-0.9.4/rope/contrib/codeassist.py --- old/rope-0.9.3/rope/contrib/codeassist.py 2010-01-26 20:53:09.000000000 +0100 +++ new/rope-0.9.4/rope/contrib/codeassist.py 2011-03-03 11:37:34.000000000 +0100 @@ -153,12 +153,8 @@ def __init__(self, name, scope, pyname=None): self.name = name - self.scope = scope self.pyname = pyname - if pyname is not None: - self.type = self._get_type() - else: - self.type = None + self.scope = self._get_scope(scope) def __str__(self): return '%s (%s, %s)' % (self.name, self.scope, self.type) @@ -180,10 +176,10 @@ if isinstance(pyobject, pyobjects.AbstractFunction): return pyobject.get_param_names() - def _get_type(self): + @property + def type(self): pyname = self.pyname if isinstance(pyname, builtins.BuiltinName): - self.scope = 'builtin' pyobject = pyname.get_object() if isinstance(pyobject, builtins.BuiltinFunction): return 'function' @@ -194,12 +190,9 @@ isinstance(pyobject, builtins.BuiltinName): return 'instance' elif isinstance(pyname, pynames.ImportedModule): - self.scope = 'imported' return 'module' elif isinstance(pyname, pynames.ImportedName) or \ isinstance(pyname, pynames.DefinedName): - if isinstance(pyname, pynames.ImportedName): - self.scope = 'imported' pyobject = pyname.get_object() if isinstance(pyobject, pyobjects.AbstractFunction): return 'function' @@ -207,6 +200,14 @@ return 'class' return 'instance' + def _get_scope(self, scope): + if isinstance(self.pyname, builtins.BuiltinName): + return 'builtin' + if isinstance(self.pyname, pynames.ImportedModule) or \ + isinstance(self.pyname, pynames.ImportedName): + return 'imported' + return scope + def get_doc(self): """Get the proposed object's docstring. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/refactor/functionutils.py new/rope-0.9.4/rope/refactor/functionutils.py --- old/rope-0.9.3/rope/refactor/functionutils.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/rope/refactor/functionutils.py 2011-03-03 11:37:34.000000000 +0100 @@ -1,5 +1,6 @@ import rope.base.exceptions import rope.base.pyobjects +from rope.base.builtins import Lambda from rope.base import worder @@ -34,8 +35,10 @@ scope = pyfunction.get_scope() parent = scope.parent parameter_names = pyfunction.get_param_names() - is_method = pyfunction.get_kind() == 'method' - info = _FunctionParser(code, is_method) + kind = pyfunction.get_kind() + is_method = kind == 'method' + is_lambda = kind == 'lambda' + info = _FunctionParser(code, is_method, is_lambda) args, keywords = info.get_parameters() args_arg = None keywords_arg = None @@ -56,7 +59,10 @@ word_finder = worder.Worder(pymodule.source_code) lineno = pyfunction.get_ast().lineno start = pymodule.lines.get_line_start(lineno) - call = word_finder.get_function_and_args_in_header(start) + if isinstance(pyfunction, Lambda): + call = word_finder.get_lambda_and_args(start) + else: + call = word_finder.get_function_and_args_in_header(start) return DefinitionInfo._read(pyfunction, call) @@ -183,11 +189,14 @@ class _FunctionParser(object): - def __init__(self, call, implicit_arg): + def __init__(self, call, implicit_arg, is_lambda=False): self.call = call self.implicit_arg = implicit_arg self.word_finder = worder.Worder(self.call) - self.last_parens = self.call.rindex(')') + if is_lambda: + self.last_parens = self.call.rindex(':') + else: + self.last_parens = self.call.rindex(')') self.first_parens = self.word_finder._find_parens_start(self.last_parens) def get_parameters(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/refactor/importutils/module_imports.py new/rope-0.9.4/rope/refactor/importutils/module_imports.py --- old/rope-0.9.3/rope/refactor/importutils/module_imports.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/rope/refactor/importutils/module_imports.py 2011-04-12 22:51:44.000000000 +0200 @@ -428,7 +428,8 @@ if node.level: level = node.level import_info = importinfo.FromImport( - node.module, level, self._get_names(node.names)) + node.module or '', # see comment at rope.base.ast.walk + level, self._get_names(node.names)) start_line = node.lineno self.imports.append(importinfo.ImportStatement( import_info, node.lineno, end_line, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/refactor/inline.py new/rope-0.9.4/rope/refactor/inline.py --- old/rope-0.9.3/rope/refactor/inline.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/rope/refactor/inline.py 2011-04-04 18:40:32.000000000 +0200 @@ -1,3 +1,21 @@ +# Known Bugs when inlining a function/method +# The values passed to function are inlined using _inlined_variable. +# This may cause two problems, illustrated in the examples below +# +# def foo(var1): +# var1 = var1*10 +# return var1 +# +# If a call to foo(20) is inlined, the result of inlined function is 20, +# but it should be 200. +# +# def foo(var1): +# var2 = var1*10 +# return var2 +# +# 2- If a call to foo(10+10) is inlined the result of inlined function is 110 +# but it should be 200. + import re import rope.base.exceptions @@ -8,6 +26,11 @@ from rope.refactor import (occurrences, rename, sourceutils, importutils, move, change_signature) +def unique_prefix(): + n = 0 + while True: + yield "__" + str(n) + "__" + n += 1 def create_inline(project, resource, offset): """Create a refactoring object for inlining @@ -216,6 +239,7 @@ changes = ChangeSet('Inline variable <%s>' % self.name) jobset = task_handle.create_jobset('Calculating changes', len(resources)) + for resource in resources: jobset.started_job(resource.path) if resource == self.resource: @@ -304,7 +328,7 @@ class _DefinitionGenerator(object): - + unique_prefix = unique_prefix() def __init__(self, project, pyfunction, body=None): self.pycore = project.pycore self.pyfunction = pyfunction @@ -336,15 +360,14 @@ def get_function_name(self): return self.pyfunction.get_name() - def get_definition(self, primary, pyname, call, returns=False): + def get_definition(self, primary, pyname, call, host_vars=[],returns=False): # caching already calculated definitions - key = (call, returns) - if key not in self._calculated_definitions: - self._calculated_definitions[key] = self._calculate_definition( - primary, pyname, call, returns) - return self._calculated_definitions[key] + return self._calculate_definition(primary, pyname, call, + host_vars, returns) - def _calculate_definition(self, primary, pyname, call, returns): + def _calculate_header(self, primary, pyname, call): + # A header is created which initializes parameters + # to the values passed to the function. call_info = rope.refactor.functionutils.CallInfo.read( primary, pyname, self.definition_info, call) paramdict = self.definition_params @@ -354,15 +377,48 @@ paramdict[param_name] = value header = '' to_be_inlined = [] + mod = self.pycore.get_string_module(self.body) + all_names = mod.get_scope().get_names() + assigned_names = [name for name in all_names if + isinstance(all_names[name], rope.base.pynamesdef.AssignedName)] for name, value in paramdict.items(): if name != value and value is not None: header += name + ' = ' + value.replace('\n', ' ') + '\n' to_be_inlined.append(name) + return header, to_be_inlined + + def _calculate_definition(self, primary, pyname, call, host_vars, returns): + + header, to_be_inlined = self._calculate_header(primary, pyname, call) + source = header + self.body + mod = self.pycore.get_string_module(source) + name_dict = mod.get_scope().get_names() + all_names = [x for x in name_dict if + not isinstance(name_dict[x], rope.base.builtins.BuiltinName)] + + # If there is a name conflict, all variable names + # inside the inlined function are renamed + if len(set(all_names).intersection(set(host_vars))) > 0: + + prefix = _DefinitionGenerator.unique_prefix.next() + guest = self.pycore.get_string_module(source, self.resource) + + to_be_inlined = [prefix+item for item in to_be_inlined] + for item in all_names: + pyname = guest[item] + occurrence_finder = occurrences.create_finder( + self.pycore, item, pyname) + source = rename.rename_in_module(occurrence_finder, + prefix+item, pymodule=guest) + guest = self.pycore.get_string_module(source, self.resource) + + #parameters not reassigned inside the functions are now inlined. for name in to_be_inlined: pymodule = self.pycore.get_string_module(source, self.resource) pyname = pymodule[name] source = _inline_variable(self.pycore, pymodule, pyname, name) + return self._replace_returns_with(source, returns) def _replace_returns_with(self, source, returns): @@ -451,15 +507,21 @@ logical_line_in(lineno) line_start = self.lines.get_line_start(start_line) line_end = self.lines.get_line_end(end_line) + + returns = self.source[line_start:start].strip() != '' or \ self.source[end_parens:line_end].strip() != '' indents = sourceutils.get_indents(self.lines, start_line) primary, pyname = occurrence.get_primary_and_pyname() + + host = self.pycore.resource_to_pyobject(self.resource) + scope = host.scope.get_inner_scope_for_line(lineno) definition, returned = self.generator.get_definition( - primary, pyname, self.source[start:end_parens], returns=returns) + primary, pyname, self.source[start:end_parens], scope.get_names(), returns=returns) + end = min(line_end + 1, len(self.source)) - change_collector.add_change( - line_start, end, sourceutils.fix_indentation(definition, indents)) + change_collector.add_change(line_start, end, + sourceutils.fix_indentation(definition, indents)) if returns: name = returned if name is None: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/refactor/move.py new/rope-0.9.4/rope/refactor/move.py --- old/rope-0.9.3/rope/refactor/move.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/rope/refactor/move.py 2011-03-03 11:37:34.000000000 +0100 @@ -305,14 +305,18 @@ module_with_imports = self.import_tools.module_imports(pymodule) source = pymodule.source_code + lineno = 0 if module_with_imports.imports: - start = pymodule.lines.get_line_end( - module_with_imports.imports[-1].end_line - 1) - result = source[:start + 1] + '\n\n' + lineno = module_with_imports.imports[-1].end_line - 1 else: - result = '' - start = -1 - result += moving + source[start + 1:] + while lineno < pymodule.lines.length() and \ + pymodule.lines.get_line(lineno + 1).lstrip().startswith('#'): + lineno += 1 + if lineno > 0: + cut = pymodule.lines.get_line_end(lineno) + 1 + result = source[:cut] + '\n\n' + moving + source[cut:] + else: + result = moving + source # Organizing imports source = result diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope/refactor/patchedast.py new/rope-0.9.4/rope/refactor/patchedast.py --- old/rope-0.9.3/rope/refactor/patchedast.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/rope/refactor/patchedast.py 2011-09-09 00:05:21.000000000 +0200 @@ -204,7 +204,8 @@ for children in reversed(self.children_stack): for child in children: if isinstance(child, ast.stmt): - return self.lines.get_line_start(child.lineno) + return child.col_offset \ + + self.lines.get_line_start(child.lineno) return len(self.source.source) _operators = {'And': 'and', 'Or': 'or', 'Add': '+', 'Sub': '-', 'Mult': '*', @@ -350,7 +351,8 @@ children = ['from'] if node.level: children.append('.' * node.level) - children.extend([node.module, 'import']) + children.extend([node.module or '', # see comment at rope.base.ast.walk + 'import']) children.extend(self._child_nodes(node.names, ',')) self._handle(node, children) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/rope.egg-info/PKG-INFO new/rope-0.9.4/rope.egg-info/PKG-INFO --- old/rope-0.9.3/rope.egg-info/PKG-INFO 2010-02-04 20:42:25.000000000 +0100 +++ new/rope-0.9.4/rope.egg-info/PKG-INFO 2012-05-16 22:43:09.000000000 +0200 @@ -1,6 +1,6 @@ -Metadata-Version: 1.0 +Metadata-Version: 1.1 Name: rope -Version: 0.9.3 +Version: 0.9.4 Summary: a python refactoring library... Home-page: http://rope.sf.net/ Author: Ali Gholami Rudi @@ -8,7 +8,7 @@ License: GNU GPL Description: ======================================== - rope, a python refactoring library ... + rope, a python refactoring library ... ======================================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/ropetest/__init__.py new/rope-0.9.4/ropetest/__init__.py --- old/rope-0.9.3/ropetest/__init__.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/ropetest/__init__.py 2011-03-03 11:37:35.000000000 +0100 @@ -1,3 +1,4 @@ +import sys import unittest import ropetest.projecttest @@ -31,4 +32,5 @@ if __name__ == '__main__': runner = unittest.TextTestRunner() - runner.run(suite()) + result = runner.run(suite()) + sys.exit(not result.wasSuccessful()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/ropetest/builtinstest.py new/rope-0.9.4/ropetest/builtinstest.py --- old/rope-0.9.3/ropetest/builtinstest.py 2009-12-27 23:45:01.000000000 +0100 +++ new/rope-0.9.4/ropetest/builtinstest.py 2011-09-10 17:09:55.000000000 +0200 @@ -271,6 +271,15 @@ self.assertEquals(pyobjects.get_base_type('Function'), l_var.get_type()) + def test_lambda_function_definition(self): + self.mod.write('l = lambda x, y = 2, *a, **b: x + y\n') + pymod = self.pycore.resource_to_pyobject(self.mod) + l_var = pymod['l'].get_object() + self.assertTrue(l_var.get_name() is not None) + self.assertEquals(len(l_var.get_param_names()), 4) + self.assertEquals((pymod, 1), + pymod['l'].get_definition_location()) + def test_lambdas_that_return_unknown(self): self.mod.write('a_var = (lambda: None)()\n') pymod = self.pycore.resource_to_pyobject(self.mod) @@ -406,6 +415,27 @@ self.assertEquals(builtins.builtins['int'].get_object(), pymod['l'].get_object().get_type()) + def test_binary_or_left_value_unknown(self): + code = 'var = (asdsd or 3)\n' + pymod = self.pycore.get_string_module(code) + self.assertEquals(builtins.builtins['int'].get_object(), + pymod['var'].get_object().get_type()) + + def test_unknown_return_object(self): + src = 'import sys\n' \ + 'def foo():\n' \ + ' res = set(sys.builtin_module_names)\n' \ + ' if foo: res.add(bar)\n' + self.project.prefs['import_dynload_stdmods'] = True + self.mod.write(src) + self.project.pycore.analyze_module(self.mod) + + def test_abstractmethods_attribute(self): + # see http://bugs.python.org/issue10006 for details + src = 'class SubType(type): pass\nsubtype = SubType()\n' + self.mod.write(src) + self.project.pycore.analyze_module(self.mod) + class BuiltinModulesTest(unittest.TestCase): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/ropetest/codeanalyzetest.py new/rope-0.9.4/ropetest/codeanalyzetest.py --- old/rope-0.9.3/ropetest/codeanalyzetest.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/ropetest/codeanalyzetest.py 2011-03-03 11:37:35.000000000 +0100 @@ -58,6 +58,11 @@ result = word_finder.get_primary_at(offset) return result + def test_keyword_before_parens(self): + code = 'if (a_var).an_attr:\n pass\n' + self.assertEquals('(a_var).an_attr', + self._find_primary(code, code.index(':'))) + def test_inside_parans(self): code = 'a_func(a_var)' self.assertEquals('a_var', self._find_primary(code, 10)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/ropetest/contrib/__init__.py new/rope-0.9.4/ropetest/contrib/__init__.py --- old/rope-0.9.3/ropetest/contrib/__init__.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/ropetest/contrib/__init__.py 2011-03-03 11:37:35.000000000 +0100 @@ -1,3 +1,4 @@ +import sys import unittest import ropetest.contrib.autoimporttest @@ -27,4 +28,5 @@ if __name__ == '__main__': runner = unittest.TextTestRunner() - runner.run(suite()) + result = runner.run(suite()) + sys.exit(not result.wasSuccessful()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/ropetest/contrib/codeassisttest.py new/rope-0.9.4/ropetest/contrib/codeassisttest.py --- old/rope-0.9.3/ropetest/contrib/codeassisttest.py 2010-01-06 18:12:53.000000000 +0100 +++ new/rope-0.9.4/ropetest/contrib/codeassisttest.py 2011-03-03 11:37:35.000000000 +0100 @@ -27,12 +27,12 @@ def test_simple_assist(self): self._assist('', 0) - def assert_completion_in_result(self, name, kind, result, type=None): + def assert_completion_in_result(self, name, scope, result, type=None): for proposal in result: if proposal.name == name: - self.assertEqual(kind, proposal.kind, - "proposal <%s> has wrong kind, expected " \ - "%r, got %r" % (name, kind, proposal.kind)) + self.assertEqual(scope, proposal.scope, + "proposal <%s> has wrong scope, expected " \ + "%r, got %r" % (name, scope, proposal.scope)) if type is not None: self.assertEqual(type, proposal.type, "proposal <%s> has wrong type, expected " \ @@ -40,9 +40,9 @@ return self.fail('completion <%s> not proposed' % name) - def assert_completion_not_in_result(self, name, kind, result): + def assert_completion_not_in_result(self, name, scope, result): for proposal in result: - if proposal.name == name and proposal.kind == kind: + if proposal.name == name and proposal.scope == scope: self.fail('completion <%s> was proposed' % name) def test_completing_global_variables(self): @@ -79,7 +79,7 @@ code = 'variable = 10\nvariable = 20\nt = vari' result = self._assist(code) count = len([x for x in result - if x.name == 'variable' and x.kind == 'global']) + if x.name == 'variable' and x.scope == 'global']) self.assertEquals(1, count) @testutils.assert_raises(exceptions.ModuleSyntaxError) @@ -109,12 +109,12 @@ def test_completing_imported_names(self): code = 'import sys\na = sy' result = self._assist(code) - self.assert_completion_in_result('sys', 'global', result) + self.assert_completion_in_result('sys', 'imported', result) def test_completing_imported_names_with_as(self): code = 'import sys as mysys\na = mys' result = self._assist(code) - self.assert_completion_in_result('mysys', 'global', result) + self.assert_completion_in_result('mysys', 'imported', result) def test_not_completing_imported_names_with_as(self): code = 'import sys as mysys\na = sy' @@ -187,7 +187,7 @@ def test_imports_inside_function(self): code = "def f():\n import sys\n sy" result = self._assist(code) - self.assert_completion_in_result('sys', 'local', result) + self.assert_completion_in_result('sys', 'imported', result) def test_imports_inside_function_dont_mix_with_globals(self): code = "def f():\n import sys\nsy" @@ -454,13 +454,13 @@ self.assertEquals('my_func', proposals[0].name) self.assertEquals('_my_func', proposals[1].name) - def test_proposals_sorter_and_kind_prefs(self): + def test_proposals_sorter_and_scope_prefs(self): code = 'my_global_var = 1\n' \ 'def func(self):\n' \ ' my_local_var = 2\n' \ ' my_' result = self._assist(code) - proposals = sorted_proposals(result, kindpref=['global', 'local']) + proposals = sorted_proposals(result, scopepref=['global', 'local']) self.assertEquals('my_global_var', proposals[0].name) self.assertEquals('my_local_var', proposals[1].name) @@ -470,7 +470,7 @@ ' pass\n' \ 'my_' result = self._assist(code) - proposals = sorted_proposals(result, typepref=['variable', 'function']) + proposals = sorted_proposals(result, typepref=['instance', 'function']) self.assertEquals('my_global_var', proposals[0].name) self.assertEquals('my_global_func', proposals[1].name) @@ -719,31 +719,42 @@ doc = get_calltip(self.project, src, src.rindex('f'), remove_self=True) self.assertEquals('C.f(p1)', doc) + def test_lambda_calltip(self): + src = 'foo = lambda x, y=1: None\n' \ + 'foo()' + doc = get_calltip(self.project, src, src.rindex('f')) + self.assertEqual(doc, 'lambda(x, y)') + + def test_keyword_before_parens(self): + code = 'if (1).:\n pass' + result = self._assist(code, offset=len('if (1).')) + self.assertTrue(result) + # TESTING PROPOSAL'S KINDS AND TYPES. # SEE RELATION MATRIX IN `CompletionProposal`'s DOCSTRING def test_local_variable_completion_proposal(self): code = 'def foo():\n xvar = 5\n x' result = self._assist(code) - self.assert_completion_in_result('xvar', 'local', result, 'variable') + self.assert_completion_in_result('xvar', 'local', result, 'instance') def test_global_variable_completion_proposal(self): code = 'yvar = 5\ny' result = self._assist(code) - self.assert_completion_in_result('yvar', 'global', result, 'variable') + self.assert_completion_in_result('yvar', 'global', result, 'instance') def test_builtin_variable_completion_proposal(self): for varname in ('False', 'True'): result = self._assist(varname[0]) self.assert_completion_in_result(varname, 'builtin', result, - type='variable') + type='instance') def test_attribute_variable_completion_proposal(self): code = 'class AClass(object):\n def foo(self):\n ' \ 'self.bar = 1\n self.b' result = self._assist(code) self.assert_completion_in_result('bar', 'attribute', result, - type='variable') + type='instance') def test_local_class_completion_proposal(self): code = 'def foo():\n class LocalClass(object): pass\n Lo' @@ -797,26 +808,26 @@ def test_local_module_completion_proposal(self): code = 'def foo():\n import types\n t' result = self._assist(code) - self.assert_completion_in_result('types', 'local', result, + self.assert_completion_in_result('types', 'imported', result, type='module') def test_global_module_completion_proposal(self): code = 'import operator\no' result = self._assist(code) - self.assert_completion_in_result('operator', 'global', result, + self.assert_completion_in_result('operator', 'imported', result, type='module') def test_attribute_module_completion_proposal(self): code = 'class Some(object):\n import os\nSome.o' result = self._assist(code) - self.assert_completion_in_result('os', 'attribute', result, + self.assert_completion_in_result('os', 'imported', result, type='module') def test_builtin_exception_completion_proposal(self): code = 'def blah():\n Z' result = self._assist(code) self.assert_completion_in_result('ZeroDivisionError', 'builtin', - result, type='exception') + result, type='class') def test_keyword_completion_proposal(self): code = 'f' @@ -855,41 +866,41 @@ def _assist(self, code, resource=None, **kwds): return code_assist(self.project, code, len(code), resource, **kwds) - def assert_completion_in_result(self, name, kind, result): + def assert_completion_in_result(self, name, scope, result): for proposal in result: - if proposal.name == name and proposal.kind == kind: + if proposal.name == name and proposal.scope == scope: return self.fail('completion <%s> not proposed' % name) - def assert_completion_not_in_result(self, name, kind, result): + def assert_completion_not_in_result(self, name, scope, result): for proposal in result: - if proposal.name == name and proposal.kind == kind: + if proposal.name == name and proposal.scope == scope: self.fail('completion <%s> was proposed' % name) def test_simple_import(self): code = 'import samplemod\nsample' result = self._assist(code) - self.assert_completion_in_result('samplemod', 'global', result) + self.assert_completion_in_result('samplemod', 'imported', result) def test_from_import_class(self): code = 'from samplemod import SampleClass\nSample' result = self._assist(code) - self.assert_completion_in_result('SampleClass', 'global', result) + self.assert_completion_in_result('SampleClass', 'imported', result) def test_from_import_function(self): code = 'from samplemod import sample_func\nsample' result = self._assist(code) - self.assert_completion_in_result('sample_func', 'global', result) + self.assert_completion_in_result('sample_func', 'imported', result) def test_from_import_variable(self): code = 'from samplemod import sample_var\nsample' result = self._assist(code) - self.assert_completion_in_result('sample_var', 'global', result) + self.assert_completion_in_result('sample_var', 'imported', result) def test_from_imports_inside_functions(self): code = 'def f():\n from samplemod import SampleClass\n Sample' result = self._assist(code) - self.assert_completion_in_result('SampleClass', 'local', result) + self.assert_completion_in_result('SampleClass', 'imported', result) def test_from_import_only_imports_imported(self): code = 'from samplemod import sample_func\nSample' @@ -899,13 +910,13 @@ def test_from_import_star(self): code = 'from samplemod import *\nSample' result = self._assist(code) - self.assert_completion_in_result('SampleClass', 'global', result) + self.assert_completion_in_result('SampleClass', 'imported', result) def test_from_import_star2(self): code = 'from samplemod import *\nsample' result = self._assist(code) - self.assert_completion_in_result('sample_func', 'global', result) - self.assert_completion_in_result('sample_var', 'global', result) + self.assert_completion_in_result('sample_func', 'imported', result) + self.assert_completion_in_result('sample_var', 'imported', result) def test_from_import_star_not_imporing_underlined(self): code = 'from samplemod import *\n_under' @@ -915,7 +926,7 @@ def test_from_package_import_mod(self): code = 'from package import nestedmod\nnest' result = self._assist(code) - self.assert_completion_in_result('nestedmod', 'global', result) + self.assert_completion_in_result('nestedmod', 'imported', result) def test_completing_after_dot(self): code = 'class SampleClass(object):\n' \ @@ -973,7 +984,7 @@ mod1.write('def a_func():\n pass\n') code = 'import mod1\nmod1.' result = self._assist(code, resource=mod2) - self.assert_completion_in_result('a_func', 'attribute', result) + self.assert_completion_in_result('a_func', 'imported', result) def test_get_location_on_relative_imports(self): pkg = testutils.create_package(self.project, 'pkg') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/ropetest/pycoretest.py new/rope-0.9.4/ropetest/pycoretest.py --- old/rope-0.9.3/ropetest/pycoretest.py 2009-12-27 23:29:30.000000000 +0100 +++ new/rope-0.9.4/ropetest/pycoretest.py 2011-04-04 20:15:12.000000000 +0200 @@ -998,6 +998,18 @@ mod1.write('class A(object):\n def func2(self):\n pass\n') self.assertTrue('func2' in b_class) + def test_caching_pymodule_with_syntax_errors(self): + self.project.prefs['ignore_syntax_errors'] = True + self.project.prefs['automatic_soa'] = True + self.project.pycore._init_automatic_soa() + source = 'import sys\nab cd' + mod = testutils.create_module(self.project, 'mod') + mod.write(source) + from rope.contrib import fixsyntax + fixer = fixsyntax.FixSyntax(self.project.pycore, source, mod, 10) + pymodule = fixer.get_pymodule() + self.assertTrue(pymodule.source_code.startswith('import sys\npass\n')) + class TextChangeDetectorTest(unittest.TestCase): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/ropetest/refactor/__init__.py new/rope-0.9.4/ropetest/refactor/__init__.py --- old/rope-0.9.3/ropetest/refactor/__init__.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/ropetest/refactor/__init__.py 2011-03-03 11:37:35.000000000 +0100 @@ -921,4 +921,5 @@ unittest.main() else: runner = unittest.TextTestRunner() - runner.run(suite()) + result = runner.run(suite()) + sys.exit(not result.wasSuccessful()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/ropetest/refactor/movetest.py new/rope-0.9.4/ropetest/refactor/movetest.py --- old/rope-0.9.3/ropetest/refactor/movetest.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/ropetest/refactor/movetest.py 2011-03-03 11:37:35.000000000 +0100 @@ -502,6 +502,17 @@ dir = self.project.root.create_folder('dir') mover = move.create_move(self.project, dir) + def test_moving_to_a_module_with_encoding_cookie(self): + code1 = '# -*- coding: utf-8 -*-' + self.mod1.write(code1) + code2 = 'def f(): pass\n' + self.mod2.write(code2) + mover = move.create_move(self.project, self.mod2, + code2.index('f()') + 1) + self.project.do(mover.get_changes(self.mod1)) + expected = '%s\n%s' % (code1, code2) + self.assertEquals(expected, self.mod1.read()) + if __name__ == '__main__': unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/ropetest/refactor/patchedasttest.py new/rope-0.9.4/ropetest/refactor/patchedasttest.py --- old/rope-0.9.3/ropetest/refactor/patchedasttest.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/ropetest/refactor/patchedasttest.py 2011-04-12 22:50:17.000000000 +0200 @@ -441,6 +441,17 @@ 'import', ' ', 'alias']) checker.check_children('alias', ['y', ' ', 'as', ' ', 'z']) + @testutils.run_only_for_25 + def test_from_node_relative_import(self): + source = 'from . import y as z\n' + ast = patchedast.get_patched_ast(source, True) + checker = _ResultChecker(self, ast) + checker.check_region('ImportFrom', 0, len(source) - 1) + checker.check_children( + 'ImportFrom', ['from', ' ', '.', '', '', ' ', + 'import', ' ', 'alias']) + checker.check_children('alias', ['y', ' ', 'as', ' ', 'z']) + def test_simple_gen_expr_node(self): source = 'zip(i for i in x)\n' ast = patchedast.get_patched_ast(source, True) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rope-0.9.3/ropetest/refactor/restructuretest.py new/rope-0.9.4/ropetest/refactor/restructuretest.py --- old/rope-0.9.3/ropetest/refactor/restructuretest.py 2009-07-12 19:36:17.000000000 +0200 +++ new/rope-0.9.4/ropetest/refactor/restructuretest.py 2011-09-09 00:03:51.000000000 +0200 @@ -175,6 +175,13 @@ self.assertEquals('def f(p):\n return dup(p)\nx = dup("")\n' 'i = 1 * 2\n', self.mod.read()) + def test_statement_after_string_and_column(self): + mod_text = 'def f(x):\n if a == "a": raise Exception("test")\n' + self.mod.write(mod_text) + refactoring = restructure.Restructure(self.project, '${a}', '${a}') + self.project.do(refactoring.get_changes()) + self.assertEquals(mod_text, self.mod.read()) + if __name__ == '__main__': unittest.main() -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
