stepdown-patched 0.6.3.1patched
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/.bundle/config +1 -0
- data/.gitignore +7 -0
- data/.rspec +1 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +31 -0
- data/History.txt +50 -0
- data/README.rdoc +28 -0
- data/Rakefile +14 -0
- data/bin/stepdown +23 -0
- data/lib/stepdown/analyzer.rb +74 -0
- data/lib/stepdown/feature_parser.rb +60 -0
- data/lib/stepdown/graph.rb +75 -0
- data/lib/stepdown/html_reporter.rb +37 -0
- data/lib/stepdown/options.rb +68 -0
- data/lib/stepdown/reporter.rb +23 -0
- data/lib/stepdown/scenario.rb +26 -0
- data/lib/stepdown/statistics.rb +162 -0
- data/lib/stepdown/step.rb +22 -0
- data/lib/stepdown/step_collection.rb +36 -0
- data/lib/stepdown/step_group.rb +45 -0
- data/lib/stepdown/step_instance.rb +63 -0
- data/lib/stepdown/step_usage.rb +15 -0
- data/lib/stepdown/text_reporter.rb +39 -0
- data/lib/stepdown/version.rb +3 -0
- data/lib/stepdown/yaml_writer.rb +14 -0
- data/lib/stepdown.rb +17 -0
- data/public/bluff-min.js +1 -0
- data/public/excanvas.js +35 -0
- data/public/jquery-1.6.1.min.js +18 -0
- data/public/js-class.js +1 -0
- data/public/step_down.js +41 -0
- data/public/stepdown.css +24 -0
- data/spec/fixtures/20110611.yml +5 -0
- data/spec/fixtures/20110612.yml +5 -0
- data/spec/lib/stepdown/analyzer_spec.rb +70 -0
- data/spec/lib/stepdown/feature_parser_spec.rb +93 -0
- data/spec/lib/stepdown/graph_spec.rb +82 -0
- data/spec/lib/stepdown/options_spec.rb +98 -0
- data/spec/lib/stepdown/scenario_spec.rb +40 -0
- data/spec/lib/stepdown/statistics_spec.rb +239 -0
- data/spec/lib/stepdown/step_collection_spec.rb +78 -0
- data/spec/lib/stepdown/step_group_spec.rb +43 -0
- data/spec/lib/stepdown/step_instance_spec.rb +85 -0
- data/spec/spec_helper.rb +4 -0
- data/stepdown.gemspec +30 -0
- data/templates/_empty.html.erb +5 -0
- data/templates/_grouping.html.erb +31 -0
- data/templates/_unused.html.erb +5 -0
- data/templates/_usages.html.erb +8 -0
- data/templates/index.html.erb +218 -0
- data/templates/style.sass +25 -0
- metadata +183 -0
data/.bundle/config
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--- {}
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
diff-lcs (1.1.2)
|
5
|
+
gherkin (2.4.6)
|
6
|
+
json (>= 1.4.6)
|
7
|
+
haml (3.1.3)
|
8
|
+
json (1.5.3)
|
9
|
+
rake (0.9.2)
|
10
|
+
rcov (0.9.10)
|
11
|
+
rspec (2.5.0)
|
12
|
+
rspec-core (~> 2.5.0)
|
13
|
+
rspec-expectations (~> 2.5.0)
|
14
|
+
rspec-mocks (~> 2.5.0)
|
15
|
+
rspec-core (2.5.2)
|
16
|
+
rspec-expectations (2.5.0)
|
17
|
+
diff-lcs (~> 1.1.2)
|
18
|
+
rspec-mocks (2.5.0)
|
19
|
+
sass (3.1.7)
|
20
|
+
|
21
|
+
PLATFORMS
|
22
|
+
ruby
|
23
|
+
|
24
|
+
DEPENDENCIES
|
25
|
+
bundler (> 1.0)
|
26
|
+
gherkin (> 2.3)
|
27
|
+
haml
|
28
|
+
rake
|
29
|
+
rcov (~> 0.9.9)
|
30
|
+
rspec (~> 2.5.0)
|
31
|
+
sass (~> 3.1.0)
|
data/History.txt
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
== 0.6.3 2011-08-16
|
2
|
+
* update dependant gems, be less restrictive on versions
|
3
|
+
* adjust statistics interface to improve metric_fu integration
|
4
|
+
|
5
|
+
== 0.6.2 2011-06-26
|
6
|
+
* Only show top 10 items on page load
|
7
|
+
|
8
|
+
== 0.6.1 2011-06-23
|
9
|
+
* fix issue with Ruby 1.9.2
|
10
|
+
* update jQuery
|
11
|
+
|
12
|
+
== 0.6.0 2011-6-6
|
13
|
+
* Graph for overall statistics
|
14
|
+
|
15
|
+
== 0.5.0 2011-5-17
|
16
|
+
* Use gherkin gem to parse features
|
17
|
+
* Added empty step detection
|
18
|
+
* Added unused step count to summary
|
19
|
+
* Added quiet option
|
20
|
+
|
21
|
+
== 0.4.0 2011-3-29
|
22
|
+
* Better HTML output
|
23
|
+
* Structured like other gems
|
24
|
+
* Maintainability improvements
|
25
|
+
* Better test coverage
|
26
|
+
|
27
|
+
== 0.3.3 2011-03-05
|
28
|
+
* Better HTML output
|
29
|
+
|
30
|
+
== 0.3.2 - 2011-02-27
|
31
|
+
* Bugfix in option parsing
|
32
|
+
* Bugfix for missing constants
|
33
|
+
|
34
|
+
== 0.3.1 - 2011-02-26
|
35
|
+
* Fix broken include [Robert Postill]
|
36
|
+
|
37
|
+
== 0.3.0 - 2011-02-26
|
38
|
+
* Added text report
|
39
|
+
* Bug fix for missing constants
|
40
|
+
|
41
|
+
== 0.2.1 - 2011-02-19
|
42
|
+
* Proper option parsing
|
43
|
+
|
44
|
+
== 0.2 - 2011-02-14
|
45
|
+
* Added some specs
|
46
|
+
* Improved output
|
47
|
+
* Updated usage message
|
48
|
+
|
49
|
+
== 0.1 - 2011-01-16
|
50
|
+
* Initial release
|
data/README.rdoc
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
= Stepdown
|
2
|
+
Stepdown allows you to see where your most used Cucumber steps are, your unused steps and how they are clustered
|
3
|
+
|
4
|
+
== Statistics available
|
5
|
+
* Total number of scenarios
|
6
|
+
* Total number of steps
|
7
|
+
* Number of empty scenarios (scenarios without any steps)
|
8
|
+
* Number of steps per scenario
|
9
|
+
* Number of unique steps per scenario
|
10
|
+
* Per step
|
11
|
+
* Total usage
|
12
|
+
* Number of scenarios
|
13
|
+
* Usage per scenario
|
14
|
+
* Scenario grouping (number of times used with another step)
|
15
|
+
|
16
|
+
== Installation
|
17
|
+
Stepdown is available as a Ruby gem
|
18
|
+
gem install stepdown
|
19
|
+
|
20
|
+
Or, add the following to your Gemfile
|
21
|
+
gem 'stepdown'
|
22
|
+
|
23
|
+
== Usage
|
24
|
+
From the root folder of your project. This assumes step definitions are in PROJECT_ROOT/features/step_definitions and feature files are in PROJECT_ROOT/features
|
25
|
+
stepdown
|
26
|
+
Or, set the the directory parameters manually
|
27
|
+
stepdown --steps <step definition directory> --features <feature file directory>
|
28
|
+
e.g. stepdown --steps features/step_definitions --features features
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rspec/core/rake_task'
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
|
4
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
5
|
+
t.fail_on_error = false
|
6
|
+
end
|
7
|
+
|
8
|
+
RSpec::Core::RakeTask.new(:coverage) do |t|
|
9
|
+
t.fail_on_error = false
|
10
|
+
t.rcov_opts = %w{ --exclude gems\/,spec\/,features\/}
|
11
|
+
t.rcov = true
|
12
|
+
end
|
13
|
+
|
14
|
+
task :default => :spec
|
data/bin/stepdown
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
lib = File.expand_path('../lib/', __FILE__)
|
3
|
+
$:.unshift lib unless $:.include?(lib)
|
4
|
+
|
5
|
+
require 'stepdown/options'
|
6
|
+
require 'stepdown'
|
7
|
+
|
8
|
+
begin
|
9
|
+
|
10
|
+
options = Stepdown::Options.new
|
11
|
+
options.parse(ARGV)
|
12
|
+
options.validate
|
13
|
+
|
14
|
+
Stepdown.quiet = options.quiet
|
15
|
+
Stepdown.output_directory = options.output_directory
|
16
|
+
|
17
|
+
Stepdown::Analyzer.new(options.steps_dir, options.features_dir, options.reporter).analyse
|
18
|
+
|
19
|
+
rescue Interrupt => e
|
20
|
+
puts "Quiting..."
|
21
|
+
exit 1
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'gherkin/parser/parser'
|
2
|
+
|
3
|
+
module Stepdown
|
4
|
+
class Analyzer
|
5
|
+
def initialize(steps_dir, feature_dir, reporter)
|
6
|
+
@feature_dir = feature_dir
|
7
|
+
@steps_dir = steps_dir
|
8
|
+
@reporter = reporter
|
9
|
+
end
|
10
|
+
|
11
|
+
def analyse
|
12
|
+
scenarios = collect_scenarios
|
13
|
+
|
14
|
+
stats = Statistics.new(scenarios, instance.step_collection)
|
15
|
+
stats.generate
|
16
|
+
|
17
|
+
reporter = reporter(@reporter, stats)
|
18
|
+
reporter.output_overview
|
19
|
+
|
20
|
+
Stepdown::YamlWriter.write(stats)
|
21
|
+
Stepdown::Graph.create_graph
|
22
|
+
end
|
23
|
+
|
24
|
+
def collect_scenarios
|
25
|
+
puts "Parsing feature files..." unless Stepdown.quiet
|
26
|
+
process_feature_files(feature_files)
|
27
|
+
end
|
28
|
+
|
29
|
+
def process_feature_files(feature_files)
|
30
|
+
listener = Stepdown::FeatureParser.new(instance)
|
31
|
+
|
32
|
+
parser = Gherkin::Parser::Parser.new(listener, true, 'root')
|
33
|
+
|
34
|
+
feature_files.each do |feature_file|
|
35
|
+
parser.parse(File.read(feature_file), feature_file, 0)
|
36
|
+
end
|
37
|
+
listener.scenarios
|
38
|
+
end
|
39
|
+
|
40
|
+
def reporter(type, stats)
|
41
|
+
case type
|
42
|
+
when "html"
|
43
|
+
Stepdown::HTMLReporter.new(stats)
|
44
|
+
when "text"
|
45
|
+
Stepdown::TextReporter.new(stats)
|
46
|
+
when "quiet"
|
47
|
+
Stepdown::Reporter.new(stats)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def instance
|
53
|
+
@instance ||= begin
|
54
|
+
new_inst = Stepdown::StepInstance.new
|
55
|
+
|
56
|
+
Dir.glob(step_files).each do |file_name|
|
57
|
+
new_inst.instance_eval File.read(file_name)
|
58
|
+
end
|
59
|
+
new_inst
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
def feature_files
|
65
|
+
return @feature_files if @feature_files
|
66
|
+
@feature_files = Dir.glob(@feature_dir + '/**/*.feature')
|
67
|
+
end
|
68
|
+
|
69
|
+
def step_files
|
70
|
+
return @step_files if @step_files
|
71
|
+
@step_files = Dir.glob(@steps_dir + '/**/*.rb')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'stepdown/step'
|
2
|
+
require 'stepdown/scenario'
|
3
|
+
module Stepdown
|
4
|
+
class FeatureParser
|
5
|
+
|
6
|
+
def initialize(instance)
|
7
|
+
@instance = instance
|
8
|
+
@scenarios = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def scenarios
|
12
|
+
unless @scenarios.last == @current_scenario
|
13
|
+
@scenarios << @current_scenario
|
14
|
+
end
|
15
|
+
@scenarios.compact
|
16
|
+
end
|
17
|
+
|
18
|
+
def background(background)
|
19
|
+
@scenarios << @current_scenario
|
20
|
+
@current_scenario = Scenario.new(background.name)
|
21
|
+
end
|
22
|
+
|
23
|
+
def scenario(scenario)
|
24
|
+
@scenarios << @current_scenario
|
25
|
+
@current_scenario = Scenario.new(scenario.name)
|
26
|
+
end
|
27
|
+
|
28
|
+
def scenario_outline(scenario_outline)
|
29
|
+
@scenarios << @current_scenario
|
30
|
+
@current_scenario = Scenario.new(scenario_outline.name)
|
31
|
+
end
|
32
|
+
|
33
|
+
def step(step)
|
34
|
+
matched_step = @instance.line_matches(step.name)
|
35
|
+
@current_scenario.add_step(matched_step) if matched_step
|
36
|
+
end
|
37
|
+
|
38
|
+
def uri(*args) end
|
39
|
+
|
40
|
+
def feature(*args) end
|
41
|
+
|
42
|
+
def examples(*args) end
|
43
|
+
|
44
|
+
def comment(*args) end
|
45
|
+
|
46
|
+
def tag(*args) end
|
47
|
+
|
48
|
+
def table(*args) end
|
49
|
+
|
50
|
+
def py_string(*args) end
|
51
|
+
|
52
|
+
def eof(*args) end
|
53
|
+
|
54
|
+
def syntax_error(*args)
|
55
|
+
# raise "SYNTAX ERROR"
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'date'
|
3
|
+
module Stepdown
|
4
|
+
class Graph
|
5
|
+
BLUFF_GRAPH_SIZE = "890x400"
|
6
|
+
BLUFF_DEFAULT_OPTIONS = <<-EOS
|
7
|
+
var g = new Bluff.Line('graph', "#{BLUFF_GRAPH_SIZE}");
|
8
|
+
g.theme_37signals();
|
9
|
+
g.tooltips = true;
|
10
|
+
g.title_font_size = "24px"
|
11
|
+
g.legend_font_size = "12px"
|
12
|
+
g.marker_font_size = "10px"
|
13
|
+
EOS
|
14
|
+
|
15
|
+
def self.create_graph
|
16
|
+
stats, labels = collect_stats
|
17
|
+
label_set = {}
|
18
|
+
labels.each_with_index do |label, i|
|
19
|
+
label_set.update({i => label})
|
20
|
+
end
|
21
|
+
|
22
|
+
content = <<-EOS
|
23
|
+
#{BLUFF_DEFAULT_OPTIONS}
|
24
|
+
g.title = 'Stepdown';
|
25
|
+
g.data('Total scenarios', [#{stats[:number_scenarios].join(',')}]);
|
26
|
+
g.data('Total steps', [#{stats[:total_steps].join(',')}]);
|
27
|
+
g.data('Total steps per scenario', [#{stats[:steps_per_scenario].join(',')}]);
|
28
|
+
g.data('Total unused steps', [#{stats[:unused_steps].join(',')}]);
|
29
|
+
g.labels = #{label_set.to_json};
|
30
|
+
g.draw();
|
31
|
+
EOS
|
32
|
+
|
33
|
+
File.open(File.join(Stepdown.output_directory, 'stepdown.js'), 'w') do
|
34
|
+
|f| f << content
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.collect_stats
|
39
|
+
stats = Hash.new {|hsh, key| hsh[key] = [] }
|
40
|
+
labels = []
|
41
|
+
|
42
|
+
load_stats.each do |stat_set|
|
43
|
+
stat_set.each{|key, val| stats[key].push val }
|
44
|
+
labels.push(stat_set[:label])
|
45
|
+
end
|
46
|
+
|
47
|
+
[stats, labels]
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.load_stats
|
51
|
+
stat_collection = []
|
52
|
+
Dir.glob("#{Stepdown.output_directory}/*.yml").sort.each do |file_name|
|
53
|
+
stats = Hash.new {|hsh, key| hsh[key] = [] }
|
54
|
+
file = File.open(file_name)
|
55
|
+
stat_set = YAML::load(file)
|
56
|
+
|
57
|
+
stat_set.each do |key, val|
|
58
|
+
stats[key].push(val)
|
59
|
+
end
|
60
|
+
stats[:label] = date_from_file_name(file_name)
|
61
|
+
stat_collection << stats
|
62
|
+
|
63
|
+
file.close
|
64
|
+
end
|
65
|
+
|
66
|
+
stat_collection
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.date_from_file_name(file_name)
|
70
|
+
label_date = Date.strptime(file_name.match(/(\d+)/)[1], "%Y%m%d")
|
71
|
+
"#{label_date.day} / #{label_date.month}"
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'stepdown/reporter'
|
3
|
+
require 'haml'
|
4
|
+
|
5
|
+
module Stepdown
|
6
|
+
class HTMLReporter < Reporter
|
7
|
+
|
8
|
+
def output_overview()
|
9
|
+
puts "Generating report..." unless Stepdown.quiet
|
10
|
+
FileUtils.mkdir_p(Stepdown.output_directory)
|
11
|
+
copy_files()
|
12
|
+
|
13
|
+
["index", "_empty", "_unused", "_grouping", "_usages"].each { |template| write_html_from_erb(template) }
|
14
|
+
|
15
|
+
puts "\nReport output to #{Stepdown.output_directory}/index.html" unless Stepdown.quiet
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def write_html_from_erb(template)
|
21
|
+
file = File.open(File.expand_path(File.dirname(__FILE__)) + "/../../templates/#{template}.html.erb")
|
22
|
+
erb = ERB.new(file.read())
|
23
|
+
|
24
|
+
file.close
|
25
|
+
out = File.new(Stepdown.output_directory + "/#{template}.html",'w+')
|
26
|
+
out.puts erb.result(binding())
|
27
|
+
out.close
|
28
|
+
end
|
29
|
+
|
30
|
+
def copy_files
|
31
|
+
['step_down.js', 'jquery-1.6.1.min.js', 'bluff-min.js', 'excanvas.js', 'js-class.js', 'stepdown.css'].each do |file|
|
32
|
+
src = File.expand_path("#{File.dirname(__FILE__)}/../../public/#{file}")
|
33
|
+
FileUtils.cp(src, File.join(Stepdown.output_directory, "#{file}"))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
module Stepdown
|
4
|
+
class Options
|
5
|
+
attr_reader :steps_dir, :features_dir, :reporter, :quiet, :output_directory
|
6
|
+
|
7
|
+
OUTPUT_FORMATS = ["html", "text", "quiet"]
|
8
|
+
|
9
|
+
def parse(params)
|
10
|
+
@steps_dir = "features/step_definitions"
|
11
|
+
@features_dir = "features"
|
12
|
+
@reporter = "html"
|
13
|
+
@quiet = false
|
14
|
+
@output_directory = "./stepdown"
|
15
|
+
parser = OptionParser.new do |opts|
|
16
|
+
opts.banner = <<-USE
|
17
|
+
Usage: stepdown
|
18
|
+
stepdown --steps <STEP_DEFINITION_DIRECTORY> --features <FEATURE_FILE_DIRECTORY>
|
19
|
+
USE
|
20
|
+
|
21
|
+
opts.separator("")
|
22
|
+
|
23
|
+
opts.on("--output=TYPE", OUTPUT_FORMATS, "Select ouput format (#{OUTPUT_FORMATS.join(',')}). Default: html") do |o|
|
24
|
+
@reporter = o
|
25
|
+
end
|
26
|
+
|
27
|
+
opts.on("--steps=STEPS_DIR", "Step definition directory. Default: ./features/step_definitions") do |o|
|
28
|
+
@steps_dir = o
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on("--features=FEATURE_DIR", "Feature file directory. Default: ./features") do |o|
|
32
|
+
@features_dir = o
|
33
|
+
end
|
34
|
+
|
35
|
+
opts.on("--quiet", "-q", "Supress output") do |o|
|
36
|
+
@quiet = true
|
37
|
+
end
|
38
|
+
|
39
|
+
opts.on_tail("-h", "--help", "You're looking at it") do |o|
|
40
|
+
puts opts
|
41
|
+
exit
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
begin
|
47
|
+
parser.parse(params)
|
48
|
+
|
49
|
+
rescue OptionParser::ParseError => e
|
50
|
+
puts e
|
51
|
+
exit 1
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def validate(io = STDOUT)
|
56
|
+
@steps_dir = File.join(Dir.pwd, @steps_dir)
|
57
|
+
@features_dir = File.join(Dir.pwd, @features_dir)
|
58
|
+
|
59
|
+
[@steps_dir, @features_dir].each do |dir|
|
60
|
+
unless File.exists?(dir)
|
61
|
+
io.puts "Directory #{dir} does not exist"
|
62
|
+
exit 1
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|