Source code for gamesheet_sdk.admin.cli.shared.rendering
# Copyright (c) 2026 bdperkin
# SPDX-License-Identifier: MIT
"""Rendering utilities for CLI commands."""
from __future__ import annotations
from typing import Any
from pydantic import BaseModel
from gamesheet_sdk.common.cli.core import parse_columns_spec
from gamesheet_sdk.common.output import render, write_output
[docs]
def render_get_command(
data: dict[str, Any] | BaseModel,
output_format: str,
output_path: str | None,
fields_spec: str | None = None,
) -> None:
"""Render get command output (single object as key-value pairs).
:param data: The object to render (dict or pydantic model)
:type data: dict[str, Any] | BaseModel
:param output_format: Output format (json, yaml, csv, tsv, or tabulate format)
:type output_format: str
:param output_path: Optional file path to write output to
:type output_path: str | None
:param fields_spec: Optional comma-separated field names to include
:type fields_spec: str | None
"""
# Convert pydantic model to dict if needed
if isinstance(data, BaseModel):
data_dict = data.model_dump(mode="json")
else:
data_dict = data
# Filter fields if specified
if fields_spec:
fields = parse_columns_spec(fields_spec)
if fields:
data_dict = {k: v for k, v in data_dict.items() if k in fields}
# Render as key-value rows for tabular formats
if output_format not in ("json", "yaml"):
rows = [{"field": k, "value": v} for k, v in data_dict.items()]
rendered = render(rows, fmt=output_format, columns=None)
else:
rendered = render([data_dict], fmt=output_format, columns=None)
write_output(rendered, output_path, fmt=output_format)
[docs]
def render_list_command(
items: list[Any],
output_format: str,
output_path: str | None,
columns_spec: str | None = None,
) -> None:
"""Render list command output (table of objects).
:param items: List of objects to render (dicts or pydantic models)
:type items: list[Any]
:param output_format: Output format (json, yaml, csv, tsv, or tabulate format)
:type output_format: str
:param output_path: Optional file path to write output to
:type output_path: str | None
:param columns_spec: Optional comma-separated column names to include
:type columns_spec: str | None
"""
# Convert pydantic models to dicts
rows = [item.model_dump(mode="json") if hasattr(item, "model_dump") else item for item in items]
# Parse columns spec
columns = parse_columns_spec(columns_spec) if columns_spec else None
# Render and write
rendered = render(rows, fmt=output_format, columns=columns)
write_output(rendered, output_path, fmt=output_format)
[docs]
def render_penalty_report(
report: dict[str, Any],
output_format: str,
output_path: str | None,
) -> None:
"""Render penalty report output.
:param report: The penalty report dictionary to render
:type report: dict[str, Any]
:param output_format: Output format (json or yaml)
:type output_format: str
:param output_path: Optional file path to write output to
:type output_path: str | None
"""
import json
if output_format == "json":
output_text = json.dumps(report, indent=2)
elif output_format == "yaml":
import yaml
output_text = yaml.dump(report, default_flow_style=False)
else:
output_text = json.dumps(report, indent=2)
write_output(output_text, output_path, fmt=output_format)