cuke_parser 0.1.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -21,7 +21,7 @@ module CukeParser
21
21
 
22
22
  def to_csv
23
23
  #prints pretty csv format
24
- "#@date #@time,#@duration,#@converted_duration,#@browser,#@os,#@branch_number,#@branch_build_tag,#@url,#@status"
24
+ "#@date,#@time,#@duration,#@converted_duration,#@browser,#@os,#@branch_number,#@branch_build_tag,#@url,#@status"
25
25
  end
26
26
 
27
27
  def to_csv_pretty
data/lib/cuke_parser.rb CHANGED
@@ -1,31 +1,38 @@
1
- require 'parse_engine/json_parser.rb'
2
- require 'parse_engine/html_parser.rb'
3
- require 'parse_engine/parser_utils.rb'
1
+ require 'nokogiri'
2
+ require 'json'
3
+ Dir[File.join(File.dirname(__FILE__),'parse_engine','*.rb')].each {|file| require file}
4
+ Dir[File.join(File.dirname(__FILE__),'report_engine','*.rb')].each {|file| require file}
4
5
 
5
6
  module CukeParser
6
-
7
- @json_parser = ParseEngine::JsonParser.new
8
- @html_parser = ParseEngine::HtmlParser.new
9
- @parser_utils = ParseEngine::ParserUtils.new
10
7
 
11
- def CukeParser.write_pretty(build,file)
12
- @parser_utils.pretty(build,file)
8
+ def CukeParser.write_pretty(cuke,file)
9
+ parser_utils = ParseEngine::ParserUtils.new
10
+ parser_utils.pretty(cuke,file)
13
11
  end
14
12
 
15
- def CukeParser.write_build(build,file)
16
- @parser_utils.ugly(build,file)
13
+ def CukeParser.write_build(cuke,file)
14
+ parser_utils = ParseEngine::ParserUtils.new
15
+ parser_utils.ugly(cuke,file)
17
16
  end
18
17
 
19
18
  def CukeParser.json(file_path)
20
- @json_parser.get_build(file_path)
19
+ json_parser = ParseEngine::JsonParser.new
20
+ json_parser.get_build(file_path)
21
21
  end
22
22
 
23
23
  def CukeParser.json_jenkins_list(file_path,timestamp)
24
- @json_parser.get_jenkins_build_list(file_path,timestamp)
24
+ json_parser = ParseEngine::JsonParser.new
25
+ json_parser.get_jenkins_build_list(file_path,timestamp)
25
26
  end
26
27
 
27
28
  def CukeParser.html(file_path)
28
- @html_parser.get_build(file_path)
29
+ html_parser = ParseEngine::HtmlParser.new
30
+ html_parser.get_build(file_path)
31
+ end
32
+
33
+ def CukeParser.generate_report(cuke,options)
34
+ reporter = ReportEngine::HtmlReporter.new(options[:output_dir],cuke.date.gsub("-","_")+"_"+cuke.time.gsub("-","_"),options[:json_file])
35
+ reporter.generate_report(cuke,options[:title])
29
36
  end
30
37
 
31
38
  end #end CukeParser module
@@ -1,8 +1,4 @@
1
- require 'nokogiri'
2
- require 'cuke_model/feature.rb'
3
- require 'cuke_model/scenario.rb'
4
- require 'cuke_model/step.rb'
5
- require 'cuke_model/suite.rb'
1
+ Dir[File.join(File.dirname(__FILE__),'..','cuke_model','*.rb')].each {|file| require file}
6
2
 
7
3
  module CukeParser
8
4
  module ParseEngine
@@ -1,8 +1,4 @@
1
- require 'json'
2
- require 'cuke_model/feature.rb'
3
- require 'cuke_model/scenario.rb'
4
- require 'cuke_model/step.rb'
5
- require 'cuke_model/suite.rb'
1
+ Dir[File.join(File.dirname(__FILE__),'..','cuke_model','*.rb')].each {|file| require file}
6
2
 
7
3
  module CukeParser
8
4
  module ParseEngine
