summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernat Gabor <gaborjbernat@gmail.com>2018-09-14 18:39:05 +0100
committerBernát Gábor <gaborjbernat@gmail.com>2018-09-15 06:58:33 +0300
commitc8e07a4cc86814d72c425633a3fa73c05f902fc9 (patch)
tree7faec85245e88b9cc1ac01aa120e1a069ecda563
parente4645ecea2a1ffcff769d9891a3080f2c90db8f7 (diff)
downloadtox-git-c8e07a4cc86814d72c425633a3fa73c05f902fc9.tar.gz
skip missing interpreters config value can be overriden via cli flag
-rw-r--r--changelog/903.feature.rst1
-rw-r--r--doc/config.rst18
-rwxr-xr-xsrc/tox/config.py32
-rw-r--r--src/tox/session.py4
-rw-r--r--tests/unit/test_config.py40
5 files changed, 69 insertions, 26 deletions
diff --git a/changelog/903.feature.rst b/changelog/903.feature.rst
new file mode 100644
index 00000000..bb700ffb
--- /dev/null
+++ b/changelog/903.feature.rst
@@ -0,0 +1 @@
+skip missing interpreters value from the config file can now be overridden via the ``--skip-missing-interpreters`` cli flag - by :user:`gaborbernat`
diff --git a/doc/config.rst b/doc/config.rst
index e56fe8de..cb47a68f 100644
--- a/doc/config.rst
+++ b/doc/config.rst
@@ -54,18 +54,18 @@ and will first lookup global tox settings in this section:
commands = ... # override [tox] settings for the jenkins context
# note: for jenkins distshare defaults to ``{toxworkdir}/distshare`` (DEPRECATED)
-.. confval:: skip_missing_interpreters=BOOL
+.. confval:: skip_missing_interpreters=config|true|false
.. versionadded:: 1.7.2
- Setting this to ``True`` is equivalent of passing the
- ``--skip-missing-interpreters`` command line option, and will force ``tox`` to
- return success even if some of the specified environments were missing. This is
- useful for some CI systems or running on a developer box, where you might only
- have a subset of all your supported interpreters installed but don't want to
- mark the build as failed because of it. As expected, the command line switch
- always overrides this setting if passed on the invokation.
- **Default:** ``False``
+ When skip missing interpreters is ``true`` will force ``tox`` to return success even
+ if some of the specified environments were missing. This is useful for some CI
+ systems or running on a developer box, where you might only have a subset of
+ all your supported interpreters installed but don't want to mark the build as
+ failed because of it. As expected, the command line switch always overrides
+ this setting if passed on the invocation. Setting it to ``config``
+ means that the value is read from the config file (default is ``false``).
+ **Default:** ``config``
.. confval:: envlist=CSV
diff --git a/src/tox/config.py b/src/tox/config.py
index a7e62d52..12ac98c5 100755
--- a/src/tox/config.py
+++ b/src/tox/config.py
@@ -493,11 +493,8 @@ def tox_addoption(parser):
parser.add_argument(
"--alwayscopy", action="store_true", help="override alwayscopy setting to True in all envs"
)
- parser.add_argument(
- "--skip-missing-interpreters",
- action="store_true",
- help="don't fail tests for missing interpreters",
- )
+
+ cli_skip_missing_interpreter(parser)
parser.add_argument(
"--workdir",
action="store",
@@ -780,6 +777,24 @@ def tox_addoption(parser):
)
+def cli_skip_missing_interpreter(parser):
+ class SkipMissingInterpreterAction(argparse.Action):
+ def __call__(self, parser, namespace, values, option_string=None):
+ value = "true" if values is None else values
+ if value not in ("config", "true", "false"):
+ raise argparse.ArgumentTypeError("value must be config, true or false")
+ setattr(namespace, self.dest, value)
+
+ parser.add_argument(
+ "--skip-missing-interpreters",
+ default="config",
+ metavar="val",
+ nargs="?",
+ action=SkipMissingInterpreterAction,
+ help="don't fail tests for missing interpreters: {config,true,false} choice",
+ )
+
+
class Config(object):
"""Global Tox config object."""
@@ -947,10 +962,9 @@ class ParseIni(object):
else:
config.toxworkdir = config.toxinidir.join(config.option.workdir, abs=True)
- if not config.option.skip_missing_interpreters:
- config.option.skip_missing_interpreters = reader.getbool(
- "skip_missing_interpreters", False
- )
+ if config.option.skip_missing_interpreters == "config":
+ val = reader.getbool("skip_missing_interpreters", False)
+ config.option.skip_missing_interpreters = "true" if val else "false"
config.ignore_basepython_conflict = reader.getbool("ignore_basepython_conflict", False)
diff --git a/src/tox/session.py b/src/tox/session.py
index 97e5da19..07e99708 100644
--- a/src/tox/session.py
+++ b/src/tox/session.py
@@ -470,7 +470,7 @@ class Session:
)
except tox.exception.InterpreterNotFound as e:
status = e
- if self.config.option.skip_missing_interpreters:
+ if self.config.option.skip_missing_interpreters == "true":
default_ret_code = 0
if status:
str_status = str(status)
@@ -573,7 +573,7 @@ class Session:
status = venv.status
if isinstance(status, tox.exception.InterpreterNotFound):
msg = " {}: {}".format(venv.envconfig.envname, str(status))
- if self.config.option.skip_missing_interpreters:
+ if self.config.option.skip_missing_interpreters == "true":
self.report.skip(msg)
else:
retcode = 1
diff --git a/tests/unit/test_config.py b/tests/unit/test_config.py
index 8b5d2285..3b53bad2 100644
--- a/tests/unit/test_config.py
+++ b/tests/unit/test_config.py
@@ -1902,20 +1902,48 @@ class TestGlobalOptions:
newconfig([], inisource)
def test_skip_missing_interpreters_true(self, newconfig):
- inisource = """
+ ini_source = """
[tox]
skip_missing_interpreters = True
"""
- config = newconfig([], inisource)
- assert config.option.skip_missing_interpreters
+ config = newconfig([], ini_source)
+ assert config.option.skip_missing_interpreters == "true"
def test_skip_missing_interpreters_false(self, newconfig):
- inisource = """
+ ini_source = """
[tox]
skip_missing_interpreters = False
"""
- config = newconfig([], inisource)
- assert not config.option.skip_missing_interpreters
+ config = newconfig([], ini_source)
+ assert config.option.skip_missing_interpreters == "false"
+
+ def test_skip_missing_interpreters_cli_no_arg(self, newconfig):
+ ini_source = """
+ [tox]
+ skip_missing_interpreters = False
+ """
+ config = newconfig(["--skip-missing-interpreters"], ini_source)
+ assert config.option.skip_missing_interpreters == "true"
+
+ def test_skip_missing_interpreters_cli_not_specified(self, newconfig):
+ config = newconfig([], "")
+ assert config.option.skip_missing_interpreters == "false"
+
+ def test_skip_missing_interpreters_cli_overrides_true(self, newconfig):
+ ini_source = """
+ [tox]
+ skip_missing_interpreters = False
+ """
+ config = newconfig(["--skip-missing-interpreters", "true"], ini_source)
+ assert config.option.skip_missing_interpreters == "true"
+
+ def test_skip_missing_interpreters_cli_overrides_false(self, newconfig):
+ ini_source = """
+ [tox]
+ skip_missing_interpreters = True
+ """
+ config = newconfig(["--skip-missing-interpreters", "false"], ini_source)
+ assert config.option.skip_missing_interpreters == "false"
def test_defaultenv_commandline(self, newconfig):
config = newconfig(["-epy27"], "")