Source code for gamesheet_sdk.common.cli.rendering

# Copyright (c) 2026 bdperkin
# SPDX-License-Identifier: MIT

"""Rendering utilities for CLI commands."""

from __future__ import annotations

import json
from typing import Any

import yaml
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, columns_spec: str | None = None, ) -> None: """Render get command output (single object as key-value pairs). Args: data (dict[str, Any] | BaseModel): The object to render (dict or pydantic model) output_format (str): Output format (json, yaml, csv, tsv, or tabulate format) output_path (str | None): Optional file path to write output to columns_spec (str | None): Optional comma-separated column names to include """ # Convert pydantic model to dict if needed data_dict = data.model_dump(mode="json") if isinstance(data, BaseModel) else data # Filter fields if specified if columns_spec: fields = parse_columns_spec(columns_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). Args: items (list[Any]): List of objects to render (dicts or pydantic models) output_format (str): Output format (json, yaml, csv, tsv, or tabulate format) output_path (str | None): Optional file path to write output to columns_spec (str | None): Optional comma-separated column names to include """ # 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. Args: report (dict[str, Any]): The penalty report dictionary to render output_format (str): Output format (json or yaml) output_path (str | None): Optional file path to write output to """ if output_format == "json": output_text = json.dumps(report, indent=2) elif output_format == "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)