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]

Reply via email to