cuke_sniffer 0.0.8 → 1.0.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 08622ee3780b51802880b03e082b31e87276a0ae
4
+ data.tar.gz: face498e4e3bcfe632b1f7fc1fdc15c71514ee6f
5
+ SHA512:
6
+ metadata.gz: 8b3f1802e042beefe36c066c01699c3bcc1fc3cfa75818749a3c070a52e84dee5e166e211e6a33ee0bed3aaed33aa7ddac8bd43855aa573e61440b4ebdb9d5db
7
+ data.tar.gz: 9693a75b3eb0321b14212cde4b3179b69b51096f8ce1b0bbfcf999aedb825f6256a8f1304dab9507625ede083799b9539d00c04eb263ec3c12d2b5e64df4382a
@@ -6,7 +6,7 @@ require 'cuke_sniffer'
6
6
  help_cmd_txt = "Welcome to CukeSniffer!
7
7
  Calling CukeSniffer with no arguments will run it against the current directory.
8
8
  Other Options for Running include:
9
- -o, --out <type> (name) : Where <type> is 'html', 'min_html' or 'xml'.
9
+ -o, --out <type> (name) : Where <type> is 'html', 'min_html', 'junit_xml' or 'xml'.
10
10
  Runs CukeSniffer then outputs an
11
11
  html/xml file in the current
12
12
  directory (with optional name).
@@ -50,6 +50,7 @@ def handle_output(argv)
50
50
  :html => "html",
51
51
  :min_html => "min_html",
52
52
  :xml => "xml",
53
+ :junit_xml => "junit_xml",
53
54
  }
54
55
  output_type_hash.each_value do |value|
55
56
  index_of_key = argv.index(value)
@@ -72,6 +73,8 @@ def call_output(file_type, file_name)
72
73
  file_name.nil? ? @cuke_sniffer.output_html : @cuke_sniffer.output_html(file_name)
73
74
  when "min_html"
74
75
  file_name.nil? ? @cuke_sniffer.output_min_html : @cuke_sniffer.output_min_html(file_name)
76
+ when "junit_xml"
77
+ file_name.nil? ? @cuke_sniffer.output_junit_xml : @cuke_sniffer.output_junit_xml(file_name)
75
78
  else
76
79
  puts "#{file_type} is not a supported version of cuke_sniffer output."
77
80
  end
@@ -149,6 +149,15 @@ module CukeSniffer
149
149
  CukeSniffer::Formatter.output_xml(self, file_name)
150
150
  end
151
151
 
152
+ # Creates a xml file with the collected project details
153
+ # file_name defaults to "cuke_sniffer.xml" unless specified
154
+ # cuke_sniffer.output_xml
155
+ # Or
156
+ # cuke_sniffer.output_xml("cuke_sniffer01-01-0001.xml")
157
+ def output_junit_xml(file_name = DEFAULT_OUTPUT_FILE_NAME + ".xml")
158
+ CukeSniffer::Formatter.output_junit_xml(self, file_name)
159
+ end
160
+
152
161
  # Gathers all StepDefinitions that have no calls
153
162
  # Returns a hash that has two different types of records
154
163
  # 1: String of the file with a dead step with an array of the line and regex of each dead step
@@ -205,9 +214,11 @@ module CukeSniffer
205
214
  end
206
215
 
207
216
  def initialize_locations(parameters)
208
- @features_location = parameters[:features_location] ? parameters[:features_location] : Dir.getwd
209
- @step_definitions_location = parameters[:step_definitions_location] ? parameters[:step_definitions_location] : Dir.getwd
210
- @hooks_location = parameters[:hooks_location] ? parameters[:hooks_location] : Dir.getwd
217
+ default_location = parameters[:project_location] || Dir.getwd
218
+
219
+ @features_location = parameters[:features_location] || default_location
220
+ @step_definitions_location = parameters[:step_definitions_location] || default_location
221
+ @hooks_location = parameters[:hooks_location] || default_location
211
222
  end
212
223
 
213
224
  def initialize_feature_objects
@@ -260,7 +271,7 @@ module CukeSniffer
260
271
  if File.file?(pattern_location)
261
272
  [pattern_location]
262
273
  else
263
- Dir["#{pattern_location}/**/*.#{extension}"]
274
+ Dir["#{pattern_location}/**/*.#{extension}"].select { |f| File.file? f }
264
275
  end
265
276
  end
266
277
  end
@@ -86,14 +86,15 @@ module CukeSniffer
86
86
  # Builds a list of rule objects out of a hash. See CukeSniffer::RulesConfig for hash example.
