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