beagle 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/beagle.rb CHANGED
@@ -1,3 +1,3 @@
1
+ require 'beagle/metrics'
1
2
  require 'beagle/timed_formatter'
2
3
  require 'beagle/examples'
3
- require 'beagle/metrics'
@@ -0,0 +1,89 @@
1
+ module Beagle
2
+
3
+ module Cucumber
4
+
5
+ class TimedFormatter
6
+
7
+ def initialize(step_mother, path_or_io, options)
8
+ @step_mother = step_mother
9
+ @path_or_io = path_or_io
10
+ @options = options
11
+ @scenarios = Hash.new{|h,k| h[k] = []}
12
+ end
13
+
14
+ def before_feature(feature)
15
+ @tags = []
16
+ end
17
+
18
+ def before_feature_element(feature_element)
19
+ file = feature_element.feature.file
20
+ @scenarios[file] << {:name => feature_element.name, :line_number => 0, :time => 0, :count => 1, :tags => @tags.flatten.uniq}
21
+
22
+ case feature_element
23
+ when Cucumber::Ast::Scenario
24
+ @scenario = @scenarios[file].last
25
+ @scenario_outline = nil
26
+ when Cucumber::Ast::ScenarioOutline
27
+ @scenario_outline = @scenarios[file].last
28
+ @scenario = nil
29
+ end
30
+ end
31
+
32
+ def tag_name(name)
33
+ @tags << name
34
+ end
35
+
36
+ def scenario_name(keyword, name, file_colon_line, source_indent)
37
+ file, line_number = file_colon_line.split(':')
38
+ @scenarios[file].last[:line_number] = line_number
39
+ end
40
+
41
+ def before_steps(steps)
42
+ @start_time = Time.now
43
+ end
44
+
45
+ def after_steps(steps)
46
+ @scenario[:time] = (Time.now - @start_time) if @scenario
47
+ end
48
+
49
+ def before_examples(examples)
50
+ @examples = true
51
+ @start_time = Time.now
52
+ end
53
+
54
+ def after_examples(examples)
55
+ @scenario_outline[:time] = (Time.now - @start_time) if @scenario_outline
56
+ @examples = false
57
+ end
58
+
59
+ def after_outline_table(outline_table)
60
+ @scenario_outline[:count] = outline_table.example_rows.size
61
+ end
62
+
63
+ def after_features(features)
64
+ @times = []
65
+ @by_tag = Hash.new{|h,k| h[k] = []}
66
+ @scenarios.each do |file, scenarios|
67
+ scenarios.each do |scenario|
68
+ tags = scenario[:tags].empty? ? ['none'] : scenario[:tags]
69
+ tags.each do |tag|
70
+ @by_tag[tag] << {:scenario => scenario[:name], :file => file, :time => scenario[:time], :count => scenario[:count]}
71
+ end
72
+ end
73
+ time = scenarios.inject(0) {|sum, scenario| sum + scenario[:time] }
74
+ count = scenarios.inject(0) {|sum, scenario| sum + scenario[:count] }
75
+ tags = scenarios.map {|scenario| scenario[:tags] }.flatten.uniq
76
+ @times << [file, count, tags, time, scenarios]
77
+ end
78
+ @times.sort! {|a,b| b[3] <=> a[3]}
79
+ out_dir = "#{Rails.root}/reports/cucumber"
80
+ template = File.read(File.expand_path('../../templates/cuke.rhtml', File.dirname(__FILE__)))
81
+ rhtml = ERB.new(template, nil, ">")
82
+ FileUtils.mkdir_p out_dir
83
+ outfile = "#{out_dir}/index.html"
84
+ FileUtils.rm_rf outfile
85
+ File.open(outfile, 'w') {|f| f.write(rhtml.result(binding)) }
86
+ end
87
+ end
88
+ end
89
+ end
@@ -3,7 +3,7 @@ module Beagle
3
3
  class Examples
4
4
 
5
5
  def initialize
6
- @entries = Hash.new{|h,k|h[k] = []}
6
+ @entries = Hash.new{|hash, key|hash[key] = []}
7
7
  end
8
8
 