@@ -20,6 +16,7 @@ module CukeParser
20
16
  today = Time.now
21
17
  date = today.to_s.split(" ")[0]
22
18
  time = today.to_s.split(" ")[1]
19
+ time.gsub!(":","-")
23
20
  @cur_build = CukeModel::CukeSuite.new(date,time,today,nil,nil,nil,nil,nil)
24
21
  return parse_build(file_path)
25
22
  else
@@ -109,7 +106,7 @@ module CukeParser
109
106
  cur_path = dir_path + "/" + build_folder
110
107
  system_data_file_path = cur_path + @system_data_path
111
108
  cuke_file_path = cur_path + @cuke_data
112
- if Dir.exists?(cur_path) and File.exists?(system_data_file_path) and File.exists?(cuke_file_path) and (File.size(cuke_file_path) > 2048)
109
+ if Dir.exists?(cur_path) and File.exists?(system_data_file_path) and File.exists?(cuke_file_path) and (File.size(cuke_file_path) > 1024)
113
110
  timestamp = @utils.parse_time(build_folder.split("_"))
114
111
  system_data_file = File.read(system_data_file_path)
115
112
  system_data = JSON.parse(system_data_file)
@@ -0,0 +1,98 @@
1
+ module CukeParser
2
+ module ReportEngine
3
+ class FeaturePage
4
+
5
+ def initialize(utils,cuke_metrics)
6
+ @utils = utils
7
+ @cuke_metrics = cuke_metrics
8
+ end
9
+
10
+ def create_feature_page(feature,output_dir)
11
+ output = File.new(output_dir+"/features/"+feature.name+".html","w+")
12
+ builder = Nokogiri::HTML::Builder.new do |doc|
13
+ doc.html{
14
+ doc.link(:href => "../assets/stylesheets/bootstrap.css", :rel => "stylesheet")
15
+ doc.link(:href => "../assets/stylesheets/application.css", :rel => "stylesheet")
16
+ doc.script(:src => "../assets/javascripts/bootstrap.js", :type => "text/javascript")
17
+ doc.script(:src => "../assets/javascripts/jquery.js", :type => "text/javascript")
18
+ doc.body{
19
+ statistics_table(feature,doc)
20
+ doc.div(:class => "container"){
21
+ doc.div(:class => "row"){
22
+ doc.div(:class => "span12"){
23
+ feature.scenarios.each {|scenario| scenario_info(scenario,doc)}
24
+ }
25
+ }
26
+ }
27
+ }
28
+ }
29
+ end
30
+ output.puts builder.to_html
31
+ end
32
+
33
+ def step_error(step,doc)
34
+ doc.div(:class => "rounded error-message") {
35
+ doc.span(step.reason_for_failure)
36
+ }
37
+ end
38
+
39
+ def step_info(step,doc)
40
+ doc.span({:class => "keyword-step"},step.keyword.strip + ": ")
41
+ doc.span({:class => "non-keyword-step"},step.name)
42
+ step_error(step,doc) if step.status.eql?("failed")
43
+ end
44
+
45
+ def scenario_info(scenario,doc)
46
+ doc.div(:class => "rounded "+scenario.status){
47
+ doc.span({:class => "keyword-scenario"},scenario.keyword + ": ")
48
+ doc.span({:class => "non-keyword-scenario"},scenario.name)
49
+ scenario.steps.each {|step| doc.div({:class => "step "+step.status}){step_info(step,doc)}}
50
+ doc.br{}
51
+ }
52
+ doc.br{}
53
+ end
54
+
55
+ def statistics_table(feature,doc)
56
+ doc.h1({:class => "fancy-header"},feature.name + " Result")
57
+ doc.table(:class => "table table-bordered table-condensed feature-table neutral") {
58
+ doc.thead {
59
+ doc.tr {
60
+ doc.th()
61
+ doc.th({:colspan => 3, :class => "scenarios_header",},"Scenarios")
62
+ doc.th({:colspan => 4, :align => "center"},"Steps")
63
+ doc.th()
64
+ doc.th()
65
+ }
66
+ doc.tr {
67
+ doc.th("Feature")
68
+ doc.th("Total")
69
+ doc.th("Passed")
70
+ doc.th("Failed")
71
+ doc.th("Total")
72
+ doc.th("Passed")
73
+ doc.th("Failed")
74
+ doc.th("Skipped")
75
+ doc.th("Duration")
76
+ doc.th("Status")
77
+ }
78
+ }
79
+ doc.tr(@utils.model_status_display(feature.status)) {
80
+ doc.td(feature.name)
81
+ doc.td(@cuke_metrics[feature.name.to_sym][:feature_metrics][:scenario_count])
82
+ doc.td(@cuke_metrics[feature.name.to_sym][:feature_metrics][:passed])
83
+ doc.td(@cuke_metrics[feature.name.to_sym][:feature_metrics][:failed])
84
+ doc.td(@cuke_metrics[feature.name.to_sym][:scenario_metrics][:step_count])
85
+ doc.td(@cuke_metrics[feature.name.to_sym][:scenario_metrics][:passed])
86
+ doc.td(@cuke_metrics[feature.name.to_sym][:scenario_metrics][:failed])
87
+ doc.td(@cuke_metrics[feature.name.to_sym][:scenario_metrics][:skipped])
88
+ doc.td(@utils.time_to_words(feature.duration))
89
+ doc.td {
90
+ doc.span(feature.status)
91
+ }
92
+ }
93
+ }
94
+ end
95
+
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,92 @@
1
+ module CukeParser
2
+ module ReportEngine
3
+ class HomePage
4
+
5
+ def initialize(utils,cuke_metrics)
6
+ @utils = utils
7
+ @cuke_metrics = cuke_metrics
8
+ end
9
+
10
+ def cuke_statistics_table(cuke,doc)
11
+ doc.table(:class => "table table-bordered table-condensed neutral") {
12
+ doc.thead {
13
+ doc.tr {
14
+ doc.th()
15
+ doc.th({:colspan => 3, :padding => "5px",},"Scenarios")
16
+ doc.th({:colspan => 4, :align => "center"},"Steps")
17
+ doc.th()
18
+ doc.th()
19
+ }
20
+ doc.tr {
21
+ doc.th("Feature")
22
+ doc.th("Total")
23
+ doc.th("Passed")
24
+ doc.th("Failed")
25
+ doc.th("Total")
26
+ doc.th("Passed")
27
+ doc.th("Failed")
28
+ doc.th("Skipped")
29
+ doc.th("Duration")
30
+ doc.th("Status")
31
+ }
32
+ }
33
+ cuke.features.each do |feature|
34
+ doc.tr(@utils.model_status_display(feature.status)) {
35
+ doc.td{
36
+ doc.a({:href => "features/"+feature.name+".html"},(feature.name))
37
+ }
38
+ doc.td(@cuke_metrics[feature.name.to_sym][:feature_metrics][:scenario_count])
39
+ doc.td(@cuke_metrics[feature.name.to_sym][:feature_metrics][:passed])
40
+ doc.td(@cuke_metrics[feature.name.to_sym][:feature_metrics][:failed])
41
+ doc.td(@cuke_metrics[feature.name.to_sym][:scenario_metrics][:step_count])
42
+ doc.td(@cuke_metrics[feature.name.to_sym][:scenario_metrics][:passed])
43
+ doc.td(@cuke_metrics[feature.name.to_sym][:scenario_metrics][:failed])
44
+ doc.td(@cuke_metrics[feature.name.to_sym][:scenario_metrics][:skipped])
45
+ doc.td(@utils.time_to_words(feature.duration))
46
+ doc.td {
47
+ doc.span(feature.status)
48
+ }
49
+ }
50
+ end
51
+ doc.tr {
52
+ doc.td(cuke.features.count)
53
+ doc.td(@cuke_metrics[:scenarios_passed_total] + @cuke_metrics[:scenarios_failed_total])
54
+ doc.td(@cuke_metrics[:scenarios_passed_total])
55
+ doc.td(@cuke_metrics[:scenarios_failed_total])
56
+ doc.td(@cuke_metrics[:steps_passed_total] + @cuke_metrics[:steps_failed_total] + @cuke_metrics[:steps_skipped_total])
57
+ doc.td(@cuke_metrics[:steps_passed_total])
58
+ doc.td(@cuke_metrics[:steps_failed_total])
59
+ doc.td(@cuke_metrics[:steps_skipped_total])
60
+ doc.td(@utils.time_to_words(cuke.duration))
61
+ doc.td("Totals")
62
+ }
63
+ }
64
+ end
65
+
66
+ def create_home_page(cuke,output_dir,title)
67
+ output = File.new(output_dir+"/home_page.html","w+")
68
+ builder = Nokogiri::HTML::Builder.new do |doc|
69
+ doc.html{
70
+ doc.link(:href => "assets/stylesheets/bootstrap.css", :rel => "stylesheet")
71
+ doc.link(:href => "assets/stylesheets/application.css", :rel => "stylesheet")
72
+ doc.script(:src => "assets/javascripts/bootstrap.js", :type => "text/javascript")
73
+ doc.script(:src => "assets/javascripts/jquery.js", :type => "text/javascript")
74
+ doc.body{
75
+ doc.h1({:class => "fancy-header"},title + " Statistics")
76
+ doc.div(:class => "container") {
77
+ doc.div(:class => "row") {
78
+ doc.div(:class => "span12") {
79
+ cuke_statistics_table(cuke,doc)
80
+ }
81
+ }
82
+ }
83
+ }
84
+ }
85
+ end
86
+ output.puts builder.to_html
87
+ end
88
+
89
+
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,26 @@
1
+ require 'fileutils'
2
+
3
+ module CukeParser
4
+ module ReportEngine
5
+ class HtmlReporter
6
+
7
+ def initialize(output_dir,timestamp,json_file)
8
+ @utils = ReporterUtils.new
9
+ Dir.mkdir(output_dir) if !Dir.exists?(output_dir)
10
+ @output_dir = output_dir+"/"+timestamp
11
+ Dir.mkdir(@output_dir)
12
+ Dir.mkdir(@output_dir+"/features")
13
+ FileUtils.cp_r(Dir[Gem::Specification.find_by_name("cuke_parser").gem_dir + "/lib/assets/"],Dir[@output_dir])
14
+ FileUtils.cp(File.new(json_file),Dir.new(@output_dir))
15
+ end
16
+
17
+ def generate_report(cuke,title)
18
+ cuke_metrics = @utils.find_cuke_metrics(cuke)
19
+ HomePage.new(@utils,cuke_metrics).create_home_page(cuke,@output_dir,title)
20
+ feature_page = FeaturePage.new(@utils,cuke_metrics)
21
+ cuke.features.each {|feature| feature_page.create_feature_page(feature,@output_dir)}
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,62 @@
1
+ module CukeParser
2
+ module ReportEngine
3
+ class ReporterUtils
4
+
5
+ def initialize
6
+ #I might eventually use this!
7
+ end
8
+
9
+ def time_to_words(duration)
10
+ #need to determine if it has hours or minutes for output string!
11
+ t = Time.at(duration / 1000000000.00).gmtime
12
+ if !t.strftime('%H').eql?("00")
13
+ t.strftime('%H hours and %M mins and %S secs and %L ms')
14
+ elsif !t.strftime('%M').eql?("00")
15
+ t.strftime('%M mins and %S secs and %L ms')
16
+ elsif !t.strftime('%S').eql?("00")
17
+ t.strftime('%S secs and %L ms')
18
+ else
19
+ t.strftime('%L ms')
20
+ end
21
+ end
22
+
23
+ def model_status_display(status)
24
+ status == "failed" ? {:class => "failed"} : (status == "passed" ? {:class => "passed"} : {:class => "skipped"})
25
+ end
26
+
27
+ def get_scenario_metrics(feature)
28
+ feature_metrics = {:scenario_count => 0, :passed => 0, :failed => 0}
29
+ scenario_metrics = {:step_count => 0, :passed => 0, :failed => 0, :skipped => 0}
30
+ #don't want to count background!
31
+ feature_metrics[:scenario_count] = feature.scenarios.count - 1
32
+ feature.scenarios.each do |scenario|
33
+ scenario.status.eql?("passed") ? (scenario.keyword.eql?("Background") ? (feature_metrics[:passed] += 0) : (feature_metrics[:passed] += 1)) : (scenario.keyword.eql?("Background") ? (feature_metrics[:failed] += 0) : (feature_metrics[:failed] += 1))
34
+ scenario_metrics = get_step_metrics(scenario,scenario_metrics)
35
+ end
36
+ return {:feature_metrics => feature_metrics, :scenario_metrics => scenario_metrics}
37
+ end
38
+
39
+ def get_step_metrics(scenario,scenario_metrics)
40
+ scenario_metrics[:step_count] += scenario.steps.count
41
+ scenario.steps.each do |step|
42
+ step.status.eql?("passed") ? (scenario_metrics[:passed] += 1) : (step.status.eql?("failed") ? (scenario_metrics[:failed] += 1) : (scenario_metrics[:skipped] += 1))
43
+ end
44
+ return scenario_metrics
45
+ end
46
+
47
+ def find_cuke_metrics(cuke)
48
+ cuke_metrics = {:scenarios_passed_total => 0, :scenarios_failed_total => 0, :steps_passed_total => 0,:steps_failed_total => 0,:steps_skipped_total => 0}
49
+ cuke.features.each do |feature|
50
+ cuke_metrics[feature.name.to_sym] = get_scenario_metrics(feature)
51
+ cuke_metrics[:scenarios_failed_total] += cuke_metrics[feature.name.to_sym][:feature_metrics][:failed]
52
+ cuke_metrics[:scenarios_passed_total] += cuke_metrics[feature.name.to_sym][:feature_metrics][:passed]
53
+ cuke_metrics[:steps_skipped_total] += cuke_metrics[feature.name.to_sym][:scenario_metrics][:skipped]
54
+ cuke_metrics[:steps_failed_total] += cuke_metrics[feature.name.to_sym][:scenario_metrics][:failed]
55
+ cuke_metrics[:steps_passed_total] += cuke_metrics[feature.name.to_sym][:scenario_metrics][:passed]
56
+ end
57
+ return cuke_metrics
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -1,9 +1,16 @@
1
1
  require_relative 'json_test'
