Coverage for little_loops / cli / learning_tests.py: 19%
48 statements
« prev ^ index » next coverage.py v7.12.0, created at 2026-06-15 17:30 -0500
« prev ^ index » next coverage.py v7.12.0, created at 2026-06-15 17:30 -0500
1"""ll-learning-tests: CLI for querying and managing the learning test registry."""
3from __future__ import annotations
5import argparse
6import sys
8from little_loops.session_store import DEFAULT_DB_PATH, cli_event_context
10__all__ = ["main_learning_tests"]
13def cmd_check(args: argparse.Namespace) -> int:
14 from little_loops.cli.output import print_json
15 from little_loops.learning_tests import check_learning_test
17 record = check_learning_test(args.target)
18 if record is None:
19 print(f"Error: no record found for {args.target!r}", file=sys.stderr)
20 return 1
21 print_json(record.to_dict())
22 return 0
25def cmd_list(_args: argparse.Namespace) -> int:
26 from little_loops.cli.output import print_json
27 from little_loops.learning_tests import list_records
29 records = list_records()
30 print_json([r.to_dict() for r in records])
31 return 0
34def cmd_mark_stale(args: argparse.Namespace) -> int:
35 from little_loops.issue_parser import slugify
36 from little_loops.learning_tests import check_learning_test, mark_stale
38 record = check_learning_test(args.target)
39 if record is None:
40 print(f"Error: no record found for {args.target!r}", file=sys.stderr)
41 return 1
42 mark_stale(slugify(args.target))
43 return 0
46def main_learning_tests() -> int:
47 """CLI handler for ll-learning-tests subcommands."""
48 with cli_event_context(DEFAULT_DB_PATH, "ll-learning-tests", sys.argv[1:]):
49 parser = argparse.ArgumentParser(
50 prog="ll-learning-tests",
51 description="Query and manage the little-loops learning test registry",
52 formatter_class=argparse.RawDescriptionHelpFormatter,
53 epilog="""
54Examples:
55 ll-learning-tests check "Anthropic SDK streaming"
56 ll-learning-tests list
57 ll-learning-tests mark-stale "Anthropic SDK streaming"
58""",
59 )
61 subparsers = parser.add_subparsers(dest="command", metavar="COMMAND")
62 subparsers.required = True
64 check_parser = subparsers.add_parser(
65 "check",
66 help="Print a record as JSON; exit 1 if not found",
67 description="Look up a learning test record by target name and print as JSON",
68 )
69 check_parser.add_argument("target", help="Target name (e.g. 'Anthropic SDK streaming')")
71 subparsers.add_parser(
72 "list",
73 help="Print all records as a JSON array",
74 description="List all learning test records in the registry",
75 )
77 stale_parser = subparsers.add_parser(
78 "mark-stale",
79 help="Mark a record as stale; exit 1 if not found",
80 description="Set status=stale on a learning test record",
81 )
82 stale_parser.add_argument("target", help="Target name (e.g. 'Anthropic SDK streaming')")
84 parsed = parser.parse_args()
86 if parsed.command == "check":
87 return cmd_check(parsed)
88 elif parsed.command == "list":
89 return cmd_list(parsed)
90 elif parsed.command == "mark-stale":
91 return cmd_mark_stale(parsed)
92 else:
93 parser.print_help()
94 return 1