http://scons.tigris.org/issues/show_bug.cgi?id=2345
authorgregnoel <gregnoel@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 15 Apr 2010 19:21:08 +0000 (19:21 +0000)
committergregnoel <gregnoel@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 15 Apr 2010 19:21:08 +0000 (19:21 +0000)
Fixes due to running the regression tests with the '-3' option to Python2.6,
which causes the run-time to look for potential compatibility problems with
Python 3.x.  In some cases, all we can do is quiet the warning since we still
support Python versions that can't use the newer idiom.  In other cases, we
fix the problem.  This patch contains a mix of quieting and fixing, plus a
little lint.

git-svn-id: http://scons.tigris.org/svn/scons/trunk@4787 fdb21ef1-2011-0410-befe-b5e4ea1792b1

15 files changed:
QMTest/TestCmd.py
QMTest/TestSCons.py
QMTest/unittest.py
src/engine/SCons/Builder.py
src/engine/SCons/EnvironmentTests.py
src/engine/SCons/Node/FS.py
src/engine/SCons/Node/FSTests.py
src/engine/SCons/Script/Main.py
src/engine/SCons/Taskmaster.py
src/engine/SCons/Variables/__init__.py
src/engine/SCons/compat/__init__.py
src/engine/SCons/compat/_scons_builtins.py
src/engine/SCons/cpp.py
test/NodeOps.py
test/exitfns.py

index 6f53892841f85835b88854cc0aa0fc738cc6f644..1568b0de03f39af933014aafe681a3af6f85218a 100644 (file)
@@ -581,9 +581,8 @@ except ImportError:
     # The subprocess module doesn't exist in this version of Python,
     # so we're going to cobble up something that looks just enough
     # like its API for our purposes below.
-    import new
-
-    subprocess = new.module('subprocess')
+    from types import ModuleType
+    class subprocess(ModuleType): pass
 
     subprocess.PIPE = 'PIPE'
     subprocess.STDOUT = 'STDOUT'
index d61c0089fe77b1f0ff4cccc379bd4520cfd0a937..a4e9c86c7bed6d0780145314e1a99495561ba220 100644 (file)
@@ -1259,12 +1259,8 @@ class TimeSCons(TestSCons):
         for root, dirs, files in os.walk(source_dir):
             if '.svn' in dirs:
                 dirs.remove('.svn')
-            # TODO(1.5)
-            #dirs = [ d for d in dirs if not d.startswith('TimeSCons-') ]
-            #files = [ f for f in files if not f.startswith('TimeSCons-') ]
-            not_timescons_entries = lambda s: not s.startswith('TimeSCons-')
-            dirs = list(filter(not_timescons_entries, dirs))
-            files = list(filter(not_timescons_entries, files))
+            dirs = [ d for d in dirs if not d.startswith('TimeSCons-') ]
+            files = [ f for f in files if not f.startswith('TimeSCons-') ]
             for dirname in dirs:
                 source = os.path.join(root, dirname)
                 destination = source.replace(source_dir, dest_dir)
index 1d87c1528cfa564e42d087272ecf77486ddfae0f..4a4433ee5c440c01483943be835e9721636d521a 100644 (file)
@@ -344,7 +344,10 @@ def getTestCaseNames(testCaseClass, prefix, sortUsing=cmp):
         testFnNames = testFnNames + \
                       getTestCaseNames(baseclass, prefix, sortUsing=None)
     if sortUsing:
-        testFnNames.sort(sortUsing)
+        # sortUsing is only either 'None' or 'cmp' so don't bother with arg
+        # which is not supported in Py3k.
+        #testFnNames.sort(sortUsing)
+        testFnNames.sort()
     return testFnNames
 
 
index bbf503c07d7b22f31a41ac40e1d442b7ca57d049..1d20a4fd9f10ce0a979559237a5cf233ed676e36 100644 (file)
@@ -122,7 +122,7 @@ def match_splitext(path, suffixes = []):
     if suffixes:
         matchsuf = [S for S in suffixes if path[-len(S):] == S]
         if matchsuf:
-            suf = max(list(map(None, list(map(len, matchsuf)), matchsuf)))[1]
+            suf = max([(len(_f),_f) for _f in matchsuf])[1]
             return [path[:-len(suf)], path[-len(suf):]]
     return SCons.Util.splitext(path)
 
index 9f0e167e1e870d263c40c9fc848ed307c2012294..99b3d936e895a8bcdcc00e4ff322b5989aca4478 100644 (file)
@@ -25,13 +25,13 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 
 import SCons.compat
 
-import collections
 import copy
 import io
 import os
 import sys
 import TestCmd
 import unittest
+from collections import UserDict as UD, UserList as UL
 
 from SCons.Environment import *
 import SCons.Warnings
