Coverage for little_loops / cli / issues / count_cmd.py: 100%
31 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-issues count: Count issues with optional type/priority/status 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 issue counts with optional status, type, and priority filters.
17 Args:
18 config: Project configuration
19 args: Parsed arguments with optional .type, .priority, .status, and .json attributes
21 Returns:
22 Exit code (0 = success)
23 """
24 from little_loops.cli.issues.search import _load_issues_with_status
26 status = getattr(args, "status", "open") or "open"
27 include_open = status in ("open", "in_progress", "blocked", "all")
28 include_done = status in ("done", "cancelled", "all")
29 include_deferred = status in ("deferred", "all")
31 raw = _load_issues_with_status(config, include_open, include_done, include_deferred)
32 issues = [issue for issue, _stat in raw]
34 from little_loops.cli_args import parse_priorities
36 if getattr(args, "type", None):
37 issues = [i for i in issues if i.issue_id.split("-", 1)[0] == args.type]
39 priority_filter = parse_priorities(getattr(args, "priority", None))
40 if priority_filter is not None:
41 issues = [i for i in issues if i.priority in priority_filter]
43 if getattr(args, "json", False):
44 by_type: dict[str, int] = {"BUG": 0, "FEAT": 0, "ENH": 0, "EPIC": 0}
45 by_priority: dict[str, int] = {
46 "P0": 0,
47 "P1": 0,
48 "P2": 0,
49 "P3": 0,
50 "P4": 0,
51 "P5": 0,
52 }
53 for issue in issues:
54 prefix = issue.issue_id.split("-", 1)[0]
55 if prefix in by_type:
56 by_type[prefix] += 1
57 if issue.priority in by_priority:
58 by_priority[issue.priority] += 1
60 print_json(
61 {"total": len(issues), "status": status, "by_type": by_type, "by_priority": by_priority}
62 )
63 return 0
65 print(len(issues))
66 return 0