summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorholger krekel <holger@merlinux.eu>2015-12-07 12:39:34 +0100
committerholger krekel <holger@merlinux.eu>2015-12-07 12:39:34 +0100
commit1443960a5e6f016aa96e77a13322c5e904b31ed7 (patch)
treeb6440406dcb1728c8c0808a5a4ee0732a41029a8
parente90ef03d7cca2fe120b9a7169e8f2aee1f9300a4 (diff)
downloadtox-1443960a5e6f016aa96e77a13322c5e904b31ed7.tar.gz
reshuffle tests related to setenv processing and integrate nelfin's
cross-section test but mark it as xfailing because i am not sure we need to go to the trouble
-rw-r--r--CHANGELOG5
-rw-r--r--setup.py2
-rw-r--r--tests/test_config.py95
-rw-r--r--tox/__init__.py2
-rw-r--r--tox/config.py5
5 files changed, 63 insertions, 46 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 1a395fc..d22738a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,10 +1,11 @@
2.3.0 (unreleased)
-----
-- fix issue285 make setenv processing fully lazy to fix regressions
+- fix issue285: make setenv processing fully lazy to fix regressions
of tox-2.2.X and so that we can now have testenv attributes like
"basepython" depend on environment variables that are set in
- a setenv section.
+ a setenv section. Thanks Nelfin for some tests and initial
+ work on a PR.
- allow "#" in commands. This is slightly incompatible with commands
sections that used a comment after a "\" line continuation.
diff --git a/setup.py b/setup.py
index 3a0ab18..350a098 100644
--- a/setup.py
+++ b/setup.py
@@ -48,7 +48,7 @@ def main():
description='virtualenv-based automation of test activities',
long_description=open("README.rst").read(),
url='http://tox.testrun.org/',
- version='2.3.0.dev1',
+ version='2.3.0.dev2',
license='http://opensource.org/licenses/MIT',
platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],
author='holger krekel',
diff --git a/tests/test_config.py b/tests/test_config.py
index 573fdfe..f727a1f 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -735,46 +735,6 @@ class TestConfigTestEnv:
if bp == "jython":
assert envconfig.envpython == envconfig.envbindir.join(bp)
- def test_setenv_overrides(self, tmpdir, newconfig):
- config = newconfig("""
- [testenv]
- setenv =
- PYTHONPATH = something
- ANOTHER_VAL=else
- """)
- assert len(config.envconfigs) == 1
- envconfig = config.envconfigs['python']
- assert 'PYTHONPATH' in envconfig.setenv
- assert 'ANOTHER_VAL' in envconfig.setenv
- assert envconfig.setenv['PYTHONPATH'] == 'something'
- assert envconfig.setenv['ANOTHER_VAL'] == 'else'
-
- def test_setenv_with_envdir_and_basepython(self, tmpdir, newconfig):
- config = newconfig("""
- [testenv]
- setenv =
- VAL = {envdir}
- basepython = {env:VAL}
- """)
- assert len(config.envconfigs) == 1
- envconfig = config.envconfigs['python']
- assert 'VAL' in envconfig.setenv
- assert envconfig.setenv['VAL'] == envconfig.envdir
- assert envconfig.basepython == envconfig.envdir
-
- def test_setenv_ordering_1(self, tmpdir, newconfig):
- config = newconfig("""
- [testenv]
- setenv=
- VAL={envdir}
- commands=echo {env:VAL}
- """)
- assert len(config.envconfigs) == 1
- envconfig = config.envconfigs['python']
- assert 'VAL' in envconfig.setenv
- assert envconfig.setenv['VAL'] == envconfig.envdir
- assert str(envconfig.envdir) in envconfig.commands[0]
-
@pytest.mark.parametrize("plat", ["win32", "linux2"])
def test_passenv_as_multiline_list(self, tmpdir, newconfig, monkeypatch, plat):
monkeypatch.setattr(sys, "platform", plat)
@@ -1672,6 +1632,61 @@ class TestSetenv:
""")
assert config.envconfigs["env1"].setenv["X"] == "3"
+ def test_setenv_overrides(self, tmpdir, newconfig):
+ config = newconfig("""
+ [testenv]
+ setenv =
+ PYTHONPATH = something
+ ANOTHER_VAL=else
+ """)
+ assert len(config.envconfigs) == 1
+ envconfig = config.envconfigs['python']
+ assert 'PYTHONPATH' in envconfig.setenv
+ assert 'ANOTHER_VAL' in envconfig.setenv
+ assert envconfig.setenv['PYTHONPATH'] == 'something'
+ assert envconfig.setenv['ANOTHER_VAL'] == 'else'
+
+ def test_setenv_with_envdir_and_basepython(self, tmpdir, newconfig):
+ config = newconfig("""
+ [testenv]
+ setenv =
+ VAL = {envdir}
+ basepython = {env:VAL}
+ """)
+ assert len(config.envconfigs) == 1
+ envconfig = config.envconfigs['python']
+ assert 'VAL' in envconfig.setenv
+ assert envconfig.setenv['VAL'] == envconfig.envdir
+ assert envconfig.basepython == envconfig.envdir
+
+ def test_setenv_ordering_1(self, tmpdir, newconfig):
+ config = newconfig("""
+ [testenv]
+ setenv=
+ VAL={envdir}
+ commands=echo {env:VAL}
+ """)
+ assert len(config.envconfigs) == 1
+ envconfig = config.envconfigs['python']
+ assert 'VAL' in envconfig.setenv
+ assert envconfig.setenv['VAL'] == envconfig.envdir
+ assert str(envconfig.envdir) in envconfig.commands[0]
+
+ @pytest.mark.xfail(reason="we don't implement cross-section substitution for setenv")
+ def test_setenv_cross_section_subst(self, monkeypatch, newconfig):
+ """test that we can do cross-section substitution with setenv"""
+ monkeypatch.delenv('TEST', raising=False)
+ config = newconfig("""
+ [section]
+ x =
+ NOT_TEST={env:TEST:defaultvalue}
+
+ [testenv]
+ setenv = {[section]x}
+ """)
+ envconfig = config.envconfigs["python"]
+ assert envconfig.setenv["NOT_TEST"] == "defaultvalue"
+
class TestIndexServer:
def test_indexserver(self, tmpdir, newconfig):
diff --git a/tox/__init__.py b/tox/__init__.py
index 837768c..443ce8f 100644
--- a/tox/__init__.py
+++ b/tox/__init__.py
@@ -1,5 +1,5 @@
#
-__version__ = '2.3.0.dev1'
+__version__ = '2.3.0.dev2'
from .hookspecs import hookspec, hookimpl # noqa
diff --git a/tox/config.py b/tox/config.py
index 4fa0a0a..d34a597 100644
--- a/tox/config.py
+++ b/tox/config.py
@@ -271,7 +271,7 @@ class SetenvDict:
except KeyError:
try:
if name in self._lookupstack:
- raise KeyError("recursion")
+ raise KeyError(name)
val = self.definitions[name]
except KeyError:
return os.environ.get(name, default)
@@ -1028,7 +1028,8 @@ class Replacer:
if envvalue is None:
if default is None:
raise tox.exception.ConfigError(
- "substitution env:%r: unknown environment variable %r" %
+ "substitution env:%r: unknown environment variable %r "
+ " or recursive definition." %
(envkey, envkey))
return default
return envvalue