Coverage for tests / plugin1.py: 66.667%
28 statements
« prev ^ index » next coverage.py v7.12.1a0.dev1, created at 2025-11-30 17:57 +0000
« prev ^ index » next coverage.py v7.12.1a0.dev1, created at 2025-11-30 17:57 +0000
1# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2# For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
4"""A file tracer plugin for test_plugins.py to import."""
6from __future__ import annotations 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
8import os.path 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
10from types import FrameType 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
11from typing import Any 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
13from coverage import CoveragePlugin, FileReporter, FileTracer 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
14from coverage.plugin_support import Plugins 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
15from coverage.types import TLineNo 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
18class Plugin(CoveragePlugin): 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
19 """A file tracer plugin to import, so that it isn't in the test's current directory."""
21 def file_tracer(self, filename: str) -> FileTracer | None: 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
22 """Trace only files named xyz.py"""
23 if "xyz.py" in filename:
24 return MyFileTracer(filename)
25 return None
27 def file_reporter(self, filename: str) -> FileReporter | str: 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
28 return MyFileReporter(filename) 1abcdefghijklmnopqrstuvwxyzA
31class MyFileTracer(FileTracer): 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
32 """A FileTracer emulating a simple static plugin."""
34 def __init__(self, filename: str) -> None: 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
35 """Claim that */*xyz.py was actually sourced from /src/*ABC.zz"""
36 self._filename = filename
37 self._source_filename = os.path.join(
38 "/src",
39 os.path.basename(filename.replace("xyz.py", "ABC.zz")),
40 )
42 def source_filename(self) -> str: 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
43 return self._source_filename
45 def line_number_range(self, frame: FrameType) -> tuple[TLineNo, TLineNo]: 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
46 """Map the line number X to X05,X06,X07."""
47 lineno = frame.f_lineno
48 return lineno * 100 + 5, lineno * 100 + 7
51class MyFileReporter(FileReporter): 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
52 """Dead-simple FileReporter."""
54 def lines(self) -> set[TLineNo]: 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
55 return {105, 106, 107, 205, 206, 207} 1abcdefghijklmnopqrstuvwxyzA
58def coverage_init( 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()
59 reg: Plugins,
60 options: Any, # pylint: disable=unused-argument
61) -> None:
62 """Called by coverage to initialize the plugins here."""
63 reg.add_file_tracer(Plugin()) 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()