Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 155374d

Browse files
committed
Merged revisions 72167 via svnmerge from
svn+ssh://[email protected]/python/trunk ........ r72167 | walter.doerwald | 2009-05-01 19:35:37 +0200 (Fr, 01 Mai 2009) | 5 lines Make test.test_support.EnvironmentVarGuard behave like a dictionary. All changes are mirrored to the underlying os.environ dict, but rolled back on exit from the with block. ........
1 parent 33841c3 commit 155374d

10 files changed

Lines changed: 78 additions & 67 deletions

File tree

Doc/library/test.rst

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,8 +384,13 @@ The :mod:`test.support` module defines the following classes:
384384
.. class:: EnvironmentVarGuard()
385385

386386
Class used to temporarily set or unset environment variables. Instances can be
387-
used as a context manager.
387+
used as a context manager and have a complete dictionary interface for
388+
querying/modifying the underlying ``os.environ``. After exit from the context
389+
manager all changes to environment variables done through this instance will
390+
be rolled back.
388391

392+
.. versionchanged:: 2.7
393+
Added dictionary interface.
389394

390395
.. method:: EnvironmentVarGuard.set(envvar, value)
391396

@@ -396,6 +401,7 @@ The :mod:`test.support` module defines the following classes:
396401

397402
Temporarily unset the environment variable ``envvar``.
398403

404+
399405
.. class:: WarningsRecorder()
400406

401407
Class used to record warnings for unit tests. See documentation of

Lib/test/support.py

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import warnings
1414
import unittest
1515
import importlib
16+
import collections
1617

