cucumber 0.3.102 → 0.3.103
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/History.txt +18 -0
- data/Manifest.txt +6 -2
- data/examples/java/README.textile +3 -3
- data/examples/self_test/features/sample.feature +1 -1
- data/examples/self_test/features/search_sample.feature +1 -1
- data/features/custom_formatter.feature +4 -4
- data/features/steps_formatter.feature +2 -1
- data/lib/cucumber/ast.rb +1 -0
- data/lib/cucumber/ast/table.rb +4 -4
- data/lib/cucumber/ast/tree_walker.rb +185 -0
- data/lib/cucumber/ast/visitor.rb +2 -106
- data/lib/cucumber/cli/configuration.rb +28 -28
- data/lib/cucumber/cli/language_help_formatter.rb +5 -7
- data/lib/cucumber/cli/main.rb +3 -3
- data/lib/cucumber/core_ext/string.rb +0 -22
- data/lib/cucumber/formatter/html.rb +203 -113
- data/lib/cucumber/formatter/junit.rb +29 -23
- data/lib/cucumber/formatter/pdf.rb +74 -69
- data/lib/cucumber/formatter/pretty.rb +93 -78
- data/lib/cucumber/formatter/profile.rb +2 -2
- data/lib/cucumber/formatter/progress.rb +16 -10
- data/lib/cucumber/formatter/rerun.rb +4 -5
- data/lib/cucumber/formatter/steps.rb +6 -7
- data/lib/cucumber/formatter/tag_cloud.rb +7 -6
- data/lib/cucumber/formatter/usage.rb +7 -10
- data/lib/cucumber/language_support/step_definition_methods.rb +4 -4
- data/lib/cucumber/rails/action_controller.rb +1 -1
- data/lib/cucumber/rails/active_record.rb +27 -14
- data/lib/cucumber/rb_support/rb_language.rb +5 -0
- data/lib/cucumber/rb_support/rb_step_definition.rb +9 -16
- data/lib/cucumber/rb_support/regexp_argument_matcher.rb +21 -0
- data/lib/cucumber/step_argument.rb +9 -0
- data/lib/cucumber/step_match.rb +24 -5
- data/lib/cucumber/version.rb +1 -1
- data/rails_generators/cucumber/templates/env.rb +14 -0
- data/spec/cucumber/ast/background_spec.rb +1 -2
- data/spec/cucumber/ast/scenario_outline_spec.rb +3 -2
- data/spec/cucumber/ast/scenario_spec.rb +1 -1
- data/spec/cucumber/ast/tree_walker_spec.rb +18 -0
- data/spec/cucumber/formatter/html_spec.rb +221 -2
- data/spec/cucumber/formatter/progress_spec.rb +9 -4
- data/spec/cucumber/parser/feature_parser_spec.rb +31 -27
- data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +18 -0
- data/spec/cucumber/step_match_spec.rb +40 -0
- metadata +8 -4
- data/lib/cucumber/rb_support/rb_group.rb +0 -11
- data/spec/cucumber/core_ext/string_spec.rb +0 -41
data/History.txt
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
== 2009-09-24
|
2
|
+
|
3
|
+
This release gives you back some of the control over the Rails environment that was accidentally taken away from you in the
|
4
|
+
previous release.
|
5
|
+
|
6
|
+
Using this release on a Rails project requires a rerun of script/generate cucumber.
|
7
|
+
|
8
|
+
=== New Features
|
9
|
+
* Added a new @no-txn tag to selectively turn off transactions for a particlular scenario.
|
10
|
+
* Added back a way to globally turn off transactions.
|
11
|
+
* Renamed @allow_rescue tag to @allow-rescue.
|
12
|
+
|
13
|
+
=== Bugfixes
|
14
|
+
* Gracefully handle cases when optional regexp groups are not matched. Ex: /should( not)? be flashed '([^']*?)'$/ (Aslak Hellesøy)
|
15
|
+
|
16
|
+
=== Changed Features
|
17
|
+
* The Formatter API has completely changed. Formatters are no longer a double-dispacth visitor - just a single-dispatch listener (#438 Matt Wynne)
|
18
|
+
|
1
19
|
== 2009-09-22
|
2
20
|
|
3
21
|
This release has some changes in the Rails support, so make sure you run "script/generate cucumber" after you upgrade.
|
data/Manifest.txt
CHANGED
@@ -329,6 +329,7 @@ lib/cucumber/ast/step_collection.rb
|
|
329
329
|
lib/cucumber/ast/step_invocation.rb
|
330
330
|
lib/cucumber/ast/table.rb
|
331
331
|
lib/cucumber/ast/tags.rb
|
332
|
+
lib/cucumber/ast/tree_walker.rb
|
332
333
|
lib/cucumber/ast/visitor.rb
|
333
334
|
lib/cucumber/broadcaster.rb
|
334
335
|
lib/cucumber/cli/configuration.rb
|
@@ -385,13 +386,14 @@ lib/cucumber/rails/test_unit.rb
|
|
385
386
|
lib/cucumber/rails/world.rb
|
386
387
|
lib/cucumber/rake/task.rb
|
387
388
|
lib/cucumber/rb_support/rb_dsl.rb
|
388
|
-
lib/cucumber/rb_support/rb_group.rb
|
389
389
|
lib/cucumber/rb_support/rb_hook.rb
|
390
390
|
lib/cucumber/rb_support/rb_language.rb
|
391
391
|
lib/cucumber/rb_support/rb_step_definition.rb
|
392
392
|
lib/cucumber/rb_support/rb_transform.rb
|
393
393
|
lib/cucumber/rb_support/rb_world.rb
|
394
|
+
lib/cucumber/rb_support/regexp_argument_matcher.rb
|
394
395
|
lib/cucumber/rspec_neuter.rb
|
396
|
+
lib/cucumber/step_argument.rb
|
395
397
|
lib/cucumber/step_match.rb
|
396
398
|
lib/cucumber/step_mother.rb
|
397
399
|
lib/cucumber/version.rb
|
@@ -420,6 +422,7 @@ spec/cucumber/ast/scenario_spec.rb
|
|
420
422
|
spec/cucumber/ast/step_collection_spec.rb
|
421
423
|
spec/cucumber/ast/step_spec.rb
|
422
424
|
spec/cucumber/ast/table_spec.rb
|
425
|
+
spec/cucumber/ast/tree_walker_spec.rb
|
423
426
|
spec/cucumber/broadcaster_spec.rb
|
424
427
|
spec/cucumber/cli/configuration_spec.rb
|
425
428
|
spec/cucumber/cli/drb_client_spec.rb
|
@@ -427,7 +430,6 @@ spec/cucumber/cli/main_spec.rb
|
|
427
430
|
spec/cucumber/cli/options_spec.rb
|
428
431
|
spec/cucumber/cli/profile_loader_spec.rb
|
429
432
|
spec/cucumber/core_ext/proc_spec.rb
|
430
|
-
spec/cucumber/core_ext/string_spec.rb
|
431
433
|
spec/cucumber/formatter/ansicolor_spec.rb
|
432
434
|
spec/cucumber/formatter/color_io_spec.rb
|
433
435
|
spec/cucumber/formatter/duration_spec.rb
|
@@ -436,7 +438,9 @@ spec/cucumber/formatter/progress_spec.rb
|
|
436
438
|
spec/cucumber/parser/feature_parser_spec.rb
|
437
439
|
spec/cucumber/parser/table_parser_spec.rb
|
438
440
|
spec/cucumber/rb_support/rb_step_definition_spec.rb
|
441
|
+
spec/cucumber/rb_support/regexp_argument_matcher_spec.rb
|
439
442
|
spec/cucumber/sell_cucumbers.feature
|
443
|
+
spec/cucumber/step_match_spec.rb
|
440
444
|
spec/cucumber/step_mother_spec.rb
|
441
445
|
spec/cucumber/treetop_parser/empty_feature.feature
|
442
446
|
spec/cucumber/treetop_parser/empty_scenario.feature
|
@@ -11,8 +11,8 @@ h2. Running the scenarios
|
|
11
11
|
|
12
12
|
Open a shell in this directory (java) and execute the following command:
|
13
13
|
|
14
|
-
<pre
|
15
|
-
ant
|
16
|
-
</code></pre>
|
14
|
+
<pre>ant</pre>
|
17
15
|
|
18
16
|
There is a deliberate error. See if you can fix it!
|
17
|
+
|
18
|
+
Also see "Cuke4Duke":http://wiki.github.com/aslakhellesoy/cuke4duke for more powerful JVM and Java support for Cucumber.
|
@@ -8,7 +8,7 @@ Feature: Custom Formatter
|
|
8
8
|
| 1 | 1 | 1 | 1 | 1 | 2 | 1 | 2 | 1 | 2 | 1 |
|
9
9
|
|
10
10
|
"""
|
11
|
-
|
11
|
+
|
12
12
|
Scenario: my own formatter
|
13
13
|
Given a standard Cucumber project directory structure
|
14
14
|
And a file named "features/f.feature" with:
|
@@ -25,13 +25,13 @@ Feature: Custom Formatter
|
|
25
25
|
And a file named "features/support/ze/formator.rb" with:
|
26
26
|
"""
|
27
27
|
module Ze
|
28
|
-
class Formator
|
28
|
+
class Formator
|
29
29
|
def initialize(step_mother, io, options)
|
30
|
-
|
30
|
+
@step_mother = step_mother
|
31
31
|
@io = io
|
32
32
|
end
|
33
33
|
|
34
|
-
def
|
34
|
+
def scenario_name(keyword, name, file_colon_line, source_indent)
|
35
35
|
@io.puts "$ #{name.upcase}"
|
36
36
|
end
|
37
37
|
end
|
@@ -8,7 +8,8 @@ Feature: --formatter steps option - Steps Formatter
|
|
8
8
|
|
9
9
|
Scenario: Printing steps
|
10
10
|
When I run cucumber -f steps features
|
11
|
-
Then
|
11
|
+
Then STDERR should be empty
|
12
|
+
And it should pass with
|
12
13
|
"""
|
13
14
|
features/step_definitions/steps_lib1.rb
|
14
15
|
/^I defined a first step$/ # features/step_definitions/steps_lib1.rb:1
|
data/lib/cucumber/ast.rb
CHANGED
@@ -13,6 +13,7 @@ require 'cucumber/ast/py_string'
|
|
13
13
|
require 'cucumber/ast/outline_table'
|
14
14
|
require 'cucumber/ast/examples'
|
15
15
|
require 'cucumber/ast/visitor'
|
16
|
+
require 'cucumber/ast/tree_walker'
|
16
17
|
|
17
18
|
module Cucumber
|
18
19
|
# Classes in this module represent the Abstract Syntax Tree (AST)
|
data/lib/cucumber/ast/table.rb
CHANGED
@@ -389,11 +389,11 @@ module Cucumber
|
|
389
389
|
|
390
390
|
c = Term::ANSIColor.coloring?
|
391
391
|
Term::ANSIColor.coloring = options[:color]
|
392
|
-
|
393
|
-
|
394
|
-
|
392
|
+
formatter = Formatter::Pretty.new(nil, io, options)
|
393
|
+
formatter.instance_variable_set('@indent', options[:indent])
|
394
|
+
TreeWalker.new(nil, [formatter]).visit_multiline_arg(self)
|
395
|
+
|
395
396
|
Term::ANSIColor.coloring = c
|
396
|
-
|
397
397
|
io.rewind
|
398
398
|
s = "\n" + io.read + (" " * (options[:indent] - 2))
|
399
399
|
s
|
@@ -0,0 +1,185 @@
|
|
1
|
+
module Cucumber
|
2
|
+
module Ast
|
3
|
+
# Walks the AST, executing steps and notifying listeners
|
4
|
+
class TreeWalker
|
5
|
+
attr_accessor :options #:nodoc:
|
6
|
+
attr_reader :step_mother #:nodoc:
|
7
|
+
|
8
|
+
def initialize(step_mother, listeners = [], options = {}, io = STDOUT)
|
9
|
+
@step_mother, @listeners, @options, @io = step_mother, listeners, options, io
|
10
|
+
end
|
11
|
+
|
12
|
+
def visit_features(features)
|
13
|
+
warn "The listener(s) (#{deprecated_listeners.map{ |l| l.class }}) appear to support the legacy Ast::Visitor interface, which is no longer supported." if deprecated_listeners.any?
|
14
|
+
broadcast(features) do
|
15
|
+
features.accept(self)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def visit_feature(feature)
|
20
|
+
broadcast(feature) do
|
21
|
+
feature.accept(self)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def visit_comment(comment)
|
26
|
+
broadcast(comment) do
|
27
|
+
comment.accept(self)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def visit_comment_line(comment_line)
|
32
|
+
broadcast(comment_line)
|
33
|
+
end
|
34
|
+
|
35
|
+
def visit_tags(tags)
|
36
|
+
broadcast(tags) do
|
37
|
+
tags.accept(self)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def visit_tag_name(tag_name)
|
42
|
+
broadcast(tag_name)
|
43
|
+
end
|
44
|
+
|
45
|
+
def visit_feature_name(name)
|
46
|
+
broadcast(name)
|
47
|
+
end
|
48
|
+
|
49
|
+
# +feature_element+ is either Scenario or ScenarioOutline
|
50
|
+
def visit_feature_element(feature_element)
|
51
|
+
broadcast(feature_element) do
|
52
|
+
feature_element.accept(self)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def visit_background(background)
|
57
|
+
broadcast(background) do
|
58
|
+
background.accept(self)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def visit_background_name(keyword, name, file_colon_line, source_indent)
|
63
|
+
broadcast(keyword, name, file_colon_line, source_indent)
|
64
|
+
end
|
65
|
+
|
66
|
+
def visit_examples_array(examples_array)
|
67
|
+
broadcast(examples_array) do
|
68
|
+
examples_array.accept(self)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def visit_examples(examples)
|
73
|
+
broadcast(examples) do
|
74
|
+
examples.accept(self)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def visit_examples_name(keyword, name)
|
79
|
+
broadcast(keyword, name)
|
80
|
+
end
|
81
|
+
|
82
|
+
def visit_outline_table(outline_table)
|
83
|
+
broadcast(outline_table) do
|
84
|
+
outline_table.accept(self)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def visit_scenario_name(keyword, name, file_colon_line, source_indent)
|
89
|
+
broadcast(keyword, name, file_colon_line, source_indent)
|
90
|
+
end
|
91
|
+
|
92
|
+
def visit_steps(steps)
|
93
|
+
broadcast(steps) do
|
94
|
+
steps.accept(self)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def visit_step(step)
|
99
|
+
broadcast(step) do
|
100
|
+
step.accept(self)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
|
105
|
+
broadcast(keyword, step_match, multiline_arg, status, exception, source_indent, background) do
|
106
|
+
visit_step_name(keyword, step_match, status, source_indent, background)
|
107
|
+
visit_multiline_arg(multiline_arg) if multiline_arg
|
108
|
+
visit_exception(exception, status) if exception
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def visit_step_name(keyword, step_match, status, source_indent, background) #:nodoc:
|
113
|
+
broadcast(keyword, step_match, status, source_indent, background)
|
114
|
+
end
|
115
|
+
|
116
|
+
def visit_multiline_arg(multiline_arg) #:nodoc:
|
117
|
+
broadcast(multiline_arg) do
|
118
|
+
multiline_arg.accept(self)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def visit_exception(exception, status) #:nodoc:
|
123
|
+
broadcast(exception, status)
|
124
|
+
end
|
125
|
+
|
126
|
+
def visit_py_string(string)
|
127
|
+
broadcast(string)
|
128
|
+
end
|
129
|
+
|
130
|
+
def visit_table_row(table_row)
|
131
|
+
broadcast(table_row) do
|
132
|
+
table_row.accept(self)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def visit_table_cell(table_cell)
|
137
|
+
broadcast(table_cell) do
|
138
|
+
table_cell.accept(self)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def visit_table_cell_value(value, status)
|
143
|
+
broadcast(value, status)
|
144
|
+
end
|
145
|
+
|
146
|
+
# Print +announcement+. This method can be called from within StepDefinitions.
|
147
|
+
def announce(announcement)
|
148
|
+
broadcast(announcement)
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
|
153
|
+
def broadcast(*args, &block)
|
154
|
+
message = extract_method_name_from(caller)
|
155
|
+
message.gsub!('visit_', '')
|
156
|
+
|
157
|
+
unless block_given?
|
158
|
+
send_to_all(message, *args)
|
159
|
+
return
|
160
|
+
end
|
161
|
+
|
162
|
+
send_to_all("before_#{message}", *args)
|
163
|
+
yield if block_given?
|
164
|
+
send_to_all("after_#{message}", *args)
|
165
|
+
end
|
166
|
+
|
167
|
+
def send_to_all(message, *args)
|
168
|
+
@listeners.each do |listener|
|
169
|
+
if listener.respond_to?(message)
|
170
|
+
listener.__send__(message, *args)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def extract_method_name_from(call_stack)
|
176
|
+
call_stack[0].match(/in `(.*)'/).captures[0]
|
177
|
+
end
|
178
|
+
|
179
|
+
def deprecated_listeners
|
180
|
+
@listeners.select{ |l| l.respond_to?(:visit_features) }
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
data/lib/cucumber/ast/visitor.rb
CHANGED
@@ -1,115 +1,11 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module Ast
|
3
|
-
# Base class for formatters. This class just walks the tree depth first.
|
4
|
-
# Just override the methods you care about. Remember to call super if you
|
5
|
-
# override a method.
|
6
3
|
class Visitor
|
7
|
-
|
8
|
-
attr_reader :step_mother #:nodoc:
|
4
|
+
DEPRECATION_WARNING = "Cucumber::Ast::Visitor is deprecated and will be removed. You no longer need to inherit from this class."
|
9
5
|
|
10
6
|
def initialize(step_mother)
|
11
|
-
|
12
|
-
@step_mother = step_mother
|
7
|
+
raise(DEPRECATION_WARNING)
|
13
8
|
end
|
14
|
-
|
15
|
-
def visit_features(features)
|
16
|
-
features.accept(self)
|
17
|
-
end
|
18
|
-
|
19
|
-
def visit_feature(feature)
|
20
|
-
feature.accept(self)
|
21
|
-
end
|
22
|
-
|
23
|
-
def visit_comment(comment)
|
24
|
-
comment.accept(self)
|
25
|
-
end
|
26
|
-
|
27
|
-
def visit_comment_line(comment_line)
|
28
|
-
end
|
29
|
-
|
30
|
-
def visit_tags(tags)
|
31
|
-
tags.accept(self)
|
32
|
-
end
|
33
|
-
|
34
|
-
def visit_tag_name(tag_name)
|
35
|
-
end
|
36
|
-
|
37
|
-
def visit_feature_name(name)
|
38
|
-
end
|
39
|
-
|
40
|
-
# +feature_element+ is either Scenario or ScenarioOutline
|
41
|
-
def visit_feature_element(feature_element)
|
42
|
-
feature_element.accept(self)
|
43
|
-
end
|
44
|
-
|
45
|
-
def visit_background(background)
|
46
|
-
background.accept(self)
|
47
|
-
end
|
48
|
-
|
49
|
-
def visit_background_name(keyword, name, file_colon_line, source_indent)
|
50
|
-
end
|
51
|
-
|
52
|
-
def visit_examples_array(examples_array)
|
53
|
-
examples_array.accept(self)
|
54
|
-
end
|
55
|
-
|
56
|
-
def visit_examples(examples)
|
57
|
-
examples.accept(self)
|
58
|
-
end
|
59
|
-
|
60
|
-
def visit_examples_name(keyword, name)
|
61
|
-
end
|
62
|
-
|
63
|
-
def visit_outline_table(outline_table)
|
64
|
-
@table = outline_table
|
65
|
-
outline_table.accept(self)
|
66
|
-
end
|
67
|
-
|
68
|
-
def visit_scenario_name(keyword, name, file_colon_line, source_indent)
|
69
|
-
end
|
70
|
-
|
71
|
-
def visit_steps(steps)
|
72
|
-
steps.accept(self)
|
73
|
-
end
|
74
|
-
|
75
|
-
def visit_step(step)
|
76
|
-
step.accept(self)
|
77
|
-
end
|
78
|
-
|
79
|
-
def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
|
80
|
-
visit_step_name(keyword, step_match, status, source_indent, background)
|
81
|
-
visit_multiline_arg(multiline_arg) if multiline_arg
|
82
|
-
visit_exception(exception, status) if exception
|
83
|
-
end
|
84
|
-
|
85
|
-
def visit_step_name(keyword, step_match, status, source_indent, background) #:nodoc:
|
86
|
-
end
|
87
|
-
|
88
|
-
def visit_multiline_arg(multiline_arg) #:nodoc:
|
89
|
-
multiline_arg.accept(self)
|
90
|
-
end
|
91
|
-
|
92
|
-
def visit_exception(exception, status) #:nodoc:
|
93
|
-
end
|
94
|
-
|
95
|
-
def visit_py_string(string)
|
96
|
-
end
|
97
|
-
|
98
|
-
def visit_table_row(table_row)
|
99
|
-
table_row.accept(self)
|
100
|
-
end
|
101
|
-
|
102
|
-
def visit_table_cell(table_cell)
|
103
|
-
table_cell.accept(self)
|
104
|
-
end
|
105
|
-
|
106
|
-
def visit_table_cell_value(value, status)
|
107
|
-
end
|
108
|
-
|
109
|
-
# Print +announcement+. This method can be called from within StepDefinitions.
|
110
|
-
def announce(announcement)
|
111
|
-
end
|
112
|
-
|
113
9
|
end
|
114
10
|
end
|
115
11
|
end
|