@@ -126,15 +126,15 @@ class Scanner:
 
 
 
-class CLVar(collections.UserList):
+class CLVar(UL):
     def __init__(self, seq):
         if isinstance(seq, str):
             seq = seq.split()
-        collections.UserList.__init__(self, seq)
+        UL.__init__(self, seq)
     def __add__(self, other):
-        return collections.UserList.__add__(self, CLVar(other))
+        return UL.__add__(self, CLVar(other))
     def __radd__(self, other):
-        return collections.UserList.__radd__(self, CLVar(other))
+        return UL.__radd__(self, CLVar(other))
     def __coerce__(self, other):
         return (self, CLVar(other))
 
@@ -1479,11 +1479,6 @@ def exists(env):
         b2 = Environment()['BUILDERS']
         assert b1 == b2, diff_dict(b1, b2)
 
-        import UserDict
-        UD = collections.UserDict
-        import UserList
-        UL = collections.UserList
-
         cases = [
             'a1',       'A1',           'a1A1',
             'a2',       ['A2'],         ['a2', 'A2'],
@@ -2151,11 +2146,6 @@ f5: \
     def test_Prepend(self):
         """Test prepending to construction variables in an Environment
         """
-        import UserDict
-        UD = collections.UserDict
-        import UserList
-        UL = collections.UserList
-
         cases = [
             'a1',       'A1',           'A1a1',
             'a2',       ['A2'],         ['A2', 'a2'],
index 6dd5b0b78db163b4b6025e9e21ea442ca429ba27..c8b900fa6c2783d8154d3a9216827309e6142da7 100644 (file)
@@ -1960,8 +1960,7 @@ class Dir(Base):
             if strings:
                 r = [os.path.join(str(dir), x) for x in r]
             result.extend(r)
-        result.sort(lambda a, b: cmp(str(a), str(b)))
-        return result
+        return sorted(result, key=lambda a: str(a))
 
     def _glob1(self, pattern, ondisk=True, source=False, strings=False):
         """
index 8ced54887e0540e6f840c6446767701faba764aa..339d1245d50c9a3c4f7d67364d3a2e0d51e722a3 100644 (file)
@@ -2251,7 +2251,7 @@ class GlobTestCase(_tempdirTestCase):
         for input, string_expect, node_expect in cases:
             r = self.fs.Glob(input, **kwargs)
             if node_expect:
-                r.sort(lambda a,b: cmp(a.path, b.path))
+                r = sorted(r, key=lambda a: a.path)
                 result = []
                 for n in node_expect:
                     if isinstance(n, str):
index 96fc4b74cafda752b7d74c08ba1794a674decf38..7a8f6980d7220e7c1297f226572d476e050f2936 100644 (file)
@@ -528,7 +528,7 @@ class MemStats(Stats):
         self.stats.append(SCons.Debug.memory())
     def do_print(self):
         fmt = 'Memory %-32s %12d\n'
-        for label, stats in map(None, self.labels, self.stats):
+        for label, stats in zip(self.labels, self.stats):
             self.outfp.write(fmt % (label, stats))
 
 memory_stats = MemStats()
index f60b2e254b3e77e0822a1ebcdf02bffbd01b32a9..e55757ad06fda46c25320e3eec2ad5eb30c3e6ca 100644 (file)
@@ -107,8 +107,7 @@ fmt = "%(considered)3d "\
       "%(build)3d "
 
 def dump_stats():
-    StatsNodes.sort(lambda a, b: cmp(str(a), str(b)))
-    for n in StatsNodes:
+    for n in sorted(StatsNodes, key=lambda a: str(a)):
         print (fmt % n.stats.__dict__) + str(n)
 
 
index 171c09805edef7998cb44267bc8ad82fae9ab60e..750d4b3c41718a11cf721c6055eebe3873bbeeaf 100644 (file)
@@ -284,7 +284,7 @@ class Variables:
         """
 
         if sort:
-            options = sorted(self.options, cmp=lambda x,y: sort(x.key,y.key))
+            options = sorted(self.options, key=lambda x: x.key)
         else:
             options = self.options
 
index a68ef72ef3db2944ec774f62ed2607342d1a9106..62c6467549a394b774879d81310b1857cbd5ff7e 100644 (file)
@@ -227,18 +227,23 @@ except AttributeError:
     os.path.lexists = lexists
 
 
-try:
-    # Use the "imp" module to protect the import from fixers.
-    import imp
-    _cPickle = imp.load_module('cPickle', *imp.find_module('cPickle'))
-except ImportError, e:
-    # The "cPickle" module has already been eliminated in favor of
-    # having "import pickle" import the fast version when available.
-    pass
-else:
-    import sys
-    sys.modules['pickle'] = _cPickle
-    del _cPickle
+# When we're using the '-3' option during regression tests, importing
+# cPickle gives a warning no matter how it's done, so always use the
+# real profile module, whether it's fast or not.
+if os.environ.get('SCONS_HORRIBLE_REGRESSION_TEST_HACK') is None:
+    # Not a regression test with '-3', so try to use faster version.
+    try:
+        # Use the "imp" module to protect the import from fixers.
+        import imp
+        _cPickle = imp.load_module('cPickle', *imp.find_module('cPickle'))
+    except ImportError, e:
+        # The "cPickle" module has already been eliminated in favor of
+        # having "import pickle" import the fast version when available.
+        pass
+    else:
+        import sys
+        sys.modules['pickle'] = _cPickle
+        del _cPickle
 
 
 try:
@@ -387,6 +392,24 @@ except AttributeError:
     del mkstemp
 
 
+if os.environ.get('SCONS_HORRIBLE_REGRESSION_TEST_HACK') is not None:
+    # We can't apply the 'callable' fixer until the floor is 2.6, but the
+    # '-3' option to Python 2.6 and 2.7 generates almost ten thousand
+    # warnings.  This hack allows us to run regression tests with the '-3'
+    # option by replacing the callable() built-in function with a hack
+    # that performs the same function but doesn't generate the warning.
+    # Note that this hack is ONLY intended to be used for regression
+    # testing, and should NEVER be used for real runs.
+    from types import ClassType
+    def callable(obj):
+        if hasattr(obj, '__call__'): return True
+        if isinstance(obj, (ClassType, type)): return True
+        return False
+    import builtins
+    builtins.callable = callable
+    del callable
+
+
 # Local Variables:
 # tab-width:4
 # indent-tabs-mode:nil
index 6a725c1e44fcd6a8a413ad76d3daf95c0c0c80c7..012d6c2f0271db56cd262ac33a7ba062c52ef2ed 100644 (file)
@@ -127,7 +127,7 @@ except NameError:
     # Pre-2.2 Python has no False keyword.
     builtins.False = not 1
     # Assign to False in this module namespace so it shows up in pydoc output.
-    False = False
+    #False = False
 
 try:
     True
@@ -135,7 +135,7 @@ except NameError:
     # Pre-2.2 Python has no True keyword.
     builtins.True = not 0
     # Assign to True in this module namespace so it shows up in pydoc output.
-    True = True
+    #True = True
 
 try:
     file
index 80b1c8bdf79976e8ef02a26e61dfdcfe9fdb13cf..9442942015130f629ee85881fbc7c5d032a694d8 100644 (file)
@@ -133,7 +133,7 @@ CPP_to_Python_Ops_Sub = lambda m: CPP_to_Python_Ops_Dict[m.group(0)]
 # re module, as late as version 2.2.2, empirically matches the
 # "!" in "!=" first, instead of finding the longest match.
 # What's up with that?
-l = sorted(CPP_to_Python_Ops_Dict.keys(), cmp=lambda a, b: cmp(len(b), len(a)))
+l = sorted(CPP_to_Python_Ops_Dict.keys(), key=lambda a: len(a), reverse=True)
 
 # Turn the list of keys into one regular expression that will allow us
 # to substitute all of the operators at once.
index e4a403f99b13a29903d8b0f1a16916f554d169bc..6de7d0914c44c763a641fc140ab5394a1d9e41d9 100644 (file)
@@ -70,7 +70,7 @@ if %(_E)s:
   real1 = [os.path.exists(str(N)) for N in Nodes]
   exists = [N.exists() for N in Nodes]
   real2 = [os.path.exists(str(N)) for N in Nodes]
-  for N,D,R,E,F in map(None, Nodes, derived, real1, exists, real2):
+  for N,D,R,E,F in zip(Nodes, derived, real1, exists, real2):
     print '%%s: %%s %%s %%s %%s'%%(N,D,R,E,F)
 foo.SharedLibrary(target = 'foo', source = 'foo%(_obj)s')
 bar.SharedLibrary(target = 'bar', source = 'bar%(_obj)s')
index 3fc13228a39db8f1e3a10c514fe3fca4269a1c7f..f64969bb88c3a148c996c7d72fbf739523f47921 100644 (file)
@@ -34,9 +34,9 @@ from SCons.exitfuncs import *
 def x1():
     print "running x1"
 def x2(n):
-    print "running x2(%s)" % `n`
+    print "running x2(%s)" % repr(n)
 def x3(n, kwd=None):
-    print "running x3(%s, kwd=%s)" % (`n`, `kwd`)
+    print "running x3(%s, kwd=%s)" % (repr(n), repr(kwd))
 
 register(x3, "no kwd args")
 register(x1)