mirror of https://github.com/python/cpython
49 lines
1.3 KiB
Python
49 lines
1.3 KiB
Python
|
"""A minimal hook for gathering line coverage of the standard library.
|
||
|
|
||
|
Designed to be used with -Xpresite= which means:
|
||
|
* it installs itself on import
|
||
|
* it's not imported as `__main__` so can't use the ifmain idiom
|
||
|
* it can't import anything besides `sys` to avoid tainting gathered coverage
|
||
|
* filenames are not normalized
|
||
|
|
||
|
To get gathered coverage back, look for 'test.cov' in `sys.modules`
|
||
|
instead of importing directly. That way you can determine if the module
|
||
|
was already in use.
|
||
|
|
||
|
If you need to disable the hook, call the `disable()` function.
|
||
|
"""
|
||
|
|
||
|
import sys
|
||
|
|
||
|
mon = sys.monitoring
|
||
|
|
||
|
FileName = str
|
||
|
LineNo = int
|
||
|
Location = tuple[FileName, LineNo]
|
||
|
|
||
|
coverage: set[Location] = set()
|
||
|
|
||
|
|
||
|
# `types` and `typing` aren't imported to avoid invalid coverage
|
||
|
def add_line(
|
||
|
code: "types.CodeType",
|
||
|
lineno: int,
|
||
|
) -> "typing.Literal[sys.monitoring.DISABLE]":
|
||
|
coverage.add((code.co_filename, lineno))
|
||
|
return mon.DISABLE
|
||
|
|
||
|
|
||
|
def enable():
|
||
|
mon.use_tool_id(mon.COVERAGE_ID, "regrtest coverage")
|
||
|
mon.register_callback(mon.COVERAGE_ID, mon.events.LINE, add_line)
|
||
|
mon.set_events(mon.COVERAGE_ID, mon.events.LINE)
|
||
|
|
||
|
|
||
|
def disable():
|
||
|
mon.set_events(mon.COVERAGE_ID, 0)
|
||
|
mon.register_callback(mon.COVERAGE_ID, mon.events.LINE, None)
|
||
|
mon.free_tool_id(mon.COVERAGE_ID)
|
||
|
|
||
|
|
||
|
enable()
|