diff --git a/AUTHORS b/AUTHORS index ca282870f..6807238fc 100644 --- a/AUTHORS +++ b/AUTHORS @@ -104,6 +104,7 @@ Marcin Bachry Mark Abramowitz Markus Unterwaditzer Martijn Faassen +Martin Altmayer Martin K. Scherer Martin Prusse Mathieu Clabaut diff --git a/_pytest/python.py b/_pytest/python.py index 83413bbf9..edea9db3d 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -7,6 +7,7 @@ import sys import os import collections import math +from textwrap import dedent from itertools import count import py @@ -1003,14 +1004,12 @@ def _show_fixtures_per_test(config, session): funcargspec = argname tw.line(funcargspec, green=True) - INDENT = ' {0}' fixture_doc = fixture_def.func.__doc__ if fixture_doc: - for line in fixture_doc.strip().split('\n'): - tw.line(INDENT.format(line.strip())) + write_docstring(tw, fixture_doc) else: - tw.line(INDENT.format('no docstring available'), red=True) + tw.line(' no docstring available', red=True) def write_item(item): name2fixturedefs = item._fixtureinfo.name2fixturedefs @@ -1084,13 +1083,28 @@ def _showfixtures_main(config, session): loc = getlocation(fixturedef.func, curdir) doc = fixturedef.func.__doc__ or "" if doc: - for line in doc.strip().split("\n"): - tw.line(" " + line.strip()) + write_docstring(tw, doc) else: tw.line(" %s: no docstring available" %(loc,), red=True) +def write_docstring(tw, doc): + INDENT = " " + doc = doc.rstrip() + if "\n" in doc: + firstline, rest = doc.split("\n", 1) + else: + firstline, rest = doc, "" + + if firstline.strip(): + tw.line(INDENT + firstline.strip()) + + if rest: + for line in dedent(rest).split("\n"): + tw.write(INDENT + line + "\n") + + # builtin pytest.raises helper def raises(expected_exception, *args, **kwargs): diff --git a/changelog/2574.bugfix b/changelog/2574.bugfix new file mode 100644 index 000000000..49a01342b --- /dev/null +++ b/changelog/2574.bugfix @@ -0,0 +1 @@ +The options --fixtures and --fixtures-per-test will now keep indentation within docstrings. diff --git a/testing/python/fixture.py b/testing/python/fixture.py index 1e58a5550..846728d64 100644 --- a/testing/python/fixture.py +++ b/testing/python/fixture.py @@ -2713,7 +2713,7 @@ class TestShowFixtures(object): """) def test_show_fixtures_trimmed_doc(self, testdir): - p = testdir.makepyfile(''' + p = testdir.makepyfile(dedent(''' import pytest @pytest.fixture def arg1(): @@ -2729,9 +2729,9 @@ class TestShowFixtures(object): line2 """ - ''') + ''')) result = testdir.runpytest("--fixtures", p) - result.stdout.fnmatch_lines(""" + result.stdout.fnmatch_lines(dedent(""" * fixtures defined from test_show_fixtures_trimmed_doc * arg2 line1 @@ -2740,7 +2740,64 @@ class TestShowFixtures(object): line1 line2 - """) + """)) + + def test_show_fixtures_indented_doc(self, testdir): + p = testdir.makepyfile(dedent(''' + import pytest + @pytest.fixture + def fixture1(): + """ + line1 + indented line + """ + ''')) + result = testdir.runpytest("--fixtures", p) + result.stdout.fnmatch_lines(dedent(""" + * fixtures defined from test_show_fixtures_indented_doc * + fixture1 + line1 + indented line + """)) + + def test_show_fixtures_indented_doc_first_line_unindented(self, testdir): + p = testdir.makepyfile(dedent(''' + import pytest + @pytest.fixture + def fixture1(): + """line1 + line2 + indented line + """ + ''')) + result = testdir.runpytest("--fixtures", p) + result.stdout.fnmatch_lines(dedent(""" + * fixtures defined from test_show_fixtures_indented_doc_first_line_unindented * + fixture1 + line1 + line2 + indented line + """)) + + def test_show_fixtures_indented_in_class(self, testdir): + p = testdir.makepyfile(dedent(''' + import pytest + class TestClass: + @pytest.fixture + def fixture1(): + """line1 + line2 + indented line + """ + ''')) + result = testdir.runpytest("--fixtures", p) + result.stdout.fnmatch_lines(dedent(""" + * fixtures defined from test_show_fixtures_indented_in_class * + fixture1 + line1 + line2 + indented line + """)) def test_show_fixtures_different_files(self, testdir):