cucumber 0.3.11 → 0.3.90

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. data/History.txt +101 -0
  2. data/Manifest.txt +14 -5
  3. data/config/hoe.rb +1 -2
  4. data/cucumber.yml +1 -0
  5. data/examples/i18n/ar/Rakefile +1 -1
  6. data/examples/i18n/ar/features/addition.feature +1 -0
  7. data/examples/i18n/bg/Rakefile +1 -1
  8. data/examples/i18n/bg/features/addition.feature +1 -0
  9. data/examples/i18n/bg/features/consecutive_calculations.feature +1 -0
  10. data/examples/i18n/bg/features/division.feature +1 -0
  11. data/examples/i18n/cat/Rakefile +1 -1
  12. data/examples/i18n/cat/features/suma.feature +1 -0
  13. data/examples/i18n/da/Rakefile +1 -1
  14. data/examples/i18n/da/features/summering.feature +1 -0
  15. data/examples/i18n/de/Rakefile +1 -1
  16. data/examples/i18n/de/features/addition.feature +1 -0
  17. data/examples/i18n/de/features/division.feature +1 -0
  18. data/examples/i18n/en-lol/features/stuffing.feature +1 -1
  19. data/examples/i18n/en/Rakefile +1 -1
  20. data/examples/i18n/en/features/addition.feature +1 -0
  21. data/examples/i18n/en/features/division.feature +1 -0
  22. data/examples/i18n/es/Rakefile +1 -1
  23. data/examples/i18n/es/features/adicion.feature +1 -0
  24. data/examples/i18n/et/Rakefile +1 -1
  25. data/examples/i18n/et/features/jagamine.feature +1 -0
  26. data/examples/i18n/et/features/liitmine.feature +1 -0
  27. data/examples/i18n/fi/Rakefile +1 -1
  28. data/examples/i18n/fi/features/jakolasku.feature +1 -0
  29. data/examples/i18n/fr/Rakefile +1 -1
  30. data/examples/i18n/fr/features/addition.feature +2 -1
  31. data/examples/i18n/he/Rakefile +1 -1
  32. data/examples/i18n/he/features/addition.feature +1 -0
  33. data/examples/i18n/he/features/division.feature +1 -0
  34. data/examples/i18n/hu/Rakefile +1 -1
  35. data/examples/i18n/hu/features/addition.feature +1 -0
  36. data/examples/i18n/hu/features/division.feature +1 -0
  37. data/examples/i18n/id/Rakefile +1 -1
  38. data/examples/i18n/id/features/addition.feature +1 -0
  39. data/examples/i18n/id/features/division.feature +1 -0
  40. data/examples/i18n/it/Rakefile +1 -1
  41. data/examples/i18n/it/features/somma.feature +1 -0
  42. data/examples/i18n/ja/Rakefile +1 -1
  43. data/examples/i18n/ja/features/addition.feature +1 -0
  44. data/examples/i18n/ja/features/division.feature +1 -0
  45. data/examples/i18n/ko/Rakefile +1 -1
  46. data/examples/i18n/ko/features/addition.feature +6 -5
  47. data/examples/i18n/ko/features/division.feature +1 -0
  48. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +1 -1
  49. data/examples/i18n/lt/Rakefile +1 -1
  50. data/examples/i18n/lt/features/addition.feature +1 -0
  51. data/examples/i18n/lt/features/division.feature +1 -0
  52. data/examples/i18n/lv/Rakefile +1 -1
  53. data/examples/i18n/lv/features/addition.feature +1 -0
  54. data/examples/i18n/lv/features/division.feature +1 -0
  55. data/examples/i18n/no/Rakefile +1 -1
  56. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +1 -1
  57. data/examples/i18n/no/features/summering.feature +1 -0
  58. data/examples/i18n/pl/Rakefile +1 -1
  59. data/examples/i18n/pl/features/addition.feature +1 -0
  60. data/examples/i18n/pl/features/division.feature +1 -0
  61. data/examples/i18n/pt/Rakefile +1 -1
  62. data/examples/i18n/pt/features/adicao.feature +1 -0
  63. data/examples/i18n/ro/Rakefile +1 -1
  64. data/examples/i18n/ro/features/suma.feature +1 -0
  65. data/examples/i18n/ru/Rakefile +1 -1
  66. data/examples/i18n/ru/features/addition.feature +1 -0
  67. data/examples/i18n/ru/features/consecutive_calculations.feature +1 -0
  68. data/examples/i18n/ru/features/division.feature +1 -0
  69. data/examples/i18n/se/Rakefile +1 -1
  70. data/examples/i18n/se/features/summering.feature +1 -0
  71. data/examples/i18n/sk/Rakefile +1 -1
  72. data/examples/i18n/sk/features/addition.feature +1 -0
  73. data/examples/i18n/sk/features/division.feature +1 -0
  74. data/examples/i18n/zh-CN/features/addition.feature +1 -0
  75. data/examples/i18n/zh-TW/features/addition.feature +1 -0
  76. data/examples/i18n/zh-TW/features/division.feature +1 -0
  77. data/examples/self_test/features/support/env.rb +2 -1
  78. data/examples/sinatra/features/step_definitions/add_steps.rb +1 -1
  79. data/examples/sinatra/features/support/env.rb +13 -5
  80. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  81. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  82. data/examples/tickets/features/step_definitons/tickets_steps.rb +15 -0
  83. data/examples/tickets/features/table_diffing.feature +13 -0
  84. data/features/after_block_exceptions.feature +4 -1
  85. data/features/after_step_block_exceptions.feature +4 -1
  86. data/features/background.feature +6 -0
  87. data/features/bug_371.feature +32 -0
  88. data/features/cucumber_cli.feature +11 -1
  89. data/features/cucumber_cli_diff_disabled.feature +9 -2
  90. data/features/drb_server_integration.feature +28 -5
  91. data/features/expand.feature +2 -1
  92. data/features/html_formatter/a.html +129 -1614
  93. data/features/junit_formatter.feature +4 -4
  94. data/features/language_from_header.feature +30 -0
  95. data/features/rake_task.feature +28 -0
  96. data/features/step_definitions/cucumber_steps.rb +2 -2
  97. data/features/steps_formatter.feature +25 -0
  98. data/features/support/env.rb +13 -5
  99. data/features/table_diffing.feature +45 -0
  100. data/features/unicode_table.feature +35 -0
  101. data/features/work_in_progress.feature +3 -0
  102. data/gem_tasks/sass.rake +4 -0
  103. data/lib/cucumber.rb +0 -57
  104. data/lib/cucumber/ast/comment.rb +1 -1
  105. data/lib/cucumber/ast/feature.rb +2 -2
  106. data/lib/cucumber/ast/feature_element.rb +4 -0
  107. data/lib/cucumber/ast/outline_table.rb +2 -1
  108. data/lib/cucumber/ast/py_string.rb +0 -1
  109. data/lib/cucumber/ast/scenario.rb +5 -3
  110. data/lib/cucumber/ast/scenario_outline.rb +6 -1
  111. data/lib/cucumber/ast/step.rb +8 -1
  112. data/lib/cucumber/ast/step_invocation.rb +6 -1
  113. data/lib/cucumber/ast/table.rb +287 -49
  114. data/lib/cucumber/ast/visitor.rb +2 -1
  115. data/lib/cucumber/cli/configuration.rb +45 -28
  116. data/lib/cucumber/cli/drb_client.rb +8 -9
  117. data/lib/cucumber/cli/language_help_formatter.rb +9 -7
  118. data/lib/cucumber/cli/main.rb +8 -9
  119. data/lib/cucumber/feature_file.rb +53 -0
  120. data/lib/cucumber/filter.rb +50 -0
  121. data/lib/cucumber/formatter/console.rb +12 -0
  122. data/lib/cucumber/formatter/cucumber.css +106 -48
  123. data/lib/cucumber/formatter/cucumber.sass +121 -31
  124. data/lib/cucumber/formatter/html.rb +6 -5
  125. data/lib/cucumber/formatter/junit.rb +3 -6
  126. data/lib/cucumber/formatter/pretty.rb +22 -9
  127. data/lib/cucumber/formatter/profile.rb +1 -1
  128. data/lib/cucumber/formatter/progress.rb +1 -1
  129. data/lib/cucumber/formatter/steps.rb +49 -0
  130. data/lib/cucumber/languages.yml +3 -3
  131. data/lib/cucumber/parser.rb +1 -33
  132. data/lib/cucumber/parser/feature.rb +39 -16
  133. data/lib/cucumber/parser/feature.tt +1 -3
  134. data/lib/cucumber/parser/i18n.tt +30 -23
  135. data/lib/cucumber/parser/i18n/language.rb +83 -0
  136. data/lib/cucumber/parser/treetop_ext.rb +12 -83
  137. data/lib/cucumber/platform.rb +6 -0
  138. data/lib/cucumber/rake/task.rb +6 -0
  139. data/lib/cucumber/step_definition.rb +6 -0
  140. data/lib/cucumber/step_match.rb +1 -1
  141. data/lib/cucumber/step_mother.rb +3 -3
  142. data/lib/cucumber/version.rb +1 -1
  143. data/lib/cucumber/webrat/table_locator.rb +66 -0
  144. data/rails_generators/cucumber/templates/cucumber.rake +4 -0
  145. data/rails_generators/cucumber/templates/env.rb +1 -0
  146. data/rails_generators/cucumber/templates/spork_env.rb +1 -1
  147. data/rails_generators/cucumber/templates/webrat_steps.rb +17 -0
  148. data/rails_generators/feature/templates/feature.erb +1 -1
  149. data/rails_generators/feature/templates/steps.erb +2 -8
  150. data/spec/cucumber/ast/step_collection_spec.rb +5 -4
  151. data/spec/cucumber/ast/table_spec.rb +145 -0
  152. data/spec/cucumber/cli/configuration_spec.rb +55 -9
  153. data/spec/cucumber/cli/drb_client_spec.rb +5 -4
  154. data/spec/cucumber/cli/main_spec.rb +9 -12
  155. data/spec/cucumber/formatter/progress_spec.rb +2 -2
  156. data/spec/cucumber/parser/feature_parser_spec.rb +11 -9
  157. data/spec/cucumber/parser/table_parser_spec.rb +1 -1
  158. data/spec/spec_helper.rb +2 -1
  159. metadata +21 -20
  160. data/spec/cucumber/formatter/html/cucumber.css +0 -37
  161. data/spec/cucumber/formatter/html/cucumber.js +0 -13
  162. data/spec/cucumber/formatter/html/index.html +0 -45
  163. data/spec/cucumber/formatter/html/jquery-1.3.min.js +0 -19
  164. data/spec/cucumber/formatter/html/jquery.uitableedit.js +0 -100
