lib/dri/commands/fetch/failures.rb in dri-0.9.0 vs lib/dri/commands/fetch/failures.rb in dri-0.10.0

- old
+ new

@@ -10,21 +10,15 @@ class Failures < Dri::Command include Dri::Utils::Table include Dri::Utils::Constants::Triage::Labels using Refinements - SORT_BY_OPTIONS = { - title: 0, - triaged: 1, - environment: 2, - author: 3, - url: 4 - }.freeze - def initialize(options) @options = options - @today_iso_format = Time.now.strftime('%Y-%m-%dT00:00:00Z') + @start_date = @options[:start_date] ? Date.parse(@options[:start_date]) : Date.today + @end_date = @options[:end_date] ? Date.parse(@options[:end_date]) : Date.today + @cutoff_time = @options[:cutoff] ? Time.parse(options[:cutoff]).utc : nil end def execute(input: $stdin, output: $stdout) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength verify_config_exists @@ -33,55 +27,68 @@ title = add_color('Title', :bright_yellow) triaged = add_color('Triaged?', :bright_yellow) environment = add_color('Environment', :bright_yellow) author = add_color('Author', :bright_yellow) url = add_color('URL', :bright_yellow) + updated_at = add_color('Updated at', :bright_yellow) sorted_failures = [] - labels = [title, triaged, environment, author, url] + labels = { title: title, triaged: triaged, environment: environment, author: author, url: url, + updated_at: updated_at } triaged_counter = 0 - logger.info "Fetching today's failures..." + if @cutoff_time + @start_date = Time.new( + @start_date.year, + @start_date.month, + @start_date.day, + @cutoff_time.hour, + @cutoff_time.min, 0, + "+00:00" + ) + end + logger.info "Fetching failures from #{@start_date} (UTC) to #{@end_date} (UTC)..." + spinner.run do # rubocop:disable Metrics/BlockLength - failures = api_client.fetch_all_new_failures(date: @today_iso_format, state: 'opened') + failures = api_client.fetch_all_new_failures(start_date: @start_date, end_date: @end_date, state: 'opened') if failures.empty? - logger.info 'Life is great, there are no new failures today!' + logger.info "Life is great, there are no new failures between #{@start_date} and #{@end_date}!" exit 0 end failures.each do |failure| project_id = failure.project_id title = failure.title.truncate(60) - author = failure.to_h.dig('author', 'username') + author = failure.to_h.dig('author', 'username').truncate(25) url = failure.web_url + updated_at = failure.updated_at triaged = add_color('x', :red) envs = failure.labels.select { |l| l.include?(FOUND) }.map do |l| env = l.split(':').last.gsub('.gitlab.com', '') env == 'gitlab.com' ? 'production' : env end urgent = urgent_environments.all? { |env| envs.include?(env) } + next if @options[:urgent] && !urgent + emoji_awards = api_client.fetch_awarded_emojis(failure.iid, project_id: project_id).find do |e| e.name == emoji && e.to_h.dig('user', 'username') == username end if emoji_awards triaged = add_color('✓', :green) triaged_counter += 1 end - if @options[:urgent] - sorted_failures << [title, triaged, envs.first, author, url] if urgent - else - sorted_failures << [title, triaged, envs.first, author, url] - end + sorted_failures << { title: title, triaged: triaged, environment: envs.first, author: author, url: url, + updated_at: updated_at } end - sorted_failures.sort_by! { |failure| failure[SORT_BY_OPTIONS[@options[:sort_by]&.to_sym || :environment]] } + sorted_failures.sort_by! { |failure| failure[@options[:sort_by]&.to_sym || :environment] } end msg = if @options[:urgent] <<~MSG Found: #{sorted_failures.size} urgent failures, occurring in both canary.gitlab.com and canary.staging.gitlab.com. @@ -90,10 +97,17 @@ <<~MSG Found: #{sorted_failures.size} failures, of these #{triaged_counter} have been triaged with a #{emoji}. MSG end - print_table(labels, sorted_failures, alignments: [:left, :center, :center, :left]) + terminal_width = TTY::Screen.width + + if terminal_width <= 210 # adjust the desired minimum width + labels.delete(:updated_at) + sorted_failures.map { |failure| failure.delete(:updated_at) } + end + + print_table(labels.values, sorted_failures.map(&:values), alignments: [:left, :center, :center, :left, :left]) output.puts(msg) end end end end