aslakhellesoy-cucumber 0.2.0.2 → 0.2.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -1
- data/Manifest.txt +1 -1
- data/examples/self_test/features/tons_of_cukes.feature +52 -0
- data/features/cucumber_cli.feature +1 -1
- data/features/custom_formatter.feature +2 -2
- data/features/usage.feature +49 -0
- data/lib/autotest/cucumber_mixin.rb +1 -1
- data/lib/cucumber/ast/feature.rb +1 -1
- data/lib/cucumber/ast/features.rb +6 -0
- data/lib/cucumber/ast/step.rb +4 -0
- data/lib/cucumber/ast/step_invocation.rb +5 -1
- data/lib/cucumber/ast/table.rb +4 -0
- data/lib/cucumber/cli/configuration.rb +5 -2
- data/lib/cucumber/cli/main.rb +14 -14
- data/lib/cucumber/formatter/html.rb +47 -8
- data/lib/cucumber/formatter/pretty.rb +1 -2
- data/lib/cucumber/step_definition.rb +65 -50
- data/lib/cucumber/step_match.rb +1 -1
- data/lib/cucumber/version.rb +1 -1
- data/rails_generators/feature/templates/steps.erb +1 -1
- data/spec/cucumber/ast/feature_spec.rb +2 -1
- data/spec/cucumber/cli/configuration_spec.rb +15 -3
- data/spec/cucumber/parser/feature_parser_spec.rb +15 -15
- data/spec/cucumber/step_definition_spec.rb +20 -0
- metadata +3 -3
- data/gem_tasks/jar.rake +0 -67
data/History.txt
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
== 0.2.1 (In Git)
|
2
2
|
|
3
3
|
== Bugfixes
|
4
|
+
* HTML Formatter doesn't work correctly with scenario Outlines. (#260 Aslak Hellesøy)
|
4
5
|
* After blocks are run in reverse order of registration. (#113 Aslak Hellesøy)
|
5
6
|
* Snippets are showing 'Ands' (#249 Aslak Hellesøy)
|
6
7
|
|
7
8
|
=== New features
|
8
|
-
*
|
9
|
+
* Snippets use a regexp and block arguments if the step name has "quoted" arguments. (Aslak Hellesøy)
|
10
|
+
* Cucumber::Ast::Feature#to_sexp includes the file name. (Aslak Hellesøy)
|
11
|
+
* support/env.rb is not loaded when --dry-run is specified. This is to increase performance. (Aslak Hellesøy)
|
12
|
+
* New usage formatter. This is the foundation for editor autocompletion and navigation between steps and step definitions. (#209 Aslak Hellesøy)
|
9
13
|
|
10
14
|
=== Removed features
|
11
15
|
* -S/--step-definitions option introduced in 0.2.0 is removed. Use --format usage [--dry-run] [--no-color].
|
data/Manifest.txt
CHANGED
@@ -158,6 +158,7 @@ examples/self_test/features/sample.feature
|
|
158
158
|
examples/self_test/features/step_definitions/sample_steps.rb
|
159
159
|
examples/self_test/features/support/env.rb
|
160
160
|
examples/self_test/features/support/tag_count_formatter.rb
|
161
|
+
examples/self_test/features/tons_of_cukes.feature
|
161
162
|
examples/sinatra/Rakefile
|
162
163
|
examples/sinatra/app.rb
|
163
164
|
examples/sinatra/features/add.feature
|
@@ -206,7 +207,6 @@ gem_tasks/features.rake
|
|
206
207
|
gem_tasks/fix_cr_lf.rake
|
207
208
|
gem_tasks/flog.rake
|
208
209
|
gem_tasks/gemspec.rake
|
209
|
-
gem_tasks/jar.rake
|
210
210
|
gem_tasks/rspec.rake
|
211
211
|
gem_tasks/yard.rake
|
212
212
|
lib/autotest/cucumber.rb
|
@@ -0,0 +1,52 @@
|
|
1
|
+
@lots
|
2
|
+
Feature: Tons of cukes
|
3
|
+
Scenario: Lots and lots
|
4
|
+
Given '2' cukes
|
5
|
+
Given '2' cukes
|
6
|
+
Given '2' cukes
|
7
|
+
Given '2' cukes
|
8
|
+
Given '2' cukes
|
9
|
+
Given '2' cukes
|
10
|
+
Given '2' cukes
|
11
|
+
Given '2' cukes
|
12
|
+
Given '2' cukes
|
13
|
+
Given '2' cukes
|
14
|
+
Given '2' cukes
|
15
|
+
Given '2' cukes
|
16
|
+
Given '2' cukes
|
17
|
+
Given '2' cukes
|
18
|
+
Given '2' cukes
|
19
|
+
Given '2' cukes
|
20
|
+
Given '2' cukes
|
21
|
+
Given '2' cukes
|
22
|
+
Given '2' cukes
|
23
|
+
Given '2' cukes
|
24
|
+
Given '2' cukes
|
25
|
+
Given '2' cukes
|
26
|
+
Given '2' cukes
|
27
|
+
Given '2' cukes
|
28
|
+
Given '2' cukes
|
29
|
+
Given '2' cukes
|
30
|
+
Given '2' cukes
|
31
|
+
Given '2' cukes
|
32
|
+
Given '2' cukes
|
33
|
+
Given '2' cukes
|
34
|
+
Given '2' cukes
|
35
|
+
Given '2' cukes
|
36
|
+
Given '2' cukes
|
37
|
+
Given '2' cukes
|
38
|
+
Given '2' cukes
|
39
|
+
Given '2' cukes
|
40
|
+
Given '2' cukes
|
41
|
+
Given '2' cukes
|
42
|
+
Given '2' cukes
|
43
|
+
Given '2' cukes
|
44
|
+
Given '2' cukes
|
45
|
+
Given '2' cukes
|
46
|
+
Given '2' cukes
|
47
|
+
Given '2' cukes
|
48
|
+
Given '2' cukes
|
49
|
+
Given '2' cukes
|
50
|
+
Given '2' cukes
|
51
|
+
Given '2' cukes
|
52
|
+
Given '2' cukes
|
@@ -166,7 +166,7 @@ Feature: Cucumber command line
|
|
166
166
|
"""
|
167
167
|
|
168
168
|
Scenario: --dry-run
|
169
|
-
When I run cucumber --dry-run --no-snippets features/*.feature
|
169
|
+
When I run cucumber --dry-run --no-snippets features/*.feature --tags ~@lots
|
170
170
|
Then it should pass with
|
171
171
|
"""
|
172
172
|
Feature: Calling undefined step
|
data/features/usage.feature
CHANGED
@@ -22,6 +22,55 @@ Feature: Cucumber command line
|
|
22
22
|
And '10' cukes # features/background/failing_background.feature:5
|
23
23
|
Given '10' cukes # features/background/passing_background.feature:4
|
24
24
|
Given '10' cukes # features/background/scenario_outline_passing_background.feature:4
|
25
|
+
Given '2' cukes # features/tons_of_cukes.feature:4
|
26
|
+
Given '2' cukes # features/tons_of_cukes.feature:5
|
27
|
+
Given '2' cukes # features/tons_of_cukes.feature:6
|
28
|
+
Given '2' cukes # features/tons_of_cukes.feature:7
|
29
|
+
Given '2' cukes # features/tons_of_cukes.feature:8
|
30
|
+
Given '2' cukes # features/tons_of_cukes.feature:9
|
31
|
+
Given '2' cukes # features/tons_of_cukes.feature:10
|
32
|
+
Given '2' cukes # features/tons_of_cukes.feature:11
|
33
|
+
Given '2' cukes # features/tons_of_cukes.feature:12
|
34
|
+
Given '2' cukes # features/tons_of_cukes.feature:13
|
35
|
+
Given '2' cukes # features/tons_of_cukes.feature:14
|
36
|
+
Given '2' cukes # features/tons_of_cukes.feature:15
|
37
|
+
Given '2' cukes # features/tons_of_cukes.feature:16
|
38
|
+
Given '2' cukes # features/tons_of_cukes.feature:17
|
39
|
+
Given '2' cukes # features/tons_of_cukes.feature:18
|
40
|
+
Given '2' cukes # features/tons_of_cukes.feature:19
|
41
|
+
Given '2' cukes # features/tons_of_cukes.feature:20
|
42
|
+
Given '2' cukes # features/tons_of_cukes.feature:21
|
43
|
+
Given '2' cukes # features/tons_of_cukes.feature:22
|
44
|
+
Given '2' cukes # features/tons_of_cukes.feature:23
|
45
|
+
Given '2' cukes # features/tons_of_cukes.feature:24
|
46
|
+
Given '2' cukes # features/tons_of_cukes.feature:25
|
47
|
+
Given '2' cukes # features/tons_of_cukes.feature:26
|
48
|
+
Given '2' cukes # features/tons_of_cukes.feature:27
|
49
|
+
Given '2' cukes # features/tons_of_cukes.feature:28
|
50
|
+
Given '2' cukes # features/tons_of_cukes.feature:29
|
51
|
+
Given '2' cukes # features/tons_of_cukes.feature:30
|
52
|
+
Given '2' cukes # features/tons_of_cukes.feature:31
|
53
|
+
Given '2' cukes # features/tons_of_cukes.feature:32
|
54
|
+
Given '2' cukes # features/tons_of_cukes.feature:33
|
55
|
+
Given '2' cukes # features/tons_of_cukes.feature:34
|
56
|
+
Given '2' cukes # features/tons_of_cukes.feature:35
|
57
|
+
Given '2' cukes # features/tons_of_cukes.feature:36
|
58
|
+
Given '2' cukes # features/tons_of_cukes.feature:37
|
59
|
+
Given '2' cukes # features/tons_of_cukes.feature:38
|
60
|
+
Given '2' cukes # features/tons_of_cukes.feature:39
|
61
|
+
Given '2' cukes # features/tons_of_cukes.feature:40
|
62
|
+
Given '2' cukes # features/tons_of_cukes.feature:41
|
63
|
+
Given '2' cukes # features/tons_of_cukes.feature:42
|
64
|
+
Given '2' cukes # features/tons_of_cukes.feature:43
|
65
|
+
Given '2' cukes # features/tons_of_cukes.feature:44
|
66
|
+
Given '2' cukes # features/tons_of_cukes.feature:45
|
67
|
+
Given '2' cukes # features/tons_of_cukes.feature:46
|
68
|
+
Given '2' cukes # features/tons_of_cukes.feature:47
|
69
|
+
Given '2' cukes # features/tons_of_cukes.feature:48
|
70
|
+
Given '2' cukes # features/tons_of_cukes.feature:49
|
71
|
+
Given '2' cukes # features/tons_of_cukes.feature:50
|
72
|
+
Given '2' cukes # features/tons_of_cukes.feature:51
|
73
|
+
Given '2' cukes # features/tons_of_cukes.feature:52
|
25
74
|
/^I should have '(.+)' cukes$/ # features/step_definitions/sample_steps.rb:31
|
26
75
|
Then I should have '10' cukes # features/background/failing_background.feature:8
|
27
76
|
Then I should have '10' cukes # features/background/failing_background.feature:11
|
data/lib/cucumber/ast/feature.rb
CHANGED
data/lib/cucumber/ast/step.rb
CHANGED
@@ -78,6 +78,10 @@ module Cucumber
|
|
78
78
|
@file_colon_line ||= @feature_element.file_colon_line(@line) unless @feature_element.nil?
|
79
79
|
end
|
80
80
|
|
81
|
+
def dom_id
|
82
|
+
@dom_id ||= file_colon_line.gsub(/\//, '_').gsub(/\./, '_').gsub(/:/, '_')
|
83
|
+
end
|
84
|
+
|
81
85
|
private
|
82
86
|
|
83
87
|
def matched_cells(cells)
|
@@ -28,7 +28,7 @@ module Cucumber
|
|
28
28
|
unless @skip_invoke || options[:dry_run] || exception || @step_collection.exception
|
29
29
|
@skip_invoke = true
|
30
30
|
begin
|
31
|
-
step_mother.current_world.__cucumber_current_step = self
|
31
|
+
step_mother.current_world.__cucumber_current_step = self if step_mother.current_world # Nil in Pure Java
|
32
32
|
@step_match.invoke(step_mother.current_world, @multiline_arg)
|
33
33
|
status!(:passed)
|
34
34
|
rescue Pending => e
|
@@ -102,6 +102,10 @@ module Cucumber
|
|
102
102
|
@step.file_colon_line
|
103
103
|
end
|
104
104
|
|
105
|
+
def dom_id
|
106
|
+
@step.dom_id
|
107
|
+
end
|
108
|
+
|
105
109
|
def backtrace_line
|
106
110
|
@step.backtrace_line
|
107
111
|
end
|
data/lib/cucumber/ast/table.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module Cli
|
3
3
|
class YmlLoadError < StandardError; end
|
4
|
-
|
4
|
+
|
5
5
|
class Configuration
|
6
6
|
FORMATS = %w{pretty profile progress rerun}
|
7
7
|
DEFAULT_FORMAT = 'pretty'
|
@@ -95,6 +95,7 @@ module Cucumber
|
|
95
95
|
Term::ANSIColor.coloring = v
|
96
96
|
end
|
97
97
|
opts.on("-d", "--dry-run", "Invokes formatters without executing the steps.",
|
98
|
+
"This also omits the loading of your support/env.rb file if it exists.",
|
98
99
|
"Implies --quiet.") do
|
99
100
|
@options[:dry_run] = true
|
100
101
|
@quiet = true
|
@@ -236,7 +237,9 @@ module Cucumber
|
|
236
237
|
end.flatten.uniq
|
237
238
|
sorted_files = files.sort { |a,b| (b =~ %r{/support/} || -1) <=> (a =~ %r{/support/} || -1) }.reject{|f| f =~ /^http/}
|
238
239
|
env_files = sorted_files.select {|f| f =~ %r{/support/env.rb} }
|
239
|
-
env_files + sorted_files.reject {|f| f =~ %r{/support/env.rb} }
|
240
|
+
files = env_files + sorted_files.reject {|f| f =~ %r{/support/env.rb} }
|
241
|
+
files.reject! {|f| f =~ %r{/support/env.rb} } if @options[:dry_run]
|
242
|
+
files
|
240
243
|
end
|
241
244
|
|
242
245
|
def feature_files
|
data/lib/cucumber/cli/main.rb
CHANGED
@@ -46,7 +46,18 @@ module Cucumber
|
|
46
46
|
Kernel.exit(failure ? 1 : 0)
|
47
47
|
end
|
48
48
|
|
49
|
-
|
49
|
+
def load_plain_text_features
|
50
|
+
features = Ast::Features.new
|
51
|
+
parser = Parser::FeatureParser.new
|
52
|
+
|
53
|
+
verbose_log("Features:")
|
54
|
+
configuration.feature_files.each do |f|
|
55
|
+
features.add_feature(parser.parse_file(f))
|
56
|
+
verbose_log(" * #{f}")
|
57
|
+
end
|
58
|
+
verbose_log("\n"*2)
|
59
|
+
features
|
60
|
+
end
|
50
61
|
|
51
62
|
def configuration
|
52
63
|
return @configuration if @configuration
|
@@ -55,6 +66,8 @@ module Cucumber
|
|
55
66
|
@configuration.parse!(@args)
|
56
67
|
@configuration
|
57
68
|
end
|
69
|
+
|
70
|
+
private
|
58
71
|
|
59
72
|
def require_files
|
60
73
|
verbose_log("Ruby files required:")
|
@@ -70,19 +83,6 @@ module Cucumber
|
|
70
83
|
verbose_log("\n")
|
71
84
|
end
|
72
85
|
|
73
|
-
def load_plain_text_features
|
74
|
-
features = Ast::Features.new
|
75
|
-
parser = Parser::FeatureParser.new
|
76
|
-
|
77
|
-
verbose_log("Features:")
|
78
|
-
configuration.feature_files.each do |f|
|
79
|
-
features.add_feature(parser.parse_file(f))
|
80
|
-
verbose_log(" * #{f}")
|
81
|
-
end
|
82
|
-
verbose_log("\n"*2)
|
83
|
-
features
|
84
|
-
end
|
85
|
-
|
86
86
|
def verbose_log(string)
|
87
87
|
@out_stream.puts(string) if configuration.verbose?
|
88
88
|
end
|
@@ -83,37 +83,73 @@ module Cucumber
|
|
83
83
|
@builder.h4("#{keyword} #{name}")
|
84
84
|
end
|
85
85
|
|
86
|
-
def visit_steps(
|
86
|
+
def visit_steps(steps)
|
87
87
|
@builder.ol do
|
88
88
|
super
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
+
def visit_step(step)
|
93
|
+
@step_id = step.dom_id
|
94
|
+
@builder.li(:id => @step_id) do
|
95
|
+
super
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
92
99
|
def visit_step_name(keyword, step_match, status, source_indent, background)
|
93
|
-
|
94
|
-
@
|
100
|
+
@step_matches ||= []
|
101
|
+
@skip_step = @step_matches.index(step_match)
|
102
|
+
@step_matches << step_match
|
103
|
+
|
104
|
+
unless @skip_step
|
105
|
+
step_name = step_match.format_args(lambda{|param| "<span>#{param}</span>"})
|
106
|
+
@builder.div(:class => status) do |div|
|
107
|
+
div << "#{keyword} #{step_name}"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def visit_exception(exception, status)
|
113
|
+
@builder.pre(format_exception(e), :class => status)
|
95
114
|
end
|
96
115
|
|
97
116
|
def visit_multiline_arg(multiline_arg)
|
117
|
+
return if @skip_step
|
98
118
|
if Ast::Table === multiline_arg
|
99
119
|
@builder.table do
|
100
120
|
super
|
101
121
|
end
|
102
122
|
else
|
103
|
-
|
104
|
-
|
105
|
-
|
123
|
+
super
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def visit_py_string(string, status)
|
128
|
+
@builder.pre(:class => status) do |pre|
|
129
|
+
pre << string
|
106
130
|
end
|
107
131
|
end
|
108
132
|
|
109
133
|
def visit_table_row(table_row)
|
110
|
-
@
|
134
|
+
@row_id = table_row.dom_id
|
135
|
+
@col_index = 0
|
136
|
+
@builder.tr(:id => @row_id) do
|
111
137
|
super
|
112
138
|
end
|
139
|
+
if table_row.exception
|
140
|
+
@builder.tr do
|
141
|
+
@builder.td(:colspan => @col_index.to_s, :class => 'failed') do
|
142
|
+
@builder.pre do |pre|
|
143
|
+
pre << format_exception(table_row.exception)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
113
148
|
end
|
114
149
|
|
115
150
|
def visit_table_cell_value(value, width, status)
|
116
|
-
@builder.td(value, :class => status)
|
151
|
+
@builder.td(value, :class => status, :id => "#{@row_id}_#{@col_index}")
|
152
|
+
@col_index += 1
|
117
153
|
end
|
118
154
|
|
119
155
|
def announce(announcement)
|
@@ -128,6 +164,9 @@ module Cucumber
|
|
128
164
|
end
|
129
165
|
end
|
130
166
|
|
167
|
+
def format_exception(exception)
|
168
|
+
(["#{exception.message} (#{exception.class})"] + exception.backtrace).join("\n")
|
169
|
+
end
|
131
170
|
end
|
132
171
|
end
|
133
172
|
end
|
@@ -121,16 +121,15 @@ module Cucumber
|
|
121
121
|
|
122
122
|
def visit_step_name(keyword, step_match, status, source_indent, background)
|
123
123
|
@step_matches ||= []
|
124
|
-
|
125
124
|
non_failed_background_step_outside_background = !@in_background && background && (status != :failed)
|
126
125
|
@skip_step = @step_matches.index(step_match) || non_failed_background_step_outside_background
|
126
|
+
@step_matches << step_match
|
127
127
|
|
128
128
|
unless(@skip_step)
|
129
129
|
source_indent = nil unless @options[:source]
|
130
130
|
formatted_step_name = format_step(keyword, step_match, status, source_indent)
|
131
131
|
@io.puts(" " + formatted_step_name)
|
132
132
|
end
|
133
|
-
@step_matches << step_match
|
134
133
|
end
|
135
134
|
|
136
135
|
def visit_multiline_arg(multiline_arg)
|
@@ -3,6 +3,50 @@ require 'cucumber/core_ext/string'
|
|
3
3
|
require 'cucumber/core_ext/proc'
|
4
4
|
|
5
5
|
module Cucumber
|
6
|
+
module StepDefinitionMethods
|
7
|
+
def step_match(name_to_match, name_to_report)
|
8
|
+
if(match = name_to_match.match(regexp))
|
9
|
+
StepMatch.new(self, name_to_match, name_to_report, match.captures)
|
10
|
+
else
|
11
|
+
nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Formats the matched arguments of the associated Step. This method
|
16
|
+
# is usually called from visitors, which render output.
|
17
|
+
#
|
18
|
+
# The +format+ can either be a String or a Proc.
|
19
|
+
#
|
20
|
+
# If it is a String it should be a format string according to
|
21
|
+
# <tt>Kernel#sprinf</tt>, for example:
|
22
|
+
#
|
23
|
+
# '<span class="param">%s</span></tt>'
|
24
|
+
#
|
25
|
+
# If it is a Proc, it should take one argument and return the formatted
|
26
|
+
# argument, for example:
|
27
|
+
#
|
28
|
+
# lambda { |param| "[#{param}]" }
|
29
|
+
#
|
30
|
+
def format_args(step_name, format)
|
31
|
+
step_name.gzub(regexp, format)
|
32
|
+
end
|
33
|
+
|
34
|
+
def match(step_name)
|
35
|
+
case step_name
|
36
|
+
when String then regexp.match(step_name)
|
37
|
+
when Regexp then regexp == step_name
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def backtrace_line
|
42
|
+
"#{file_colon_line}:in `#{regexp.inspect}'"
|
43
|
+
end
|
44
|
+
|
45
|
+
def text_length
|
46
|
+
regexp.inspect.jlength
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
6
50
|
# A Step Definition holds a Regexp and a Proc, and is created
|
7
51
|
# by calling <tt>Given</tt>, <tt>When</tt> or <tt>Then</tt>
|
8
52
|
# in the <tt>step_definitions</tt> ruby files - for example:
|
@@ -14,7 +58,22 @@ module Cucumber
|
|
14
58
|
class StepDefinition
|
15
59
|
def self.snippet_text(step_keyword, step_name)
|
16
60
|
escaped = Regexp.escape(step_name).gsub('\ ', ' ').gsub('/', '\/')
|
17
|
-
|
61
|
+
param_pattern = /"([^\"]*)"/
|
62
|
+
|
63
|
+
match = escaped.match(param_pattern)
|
64
|
+
if match
|
65
|
+
n = 0
|
66
|
+
block_args = match.captures.map do |a|
|
67
|
+
n += 1
|
68
|
+
"arg#{n}"
|
69
|
+
end
|
70
|
+
block_arg_string = " |#{block_args.join(", ")}|"
|
71
|
+
else
|
72
|
+
block_arg_string = ""
|
73
|
+
end
|
74
|
+
|
75
|
+
escaped = escaped.gsub(param_pattern, '"([^\\"]*)"')
|
76
|
+
"#{step_keyword} /^#{escaped}$/ do#{block_arg_string}\n pending\nend"
|
18
77
|
end
|
19
78
|
|
20
79
|
class MissingProc < StandardError
|
@@ -23,7 +82,7 @@ module Cucumber
|
|
23
82
|
end
|
24
83
|
end
|
25
84
|
|
26
|
-
|
85
|
+
include StepDefinitionMethods
|
27
86
|
|
28
87
|
def initialize(pattern, &proc)
|
29
88
|
raise MissingProc if proc.nil?
|
@@ -34,66 +93,22 @@ module Cucumber
|
|
34
93
|
@regexp, @proc = pattern, proc
|
35
94
|
end
|
36
95
|
|
37
|
-
def
|
38
|
-
|
39
|
-
StepMatch.new(self, name_to_match, name_to_report, match.captures)
|
40
|
-
else
|
41
|
-
nil
|
42
|
-
end
|
96
|
+
def regexp
|
97
|
+
@regexp
|
43
98
|
end
|
44
99
|
|
45
|
-
def invoke(world, args
|
100
|
+
def invoke(world, args)
|
46
101
|
args = args.map{|arg| Ast::PyString === arg ? arg.to_s : arg}
|
47
102
|
begin
|
48
|
-
world.cucumber_instance_exec(true,
|
103
|
+
world.cucumber_instance_exec(true, regexp.inspect, *args, &@proc)
|
49
104
|
rescue Cucumber::ArityMismatchError => e
|
50
105
|
e.backtrace.unshift(self.backtrace_line)
|
51
106
|
raise e
|
52
107
|
end
|
53
108
|
end
|
54
109
|
|
55
|
-
#:stopdoc:
|
56
|
-
|
57
|
-
def match(step_name)
|
58
|
-
case step_name
|
59
|
-
when String then @regexp.match(step_name)
|
60
|
-
when Regexp then @regexp == step_name
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
# Formats the matched arguments of the associated Step. This method
|
65
|
-
# is usually called from visitors, which render output.
|
66
|
-
#
|
67
|
-
# The +format+ can either be a String or a Proc.
|
68
|
-
#
|
69
|
-
# If it is a String it should be a format string according to
|
70
|
-
# <tt>Kernel#sprinf</tt>, for example:
|
71
|
-
#
|
72
|
-
# '<span class="param">%s</span></tt>'
|
73
|
-
#
|
74
|
-
# If it is a Proc, it should take one argument and return the formatted
|
75
|
-
# argument, for example:
|
76
|
-
#
|
77
|
-
# lambda { |param| "[#{param}]" }
|
78
|
-
#
|
79
|
-
def format_args(step_name, format)
|
80
|
-
step_name.gzub(@regexp, format)
|
81
|
-
end
|
82
|
-
|
83
|
-
def matched_args(step_name)
|
84
|
-
step_name.match(@regexp).captures
|
85
|
-
end
|
86
|
-
|
87
|
-
def backtrace_line
|
88
|
-
"#{file_colon_line}:in `#{@regexp.inspect}'"
|
89
|
-
end
|
90
|
-
|
91
110
|
def file_colon_line
|
92
111
|
@proc.file_colon_line
|
93
112
|
end
|
94
|
-
|
95
|
-
def text_length
|
96
|
-
@regexp.inspect.jlength
|
97
|
-
end
|
98
113
|
end
|
99
114
|
end
|
data/lib/cucumber/step_match.rb
CHANGED
@@ -10,7 +10,7 @@ module Cucumber
|
|
10
10
|
def invoke(world, multiline_arg)
|
11
11
|
all_args = @args.dup
|
12
12
|
all_args << multiline_arg if multiline_arg
|
13
|
-
@step_definition.invoke(world, all_args
|
13
|
+
@step_definition.invoke(world, all_args)
|
14
14
|
end
|
15
15
|
|
16
16
|
def format_args(format = lambda{|a| a})
|
data/lib/cucumber/version.rb
CHANGED
@@ -10,7 +10,7 @@ When /^I delete the (\d+)(?:st|nd|rd|th) <%= singular_name %>$/ do |pos|
|
|
10
10
|
end
|
11
11
|
|
12
12
|
Then /^I should see the following <%= plural_name %>:$/ do |<%= plural_name %>|
|
13
|
-
<%= plural_name %>.
|
13
|
+
<%= plural_name %>.rows.each_with_index do |row, i|
|
14
14
|
row.each_with_index do |cell, j|
|
15
15
|
response.should have_selector("table > tr:nth-child(#{i+2}) > td:nth-child(#{j+1})") { |td|
|
16
16
|
td.inner_text.should == cell
|
@@ -9,7 +9,8 @@ module Cucumber
|
|
9
9
|
it "should convert to sexp" do
|
10
10
|
feature = create_feature(Object.new)
|
11
11
|
feature.to_sexp.should ==
|
12
|
-
[:feature,
|
12
|
+
[:feature,
|
13
|
+
"features/pretty_printing.feature",
|
13
14
|
"Pretty printing",
|
14
15
|
[:comment, "# My feature comment\n"],
|
15
16
|
[:tag, "one"],
|
@@ -18,7 +18,7 @@ module Cli
|
|
18
18
|
it "should require files in support paths first" do
|
19
19
|
File.stub!(:directory?).and_return(true)
|
20
20
|
Dir.stub!(:[]).and_return(["/features/step_definitions/foo.rb","/features/support/bar.rb"])
|
21
|
-
|
21
|
+
|
22
22
|
config = Configuration.new(StringIO.new)
|
23
23
|
config.parse!(%w{--require /features})
|
24
24
|
|
@@ -31,7 +31,7 @@ module Cli
|
|
31
31
|
it "should require env.rb files first" do
|
32
32
|
File.stub!(:directory?).and_return(true)
|
33
33
|
Dir.stub!(:[]).and_return(["/features/support/a_file.rb","/features/support/env.rb"])
|
34
|
-
|
34
|
+
|
35
35
|
config = Configuration.new(StringIO.new)
|
36
36
|
config.parse!(%w{--require /features})
|
37
37
|
|
@@ -40,7 +40,19 @@ module Cli
|
|
40
40
|
"/features/support/a_file.rb"
|
41
41
|
]
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
|
+
it "should not require env.rb files when --dry-run" do
|
45
|
+
File.stub!(:directory?).and_return(true)
|
46
|
+
Dir.stub!(:[]).and_return(["/features/support/a_file.rb","/features/support/env.rb"])
|
47
|
+
|
48
|
+
config = Configuration.new(StringIO.new)
|
49
|
+
config.parse!(%w{--require /features --dry-run})
|
50
|
+
|
51
|
+
config.files_to_require.should == [
|
52
|
+
"/features/support/a_file.rb"
|
53
|
+
]
|
54
|
+
end
|
55
|
+
|
44
56
|
it "should expand args from YAML file" do
|
45
57
|
given_cucumber_yml_defined_as({'bongo' => '--require from/yml'})
|
46
58
|
|
@@ -33,7 +33,7 @@ with blurb
|
|
33
33
|
parse(%{# My comment
|
34
34
|
Feature: hi
|
35
35
|
}).to_sexp.should ==
|
36
|
-
[:feature, "Feature: hi\n",
|
36
|
+
[:feature, nil, "Feature: hi\n",
|
37
37
|
[:comment, "# My comment\n"]]
|
38
38
|
end
|
39
39
|
|
@@ -45,7 +45,7 @@ Feature: hi
|
|
45
45
|
# When bar
|
46
46
|
Then baz
|
47
47
|
}).to_sexp.should ==
|
48
|
-
[:feature, "Feature: Hi",
|
48
|
+
[:feature, nil, "Feature: Hi",
|
49
49
|
[:scenario, 2, "Scenario:", "Hello",
|
50
50
|
[:step, 3, "Given", "foo"],
|
51
51
|
[:comment, "# When bar\n"],
|
@@ -59,18 +59,18 @@ Feature: hi
|
|
59
59
|
# World
|
60
60
|
Feature: hi
|
61
61
|
}).to_sexp.should ==
|
62
|
-
[:feature, "Feature: hi\n",
|
62
|
+
[:feature, nil, "Feature: hi\n",
|
63
63
|
[:comment, "# Hello\n# World\n"]]
|
64
64
|
end
|
65
65
|
|
66
66
|
it "should parse a file with no comments" do
|
67
67
|
parse("Feature: hi\n").to_sexp.should ==
|
68
|
-
[:feature, "Feature: hi\n"]
|
68
|
+
[:feature, nil, "Feature: hi\n"]
|
69
69
|
end
|
70
70
|
|
71
71
|
it "should parse a file with only a multiline comment with newlines" do
|
72
72
|
parse("# Hello\n\n# World\n").to_sexp.should ==
|
73
|
-
[:feature, "",
|
73
|
+
[:feature, nil, "",
|
74
74
|
[:comment, "# Hello\n\n# World\n"]]
|
75
75
|
end
|
76
76
|
end
|
@@ -78,7 +78,7 @@ Feature: hi
|
|
78
78
|
describe "Tags" do
|
79
79
|
it "should parse a file with tags on a feature" do
|
80
80
|
parse("# My comment\n@hello @world Feature: hi\n").to_sexp.should ==
|
81
|
-
[:feature, "Feature: hi\n",
|
81
|
+
[:feature, nil, "Feature: hi\n",
|
82
82
|
[:comment, "# My comment\n"],
|
83
83
|
[:tag, "hello"],
|
84
84
|
[:tag, "world"]]
|
@@ -96,7 +96,7 @@ Feature: hi
|
|
96
96
|
@st3
|
97
97
|
@st4 @ST5 @#^%&ST6**!
|
98
98
|
Scenario: Second}).to_sexp.should ==
|
99
|
-
[:feature, "Feature: hi",
|
99
|
+
[:feature, nil, "Feature: hi",
|
100
100
|
[:comment, "# FC\n "],
|
101
101
|
[:tag, "ft"],
|
102
102
|
[:scenario, 6, 'Scenario:', 'First',
|
@@ -111,7 +111,7 @@ Feature: hi
|
|
111
111
|
describe "Background" do
|
112
112
|
it "should have steps" do
|
113
113
|
parse("Feature: Hi\nBackground:\nGiven I am a step\n").to_sexp.should ==
|
114
|
-
[:feature, "Feature: Hi",
|
114
|
+
[:feature, nil, "Feature: Hi",
|
115
115
|
[:background, 2, "Background:",
|
116
116
|
[:step, 3, "Given", "I am a step"]]]
|
117
117
|
end
|
@@ -120,7 +120,7 @@ Feature: hi
|
|
120
120
|
describe "Scenarios" do
|
121
121
|
it "can be empty" do
|
122
122
|
parse("Feature: Hi\n\nScenario: Hello\n").to_sexp.should ==
|
123
|
-
[:feature, "Feature: Hi",
|
123
|
+
[:feature, nil, "Feature: Hi",
|
124
124
|
[:scenario, 3, "Scenario:", "Hello"]]
|
125
125
|
end
|
126
126
|
|
@@ -134,7 +134,7 @@ Scenario: bar
|
|
134
134
|
|
135
135
|
it "should have steps" do
|
136
136
|
parse("Feature: Hi\nScenario: Hello\nGiven I am a step\n").to_sexp.should ==
|
137
|
-
[:feature, "Feature: Hi",
|
137
|
+
[:feature, nil, "Feature: Hi",
|
138
138
|
[:scenario, 2, "Scenario:", "Hello",
|
139
139
|
[:step_invocation, 3, "Given", "I am a step"]]]
|
140
140
|
end
|
@@ -145,7 +145,7 @@ Scenario: Hello
|
|
145
145
|
Given I have a table
|
146
146
|
|a|b|
|
147
147
|
}).to_sexp.should ==
|
148
|
-
[:feature, "Feature: Hi",
|
148
|
+
[:feature, nil, "Feature: Hi",
|
149
149
|
[:scenario, 2, "Scenario:", "Hello",
|
150
150
|
[:step_invocation, 3, "Given", "I have a table",
|
151
151
|
[:table,
|
@@ -166,7 +166,7 @@ Given I have a string
|
|
166
166
|
"""
|
167
167
|
|
168
168
|
}).to_sexp.should ==
|
169
|
-
[:feature, "Feature: Hi",
|
169
|
+
[:feature, nil, "Feature: Hi",
|
170
170
|
[:scenario, 2, "Scenario:", "Hello",
|
171
171
|
[:step_invocation, 3, "Given", "I have a string",
|
172
172
|
[:py_string, "hello\nworld"]]]]
|
@@ -182,7 +182,7 @@ Examples:
|
|
182
182
|
|what|
|
183
183
|
|green|
|
184
184
|
}).to_sexp.should ==
|
185
|
-
[:feature, "Feature: Hi",
|
185
|
+
[:feature, nil, "Feature: Hi",
|
186
186
|
[:scenario_outline, "Scenario Outline:", "Hello",
|
187
187
|
[:step, 3, "Given", "a <what> cucumber"],
|
188
188
|
[:examples, "Examples:", "",
|
@@ -203,7 +203,7 @@ Examples:
|
|
203
203
|
|a|b|
|
204
204
|
|c|d|
|
205
205
|
}).to_sexp.should ==
|
206
|
-
[:feature, "Feature: Hi",
|
206
|
+
[:feature, nil, "Feature: Hi",
|
207
207
|
[:scenario_outline, "Scenario Outline:", "Hello",
|
208
208
|
[:step, 4, "Given", "I have a table",
|
209
209
|
[:table,
|
@@ -233,7 +233,7 @@ Examples:
|
|
233
233
|
|5|6|
|
234
234
|
|
235
235
|
").to_sexp.should ==
|
236
|
-
[:feature, "Feature: Hi",
|
236
|
+
[:feature, nil, "Feature: Hi",
|
237
237
|
[:scenario_outline, "Scenario Outline:", "Hello",
|
238
238
|
[:step, 5, "Given", "I have a table",
|
239
239
|
[:table,
|
@@ -69,5 +69,25 @@ module Cucumber
|
|
69
69
|
end
|
70
70
|
step_match("Loud").invoke(world, nil)
|
71
71
|
end
|
72
|
+
|
73
|
+
def unindented(s)
|
74
|
+
s.split("\n")[1..-2].join("\n").indent(-8)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should recognise quotes in name and make according regexp" do
|
78
|
+
StepDefinition.snippet_text('Given', 'A "first" arg').should == unindented(%{
|
79
|
+
Given /^A "([^\\"]*)" arg$/ do |arg1|
|
80
|
+
pending
|
81
|
+
end
|
82
|
+
})
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should not use quote group when there are no quotes" do
|
86
|
+
StepDefinition.snippet_text('Given', 'A first arg').should == unindented(%{
|
87
|
+
Given /^A first arg$/ do
|
88
|
+
pending
|
89
|
+
end
|
90
|
+
})
|
91
|
+
end
|
72
92
|
end
|
73
93
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aslakhellesoy-cucumber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.0.
|
4
|
+
version: 0.2.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Aslak Helles\xC3\xB8y"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-03-
|
12
|
+
date: 2009-03-24 00:00:00 -07:00
|
13
13
|
default_executable: cucumber
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -245,6 +245,7 @@ files:
|
|
245
245
|
- examples/self_test/features/step_definitions/sample_steps.rb
|
246
246
|
- examples/self_test/features/support/env.rb
|
247
247
|
- examples/self_test/features/support/tag_count_formatter.rb
|
248
|
+
- examples/self_test/features/tons_of_cukes.feature
|
248
249
|
- examples/sinatra/Rakefile
|
249
250
|
- examples/sinatra/app.rb
|
250
251
|
- examples/sinatra/features/add.feature
|
@@ -293,7 +294,6 @@ files:
|
|
293
294
|
- gem_tasks/fix_cr_lf.rake
|
294
295
|
- gem_tasks/flog.rake
|
295
296
|
- gem_tasks/gemspec.rake
|
296
|
-
- gem_tasks/jar.rake
|
297
297
|
- gem_tasks/rspec.rake
|
298
298
|
- gem_tasks/yard.rake
|
299
299
|
- lib/autotest/cucumber.rb
|
data/gem_tasks/jar.rake
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
# http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar
|
2
|
-
|
3
|
-
USE_JRUBY_VERSION = '1.1.6'
|
4
|
-
USE_JBEHAVE_VERSION = '2.1'
|
5
|
-
USE_JUNIT_VERSION = '4.5'
|
6
|
-
USE_HAMCREST_VERSION = '1.1'
|
7
|
-
CUCUMBER_VERSIONED = "cucumber-#{Cucumber::VERSION::STRING}"
|
8
|
-
|
9
|
-
task :jar => [
|
10
|
-
:clean,
|
11
|
-
'jar:download_jruby',
|
12
|
-
'jar:install_gems',
|
13
|
-
'jar:bundle_gems',
|
14
|
-
'jar:download_jars_deps',
|
15
|
-
'jar:unpack_jar_deps',
|
16
|
-
'jar:bundle_jars',
|
17
|
-
'jar:fix_gem_binaries',
|
18
|
-
'jar:test_jar'
|
19
|
-
]
|
20
|
-
|
21
|
-
namespace :jar do
|
22
|
-
task :download_jruby do
|
23
|
-
sh "wget http://dist.codehaus.org/jruby/#{USE_JRUBY_VERSION}/jruby-complete-#{USE_JRUBY_VERSION}.jar -O #{CUCUMBER_VERSIONED}.jar"
|
24
|
-
end
|
25
|
-
|
26
|
-
task :install_gems => :gem do
|
27
|
-
mkdir 'pkg/jar_gems'
|
28
|
-
sh "java -jar #{CUCUMBER_VERSIONED}.jar -S gem install -i ./pkg/jar_gems pkg/#{CUCUMBER_VERSIONED}.gem --no-ri --no-rdoc"
|
29
|
-
end
|
30
|
-
|
31
|
-
task :bundle_gems do
|
32
|
-
sh "jar uf #{CUCUMBER_VERSIONED}.jar -C pkg/jar_gems ."
|
33
|
-
end
|
34
|
-
|
35
|
-
task :download_jars_deps do
|
36
|
-
mkdir 'pkg/jar_deps'
|
37
|
-
sh "wget http://repository.codehaus.org/org/jbehave/jbehave-core/#{USE_JBEHAVE_VERSION}/jbehave-core-#{USE_JBEHAVE_VERSION}.jar -O pkg/jar_deps/jbehave-core-#{USE_JBEHAVE_VERSION}.jar"
|
38
|
-
sh "wget http://mirrors.ibiblio.org/pub/mirrors/maven2/junit/junit/#{USE_JUNIT_VERSION}/junit-#{USE_JUNIT_VERSION}.jar -O pkg/jar_deps/junit-#{USE_JUNIT_VERSION}.jar"
|
39
|
-
sh "wget http://hamcrest.googlecode.com/files/hamcrest-all-#{USE_HAMCREST_VERSION}.jar -O pkg/jar_deps/hamcrest-all-#{USE_HAMCREST_VERSION}.jar"
|
40
|
-
end
|
41
|
-
|
42
|
-
task :unpack_jar_deps do
|
43
|
-
Dir.chdir 'pkg/jar_deps' do
|
44
|
-
Dir['*.jar'].each do |jar|
|
45
|
-
sh "jar xvf #{jar}"
|
46
|
-
rm_rf jar
|
47
|
-
rm_rf 'META-INF'
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
task :bundle_jars do
|
53
|
-
sh "jar uf #{CUCUMBER_VERSIONED}.jar -C pkg/jar_deps ."
|
54
|
-
end
|
55
|
-
|
56
|
-
task :fix_gem_binaries do
|
57
|
-
mkdir_p 'pkg/gem_binaries/META-INF/jruby.home'
|
58
|
-
Dir.chdir 'pkg/gem_binaries/META-INF/jruby.home' do
|
59
|
-
sh "jar xvf ../../../../#{CUCUMBER_VERSIONED}.jar bin"
|
60
|
-
end
|
61
|
-
sh "jar uf #{CUCUMBER_VERSIONED}.jar -C pkg/gem_binaries ."
|
62
|
-
end
|
63
|
-
|
64
|
-
task :test_jar do
|
65
|
-
sh "java -cp examples/jbehave/target/classes -jar #{CUCUMBER_VERSIONED}.jar -S cucumber examples/jbehave/features"
|
66
|
-
end
|
67
|
-
end
|