Skip to content

Commit f9f9069

Browse files
authored
Merge pull request #480 from jakeatoms/479/use-output-file-in-issue-metrics-script
2 parents ff30620 + 4f1f388 commit f9f9069

File tree

3 files changed

+68
-14
lines changed

3 files changed

+68
-14
lines changed

Diff for: issue_metrics.py

+20-11
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"""
1717

1818
import shutil
19+
from pathlib import Path
1920
from typing import List, Union
2021

2122
import github3
@@ -166,6 +167,24 @@ def get_per_issue_metrics(
166167
return issues_with_metrics, num_issues_open, num_issues_closed
167168

168169

170+
def evaluate_markdown_file_size(output_file: str) -> None:
171+
"""
172+
Evaluate the size of the markdown file and split it, if it is too large.
173+
"""
174+
file_name_without_extension = Path(output_file).stem
175+
max_char_count = 65535
176+
if markdown_too_large_for_issue_body(output_file, max_char_count):
177+
split_markdown_file(output_file, max_char_count)
178+
shutil.move(output_file, f"{file_name_without_extension}_full.md")
179+
shutil.move(f"{file_name_without_extension}_0.md", output_file)
180+
print(
181+
f"Issue metrics markdown file is too large for GitHub issue body and has been \
182+
split into multiple files. ie. {output_file}, {file_name_without_extension}_1.md, etc. \
183+
The full file is saved as {file_name_without_extension}_full.md\n\
184+
See https://github.com/github/issue-metrics/blob/main/docs/dealing-with-large-issue-metrics.md"
185+
)
186+
187+
169188
def main(): # pragma: no cover
170189
"""Run the issue-metrics script.
171190
@@ -350,17 +369,7 @@ def main(): # pragma: no cover
350369
output_file=output_file,
351370
)
352371

353-
max_char_count = 65535
354-
if markdown_too_large_for_issue_body("issue_metrics.md", max_char_count):
355-
split_markdown_file("issue_metrics.md", max_char_count)
356-
shutil.move("issue_metrics.md", "issue_metrics_full.md")
357-
shutil.move("issue_metrics_0.md", "issue_metrics.md")
358-
print(
359-
"Issue metrics markdown file is too large for GitHub issue body and has been \
360-
split into multiple files. ie. issue_metrics.md, issue_metrics_1.md, etc. \
361-
The full file is saved as issue_metrics_full.md\n\
362-
See https://github.com/github/issue-metrics/blob/main/docs/dealing-with-large-issue-metrics.md"
363-
)
372+
evaluate_markdown_file_size(output_file)
364373

365374

366375
if __name__ == "__main__":

Diff for: markdown_writer.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ def write_to_markdown(
225225
if search_query:
226226
file.write(f"Search query used to find these items: `{search_query}`\n")
227227

228-
print("Wrote issue metrics to issue_metrics.md")
228+
print(f"Wrote issue metrics to {output_file_name}")
229229

230230

231231
def write_overall_metrics_tables(

Diff for: test_issue_metrics.py

+47-2
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@
88
TestSearchIssues: A class to test the search_issues function.
99
TestGetPerIssueMetrics: A class to test the get_per_issue_metrics function.
1010
TestGetEnvVars: A class to test the get_env_vars function.
11-
11+
TestEvaluateMarkdownFileSize: A class to test the evaluate_markdown_file_size function.
1212
"""
1313

1414
import os
1515
import unittest
1616
from datetime import datetime, timedelta
17-
from unittest.mock import MagicMock, patch
17+
from unittest.mock import MagicMock, call, patch
1818

1919
from issue_metrics import (
2020
IssueWithMetrics,
21+
evaluate_markdown_file_size,
2122
get_env_vars,
2223
get_per_issue_metrics,
2324
measure_time_to_close,
@@ -478,5 +479,49 @@ def test_get_per_issue_metrics_with_discussion_with_hide_envs(self):
478479
self.assertEqual(metrics[0][1].time_to_first_response, None)
479480

480481

482+
class TestEvaluateMarkdownFileSize(unittest.TestCase):
483+
"""Test suite for the evaluate_markdown_file_size function."""
484+
485+
@patch("issue_metrics.markdown_too_large_for_issue_body")
486+
def test_markdown_too_large_for_issue_body_called_with_output_file(
487+
self, mock_evaluate
488+
):
489+
"""
490+
Test that the function uses the output_file.
491+
"""
492+
mock_evaluate.return_value = False
493+
evaluate_markdown_file_size("test_issue_metrics.md")
494+
495+
mock_evaluate.assert_called_with("test_issue_metrics.md", 65535)
496+
497+
@patch("issue_metrics.print")
498+
@patch("shutil.move")
499+
@patch("issue_metrics.split_markdown_file")
500+
@patch("issue_metrics.markdown_too_large_for_issue_body")
501+
def test_split_markdown_file_when_file_size_too_large(
502+
self, mock_evaluate, mock_split, mock_move, mock_print
503+
):
504+
"""
505+
Test that the function is called with the output_file
506+
environment variable.
507+
"""
508+
mock_evaluate.return_value = True
509+
evaluate_markdown_file_size("test_issue_metrics.md")
510+
511+
mock_split.assert_called_with("test_issue_metrics.md", 65535)
512+
mock_move.assert_has_calls(
513+
[
514+
call("test_issue_metrics.md", "test_issue_metrics_full.md"),
515+
call("test_issue_metrics_0.md", "test_issue_metrics.md"),
516+
]
517+
)
518+
mock_print.assert_called_with(
519+
"Issue metrics markdown file is too large for GitHub issue body and has been \
520+
split into multiple files. ie. test_issue_metrics.md, test_issue_metrics_1.md, etc. \
521+
The full file is saved as test_issue_metrics_full.md\n\
522+
See https://github.com/github/issue-metrics/blob/main/docs/dealing-with-large-issue-metrics.md"
523+
)
524+
525+
481526
if __name__ == "__main__":
482527
unittest.main()

0 commit comments

Comments
 (0)