cuke_sniffer 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a9c28cd72cb8c92f7652554a02e08e8011396fcc
4
- data.tar.gz: 4a51196a738f9e34cfdca8956be6470b60c6e9b1
3
+ metadata.gz: b53fd2a4aa90a0c9a77360600b64f0d5a8317d88
4
+ data.tar.gz: b801e304f3cfca26540c38e01046e551f1de7814
5
5
  SHA512:
6
- metadata.gz: 6d5100b8206489608e24dff3b95455bbec3a28b618a11e099e1ab744dad19bea92f3144e6bcfc42a00a060dc94e2570e591cb942cf6f4833893d7e31e8bc77d3
7
- data.tar.gz: fda70ca7da1d441871df0d041d233dc56922fb026ef4bd134c6a40c0079929d377514f8b48f371c5b8d6d5cf65df5b4c41a1975fb7e8ae3867f590206a09991b
6
+ metadata.gz: 785c6e575269118fe0aa09d13f24e90a47d791dd94a20c2d45a44e2eb2dbd0fd2fde67e63a60b097cab09c337dcdaa8a6ad7fcf9a7bf1a41877c6619d9f32302
7
+ data.tar.gz: fc488ea1e58617e8d3973fdc0ca8145524da4607f0c2f10ae84f1cd98cfb36f34b1c1f61f13fb00058ce910f7e826a918a772087882d9810d70c7cd43876553e
@@ -30,6 +30,10 @@ module CukeSniffer
30
30
  comparison_object.tags == tags
31
31
  end
32
32
 
33
+ def is_comment_and_tag?(line)
34
+ true if line =~ /^\#.*\@.*$/
35
+ end
36
+
33
37
  private
34
38
 
35
39
  def create_name(line, filter)
@@ -13,9 +13,9 @@ module CukeSniffer
13
13
  def self.output_console(cuke_sniffer)
14
14
  summary = cuke_sniffer.summary
15
15
  output = "Suite Summary" +
16
- " Total Score: #{summary[:total_score]}\n" +
17
- get_output_summary_nodes(cuke_sniffer) +
18
- console_improvement_list(summary[:improvement_list])
16
+ " Total Score: #{summary[:total_score]}\n" +
17
+ get_output_summary_nodes(cuke_sniffer) +
18
+ console_improvement_list(summary[:improvement_list])
19
19
 
20
20
  puts output
21
21
  end
@@ -32,9 +32,9 @@ module CukeSniffer
32
32
  # Formats the section data for a summary object
33
33
  def self.console_summary(name, summary)
34
34
  " #{name}\n" +
35
- " Min: #{summary[:min]}\n" +
36
- " Max: #{summary[:max]}\n" +
37
- " Average: #{summary[:average]}\n"
35
+ " Min: #{summary[:min]}\n" +
36
+ " Max: #{summary[:max]}\n" +
37
+ " Average: #{summary[:average]}\n"
38
38
  end
39
39
 
40
40
  # Formats the improvement list data for summary
@@ -55,7 +55,9 @@ module CukeSniffer
55
55
  def self.output_html(cuke_sniffer, file_name = DEFAULT_OUTPUT_FILE_NAME, template_name = "standard_template")
56
56
  cuke_sniffer = sort_cuke_sniffer_lists(cuke_sniffer)
57
57
  output = ERB.new(extract_markup("#{template_name}.html.erb")).result(binding)
58
- File.open(format_html_file_name(file_name), 'w') do |f| f.write(output) end
58
+ File.open(format_html_file_name(file_name), 'w') do |f|
59
+ f.write(output)
60
+ end
59
61
  end
60
62
 
61
63
  # Returns an ERB page built up for the passed file name
@@ -102,7 +104,9 @@ module CukeSniffer
102
104
  end
103
105
  end
104
106
 
105
- # Creates an xml file in the junit with issues organized by file.
107
+ # Creates an xml file that can be read by Jenkins/Hudson in the junit format with issues organized and collated by file.
108
+ # Each file becomes a testsuite with corresponding failures associated to it.
109
+ # If no failures are found this will be marked as a pass by Jenkins/Hudson.
106
110
  # file_name defaults to "cuke_sniffer_result.xml" unless specified
107
111
  # cuke_sniffer.output_xml
108
112
  # Or
@@ -111,34 +115,47 @@ module CukeSniffer
111
115
  file_name = file_name + ".xml" unless file_name =~ /\.xml$/
112
116
  results = {}
113
117
  failures = 0
118
+ suits={}
114
119
  current = cuke_sniffer.features
115
120
  current.concat cuke_sniffer.scenarios
116
121
  current.concat cuke_sniffer.step_definitions
117
122
  current.concat cuke_sniffer.hooks
118
123
  current.each do |test|
119
124
  location = test.location.gsub("#{Dir.pwd}/", '')
120
- location_no_line = location.gsub(/:[0-9]*/,'')
125
+ location_no_line = location.gsub(/:[0-9]*/, '')
121
126
  line_num = location.include?(":") ? location.gsub(/.*:(.*)/, "\\1") : "full_file"
122
- errors = test.rules_hash.keys.map {|f| {:line => line_num,
123
- :severity => test.rules_hash,
124
- :error => f,
125
- :formatted => "Severity: #{test.rules_hash[f]}\nLocation: #{location}\nError: #{f}"}}
127
+ errors = test.rules_hash.keys.map { |f| {:line => "line: #{line_num}",
128
+ :error => f,
129
+ :formatted => "Location: #{location}",
130
+ :instances => "Instances: #{test.rules_hash[f]}"
131
+ } }
126
132
  results[location_no_line] = results[location_no_line].nil? ? errors : results[location_no_line].concat(errors)