@@ -1,39 +1,49 @@
1
1
  # cucumber.css is generated from cucumber.sass
2
- # Regenerate with the following command:
3
- #
4
- # sass -t expanded lib/cucumber/formatter/cucumber.sass > lib/cucumber/formatter/cucumber.css
5
- #
6
- .cucumber
7
- :background black
8
- :color white
9
- :padding 1em
2
+ # Regenerate with rake sass
10
3
 
11
- .passed
12
- :color green
13
- .undefined
14
- :color yellow
15
- .pending
16
- :color yellow
17
- .failed
18
- :color red
19
- .skipped
20
- :color cyan
21
- .outline
22
- :color cyan
23
- .param
24
- :font-weight bold
4
+ !step_left = 5px solid
5
+ !step_bottom = 1px solid
25
6
 
26
- a
27
- :text-decoration none
28
- :color inherit
7
+ !failed = #FFC0CB
8
+ !failed_dark = #FF0000
9
+ !failed_text = #8B0000
29
10
 
30
- &:hover
31
- :text-decoration underline
32
- &:visited
33
- :font-weight normal
11
+ !passed = #98FB98
12
+ !passed_dark = #00FF00
13
+ !passed_text = #001111
34
14
 
35
- ol
36
- :list-style none
15
+ !skipped = #E0FFFF
16
+ !skipped_dark = #00FFFF
17
+ !skipped_text = #001111
18
+
19
+ !pending = #FFFF00
20
+ !pending_dark = #FF8000
21
+ !pending_text = #2A1B0A
22
+
23
+ !undefined = #FFFF00
24
+ !undefined_dark = #FF8000
25
+ !undefined_text = #2A1B0A
26
+
27
+ .cucumber
28
+ :font-family "Lucida Grande", Helvetica, sans-serif
29
+ :font-size 0.7em
30
+ :background white
31
+ :padding 1em
32
+
33
+ h1, h2, h3, h4, ol, li, pre, p
34
+ :font-size 1em
35
+ :padding 0px
36
+ :margin 0px
37
+
38
+ div.feature
39
+ :border 1px solid
40
+ :padding 2px
41
+ :margin 4px
42
+
43
+ div.background, div.scenario, p
44
+ :padding 0em 0em 0em 1em
45
+ div.examples
46
+ :padding 0em 0em 0em 1em
37
47
 
