# Encoding: utf-8
require 'nokogiri'
module ChemistryKit
module Reporting
class HtmlReportAssembler
# TODO: Refactor to remove this cop exception
# rubocop:disable MethodLength, ParameterLists
def initialize(results_path, output_file)
@results_path = results_path
@output_file = output_file
@groups = []
@total_reactions = 0
@total_failures = 0
@total_duration = 0
@total_pending = 0
end
def assemble
result_files = Dir.glob(File.join(@results_path, 'results_*.html'))
result_files.each do |file|
doc = Nokogiri.HTML(open(file))
doc.css('.results').each do |element|
@total_reactions += element['data-count'].to_i
@total_failures += element['data-failures'].to_i
@total_pending += element['data-pendings'].to_i
@total_duration += element['data-duration'].to_f
end
doc.css('.example-group').each do |group|
@groups << group
end
end
status = @total_failures > 0 ? 'failing' : 'passing'
File.open(@output_file, 'w') do |file|
file.write ''
file.write ''
file.write ' '
file.write get_report_head 'passing'
file.write '
'
file.write get_report_header
file.write ''
file.write get_report_summary status, @groups.count, @total_reactions, @total_failures, @total_pending, @total_duration
@groups.each do |group|
file.write group
end
file.write '
' # closes .report
file.write get_report_endscripts
file.write ''
file.write ''
end
end
def get_report_head(state)
build_fragment do |doc|
doc.head do
doc.meta(charset: 'utf-8')
doc.meta(name: 'viewport', content: 'width=device-width')
doc.title { doc.text "ChemistryKit - #{state.capitalize}" }
doc.style(type: 'text/css') do
doc.text load_from_file(File.join(File.dirname(File.expand_path(__FILE__)), '../../../report/', 'stylesheets', 'app.css'))
end
doc.link(href: 'http://netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css', rel: 'stylesheet')
doc.script do
doc.text load_from_file(File.join(File.dirname(File.expand_path(__FILE__)), '../../../report/', 'javascripts', 'vendor', 'custom.modernizr.js'))
end
end
end
end
def get_report_header
build_fragment do |doc|
doc.header(class: 'row') do
doc.div(class: 'large-12 columns') do
doc.h2 { doc.text 'ChemistryKit Brew Results' }
end
end
end
end
def get_report_summary(status, beakers, reactions, failures, pendings, duration)
if status == 'passing'
icon = 'icon-ok-sign'
message = ' Brew Passing'
else
icon = 'icon-warning-sign'
message = ' Brew Failing'
end
build_fragment do |doc|
doc.div(class: 'summary') do
doc.div(class: "row status #{status}") do
doc.div(class: 'large-12 columns') do
doc.h1 do
doc.i(class: icon)
doc.text message
end
end
end
doc.div(class: 'row details') do
doc.div(class: 'large-12 columns') do
doc.ul(class: 'large-block-grid-5') do
doc.li do
doc.i(class: 'icon-beaker passing-color')
doc.p { doc.text "#{beakers.to_s} Beakers" }
end
doc.li do
doc.i(class: 'icon-tint reaction-color')
doc.p { doc.text "#{reactions.to_s} Reactions" }
end
doc.li do
doc.i(class: 'icon-warning-sign failing-color')
doc.p { doc.text "#{failures.to_s} Failures" }
end
doc.li do
doc.i(class: 'icon-question-sign pending-color')
doc.p { doc.text "#{pendings.to_s} Pending" }
end
doc.li do
doc.i(class: 'icon-time')
doc.p { doc.text "#{ sprintf("%.1i", duration / 60) }m Duration" }
end
end
end
end
end
end
end
def get_report_endscripts
build_fragment do |doc|
doc.script do
doc.text load_from_file(File.join(File.dirname(File.expand_path(__FILE__)), '../../../report/', 'javascripts', 'vendor', 'jquery.js'))
end
doc.script do
doc.text load_from_file(File.join(File.dirname(File.expand_path(__FILE__)), '../../../report/', 'javascripts', 'foundation', 'foundation.js'))
end
doc.script do
doc.text load_from_file(File.join(File.dirname(File.expand_path(__FILE__)), '../../../report/', 'javascripts', 'foundation', 'foundation.section.js'))
end
doc.script { doc.text '$(document).foundation();' }
end
end
def build_fragment
final = Nokogiri::HTML::DocumentFragment.parse ''
Nokogiri::HTML::Builder.with(final) do |doc|
yield doc
end
final.to_html
end
def load_from_file(path)
File.open(path, 'rb') { |file| file.read }
end
# rubocop:enable MethodLength, ParameterLists
end
end
end