summaryrefslogtreecommitdiffstats
path: root/SCons
diff options
context:
space:
mode:
authorWilliam Deegan <bill@baddogconsulting.com>2020-08-02 17:45:34 (GMT)
committerGitHub <noreply@github.com>2020-08-02 17:45:34 (GMT)
commit316895b4fe0f73ae6708837fa64a71a0577f8d85 (patch)
tree5c41c58a1d1f68b342915008c451ce09d06f9fc8 /SCons
parent42e0f0351c982cc05cfcd843afb8ecb560832d77 (diff)
parentf74c9aa5b64543ebecce5528ed117a0f5026e4a6 (diff)
downloadSCons-316895b4fe0f73ae6708837fa64a71a0577f8d85.zip
SCons-316895b4fe0f73ae6708837fa64a71a0577f8d85.tar.gz
SCons-316895b4fe0f73ae6708837fa64a71a0577f8d85.tar.bz2
Merge pull request #3760 from mwichmann/env.setdefault
Enable environment dict.setdefault
Diffstat (limited to 'SCons')
-rw-r--r--SCons/Environment.py21
-rw-r--r--SCons/EnvironmentTests.py55
2 files changed, 70 insertions, 6 deletions
diff --git a/SCons/Environment.py b/SCons/Environment.py
index 1e3cfdf..bb57e37 100644
--- a/SCons/Environment.py
+++ b/SCons/Environment.py
@@ -452,6 +452,10 @@ class SubstitutionEnvironment:
"""Emulates the items() method of dictionaries."""
return self._dict.items()
+ def setdefault(self, key, default=None):
+ """Emulates the setdefault() method of dictionaries."""
+ return self._dict.setdefault(key, default)
+
def arg2nodes(self, args, node_factory=_null, lookup_list=_null, **kw):
if node_factory is _null:
node_factory = self.fs.File
@@ -2407,10 +2411,15 @@ class OverrideEnvironment(Base):
return 1
return self.__dict__['__subject'].__contains__(key)
- def Dictionary(self):
+ def Dictionary(self, *args):
d = self.__dict__['__subject'].Dictionary().copy()
d.update(self.__dict__['overrides'])
- return d
+ if not args:
+ return d
+ dlist = [d[x] for x in args]
+ if len(dlist) == 1:
+ dlist = dlist[0]
+ return dlist
def items(self):
"""Emulates the items() method of dictionaries."""
@@ -2424,6 +2433,14 @@ class OverrideEnvironment(Base):
"""Emulates the values() method of dictionaries."""
return self.Dictionary().values()
+ def setdefault(self, key, default=None):
+ """Emulates the setdefault() method of dictionaries."""
+ try:
+ return self.__getitem__(key)
+ except KeyError:
+ self.__dict__['overrides'][key] = default
+ return default
+
# Overridden private construction environment methods.
def _update(self, other):
self.__dict__['overrides'].update(other)
diff --git a/SCons/EnvironmentTests.py b/SCons/EnvironmentTests.py
index f90e39d..b8f18d5 100644
--- a/SCons/EnvironmentTests.py
+++ b/SCons/EnvironmentTests.py
@@ -180,7 +180,6 @@ class SubstitutionTestCase(unittest.TestCase):
def test___cmp__(self):
"""Test comparing SubstitutionEnvironments."""
-
env1 = SubstitutionEnvironment(XXX = 'x')
env2 = SubstitutionEnvironment(XXX = 'x')
env3 = SubstitutionEnvironment(XXX = 'xxx')
@@ -203,8 +202,7 @@ class SubstitutionTestCase(unittest.TestCase):
assert env['XXX'] == 'x', env['XXX']
def test___setitem__(self):
- """Test setting a variable in a SubstitutionEnvironment
- """
+ """Test setting a variable in a SubstitutionEnvironment."""
env1 = SubstitutionEnvironment(XXX = 'x')
env2 = SubstitutionEnvironment(XXX = 'x', YYY = 'y')
env1['YYY'] = 'y'
@@ -255,6 +253,13 @@ class SubstitutionTestCase(unittest.TestCase):
for k, v in testdata.items():
assert (k, v) in items, items
+ def test_setdefault(self):
+ """Test the SubstitutionEnvironment setdefault() method."""
+ env = SubstitutionEnvironment(XXX = 'x')
+ assert env.setdefault('XXX', 'z') == 'x', env['XXX']
+ assert env.setdefault('YYY', 'y') == 'y', env['YYY']
+ assert 'YYY' in env
+
def test_arg2nodes(self):
"""Test the arg2nodes method."""
env = SubstitutionEnvironment()
@@ -3583,15 +3588,27 @@ class OverrideEnvironmentTestCase(unittest.TestCase,TestEnvironmentFixture):
assert 'ZZZ' not in env2
assert 'ZZZ' in env3
- def test_items(self):
+ def test_Dictionary(self):
"""Test the OverrideEnvironment Dictionary() method"""
env, env2, env3 = self.envs
+ # nothing overrriden
items = env.Dictionary()
assert items == {'XXX' : 'x', 'YYY' : 'y'}, items
+ # env2 overrides XXX, YYY unchanged
items = env2.Dictionary()
assert items == {'XXX' : 'x2', 'YYY' : 'y'}, items
+ # env3 overrides XXX, YYY, adds ZZZ
items = env3.Dictionary()
assert items == {'XXX' : 'x3', 'YYY' : 'y3', 'ZZZ' : 'z3'}, items
+ # test one-arg and multi-arg Dictionary
+ assert env3.Dictionary('XXX') == 'x3', env3.Dictionary('XXX')
+ xxx, yyy = env2.Dictionary('XXX', 'YYY')
+ assert xxx == 'x2', xxx
+ assert yyy == 'y', yyy
+ del env3['XXX']
+ assert 'XXX' not in env3.Dictionary()
+ assert 'XXX' not in env2.Dictionary()
+ assert 'XXX' not in env.Dictionary()
def test_items(self):
"""Test the OverrideEnvironment items() method"""
@@ -3603,6 +3620,36 @@ class OverrideEnvironmentTestCase(unittest.TestCase,TestEnvironmentFixture):
items = sorted(env3.items())
assert items == [('XXX', 'x3'), ('YYY', 'y3'), ('ZZZ', 'z3')], items
+ def test_keys(self):
+ """Test the OverrideEnvironment keys() method"""
+ env, env2, env3 = self.envs
+ keys = sorted(env.keys())
+ assert keys == ['XXX', 'YYY'], keys
+ keys = sorted(env2.keys())
+ assert keys == ['XXX', 'YYY'], keys
+ keys = sorted(env3.keys())
+ assert keys == ['XXX', 'YYY', 'ZZZ'], keys
+
+ def test_values(self):
+ """Test the OverrideEnvironment values() method"""
+ env, env2, env3 = self.envs
+ values = sorted(env.values())
+ assert values == ['x', 'y'], values
+ values = sorted(env2.values())
+ assert values == ['x2', 'y'], values
+ values = sorted(env3.values())
+ assert values == ['x3', 'y3', 'z3'], values
+
+ def test_setdefault(self):
+ """Test the OverrideEnvironment setdefault() method."""
+ env, env2, env3 = self.envs
+ # does not set for existing key
+ assert env2.setdefault('XXX', 'z') == 'x2', env2['XXX']
+ # set/return using default for non-existing key
+ assert env2.setdefault('ZZZ', 'z2') == 'z2', env2['ZZZ']
+ # set did not leak through to base env
+ assert 'ZZZ' not in env
+
def test_gvars(self):
"""Test the OverrideEnvironment gvars() method"""
env, env2, env3 = self.envs