127
133
  failures += test.rules_hash.size
128
134
  end
135
+ results.each do |location, failure|
136
+ suits[location]=failure
137
+ end
129
138
  builder = Nokogiri::XML::Builder.new do |xml|
130
139
  xml.testsuites(:tests => results.size, :failures => failures) do
131
- results.each do |location, failures|
132
- failures.each do |failure|
133
- xml.testcase(:classname => location, :name => failure[:line], :time => 0) do
134
- xml.failure(failure[:formatted], :type => 'failure', :message => failure[:error])
140
+ suits.each do |location, failures|
141
+ xml.testsuite(:name => location, :tests => 1, :failures => failures.length) do
142
+ if failures.length == 0
143
+ xml.testcase(:classname => location, :name => location, :time => 0, :status => 0)
144
+ else
145
+ failures.each do |failure|
146
+ xml.testcase(:classname => location, :name => failure[:line], :time => 0, :status => failure[:instances]) do
147
+ xml.failure(failure[:formatted], :type => 'failure', :message => "#{failure[:error]} #{failure[:instances]}")
148
+ end
149
+ end
135
150
  end
136
151
  end
137
152
  end
138
153
  end
139
154
  end
140
155
  output = builder.to_xml
141
- File.open(file_name, 'w') do |f| f.write(output) end
156
+ File.open(file_name, 'w') do |f|
157
+ f.write(output)
158
+ end
142
159
  # Return here to aid testing.
143
160
  output
144
161
  end
@@ -101,10 +101,7 @@
101
101
  <% next if scenario.score == 0 %>
102
102
  <div class="col-md-12 scenario">
103
103
  <div class="col-md-12 title">
104
- <div class="btn btn-xs btn-default" style="display:none;"> <!--TODO enable this feature -->
105
- View <span class="glyphicon glyphicon-eye-open"></span>
106
- </div>
107
- <%= scenario.type %>: <%=scenario.name %>
104
+ <%= scenario.type %>: <%=scenario.name %> (line: <%=scenario.start_line %>)
108
105
  </div>
109
106
  <div class="col-md-12 details well">
110
107
  <% SummaryHelper::sort_improvement_list(scenario.rules_hash).each do |phrase, count| %>
@@ -129,4 +126,4 @@
129
126
  <% end %>
130
127
  </div>
131
128
  </div>
132
- </div>
129
+ </div>
@@ -53,11 +53,16 @@ module CukeSniffer
53
53
  lambda { |feature_rule_target, rule|
54
54
  tokens = feature_rule_target.tags.collect { |line| line.split }.flatten
55
55
 
56
+ return_value = nil
57
+
56
58
  tokens.each_with_index do |token, index|
57
59
  if feature_rule_target.is_comment?(token) && tokens[0...index].any? { |x| x =~ /\A@/ }
58
- return feature_rule_target.store_rule(rule)
60
+ return_value = feature_rule_target.store_rule(rule)
61
+ break
59
62
  end
60
63
  end
64
+
65
+ return_value
61
66
  }
62
67
  },
63
68
  :universal_nested_step => {
@@ -198,11 +203,14 @@ module CukeSniffer
198
203
  :score => WARNING,
199
204
  :targets => ["Scenario"],
200
205
  :reason => lambda { |scenario, rule| step_order = scenario.get_step_order
201
- ["But", "*", "And"].each { |type| step_order.delete(type) }
202
- if(step_order != %w(Given When Then) and step_order != %w(When Then))
203
- scenario.store_rule(rule)
204
- end}
205
-
206
+ if !step_order.empty?
207
+ ["But", "*", "And"].each { |type| step_order.delete(type) }
208
+ step_order = step_order.chunk { |keyword| keyword }.map(&:first)
209
+ if(step_order != %w(Given When Then) and step_order != %w(When Then))
210
+ scenario.store_rule(rule)
211
+ end
212
+ end
213
+ }
206
214
  },
207
215
  :invalid_first_step => {
208
216
  :enabled => true,
@@ -315,7 +323,7 @@ module CukeSniffer
315
323
  :score => WARNING,
316
324
  :targets => ["Feature", "Scenario"],
317
325
  :reason => lambda { |feature_rule_target, rule| feature_rule_target.tags.each do | tag |
318
- feature_rule_target.store_rule(rule, rule.phrase.gsub("{class}", feature_rule_target.type)) if feature_rule_target.is_comment?(tag)
326
+ feature_rule_target.store_rule(rule, rule.phrase.gsub("{class}", feature_rule_target.type)) if feature_rule_target.is_comment_and_tag?(tag)
319
327
  end}
320
328
  },
321
329
  :empty_hook => {
@@ -347,6 +355,16 @@ module CukeSniffer
347
355
  all_tags.flatten!
348
356
  unique_tags = all_tags.uniq
349
357
  true unless all_tags == unique_tags}
358
+ },
359
+ :duplicate_scenario_name => {
360
+ :enabled => true,
361
+ :phrase => "Feature has scenarios with the same name.",
362
+ :score => WARNING,
363
+ :targets => ["Feature"],
364
+ :reason => lambda { |feature, rule|
365
+ names = feature.scenarios.collect { |scenario| scenario.name }
366
+ return names.length > names.uniq.length
367
+ }
350
368
  }
351
369
  }
352
370
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cuke_sniffer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Cochran
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-06-28 00:00:00.000000000 Z
13
+ date: 2017-02-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri