Merge pull request #864 from pytest-dev/consider-color-yes-everywhere

Consider --color option in more places which deal with TerminalWriters
This commit is contained in:
Bruno Oliveira 2015-07-23 08:03:52 -03:00
commit ce96973ed5
10 changed files with 40 additions and 14 deletions

View File

@ -1,6 +1,9 @@
2.7.3 (compared to 2.7.2) 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 - fix issue744: fix for ast.Call changes in Python 3.5+. Thanks
Guido van Rossum, Matthias Bussonnier, Stefan Zimmermann and Guido van Rossum, Matthias Bussonnier, Stefan Zimmermann and
Thomas Kluyver. Thomas Kluyver.

View File

@ -933,3 +933,16 @@ def setns(obj, dic):
#if obj != pytest: #if obj != pytest:
# pytest.__all__.append(name) # pytest.__all__.append(name)
setattr(pytest, name, value) 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

View File

@ -66,9 +66,10 @@ def pytest_addoption(parser):
help="create standalone pytest script at given target path.") help="create standalone pytest script at given target path.")
def pytest_cmdline_main(config): def pytest_cmdline_main(config):
import _pytest.config
genscript = config.getvalue("genscript") genscript = config.getvalue("genscript")
if genscript: if genscript:
tw = py.io.TerminalWriter() tw = _pytest.config.create_terminal_writer(config)
deps = ['py', '_pytest', 'pytest'] deps = ['py', '_pytest', 'pytest']
if sys.version_info < (2,7): if sys.version_info < (2,7):
deps.append("argparse") deps.append("argparse")

View File

@ -64,7 +64,8 @@ def pytest_cmdline_main(config):
return 0 return 0
def showhelp(config): 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.write(config._parser.optparser.format_help())
tw.line() tw.line()
tw.line() tw.line()

View File

@ -1,6 +1,5 @@
""" generic mechanism for marking and selecting python functions. """ """ generic mechanism for marking and selecting python functions. """
import inspect import inspect
import py
class MarkerError(Exception): class MarkerError(Exception):
@ -44,9 +43,10 @@ def pytest_addoption(parser):
def pytest_cmdline_main(config): def pytest_cmdline_main(config):
import _pytest.config
if config.option.markers: if config.option.markers:
config.do_configure() config.do_configure()
tw = py.io.TerminalWriter() tw = _pytest.config.create_terminal_writer(config)
for line in config.getini("markers"): for line in config.getini("markers"):
name, rest = line.split(":", 1) name, rest = line.split(":", 1)
tw.write("@pytest.mark.%s:" % name, bold=True) tw.write("@pytest.mark.%s:" % name, bold=True)

View File

@ -1,6 +1,6 @@
""" submit failure or test session information to a pastebin service. """ """ submit failure or test session information to a pastebin service. """
import pytest import pytest
import py, sys import sys
import tempfile import tempfile
@ -69,6 +69,7 @@ def create_new_paste(contents):
return 'bad response: ' + response return 'bad response: ' + response
def pytest_terminal_summary(terminalreporter): def pytest_terminal_summary(terminalreporter):
import _pytest.config
if terminalreporter.config.option.pastebin != "failed": if terminalreporter.config.option.pastebin != "failed":
return return
tr = terminalreporter tr = terminalreporter
@ -79,7 +80,7 @@ def pytest_terminal_summary(terminalreporter):
msg = rep.longrepr.reprtraceback.reprentries[-1].reprfileloc msg = rep.longrepr.reprtraceback.reprentries[-1].reprfileloc
except AttributeError: except AttributeError:
msg = tr._getfailureheadline(rep) msg = tr._getfailureheadline(rep)
tw = py.io.TerminalWriter(stringio=True) tw = _pytest.config.create_terminal_writer(terminalreporter.config, stringio=True)
rep.toterminal(tw) rep.toterminal(tw)
s = tw.stringio.getvalue() s = tw.stringio.getvalue()
assert len(s) assert len(s)