9
9
  def add(example)
@@ -2,7 +2,7 @@ module Beagle
2
2
 
3
3
  class Metrics
4
4
 
5
- def initialize(metrics=[])
5
+ def initialize(metrics={})
6
6
  @metrics = metrics
7
7
  @spec_types = @metrics.keys.sort
8
8
  end
@@ -1,3 +1,3 @@
1
1
  module Beagle
2
- VERSION = "0.1.1".freeze
2
+ VERSION = "0.1.2".freeze
3
3
  end
@@ -0,0 +1,131 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2
+ <html>
3
+ <head>
4
+ <title>Cucumber results</title>
5
+ <style type="text/css">
6
+ body {
7
+ margin-left: 0 auto;
8
+ margin-right: 0 auto;
9
+ text-align:center;
10
+ width:100%;
11
+ }
12
+ table {
13
+ border-collapse:collapse;
14
+ border-spacing:0;
15
+ width: 100%;
16
+ }
17
+ table th,td {
18
+ padding:3px 5px;
19
+ text-align:left;
20
+ border: 1px solid #DDDDDD;
21
+ }
22
+ table th {
23
+ font-weight:bold;
24
+ }
25
+ table tfoot td {
26
+ font-weight:bold;
27
+ }
28
+ table thead tr {
29
+ background-color: #00FFFF;
30
+ }
31
+ .numeric {
32
+ text-align:right;
33
+ }
34
+ .invisible {
35
+ display: none;
36
+ }
37
+ .feature_file {
38
+ cursor: pointer;
39
+ }
40
+ #detail {
41
+ width:75%;
42
+ }
43
+ #summary {
44
+ width:18%;
45
+ }
46
+ #detail,#summary {
47
+ display:inline-block;
48
+ vertical-align:top;
49
+ padding:0 5px 0 5px;
50
+ }
51
+ </style>
52
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
53
+ <script type="text/javascript">
54
+ $(document).ready(function() {
55
+
56
+ $('.feature_file').live('click', function() {
57
+ $(this).next().toggleClass('invisible');
58
+ });
59
+
60
+ });
61
+ </script>
62
+ </head>
63
+ <body>
64
+ <div id="summary">
65
+ <table>
66
+ <thead>
67
+ <tr>
68
+ <th>Tag</th>
69
+ <th># Scenarios</th>
70
+ <th>Total Duration</th>
71
+ </tr>
72
+ </thead>
73
+ <tbody>
74
+ <% @by_tag.each do |tag, scenarios| %>
75
+ <tr>
76
+ <td><%= tag %></td>
77
+ <td class="numeric"><%= scenarios.inject(0){|s,t| s + t[:count]} %></td>
78
+ <td class="numeric"><%= scenarios.inject(0){|s,t| s + t[:time]}.round(2) %></td>
79
+ </tr>
80
+ <% end %>
81
+ </tbody>
82
+ </table>
83
+ </div>
84
+ <div id="detail">
85
+ <table>
86
+ <thead>
87
+ <tr>
88
+ <th>Feature</th>
89
+ <th># Scenarios</th>
90
+ <th>Tags</th>
91
+ <th>Total Duration</th>
92
+ </tr>
93
+ </thead>
94
+ <tbody>
95
+ <% @times.each do |entry| %>
96
+ <tr class="feature_file">
97
+ <td>...<%= entry[0] %></td>
98
+ <td class="numeric"><%= entry[1] %></td>
99
+ <td><%= entry[2].join(', ') %>&nbsp;</td>
100
+ <td class="numeric"><%= entry[3].round(2) %></td>
101
+ </tr>
102
+ <tr class="invisible">
103
+ <td colspan="4">
104
+ <table>
105
+ <tbody>
106
+ <% entry.last.each do |scenario| %>
107
+ <tr>
108
+ <td><%= scenario[:name] %></td>
109
+ <td class="numeric"><%= scenario[:count] %></td>
110
+ <td class="numeric"><%= scenario[:tags].join(', ') %></td>
111
+ <td class="numeric"><%= scenario[:time].round(2) %></td>
112
+ </tr>
113
+ <% end %>
114
+ </tbody>
115
+ </table>
116
+ </td>
117
+ </tr>
118
+ <% end %>
119
+ </tbody>
120
+ <tfoot>
121
+ <tr>
122
+ <td>Totals</td>
123
+ <td class="numeric"><%= @times.inject(0){|s,t| s + t[1]} %></td>
124
+ <td>&nbsp;</td>
125
+ <td class="numeric"><%= @times.inject(0){|s,t| s + t[3]}.round(2) %></td>
126
+ </tr>
127
+ </tfoot>
128
+ </table>
129
+ </div>
130
+ </body>
131
+ </html>
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Beagle::Examples do
4
+
5
+ before do
6
+ @example = Beagle::Examples.new
7
+ example = mock('Example', :file_path => 'file', :full_description => 'description')
8
+ @example.add(example)
9
+ end
10
+
11
+ it "should have a size" do
12
+ @example.size.should == 1
13
+ end
14
+
15
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Beagle::Metrics do
4
+
5
+ before do
6
+ @metrics = Beagle::Metrics.new
7
+ end
8
+
9
+ it "should be true" do
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1 @@
1
+ Dir.glob('lib/**/*.rb').each {|file| require file}
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beagle
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 1
10
- version: 0.1.1
9
+ - 2
10
+ version: 0.1.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Rob Mitchell
@@ -15,9 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-12 00:00:00 Z
18
+ date: 2012-08-12 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
+ name: rspec-core
21
22
  prerelease: false
