Skip to content

Commit dae2a97

Browse files
committed
Use different reviewer checklist for pre-2026 issues
The pre2026 checklist template file will be used if the review issue is labeled as 'pre-2026-submission'
1 parent 12a07b4 commit dae2a97

File tree

3 files changed

+212
-2
lines changed

3 files changed

+212
-2
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
require_relative '../../lib/responder'
2+
3+
module Openjournals
4+
class ReviewerChecklistsResponder < Responder
5+
6+
keyname :openjournals_reviewer_checklists
7+
8+
def define_listening
9+
@event_action = "issue_comment.created"
10+
@event_regex = /\A@#{bot_name} #{command}\.?\s*$/i
11+
end
12+
13+
def process_message(message)
14+
if sender_in_reviewers_list?
15+
checklist = render_external_template(template_filename, locals)
16+
update_comment(context.comment_id, checklist)
17+
update_checklists_links
18+
else
19+
respond("@#{context.sender} I can't do that because you are not a reviewer")
20+
end
21+
end
22+
23+
def template_filename
24+
context.issue_labels.map{|il| il["name"]}.include?("pre-2026-submission") ? "reviewer_checklist_pre2026.md" : "reviewer_checklist.md"
25+
end
26+
27+
def sender_in_reviewers_list?
28+
reviewers.include?("@#{context.sender.downcase}")
29+
end
30+
31+
def update_checklists_links
32+
if issue_body_has?("checklist-comments")
33+
mapping = checklists_mapping.merge({"#{context.sender}" => "📝 [Checklist for @#{context.sender}](#{comment_url})"})
34+
35+
checklists = mapping.keys.map do |k|
36+
"<!--checklist-for-#{k}-->\n#{mapping[k]}\n<!--end-checklist-for-#{k}-->"
37+
end
38+
39+
update_value("checklist-comments", "\n"+checklists.join("\n")+"\n")
40+
end
41+
end
42+
43+
def reviewers
44+
@reviewers ||= read_value_from_body("reviewers-list").split(",").map(&:strip).map(&:downcase)
45+
end
46+
47+
def checklists_mapping
48+
mapping = {}
49+
reviewers.each do |rev|
50+
rev_login = rev.gsub("@", "")
51+
checklink_link = read_value_from_body("checklist-for-#{rev_login}")
52+
mapping[rev_login] = checklink_link unless checklink_link.empty?
53+
end
54+
mapping
55+
end
56+
57+
def command
58+
params[:command] || "generate my checklist"
59+
end
60+
61+
def default_description
62+
"Adds a checklist for the reviewer using this command"
63+
end
64+
65+
def default_example_invocation
66+
"@#{bot_name} #{command}"
67+
end
68+
end
69+
end

