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