cucumber_spinner 0.1
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/MIT-LICENSE +20 -0
- data/README.rdoc +49 -0
- data/Rakefile +38 -0
- data/VERSION +1 -0
- data/cucumber_spinner.gemspec +47 -0
- data/lib/cucumber_spinner.rb +2 -0
- data/lib/cucumber_spinner/formatted_io.rb +23 -0
- data/lib/cucumber_spinner/progress_bar_formatter.rb +155 -0
- metadata +81 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Henning Koch
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
= CucumberSpinner
|
2
|
+
|
3
|
+
CucumberSpinner is a formatter for Cucumber. It allows you to show the progress
|
4
|
+
of your running features as a progress bar. Failing features are outputted at
|
5
|
+
once, not at the end of your feature run.
|
6
|
+
|
7
|
+
== Installation
|
8
|
+
|
9
|
+
Install the gem with
|
10
|
+
|
11
|
+
sudo gem install cucumber_spinner
|
12
|
+
|
13
|
+
To use the CucumberSpinner formatter, call cucumber with the following command
|
14
|
+
line option:
|
15
|
+
|
16
|
+
--formatter CucumberSpinner::ProgressBarFormatter --require cucumber_spinner
|
17
|
+
|
18
|
+
You might want to use an alias, so for example put this at the end of your
|
19
|
+
.bashrc
|
20
|
+
alias cuc='script/cucumber --formatter CucumberSpinner::ProgressBarFormatter --require cucumber_spinner'
|
21
|
+
and then start your features with
|
22
|
+
cuc features
|
23
|
+
|
24
|
+
Alternatively, you can require 'cucumber_spinner' in your cucumber environment,
|
25
|
+
and modify your config/cucumber.yml.
|
26
|
+
|
27
|
+
|
28
|
+
=== Caveats
|
29
|
+
|
30
|
+
This has only been tested on cucumber 0.8.3 and ruby 1.8.7. Since cucumber does
|
31
|
+
not expose every information we need (like the total number of steps) cleanly,
|
32
|
+
this might easily break for other cucumber versions.
|
33
|
+
|
34
|
+
There are currently no tests either.
|
35
|
+
|
36
|
+
|
37
|
+
=== Credits
|
38
|
+
|
39
|
+
Licensed under the MIT License.
|
40
|
+
|
41
|
+
The Gem is inspired and based on nofxx's RSpecSpinner gem
|
42
|
+
(http://github.com/nofxx/rspec_spinner), which is in turn based on the Advanced Progress Bar by Nicholas A. Evans.
|
43
|
+
|
44
|
+
|
45
|
+
Written by Tobias Kraze
|
46
|
+
|
47
|
+
{makandra.com}[http://makandra.com/]
|
48
|
+
|
49
|
+
{gem-session.com}[http://gem-session.com/]
|
data/Rakefile
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/rdoctask'
|
3
|
+
require 'spec/rake/spectask'
|
4
|
+
|
5
|
+
desc 'Default: Run all specs.'
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
desc "Run all specs"
|
9
|
+
Spec::Rake::SpecTask.new() do |t|
|
10
|
+
t.spec_opts = ['--options', "\"spec/support/spec.opts\""]
|
11
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'Generate documentation for the cucumber_spinner gem.'
|
15
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'mail_magnet'
|
18
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
19
|
+
rdoc.rdoc_files.include('README')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
begin
|
24
|
+
require 'jeweler'
|
25
|
+
Jeweler::Tasks.new do |gemspec|
|
26
|
+
gemspec.name = "cucumber_spinner"
|
27
|
+
gemspec.version = '0.1'
|
28
|
+
gemspec.summary = "Progress bar formatter for cucumber, shows failing scenarios immediately."
|
29
|
+
gemspec.email = "tobias.kraze@makandra.de"
|
30
|
+
gemspec.homepage = "http://github.com/makandra/cucumber_spinner"
|
31
|
+
gemspec.description = "Formatter for cucumber like the RSpecSpinner for RSpec. Shows a progress bar on the command line and prints failing scenarios immediately."
|
32
|
+
gemspec.authors = ["Tobias Kraze"]
|
33
|
+
gemspec.add_dependency('rtui', '>=0.2.2')
|
34
|
+
end
|
35
|
+
rescue LoadError
|
36
|
+
puts "Jeweler not available. Install it with: sudo gem install jeweler"
|
37
|
+
end
|
38
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{cucumber_spinner}
|
8
|
+
s.version = "0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Tobias Kraze"]
|
12
|
+
s.date = %q{2010-07-28}
|
13
|
+
s.description = %q{Formatter for cucumber like the RSpecSpinner for RSpec. Shows a progress bar on the command line and prints failing scenarios immediately.}
|
14
|
+
s.email = %q{tobias.kraze@makandra.de}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.rdoc"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"MIT-LICENSE",
|
20
|
+
"README.rdoc",
|
21
|
+
"Rakefile",
|
22
|
+
"VERSION",
|
23
|
+
"cucumber_spinner.gemspec",
|
24
|
+
"lib/cucumber_spinner.rb",
|
25
|
+
"lib/cucumber_spinner/formatted_io.rb",
|
26
|
+
"lib/cucumber_spinner/progress_bar_formatter.rb"
|
27
|
+
]
|
28
|
+
s.homepage = %q{http://github.com/makandra/cucumber_spinner}
|
29
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
30
|
+
s.require_paths = ["lib"]
|
31
|
+
s.rubygems_version = %q{1.3.6}
|
32
|
+
s.summary = %q{Progress bar formatter for cucumber, shows failing scenarios immediately.}
|
33
|
+
|
34
|
+
if s.respond_to? :specification_version then
|
35
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
36
|
+
s.specification_version = 3
|
37
|
+
|
38
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
39
|
+
s.add_runtime_dependency(%q<rtui>, [">= 0.2.2"])
|
40
|
+
else
|
41
|
+
s.add_dependency(%q<rtui>, [">= 0.2.2"])
|
42
|
+
end
|
43
|
+
else
|
44
|
+
s.add_dependency(%q<rtui>, [">= 0.2.2"])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'cucumber/formatter/console'
|
2
|
+
|
3
|
+
module CucumberSpinner
|
4
|
+
|
5
|
+
class FormattedIo
|
6
|
+
include Cucumber::Formatter::Console
|
7
|
+
|
8
|
+
attr_writer :status
|
9
|
+
|
10
|
+
def initialize(io)
|
11
|
+
@io = io
|
12
|
+
end
|
13
|
+
|
14
|
+
def print(string)
|
15
|
+
@io.print(format_string(string, @status))
|
16
|
+
end
|
17
|
+
|
18
|
+
def method_missing(method_name, *args)
|
19
|
+
@io.send(method_name, *args)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'cucumber/formatter/io'
|
2
|
+
require 'cucumber/formatter/pretty'
|
3
|
+
require 'rtui'
|
4
|
+
|
5
|
+
module CucumberSpinner
|
6
|
+
|
7
|
+
class ProgressBarFormatter
|
8
|
+
include Cucumber::Formatter::Io
|
9
|
+
|
10
|
+
attr_reader :step_mother
|
11
|
+
|
12
|
+
def initialize(step_mother, path_or_io, options)
|
13
|
+
@step_mother, @io, @options = step_mother, ensure_io(path_or_io, "progress"), options
|
14
|
+
@error_state = :passed
|
15
|
+
@coloured_io = FormattedIo.new(@io)
|
16
|
+
@coloured_io.status = @error_state
|
17
|
+
@pretty_printer_io = StringIO.new
|
18
|
+
@pretty_printer = Cucumber::Formatter::Pretty.new(step_mother, @pretty_printer_io, options)
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def before_features(features)
|
23
|
+
@current = 0
|
24
|
+
@total = get_step_count(features)
|
25
|
+
@progress_bar = RTUI::Progress.new("#{@total} steps", @total, {:out => @coloured_io})
|
26
|
+
end
|
27
|
+
|
28
|
+
def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
|
29
|
+
increment
|
30
|
+
|
31
|
+
case status
|
32
|
+
when :pending: pending!
|
33
|
+
when :failed:
|
34
|
+
failed!
|
35
|
+
print_scenario
|
36
|
+
when :undefined:
|
37
|
+
undefined!
|
38
|
+
print_scenario
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def after_features(features)
|
43
|
+
@io.puts
|
44
|
+
@io.puts
|
45
|
+
clear_pretty_output
|
46
|
+
@pretty_printer.after_features(features)
|
47
|
+
print_pretty_output
|
48
|
+
end
|
49
|
+
|
50
|
+
def before_feature_element(feature_element)
|
51
|
+
clear_pretty_output
|
52
|
+
@pretty_printer.before_feature_element(feature_element)
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.delegate_to_pretty_printer(*methods)
|
56
|
+
methods.each do |method|
|
57
|
+
define_method(method) do |*args|
|
58
|
+
@pretty_printer.send(method, *args)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
delegate_to_pretty_printer :before_feature, :comment_line, :after_tags, :tag_name, :feature_name, :after_feature_element, :before_background, :after_background, :background_name, :before_examples_array, :examples_name, :before_outline_table, :after_outline_table, :scenario_name, :before_step, :before_step_result, :step_name, :py_string, :exception, :before_multiline_arg, :after_multiline_arg, :before_table_row, :after_table_row, :after_table_cell, :table_cell_value
|
63
|
+
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def clear_pretty_output
|
68
|
+
@pretty_printer_io.truncate(0)
|
69
|
+
end
|
70
|
+
|
71
|
+
def print_pretty_output
|
72
|
+
@io.print @pretty_printer_io.string
|
73
|
+
end
|
74
|
+
|
75
|
+
def print_scenario
|
76
|
+
erase_current_line
|
77
|
+
print_pretty_output
|
78
|
+
@io.puts
|
79
|
+
end
|
80
|
+
|
81
|
+
def erase_current_line
|
82
|
+
@io.print "\e[K"
|
83
|
+
end
|
84
|
+
|
85
|
+
def increment
|
86
|
+
with_color do
|
87
|
+
@current += 1
|
88
|
+
# HACK: need to make sure the progress is printed, even when the bar hasn't changed
|
89
|
+
@progress_bar.instance_variable_set("@previous", 0)
|
90
|
+
@progress_bar.instance_variable_set("@title", "#{@current}/#{@total}")
|
91
|
+
@progress_bar.inc
|
92
|
+
end
|
93
|
+
@io.flush
|
94
|
+
end
|
95
|
+
|
96
|
+
# stolen from the html formatter
|
97
|
+
def get_step_count(features)
|
98
|
+
count = 0
|
99
|
+
features = features.instance_variable_get("@features")
|
100
|
+
features.each do |feature|
|
101
|
+
#get background steps
|
102
|
+
if feature.instance_variable_get("@background")
|
103
|
+
background = feature.instance_variable_get("@background")
|
104
|
+
background.init
|
105
|
+
background_steps = background.instance_variable_get("@steps").instance_variable_get("@steps")
|
106
|
+
count += background_steps.size
|
107
|
+
end
|
108
|
+
#get scenarios
|
109
|
+
feature.instance_variable_get("@feature_elements").each do |scenario|
|
110
|
+
scenario.init
|
111
|
+
#get steps
|
112
|
+
steps = scenario.instance_variable_get("@steps").instance_variable_get("@steps")
|
113
|
+
count += steps.size
|
114
|
+
|
115
|
+
#get example table
|
116
|
+
examples = scenario.instance_variable_get("@examples_array")
|
117
|
+
unless examples.nil?
|
118
|
+
examples.each do |example|
|
119
|
+
example_matrix = example.instance_variable_get("@outline_table").instance_variable_get("@cell_matrix")
|
120
|
+
count += example_matrix.size
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
#get multiline step tables
|
125
|
+
steps.each do |step|
|
126
|
+
multi_arg = step.instance_variable_get("@multiline_arg")
|
127
|
+
next if multi_arg.nil?
|
128
|
+
matrix = multi_arg.instance_variable_get("@cell_matrix")
|
129
|
+
count += matrix.size unless matrix.nil?
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
return count
|
134
|
+
end
|
135
|
+
|
136
|
+
def pending!
|
137
|
+
@error_state = :pending if @error_state == :passed
|
138
|
+
end
|
139
|
+
|
140
|
+
def undefined!
|
141
|
+
@error_state = :undefined unless @error_state == :failed
|
142
|
+
end
|
143
|
+
|
144
|
+
def failed!
|
145
|
+
@error_state = :failed
|
146
|
+
end
|
147
|
+
|
148
|
+
def with_color
|
149
|
+
@coloured_io.status = @error_state
|
150
|
+
yield
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cucumber_spinner
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
version: "0.1"
|
9
|
+
platform: ruby
|
10
|
+
authors:
|
11
|
+
- Tobias Kraze
|
12
|
+
autorequire:
|
13
|
+
bindir: bin
|
14
|
+
cert_chain: []
|
15
|
+
|
16
|
+
date: 2010-07-28 00:00:00 +02:00
|
17
|
+
default_executable:
|
18
|
+
dependencies:
|
19
|
+
- !ruby/object:Gem::Dependency
|
20
|
+
name: rtui
|
21
|
+
prerelease: false
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
segments:
|
27
|
+
- 0
|
28
|
+
- 2
|
29
|
+
- 2
|
30
|
+
version: 0.2.2
|
31
|
+
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
description: Formatter for cucumber like the RSpecSpinner for RSpec. Shows a progress bar on the command line and prints failing scenarios immediately.
|
34
|
+
email: tobias.kraze@makandra.de
|
35
|
+
executables: []
|
36
|
+
|
37
|
+
extensions: []
|
38
|
+
|
39
|
+
extra_rdoc_files:
|
40
|
+
- README.rdoc
|
41
|
+
files:
|
42
|
+
- MIT-LICENSE
|
43
|
+
- README.rdoc
|
44
|
+
- Rakefile
|
45
|
+
- VERSION
|
46
|
+
- cucumber_spinner.gemspec
|
47
|
+
- lib/cucumber_spinner.rb
|
48
|
+
- lib/cucumber_spinner/formatted_io.rb
|
49
|
+
- lib/cucumber_spinner/progress_bar_formatter.rb
|
50
|
+
has_rdoc: true
|
51
|
+
homepage: http://github.com/makandra/cucumber_spinner
|
52
|
+
licenses: []
|
53
|
+
|
54
|
+
post_install_message:
|
55
|
+
rdoc_options:
|
56
|
+
- --charset=UTF-8
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
segments:
|
64
|
+
- 0
|
65
|
+
version: "0"
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
segments:
|
71
|
+
- 0
|
72
|
+
version: "0"
|
73
|
+
requirements: []
|
74
|
+
|
75
|
+
rubyforge_project:
|
76
|
+
rubygems_version: 1.3.6
|
77
|
+
signing_key:
|
78
|
+
specification_version: 3
|
79
|
+
summary: Progress bar formatter for cucumber, shows failing scenarios immediately.
|
80
|
+
test_files: []
|
81
|
+
|