config/settings-production.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,10 @@ buffy:
5252
only: editors
5353
authorized_roles_in_issue:
5454
- reviewers-list
55-
reviewer_checklist_comment:
55+
openjournals_reviewer_checklists:
5656
if:
5757
title: "^\\[REVIEW\\]:"
5858
reject_msg: Checklists can only be created once the review has started in the review issue
59-
template_file: reviewer_checklist.md
6059
data_from_issue:
6160
- target-repository
6261
- author-handle
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
require_relative "../../spec_helper.rb"
2+
3+
describe Openjournals::ReviewerChecklistsResponder do
4+
5+
subject do
6+
described_class
7+
end
8+
9+
before do
10+
settings = { env: {bot_github_user: "editorialbot"} }
11+
@responder = subject.new(settings, {})
12+
end
13+
14+
describe "listening" do
15+
it "should listen to new comments" do
16+
expect(@responder.event_action).to eq("issue_comment.created")
17+
end
18+
19+
it "should define regex" do
20+
expect(@responder.event_regex).to match("@editorialbot generate my checklist")
21+
expect(@responder.event_regex).to match("@editorialbot generate my checklist.")
22+
expect(@responder.event_regex).to match("@editorialbot generate my checklist \r\n")
23+
expect(@responder.event_regex).to match("@editorialbot generate my checklist \r\nmore")
24+
expect(@responder.event_regex).to_not match("@editorialbot generate my checklist for @arfon.")
25+
expect(@responder.event_regex).to_not match("@editorialbot generate my checkl")
26+
end
27+
end
28+
29+
describe "#process_message" do
30+
before do
31+
@responder.context = OpenStruct.new(issue_id: 5,
32+
issue_author: "opener",
33+
issue_title: "New paper",
34+
issue_labels: [{"name" => "test"}],
35+
repo: "openjournals/buffy",
36+
comment_id: 111222,
37+
issue_body: "Test Submission\n\n ... description ... \n\n" +
38+
"<!--author-handle-->@submitter<!--end-author-handle-->\n" +
39+
"<!--reviewers-list-->@reviewer1, @reviewer2<!--end-reviewers-list-->")
40+
@msg = "@editorialbot generate my checklist"
41+
disable_github_calls_for(@responder)
42+
end
43+
44+
context "generate checklist command" do
45+
it "should add user checklist for reviewer" do
46+
@responder.context[:sender] = "reviewer1"
47+
48+
expected_locals = { issue_id: 5, issue_author: "opener", bot_name: "editorialbot", issue_title: "New paper", repo: "openjournals/buffy", sender: "reviewer1" }
49+
expected_checklist = "Checklist for @reviewer1 \n[] A"
50+
51+
expect(@responder).to receive(:render_external_template).with("reviewer_checklist.md", expected_locals).and_return(expected_checklist)
52+
expect(@responder).to receive(:update_comment).with(111222, expected_checklist)
53+
expect(@responder).to_not receive(:respond)
54+
@responder.process_message(@msg)
55+
end
56+
57+
it "should use pre-2026 checklist if issue is labeled" do
58+
@responder.context[:sender] = "reviewer1"
59+
@responder.context.issue_labels << {"name" => "pre-2026-submission"}
60+
61+
expected_locals = { issue_id: 5, issue_author: "opener", bot_name: "editorialbot", issue_title: "New paper", repo: "openjournals/buffy", sender: "reviewer1" }
62+
expected_checklist = "Checklist for @reviewer1 \n[] A"
63+
64+
expect(@responder).to receive(:render_external_template).with("reviewer_checklist_pre2026.md", expected_locals).and_return(expected_checklist)
65+
expect(@responder).to receive(:update_comment).with(111222, expected_checklist)
66+
expect(@responder).to_not receive(:respond)
67+
@responder.process_message(@msg)
68+
end
69+
70+
71+
it "should be case insensitive for the reviewer's username" do
72+
@responder.context[:sender] = "ReVIEwer1"
73+
74+
expected_locals = { issue_id: 5, issue_author: "opener", issue_title: "New paper", bot_name: "editorialbot", repo: "openjournals/buffy", sender: "ReVIEwer1" }
75+
expected_checklist = "Checklist for @ReVIEwer1 \n[] A"
76+
77+
expect(@responder).to receive(:render_external_template).with("reviewer_checklist.md", expected_locals).and_return(expected_checklist)
78+
expect(@responder).to receive(:update_comment).with(111222, expected_checklist)
79+
expect(@responder).to_not receive(:respond)
80+
@responder.process_message(@msg)
81+
end
82+
83+
it "should not add user checklist if sender is not a reviewer" do
84+
@responder.context[:sender] = "nonreviewer"
85+
86+
expect(@responder).to receive(:respond).with("@nonreviewer I can't do that because you are not a reviewer")
87+
@responder.process_message(@msg)
88+
end
89+
end
90+
91+
context "checklist links" do
92+
before do
93+
@responder.context[:sender] = "reviewer1"
94+
95+
expected_locals = { issue_id: 5, issue_author: "opener", issue_title: "New paper", bot_name: "editorialbot", repo: "openjournals/buffy", sender: "reviewer1" }
96+
expected_checklist = "Checklist for @reviewer1 \n[] A"
97+
98+
expect(@responder).to receive(:render_external_template).with("reviewer_checklist.md", expected_locals).and_return(expected_checklist)
99+
expect(@responder).to receive(:update_comment).with(111222, expected_checklist)
100+
101+
102+
@link1 = "<!--checklist-for-reviewer1-->\n📝 [Checklist for @reviewer1](https://github.com/openjournals/buffy/issues/5#issuecomment-111222)\n<!--end-checklist-for-reviewer1-->"
103+
@link2 = "<!--checklist-for-reviewer2-->\n📝 [Checklist for @reviewer2](https://github.com/openjournals/buffy/issues/5#issuecomment-222222)\n<!--end-checklist-for-reviewer2-->"
104+
end
105+
106+
it "should not add link to checklist if no checklist-comments mark" do
107+
expect(@responder).to_not receive(:update_value)
108+
@responder.process_message(@msg)
109+
end
110+
111+
it "should add link to the issue's text" do
112+
@responder.context[:issue_body] += "<!--checklist-comments--><!--end-checklist-comments-->"
113+
114+
expect(@responder).to receive(:update_value).with("checklist-comments", "\n#{@link1}\n")
115+
@responder.process_message(@msg)
116+
end
117+
118+
it "should add link to existing checklist" do
119+
@responder.context[:issue_body] += "<!--checklist-comments-->#{@link2}<!--end-checklist-comments-->"
120+
121+
expect(@responder).to receive(:update_value).with("checklist-comments", "\n#{@link2}\n#{@link1}\n")
122+
@responder.process_message(@msg)
123+
end
124+
125+
it "should update links to checklist in the issue's text" do
126+
previous_link = "<!--checklist-for-reviewer1-->Whatever<!--end-checklist-for-reviewer1-->"
127+
@responder.context[:issue_body] += "<!--checklist-comments--><!--end-checklist-comments-->"
128+
129+
expect(@responder).to receive(:update_value).with("checklist-comments", "\n#{@link1}\n")
130+
@responder.process_message(@msg)
131+
end
132+
end
133+
end
134+
135+
it "command is customizable" do
136+
responder = subject.new({env: {bot_github_user: "editorialbot"}}, {command: "create check-list"})
137+
138+
expect(responder.event_regex).to match("@editorialbot create check-list")
139+
expect(responder.event_regex).to_not match("@editorialbot generate my checklist")
140+
end
141+
142+
end

0 commit comments

Comments
 (0)