38
48
  .stats
39
49
  :margin 2em
@@ -47,3 +57,83 @@
47
57
  :margin-top 0
48
58
  :margin-bottom 0
49
59
  :margin-left 1em
60
+
61
+ a
62
+ :text-decoration none
63
+ :color inherit
64
+
65
+ &:hover
66
+ :text-decoration underline
67
+ &:visited
68
+ :font-weight normal
69
+
70
+ div.examples
71
+ :border 1px solid
72
+ :padding 2px
73
+ :margin 4px
74
+
75
+ table
76
+ :border-collapse collapse
77
+
78
+ td, th
79
+ :font-size 0.7em
80
+ :border 1px solid #AAAAAA
81
+ td.failed
82
+ :background #FFC0CB
83
+ :color #8B0000
84
+ td.passed
85
+ :background #98FB98
86
+ :color= !passed_text
87
+ td.skipped
88
+ :background= !skipped
89
+ :color= !skipped_text
90
+ td.pending
91
+ :background #FFFFE0
92
+ :color #111100
93
+ td.undefined
94
+ :background #FFFFE0
95
+ :color #111100
96
+
97
+ ol
98
+ :list-style none
99
+
100
+ li
101
+ :margin 0em 0em 0em 1em
102
+ :padding 0em 0em 0em 0.2em
103
+ span.param
104
+ :font-weight bold
105
+ li.failed
106
+ :border-left= !step_left !failed_dark
107
+ :border-bottom= !step_bottom !failed_dark
108
+ :background= !failed
109
+ :color= !failed_text
110
+ span.param
111
+ :background !failed_dark
112
+ li.passed
113
+ :border-left= !step_left !passed_dark
114
+ :border-bottom= !step_bottom !passed_dark
115
+ :background= !passed
116
+ :color= !passed_text
117
+ span.param
118
+ :background= !passed_dark
119
+ li.skipped
120
+ :border-left= !step_left !skipped_dark
121
+ :border-bottom= !step_bottom !skipped_dark
122
+ :background= !skipped
123
+ :color= !skipped_text
124
+ span.param
125
+ :background= !skipped_dark
126
+ li.pending
127
+ :border-left= !step_left !pending_dark
128
+ :border-bottom= !step_bottom !pending_dark
129
+ :background= !pending
130
+ :color= !pending_text
131
+ span.param
132
+ :background= !pending_dark
133
+ li.undefined
134
+ :border-left= !step_left !undefined_dark
135
+ :border-bottom= !step_bottom !undefined_dark
136
+ :background= !undefined
137
+ :color= !undefined_text
138
+ span.param
139
+ :background= !undefined_dark
@@ -20,7 +20,7 @@ module Cucumber
20
20
  end