2
+ require_relative 'report_test'
2
3
 
3
4
  module CukeParserTest
4
5
 
6
+ Dir.chdir("./test")
7
+
5
8
  json_tester = JsonTest.new
6
9
  json_tester.test_json_jenkins_list
7
10
  json_tester.test_json
8
11
 
12
+ report_tester = ReportTest.new
13
+ report_tester.test_utils
14
+ report_tester.test_reporter
15
+
9
16
  end
data/test/json_test.rb CHANGED
@@ -9,7 +9,7 @@ module CukeParserTest
9
9
  include RSpec::Matchers
10
10
 
11
11
  def initialize
12
- Dir.chdir("./test")
12
+ #nothing needed yet
13
13
  end
14
14
 
15
15
  def test_json_jenkins_list
@@ -0,0 +1,88 @@
1
+ require 'cuke_parser'
2
+ require 'fileutils'
3
+ require 'rspec'
4
+
5
+ module CukeParserTest
6
+
7
+ class ReportTest
8
+
9
+ include RSpec::Matchers
10
+
11
+ def initialize
12
+ @utils = CukeParser::ReportEngine::ReporterUtils.new
13
+ location = "./builds/2013-04-23_03-01-25/archive"
14
+ @cuke = CukeParser.json(location)
15
+ #we need to overwrite the date because get_json_build just grabs Time.now as the date
16
+ @cuke.date = "2013-04-23"
17
+ @cuke.time = "03-01-25"
18
+ @options = {:title => "Rick Suite",:output_dir => "Rick Suite",:json_file => "./builds/2013-04-23_03-01-25/archive/cucumber.json"}
19
+ end
20
+
21
+ def test_utils
22
+ test_model_status_display
23
+ test_time_to_words
24
+ test_find_cuke_metrics
25
+ test_get_scenario_metrics
26
+ test_get_step_metrics
27
+ end
28
+
29
+ def test_reporter
30
+ test_generate_report
31
+ end
32
+
33
+ def test_generate_report
34
+ #delete any existing directory to be safe
35
+ FileUtils.rm_rf(Dir[@options[:output_dir]]) if Dir.exists?(@options[:output_dir])
36
+ CukeParser.generate_report(@cuke,@options)
37
+ #don't want to check to make sure files are the same as they are html files and are likely to change often as I update CSS/JS, etc.
38
+ File.exists?("Rick Suite/2013_04_23_03_01_25/cucumber.json").should be_true
39
+ File.exists?("Rick Suite/2013_04_23_03_01_25/home_page.html").should be_true
40
+ File.exists?("Rick Suite/2013_04_23_03_01_25/features/Rick Test.html ").should be_true
41
+ end
42
+
43
+ def test_model_status_display
44
+ {:class => "skipped"}.eql?(@utils.model_status_display("skipped")).should be_true
45
+ {:class => "failed"}.eql?(@utils.model_status_display("failed")).should be_true
46
+ {:class => "passed"}.eql?(@utils.model_status_display("passed")).should be_true
47
+ end
48
+
49
+ def test_time_to_words
50
+ "01 hours and 23 mins and 20 secs and 000 ms".eql?(@utils.time_to_words(5000000000000)).should be_true
51
+ "16 mins and 40 secs and 000 ms".eql?(@utils.time_to_words(1000000000000)).should be_true
52
+ "50 secs and 000 ms".eql?(@utils.time_to_words(50000000000)).should be_true
53
+ "211 ms".eql?(@utils.time_to_words(211021000)).should be_true
54
+ end
55
+
56
+ def test_get_scenario_metrics
57
+ scenario_metrics = {:feature_metrics=>{:scenario_count=>1, :passed=>1, :failed=>0}, :scenario_metrics=>{:step_count=>7, :passed=>7, :failed=>0, :skipped=>0}}
58
+ scenario_metrics.eql?(@utils.get_scenario_metrics(@cuke.features.first)).should be_true
59
+ end
60
+
61
+ def test_get_step_metrics
62
+ step_metrics = {:step_count=>7, :passed=>7, :failed=>0, :skipped=>0}
63
+ step_metrics.eql?(@utils.get_scenario_metrics(@cuke.features.first)[:scenario_metrics]).should be_true
64
+ end
65
+
66
+ def test_find_cuke_metrics
67
+ cuke_metrics = {:scenarios_passed_total=>1, :scenarios_failed_total=>0, :steps_passed_total=>7, :steps_failed_total=>0, :steps_skipped_total=>0,
68
+ :"Rick Test"=>{:feature_metrics=>{:scenario_count=>1, :passed=>1, :failed=>0}, :scenario_metrics=>{:step_count=>7, :passed=>7, :failed=>0, :skipped=>0}}}
69
+ cuke_metrics.eql?(@utils.find_cuke_metrics(@cuke)).should be_true
70
+ end
71
+
72
+
73
+
74
+ def test_json
75
+ location = "./builds/2013-04-23_03-01-25/archive"
76
+ result = CukeParser.json(location)
77
+ #we need to overwrite the date because get_json_build just grabs Time.now as the date
78
+ result.date = "2013-04-23"
79
+ result.time = "03-01-25"
80
+ #write our results to a text file
81
+ output = File.open("result.txt","w+")
82
+ CukeParser.write_build(result,output)
83
+ output.close
84
+ FileUtils.compare_file("result.txt","./results/json_results.txt").should be_true
85
+ end
86
+ end
87
+
88
+ end
@@ -1,4 +1,4 @@
1
- 2013-04-23 03-01-25,21000000,00:00:00:021,firefox,Windows_NT,0.0.5,cuke_parser-0.0.5,https://rubygems.org/gems/cuke_parser,passed
1
+ 2013-04-23,03-01-25,21000000,00:00:00:021,firefox,Windows_NT,0.0.5,cuke_parser-0.0.5,https://rubygems.org/gems/cuke_parser,passed
2
2
  Feature,Rick Test,21000000,00:00:00:021