1718
__all__ = ["Error", "TestFailed", "ResourceDenied", "import_module",
1819
"verbose", "use_resources", "max_memuse", "record_original_stdout",
@@ -510,37 +511,57 @@ def __exit__(self, *ignore_exc):
510511
sys.modules.update(self.original_modules)
511512

512513

513-
class EnvironmentVarGuard(object):
514+
class EnvironmentVarGuard(collections.MutableMapping):
514515

515516
"""Class to help protect the environment variable properly. Can be used as
516517
a context manager."""
517518

518519
def __init__(self):
520+
self._environ = os.environ
519521
self._changed = {}
520522

521-
def set(self, envvar, value):
523+
def __getitem__(self, envvar):
524+
return self._environ[envvar]
525+
526+
def __setitem__(self, envvar, value):
522527
# Remember the initial value on the first access
523528
if envvar not in self._changed:
524-
self._changed[envvar] = os.environ.get(envvar)
525-
os.environ[envvar] = value
529+
self._changed[envvar] = self._environ.get(envvar)
530+
self._environ[envvar] = value
526531

527-
def unset(self, envvar):
532+
def __delitem__(self, envvar):
528533
# Remember the initial value on the first access
529534
if envvar not in self._changed:
530-
self._changed[envvar] = os.environ.get(envvar)
531-
if envvar in os.environ:
532-
del os.environ[envvar]
535+
self._changed[envvar] = self._environ.get(envvar)
536+
if envvar in self._environ:
537+
del self._environ[envvar]
538+
539+
def keys(self):
540+
return self._environ.keys()
541+
542+
def __iter__(self):
543+
return iter(self._environ)
544+
545+
def __len__(self):
546+
return len(self._environ)
547+
548+
def set(self, envvar, value):
549+
self[envvar] = value
550+
551+
def unset(self, envvar):
552+
del self[envvar]
533553

534554
def __enter__(self):
535555
return self
536556

537557
def __exit__(self, *ignore_exc):
538558
for (k, v) in self._changed.items():
539559
if v is None:
540-
if k in os.environ:
541-
del os.environ[k]
560+
if k in self._environ:
561+
del self._environ[k]
542562
else:
543-
os.environ[k] = v
563+
self._environ[k] = v
564+
544565

545566
class TransientResource(object):
546567

Lib/test/test_getopt.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# test_getopt.py
22
# David Goodger <[email protected]> 2000-08-19
33

4-
from test.support import verbose, run_doctest, run_unittest
4+
from test.support import verbose, run_doctest, run_unittest, EnvironmentVarGuard
55
import unittest
66

77
import getopt
@@ -11,15 +11,13 @@
1111

1212
class GetoptTests(unittest.TestCase):
1313
def setUp(self):
14-
self.old_posixly_correct = os.environ.get("POSIXLY_CORRECT", sentinel)
15-
if self.old_posixly_correct is not sentinel:
16-
del os.environ["POSIXLY_CORRECT"]
14+
self.env = EnvironmentVarGuard()
15+
if "POSIXLY_CORRECT" in self.env:
16+
del self.env["POSIXLY_CORRECT"]
1717

1818
def tearDown(self):
19-
if self.old_posixly_correct is sentinel:
20-
os.environ.pop("POSIXLY_CORRECT", None)
21-
else:
22-
os.environ["POSIXLY_CORRECT"] = self.old_posixly_correct
19+
self.env.__exit__()
20+
del self.env
2321

2422
def assertError(self, *args, **kwargs):
2523
self.assertRaises(getopt.GetoptError, *args, **kwargs)
@@ -135,7 +133,7 @@ def test_gnu_getopt(self):
135133
self.assertEqual(args, ['arg1', '-b', '1', '--alpha', '--beta=2'])
136134

137135
# Posix style via POSIXLY_CORRECT
138-
os.environ["POSIXLY_CORRECT"] = "1"
136+
self.env["POSIXLY_CORRECT"] = "1"
139137
opts, args = getopt.gnu_getopt(cmdline, 'ab:', ['alpha', 'beta='])
140138
self.assertEqual(opts, [('-a', '')])
141139
self.assertEqual(args, ['arg1', '-b', '1', '--alpha', '--beta=2'])

Lib/test/test_gettext.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,6 @@
5858
MOFILE = os.path.join(LOCALEDIR, 'gettext.mo')
5959
UMOFILE = os.path.join(LOCALEDIR, 'ugettext.mo')
6060
MMOFILE = os.path.join(LOCALEDIR, 'metadata.mo')
61-
try:
62-
LANG = os.environ['LANGUAGE']
63-
except:
64-
LANG = 'en'
6561

6662

6763
class GettextBaseTest(unittest.TestCase):
@@ -77,10 +73,12 @@ def setUp(self):
7773
fp = open(MMOFILE, 'wb')
7874
fp.write(base64.decodestring(MMO_DATA))
7975
fp.close()
80-
os.environ['LANGUAGE'] = 'xx'
76+
self.env = support.EnvironmentVarGuard()
77+
self.env['LANGUAGE'] = 'xx'
8178

8279
def tearDown(self):
83-
os.environ['LANGUAGE'] = LANG
80+
self.env.__exit__()
81+
del self.env
8482
shutil.rmtree(os.path.split(LOCALEDIR)[0])
8583

8684

Lib/test/test_ntpath.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,11 @@ def test_normpath(self):
141141
tester("ntpath.normpath('//machine/share//a/b')", r'\\machine\share\a\b')
142142

143143
def test_expandvars(self):
144-
oldenv = os.environ.copy()
145-
try:
146-
os.environ.clear()
147-
os.environ["foo"] = "bar"
148-
os.environ["{foo"] = "baz1"
149-
os.environ["{foo}"] = "baz2"
144+
with support.EnvironmentVarGuard() as env:
145+
env.clear()
146+
env["foo"] = "bar"
147+
env["{foo"] = "baz1"
148+
env["{foo}"] = "baz2"
150149
tester('ntpath.expandvars("foo")', "foo")
151150
tester('ntpath.expandvars("$foo bar")', "bar bar")
152151
tester('ntpath.expandvars("${foo}bar")', "barbar")
@@ -166,9 +165,6 @@ def test_expandvars(self):
166165
tester('ntpath.expandvars("%?bar%")', "%?bar%")
167166
tester('ntpath.expandvars("%foo%%bar")', "bar%bar")
168167
tester('ntpath.expandvars("\'%foo%\'%bar")', "\'%foo%\'%bar")
169-
finally:
170-
os.environ.clear()
171-
os.environ.update(oldenv)
172168

173169
def test_abspath(self):
174170
# ntpath.abspath() can only be used on a system with the "nt" module

Lib/test/test_optparse.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,7 +1449,7 @@ def make_parser(self, columns):
14491449
# screws things up for other tests when it's part of the Python
14501450
# test suite.
14511451
with support.EnvironmentVarGuard() as env:
1452-
env.set('COLUMNS', str(columns))
1452+
env['COLUMNS'] = str(columns)
14531453
return InterceptingOptionParser(option_list=options)
14541454

14551455
def assertHelpEquals(self, expected_output):
@@ -1474,7 +1474,7 @@ def test_help_long_opts_first(self):
14741474

14751475
def test_help_title_formatter(self):
14761476
with support.EnvironmentVarGuard() as env:
1477-
env.set("COLUMNS", "80")
1477+
env["COLUMNS"] = "80"
14781478
self.parser.formatter = TitledHelpFormatter()
14791479
self.assertHelpEquals(_expected_help_title_formatter)
14801480

Lib/test/test_posixpath.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -420,18 +420,17 @@ def test_expanduser(self):
420420
self.assert_(isinstance(posixpath.expanduser(b"~foo/"), bytes))
421421

422422
with support.EnvironmentVarGuard() as env:
423-
env.set('HOME', '/')
423+
env['HOME'] = '/'
424424
self.assertEqual(posixpath.expanduser("~"), "/")
425425

426426
self.assertRaises(TypeError, posixpath.expanduser)
427427

428428
def test_expandvars(self):
429-
oldenv = os.environ.copy()
430-
try:
431-
os.environ.clear()
432-
os.environ["foo"] = "bar"
433-
os.environ["{foo"] = "baz1"
434-
os.environ["{foo}"] = "baz2"
429+
with support.EnvironmentVarGuard() as env:
430+
env.clear()
431+
env["foo"] = "bar"
432+
env["{foo"] = "baz1"
433+
env["{foo}"] = "baz2"
435434
self.assertEqual(posixpath.expandvars("foo"), "foo")
436435
self.assertEqual(posixpath.expandvars("$foo bar"), "bar bar")
437436
self.assertEqual(posixpath.expandvars("${foo}bar"), "barbar")
@@ -457,11 +456,7 @@ def test_expandvars(self):
457456
self.assertEqual(posixpath.expandvars(b"${{foo}}"), b"baz1}")
458457
self.assertEqual(posixpath.expandvars(b"$foo$foo"), b"barbar")
459458
self.assertEqual(posixpath.expandvars(b"$bar$bar"), b"$bar$bar")
460-
finally:
461-
os.environ.clear()
462-
os.environ.update(oldenv)
463-
464-
self.assertRaises(TypeError, posixpath.expandvars)
459+
self.assertRaises(TypeError, posixpath.expandvars)
465460

466461
def test_normpath(self):
467462
self.assertEqual(posixpath.normpath(""), ".")

Lib/test/test_tcl.py

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -144,23 +144,20 @@ def testLoadTkFailure(self):
144144
import sys
145145
if sys.platform.startswith(('win', 'darwin', 'cygwin')):
146146
return # no failure possible on windows?
147-
if 'DISPLAY' in os.environ:
148-
old_display = os.environ['DISPLAY']
149-
del os.environ['DISPLAY']
150-
# on some platforms, deleting environment variables
151-
# doesn't actually carry through to the process level
152-
# because they don't support unsetenv
153-
# If that's the case, abort.
154-
display = os.popen('echo $DISPLAY').read().strip()
155-
if display:
156-
return
157-
try:
147+
with support.EnvironmentVarGuard() as env:
148+
if 'DISPLAY' in os.environ:
149+
del env['DISPLAY']
150+
# on some platforms, deleting environment variables
151+
# doesn't actually carry through to the process level
152+
# because they don't support unsetenv
153+
# If that's the case, abort.
154+
display = os.popen('echo $DISPLAY').read().strip()
155+
if display:
156+
return
157+
158158
tcl = Tcl()
159159
self.assertRaises(TclError, tcl.winfo_geometry)
160160
self.assertRaises(TclError, tcl.loadtk)
161-
finally:
162-
if old_display is not None:
163-
os.environ['DISPLAY'] = old_display
164161

165162
def test_main():
166163
support.run_unittest(TclTest, TkinterTest)

Lib/test/test_tempfile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ def test_wanted_dirs(self):
153153
for envname in 'TMPDIR', 'TEMP', 'TMP':
154154
dirname = os.getenv(envname)
155155
if not dirname:
156-
env.set(envname, os.path.abspath(envname))
156+
env[envname] = os.path.abspath(envname)
157157

158158
cand = tempfile._candidate_tempdir_list()
159159

Lib/test/test_xmlrpc.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ def tearDown(self):
572572

573573
def test_cgi_get(self):
574574
with support.EnvironmentVarGuard() as env:
575-
env.set('REQUEST_METHOD', 'GET')
575+
env['REQUEST_METHOD'] = 'GET'
576576
# if the method is GET and no request_text is given, it runs handle_get
577577
# get sysout output
578578
tmp = sys.stdout
@@ -613,7 +613,7 @@ def test_cgi_xmlrpc_response(self):
613613
sys.stdout = open(support.TESTFN, "w")
614614

615615
with support.EnvironmentVarGuard() as env:
616-
env.set('CONTENT_LENGTH', str(len(data)))
616+
env['CONTENT_LENGTH'] = str(len(data))
617617
self.cgi.handle_request()
618618

619619
sys.stdin.close()

0 commit comments

Comments
 (0)