21
21
 
22
22
  def create_builder(io)
23
- Builder::XmlMarkup.new(:target => io, :indent => 2)
23
+ Builder::XmlMarkup.new(:target => io, :indent => 0)
24
24
  end
25
25
 
26
26
  def visit_features(features)
@@ -54,7 +54,8 @@ module Cucumber
54
54
  end
55
55
 
56
56
  def visit_comment_line(comment_line)
57
- @builder.text!(comment_line.strip + "\n")
57
+ @builder.text!(comment_line)
58
+ @builder.br
58
59
  end
59
60
 
60
61
  def visit_feature(feature)
@@ -73,7 +74,7 @@ module Cucumber
73
74
  @builder.h2 do |h2|
74
75
  @builder.span(lines[0], :class => 'val')
75
76
  end
76
- @builder.p do
77
+ @builder.p(:class => 'narrative') do
77
78
  lines[1..-1].each do |line|
78
79
  @builder.text!(line.strip)
79
80
  @builder.br
@@ -191,7 +192,7 @@ module Cucumber
191
192
 
192
193
  def visit_py_string(string)
193
194
  @builder.pre(:class => 'val') do |pre|
194
- @builder.text!(string)
195
+ @builder.text!(' ' + string)
195
196
  end
196
197
  end
197
198
 
