Coverage for little_loops / cli / issues / count_cmd.py: 0%
23 statements
« prev ^ index » next coverage.py v7.12.0, created at 2026-03-18 16:18 -0500
« prev ^ index » next coverage.py v7.12.0, created at 2026-03-18 16:18 -0500
1"""ll-issues count: Count active issues with optional type/priority filters."""
3from __future__ import annotations
5import argparse
6from typing import TYPE_CHECKING
8from little_loops.cli.output import print_json
10if TYPE_CHECKING:
11 from little_loops.config import BRConfig
14def cmd_count(config: BRConfig, args: argparse.Namespace) -> int:
15 """Print active issue counts.
17 Args:
18 config: Project configuration
19 args: Parsed arguments with optional .type, .priority, and .json attributes
21 Returns:
22 Exit code (0 = success)
23 """
24 from little_loops.issue_parser import find_issues
26 type_prefixes = {args.type} if getattr(args, "type", None) else None
27 issues = find_issues(config, type_prefixes=type_prefixes)
29 if getattr(args, "priority", None):
30 issues = [i for i in issues if i.priority == args.priority]
32 if getattr(args, "json", False):
33 by_type: dict[str, int] = {"BUG": 0, "FEAT": 0, "ENH": 0}
34 by_priority: dict[str, int] = {
35 "P0": 0,
36 "P1": 0,
37 "P2": 0,
38 "P3": 0,
39 "P4": 0,
40 "P5": 0,
41 }
42 for issue in issues:
43 prefix = issue.issue_id.split("-", 1)[0]
44 if prefix in by_type:
45 by_type[prefix] += 1
46 if issue.priority in by_priority:
47 by_priority[issue.priority] += 1
49 print_json({"total": len(issues), "by_type": by_type, "by_priority": by_priority})
50 return 0
52 print(len(issues))
53 return 0