Skip to content

Commit 1b89da3

Browse files
authored
Merge pull request #166 from ghinks/codex/change-cli-arguments-from-underscores-to-dashes
Normalize CLI metric flags to use hyphenated metric names
2 parents eca85dd + 9912656 commit 1b89da3

File tree

3 files changed

+58
-7
lines changed

3 files changed

+58
-7
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ review-tally -o expressjs --languages javascript --plot-sprint
111111

112112
### Plotting with custom chart type and metrics:
113113
```shell
114-
review-tally -o expressjs --languages javascript --plot-sprint --chart-type line --chart-metrics total_reviews,unique_reviewers
114+
review-tally -o expressjs --languages javascript --plot-sprint --chart-type line --chart-metrics total-reviews,unique-reviewers
115115
```
116116

117117
### Saving the plot to a file:
@@ -179,7 +179,7 @@ review-tally -o expressjs --languages javascript --plot-individual --save-plot r
179179
* --output-path specifies the output file for sprint analysis
180180
* --plot-sprint Generate interactive charts showing sprint metrics (opens in browser)
181181
* --chart-type Chart type for sprint metrics (bar or line). Default: bar
182-
* --chart-metrics Comma-separated sprint metrics to plot. Default: total_reviews,total_comments. Available: total_reviews,total_comments,unique_reviewers,avg_comments_per_review,reviews_per_reviewer,avg_response_time_hours,avg_completion_time_hours,active_review_days
182+
* --chart-metrics Comma-separated sprint metrics to plot. Default: total_reviews,total_comments. Available: total-reviews,total-comments,unique-reviewers,avg-comments-per-review,reviews-per-reviewer,avg-response-time-hours,avg-completion-time-hours,active-review-days
183183
* --save-plot Optional path to save the interactive HTML chart
184184
* --plot-individual Generate pie charts showing individual reviewer metric distribution (opens in browser)
185185
* --individual-chart-metric Metric to visualize in individual pie chart. Default: reviews. Available: reviews,comments,engagement_level,thoroughness_score,avg_response_time_hours,avg_completion_time_hours,active_review_days

reviewtally/cli/parse_cmd_line.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,16 @@ class CommandLineArgs(TypedDict):
5959
}
6060

6161

62+
def _normalize_metric_identifier(value: str) -> str:
63+
"""Convert CLI-provided metric identifiers to internal snake_case."""
64+
return value.replace("-", "_")
65+
66+
67+
def _format_cli_metric_identifier(value: str) -> str:
68+
"""Expose internal metric identifiers as CLI-friendly names."""
69+
return value.replace("_", "-")
70+
71+
6272
def print_toml_version() -> None:
6373
version = importlib.metadata.version("review-tally")
6474
print(f"Current version is {version}") # noqa: T201
@@ -253,10 +263,10 @@ def parse_cmd_line() -> CommandLineArgs: # noqa: C901, PLR0912, PLR0915
253263
"--chart-metrics",
254264
help=(
255265
"Comma-separated sprint metrics to plot. "
256-
"Supported: total_reviews,total_comments,unique_reviewers,"
257-
"avg_comments_per_review,reviews_per_reviewer,"
258-
"avg_response_time_hours,avg_completion_time_hours,"
259-
"active_review_days"
266+
"Supported: total-reviews,total-comments,unique-reviewers,"
267+
"avg-comments-per-review,reviews-per-reviewer,"
268+
"avg-response-time-hours,avg-completion-time-hours,"
269+
"active-review-days"
260270
),
261271
)
262272
parser.add_argument(
@@ -274,7 +284,10 @@ def parse_cmd_line() -> CommandLineArgs: # noqa: C901, PLR0912, PLR0915
274284
)
275285
parser.add_argument(
276286
"--individual-chart-metric",
277-
choices=sorted(ALLOWED_INDIVIDUAL_METRICS),
287+
choices=sorted(
288+
_format_cli_metric_identifier(metric)
289+
for metric in ALLOWED_INDIVIDUAL_METRICS
290+
),
278291
help="Metric to visualize in individual pie chart",
279292
)
280293

@@ -370,6 +383,9 @@ def parse_cmd_line() -> CommandLineArgs: # noqa: C901, PLR0912, PLR0915
370383
if chart_metrics_input is not None
371384
else []
372385
)
386+
chart_metrics = [
387+
_normalize_metric_identifier(metric) for metric in chart_metrics
388+
]
373389
if not chart_metrics:
374390
chart_metrics = list(DEFAULT_CHART_METRICS)
375391

@@ -388,6 +404,10 @@ def parse_cmd_line() -> CommandLineArgs: # noqa: C901, PLR0912, PLR0915
388404
if args.individual_chart_metric is not None
389405
else _get_optional_str(config, "individual-chart-metric")
390406
)
407+
if individual_chart_metric_input is not None:
408+
individual_chart_metric_input = _normalize_metric_identifier(
409+
individual_chart_metric_input,
410+
)
391411
individual_metric_specified = individual_chart_metric_input is not None
392412
if (
393413
individual_chart_metric_input is not None

tests/cli/test_parse_cmd_line.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,37 @@ def test_missing_org_or_repositories_exits(
414414
str(mock_print.call_args[0][0]),
415415
)
416416

417+
@patch("sys.exit")
418+
@patch("sys.argv")
419+
def test_hyphenated_metric_arguments_normalized(
420+
self,
421+
mock_argv: Any,
422+
mock_exit: Any,
423+
) -> None:
424+
"""Hyphenated metric values from CLI are normalized to snake_case."""
425+
mock_argv.__getitem__.side_effect = lambda x: [
426+
"review-tally",
427+
"--org",
428+
"test-org",
429+
"--chart-metrics",
430+
"total-reviews,avg-response-time-hours",
431+
"--individual-chart-metric",
432+
"thoroughness-score",
433+
][x]
434+
mock_argv.__len__.return_value = 7
435+
436+
result = parse_cmd_line()
437+
438+
mock_exit.assert_not_called()
439+
self.assertEqual(
440+
result["chart_metrics"],
441+
["total_reviews", "avg_response_time_hours"],
442+
)
443+
self.assertEqual(
444+
result["individual_chart_metric"],
445+
"thoroughness_score",
446+
)
447+
417448

418449
class TestParseCmdLineConfiguration(ParseCmdLineTestCase):
419450
"""Tests for TOML configuration support."""

0 commit comments

Comments
 (0)