Module

analysis.analyzer

Block analyzer - unified entry point for template analysis.

Combines dependency analysis, purity checking, landmark detection, and role classification into a unified analysis pass.

Classes

BlockAnalyzer 8
Analyze template blocks and extract metadata. Combines dependency analysis, purity checking, landm…

Analyze template blocks and extract metadata.

Combines dependency analysis, purity checking, landmark detection, and role classification into a unified analysis pass.

Thread-safe: Stateless analyzers, creates new result objects.

Configuration:

>>> from kida.analysis import AnalysisConfig
    >>> config = AnalysisConfig(
    ...     page_prefixes=frozenset({"post.", "item."}),
    ...     site_prefixes=frozenset({"global.", "settings."}),
    ... )
    >>> analyzer = BlockAnalyzer(config=config)

Methods

analyze 1 TemplateMetadata
Analyze a template AST and return metadata.
def analyze(self, ast: Template) -> TemplateMetadata
Parameters
Name Type Description
ast

Parsed template AST (nodes.Template)

Returns
TemplateMetadata TemplateMetadata with block information
Internal Methods 7
__init__ 2
Initialize analyzer with optional configuration.
def __init__(self, config: AnalysisConfig | None = None, template_resolver: Any | None = None) -> None
Parameters
Name Type Description
config

Analysis configuration. Uses DEFAULT_CONFIG if not provided.

Default:None
template_resolver

Optional callback(name: str) -> Template | None to resolve included templates for purity analysis. If None, includes return "unknown" purity.

Default:None
_analyze_block 1 BlockMetadata
Analyze a single block node.
def _analyze_block(self, block_node: Block) -> BlockMetadata
Parameters
Name Type Description
block_node
Returns
BlockMetadata
_collect_blocks 1 list[Block]
Recursively collect all Block nodes from AST.
def _collect_blocks(self, ast: Template) -> list[Block]
Parameters
Name Type Description
ast
Returns
list[Block]
_collect_blocks_recursive 2
Recursively find Block nodes.
def _collect_blocks_recursive(self, nodes: Any, blocks: list[Any]) -> None
Parameters
Name Type Description
nodes
blocks
_analyze_top_level 2 frozenset[str]
Analyze dependencies in top-level code outside blocks. This captures dependenc…
def _analyze_top_level(self, ast: Template, block_names: set[str]) -> frozenset[str]

Analyze dependencies in top-level code outside blocks.

This captures dependencies from:

  • Code before/after blocks
  • Extends expression (e.g., dynamic parent template)
  • Context type declarations

Does NOT include dependencies from inside blocks (those are tracked per-block).

Parameters
Name Type Description
ast
block_names
Returns
frozenset[str]
_analyze_top_level_nodes 3
Walk nodes, collecting dependencies but skipping block bodies.
def _analyze_top_level_nodes(self, nodes: Any, block_names: set[str], deps: set[str]) -> None
Parameters
Name Type Description
nodes
block_names
deps
_check_emits_html 1 bool
Check if a node produces any output.
def _check_emits_html(self, node: Any) -> bool
Parameters
Name Type Description
node
Returns
bool