summaryrefslogtreecommitdiff
path: root/coverage/report.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2022-12-31 19:04:31 -0500
committerNed Batchelder <ned@nedbatchelder.com>2022-12-31 20:39:09 -0500
commite3c523c98cbc9ecdd37e36da19848ca9d0aef4a3 (patch)
tree0857c3472c5858695d26f0276e8f1c5b3512a3e2 /coverage/report.py
parent5a72a1eb736516759201b223463f69f00979818e (diff)
downloadpython-coveragepy-git-e3c523c98cbc9ecdd37e36da19848ca9d0aef4a3.tar.gz
mypy: add __init__.py, __main__.py, bytecode.py, context.py, exceptions.py, report.py, and version.py
Diffstat (limited to 'coverage/report.py')
-rw-r--r--coverage/report.py33
1 files changed, 30 insertions, 3 deletions
diff --git a/coverage/report.py b/coverage/report.py
index b44f9c8e..549ab307 100644
--- a/coverage/report.py
+++ b/coverage/report.py
@@ -3,14 +3,38 @@
"""Reporter foundation for coverage.py."""
+from __future__ import annotations
+
import sys
+from typing import Callable, Iterable, Iterator, IO, Optional, Tuple, TYPE_CHECKING
+
from coverage.exceptions import CoverageException, NoDataError, NotPython
from coverage.files import prep_patterns, GlobMatcher
from coverage.misc import ensure_dir_for_file, file_be_gone
+from coverage.plugin import FileReporter
+from coverage.results import Analysis
+from coverage.types import Protocol, TMorf
+
+if TYPE_CHECKING:
+ from coverage import Coverage
+
+
+class Reporter(Protocol):
+ """What we expect of reporters."""
+
+ report_type: str
+
+ def report(self, morfs: Optional[Iterable[TMorf]], outfile: IO[str]) -> float:
+ """Generate a report of `morfs`, written to `outfile`."""
-def render_report(output_path, reporter, morfs, msgfn) -> float:
+def render_report(
+ output_path: str,
+ reporter: Reporter,
+ morfs: Optional[Iterable[TMorf]],
+ msgfn: Callable[[str], None],
+) -> float:
"""Run a one-file report generator, managing the output file.
This function ensures the output file is ready to be written to. Then writes
@@ -45,7 +69,10 @@ def render_report(output_path, reporter, morfs, msgfn) -> float:
msgfn(f"Wrote {reporter.report_type} to {output_path}")
-def get_analysis_to_report(coverage, morfs):
+def get_analysis_to_report(
+ coverage: Coverage,
+ morfs: Iterable[TMorf]
+) -> Iterator[Tuple[FileReporter, Analysis]]:
"""Get the files to report on.
For each morf in `morfs`, if it should be reported on (based on the omit
@@ -75,7 +102,7 @@ def get_analysis_to_report(coverage, morfs):
# explicitly suppress those errors.
# NotPython is only raised by PythonFileReporter, which has a
# should_be_python() method.
- if fr.should_be_python():
+ if fr.should_be_python(): # type: ignore[attr-defined]
if config.ignore_errors:
msg = f"Couldn't parse Python file '{fr.filename}'"
coverage._warn(msg, slug="couldnt-parse")