From f5a90abac2b2a1f83df3791e2e7bd7dd3a7cce43 Mon Sep 17 00:00:00 2001 From: Ted Xiao Date: Sat, 25 Jun 2016 20:12:33 +0800 Subject: [PATCH] add --override-ini option to overrides ini values Signed-off-by: Ted Xiao --- AUTHORS | 1 + CHANGELOG.rst | 7 ++++++ _pytest/config.py | 27 ++++++++++++++------ _pytest/helpconfig.py | 6 +++++ testing/test_config.py | 57 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+), 8 deletions(-) diff --git a/AUTHORS b/AUTHORS index ac8caf905fd..e72f965e31f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -98,6 +98,7 @@ Ryan Wooden Samuele Pedroni Stephan Obermann Tareq Alayan +Ted Xiao Simon Gomizelj Stefano Taschini Stefan Farmbauer diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d95d66384ed..2f28178f19b 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -47,6 +47,13 @@ `#1629`_. Thanks `@obestwalter`_ and `@davehunt`_ for the complete PR (`#1633`_) +* New cli flag ``--override-ini`` or ``-o`` that overrides ini values from the +command line so that one can do e.g. "-o xfail_strict=True". This is useful for +specifying options for which there is no separate command-line flag, a complete +ini-options can be showed by py.test --help +Thanks `@blueyed`_ and `@fengxx`_ for the PR + + **Changes** * Fixtures marked with ``@pytest.fixture`` can now use ``yield`` statements exactly like diff --git a/_pytest/config.py b/_pytest/config.py index a17587d9ec3..a9642962448 100644 --- a/_pytest/config.py +++ b/_pytest/config.py @@ -1003,14 +1003,16 @@ def _getini(self, name): description, type, default = self._parser._inidict[name] except KeyError: raise ValueError("unknown configuration value: %r" %(name,)) - try: - value = self.inicfg[name] - except KeyError: - if default is not None: - return default - if type is None: - return '' - return [] + value = self._get_override_ini_value(name) + if value is None: + try: + value = self.inicfg[name] + except KeyError: + if default is not None: + return default + if type is None: + return '' + return [] if type == "pathlist": dp = py.path.local(self.inicfg.config.path).dirpath() l = [] @@ -1041,6 +1043,15 @@ def _getconftest_pathlist(self, name, path): l.append(relroot) return l + def _get_override_ini_value(self, name): + value = None + if self.getoption("override_ini", None): + for ini_config in self.option.override_ini: + (key, user_ini_value) = ini_config.split("=", 2) + if key == name: + return user_ini_value + return value + def getoption(self, name, default=notset, skip=False): """ return command line option value. diff --git a/_pytest/helpconfig.py b/_pytest/helpconfig.py index 15b0ada77c6..5ec71cc491f 100644 --- a/_pytest/helpconfig.py +++ b/_pytest/helpconfig.py @@ -20,6 +20,12 @@ def pytest_addoption(parser): group.addoption('--debug', action="store_true", dest="debug", default=False, help="store internal tracing debug information in 'pytestdebug.log'.") + # support for "--overwrite-ini ININAME=INIVALUE" to overrides ini values from the command line + # so that one can do e.g. "-o xfail_strict=True". This is useful for specifying options for which + # there is no separate command-line flag, you can find ini-options by py.test --help + group._addoption('-o', '--override-ini', + nargs='*', dest="override_ini", + help="overrides ini values which do not have a separate command-line flag") @pytest.hookimpl(hookwrapper=True) diff --git a/testing/test_config.py b/testing/test_config.py index 2d9ae6e0e5e..679506238c8 100644 --- a/testing/test_config.py +++ b/testing/test_config.py @@ -583,3 +583,60 @@ def test_with_specific_inifile(self, tmpdir): inifile = tmpdir.ensure("pytest.ini") rootdir, inifile, inicfg = determine_setup(inifile, [tmpdir]) assert rootdir == tmpdir + +class TestOverrideIniArgs: + """ test --override-ini """ + @pytest.mark.parametrize("name", "setup.cfg tox.ini pytest.ini".split()) + def test_override_ini_names(self, testdir, name): + testdir.tmpdir.join(name).write(py.std.textwrap.dedent(""" + [pytest] + custom = 1.0 + """)) + testdir.makeconftest(""" + def pytest_addoption(parser): + parser.addini("custom", "") + """) + testdir.makepyfile(""" + import pytest + def test_pass(): + ini_val = pytest.config.getini("custom") + print('\\ncustom_option:%s\\n' % ini_val) + """) + + result = testdir.runpytest("--override-ini", "custom=2.0", "-s") + assert result.ret == 0 + result.stdout.fnmatch_lines([ + "custom_option:2.0" + ]) + + result = testdir.runpytest("--override-ini", "custom=2.0", + "--override-ini=custom=3.0", "-s") + assert result.ret == 0 + result.stdout.fnmatch_lines([ + "custom_option:3.0" + ]) + + + def test_override_ini_pathlist(self, testdir): + testdir.makeconftest(""" + def pytest_addoption(parser): + parser.addini("paths", "my new ini value", type="pathlist") + """) + testdir.makeini(""" + [pytest] + paths=blah.py + """) + testdir.makepyfile(""" + import pytest + import py.path + def test_pathlist(): + config_paths = pytest.config.getini("paths") + print(config_paths) + for cpf in config_paths: + print('\\nuser_path:%s' % cpf.basename) + """) + result = testdir.runpytest("--override-ini", 'paths=foo/bar1.py foo/bar2.py', "-s") + result.stdout.fnmatch_lines([ + "user_path:bar1.py", + "user_path:bar2.py" + ])