3
3
  Background,,2000000,00:00:00:002
4
4
  Given ,numbers "46" and "2",2000000,00:00:00:002,passed
@@ -1,4 +1,4 @@
1
- 2013-04-23 03-01-25,21000000,00:00:00:021,,,,,,passed
1
+ 2013-04-23,03-01-25,21000000,00:00:00:021,,,,,,passed
2
2
  Feature,Rick Test,21000000,00:00:00:021
3
3
  Background,,2000000,00:00:00:002
4
4
  Given ,numbers "46" and "2",2000000,00:00:00:002,passed
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cuke_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-12 00:00:00.000000000 Z
12
+ date: 2013-09-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: builder
16
- requirement: &25585308 !ruby/object:Gem::Requirement
16
+ requirement: &27450312 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.1.2
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *25585308
24
+ version_requirements: *27450312
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &25584876 !ruby/object:Gem::Requirement
27
+ requirement: &27450024 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.4.6
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *25584876
35
+ version_requirements: *27450024
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: nokogiri
38
- requirement: &25584276 !ruby/object:Gem::Requirement
38
+ requirement: &27449748 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.5.9
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *25584276
46
+ version_requirements: *27449748
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
- requirement: &25583688 !ruby/object:Gem::Requirement
49
+ requirement: &27449472 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.9.2
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *25583688
57
+ version_requirements: *27449472
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rspec
60
- requirement: &25582824 !ruby/object:Gem::Requirement
60
+ requirement: &27449196 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,8 +65,9 @@ dependencies:
65
65
  version: 2.11.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *25582824
