Coverage for little_loops / cli / learning_tests.py: 19%

48 statements  

« prev     ^ index     » next       coverage.py v7.12.0, created at 2026-06-04 12:21 -0500

1"""ll-learning-tests: CLI for querying and managing the learning test registry.""" 

2 

3from __future__ import annotations 

4 

5import argparse 

6import sys 

7 

8from little_loops.session_store import DEFAULT_DB_PATH, cli_event_context 

9 

10__all__ = ["main_learning_tests"] 

11 

12 

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 

16 

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 

23 

24 

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 

28 

29 records = list_records() 

30 print_json([r.to_dict() for r in records]) 

31 return 0 

32 

33 

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 

37 

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 

44 

45 

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 ) 

60 

61 subparsers = parser.add_subparsers(dest="command", metavar="COMMAND") 

62 subparsers.required = True 

63 

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

70 

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 ) 

76 

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

83 

84 parsed = parser.parse_args() 

85 

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