#!/usr/bin/env ruby require 'nokogiri' main_report_file = ARGV.shift unless main_report_file puts 'usage: merge-html-reports [parallel reports...]' exit 1 end base_artifact_url = ARGV.shift unless base_artifact_url puts 'usage: merge-html-reports [parallel reports...]' exit 1 end # Create the base report with empty body tag new_report = Nokogiri::HTML.parse(File.read(ARGV[0])) new_report.at_css('body').remove empty_body = Nokogiri::XML::Node.new('body', new_report) new_report.at_css('head').add_next_sibling(empty_body) ARGV.each do |report_file| report = Nokogiri::HTML.parse(File.read(report_file)) report.css('a').each do |link| link_suffix = link['href'].slice(19..-1) link['href'] = base_artifact_url + link_suffix end header = report.css('div #rspec-header') tests = report.css('dt[id^="example_group_"]') tests.each do |test| title = test.parent group = title.parent script = title.css('script') if script.inner_html.include? 'makeYellow' test.remove_class('passed') test.add_class('not_implemented') group.remove_class('passed') group.add_class('not_implemented') header.add_class('not_implemented') script.remove test.next_sibling.remove test.next_sibling.remove elsif script.inner_html.include? 'makeRed' test.remove_class('passed') test.add_class('failed') group.remove_class('passed') group.add_class('failed') header.add_class('failed') script.remove test.next_sibling.remove test.next_sibling.remove end end duration = report.at_css('p#duration') totals = report.at_css('p#totals') duration_script = report.css('div.results script')[-2] totals_script = report.css('div.results script')[-1] duration_text = duration_script.text.slice(49..-3) totals_text = totals_script.text.slice(47..-3) duration.inner_html = duration_text totals.inner_html = totals_text duration_script.remove totals_script.remove # Add the new result after the last one to keep the test order new_report.css('body')[-1].add_next_sibling(report.at_css('body')) end File.write(main_report_file, new_report)