From 2f7d0f8bd932ce2447386cdabb8fcdedf4cb7111 Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Sat, 18 Jul 2015 16:39:55 -0300 Subject: [PATCH] Consider --color option in more places which deal with TerminalWriters --- CHANGELOG | 3 +++ _pytest/config.py | 13 +++++++++++++ _pytest/genscript.py | 3 ++- _pytest/helpconfig.py | 3 ++- _pytest/mark.py | 3 ++- _pytest/pdb.py | 6 +++++- _pytest/python.py | 3 ++- _pytest/terminal.py | 8 +++----- testing/python/fixture.py | 5 +++++ 9 files changed, 37 insertions(+), 10 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 03c804514..1af7b2ef1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,9 @@ 2.7.3 (compared to 2.7.2) ----------------------------- +- fix issue856: consider --color parameter in all outputs (for example + --fixtures). Thanks Barney Gale for the report and Bruno Oliveira for the PR. + - fix issue744: fix for ast.Call changes in Python 3.5+. Thanks Guido van Rossum, Matthias Bussonnier, Stefan Zimmermann and Thomas Kluyver. diff --git a/_pytest/config.py b/_pytest/config.py index c6a6403f6..a954a6222 100644 --- a/_pytest/config.py +++ b/_pytest/config.py @@ -933,3 +933,16 @@ def setns(obj, dic): #if obj != pytest: # pytest.__all__.append(name) setattr(pytest, name, value) + + +def create_terminal_writer(config, *args, **kwargs): + """Create a TerminalWriter instance configured according to the options + in the config object. Every code which requires a TerminalWriter object + and has access to a config object should use this function. + """ + tw = py.io.TerminalWriter(*args, **kwargs) + if config.option.color == 'yes': + tw.hasmarkup = True + if config.option.color == 'no': + tw.hasmarkup = False + return tw diff --git a/_pytest/genscript.py b/_pytest/genscript.py index 22f3fdeae..ed1f3b5c2 100755 --- a/_pytest/genscript.py +++ b/_pytest/genscript.py @@ -66,9 +66,10 @@ def pytest_addoption(parser): help="create standalone pytest script at given target path.") def pytest_cmdline_main(config): + import _pytest.config genscript = config.getvalue("genscript") if genscript: - tw = py.io.TerminalWriter() + tw = _pytest.config.create_terminal_writer(config) deps = ['py', '_pytest', 'pytest'] if sys.version_info < (2,7): deps.append("argparse") diff --git a/_pytest/helpconfig.py b/_pytest/helpconfig.py index d79fc671a..9b9286910 100644 --- a/_pytest/helpconfig.py +++ b/_pytest/helpconfig.py @@ -64,7 +64,8 @@ def pytest_cmdline_main(config): return 0 def showhelp(config): - tw = py.io.TerminalWriter() + import _pytest.config + tw = _pytest.config.create_terminal_writer(config) tw.write(config._parser.optparser.format_help()) tw.line() tw.line() diff --git a/_pytest/mark.py b/_pytest/mark.py index 791f6ef55..9d2b70958 100644 --- a/_pytest/mark.py +++ b/_pytest/mark.py @@ -44,9 +44,10 @@ def pytest_addoption(parser): def pytest_cmdline_main(config): + import _pytest.config if config.option.markers: config.do_configure() - tw = py.io.TerminalWriter() + tw = _pytest.config.create_terminal_writer(config) for line in config.getini("markers"): name, rest = line.split(":", 1) tw.write("@pytest.mark.%s:" % name, bold=True) diff --git a/_pytest/pdb.py b/_pytest/pdb.py index d0f7509f9..904504ffe 100644 --- a/_pytest/pdb.py +++ b/_pytest/pdb.py @@ -23,23 +23,27 @@ def pytest_configure(config): old = (pdb.set_trace, pytestPDB._pluginmanager) def fin(): pdb.set_trace, pytestPDB._pluginmanager = old + pytestPDB._config = None pdb.set_trace = pytest.set_trace pytestPDB._pluginmanager = config.pluginmanager + pytestPDB._config = config config._cleanup.append(fin) class pytestPDB: """ Pseudo PDB that defers to the real pdb. """ _pluginmanager = None + _config = None def set_trace(self): """ invoke PDB set_trace debugging, dropping any IO capturing. """ + import _pytest.config frame = sys._getframe().f_back capman = None if self._pluginmanager is not None: capman = self._pluginmanager.getplugin("capturemanager") if capman: capman.suspendcapture(in_=True) - tw = py.io.TerminalWriter() + tw = _pytest.config.create_terminal_writer(self._config) tw.line() tw.sep(">", "PDB set_trace (IO-capturing turned off)") self._pluginmanager.hook.pytest_enter_pdb() diff --git a/_pytest/python.py b/_pytest/python.py index 76a6c4ed4..3faf85d51 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -947,9 +947,10 @@ def showfixtures(config): return wrap_session(config, _showfixtures_main) def _showfixtures_main(config, session): + import _pytest.config session.perform_collect() curdir = py.path.local() - tw = py.io.TerminalWriter() + tw = _pytest.config.create_terminal_writer(config) verbose = config.getvalue("verbose") fm = session._fixturemanager diff --git a/_pytest/terminal.py b/_pytest/terminal.py index 538bf3d8e..deff75b1c 100644 --- a/_pytest/terminal.py +++ b/_pytest/terminal.py @@ -87,6 +87,7 @@ class WarningReport: class TerminalReporter: def __init__(self, config, file=None): + import _pytest.config self.config = config self.verbosity = self.config.option.verbose self.showheader = self.verbosity >= 0 @@ -98,11 +99,8 @@ class TerminalReporter: self.startdir = py.path.local() if file is None: file = sys.stdout - self._tw = self.writer = py.io.TerminalWriter(file) - if self.config.option.color == 'yes': - self._tw.hasmarkup = True - if self.config.option.color == 'no': - self._tw.hasmarkup = False + self._tw = self.writer = _pytest.config.create_terminal_writer(config, + file) self.currentfspath = None self.reportchars = getreportopt(config) self.hasmarkup = self._tw.hasmarkup diff --git a/testing/python/fixture.py b/testing/python/fixture.py index 69c140f8d..90986173a 100644 --- a/testing/python/fixture.py +++ b/testing/python/fixture.py @@ -623,6 +623,11 @@ class TestRequestBasic: *arg1* """) + def test_show_fixtures_color_yes(self, testdir): + testdir.makepyfile("def test_this(): assert 1") + result = testdir.runpytest('--color=yes', '--fixtures') + assert '\x1b[32mtmpdir' in result.stdout.str() + def test_newstyle_with_request(self, testdir): testdir.makepyfile(""" import pytest