@@ -213,7 +214,7 @@ module Cucumber
213
214
  @outline_row += 1 if @outline_row
214
215
  end
215
216
 
216
- def visit_table_cell_value(value, width, status)
217
+ def visit_table_cell_value(value, status)
217
218
  cell_type = @outline_row == 0 ? :th : :td
218
219
  attributes = {:id => "#{@row_id}_#{@col_index}", :class => 'val'}
219
220
  attributes[:class] += " #{status}" if status
@@ -31,13 +31,14 @@ module Cucumber
31
31
  @testsuite << @builder.target!
32
32
  end
33
33
 
34
- File.open(@feature_filename, 'w') { |file| file.write(@testsuite.target!) }
34
+ basename = File.basename(feature.file)[0...-File.extname(feature.file).length]
35
+ feature_filename = File.join(@reportdir, "TEST-#{basename}.xml")
36
+ File.open(feature_filename, 'w') { |file| file.write(@testsuite.target!) }
35
37
  end
36
38
 
37
39
  def visit_feature_name(name)
38
40
  lines = name.split(/\r?\n/)
39
41
  @feature_name = lines[0].sub(/Feature\:/, '').strip
40
- @feature_filename = convert_to_file_name(@feature_name)
41
42
  end
42
43
 
43
44
  def visit_scenario_name(keyword, name, file_colon_line, source_indent)
@@ -65,10 +66,6 @@ module Cucumber
65
66
 
66
67
  private
67
68
 
68
- def convert_to_file_name(feature_name)
69
- File.join(@reportdir, "TEST-" + feature_name.gsub(/[^\w_\.]/, '_') + ".xml")
70
- end
71
-
72
69
  def format_exception(exception)
73
70
  (["#{exception.message} (#{exception.class})"] + exception.backtrace).join("\n")
74
71
  end
@@ -13,13 +13,13 @@ module Cucumber
13
13
  include Console
14
14
  attr_writer :indent
15
15
 
16
- def initialize(step_mother, io, options, delim='|')
16
+ def initialize(step_mother, io, options)
17
17
  super(step_mother)
18
18
  @io = io
19
19
  @options = options
20
- @delim = delim
21
20
  @exceptions = []
22
21
  @indent = 0
