Source code for simdb.cli.commands.utils

from typing import List, Dict, Tuple, TYPE_CHECKING, TypeVar, Optional, Any
from collections import OrderedDict
import uuid
import click
import numpy

if TYPE_CHECKING:
    # Only importing these for type checking and documentation generation in order to speed up runtime startup.
    from ...database.models import Simulation
else:
    Config = TypeVar("Config")


def _flatten_dict(values: Dict) -> List[Tuple[str, str]]:
    items = []
    for k, v in values.items():
        if isinstance(v, list):
            for n, i in enumerate(v):
                items.append(("{}[{}]".format(k, n), i))
        elif isinstance(v, dict):
            for i in _flatten_dict(v):
                items.append(("{}.{}".format(k, i[0]), i[1]))
        else:
            items.append((k, v))
    return items


def _format_meta_value(meta_value: Any, max_len: int) -> str:
    """
    Format the meta value as a string, limiting array values to max_len.
    """
    if isinstance(meta_value, list) or isinstance(meta_value, numpy.ndarray):
        values = []
        for i, v in enumerate(meta_value):
            values.append(f"{v:.2f}")
            if i >= max_len - 1:
                values.append("...")
                break
        output = ", ".join(values)
        return f"[{output}]"
    return str(meta_value)






def _print_trace_sim(trace_data: dict, indentation: int):
    spaces = " " * indentation

    if "error" in trace_data:
        error = trace_data["error"]
        click.echo(f"{spaces}{error}")
        return

    uuid = trace_data["uuid"]
    alias = trace_data["alias"]
    status = trace_data["status"] if "status" in trace_data else "unknown"

    click.echo(f"{spaces}Simulation: {uuid}")
    click.echo(f"{spaces}     Alias: {alias}")
    click.echo(f"{spaces}    Status: {status}")
    status_on_name = status + "_on"
    if status_on_name in trace_data:
        status_on = trace_data[status_on_name]
        label = status_on_name.replace("_", " ").capitalize()
        click.echo(f"{spaces}{label}: {status_on}")

    if "replaces" in trace_data:
        if "replaces_reason" in trace_data:
            replaces_reason = trace_data["replaces_reason"]
            click.echo(f"{spaces}Replaces: (reason: {replaces_reason})")
        else:
            click.echo(f"{spaces}Replaces:")
        _print_trace_sim(trace_data["replaces"], indentation + 2)