summaryrefslogtreecommitdiffstats
path: root/src/engine
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2004-11-12 01:36:40 (GMT)
committerSteven Knight <knight@baldmt.com>2004-11-12 01:36:40 (GMT)
commit6490c78eb19131781f133369313dc1a47470e4f0 (patch)
treeb9af8957741845e092043c9b4c264da3a4d1547b /src/engine
parentd7bc6d2744d598e36b787dd2b2817c5bbe0516bd (diff)
downloadSCons-6490c78eb19131781f133369313dc1a47470e4f0.zip
SCons-6490c78eb19131781f133369313dc1a47470e4f0.tar.gz
SCons-6490c78eb19131781f133369313dc1a47470e4f0.tar.bz2
On Python 2.x, return lists of Nodes from builders as a NodeList object with a defined __str__ method().
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/SCons/Builder.py3
-rw-r--r--src/engine/SCons/BuilderTests.py44
-rw-r--r--src/engine/SCons/Node/NodeTests.py35
-rw-r--r--src/engine/SCons/Node/__init__.py15
4 files changed, 90 insertions, 7 deletions
diff --git a/src/engine/SCons/Builder.py b/src/engine/SCons/Builder.py
index 40361d4..95c6bd2 100644
--- a/src/engine/SCons/Builder.py
+++ b/src/engine/SCons/Builder.py
@@ -126,6 +126,7 @@ import SCons.Action
from SCons.Debug import logInstanceCreation
from SCons.Errors import InternalError, UserError
import SCons.Executor
+import SCons.Node
import SCons.Node.FS
import SCons.Util
import SCons.Warnings
@@ -578,7 +579,7 @@ class BuilderBase:
builder = ListBuilder(self, env, tlist)
_init_nodes(builder, env, overwarn.data, executor_kw, tlist, slist)
- return tlist
+ return SCons.Node.NodeList(tlist)
def __call__(self, env, target=None, source=None, chdir=_null, **kw):
# We now assume that target and source are lists or None.
diff --git a/src/engine/SCons/BuilderTests.py b/src/engine/SCons/BuilderTests.py
index 98e5a58..4a18182 100644
--- a/src/engine/SCons/BuilderTests.py
+++ b/src/engine/SCons/BuilderTests.py
@@ -34,6 +34,7 @@ import os.path
import sys
import types
import unittest
+import UserList
import TestCmd
@@ -206,8 +207,8 @@ class BuilderTestCase(unittest.TestCase):
target_factory=MyNode,
source_factory=MyNode)
- n1 = MyNode("n1");
- n2 = MyNode("n2");
+ n1 = MyNode("n1")
+ n2 = MyNode("n2")
builder(env, target = n1, source = n2)
assert env_arg2nodes_called
assert n1.env == env, n1.env
@@ -216,15 +217,48 @@ class BuilderTestCase(unittest.TestCase):
assert n1.executor, "no executor found"
assert not hasattr(n2, 'env')
- target = builder(env, target = 'n3', source = 'n4')[0]
+ l = [1]
+ ul = UserList.UserList([2])
+ try:
+ l.extend(ul)
+ except TypeError:
+ def mystr(l):
+ return str(map(str, l))
+ else:
+ mystr = str
+
+ nnn1 = MyNode("nnn1")
+ nnn2 = MyNode("nnn2")
+ tlist = builder(env, target = [nnn1, nnn2], source = [])
+ s = mystr(tlist)
+ assert s == "['nnn1', 'nnn2']", s
+ l = map(str, tlist)
+ assert l == ['nnn1', 'nnn2'], l
+
+ tlist = builder(env, target = 'n3', source = 'n4')
+ s = mystr(tlist)
+ assert s == "['n3']", s
+ target = tlist[0]
+ l = map(str, tlist)
+ assert l == ['n3'], l
assert target.name == 'n3'
assert target.sources[0].name == 'n4'
- target = builder(env, target = 'n4 n5', source = ['n6 n7'])[0]
+ tlist = builder(env, target = 'n4 n5', source = ['n6 n7'])
+ s = mystr(tlist)
+ assert s == "['n4 n5']", s
+ l = map(str, tlist)
+ assert l == ['n4 n5'], l
+ target = tlist[0]
assert target.name == 'n4 n5'
assert target.sources[0].name == 'n6 n7'
- target = builder(env, target = ['n8 n9'], source = 'n10 n11')[0]
+ tlist = builder(env, target = ['n8 n9'], source = 'n10 n11')
+ s = mystr(tlist)
+ assert s == "['n8 n9']", s
+ l = map(str, tlist)
+ assert l == ['n8 n9'], l
+ target = tlist[0]
assert target.name == 'n8 n9'
assert target.sources[0].name == 'n10 n11'
diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py
index e7d3061..657ac9b 100644
--- a/src/engine/SCons/Node/NodeTests.py
+++ b/src/engine/SCons/Node/NodeTests.py
@@ -24,9 +24,12 @@
__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
import os
+import re
+import string
import sys
import types
import unittest
+import UserList
import SCons.Errors
import SCons.Node
@@ -1118,9 +1121,39 @@ class NodeTestCase(unittest.TestCase):
n1.call_for_all_waiting_parents(func)
assert result == [n1, n2], result
+class NodeListTestCase(unittest.TestCase):
+ def test___str__(self):
+ """Test"""
+ n1 = MyNode("n1")
+ n2 = MyNode("n2")
+ n3 = MyNode("n3")
+ nl = SCons.Node.NodeList([n3, n2, n1])
+
+ l = [1]
+ ul = UserList.UserList([2])
+ try:
+ l.extend(ul)
+ except TypeError:
+ # An older version of Python (*cough* 1.5.2 *cough*)
+ # that doesn't allow UserList objects to extend lists.
+ pass
+ else:
+ s = str(nl)
+ assert s == "['n3', 'n2', 'n1']", s
+
+ r = repr(nl)
+ r = re.sub('at (0x)?[0-9a-z]+', 'at 0x', repr(nl))
+ l = string.join(["<__main__.MyNode instance at 0x>"]*3, ", ")
+ assert r == '[%s]' % l, r
+
if __name__ == "__main__":
- suite = unittest.makeSuite(NodeTestCase, 'test_')
+ suite = unittest.TestSuite()
+ tclasses = [ NodeTestCase,
+ NodeListTestCase ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(map(tclass, names))
if not unittest.TextTestRunner().run(suite).wasSuccessful():
sys.exit(1)
diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py
index ef0a096..36b0aed 100644
--- a/src/engine/SCons/Node/__init__.py
+++ b/src/engine/SCons/Node/__init__.py
@@ -48,6 +48,7 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
import copy
import string
+import UserList
from SCons.Debug import logInstanceCreation
import SCons.SConsign
@@ -958,6 +959,20 @@ class Node:
lines = ["%s:\n" % preamble] + lines
return string.join(lines, ' '*11)
+l = [1]
+ul = UserList.UserList([2])
+try:
+ l.extend(ul)
+except TypeError:
+ def NodeList(l):
+ return l
+else:
+ class NodeList(UserList.UserList):
+ def __str__(self):
+ return str(map(str, self.data))
+del l
+del ul
+
def get_children(node, parent): return node.children()
def ignore_cycle(node, stack): pass
def do_nothing(node, parent): pass