22
+ @prefixes = options[:prefixes] || {}
23
23
  end
24
24
 
25
25
  def visit_features(features)
@@ -48,10 +48,8 @@ module Cucumber
48
48
  end
49
49
 
50
50
  def visit_comment_line(comment_line)
51
- unless comment_line.blank?
52
- @io.puts(comment_line.indent(@indent))
53
- @io.flush
54
- end
51
+ @io.puts(comment_line.indent(@indent))
52
+ @io.flush
55
53
  end
56
54
 
57
55
  def visit_tags(tags)
@@ -147,6 +145,7 @@ module Cucumber
147
145
 
148
146
  def visit_multiline_arg(multiline_arg)
149
147
  return if @options[:no_multiline]
148
+ @table = multiline_arg
150
149
  super
151
150
  end
152
151
 
@@ -156,7 +155,8 @@ module Cucumber
156
155
  end
157
156
 
158
157
  def visit_table_row(table_row)
159
- @io.print @delim.indent(@indent)
158
+ @col_index = 0
159
+ @io.print ' |'.indent(@indent-2)
160
160
  super
161
161
  @io.puts
162
162
  if table_row.exception && !@exceptions.index(table_row.exception)
@@ -171,13 +171,26 @@ module Cucumber
171
171
  @io.flush
172
172
  end
173
173
 
174
- def visit_table_cell_value(value, width, status)
174
+ def visit_table_cell(cell)
175
+ super
176
+ @col_index += 1
177
+ end
178
+
179
+ def visit_table_cell_value(value, status)
175
180
  status ||= @status || :passed
176
- @io.print(' ' + format_string((value.to_s || '').ljust(width), status) + ::Term::ANSIColor.reset(" #{@delim}"))
181
+ width = @table.col_width(@col_index)
182
+ cell_text = value.to_s || ''
183
+ padded = cell_text + (' ' * (width - cell_text.jlength))
184
+ prefix = cell_prefix(status)
185
+ @io.print(' ' + format_string("#{prefix}#{padded}", status) + ::Term::ANSIColor.reset(" |"))
177
186
  @io.flush
178
187
  end
179
188
 
180
189
  private
190
+
191
+ def cell_prefix(status)
192
+ @prefixes[status]
193
+ end
181
194
 
182
195
  def print_summary(features)
183
196
  print_stats(features)
@@ -17,7 +17,7 @@ module Cucumber
17
17
  super
18
18
  end
19
19
 
20
- def visit_step_name(keyword, step_match, status, source_indent, background)
20
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
21
21
  duration = Time.now - @step_duration
22
22
  super
23
23
 
@@ -23,7 +23,7 @@ module Cucumber
23
23
  @status = status
24
24
  end
25
25
 
26
- def visit_table_cell_value(value, width, status)
26
+ def visit_table_cell_value(value, status)
27
27
  status ||= @status
28
28
  progress(status) unless table_header_cell?(status)
29
29
  end
@@ -0,0 +1,49 @@
1
+ module Cucumber
2
+ module Formatter
3
+ class Steps < Ast::Visitor
4
+
5
+ def initialize(step_mother, io, options)
6
+ super(step_mother)
7
+ @io = io
8
+ @options = options
9
+ @step_definition_files = collect_steps(step_mother)
10
+ end
11
+
12
+ def visit_features(features)
13
+ print_summary
14
+ end
15
+
16
+ private
17
+
18
+ def print_summary
19
+ count = 0
20
+ @step_definition_files.keys.sort.each do |step_definition_file|
21
+ @io.puts step_definition_file
22
+
23
+ sources = @step_definition_files[step_definition_file]
24
+ source_indent = source_indent(sources)
25
+ sources.sort.each do |file_colon_line, regexp|
26
+ @io.print "#{regexp}".indent(2)
27
+ @io.print " # #{file_colon_line}".indent(source_indent - regexp.size)
28
+ @io.puts
29
+ end
30
+ @io.puts
31
+ count += sources.size
32
+ end
33
+ @io.puts "#{count} step definition(s) in #{@step_definition_files.size} source file(s)."
34
+ end
35
+
36
+ def collect_steps(step_mother)
37
+ step_mother.step_definitions.inject({}) do |step_definitions, step_definition|
38
+ step_definitions[step_definition.file] ||= []
39
+ step_definitions[step_definition.file] << [ step_definition.file_colon_line, step_definition.regexp.inspect ]
40
+ step_definitions
41
+ end
42
+ end
43
+
44
+ def source_indent(sources)
45
+ sources.map { |file_colon_line, regexp| regexp.size }.max + 1
46
+ end
47
+ end
48
+ end
49
+ end
@@ -91,14 +91,14 @@
91
91
  native: Česky
