Coverage for flowr / cli / output.py: 100%
31 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-02 18:23 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-02 18:23 +0000
1"""Output formatting for CLI results."""
3import json
4from typing import Any
7def _format_dict_lines(data: dict[str, Any]) -> list[str]:
8 """Format a single dict as key-value lines."""
9 lines: list[str] = []
10 for key, value in data.items():
11 if isinstance(value, list):
12 if not value:
13 lines.append(f"{key}: (none)")
14 elif isinstance(value[0], dict):
15 for item in value:
16 for k, v in item.items():
17 lines.append(f" {k}: {v}")
18 else:
19 for item in value:
20 lines.append(f"{key}: {item}")
21 elif isinstance(value, dict):
22 for k, v in value.items():
23 lines.append(f"{k}: {v}")
24 else:
25 lines.append(f"{key}: {value}")
26 return lines
29def format_text(result: dict[str, Any] | list[dict[str, Any]]) -> str:
30 """Format a result dict or list of dicts as human-readable text."""
31 if isinstance(result, list):
32 lines: list[str] = []
33 for item in result:
34 lines.extend(_format_dict_lines(item))
35 lines.append("---")
36 if lines:
37 lines.pop()
38 return "\n".join(lines)
39 return "\n".join(_format_dict_lines(result))
42def format_json(result: Any) -> str: # noqa: ANN401
43 """Format a result as JSON."""
44 return json.dumps(result, indent=2)