Skip to content

Commit 5867263

Browse files
committed
mypy: add annotate.py and jsonreport.py
1 parent e3c523c commit 5867263

File tree

5 files changed

+36
-15
lines changed

5 files changed

+36
-15
lines changed

coverage/annotate.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,22 @@
33

44
"""Source file annotation for coverage.py."""
55

6+
from __future__ import annotations
7+
68
import os
79
import re
810

11+
from typing import Iterable, Optional, TYPE_CHECKING
12+
913
from coverage.files import flat_rootname
1014
from coverage.misc import ensure_dir, isolate_module
15+
from coverage.plugin import FileReporter
1116
from coverage.report import get_analysis_to_report
17+
from coverage.results import Analysis
18+
from coverage.types import TMorf
19+
20+
if TYPE_CHECKING:
21+
from coverage import Coverage
1222

1323
os = isolate_module(os)
1424

@@ -35,15 +45,15 @@ class AnnotateReporter:
3545
3646
"""
3747

38-
def __init__(self, coverage):
48+
def __init__(self, coverage: Coverage) -> None:
3949
self.coverage = coverage
4050
self.config = self.coverage.config
41-
self.directory = None
51+
self.directory: Optional[str] = None
4252

4353
blank_re = re.compile(r"\s*(#|$)")
4454
else_re = re.compile(r"\s*else\s*:\s*(#|$)")
4555

46-
def report(self, morfs, directory=None):
56+
def report(self, morfs: Optional[Iterable[TMorf]], directory: Optional[str]=None) -> None:
4757
"""Run the report.
4858
4959
See `coverage.report()` for arguments.
@@ -54,7 +64,7 @@ def report(self, morfs, directory=None):
5464
for fr, analysis in get_analysis_to_report(self.coverage, morfs):
5565
self.annotate_file(fr, analysis)
5666

57-
def annotate_file(self, fr, analysis):
67+
def annotate_file(self, fr: FileReporter, analysis: Analysis) -> None:
5868
"""Annotate a single file.
5969
6070
`fr` is the FileReporter for the file to annotate.

coverage/jsonreport.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,36 @@
33

44
"""Json reporting for coverage.py"""
55

6+
from __future__ import annotations
7+
68
import datetime
79
import json
810
import sys
911

12+
from typing import Any, Dict, IO, Iterable, List, Optional, Tuple, TYPE_CHECKING
13+
1014
from coverage import __version__
1115
from coverage.report import get_analysis_to_report
12-
from coverage.results import Numbers
16+
from coverage.results import Analysis, Numbers
17+
from coverage.types import TMorf, TLineNo
18+
19+
if TYPE_CHECKING:
20+
from coverage import Coverage
21+
from coverage.data import CoverageData
1322

1423

1524
class JsonReporter:
1625
"""A reporter for writing JSON coverage results."""
1726

1827
report_type = "JSON report"
1928

20-
def __init__(self, coverage):
29+
def __init__(self, coverage: Coverage) -> None:
2130
self.coverage = coverage
2231
self.config = self.coverage.config
2332
self.total = Numbers(self.config.precision)
24-
self.report_data = {}
33+
self.report_data: Dict[str, Any] = {}
2534

26-
def report(self, morfs, outfile=None):
35+
def report(self, morfs: Optional[Iterable[TMorf]], outfile: IO[str]) -> float:
2736
"""Generate a json report for `morfs`.
2837
2938
`morfs` is a list of modules or file names.
@@ -75,7 +84,7 @@ def report(self, morfs, outfile=None):
7584

7685
return self.total.n_statements and self.total.pc_covered
7786

78-
def report_one_file(self, coverage_data, analysis):
87+
def report_one_file(self, coverage_data: CoverageData, analysis: Analysis) -> Dict[str, Any]:
7988
"""Extract the relevant report data for a single file."""
8089
nums = analysis.numbers
8190
self.total += nums
@@ -96,7 +105,7 @@ def report_one_file(self, coverage_data, analysis):
96105
if self.config.json_show_contexts:
97106
reported_file['contexts'] = analysis.data.contexts_by_lineno(analysis.filename)
98107
if coverage_data.has_arcs():
99-
reported_file['summary'].update({
108+
summary.update({
100109
'num_branches': nums.n_branches,
101110
'num_partial_branches': nums.n_partial_branches,
102111
'covered_branches': nums.n_executed_branches,
@@ -111,7 +120,9 @@ def report_one_file(self, coverage_data, analysis):
111120
return reported_file
112121

113122

114-
def _convert_branch_arcs(branch_arcs):
123+
def _convert_branch_arcs(
124+
branch_arcs: Dict[TLineNo, List[TLineNo]],
125+
) -> Iterable[Tuple[TLineNo, TLineNo]]:
115126
"""Convert branch arcs to a list of two-element tuples."""
116127
for source, targets in branch_arcs.items():
117128
for target in targets:

coverage/report.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def render_report(
7171

7272
def get_analysis_to_report(
7373
coverage: Coverage,
74-
morfs: Iterable[TMorf]
74+
morfs: Optional[Iterable[TMorf]],
7575
) -> Iterator[Tuple[FileReporter, Analysis]]:
7676
"""Get the files to report on.
7777

coverage/sqldata.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ def set_query_context(self, context: str) -> None:
884884
with con.execute("select id from context where context = ?", (context,)) as cur:
885885
self._query_context_ids = [row[0] for row in cur.fetchall()]
886886

887-
def set_query_contexts(self, contexts: Sequence[str]) -> None:
887+
def set_query_contexts(self, contexts: Optional[Sequence[str]]) -> None:
888888
"""Set a number of contexts for subsequent querying.
889889
890890
The next :meth:`lines`, :meth:`arcs`, or :meth:`contexts_by_lineno`

tox.ini

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,9 @@ deps =
9595

9696
setenv =
9797
{[testenv]setenv}
98-
C__B=coverage/__init__.py coverage/__main__.py coverage/bytecode.py
98+
C__B=coverage/__init__.py coverage/__main__.py coverage/annotate.py coverage/bytecode.py
9999
C_CE=coverage/config.py coverage/context.py coverage/control.py coverage/data.py coverage/disposition.py coverage/exceptions.py
100-
C_FN=coverage/files.py coverage/inorout.py coverage/multiproc.py coverage/numbits.py
100+
C_FN=coverage/files.py coverage/inorout.py coverage/jsonreport.py coverage/multiproc.py coverage/numbits.py
101101
C_OP=coverage/parser.py coverage/phystokens.py coverage/plugin.py coverage/python.py
102102
C_QZ=coverage/report.py coverage/results.py coverage/sqldata.py coverage/tomlconfig.py coverage/types.py coverage/version.py
103103
T_AN=tests/test_api.py tests/goldtest.py tests/helpers.py tests/test_html.py

0 commit comments

Comments
 (0)