92
92
  encoding: UTF-8
93
93
  feature: Požadavek
94
- background: Pozadí
94
+ background: Pozadí|Kontext
95
95
  scenario: Scénář
96
- scenario_outline: Náčrt Scénáře
96
+ scenario_outline: Náčrt Scénáře|Osnova scénáře
97
97
  examples: Příklady
98
98
  given: Pokud
99
99
  when: Když
100
100
  then: Pak
101
- and: A
101
+ and: A|A také
102
102
  but: Ale
103
103
  space_after_keyword: true
104
104
  "da":
@@ -3,36 +3,4 @@ require 'cucumber/platform'
3
3
  require 'cucumber/ast'
4
4
  require 'cucumber/parser/treetop_ext'
5
5
  require 'cucumber/parser/table'
6
-
7
- module Cucumber
8
- # Classes in this module parse feature files and translate the parse tree
9
- # (concrete syntax tree) into an abstract syntax tree (AST) using
10
- # <a href="http://martinfowler.com/dslwip/EmbeddedTranslation.html">Embedded translation</a>.
11
- #
12
- # The AST is built by the various <tt>#build</tt> methods in the parse tree.
13
- #
14
- # The AST classes are defined in the Cucumber::Ast module.
15
- module Parser
16
- def self.load_parser(keywords)
17
- Loader.new(keywords)
18
- end
19
-
20
- class Loader
21
- def initialize(keywords)
22
- @keywords = keywords
23
- i18n_tt = File.expand_path(File.dirname(__FILE__) + '/parser/i18n.tt')
24
- template = File.open(i18n_tt, Cucumber.file_mode('r')).read
25
- erb = ERB.new(template)
26
- grammar = erb.result(binding)
27
- Treetop.load_from_string(grammar)
28
- require 'cucumber/parser/feature'
29
- end
30
-
31
- def keywords(key, raw=false)
32
- return @keywords[key] if raw
33
- values = @keywords[key].split('|')
34
- values.map{|value| "'#{value}'"}.join(" / ")
35
- end
36
- end
37
- end
38
- end
6
+ require 'cucumber/parser/feature'
@@ -10,17 +10,13 @@ module Cucumber
10
10
  include Treetop::Runtime
11
11
 
12
12
  def root
13
- @root || :feature
13
+ @root || :feature_sub
14
14
  end
15
15
 
16
- include I18n
17
-
18
- include Table
19
-
20
- module Feature0
16
+ module FeatureSub0
21
17
  end
22
18
 
23
- module Feature1
19
+ module FeatureSub1
24
20
  def white
25
21
  elements[0]
26
22
  end
@@ -55,10 +51,14 @@ module Cucumber
55
51
 
56
52
  end
57
53
 
58
- module Feature2
54
+ module FeatureSub2
59
55
  def has_tags?(tag_names)
60
56
  tags.has_tags?(tag_names)
61
57
  end
58
+
59
+ def has_all_tags?(tag_names)
60
+ tags.has_all_tags?(tag_names)
61
+ end
62
62
 
63
63
  def build(filter)