View File

@ -4,7 +4,6 @@ import pdb
import sys import sys
import pytest import pytest
import py
def pytest_addoption(parser): def pytest_addoption(parser):
@ -23,23 +22,27 @@ def pytest_configure(config):
old = (pdb.set_trace, pytestPDB._pluginmanager) old = (pdb.set_trace, pytestPDB._pluginmanager)
def fin(): def fin():
pdb.set_trace, pytestPDB._pluginmanager = old pdb.set_trace, pytestPDB._pluginmanager = old
pytestPDB._config = None
pdb.set_trace = pytest.set_trace pdb.set_trace = pytest.set_trace
pytestPDB._pluginmanager = config.pluginmanager pytestPDB._pluginmanager = config.pluginmanager
pytestPDB._config = config
config._cleanup.append(fin) config._cleanup.append(fin)
class pytestPDB: class pytestPDB:
""" Pseudo PDB that defers to the real pdb. """ """ Pseudo PDB that defers to the real pdb. """
_pluginmanager = None _pluginmanager = None
_config = None
def set_trace(self): def set_trace(self):
""" invoke PDB set_trace debugging, dropping any IO capturing. """ """ invoke PDB set_trace debugging, dropping any IO capturing. """
import _pytest.config
frame = sys._getframe().f_back frame = sys._getframe().f_back
capman = None capman = None
if self._pluginmanager is not None: if self._pluginmanager is not None:
capman = self._pluginmanager.getplugin("capturemanager") capman = self._pluginmanager.getplugin("capturemanager")
if capman: if capman:
capman.suspendcapture(in_=True) capman.suspendcapture(in_=True)
tw = py.io.TerminalWriter() tw = _pytest.config.create_terminal_writer(self._config)
tw.line() tw.line()
tw.sep(">", "PDB set_trace (IO-capturing turned off)") tw.sep(">", "PDB set_trace (IO-capturing turned off)")
self._pluginmanager.hook.pytest_enter_pdb() self._pluginmanager.hook.pytest_enter_pdb()

View File

@ -947,9 +947,10 @@ def showfixtures(config):
return wrap_session(config, _showfixtures_main) return wrap_session(config, _showfixtures_main)
def _showfixtures_main(config, session): def _showfixtures_main(config, session):
import _pytest.config
session.perform_collect() session.perform_collect()
curdir = py.path.local() curdir = py.path.local()
tw = py.io.TerminalWriter() tw = _pytest.config.create_terminal_writer(config)
verbose = config.getvalue("verbose") verbose = config.getvalue("verbose")
fm = session._fixturemanager fm = session._fixturemanager

View File

@ -87,6 +87,7 @@ class WarningReport:
class TerminalReporter: class TerminalReporter:
def __init__(self, config, file=None): def __init__(self, config, file=None):
import _pytest.config
self.config = config self.config = config
self.verbosity = self.config.option.verbose self.verbosity = self.config.option.verbose
self.showheader = self.verbosity >= 0 self.showheader = self.verbosity >= 0
@ -98,11 +99,8 @@ class TerminalReporter:
self.startdir = py.path.local() self.startdir = py.path.local()
if file is None: if file is None:
file = sys.stdout file = sys.stdout
self._tw = self.writer = py.io.TerminalWriter(file) self._tw = self.writer = _pytest.config.create_terminal_writer(config,
if self.config.option.color == 'yes': file)
self._tw.hasmarkup = True
if self.config.option.color == 'no':
self._tw.hasmarkup = False
self.currentfspath = None self.currentfspath = None
self.reportchars = getreportopt(config) self.reportchars = getreportopt(config)
self.hasmarkup = self._tw.hasmarkup self.hasmarkup = self._tw.hasmarkup

View File

@ -623,6 +623,11 @@ class TestRequestBasic:
*arg1* *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): def test_newstyle_with_request(self, testdir):
testdir.makepyfile(""" testdir.makepyfile("""
import pytest import pytest