Module

coverage

Template coverage collection and reporting for Kida.

Tracks which template lines execute during rendering and outputs standard coverage formats (lcov, Cobertura XML).

Leverages the existing_rc.line = Nline tracking that the compiler emits for error reporting — zero overhead when coverage is disabled, one ContextVar check per line marker when enabled.

Usage::

from kida import Environment
from kida.coverage import CoverageCollector

env = Environment()
cov = CoverageCollector()

with cov:
    template = env.get_template("page.html")
    template.render(title="Hello")

print(cov.summary())
cov.write_lcov("coverage.lcov")

Classes

CoverageResult 7 ▼
Coverage data for a single template.

Coverage data for a single template.

Attributes

Name Type Description
template_name str —
executed_lines frozenset[int] —
total_lines frozenset[int] —

Methods

hit_count 0 int ▼
property
def hit_count(self) -> int
Returns
int
total_count 0 int ▼
property
def total_count(self) -> int
Returns
int
missed_count 0 int ▼
property
def missed_count(self) -> int
Returns
int
percentage 0 float ▼
property
def percentage(self) -> float
Returns
float
CoverageCollector 14 ▼
Collects template line coverage during rendering. Dynamically patches ``RenderContext.__setattr__`…

Collects template line coverage during rendering.

Dynamically patchesRenderContext.__setattr__while active so there is zero overhead when coverage is disabled (the normal case).

Attributes

Name Type Description
_active_count int —

Methods

data 0 dict[str, set[int]] ▼
Raw coverage data: {template_name: {executed_lines}}.
property
def data(self) -> dict[str, set[int]]
Returns
dict[str, set[int]]
start 0 ▼
Start collecting coverage data.
def start(self) -> None
stop 0 ▼
Stop collecting coverage data.
def stop(self) -> None
clear 0 ▼
Clear all collected data.
def clear(self) -> None
get_results 1 list[CoverageResult] ▼
Get coverage results for all tracked templates.
def get_results(self, source_map: dict[str, frozenset[int]] | None = None) -> list[CoverageResult]
Parameters
Name Type Description
source_map —

Optional mapping of template_name to all trackable line numbers. If not provided, total_lines equals executed_lines (100% coverage for all touched templates — useful for hit tracking even without full line enumeration).

Default:None
Returns
list[CoverageResult] List of CoverageResult per template, sorted by name.
summary 1 str ▼
Generate a text summary of coverage.
def summary(self, source_map: dict[str, frozenset[int]] | None = None) -> str
Parameters
Name Type Description
source_map — Default:None
Returns
str
write_lcov 1 ▼
Write coverage data in LCOV tracefile format.
def write_lcov(self, path: str) -> None
Parameters
Name Type Description
path —
format_lcov 0 str ▼
Format coverage data as LCOV tracefile string.
def format_lcov(self) -> str
Returns
str
format_cobertura 0 str ▼
Format coverage data as Cobertura XML string.
def format_cobertura(self) -> str
Returns
str
write_cobertura 1 ▼
Write coverage data in Cobertura XML format.
def write_cobertura(self, path: str) -> None
Parameters
Name Type Description
path —
Internal Methods 3 ▼
__init__ 0 ▼
def __init__(self) -> None
__enter__ 0 CoverageCollector ▼
def __enter__(self) -> CoverageCollector
Returns
CoverageCollector
__exit__ 1 ▼
def __exit__(self, *args: object) -> None
Parameters
Name Type Description
*args —

Functions

_coverage_setattr 3 None ▼
Patched __setattr__ that records line hits for coverage.
def _coverage_setattr(self: RenderContext, name: str, value: object) -> None
Parameters
Name Type Description
self RenderContext
name str
value object