69
- description: Library to easily pull out information for tracking your Cukes
68
+ version_requirements: *27449196
69
+ description: Library to easily extract information for tracking your Cukes, their
70
+ overall performance, and generates HTML reports.
70
71
  email: rick.beyer@gmail.com
71
72
  executables: []
72
73
  extensions: []
@@ -80,8 +81,17 @@ files:
80
81
  - lib/parse_engine/html_parser.rb
81
82
  - lib/parse_engine/json_parser.rb
82
83
  - lib/parse_engine/parser_utils.rb
84
+ - lib/report_engine/feature_page.rb
85
+ - lib/report_engine/home_page.rb
86
+ - lib/report_engine/html_reporter.rb
87
+ - lib/report_engine/reporter_utils.rb
88
+ - lib/assets/javascripts/bootstrap.js
89
+ - lib/assets/javascripts/jquery.js
90
+ - lib/assets/stylesheets/application.css
91
+ - lib/assets/stylesheets/bootstrap.css
83
92
  - test/cuke_parser_test.rb
84
93
  - test/json_test.rb
94
+ - test/report_test.rb
85
95
  - test/builds/2013-04-22_03-01-25/archive/cucumber.json
86
96
  - test/builds/2013-04-22_03-01-25/archive/systemData.json
87
97
  - test/builds/2013-04-23_03-01-25/archive/cucumber.json
@@ -112,10 +122,11 @@ rubyforge_project:
112
122
  rubygems_version: 1.8.16
113
123
  signing_key:
114
124
  specification_version: 3
115
- summary: cuke_parser-0.1.2
125
+ summary: cuke_parser-1.0.0
116
126
  test_files:
117
127
  - test/cuke_parser_test.rb
118
128
  - test/json_test.rb
129
+ - test/report_test.rb
119
130
  - test/builds/2013-04-22_03-01-25/archive/cucumber.json
120
131
  - test/builds/2013-04-22_03-01-25/archive/systemData.json
121
132
  - test/builds/2013-04-23_03-01-25/archive/cucumber.json