# frozen_string_literal: true require_relative '../../command' require 'tty-table' module Dri module Commands class Fetch class Failures < Dri::Command def initialize(options) @options = options @today_iso_format = Time.now.strftime('%Y-%m-%dT00:00:00Z') end def execute(input: $stdin, output: $stdout) verify_config_exists title = add_color('Title', :bright_yellow) triaged = add_color('Triaged?', :bright_yellow) author = add_color('Author', :bright_yellow) url = add_color('URL', :bright_yellow) failures = [] urgent = [] labels = [ title, triaged, author, url ] triaged_counter = 0 logger.info "Fetching today\'s failures..." spinner.run do response = api_client.fetch_failures(date: @today_iso_format, state: 'opened') if response.nil? logger.info "Life is great, there are no new failures today!" exit 0 end response.each do |failure| title = truncate(failure["title"], 60) author = failure["author"]["username"] url = failure["web_url"] award_emoji_url = failure["_links"]["award_emoji"] triaged = add_color('x', :red) emoji_awards = api_client.fetch_awarded_emojis(award_emoji_url) triaged = add_color('✓', :green) && triaged_counter += 1 if emoji_awards.find do |e| e['name'] == emoji && e['user']['username'] == @username end if @options[:urgent] labels = failure["labels"] labels.each do |label| if label.include? ("found:canary.gitlab.com" && "found:canary.staging.gitlab.com") urgent << [title, triaged, author, url] end end end failures << [title, triaged, author, url] end end if @options[:urgent] table = TTY::Table.new(labels, urgent) puts table.render(:ascii, resize: true, alignments: [:center, :center, :center, :center]) output.puts "\nFound: #{urgent.size} urgent failures, found in both canary.gitlab.com and canary.staging.gitlab.com." else table = TTY::Table.new(labels, failures) puts table.render(:ascii, resize: true, alignments: [:center, :center, :center, :center]) output.puts "\nFound: #{failures.size} failures, of these #{triaged_counter} have been triaged with a #{emoji}." end end private def truncate(string, max) string.length > max ? "#{string[0...max]}..." : string end end end end end