87
87
  def self.build_rules(rules)
88
88
  return [] if rules.nil?
89
- rules.collect do |key, value|
90
- CukeSniffer::CukeSnifferHelper.build_rule(value)
89
+ rules.collect do |symbol, value|
90
+ CukeSniffer::CukeSnifferHelper.build_rule(symbol, value)
91
91
  end
92
92
  end
93
93
 
94
94
  # Builds rule object out of a hash. See CukeSniffer::RulesConfig for hash example.
95
- def self.build_rule(rule_hash)
95
+ def self.build_rule(symbol, rule_hash)
96
96
  rule = CukeSniffer::Rule.new
97
+ rule.symbol = symbol
97
98
  rule.phrase = rule_hash[:phrase]
98
99
  rule.score = rule_hash[:score]
99
100
  rule.enabled = rule_hash[:enabled]
@@ -1,54 +1,54 @@
1
- module CukeSniffer
2
- # Author:: Robert Cochran (mailto:cochrarj@miamioh.edu)
3
- # Copyright:: Copyright (C) 2014 Robert Cochran
4
- # License:: Distributes under the MIT License
5
- # Mixins: CukeSniffer::Constants
6
- # A static class to aid in the identification of dead steps.
7
- class DeadStepsHelper
8
- include CukeSniffer::Constants
9
-
10
- # Returns a hash of dead steps for displaying in the html.
11
- def self.build_dead_steps_hash(step_definitions)
12
- dead_steps_hash = gather_all_dead_steps_by_file(step_definitions)
13
- sort_dead_steps_in_file!(dead_steps_hash)
14
- dead_steps_hash[:total] = count_dead_steps(dead_steps_hash)
15
- dead_steps_hash
16
- end
17
-
18
- # Returns all dead step definitions in a file
19
- def self.gather_all_dead_steps_by_file(step_definitions)
20
- dead_steps_hash = {}
21
- step_definitions.each do |step_definition|
22
- location_match = step_definition.location.match(/(?<file>.*).rb:(?<line>\d+)/)
23
- file_name = location_match[:file]
24
- regex = format_step_definition_regex(step_definition.regex)
25
- if step_definition.calls.empty?
26
- dead_steps_hash[file_name] ||= []
27
- dead_steps_hash[file_name] << "#{location_match[:line]}: /#{regex}/"
28
- end
29
- end
30
- dead_steps_hash
31
- end
32
-
33
- # Formats the regex of a step definition to remove the (?-mix) part of the to_s
34
- def self.format_step_definition_regex(regex)
35
- regex.to_s.match(/\(\?\-mix\:(?<regex>.*)\)/)[:regex]
36
- end
37
-
38
- # Sorts the dead steps found in a hash by the line number in the file
39
- def self.sort_dead_steps_in_file!(dead_steps_hash)
40
- dead_steps_hash.each_key do |file|
41
- dead_steps_hash[file].sort_by! { |row| row[/^\d+/].to_i }
42
- end
43
- end
44
-
45
- # Returns the count of all possible dead steps in each file
46
- def self.count_dead_steps(dead_steps_hash)
47
- count = 0
48
- dead_steps_hash.each_value do |dead_steps_in_file_list|
49
- count += dead_steps_in_file_list.size
50
- end
51
- count
52
- end
53
- end
1
+ module CukeSniffer
2
+ # Author:: Robert Cochran (mailto:cochrarj@miamioh.edu)
3
+ # Copyright:: Copyright (C) 2014 Robert Cochran
4
+ # License:: Distributes under the MIT License
5
+ # Mixins: CukeSniffer::Constants
6
+ # A static class to aid in the identification of dead steps.
7
+ class DeadStepsHelper
8
+ include CukeSniffer::Constants
9
+
10
+ # Returns a hash of dead steps for displaying in the html.
11
+ def self.build_dead_steps_hash(step_definitions)
12
+ dead_steps_hash = gather_all_dead_steps_by_file(step_definitions)
13
+ sort_dead_steps_in_file!(dead_steps_hash)
14
+ dead_steps_hash[:total] = count_dead_steps(dead_steps_hash)
15
+ dead_steps_hash
16
+ end
17
+
18
+ # Returns all dead step definitions in a file
19
+ def self.gather_all_dead_steps_by_file(step_definitions)
20
+ dead_steps_hash = {}
21
+ step_definitions.each do |step_definition|
22
+ location_match = step_definition.location.match(/(?<file>.*).rb:(?<line>\d+)/)
23
+ file_name = location_match[:file]
24
+ regex = format_step_definition_regex(step_definition.regex)
25
+ if step_definition.calls.empty?
26
+ dead_steps_hash[file_name] ||= []
27
+ dead_steps_hash[file_name] << "#{location_match[:line]}: /#{regex}/"
28
+ end
29
+ end
30
+ dead_steps_hash
31
+ end
32
+
33
+ # Formats the regex of a step definition to remove the (?-mix) part of the to_s
34
+ def self.format_step_definition_regex(regex)
35
+ regex.to_s.match(/\(\?\-mix\:(?<regex>.*)\)/)[:regex]
36
+ end
37
+
38
+ # Sorts the dead steps found in a hash by the line number in the file
39
+ def self.sort_dead_steps_in_file!(dead_steps_hash)
40
+ dead_steps_hash.each_key do |file|
41
+ dead_steps_hash[file].sort_by! { |row| row[/^\d+/].to_i }
42
+ end
43
+ end
44
+
45
+ # Returns the count of all possible dead steps in each file
46
+ def self.count_dead_steps(dead_steps_hash)
47
+ count = 0
48
+ dead_steps_hash.each_value do |dead_steps_in_file_list|
49
+ count += dead_steps_in_file_list.size
50
+ end
51
+ count
52
+ end
53
+ end
54
54
  end
