Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Display empty or None help parameter for parser option as empty string #7427

Merged
merged 10 commits into from
Jul 29, 2020
1 change: 1 addition & 0 deletions changelog/7394.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed an empty/None help param on parser options from throwing an unexpected error when executing ``pytest --help``.
hp310780 marked this conversation as resolved.
Show resolved Hide resolved
11 changes: 8 additions & 3 deletions src/_pytest/helpconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,8 @@ def showhelp(config: Config) -> None:
help, type, default = config._parser._inidict[name]
if type is None:
type = "string"
if help is None:
raise TypeError("help argument cannot be None for {}".format(name))
spec = "{} ({}):".format(name, type)
tw.write(" %s" % spec)
spec_len = len(spec)
Expand All @@ -191,9 +193,12 @@ def showhelp(config: Config) -> None:
tw.write(" " * (indent_len - spec_len - 2))
wrapped = textwrap.wrap(help, columns - indent_len, break_on_hyphens=False)

tw.line(wrapped[0])
for line in wrapped[1:]:
tw.line(indent + line)
if not wrapped:
tw.write(" " * (indent_len - spec_len - 2))
hp310780 marked this conversation as resolved.
Show resolved Hide resolved
else:
tw.line(wrapped[0])
for line in wrapped[1:]:
tw.line(indent + line)

tw.line()
tw.line("environment variables:")
Expand Down
29 changes: 29 additions & 0 deletions testing/test_helpconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,35 @@ def test_help(testdir):
)


def test_none_help_param_raises_exception(testdir):
"""Tests a None help param raises a TypeError.
"""
testdir.makeconftest(
"""
def pytest_addoption(parser):
parser.addini("test_ini", None, default=True, type="bool")
"""
)
result = testdir.runpytest("--help")
result.stderr.fnmatch_lines(
["*TypeError: help argument cannot be None for test_ini*"]
)


def test_empty_help_param(testdir):
"""Tests an empty help param is displayed correctly.
"""
testdir.makeconftest(
"""
def pytest_addoption(parser):
parser.addini("test_ini", "", default=True, type="bool")
"""
)
result = testdir.runpytest("--help")
assert result.ret == 0
result.stdout.fnmatch_lines(["*test_ini*(bool):*"])
hp310780 marked this conversation as resolved.
Show resolved Hide resolved


def test_hookvalidation_unknown(testdir):
testdir.makeconftest(
"""
Expand Down