From 479bd4937b21f55eb90a5a08ff49760f445af137 Mon Sep 17 00:00:00 2001 From: "Jorge C. Leitao" Date: Sun, 23 Sep 2018 16:17:40 +0200 Subject: [PATCH 01/10] Added statistics to coverage report. --- sphinx/ext/coverage.py | 83 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/sphinx/ext/coverage.py b/sphinx/ext/coverage.py index 9300c1f7491..a8172187514 100644 --- a/sphinx/ext/coverage.py +++ b/sphinx/ext/coverage.py @@ -13,6 +13,7 @@ import glob import inspect import re +import sys from os import path from six.moves import cPickle as pickle @@ -49,6 +50,30 @@ def compile_regex_list(name, exps): return lst +def _write_table(f, table): + sizes = [max([len(x[column]) for x in table]) + 1 for column in range(len(table[0]))] + + def _add_line(separator): + s = '+' + for i, size in enumerate(sizes): + s += (separator * (size + 1)) + '+' + return s + '\n' + + def _add_row(columns, separator): + s = '' + for i, column in enumerate(columns): + s += '| %s%s' % (column, ' ' * (sizes[i] - len(column) - (i == len(columns) - 1))) + s += ' |\n' + s += _add_line(separator) + return s + + f.write(_add_line('-')) + f.write(_add_row(table[0], '=')) + + for row in table[1:]: + f.write(_add_row(row, '-')) + + class CoverageBuilder(Builder): """ Evaluates coverage of code in the documentation. @@ -89,6 +114,8 @@ def get_outdated_docs(self): def write(self, *ignored): # type: (Any) -> None self.py_undoc = {} # type: Dict[unicode, Dict[unicode, Any]] + self.py_undocumented = {} # type: Dict[unicode, set[unicode]] + self.py_documented = {} # type: Dict[unicode, set[unicode]] self.build_py_coverage() self.write_py_coverage() @@ -155,6 +182,9 @@ def build_py_coverage(self): self.py_undoc[mod_name] = {'error': err} continue + documented_objects = set() + undocumented_objects = set() + funcs = [] classes = {} # type: Dict[unicode, List[unicode]] @@ -181,6 +211,9 @@ def build_py_coverage(self): if skip_undoc and not obj.__doc__: continue funcs.append(name) + undocumented_objects.add(full_name) + else: + documented_objects.add(full_name) elif inspect.isclass(obj): for exp in self.cls_ignorexps: if exp.match(name): @@ -215,12 +248,49 @@ def build_py_coverage(self): full_attr_name = '%s.%s' % (full_name, attr_name) if full_attr_name not in objects: attrs.append(attr_name) + undocumented_objects.add(full_attr_name) + else: + documented_objects.add(full_attr_name) if attrs: # some attributes are undocumented classes[name] = attrs self.py_undoc[mod_name] = {'funcs': funcs, 'classes': classes} + self.py_undocumented[mod_name] = undocumented_objects + self.py_documented[mod_name] = documented_objects + + def _write_py_statistics(self, op): + """ + Outputs the table of + :param op: + :return: + """ + all_modules = set(self.py_documented.keys()).union(set(self.py_undocumented.keys())) + all_objects = set() + all_documented_objects = set() + for module in all_modules: + all_module_objects = self.py_documented[module].union(self.py_undocumented[module]) + all_objects = all_objects.union(all_module_objects) + all_documented_objects = all_documented_objects.union(self.py_documented[module]) + + # prepare tabular + table = [['Module', 'Coverage', 'Undocumented']] + for module in all_modules: + module_objects = self.py_documented[module].union(self.py_undocumented[module]) + if len(module_objects): + value = 100 * len(self.py_documented[module]) / len(module_objects) + else: + value = 100.0 + + table.append([module, '%.2f%%' % value, '%d' % len(self.py_undocumented[module])]) + table.append([ + 'TOTAL', + '%.2f%%' % (100 * len(all_documented_objects) / len(all_objects)), + '%d' % (len(all_objects) - len(all_documented_objects)) + ]) + + _write_table(op, table) def write_py_coverage(self): # type: () -> None @@ -229,6 +299,15 @@ def write_py_coverage(self): with open(output_file, 'w') as op: if self.config.coverage_write_headline: write_header(op, 'Undocumented Python objects', '=') + + if self.config.coverage_statistics_to_stdout: + self._write_py_statistics(sys.stdout) + + if self.config.coverage_statistics_to_report: + write_header(op, 'Statistics') + self._write_py_statistics(op) + op.write('\n') + keys = sorted(self.py_undoc.keys()) for name in keys: undoc = self.py_undoc[name] @@ -263,7 +342,7 @@ def finish(self): # dump the coverage data to a pickle file too picklepath = path.join(self.outdir, 'undoc.pickle') with open(picklepath, 'wb') as dumpfile: - pickle.dump((self.py_undoc, self.c_undoc), dumpfile) + pickle.dump((self.py_undoc, self.c_undoc, self.py_undocumented, self.py_documented), dumpfile) def setup(app): @@ -276,5 +355,7 @@ def setup(app): app.add_config_value('coverage_c_regexes', {}, False) app.add_config_value('coverage_ignore_c_items', {}, False) app.add_config_value('coverage_write_headline', True, False) + app.add_config_value('coverage_statistics_to_report', False, False) + app.add_config_value('coverage_statistics_to_stdout', False, False) app.add_config_value('coverage_skip_undoc_in_source', False, False) return {'version': sphinx.__display_version__, 'parallel_read_safe': True} From 3a3eacb791803931b74f7bb5a7ebbfe8fbd7c98c Mon Sep 17 00:00:00 2001 From: "Jorge C. Leitao" Date: Sun, 23 Sep 2018 16:46:57 +0200 Subject: [PATCH 02/10] Minimal fix to the test. Temporary while decision is made to go forward, on which tests must be written. --- tests/test_ext_coverage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_ext_coverage.py b/tests/test_ext_coverage.py index a8f222a0073..b4edaa14ddb 100644 --- a/tests/test_ext_coverage.py +++ b/tests/test_ext_coverage.py @@ -35,7 +35,7 @@ def test_build(app, status, warning): assert 'api.h' in c_undoc assert ' * Py_SphinxTest' in c_undoc - undoc_py, undoc_c = pickle.loads((app.outdir / 'undoc.pickle').bytes()) + undoc_py, undoc_c, py_undocumented, py_documented = pickle.loads((app.outdir / 'undoc.pickle').bytes()) assert len(undoc_c) == 1 # the key is the full path to the header file, which isn't testable assert list(undoc_c.values())[0] == set([('function', 'Py_SphinxTest')]) From dca64474635385c40793536f02aa0a83b4564b9b Mon Sep 17 00:00:00 2001 From: "Jorge C. Leitao" Date: Tue, 25 Sep 2018 06:46:01 +0200 Subject: [PATCH 03/10] Fixed mypi and Flake8 issues. --- sphinx/ext/coverage.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/sphinx/ext/coverage.py b/sphinx/ext/coverage.py index a8172187514..111f969122f 100644 --- a/sphinx/ext/coverage.py +++ b/sphinx/ext/coverage.py @@ -114,8 +114,8 @@ def get_outdated_docs(self): def write(self, *ignored): # type: (Any) -> None self.py_undoc = {} # type: Dict[unicode, Dict[unicode, Any]] - self.py_undocumented = {} # type: Dict[unicode, set[unicode]] - self.py_documented = {} # type: Dict[unicode, set[unicode]] + self.py_undocumented = {} # type: Dict[unicode, Set[unicode]] + self.py_documented = {} # type: Dict[unicode, Set[unicode]] self.build_py_coverage() self.write_py_coverage() @@ -182,8 +182,8 @@ def build_py_coverage(self): self.py_undoc[mod_name] = {'error': err} continue - documented_objects = set() - undocumented_objects = set() + documented_objects = set() # type: Set[unicode] + undocumented_objects = set() # type: Set[unicode] funcs = [] classes = {} # type: Dict[unicode, List[unicode]] @@ -266,8 +266,9 @@ def _write_py_statistics(self, op): :param op: :return: """ - all_modules = set(self.py_documented.keys()).union(set(self.py_undocumented.keys())) - all_objects = set() + all_modules = set(self.py_documented.keys()).union( + set(self.py_undocumented.keys())) # type: Set[unicode] + all_objects = set() # type: Set[unicode] all_documented_objects = set() for module in all_modules: all_module_objects = self.py_documented[module].union(self.py_undocumented[module]) @@ -279,7 +280,7 @@ def _write_py_statistics(self, op): for module in all_modules: module_objects = self.py_documented[module].union(self.py_undocumented[module]) if len(module_objects): - value = 100 * len(self.py_documented[module]) / len(module_objects) + value = 100.0 * len(self.py_documented[module]) / len(module_objects) else: value = 100.0 @@ -342,7 +343,8 @@ def finish(self): # dump the coverage data to a pickle file too picklepath = path.join(self.outdir, 'undoc.pickle') with open(picklepath, 'wb') as dumpfile: - pickle.dump((self.py_undoc, self.c_undoc, self.py_undocumented, self.py_documented), dumpfile) + pickle.dump((self.py_undoc, self.c_undoc, + self.py_undocumented, self.py_documented), dumpfile) def setup(app): From 453aed3ec857d905966883c70d682d7833654123 Mon Sep 17 00:00:00 2001 From: "Jorge C. Leitao" Date: Wed, 26 Sep 2018 07:43:50 +0200 Subject: [PATCH 04/10] Fixed missing annotations. --- sphinx/ext/coverage.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sphinx/ext/coverage.py b/sphinx/ext/coverage.py index 111f969122f..95c5d7e41bd 100644 --- a/sphinx/ext/coverage.py +++ b/sphinx/ext/coverage.py @@ -269,14 +269,14 @@ def _write_py_statistics(self, op): all_modules = set(self.py_documented.keys()).union( set(self.py_undocumented.keys())) # type: Set[unicode] all_objects = set() # type: Set[unicode] - all_documented_objects = set() + all_documented_objects = set() # type: Set[unicode] for module in all_modules: all_module_objects = self.py_documented[module].union(self.py_undocumented[module]) all_objects = all_objects.union(all_module_objects) all_documented_objects = all_documented_objects.union(self.py_documented[module]) # prepare tabular - table = [['Module', 'Coverage', 'Undocumented']] + table = [['Module', 'Coverage', 'Undocumented']] # type: List[List[unicode]] for module in all_modules: module_objects = self.py_documented[module].union(self.py_undocumented[module]) if len(module_objects): From d7c766723fc72a29cca95ec1125f332139ba35f8 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Fri, 28 Jul 2023 01:52:09 +0100 Subject: [PATCH 05/10] iterators --- doc/conf.py | 5 +-- sphinx/ext/coverage.py | 71 ++++++++++++++++++++---------------------- 2 files changed, 36 insertions(+), 40 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index cc5d18046dc..85607681c21 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -9,8 +9,9 @@ extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.autosummary', 'sphinx.ext.extlinks', 'sphinx.ext.intersphinx', - 'sphinx.ext.viewcode', 'sphinx.ext.inheritance_diagram'] - + 'sphinx.ext.viewcode', 'sphinx.ext.inheritance_diagram', + 'sphinx.ext.coverage'] +coverage_statistics_to_report = coverage_statistics_to_stdout = True templates_path = ['_templates'] exclude_patterns = ['_build'] diff --git a/sphinx/ext/coverage.py b/sphinx/ext/coverage.py index a25ae4cb96e..470d4e0ac5c 100644 --- a/sphinx/ext/coverage.py +++ b/sphinx/ext/coverage.py @@ -11,9 +11,10 @@ import pickle import re import sys +from collections.abc import Iterator from importlib import import_module from os import path -from typing import IO, Any +from typing import IO, Any, TextIO import sphinx from sphinx.application import Sphinx @@ -42,28 +43,23 @@ def compile_regex_list(name: str, exps: str) -> list[re.Pattern[str]]: return lst -def _write_table(f, table): - sizes = [max([len(x[column]) for x in table]) + 1 for column in range(len(table[0]))] +def _write_table(table: list[list[str]]) -> Iterator[str]: + sizes = [max(len(x[column]) for x in table) + 1 for column in range(len(table[0]))] - def _add_line(separator): - s = '+' - for i, size in enumerate(sizes): - s += (separator * (size + 1)) + '+' - return s + '\n' + yield _add_line(sizes, '-') + yield from _add_row(sizes, table[0], '=') - def _add_row(columns, separator): - s = '' - for i, column in enumerate(columns): - s += '| %s%s' % (column, ' ' * (sizes[i] - len(column) - (i == len(columns) - 1))) - s += ' |\n' - s += _add_line(separator) - return s + for row in table[1:]: + yield from _add_row(sizes, row, '-') - f.write(_add_line('-')) - f.write(_add_row(table[0], '=')) - for row in table[1:]: - f.write(_add_row(row, '-')) +def _add_line(sizes: list[int], separator: str): + return '+' + ''.join((separator * (size + 1)) + '+' for size in sizes) + + +def _add_row(col_widths: list[int], columns: list[str], separator: str) -> Iterator[str]: + yield ''.join(f'| {column: <{col_widths[i]}}' for i, column in enumerate(columns)) + '|' + yield _add_line(col_widths, separator) class CoverageBuilder(Builder): @@ -105,8 +101,8 @@ def get_outdated_docs(self) -> str: def write(self, *ignored: Any) -> None: self.py_undoc: dict[str, dict[str, Any]] = {} - self.py_undocumented: Dict[str, Set[str]] = {} - self.py_documented: Dict[str, Set[str]] = {} + self.py_undocumented: dict[str, set[str]] = {} + self.py_documented: dict[str, set[str]] = {} self.build_py_coverage() self.write_py_coverage() @@ -169,6 +165,7 @@ def build_py_coverage(self) -> None: skip_undoc = self.config.coverage_skip_undoc_in_source for mod_name in modules: + print(mod_name) ignore = False for exp in self.mod_ignorexps: if exp.match(mod_name): @@ -184,8 +181,8 @@ def build_py_coverage(self) -> None: self.py_undoc[mod_name] = {'error': err} continue - documented_objects = set() # type: Set[unicode] - undocumented_objects = set() # type: Set[unicode] + documented_objects: set[str] = set() + undocumented_objects: set[str] = set() funcs = [] classes: dict[str, list[str]] = {} @@ -265,23 +262,19 @@ def build_py_coverage(self) -> None: self.py_undocumented[mod_name] = undocumented_objects self.py_documented[mod_name] = documented_objects - def _write_py_statistics(self, op): - """ - Outputs the table of - :param op: - :return: - """ + def _write_py_statistics(self, op: TextIO) -> None: + """ Outputs the table of ``op``.""" all_modules = set(self.py_documented.keys()).union( - set(self.py_undocumented.keys())) # type: Set[unicode] - all_objects = set() # type: Set[unicode] - all_documented_objects = set() # type: Set[unicode] + set(self.py_undocumented.keys())) + all_objects: set[str] = set() + all_documented_objects: set[str] = set() for module in all_modules: all_module_objects = self.py_documented[module].union(self.py_undocumented[module]) all_objects = all_objects.union(all_module_objects) all_documented_objects = all_documented_objects.union(self.py_documented[module]) # prepare tabular - table = [['Module', 'Coverage', 'Undocumented']] # type: List[List[unicode]] + table = [['Module', 'Coverage', 'Undocumented']] for module in all_modules: module_objects = self.py_documented[module].union(self.py_undocumented[module]) if len(module_objects): @@ -292,11 +285,13 @@ def _write_py_statistics(self, op): table.append([module, '%.2f%%' % value, '%d' % len(self.py_undocumented[module])]) table.append([ 'TOTAL', - '%.2f%%' % (100 * len(all_documented_objects) / len(all_objects)), - '%d' % (len(all_objects) - len(all_documented_objects)) + f'{100 * len(all_documented_objects) / len(all_objects):.2f}%', + f'{len(all_objects) - len(all_documented_objects)}', ]) - _write_table(op, table) + for line in _write_table(table): + op.write(f'{line}\n') + def write_py_coverage(self) -> None: output_file = path.join(self.outdir, 'python.txt') @@ -392,8 +387,8 @@ def setup(app: Sphinx) -> dict[str, Any]: app.add_config_value('coverage_c_regexes', {}, False) app.add_config_value('coverage_ignore_c_items', {}, False) app.add_config_value('coverage_write_headline', True, False) - app.add_config_value('coverage_statistics_to_report', False, False) - app.add_config_value('coverage_statistics_to_stdout', False, False) + app.add_config_value('coverage_statistics_to_report', False, False, (bool,)) + app.add_config_value('coverage_statistics_to_stdout', False, False, (bool,)) app.add_config_value('coverage_skip_undoc_in_source', False, False) app.add_config_value('coverage_show_missing_items', False, False) return {'version': sphinx.__display_version__, 'parallel_read_safe': True} From c5331822ccd15b2e7db4fdc81d92cd40063e531d Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Fri, 28 Jul 2023 02:00:26 +0100 Subject: [PATCH 06/10] Add docs --- doc/usage/extensions/coverage.rst | 40 ++++++++++++++++++++++++++++++- sphinx/ext/coverage.py | 13 +++++----- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/doc/usage/extensions/coverage.rst b/doc/usage/extensions/coverage.rst index 5e6b04febeb..1390ebf1155 100644 --- a/doc/usage/extensions/coverage.rst +++ b/doc/usage/extensions/coverage.rst @@ -30,6 +30,8 @@ should check: of a Python object, that Python object is excluded from the documentation coverage report. + .. _Python regular expressions: https://docs.python.org/library/re + .. versionadded:: 2.1 .. confval:: coverage_c_path @@ -58,4 +60,40 @@ should check: .. versionadded:: 3.1 -.. _Python regular expressions: https://docs.python.org/library/re +.. confval:: coverage_statistics_to_report + + Print a tabluar report of the coverage statistics to the coverage report. + ``True`` by default. + + Example output: + + .. code-block:: text + + +-----------------------+----------+--------------+ + | Module | Coverage | Undocumented | + +=======================+==========+==============+ + | package.foo_module | 100.00% | 0 | + +-----------------------+----------+--------------+ + | package.bar_module | 83.33% | 1 | + +-----------------------+----------+--------------+ + + .. versionadded:: 7.2 + +.. confval:: coverage_statistics_to_stdout + + Print a tabluar report of the coverage statistics to standard output. + ``False`` by default. + + Example output: + + .. code-block:: text + + +-----------------------+----------+--------------+ + | Module | Coverage | Undocumented | + +=======================+==========+==============+ + | package.foo_module | 100.00% | 0 | + +-----------------------+----------+--------------+ + | package.bar_module | 83.33% | 1 | + +-----------------------+----------+--------------+ + + .. versionadded:: 7.2 diff --git a/sphinx/ext/coverage.py b/sphinx/ext/coverage.py index 470d4e0ac5c..79aad54da57 100644 --- a/sphinx/ext/coverage.py +++ b/sphinx/ext/coverage.py @@ -11,10 +11,9 @@ import pickle import re import sys -from collections.abc import Iterator from importlib import import_module from os import path -from typing import IO, Any, TextIO +from typing import TYPE_CHECKING, IO, Any, TextIO import sphinx from sphinx.application import Sphinx @@ -24,13 +23,16 @@ from sphinx.util.console import red # type: ignore from sphinx.util.inspect import safe_getattr +if TYPE_CHECKING: + from collections.abc import Iterator + logger = logging.getLogger(__name__) # utility def write_header(f: IO[str], text: str, char: str = '-') -> None: f.write(text + '\n') - f.write(char * len(text) + '\n') + f.write(char * len(text) + '\n\n') def compile_regex_list(name: str, exps: str) -> list[re.Pattern[str]]: @@ -53,7 +55,7 @@ def _write_table(table: list[list[str]]) -> Iterator[str]: yield from _add_row(sizes, row, '-') -def _add_line(sizes: list[int], separator: str): +def _add_line(sizes: list[int], separator: str) -> str: return '+' + ''.join((separator * (size + 1)) + '+' for size in sizes) @@ -292,7 +294,6 @@ def _write_py_statistics(self, op: TextIO) -> None: for line in _write_table(table): op.write(f'{line}\n') - def write_py_coverage(self) -> None: output_file = path.join(self.outdir, 'python.txt') failed = [] @@ -387,7 +388,7 @@ def setup(app: Sphinx) -> dict[str, Any]: app.add_config_value('coverage_c_regexes', {}, False) app.add_config_value('coverage_ignore_c_items', {}, False) app.add_config_value('coverage_write_headline', True, False) - app.add_config_value('coverage_statistics_to_report', False, False, (bool,)) + app.add_config_value('coverage_statistics_to_report', True, False, (bool,)) app.add_config_value('coverage_statistics_to_stdout', False, False, (bool,)) app.add_config_value('coverage_skip_undoc_in_source', False, False) app.add_config_value('coverage_show_missing_items', False, False) From 4ac620d34d8d7bb456dbb33d14f4f22e69297a74 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Fri, 28 Jul 2023 02:03:30 +0100 Subject: [PATCH 07/10] CHANGES --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index e74ec0e63e9..8cd074da2e5 100644 --- a/CHANGES +++ b/CHANGES @@ -22,6 +22,8 @@ Features added * #11526: Support ``os.PathLike`` types and ``pathlib.Path`` objects in many more places. +* #5474: coverage: Print summary statistics tables. + Patch by Jorge Leitao. Bugs fixed ---------- From c0fa57c924218a019b7ba7676235f59e1c653f99 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Fri, 28 Jul 2023 02:03:48 +0100 Subject: [PATCH 08/10] Ruff --- sphinx/ext/coverage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/ext/coverage.py b/sphinx/ext/coverage.py index 79aad54da57..0b1c7a09a68 100644 --- a/sphinx/ext/coverage.py +++ b/sphinx/ext/coverage.py @@ -13,7 +13,7 @@ import sys from importlib import import_module from os import path -from typing import TYPE_CHECKING, IO, Any, TextIO +from typing import IO, TYPE_CHECKING, Any, TextIO import sphinx from sphinx.application import Sphinx From ba8d9b61f5dfe582f563ebce7061f46842b787a2 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Fri, 28 Jul 2023 02:10:18 +0100 Subject: [PATCH 09/10] Tests --- tests/test_ext_coverage.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tests/test_ext_coverage.py b/tests/test_ext_coverage.py index 44dfc799232..af8cf535211 100644 --- a/tests/test_ext_coverage.py +++ b/tests/test_ext_coverage.py @@ -47,10 +47,24 @@ def test_build(app, status, warning): def test_coverage_ignore_pyobjects(app, status, warning): app.builder.build_all() actual = (app.outdir / 'python.txt').read_text(encoding='utf8') - expected = '''Undocumented Python objects + expected = '''\ +Undocumented Python objects =========================== + +Statistics +---------- + ++----------------------+----------+--------------+ +| Module | Coverage | Undocumented | ++======================+==========+==============+ +| coverage_not_ignored | 0.00% | 2 | ++----------------------+----------+--------------+ +| TOTAL | 0.00% | 2 | ++----------------------+----------+--------------+ + coverage_not_ignored -------------------- + Classes: * Documented -- missing methods: From badfa4a5d9b2e90644e3dc60827d550a19a09bd2 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Fri, 28 Jul 2023 02:28:17 +0100 Subject: [PATCH 10/10] print to stdout by default --- sphinx/ext/coverage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/ext/coverage.py b/sphinx/ext/coverage.py index 0b1c7a09a68..3eaa9de28d0 100644 --- a/sphinx/ext/coverage.py +++ b/sphinx/ext/coverage.py @@ -389,7 +389,7 @@ def setup(app: Sphinx) -> dict[str, Any]: app.add_config_value('coverage_ignore_c_items', {}, False) app.add_config_value('coverage_write_headline', True, False) app.add_config_value('coverage_statistics_to_report', True, False, (bool,)) - app.add_config_value('coverage_statistics_to_stdout', False, False, (bool,)) + app.add_config_value('coverage_statistics_to_stdout', True, False, (bool,)) app.add_config_value('coverage_skip_undoc_in_source', False, False) app.add_config_value('coverage_show_missing_items', False, False) return {'version': sphinx.__display_version__, 'parallel_read_safe': True}