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

1"""Output formatting for CLI results.""" 

2 

3import json 

4from typing import Any 

5 

6 

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 

27 

28 

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)) 

40 

41 

42def format_json(result: Any) -> str: # noqa: ANN401 

43 """Format a result as JSON.""" 

44 return json.dumps(result, indent=2)