From 5fbb93b2f19d8d4d96b4e73c7357ad993c08e5a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baz=C3=A1n?= Date: Fri, 10 Dec 2021 12:58:55 +0100 Subject: [PATCH] add ListTeamMembers responder --- app/lib/responder.rb | 2 +- app/responders/list_team_members_responder.rb | 27 +++++++++ app/responses/list_team_members.erb | 8 +++ config/settings-production.yml | 8 +-- docs/available_responders.md | 1 + docs/images/responders/list_team_members.png | Bin 0 -> 36200 bytes docs/responders/list_team_members.md | 48 +++++++++++++++ .../list_team_members_responder_spec.rb | 57 ++++++++++++++++++ spec/support/responder_params.rb | 3 +- 9 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 app/responders/list_team_members_responder.rb create mode 100644 app/responses/list_team_members.erb create mode 100644 docs/images/responders/list_team_members.png create mode 100644 docs/responders/list_team_members.md create mode 100644 spec/responders/list_team_members_responder_spec.rb diff --git a/app/lib/responder.rb b/app/lib/responder.rb index 85f0d59c..47340b83 100644 --- a/app/lib/responder.rb +++ b/app/lib/responder.rb @@ -143,7 +143,7 @@ def required_params(*param_names) if empty_param?(param_name) raise "Configuration Error in #{self.class.name}: No value for #{param_name}." else - self.class.define_method(param_name.to_s) { params[param_name].strip } + self.class.define_method(param_name.to_s) { params[param_name] } end end end diff --git a/app/responders/list_team_members_responder.rb b/app/responders/list_team_members_responder.rb new file mode 100644 index 00000000..7a0c2669 --- /dev/null +++ b/app/responders/list_team_members_responder.rb @@ -0,0 +1,27 @@ +require_relative '../lib/responder' + +class ListTeamMembersResponder < Responder + + keyname :list_team_members + + def define_listening + required_params :command, :team_id + + @event_action = "issue_comment.created" + @event_regex = /\A@#{bot_name} #{command}\.?\s*\z/i + end + + def process_message(message) + team_members = team_members(params[:team_id]) + heading = params[:heading].to_s + respond_template :list_team_members, { heading: heading, team_members: team_members } + end + + def description + params[:description] || "Replies to '#{command}'" + end + + def example_invocation + "@#{bot_name} #{command}" + end +end diff --git a/app/responses/list_team_members.erb b/app/responses/list_team_members.erb new file mode 100644 index 00000000..30721eaf --- /dev/null +++ b/app/responses/list_team_members.erb @@ -0,0 +1,8 @@ +<%= heading %> + +``` +<% team_members.each do |team_member| -%> +@<%= team_member %> +<% end -%> +<%= "The list is empty" if team_members.empty? -%> +``` diff --git a/config/settings-production.yml b/config/settings-production.yml index e4626f8a..09ef7efb 100644 --- a/config/settings-production.yml +++ b/config/settings-production.yml @@ -19,10 +19,6 @@ buffy: - "Our CoC: https://github.com/openjournals/joss/blob/master/CODE_OF_CONDUCT.md" - "It's adapted from the Contributor Covenant: http://contributor-covenant.org" - "Reports of abusive or harassing behavior may be reported to reports@theoj.org" - - editor_list: - command: list editors - description: List all current topic editors - template_file: editors.md assign_reviewer_n: only: editors if: @@ -45,6 +41,10 @@ buffy: only: editors add_remove_assignee: only: editors + list_team_members: + command: list editors + team_id: 3824115 + heading: Current journal editors check_references: repo_checks: set_value: diff --git a/docs/available_responders.md b/docs/available_responders.md index 4df98421..e242ad72 100644 --- a/docs/available_responders.md +++ b/docs/available_responders.md @@ -22,6 +22,7 @@ Buffy includes a list of Responders that can be used by configuring them in the responders/invite responders/set_value responders/list_of_values + responders/list_team_members responders/add_remove_assignee responders/reviewer_checklist_comment responders/add_remove_checklist diff --git a/docs/images/responders/list_team_members.png b/docs/images/responders/list_team_members.png new file mode 100644 index 0000000000000000000000000000000000000000..b49e38569d370593ccef80dda2a2fbe109ceed1f GIT binary patch literal 36200 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 NdoelDLXnT3{|}CrQC9!} literal 0 HcmV?d00001 diff --git a/docs/responders/list_team_members.md b/docs/responders/list_team_members.md new file mode 100644 index 00000000..25a2b8ff --- /dev/null +++ b/docs/responders/list_team_members.md @@ -0,0 +1,48 @@ +List team members +================= + +This responder replies with a list of members from a GitHub team + +## Listens to + +``` +@botname +``` + +For example, if you configure the command to be _list editors_, it would respond to: +``` +@botname list editors +``` + +## Settings key + +`list_team_members` + +## Params +```eval_rst +:command: The command this responder will listen to. + +:team_id: The id of the GitHub team to be listed. + +:heading: *Optional* Heading for the replied list. + +:description: *Optional* String to show when the help command is invoked. +``` + +## Examples + +**List editors team members with custom heading** +```yaml +... + responders: + list_team_members: + command: list editors + team_id: 3824115 + heading: Current journal editors +... +``` + + +## In action + +![](../images/responders/list_team_members.png "List team members responder in action") diff --git a/spec/responders/list_team_members_responder_spec.rb b/spec/responders/list_team_members_responder_spec.rb new file mode 100644 index 00000000..d72c17ce --- /dev/null +++ b/spec/responders/list_team_members_responder_spec.rb @@ -0,0 +1,57 @@ +require_relative "../spec_helper.rb" + +describe ListTeamMembersResponder do + + subject do + described_class + end + + describe "listening" do + before { @responder = subject.new({env: { bot_github_user: "botsci" }}, { command: "list editors", team_id: 12345 }) } + + it "should listen to new comments" do + expect(@responder.event_action).to eq("issue_comment.created") + end + + it "should define regex" do + expect(@responder.event_regex).to match("@botsci list editors") + expect(@responder.event_regex).to match("@botsci list editors.") + expect(@responder.event_regex).to match("@botsci list editors \r\n") + expect(@responder.event_regex).to_not match("```@botsci list editors") + expect(@responder.event_regex).to_not match("@botsci list editors \r\n more") + end + end + + describe "#process_message" do + before do + @responder = subject.new({env: {bot_github_user: "botsci"}}, { command: "list editors", team_id: 12345 }) + @team_members = ["user1", "user2"] + disable_github_calls_for(@responder) + end + + it "should respond with a erb template to github" do + team_members = ["user1", "user2"] + expect(@responder).to receive(:team_members).once.with(12345).and_return(@team_members) + + expected_locals = { heading: "", team_members: @team_members } + expect(@responder).to receive(:respond_template).once.with(:list_team_members, expected_locals) + @responder.process_message("@botsci list editors") + end + + it "should allow to customize heading" do + @responder.params[:heading] = "Current editors" + expect(@responder).to receive(:team_members).once.with(12345).and_return(@team_members) + + expected_locals = { heading: "Current editors", team_members: @team_members } + expect(@responder).to receive(:respond_template).once.with(:list_team_members, expected_locals) + @responder.process_message("@botsci list editors") + end + + it "should allow to customize description" do + expect(@responder.description).to eq("Replies to 'list editors'") + + @responder.params[:description] = "List current editors" + expect(@responder.description).to eq("List current editors") + end + end +end diff --git a/spec/support/responder_params.rb b/spec/support/responder_params.rb index 91a189f8..58ac9f0a 100644 --- a/spec/support/responder_params.rb +++ b/spec/support/responder_params.rb @@ -11,7 +11,8 @@ def sample_params(responder_class) AddAndRemoveUserChecklistResponder => { template_file: "checklist.md" }, ReviewerChecklistCommentResponder => { template_file: "checklist.md" }, GithubActionResponder => { workflow_repo: "openjournals/joss-reviews", workflow_name: "compiler", command: "generate pdf" }, - InitialValuesResponder => { values: ["version", "target-repository"]} + InitialValuesResponder => { values: ["version", "target-repository"]}, + ListTeamMembersResponder => { command: "list editors", team_id: 3824115 }, } params_by_responder[responder_class] || {}