lib/description_template.rb (146 lines of code) (raw):

require 'date' require 'erb' require './lib/gitlab_api' class DescriptionTemplate def initialize(team, release, api_client:) @team = team @release = release @api_client = api_client end def issue_query_prefix # https://docs.gitlab.com/ee/api/issues.html if team.query_all_groups? 'issues?scope=all&' else 'groups/gitlab-org/issues?' # The default queries gitlab-org only end end def merge_request_query_prefix # https://docs.gitlab.com/ee/api/merge_requests.html if team.query_all_groups? 'merge_requests?scope=all&' else 'groups/gitlab-org/merge_requests?' # The default queries gitlab-org only end end def template_issue_url_prefix if team.query_all_groups? 'dashboard/issues?scope=all&' # Accounts for other projects (e.g. gitlab-services), scope=all ensures issues created by others are included else 'groups/gitlab-org/-/issues?' # The default queries gitlab-org only end end def result_with_hash(hash) binding_hash = { team: team, release: release['title'], due_date: Date.today.next_month.strftime('%Y-%m-26') } hash[:mention_owners] = self.mention_team_owners if hash[:updating_description] binding_hash.merge!( due_date: Date.today.strftime('%Y-%m-26'), deliverables: deliverables, features: features, bugs: bugs, issues: issues, issue_count: issue_count, total_weight: total_weight, merge_request_count: merge_request_count, slipped: slipped, current_retrospective: current_retrospective, issue_url_prefix: hash[:query_all_groups] === true ? 'dashboard/issues?scope=all&' : 'groups/gitlab-org/-/issues?', vsa_url_prefix: 'groups/gitlab-org/-/analytics/value_stream_analytics?', release_start_date: release.fetch('start_date', nil), release_due_date: release.fetch('due_date', nil), ) if team.additional_label hash[:additional_label] = team.additional_label hash[:issues_with_additional_label] = issues_with_additional_label end end binding_hash.merge!(hash) include_template = lambda do |filename| load_template(filename).result_with_hash(binding_hash) end binding_hash[:include_template] = include_template template.result_with_hash(binding_hash) end def current_issue_url current_retrospective&.fetch('web_url') || 'http://does.not/exist' end def current_api_path "#{project_issues_path}/#{current_retrospective&.fetch('iid') || -1}" end def current_retrospectives_api_path(extra_labels = []) labels = ['retrospective'].concat(extra_labels) "#{project_issues_path}?labels=#{labels.join(',')}&state=opened&search=#{release['title']}" end def deliverables @deliverables ||= api_client.get("#{issue_query_prefix}labels=#{team.label},Deliverable&state=closed&milestone=#{release['title']}") end def features @features ||= api_client.get("#{issue_query_prefix}labels=#{team.label},type::feature&state=closed&milestone=#{release['title']}") end def bugs @bugs ||= api_client.get("#{issue_query_prefix}labels=#{team.label},type::bug&state=closed&milestone=#{release['title']}") end def slipped @slipped ||= api_client.get("#{issue_query_prefix}labels=#{team.label},missed%3A#{release['title']}") end def issues_with_additional_label @issues_with_additional_label ||= api_client.get("#{issue_query_prefix}labels=#{team.label},#{team.additional_label}&state=closed&milestone=#{release['title']}") end def current_retrospective @current_retrospective ||= current_retrospectives.first end def current_retrospectives if current_retrospectives_with_team_label.size > 0 current_retrospectives_with_team_label else current_retrospectives_without_team_label end end def current_retrospectives_with_team_label @current_retrospectives_with_team_label ||= api_client.get(current_retrospectives_api_path([team.label])) end def current_retrospectives_without_team_label @current_retrospectives_without_team_label ||= api_client.get(current_retrospectives_api_path) end def issues @issues ||= api_client.get("#{issue_query_prefix}labels=#{team.label}&state=closed&milestone=#{release['title']}") end def issue_count @issue_count ||= issues.headers['X-Total'].to_i end def total_weight @total_weight ||= begin sum = issues.sum { |i| i['weight'] || 0 } return sum if issues.count == issues.headers['X-Total'].to_i "#{sum}+" end end def merge_request_count @merge_request_count ||= api_client.count("#{merge_request_query_prefix}labels=#{team.label}&state=merged&milestone=#{release['title']}") end def mention_team_owners owners = team.owner owners = [owners] unless owners.is_a?(Array) "@" + owners.join(' @') end def project_issues_path "projects/gl-retrospectives%2F#{team.project}/issues" end private attr_reader :team, :release, :api_client def template @template ||= load_template(team.template) end def load_template(filename) ERB.new(File.read("templates/#{filename}.erb"), trim_mode: '<>') end end