lib/retrospective.rb (116 lines of code) (raw):

Encoding.default_external = 'UTF-8' require './lib/description_template' require './lib/gitlab_api' require './lib/team' class Retrospective LOG_SEPARATOR = '-' * 70 def initialize(read_client: , write_client:) @read_client = read_client @write_client = write_client end def create_issue(team:, release:, dry_run:) issue_url = nil template = DescriptionTemplate.new(team, release, api_client: read_client) result = template.result_with_hash(updating_description: false) log_info('Issue', result, dry_run: dry_run) unless dry_run created_issue = write_client.post( "projects/gl-retrospectives%2F#{team.project}/issues", body: { title: "#{release['title']} #{team.name} retrospective", description: result, confidential: team.confidential? } ) issue_url = created_issue['_links']['self'] puts "Created with URL #{created_issue['web_url']}" puts '' end mention_team(template.current_api_path, team: team, dry_run: dry_run) if team.mention_team_on_creation create_discussions(issue_url, team: team, dry_run: dry_run) end def update_issue(team:, release:, dry_run:) template = DescriptionTemplate.new(team, release, api_client: read_client) result = template.result_with_hash(updating_description: true, query_all_groups: team.query_all_groups?) log_info("Issue #{template.current_issue_url}", result, verb: 'update', dry_run: dry_run) unless dry_run write_client.put(template.current_api_path, body: { description: result }) puts "Updated issue #{template.current_issue_url}" puts '' end mention_team(template.current_api_path, team: team, dry_run: dry_run) if team.mention_team if team.create_individual_discussions create_individual_discussions(template.current_api_path, team: team, dry_run: dry_run) end end private attr_reader :read_token, :write_token, :write_client, :read_client def create_discussions(issue_url, team:, dry_run:) questions = team.discussions.to_a if team.create_discussions questions.unshift( '👍 What went well this release?', '👎 What didn\'t go well this release?', '📈 What can we improve going forward?', '🌟 What praise do you have for the group?' ) end return if questions.empty? questions.each do |question| comment = "## #{question}" log_info('Discussion', comment, dry_run: dry_run) unless dry_run write_client.post("#{issue_url}/discussions", body: { body: comment }) end end puts 'Created discussions' puts '' end def mention_team(issue_url, team:, dry_run:) comment = Team::TEAM_MEMBER_FIELDS.map do |people| next if team[people].nil? || team[people].empty? [ '*', *team[people].map { |person| "@#{person}" }, "(#{people})" ].join(' ') end.compact.join("\n") log_info('Mention comment', comment, dry_run: dry_run) unless dry_run return if team_mention_comment_created?(issue_url: issue_url, comment_body: comment) write_client.post("#{issue_url}/notes", body: { body: comment }) puts 'Created comment' puts '' end end def team_mention_comment_created?(issue_url:, comment_body:) comments = read_client.get("#{issue_url}/notes") comments.any? { |comment| comment['body'] == comment_body } end def create_individual_discussions(issue_url, team:, dry_run:) questions = Team::TEAM_MEMBER_FIELDS.map do |people| next if team[people].nil? || team[people].empty? team[people].map do |person| "@#{person} what went well this release? What didn't go well? What can we improve?" end end.flatten.compact questions.each do |question| log_info('Discussion', question, dry_run: dry_run) write_client.post("#{issue_url}/discussions", body: { body: question }) unless dry_run end puts 'Created individual discussions' puts '' end def log_info(header, message, dry_run:, verb: 'create') puts LOG_SEPARATOR puts "#{header} to #{verb}#{' (--dry-run enabled)' if dry_run}" puts LOG_SEPARATOR puts message puts LOG_SEPARATOR puts '' end def inspect "#<#{self.class.name}:#{object_id}>" end end