# coverage

URL: /kida/api/coverage/
Section: api
Description: 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 = N`` line 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")

---

> For a complete page index, fetch /kida/llms.txt.

Open LLM text
(/kida/api/coverage/index.txt)

Share with AI

Ask Claude
(https://claude.ai/new?q=Please%20help%20me%20understand%20this%20documentation%3A%20%2Fkida%2Fapi%2Fcoverage%2Findex.txt)

Ask ChatGPT
(https://chatgpt.com/?q=Please%20help%20me%20understand%20this%20documentation%3A%20%2Fkida%2Fapi%2Fcoverage%2Findex.txt)

Ask Gemini
(https://gemini.google.com/app?q=Please%20help%20me%20understand%20this%20documentation%3A%20%2Fkida%2Fapi%2Fcoverage%2Findex.txt)

Ask Copilot
(https://copilot.microsoft.com/?q=Please%20help%20me%20understand%20this%20documentation%3A%20%2Fkida%2Fapi%2Fcoverage%2Findex.txt)

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 = N`line 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")
```

2Classes1Function

## 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 patches`RenderContext.__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`