22
23
  requirement: &id001 !ruby/object:Gem::Requirement
23
24
  none: false
@@ -30,10 +31,10 @@ dependencies:
30
31
  - 0
31
32
  - 0
32
33
  version: 2.0.0
33
- name: rspec-core
34
34
  type: :runtime
35
35
  version_requirements: *id001
36
36
  - !ruby/object:Gem::Dependency
37
+ name: rake
37
38
  prerelease: false
38
39
  requirement: &id002 !ruby/object:Gem::Requirement
39
40
  none: false
@@ -46,10 +47,10 @@ dependencies:
46
47
  - 8
47
48
  - 7
48
49
  version: 0.8.7
49
- name: rake
50
50
  type: :development
51
51
  version_requirements: *id002
52
52
  - !ruby/object:Gem::Dependency
53
+ name: rspec
53
54
  prerelease: false
54
55
  requirement: &id003 !ruby/object:Gem::Requirement
55
56
  none: false
@@ -62,7 +63,6 @@ dependencies:
62
63
  - 0
63
64
  - 0
64
65
  version: 2.0.0
65
- name: rspec-core
66
66
  type: :development
67
67
  version_requirements: *id003
68
68
  description:
@@ -74,6 +74,7 @@ extensions: []
74
74
  extra_rdoc_files: []
75
75
 
76
76
  files:
77
+ - lib/beagle/cucumber/timed_formatter.rb
77
78
  - lib/beagle/examples.rb
78
79
  - lib/beagle/metrics.rb
79
80
  - lib/beagle/timed_formatter.rb
@@ -81,7 +82,11 @@ files:
81
82
  - lib/beagle.rb
82
83
  - lib/js/highcharts.js
83
84
  - lib/js/jquery-1.4.2.min.js
85
+ - lib/templates/cuke.rhtml
84
86
  - lib/templates/index.rhtml
87
+ - spec/beagle/examples_spec.rb
88
+ - spec/beagle/metrics_spec.rb
89
+ - spec/spec_helper.rb
85
90
  - Rakefile
86
91
  homepage: http://github.com/robmitch/beagle
87
92
  licenses: []
@@ -112,9 +117,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
112
117
  requirements: []
113
118
 
114
119
  rubyforge_project:
115
- rubygems_version: 1.7.2
120
+ rubygems_version: 1.8.8
116
121
  signing_key:
117
122
  specification_version: 3
118
123
  summary: Provides execution times for your specs for analysis
119
124
  test_files:
125
+ - spec/beagle/examples_spec.rb
126
+ - spec/beagle/metrics_spec.rb
127
+ - spec/spec_helper.rb
120
128
  - Rakefile