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

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 

3 

4"""A file tracer plugin for test_plugins.py to import.""" 

5 

6from __future__ import annotations 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

7 

8import os.path 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

9 

10from types import FrameType 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

11from typing import Any 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

12 

13from coverage import CoveragePlugin, FileReporter, FileTracer 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

14from coverage.plugin_support import Plugins 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

15from coverage.types import TLineNo 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

16 

17 

18class Plugin(CoveragePlugin): 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

19 """A file tracer plugin to import, so that it isn't in the test's current directory.""" 

20 

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 

26 

27 def file_reporter(self, filename: str) -> FileReporter | str: 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

28 return MyFileReporter(filename) 1abcdefghijklmnopqrstuvwxyzA

29 

30 

31class MyFileTracer(FileTracer): 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

32 """A FileTracer emulating a simple static plugin.""" 

33 

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 ) 

41 

42 def source_filename(self) -> str: 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

43 return self._source_filename 

44 

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 

49 

50 

51class MyFileReporter(FileReporter): 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

52 """Dead-simple FileReporter.""" 

53 

54 def lines(self) -> set[TLineNo]: 1aBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQRqSTrUVsWXtYZu01v23w45x67y89z!#A$%'()

55 return {105, 106, 107, 205, 206, 207} 1abcdefghijklmnopqrstuvwxyzA

56 

57 

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$%'()