cucumber 0.3.96 → 0.3.97
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 +22 -3
- data/License.txt +2 -0
- data/Manifest.txt +9 -5
- data/config/hoe.rb +1 -0
- data/examples/i18n/Rakefile +5 -3
- data/examples/i18n/fi/features/yhteenlasku.feature +5 -4
- data/examples/python/features/step_definitions/fib_steps.py +3 -0
- data/examples/python/features/support/env.rb +21 -21
- data/gem_tasks/contributors.rake +8 -0
- data/gem_tasks/features.rake +1 -0
- data/gem_tasks/sdoc.rake +7 -0
- data/lib/README.rdoc +12 -0
- data/lib/cucumber/ast/background.rb +1 -1
- data/lib/cucumber/ast/comment.rb +1 -1
- data/lib/cucumber/ast/examples.rb +9 -4
- data/lib/cucumber/ast/feature.rb +1 -1
- data/lib/cucumber/ast/feature_element.rb +1 -1
- data/lib/cucumber/ast/features.rb +1 -1
- data/lib/cucumber/ast/outline_table.rb +2 -2
- data/lib/cucumber/ast/py_string.rb +1 -1
- data/lib/cucumber/ast/scenario.rb +1 -1
- data/lib/cucumber/ast/scenario_outline.rb +8 -7
- data/lib/cucumber/ast/step.rb +1 -1
- data/lib/cucumber/ast/step_collection.rb +1 -1
- data/lib/cucumber/ast/step_invocation.rb +1 -1
- data/lib/cucumber/ast/table.rb +65 -45
- data/lib/cucumber/ast/tags.rb +2 -2
- data/lib/cucumber/ast/visitor.rb +6 -8
- data/lib/cucumber/broadcaster.rb +1 -1
- data/lib/cucumber/cli/language_help_formatter.rb +1 -1
- data/lib/cucumber/cli/main.rb +15 -52
- data/lib/cucumber/constantize.rb +1 -1
- data/lib/cucumber/core_ext/exception.rb +1 -1
- data/lib/cucumber/core_ext/instance_exec.rb +8 -3
- data/lib/cucumber/core_ext/proc.rb +1 -1
- data/lib/cucumber/core_ext/string.rb +1 -1
- data/lib/cucumber/feature_file.rb +4 -3
- data/lib/cucumber/filter.rb +2 -1
- data/lib/cucumber/formatter/ansicolor.rb +6 -5
- data/lib/cucumber/formatter/color_io.rb +2 -2
- data/lib/cucumber/formatter/console.rb +2 -0
- data/lib/cucumber/formatter/duration.rb +3 -0
- data/lib/cucumber/formatter/html.rb +1 -0
- data/lib/cucumber/formatter/junit.rb +1 -0
- data/lib/cucumber/formatter/ordered_xml_markup.rb +1 -1
- data/lib/cucumber/formatter/pretty.rb +18 -4
- data/lib/cucumber/formatter/profile.rb +1 -0
- data/lib/cucumber/formatter/progress.rb +1 -0
- data/lib/cucumber/formatter/rerun.rb +2 -0
- data/lib/cucumber/formatter/steps.rb +1 -0
- data/lib/cucumber/formatter/tag_cloud.rb +2 -1
- data/lib/cucumber/formatter/unicode.rb +1 -1
- data/lib/cucumber/formatter/usage.rb +1 -0
- data/lib/cucumber/language_support.rb +30 -0
- data/lib/cucumber/language_support/language_methods.rb +34 -12
- data/lib/cucumber/parser/feature.rb +81 -57
- data/lib/cucumber/parser/feature.tt +3 -3
- data/lib/cucumber/parser/natural_language.rb +1 -1
- data/lib/cucumber/parser/table.rb +3 -0
- data/lib/cucumber/parser/treetop_ext.rb +6 -5
- data/lib/cucumber/platform.rb +1 -2
- data/lib/cucumber/py_support/py_dsl.py +8 -0
- data/lib/cucumber/py_support/py_language.py +2 -0
- data/lib/cucumber/py_support/py_language.rb +68 -0
- data/lib/cucumber/rails/world.rb +2 -1
- data/lib/cucumber/rake/task.rb +13 -11
- data/lib/cucumber/rb_support/rb_dsl.rb +27 -15
- data/lib/cucumber/rb_support/rb_hook.rb +1 -2
- data/lib/cucumber/rb_support/rb_language.rb +57 -33
- data/lib/cucumber/rb_support/rb_step_definition.rb +42 -38
- data/lib/cucumber/rb_support/rb_world.rb +93 -0
- data/lib/cucumber/rspec_neuter.rb +3 -3
- data/lib/cucumber/step_match.rb +2 -2
- data/lib/cucumber/step_mother.rb +91 -65
- data/lib/cucumber/version.rb +1 -1
- data/lib/cucumber/webrat/element_locator.rb +3 -3
- data/rails_generators/cucumber/templates/cucumber.rake +2 -0
- data/rails_generators/cucumber/templates/webrat_steps.rb +4 -0
- data/spec/cucumber/ast/background_spec.rb +8 -1
- data/spec/cucumber/ast/scenario_outline_spec.rb +1 -0
- data/spec/cucumber/ast/table_spec.rb +10 -0
- data/spec/cucumber/cli/options_spec.rb +1 -1
- data/spec/cucumber/parser/feature_parser_spec.rb +4 -0
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +114 -0
- data/spec/cucumber/step_mother_spec.rb +29 -10
- data/spec/cucumber/treetop_parser/with_comments.feature +14 -1
- data/spec/cucumber/world/pending_spec.rb +1 -1
- metadata +21 -7
- data/gem_tasks/yard.rake +0 -8
- data/lib/cucumber/language_support/hook_methods.rb +0 -9
- data/lib/cucumber/world.rb +0 -89
- data/spec/cucumber/ast/visitor_spec.rb +0 -27
- data/spec/cucumber/step_definition_spec.rb +0 -102
@@ -1,6 +1,7 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module Formatter
|
3
|
-
#
|
3
|
+
# The formatter used for <tt>--format tag_cloud</tt>
|
4
|
+
# Custom formatter that prints a tag cloud as a table.
|
4
5
|
class TagCloud < Cucumber::Ast::Visitor
|
5
6
|
def initialize(step_mother, io, options)
|
6
7
|
super(step_mother)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Cucumber
|
2
|
+
# This module defines the API for programming panguage support in Cucumber.
|
3
|
+
# While Cucumber itself is written in Ruby, any programming language can
|
4
|
+
# be supported by implementing this API.
|
5
|
+
#
|
6
|
+
# For the sake of illustration we'll consider an imaginary language called
|
7
|
+
# _why. _why files have the .why extension, so we need to put support for
|
8
|
+
# this language in the <tt>Cucumber::WhySupport::WhyLanguage</tt>. This
|
9
|
+
# class must be defined in a file called <tt>cucumber/why_support/why_language.rb</tt>
|
10
|
+
# and be available on Ruby's <tt>$LOAD_PATH</tt>:
|
11
|
+
#
|
12
|
+
# module Cucumber
|
13
|
+
# module WhySupport
|
14
|
+
# class WhyLanguage
|
15
|
+
#
|
16
|
+
# # Uses whatever available language bridge to load
|
17
|
+
# # +why_file+ and returns an Array of StepDefinition.
|
18
|
+
# def load_code_file(why_file)
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# Each language implementation manages its own hooks, and must execute them
|
25
|
+
# at appropriate times.
|
26
|
+
#
|
27
|
+
#
|
28
|
+
module LanguageSupport
|
29
|
+
end
|
30
|
+
end
|
@@ -2,35 +2,57 @@ module Cucumber
|
|
2
2
|
module LanguageSupport
|
3
3
|
module LanguageMethods
|
4
4
|
def before(scenario)
|
5
|
-
|
5
|
+
begin_scenario
|
6
6
|
execute_before(scenario)
|
7
7
|
end
|
8
8
|
|
9
9
|
def after(scenario)
|
10
10
|
execute_after(scenario)
|
11
|
-
|
11
|
+
end_scenario
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute_after_step(scenario)
|
15
|
+
hooks_for(:after_step, scenario).each do |hook|
|
16
|
+
invoke(hook, 'AfterStep', scenario, false)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_hook(phase, hook)
|
21
|
+
hooks[phase.to_sym] << hook
|
22
|
+
hook
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_step_definition(step_definition)
|
26
|
+
step_definitions << step_definition
|
27
|
+
step_definition
|
28
|
+
end
|
29
|
+
|
30
|
+
def step_definitions
|
31
|
+
@step_definitions ||= []
|
32
|
+
end
|
33
|
+
|
34
|
+
def hooks_for(phase, scenario) #:nodoc:
|
35
|
+
hooks[phase.to_sym].select{|hook| scenario.accept_hook?(hook)}
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def hooks
|
41
|
+
@hooks ||= Hash.new{|h,k| h[k] = []}
|
12
42
|
end
|
13
43
|
|
14
44
|
def execute_before(scenario)
|
15
|
-
|
45
|
+
hooks_for(:before, scenario).each do |hook|
|
16
46
|
invoke(hook, 'Before', scenario, true)
|
17
47
|
end
|
18
48
|
end
|
19
49
|
|
20
50
|
def execute_after(scenario)
|
21
|
-
|
51
|
+
hooks_for(:after, scenario).each do |hook|
|
22
52
|
invoke(hook, 'After', scenario, true)
|
23
53
|
end
|
24
54
|
end
|
25
55
|
|
26
|
-
def execute_after_step(scenario)
|
27
|
-
step_mother.hooks_for(:after_step, scenario).each do |hook|
|
28
|
-
invoke(hook, 'AfterStep', scenario, false)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
56
|
def invoke(hook, location, scenario, exception_fails_scenario)
|
35
57
|
begin
|
36
58
|
hook.invoke(location, scenario)
|
@@ -1,3 +1,6 @@
|
|
1
|
+
# Autogenerated from a Treetop grammar. Edits may be lost.
|
2
|
+
|
3
|
+
|
1
4
|
module Cucumber
|
2
5
|
module Parser
|
3
6
|
# TIP: When you hack on the grammar, just delete feature.rb in this directory.
|
@@ -17,7 +20,7 @@ module Cucumber
|
|
17
20
|
end
|
18
21
|
|
19
22
|
module FeatureSub1
|
20
|
-
def
|
23
|
+
def white1
|
21
24
|
elements[0]
|
22
25
|
end
|
23
26
|
|
@@ -25,7 +28,7 @@ module Cucumber
|
|
25
28
|
elements[1]
|
26
29
|
end
|
27
30
|
|
28
|
-
def
|
31
|
+
def white2
|
29
32
|
elements[2]
|
30
33
|
end
|
31
34
|
|
@@ -33,7 +36,7 @@ module Cucumber
|
|
33
36
|
elements[3]
|
34
37
|
end
|
35
38
|
|
36
|
-
def
|
39
|
+
def white3
|
37
40
|
elements[4]
|
38
41
|
end
|
39
42
|
|
@@ -424,7 +427,7 @@ module Cucumber
|
|
424
427
|
|
425
428
|
module CommentLine0
|
426
429
|
def line_to_eol
|
427
|
-
elements[
|
430
|
+
elements[2]
|
428
431
|
end
|
429
432
|
end
|
430
433
|
|
@@ -437,17 +440,30 @@ module Cucumber
|
|
437
440
|
end
|
438
441
|
|
439
442
|
i0, s0 = index, []
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
443
|
+
s1, i1 = [], index
|
444
|
+
loop do
|
445
|
+
r2 = _nt_space
|
446
|
+
if r2
|
447
|
+
s1 << r2
|
448
|
+
else
|
449
|
+
break
|
450
|
+
end
|
446
451
|
end
|
452
|
+
r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
|
447
453
|
s0 << r1
|
448
454
|
if r1
|
449
|
-
|
450
|
-
|
455
|
+
if has_terminal?('#', false, index)
|
456
|
+
r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
457
|
+
@index += 1
|
458
|
+
else
|
459
|
+
terminal_parse_failure('#')
|
460
|
+
r3 = nil
|
461
|
+
end
|
462
|
+
s0 << r3
|
463
|
+
if r3
|
464
|
+
r4 = _nt_line_to_eol
|
465
|
+
s0 << r4
|
466
|
+
end
|
451
467
|
end
|
452
468
|
if s0.last
|
453
469
|
r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
|
@@ -664,7 +680,7 @@ module Cucumber
|
|
664
680
|
elements[1]
|
665
681
|
end
|
666
682
|
|
667
|
-
def
|
683
|
+
def white1
|
668
684
|
elements[2]
|
669
685
|
end
|
670
686
|
|
@@ -676,7 +692,7 @@ module Cucumber
|
|
676
692
|
elements[5]
|
677
693
|
end
|
678
694
|
|
679
|
-
def
|
695
|
+
def white2
|
680
696
|
elements[6]
|
681
697
|
end
|
682
698
|
|
@@ -684,7 +700,7 @@ module Cucumber
|
|
684
700
|
elements[7]
|
685
701
|
end
|
686
702
|
|
687
|
-
def
|
703
|
+
def white3
|
688
704
|
elements[8]
|
689
705
|
end
|
690
706
|
end
|
@@ -798,7 +814,7 @@ module Cucumber
|
|
798
814
|
elements[1]
|
799
815
|
end
|
800
816
|
|
801
|
-
def
|
817
|
+
def white1
|
802
818
|
elements[2]
|
803
819
|
end
|
804
820
|
|
@@ -810,7 +826,7 @@ module Cucumber
|
|
810
826
|
elements[5]
|
811
827
|
end
|
812
828
|
|
813
|
-
def
|
829
|
+
def white2
|
814
830
|
elements[6]
|
815
831
|
end
|
816
832
|
|
@@ -822,7 +838,7 @@ module Cucumber
|
|
822
838
|
elements[8]
|
823
839
|
end
|
824
840
|
|
825
|
-
def
|
841
|
+
def white3
|
826
842
|
elements[9]
|
827
843
|
end
|
828
844
|
end
|
@@ -1154,24 +1170,28 @@ module Cucumber
|
|
1154
1170
|
end
|
1155
1171
|
|
1156
1172
|
module Examples0
|
1173
|
+
def comment
|
1174
|
+
elements[0]
|
1175
|
+
end
|
1176
|
+
|
1157
1177
|
def examples_keyword
|
1158
|
-
elements[
|
1178
|
+
elements[2]
|
1159
1179
|
end
|
1160
1180
|
|
1161
1181
|
def name
|
1162
|
-
elements[
|
1182
|
+
elements[4]
|
1163
1183
|
end
|
1164
1184
|
|
1165
1185
|
def eol
|
1166
|
-
elements[
|
1186
|
+
elements[5]
|
1167
1187
|
end
|
1168
1188
|
|
1169
1189
|
def table
|
1170
|
-
elements[
|
1190
|
+
elements[6]
|
1171
1191
|
end
|
1172
1192
|
|
1173
1193
|
def white
|
1174
|
-
elements[
|
1194
|
+
elements[7]
|
1175
1195
|
end
|
1176
1196
|
end
|
1177
1197
|
|
@@ -1198,7 +1218,7 @@ module Cucumber
|
|
1198
1218
|
end
|
1199
1219
|
|
1200
1220
|
def build(filter, scenario_outline)
|
1201
|
-
[examples_keyword.line, examples_keyword.text_value, name.build, table.raw(filter, scenario_outline)]
|
1221
|
+
[comment.build, examples_keyword.line, examples_keyword.text_value, name.build, table.raw(filter, scenario_outline)]
|
1202
1222
|
end
|
1203
1223
|
end
|
1204
1224
|
|
@@ -1211,49 +1231,53 @@ module Cucumber
|
|
1211
1231
|
end
|
1212
1232
|
|
1213
1233
|
i0, s0 = index, []
|
1214
|
-
|
1215
|
-
loop do
|
1216
|
-
r2 = _nt_space
|
1217
|
-
if r2
|
1218
|
-
s1 << r2
|
1219
|
-
else
|
1220
|
-
break
|
1221
|
-
end
|
1222
|
-
end
|
1223
|
-
r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
|
1234
|
+
r1 = _nt_comment
|
1224
1235
|
s0 << r1
|
1225
1236
|
if r1
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
s4 << r5
|
1234
|
-
else
|
1235
|
-
break
|
1236
|
-
end
|
1237
|
+
s2, i2 = [], index
|
1238
|
+
loop do
|
1239
|
+
r3 = _nt_space
|
1240
|
+
if r3
|
1241
|
+
s2 << r3
|
1242
|
+
else
|
1243
|
+
break
|
1237
1244
|
end
|
1238
|
-
|
1245
|
+
end
|
1246
|
+
r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
|
1247
|
+
s0 << r2
|
1248
|
+
if r2
|
1249
|
+
r4 = _nt_examples_keyword
|
1239
1250
|
s0 << r4
|
1240
1251
|
if r4
|
1241
|
-
|
1242
|
-
|
1243
|
-
r6 =
|
1244
|
-
|
1245
|
-
|
1252
|
+
s5, i5 = [], index
|
1253
|
+
loop do
|
1254
|
+
r6 = _nt_space
|
1255
|
+
if r6
|
1256
|
+
s5 << r6
|
1257
|
+
else
|
1258
|
+
break
|
1259
|
+
end
|
1246
1260
|
end
|
1247
|
-
|
1248
|
-
|
1249
|
-
|
1250
|
-
|
1261
|
+
r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
|
1262
|
+
s0 << r5
|
1263
|
+
if r5
|
1264
|
+
r8 = _nt_lines_to_keyword
|
1251
1265
|
if r8
|
1252
|
-
|
1266
|
+
r7 = r8
|
1267
|
+
else
|
1268
|
+
r7 = instantiate_node(SyntaxNode,input, index...index)
|
1269
|
+
end
|
1270
|
+
s0 << r7
|
1271
|
+
if r7
|
1272
|
+
r9 = _nt_eol
|
1253
1273
|
s0 << r9
|
1254
1274
|
if r9
|
1255
|
-
r10 =
|
1275
|
+
r10 = _nt_table
|
1256
1276
|
s0 << r10
|
1277
|
+
if r10
|
1278
|
+
r11 = _nt_white
|
1279
|
+
s0 << r11
|
1280
|
+
end
|
1257
1281
|
end
|
1258
1282
|
end
|
1259
1283
|
end
|
@@ -78,7 +78,7 @@ module Cucumber
|
|
78
78
|
end
|
79
79
|
|
80
80
|
rule comment_line
|
81
|
-
'#' line_to_eol
|
81
|
+
space* '#' line_to_eol
|
82
82
|
end
|
83
83
|
|
84
84
|
rule background
|
@@ -262,7 +262,7 @@ module Cucumber
|
|
262
262
|
end
|
263
263
|
|
264
264
|
rule examples
|
265
|
-
space* examples_keyword space* name:lines_to_keyword? eol table white {
|
265
|
+
comment space* examples_keyword space* name:lines_to_keyword? eol table white {
|
266
266
|
def at_line?(line)
|
267
267
|
examples_keyword.line == line ||
|
268
268
|
table.at_line?(line)
|
@@ -285,7 +285,7 @@ module Cucumber
|
|
285
285
|
end
|
286
286
|
|
287
287
|
def build(filter, scenario_outline)
|
288
|
-
[examples_keyword.line, examples_keyword.text_value, name.build, table.raw(filter, scenario_outline)]
|
288
|
+
[comment.build, examples_keyword.line, examples_keyword.text_value, name.build, table.raw(filter, scenario_outline)]
|
289
289
|
end
|
290
290
|
}
|
291
291
|
end
|
@@ -22,7 +22,7 @@ module Cucumber
|
|
22
22
|
|
23
23
|
def register_adverbs(step_mother)
|
24
24
|
adverbs = %w{given when then and but}.map{|keyword| @keywords[keyword].split('|').map{|w| w.gsub(/\s/, '')}}.flatten
|
25
|
-
step_mother.register_adverbs(adverbs)
|
25
|
+
step_mother.register_adverbs(adverbs) if step_mother
|
26
26
|
end
|
27
27
|
|
28
28
|
def parser
|
@@ -12,6 +12,7 @@ end
|
|
12
12
|
|
13
13
|
module Cucumber
|
14
14
|
module Parser
|
15
|
+
# Raised if Cucumber fails to parse a feature file
|
15
16
|
class SyntaxError < StandardError
|
16
17
|
def initialize(parser, file, line_offset)
|
17
18
|
tf = parser.terminal_failures
|
@@ -22,7 +23,7 @@ module Cucumber
|
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
25
|
-
module TreetopExt
|
26
|
+
module TreetopExt #:nodoc:
|
26
27
|
def parse_or_fail(source, file=nil, filter=nil, line_offset=0)
|
27
28
|
parse_tree = parse(source)
|
28
29
|
if parse_tree.nil?
|
@@ -37,15 +38,15 @@ module Cucumber
|
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
40
|
-
module Treetop
|
41
|
-
module Runtime
|
42
|
-
class SyntaxNode
|
41
|
+
module Treetop #:nodoc:
|
42
|
+
module Runtime #:nodoc:
|
43
|
+
class SyntaxNode #:nodoc:
|
43
44
|
def line
|
44
45
|
input.line_of(interval.first)
|
45
46
|
end
|
46
47
|
end
|
47
48
|
|
48
|
-
class CompiledParser
|
49
|
+
class CompiledParser #:nodoc:
|
49
50
|
include Cucumber::Parser::TreetopExt
|
50
51
|
end
|
51
52
|
end
|