From c34fd350cfd77557db59c967548c46bdfd6dfce1 Mon Sep 17 00:00:00 2001 From: Dominik Richter Date: Wed, 15 Jun 2016 22:17:59 +0200 Subject: [PATCH] multi-profile reporting in cli formatter --- lib/inspec/rspec_json_formatter.rb | 96 +++++++++++++++++++---------- test/functional/inspec_exec_test.rb | 16 +++-- 2 files changed, 74 insertions(+), 38 deletions(-) diff --git a/lib/inspec/rspec_json_formatter.rb b/lib/inspec/rspec_json_formatter.rb index 452e6994f..d2b851748 100644 --- a/lib/inspec/rspec_json_formatter.rb +++ b/lib/inspec/rspec_json_formatter.rb @@ -162,9 +162,9 @@ class InspecRspecCli < InspecRspecJson # rubocop:disable Metrics/ClassLength }.freeze TEST_INDICATORS = { - 'failed' => ' fail: ', - 'skipped' => ' skip: ', - 'empty' => ' ', + 'failed' => ' fail: ', + 'skipped' => ' skip: ', + 'empty' => ' ', }.freeze def initialize(*args) @@ -174,32 +174,30 @@ class InspecRspecCli < InspecRspecJson # rubocop:disable Metrics/ClassLength @format = '%color%indicator%id%summary' @current_control = nil + @current_profile = nil @missing_controls = [] super(*args) end def start(_notification) - output.puts '' - @profiles_info ||= Hash[@profiles.map { |x| profile_info(x) }] - profiles = @profiles_info.values.find_all { |x| !x[:title].nil? || !x[:name].nil? } - profiles.each do |profile| - if profile[:title].nil? - output.puts "Profile: #{profile[:name] || 'unknown'}" - else - output.puts "Profile: #{profile[:title]} (#{profile[:name] || 'unknown'})" - end - - output.puts 'Version: ' + (profile[:version] || 'unknown') - output.puts '' - end - output.puts '' unless profiles.empty? end def close(_notification) flush_current_control + output.puts('') unless @current_control.nil? + + @profiles_info.each do |_id, profile| + next if profile[:already_printed] + @current_profile = profile + next unless print_current_profile + print_line( + color: '', indicator: @indicators['empty'], id: '', profile: '', + summary: 'No tests executed.' + ) + output.puts('') + end - output.puts '' unless @current_control.nil? res = @output_hash[:summary] passed = res[:example_count] - res[:failure_count] - res[:skip_count] s = format('Summary: %3d successful %3d failures %3d skipped', @@ -263,8 +261,35 @@ class InspecRspecCli < InspecRspecJson # rubocop:disable Metrics/ClassLength end + @colors['reset'] end + def print_line(fields) + output.puts(format_line(fields)) + end + + def format_lines(lines, indentation) + lines.gsub(/\n/, "\n" + indentation) + end + + def print_fails_and_skips(all, color) + all.each do |x| + indicator = @test_indicators[x[:status]] + indicator = @test_indicators['empty'] if all.length == 1 || indicator.nil? + msg = x[:message] || x[:skip_message] || x[:code_desc] + print_line( + color: color, + indicator: indicator, + summary: format_lines(msg, @test_indicators['empty']), + id: nil, profile: nil + ) + end + end + def flush_current_control return if @current_control.nil? + + prev_profile = @current_profile + @current_profile = @profiles_info[@current_control[:profile_id]] + print_current_profile if prev_profile != @current_profile + fails, skips, summary_indicator = current_control_infos summary = current_control_summary(fails, skips) @@ -272,27 +297,34 @@ class InspecRspecCli < InspecRspecJson # rubocop:disable Metrics/ClassLength control_id += ': ' control_id = '' if control_id.start_with? '(generated from ' - f = format_line( + print_line( color: @colors[summary_indicator] || '', indicator: @indicators[summary_indicator] || @indicators['unknown'], - summary: summary, + summary: format_lines(summary, @indicators['empty']), id: control_id, profile: @current_control[:profile_id], ) - output.puts(f) - all_lines = (fails + skips) - all_lines.each do |x| - indicator = @test_indicators[x[:status]] - indicator = @test_indicators['empty'] if all_lines.length == 1 || indicator.nil? - f = format_line( - color: @colors[summary_indicator] || '', - indicator: indicator, - summary: x[:message] || x[:skip_message] || x[:code_desc], - id: nil, profile: nil - ) - output.puts(f) + print_fails_and_skips(fails + skips, @colors[summary_indicator] || '') + end + + def print_current_profile + profile = @current_profile + return false if profile.nil? + + output.puts '' + profile[:already_printed] = true + return true if profile[:name].nil? + + if profile[:title].nil? + output.puts "Profile: #{profile[:name] || 'unknown'}" + else + output.puts "Profile: #{profile[:title]} (#{profile[:name] || 'unknown'})" end + + output.puts 'Version: ' + (profile[:version] || 'unknown') + output.puts '' + true end def format_example(example) diff --git a/test/functional/inspec_exec_test.rb b/test/functional/inspec_exec_test.rb index bdc4e8609..6c0b2e9ba 100644 --- a/test/functional/inspec_exec_test.rb +++ b/test/functional/inspec_exec_test.rb @@ -14,7 +14,10 @@ describe 'inspec exec' do stdout = out.stdout.force_encoding(Encoding::UTF_8) stdout.must_include "\n\e[32m ✔ ssh-1: Allow only SSH Protocol 2\e[0m\n" stdout.must_include "\n\e[32m ✔ tmp-1.0: Create /tmp directory\e[0m\n" - stdout.must_include "\n\e[37m ○ gordon-1.0: Verify the version number of Gordon (1 skipped)\e[0m\n" + stdout.must_include " +\e[37m ○ gordon-1.0: Verify the version number of Gordon (1 skipped)\e[0m +\e[37m Can't find file \"/tmp/gordon/config.yaml\"\e[0m +" stdout.must_include "\nSummary: 4 successful 0 failures 1 skipped\n" end @@ -26,6 +29,7 @@ describe 'inspec exec' do Profile: yumyum profile Version: unknown + No tests executed.\e[0m Summary: 0 successful 0 failures 0 skipped " @@ -39,6 +43,7 @@ Summary: 0 successful 0 failures 0 skipped Profile: title (name) Version: 1.2.3 + No tests executed.\e[0m Summary: 0 successful 0 failures 0 skipped " @@ -52,11 +57,10 @@ Summary: 0 successful 0 failures 0 skipped \e[32m ✔ working should eq \"working\"\e[0m \e[37m ○ skippy This will be skipped intentionally.\e[0m \e[31m ✖ failing should eq \"as intended\" -expected: \"as intended\" - got: \"failing\" - -(compared using ==) -\e[0m + expected: \"as intended\" + got: \"failing\" + \n (compared using ==) + \e[0m Summary: 1 successful 1 failures 1 skipped "