@@ -1,125 +1,166 @@
1
- require 'erb'
2
-
3
- module CukeSniffer
4
- # Author:: Robert Cochran (mailto:cochrarj@miamioh.edu)
5
- # Copyright:: Copyright (C) 2014 Robert Cochran
6
- # License:: Distributes under the MIT License
7
- # Mixins: CukeSniffer::Constants
8
- # Static class used to generate output for the CukeSniffer::CLI object.
9
- class Formatter
10
- include CukeSniffer::Constants
11
-
12
- # Prints out a summary of the results and the list of improvements to be made
13
- def self.output_console(cuke_sniffer)
14
- summary = cuke_sniffer.summary
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])
19
-
20
- puts output
21
- end
22
-
23
- # Returns a string of formatted output for all the object sections of summary
24
- def self.get_output_summary_nodes(cuke_sniffer)
25
- output = ""
26
- [:features, :scenarios, :step_definitions, :hooks].each do |summary_section|
27
- output += console_summary(summary_section.to_s.gsub("_", " ").capitalize, cuke_sniffer.summary[summary_section])
28
- end
29
- output
30
- end
31
-
32
- # Formats the section data for a summary object
33
- def self.console_summary(name, summary)
34
- " #{name}\n" +
35
- " Min: #{summary[:min]}\n" +
36
- " Max: #{summary[:max]}\n" +
37
- " Average: #{summary[:average]}\n"
38
- end
39
-
40
- # Formats the improvement list data for summary
41
- def self.console_improvement_list(improvement_list)
42
- output = " Improvements to make:\n"
43
- improvement_list.each do |improvement, count|
44
- output << " (#{count}) #{improvement}\n"
45
- end
46
- output
47
- end
48
-
49
- # Creates a html file with the collected project details
50
- # file_name defaults to "cuke_sniffer_results.html" unless specified
51
- # Second parameter used for passing into the markup.
52
- # cuke_sniffer.output_html
53
- # Or
54
- # cuke_sniffer.output_html("results01-01-0001.html")
55
- def self.output_html(cuke_sniffer, file_name = DEFAULT_OUTPUT_FILE_NAME, template_name = "standard_template")
56
- cuke_sniffer = sort_cuke_sniffer_lists(cuke_sniffer)
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
59
- end
60
-
61
- # Returns an ERB page built up for the passed file name
62
- def self.build_page(cuke_sniffer, erb_file)
63
- ERB.new(extract_markup(erb_file)).result(binding)
64
- end
65
-
66
- # Assigns an html extension if one is not provided for the passed file name
67
- def self.format_html_file_name(file_name)
68
- if file_name =~ /\.html$/
69
- file_name
70
- else
71
- file_name + ".html"
72
- end
73
- end
74
-
75
- # Creates a html file with minimum information: Summary, Rules, Improvement List.
76
- # file_name defaults to "cuke_sniffer_results.html" unless specified
77
- # Second parameter used for passing into the markup.
78
- # cuke_sniffer.output_min_html
79
- # Or
80
- # cuke_sniffer.output_min_html("results01-01-0001.html")
81
- def self.output_min_html(cuke_sniffer, file_name = DEFAULT_OUTPUT_FILE_NAME)
82
- output_html(cuke_sniffer, file_name, "min_template")
83
- end
84
-
85
- # Returns the Rules erb page that utilizes sub page sections of enabled and disabled rules
86
- def self.rules_template(cuke_sniffer)
87
- ERB.new(extract_markup("rules.html.erb")).result(binding)
88
- end
89
-
90
- # Creates a xml file with the collected project details
91
- # file_name defaults to "cuke_sniffer.xml" unless specified
92
- # cuke_sniffer.output_xml
93
- # Or
94
- # cuke_sniffer.output_xml("cuke_sniffer01-01-0001.xml")
95
- def self.output_xml(cuke_sniffer, file_name = DEFAULT_OUTPUT_FILE_NAME)
96
- file_name = file_name + ".xml" unless file_name =~ /\.xml$/
97
-
98
- doc = Nokogiri::XML::Document.new
99
- doc.root = cuke_sniffer.to_xml
100
- open(file_name, "w") do |file|
101
- file << doc.serialize
102
- end
103
- end
104
-
105
- # Sorts all of the lists on a cuke_sniffer object to be in descending order for each objects score.
106
- def self.sort_cuke_sniffer_lists(cuke_sniffer)
107
- cuke_sniffer.features = cuke_sniffer.features.sort_by { |feature| feature.total_score }.reverse
108
- cuke_sniffer.step_definitions = cuke_sniffer.step_definitions.sort_by { |step_definition| step_definition.score }.reverse
109
- cuke_sniffer.hooks = cuke_sniffer.hooks.sort_by { |hook| hook.score }.reverse
110
- cuke_sniffer.rules = cuke_sniffer.rules.sort_by { |rule| rule.score }.reverse
111
- cuke_sniffer
112
- end
113
-
114
- # Returns the markup for a desired erb file.
115
- def self.extract_markup(template_name = "markup.html.erb", markup_source = MARKUP_SOURCE)
116
- markup_location = "#{markup_source}/#{template_name}"
117
- markup = ""
118
- File.open(markup_location).lines.each do |line|
119
- markup << line
120
- end
121
- markup
122
- end
123
-
124
- end
125
- end
1
+ require 'erb'
2
+
3
+ module CukeSniffer
4
+ # Author:: Robert Cochran (mailto:cochrarj@miamioh.edu)
5
+ # Copyright:: Copyright (C) 2014 Robert Cochran
6
+ # License:: Distributes under the MIT License
7
+ # Mixins: CukeSniffer::Constants
8
+ # Static class used to generate output for the CukeSniffer::CLI object.
9
+ class Formatter
10
+ include CukeSniffer::Constants
11
+
12
+ # Prints out a summary of the results and the list of improvements to be made
13
+ def self.output_console(cuke_sniffer)
14
+ summary = cuke_sniffer.summary
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])
19
+
20
+ puts output
21
+ end
22
+
23
+ # Returns a string of formatted output for all the object sections of summary
24
+ def self.get_output_summary_nodes(cuke_sniffer)
25
+ output = ""
26
+ [:features, :scenarios, :step_definitions, :hooks].each do |summary_section|
27
+ output += console_summary(summary_section.to_s.gsub("_", " ").capitalize, cuke_sniffer.summary[summary_section])
28
+ end
29
+ output
30
+ end
31
+
32
+ # Formats the section data for a summary object
33
+ def self.console_summary(name, summary)
34
+ " #{name}\n" +
35
+ " Min: #{summary[:min]}\n" +
36
+ " Max: #{summary[:max]}\n" +
37
+ " Average: #{summary[:average]}\n"
38
+ end
39
+
40
+ # Formats the improvement list data for summary
41
+ def self.console_improvement_list(improvement_list)
42
+ output = " Improvements to make:\n"
43
+ improvement_list.each do |improvement, count|
44
+ output << " (#{count}) #{improvement}\n"
45
+ end
46
+ output
47
+ end
48
+
49
+ # Creates a html file with the collected project details
50
+ # file_name defaults to "cuke_sniffer_results.html" unless specified
51
+ # Second parameter used for passing into the markup.
52
+ # cuke_sniffer.output_html
53
+ # Or
54
+ # cuke_sniffer.output_html("results01-01-0001.html")
55
+ def self.output_html(cuke_sniffer, file_name = DEFAULT_OUTPUT_FILE_NAME, template_name = "standard_template")
56
+ cuke_sniffer = sort_cuke_sniffer_lists(cuke_sniffer)
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
59
+ end
60
+
61
+ # Returns an ERB page built up for the passed file name
62
+ def self.build_page(cuke_sniffer, erb_file)
63
+ ERB.new(extract_markup(erb_file)).result(binding)
64
+ end
65
+
66
+ # Assigns an html extension if one is not provided for the passed file name
67
+ def self.format_html_file_name(file_name)
68
+ if file_name =~ /\.html$/
69
+ file_name
70
+ else
71
+ file_name + ".html"
72
+ end
73
+ end
74
+
75
+ # Creates a html file with minimum information: Summary, Rules, Improvement List.
76
+ # file_name defaults to "cuke_sniffer_results.html" unless specified
77
+ # Second parameter used for passing into the markup.
78
+ # cuke_sniffer.output_min_html
79
+ # Or
80
+ # cuke_sniffer.output_min_html("results01-01-0001.html")
81
+ def self.output_min_html(cuke_sniffer, file_name = DEFAULT_OUTPUT_FILE_NAME)
82
+ output_html(cuke_sniffer, file_name, "min_template")
83
+ end
84
+
85
+ # Returns the Rules erb page that utilizes sub page sections of enabled and disabled rules
86
+ def self.rules_template(cuke_sniffer)
87
+ ERB.new(extract_markup("rules.html.erb")).result(binding)
88
+ end
89
+
90
+ # Creates a xml file with the collected project details
91
+ # file_name defaults to "cuke_sniffer_result.xml" unless specified
92
+ # cuke_sniffer.output_xml
93
+ # Or
94
+ # cuke_sniffer.output_xml("cuke_sniffer01-01-0001.xml")
95
+ def self.output_xml(cuke_sniffer, file_name = DEFAULT_OUTPUT_FILE_NAME)
96
+ file_name = file_name + ".xml" unless file_name =~ /\.xml$/
97
+
98
+ doc = Nokogiri::XML::Document.new
99
+ doc.root = cuke_sniffer.to_xml
100
+ open(file_name, "w") do |file|
101
+ file << doc.serialize
102
+ end
103
+ end
104
+
105
+ # Creates an xml file in the junit with issues organized by file.
106
+ # file_name defaults to "cuke_sniffer_result.xml" unless specified
107
+ # cuke_sniffer.output_xml
108
+ # Or
109
+ # cuke_sniffer.output_xml("cuke_sniffer01-01-0001.xml")
110
+ def self.output_junit_xml(cuke_sniffer, file_name = DEFAULT_OUTPUT_FILE_NAME)
111
+ file_name = file_name + ".xml" unless file_name =~ /\.xml$/
112
+ results = {}
113
+ failures = 0
114
+ current = cuke_sniffer.features
115
+ current.concat cuke_sniffer.scenarios
116
+ current.concat cuke_sniffer.step_definitions
117
+ current.concat cuke_sniffer.hooks
118
+ current.each do |test|
119
+ location = test.location.gsub("#{Dir.pwd}/", '')
120
+ location_no_line = location.gsub(/:[0-9]*/,'')
121
+ 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}"}}
126
+ results[location_no_line] = results[location_no_line].nil? ? errors : results[location_no_line].concat(errors)
127
+ failures += test.rules_hash.size
128
+ end
129
+ builder = Nokogiri::XML::Builder.new do |xml|
130
+ 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])
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ output = builder.to_xml
141
+ File.open(file_name, 'w') do |f| f.write(output) end
142
+ # Return here to aid testing.
143
+ output
144
+ end
145
+
146
+ # Sorts all of the lists on a cuke_sniffer object to be in descending order for each objects score.
147
+ def self.sort_cuke_sniffer_lists(cuke_sniffer)
148
+ cuke_sniffer.features = cuke_sniffer.features.sort_by { |feature| feature.total_score }.reverse
149
+ cuke_sniffer.step_definitions = cuke_sniffer.step_definitions.sort_by { |step_definition| step_definition.score }.reverse
150
+ cuke_sniffer.hooks = cuke_sniffer.hooks.sort_by { |hook| hook.score }.reverse
151
+ cuke_sniffer.rules = cuke_sniffer.rules.sort_by { |rule| rule.score }.reverse
152
+ cuke_sniffer
153
+ end
154
+
155
+ # Returns the markup for a desired erb file.
156
+ def self.extract_markup(template_name = "markup.html.erb", markup_source = MARKUP_SOURCE)
157
+ markup_location = "#{markup_source}/#{template_name}"
158
+ markup = ""
159
+ File.open(markup_location).each_line do |line|
160
+ markup << line
161
+ end
162
+ markup
163
+ end
164
+
165
+ end
166
+ end