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

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

2 

3from __future__ import annotations 

4 

5import argparse 

6import sys 

7 

8__all__ = ["main_learning_tests"] 

9 

10 

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 

14 

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 

21 

22 

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 

26 

27 records = list_records() 

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

29 return 0 

30 

31 

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 

35 

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 

42 

43 

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 ) 

57 

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

59 subparsers.required = True 

60 

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

67 

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 ) 

73 

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

80 

81 parsed = parser.parse_args() 

82 

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