64
64
  if(filter.nil? || feature_elements.accept?(filter) || (!bg.empty? && filter.accept?(bg)))
@@ -74,10 +74,10 @@ module Cucumber
74
74
  end
75
75
  end
76
76
 
77
- def _nt_feature
77
+ def _nt_feature_sub
78
78
  start_index = index
79
- if node_cache[:feature].has_key?(index)
80
- cached = node_cache[:feature][index]
79
+ if node_cache[:feature_sub].has_key?(index)
80
+ cached = node_cache[:feature_sub][index]
81
81
  @index = cached.interval.end if cached
82
82
  return cached
83
83
  end
@@ -139,7 +139,7 @@ module Cucumber
139
139
  end
140
140
  if s7.last
141
141
  r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
142
- r7.extend(Feature0)
142
+ r7.extend(FeatureSub0)
143
143
  else
144
144
  self.index = i7
145
145
  r7 = nil
@@ -181,14 +181,14 @@ module Cucumber
181
181
  end
182
182
  if s0.last
183
183
  r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
184
- r0.extend(Feature1)
185
- r0.extend(Feature2)
184
+ r0.extend(FeatureSub1)
185
+ r0.extend(FeatureSub2)
186
186
  else
187
187
  self.index = i0
188
188
  r0 = nil
189
189
  end
190
190
 
191
- node_cache[:feature][start_index] = r0
191
+ node_cache[:feature_sub][start_index] = r0
192
192
 
193
193
  return r0
194
194
  end
@@ -215,6 +215,10 @@ module Cucumber
215
215
  ts.elements.detect{|e| e.tag.line == line}
216
216
  end
217
217
 
218
+ def has_all_tags?(tags)
219
+ (tags & tag_names) == tags
220
+ end
221
+
218
222
  def has_tags?(tags)
219
223
  (tag_names & tags).any?
220
224
  end
@@ -495,6 +499,11 @@ module Cucumber
495
499
  feature_tags.has_tags?(tag_names)
496
500
  end
497
501
 
502
+ def has_all_tags?(tag_names)
503
+ feature_tags = self.parent.tags
504
+ feature_tags.has_all_tags?(tag_names)
505
+ end
506
+
498
507
  def build
499
508
  Ast::Background.new(
500
509
  comment.build,
@@ -692,6 +701,11 @@ module Cucumber
692
701
  tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
693
702
  end
694
703
 
704
+ def has_all_tags?(tag_names)
705
+ feature_tags = self.parent.parent.tags
706
+ tags.has_all_tags?(tag_names) || feature_tags.has_all_tags?(tag_names)
707
+ end
708
+
695
709
  def matches_name?(regexp_to_match)
696
710
  name.build =~ regexp_to_match
697
711
  end
@@ -830,6 +844,11 @@ module Cucumber
830
844
  tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
831
845
  end
832
846
 
847
+ def has_all_tags?(tag_names)
848
+ feature_tags = self.parent.parent.tags
849
+ tags.has_all_tags?(tag_names) || feature_tags.has_all_tags?(tag_names)
850
+ end
851
+
833
852
  def matches_name?(regexp_to_match)
834
853
  outline_matches_name?(regexp_to_match) || examples_sections.matches_name?(regexp_to_match)
835
854
  end
@@ -1166,6 +1185,10 @@ module Cucumber
1166
1185
  true
1167
1186
  end
1168
1187
 
1188
+ def has_all_tags?(tag_names)
1189
+ true
1190
+ end
1191
+
1169
1192
  def outline_at_line?(line)
1170
1193
  true
1171
1194
  end
@@ -1346,7 +1369,7 @@ module Cucumber
1346
1369
 
1347
1370
  module LinesToKeyword2
1348
1371
  def build
1349
- self.text_value.split("\n").map{|s| s.strip }.join("\n")
1372
+ self.text_value.split("\n").map{|s| s.strip}.join("\n")
1350
1373
  end
1351
1374
  end
1352
1375