Source code for kstlib.monitoring.kv

"""MonitorKV render type for key-value pair display.

A ``MonitorKV`` renders as an HTML ``<dl>`` definition list with a
two-column grid layout, suitable for status summaries and stat panels.
"""

from __future__ import annotations

import html
from dataclasses import dataclass
from typing import TYPE_CHECKING

from kstlib.monitoring.cell import StatusCell

if TYPE_CHECKING:
    from kstlib.monitoring.types import CellValue


[docs] @dataclass(frozen=True, slots=True) class MonitorKV: """A key-value grid rendered as an HTML ``<dl>``. Values can be plain scalars or ``StatusCell`` objects for colored badges. Attributes: items: Ordered mapping of keys to values. title: Optional heading rendered above the list. Examples: >>> from kstlib.monitoring.kv import MonitorKV >>> kv = MonitorKV({"Host": "srv-01", "Port": 8080}) >>> "<dl" in kv.render() True """ items: dict[str, CellValue | StatusCell] title: str = ""
[docs] def render(self, *, inline_css: bool = False) -> str: """Render the key-value pairs as an HTML ``<dl>``. Args: inline_css: If True, use inline styles instead of CSS classes. Returns: HTML ``<dl>`` string, optionally preceded by an ``<h3>`` title. """ parts: list[str] = [] if self.title: escaped_title = html.escape(self.title) parts.append(f"<h3>{escaped_title}</h3>") if inline_css: style = "display:grid;grid-template-columns:auto 1fr;gap:4px 12px" parts.append(f'<dl style="{style}">') else: parts.append('<dl class="monitor-kv">') for key, value in self.items.items(): escaped_key = html.escape(str(key)) if inline_css: parts.append(f'<dt style="font-weight:bold">{escaped_key}</dt>') else: parts.append(f"<dt>{escaped_key}</dt>") if isinstance(value, StatusCell): rendered_value = value.render(inline_css=inline_css) else: rendered_value = html.escape(str(value)) parts.append(f"<dd>{rendered_value}</dd>") parts.append("</dl>") return "".join(parts)
__all__ = [ "MonitorKV", ]