gherkin 2.0.2-i386-mswin32 → 2.1.0-i386-mswin32

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.
Files changed (61) hide show
  1. data/History.txt +12 -0
  2. data/LICENSE +1 -1
  3. data/README.rdoc +2 -2
  4. data/Rakefile +2 -2
  5. data/VERSION.yml +2 -2
  6. data/features/json_formatter.feature +3 -41
  7. data/features/step_definitions/gherkin_steps.rb +5 -6
  8. data/features/step_definitions/json_formatter_steps.rb +3 -2
  9. data/features/step_definitions/json_lexer_steps.rb +5 -5
  10. data/features/step_definitions/pretty_formatter_steps.rb +9 -13
  11. data/features/support/env.rb +1 -1
  12. data/lib/gherkin/formatter/argument.rb +1 -0
  13. data/lib/gherkin/formatter/filter_formatter.rb +149 -0
  14. data/lib/gherkin/formatter/json_formatter.rb +35 -45
  15. data/lib/gherkin/formatter/line_filter.rb +26 -0
  16. data/lib/gherkin/formatter/model.rb +85 -0
  17. data/lib/gherkin/formatter/pretty_formatter.rb +36 -39
  18. data/lib/gherkin/formatter/regexp_filter.rb +17 -0
  19. data/lib/gherkin/formatter/tag_count_formatter.rb +44 -0
  20. data/lib/gherkin/i18n.rb +5 -5
  21. data/lib/gherkin/i18n.yml +13 -0
  22. data/lib/gherkin/i18n_lexer.rb +2 -2
  23. data/lib/gherkin/{json_lexer.rb → json_parser.rb} +17 -5
  24. data/lib/gherkin/{parser → listener}/event.rb +1 -1
  25. data/lib/gherkin/{parser → listener}/formatter_listener.rb +30 -23
  26. data/lib/gherkin/native/java.rb +9 -1
  27. data/lib/gherkin/parser/parser.rb +27 -14
  28. data/lib/gherkin/rubify.rb +5 -1
  29. data/lib/gherkin/tag_expression.rb +62 -0
  30. data/lib/gherkin/tools/files.rb +3 -4
  31. data/lib/gherkin/tools/reformat.rb +2 -2
  32. data/lib/gherkin/tools/stats.rb +3 -4
  33. data/lib/gherkin/tools/stats_listener.rb +1 -1
  34. data/ragel/lexer.c.rl.erb +2 -3
  35. data/ragel/lexer.java.rl.erb +1 -2
  36. data/ragel/lexer.rb.rl.erb +1 -2
  37. data/spec/gherkin/fixtures/complex_for_filtering.feature +60 -0
  38. data/spec/gherkin/fixtures/complex_with_tags.feature +61 -0
  39. data/spec/gherkin/fixtures/hantu_pisang.feature +35 -0
  40. data/spec/gherkin/formatter/filter_formatter_spec.rb +156 -0
  41. data/spec/gherkin/formatter/model_spec.rb +15 -0
  42. data/spec/gherkin/formatter/pretty_formatter_spec.rb +17 -16
  43. data/spec/gherkin/formatter/tag_count_formatter_spec.rb +31 -0
  44. data/spec/gherkin/i18n_lexer_spec.rb +3 -3
  45. data/spec/gherkin/i18n_spec.rb +2 -4
  46. data/spec/gherkin/{json_lexer_spec.rb → json_parser_spec.rb} +13 -8
  47. data/spec/gherkin/sexp_recorder.rb +10 -4
  48. data/spec/gherkin/shared/lexer_group.rb +0 -40
  49. data/spec/gherkin/shared/py_string_group.rb +0 -1
  50. data/spec/gherkin/shared/row_group.rb +1 -2
  51. data/spec/gherkin/tag_expression_spec.rb +137 -0
  52. data/spec/spec_helper.rb +5 -1
  53. data/tasks/bench.rake +5 -9
  54. metadata +33 -25
  55. data/lib/gherkin/parser/filter_listener.rb +0 -203
  56. data/lib/gherkin/parser/row.rb +0 -15
  57. data/lib/gherkin/parser/tag_expression.rb +0 -50
  58. data/spec/gherkin/parser/filter_listener_spec.rb +0 -397
  59. data/spec/gherkin/parser/formatter_listener_spec.rb +0 -134
  60. data/spec/gherkin/parser/parser_spec.rb +0 -50
  61. data/spec/gherkin/parser/tag_expression_spec.rb +0 -116
@@ -52,7 +52,6 @@ EOS
52
52
  it "should parse content separated by two newlines" do
53
53
  scan ps("A\n\nB")
54
54
  @listener.to_sexp.should == [
55
- [:location, 'test.feature', 0],
56
55
  [:py_string, "A\n\nB", 1],
57
56
  [:eof]
58
57
  ]
@@ -5,7 +5,7 @@ module Gherkin
5
5
  module Lexer
6
6
  shared_examples_for "a Gherkin lexer lexing rows" do
7
7
  def scan(gherkin)
8
- @lexer.scan(gherkin, "test.feature", 0)
8
+ @lexer.scan(gherkin)
9
9
  end
10
10
 
11
11
  rows = {
@@ -43,7 +43,6 @@ module Gherkin
43
43
  it "should allow utf-8" do
44
44
  scan(" | ůﻚ | 2 | \n")
45
45
  @listener.to_sexp.should == [
46
- [:location, 'test.feature', 0],
47
46
  [:row, ["ůﻚ", "2"], 1],
48
47
  [:eof]
49
48
  ]
@@ -0,0 +1,137 @@
1
+ require 'spec_helper'
2
+ require 'gherkin/tag_expression'
3
+
4
+ module Gherkin
5
+ describe TagExpression do
6
+ context "no tags" do
7
+ before(:each) do
8
+ @e = Gherkin::TagExpression.new([])
9
+ end
10
+
11
+ it "should match @foo" do
12
+ @e.eval(['@foo']).should == true
13
+ end
14
+
15
+ it "should match empty tags" do
16
+ @e.eval([]).should == true
17
+ end
18
+ end
19
+
20
+ context "@foo" do
21
+ before(:each) do
22
+ @e = Gherkin::TagExpression.new(['@foo'])
23
+ end
24
+
25
+ it "should match @foo" do
26
+ @e.eval(['@foo']).should == true
27
+ end
28
+
29
+ it "should not match @bar" do
30
+ @e.eval(['@bar']).should == false
31
+ end
32
+
33
+ it "should not match no tags" do
34
+ @e.eval([]).should == false
35
+ end
36
+ end
37
+
38
+ context "!@foo" do
39
+ before(:each) do
40
+ @e = Gherkin::TagExpression.new(['~@foo'])
41
+ end
42
+
43
+ it "should match @bar" do
44
+ @e.eval(['@bar']).should == true
45
+ end
46
+
47
+ it "should not match @foo" do
48
+ @e.eval(['@foo']).should == false
49
+ end
50
+ end
51
+
52
+ context "@foo || @bar" do
53
+ before(:each) do
54
+ @e = Gherkin::TagExpression.new(['@foo,@bar'])
55
+ end
56
+
57
+ it "should match @foo" do
58
+ @e.eval(['@foo']).should == true
59
+ end
60
+
61
+ it "should match @bar" do
62
+ @e.eval(['@bar']).should == true
63
+ end
64
+
65
+ it "should not match @zap" do
66
+ @e.eval(['@zap']).should == false
67
+ end
68
+ end
69
+
70
+ context "(@foo || @bar) && !@zap" do
71
+ before(:each) do
72
+ @e = Gherkin::TagExpression.new(['@foo,@bar', '~@zap'])
73
+ end
74
+
75
+ it "should match @foo" do
76
+ @e.eval(['@foo']).should == true
77
+ end
78
+
79
+ it "should not match @foo @zap" do
80
+ @e.eval(['@foo', '@zap']).should == false
81
+ end
82
+ end
83
+
84
+ context "(@foo:3 || !@bar:4) && @zap:5" do
85
+ before(:each) do
86
+ @e = Gherkin::TagExpression.new(['@foo:3,~@bar','@zap:5'])
87
+ end
88
+
89
+ it "should count tags for positive tags" do
90
+ rubify_hash(@e.limits).should == {'@foo' => 3, '@zap' => 5}
91
+ end
92
+
93
+ it "should match @foo @zap" do
94
+ @e.eval(['@foo', '@zap']).should == true
95
+ end
96
+ end
97
+
98
+ context "Parsing '@foo:3,~@bar', '@zap:5'" do
99
+ before(:each) do
100
+ @e = Gherkin::TagExpression.new([' @foo:3 , ~@bar ', ' @zap:5 '])
101
+ end
102
+
103
+ unless defined?(JRUBY_VERSION)
104
+ it "should split and trim (ruby implementation detail)" do
105
+ @e.__send__(:ruby_expression).should == "(!vars['@bar']||vars['@foo'])&&(vars['@zap'])"
106
+ end
107
+ end
108
+
109
+ it "should have limits" do
110
+ rubify_hash(@e.limits).should == {"@zap"=>5, "@foo"=>3}
111
+ end
112
+ end
113
+
114
+ context "Tag limits" do
115
+ it "should be counted for negative tags" do
116
+ @e = Gherkin::TagExpression.new(['~@todo:3'])
117
+ rubify_hash(@e.limits).should == {"@todo"=>3}
118
+ end
119
+
120
+ it "should be counted for positive tags" do
121
+ @e = Gherkin::TagExpression.new(['@todo:3'])
122
+ rubify_hash(@e.limits).should == {"@todo"=>3}
123
+ end
124
+
125
+ it "should raise an error for inconsistent limits" do
126
+ lambda do
127
+ @e = Gherkin::TagExpression.new(['@todo:3', '~@todo:4'])
128
+ end.should raise_error(/Inconsistent tag limits for @todo: 3 and 4/)
129
+ end
130
+
131
+ it "should allow duplicate consistent limits" do
132
+ @e = Gherkin::TagExpression.new(['@todo:3', '~@todo:3'])
133
+ rubify_hash(@e.limits).should == {"@todo"=>3}
134
+ end
135
+ end
136
+ end
137
+ end
data/spec/spec_helper.rb CHANGED
@@ -11,7 +11,11 @@ require 'gherkin/shared/row_group'
11
11
 
12
12
  module GherkinSpecHelper
13
13
  def scan_file(file)
14
- @lexer.scan(File.new(File.dirname(__FILE__) + "/gherkin/fixtures/" + file).read, file, 0)
14
+ @lexer.scan(fixture(file))
15
+ end
16
+
17
+ def fixture(file)
18
+ File.new(File.dirname(__FILE__) + "/gherkin/fixtures/" + file).read
15
19
  end
16
20
 
17
21
  def rubify_hash(hash)
data/tasks/bench.rake CHANGED
@@ -106,23 +106,19 @@ class Benchmarker
106
106
 
107
107
  def run_rb_gherkin
108
108
  require 'gherkin'
109
- require 'gherkin/i18n_lexer'
110
- require 'null_listener'
111
- parser = Gherkin::Parser::Parser.new(NullListener.new, true, "root")
112
- lexer = Gherkin::I18nLexer.new(parser, true)
109
+ require 'null_formatter'
110
+ parser = Gherkin::Parser::Parser.new(NullFormatter.new, true, "root", true)
113
111
  @features.each do |feature|
114
- lexer.scan(File.read(feature), feature, 0)
112
+ parser.parse(File.read(feature), feature, 0)
115
113
  end
116
114
  end
117
115
 
118
116
  def run_native_gherkin
119
117
  require 'gherkin'
120
- require 'gherkin/i18n_lexer'
121
118
  require 'null_listener'
122
- parser = Gherkin::Parser::Parser.new(NullListener.new, true, "root")
123
- lexer = Gherkin::I18nLexer.new(parser, false)
119
+ parser = Gherkin::Parser::Parser.new(NullFormatter.new, true, "root", false)
124
120
  @features.each do |feature|
125
- lexer.scan(File.read(feature), feature, 0)
121
+ parser.parse(File.read(feature), feature, 0)
126
122
  end
127
123
  end
128
124
 
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
+ - 1
8
9
  - 0
9
- - 2
10
- version: 2.0.2
10
+ version: 2.1.0
11
11
  platform: i386-mswin32
12
12
  authors:
13
13
  - Mike Sassak
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2010-06-16 00:00:00 +02:00
20
+ date: 2010-07-12 00:00:00 +02:00
21
21
  default_executable: gherkin
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
- hash: 62196469
47
+ hash: 62196477
48
48
  segments:
49
49
  - 2
50
50
  - 0
51
51
  - 0
52
52
  - beta
53
- - 11
54
- version: 2.0.0.beta.11
53
+ - 15
54
+ version: 2.0.0.beta.15
55
55
  type: :development
56
56
  version_requirements: *id002
57
57
  - !ruby/object:Gem::Dependency
@@ -62,12 +62,12 @@ dependencies:
62
62
  requirements:
63
63
  - - ~>
64
64
  - !ruby/object:Gem::Version
65
- hash: 61
65
+ hash: 55
66
66
  segments:
67
67
  - 0
68
68
  - 8
69
- - 1
70
- version: 0.8.1
69
+ - 4
70
+ version: 0.8.4
71
71
  type: :development
72
72
  version_requirements: *id003
73
73
  - !ruby/object:Gem::Dependency
@@ -136,6 +136,7 @@ files:
136
136
  - lib/1.8/gherkin_lexer_en.so
137
137
  - lib/1.8/gherkin_lexer_en_au.so
138
138
  - lib/1.8/gherkin_lexer_en_lol.so
139
+ - lib/1.8/gherkin_lexer_en_pirate.so
139
140
  - lib/1.8/gherkin_lexer_en_scouse.so
140
141
  - lib/1.8/gherkin_lexer_en_tx.so
141
142
  - lib/1.8/gherkin_lexer_eo.so
@@ -180,6 +181,7 @@ files:
180
181
  - lib/1.9/gherkin_lexer_en.so
181
182
  - lib/1.9/gherkin_lexer_en_au.so
182
183
  - lib/1.9/gherkin_lexer_en_lol.so
184
+ - lib/1.9/gherkin_lexer_en_pirate.so
183
185
  - lib/1.9/gherkin_lexer_en_scouse.so
184
186
  - lib/1.9/gherkin_lexer_en_tx.so
185
187
  - lib/1.9/gherkin_lexer_eo.so
@@ -220,30 +222,33 @@ files:
220
222
  - lib/gherkin/formatter/argument.rb
221
223
  - lib/gherkin/formatter/colors.rb
222
224
  - lib/gherkin/formatter/escaping.rb
225
+ - lib/gherkin/formatter/filter_formatter.rb
223
226
  - lib/gherkin/formatter/json_formatter.rb
227
+ - lib/gherkin/formatter/line_filter.rb
228
+ - lib/gherkin/formatter/model.rb
224
229
  - lib/gherkin/formatter/monochrome_format.rb
225
230
  - lib/gherkin/formatter/pretty_formatter.rb
231
+ - lib/gherkin/formatter/regexp_filter.rb
232
+ - lib/gherkin/formatter/tag_count_formatter.rb
226
233
  - lib/gherkin/i18n.rb
227
234
  - lib/gherkin/i18n.yml
228
235
  - lib/gherkin/i18n_lexer.rb
229
- - lib/gherkin/json_lexer.rb
236
+ - lib/gherkin/json_parser.rb
237
+ - lib/gherkin/listener/event.rb
238
+ - lib/gherkin/listener/formatter_listener.rb
230
239
  - lib/gherkin/native.rb
231
240
  - lib/gherkin/native/ikvm.rb
232
241
  - lib/gherkin/native/java.rb
233
242
  - lib/gherkin/native/null.rb
234
- - lib/gherkin/parser/event.rb
235
- - lib/gherkin/parser/filter_listener.rb
236
- - lib/gherkin/parser/formatter_listener.rb
237
243
  - lib/gherkin/parser/meta.txt
238
244
  - lib/gherkin/parser/parser.rb
239
245
  - lib/gherkin/parser/root.txt
240
- - lib/gherkin/parser/row.rb
241
246
  - lib/gherkin/parser/steps.txt
242
- - lib/gherkin/parser/tag_expression.rb
243
247
  - lib/gherkin/rb_lexer.rb
244
248
  - lib/gherkin/rb_lexer/.gitignore
245
249
  - lib/gherkin/rb_lexer/README.rdoc
246
250
  - lib/gherkin/rubify.rb
251
+ - lib/gherkin/tag_expression.rb
247
252
  - lib/gherkin/tools.rb
248
253
  - lib/gherkin/tools/files.rb
249
254
  - lib/gherkin/tools/reformat.rb
@@ -259,7 +264,10 @@ files:
259
264
  - spec/gherkin/fixtures/comments_in_table.feature
260
265
  - spec/gherkin/fixtures/complex.feature
261
266
  - spec/gherkin/fixtures/complex.json
267
+ - spec/gherkin/fixtures/complex_for_filtering.feature
268
+ - spec/gherkin/fixtures/complex_with_tags.feature
262
269
  - spec/gherkin/fixtures/dos_line_endings.feature
270
+ - spec/gherkin/fixtures/hantu_pisang.feature
263
271
  - spec/gherkin/fixtures/i18n_fr.feature
264
272
  - spec/gherkin/fixtures/i18n_no.feature
265
273
  - spec/gherkin/fixtures/i18n_zh-CN.feature
@@ -268,24 +276,24 @@ files:
268
276
  - spec/gherkin/fixtures/with_bom.feature
269
277
  - spec/gherkin/formatter/argument_spec.rb
270
278
  - spec/gherkin/formatter/colors_spec.rb
279
+ - spec/gherkin/formatter/filter_formatter_spec.rb
280
+ - spec/gherkin/formatter/model_spec.rb
271
281
  - spec/gherkin/formatter/pretty_formatter_spec.rb
272
282
  - spec/gherkin/formatter/spaces.feature
273
283
  - spec/gherkin/formatter/tabs.feature
284
+ - spec/gherkin/formatter/tag_count_formatter_spec.rb
274
285
  - spec/gherkin/i18n_lexer_spec.rb
275
286
  - spec/gherkin/i18n_spec.rb
276
287
  - spec/gherkin/java_lexer_spec.rb
277
- - spec/gherkin/json_lexer_spec.rb
288
+ - spec/gherkin/json_parser_spec.rb
278
289
  - spec/gherkin/output_stream_string_io.rb
279
- - spec/gherkin/parser/filter_listener_spec.rb
280
- - spec/gherkin/parser/formatter_listener_spec.rb
281
- - spec/gherkin/parser/parser_spec.rb
282
- - spec/gherkin/parser/tag_expression_spec.rb
283
290
  - spec/gherkin/rb_lexer_spec.rb
284
291
  - spec/gherkin/sexp_recorder.rb
285
292
  - spec/gherkin/shared/lexer_group.rb
286
293
  - spec/gherkin/shared/py_string_group.rb
287
294
  - spec/gherkin/shared/row_group.rb
288
295
  - spec/gherkin/shared/tags_group.rb
296
+ - spec/gherkin/tag_expression_spec.rb
289
297
  - spec/spec_helper.rb
290
298
  - tasks/bench.rake
291
299
  - tasks/bench/feature_builder.rb
@@ -337,20 +345,20 @@ test_files:
337
345
  - spec/gherkin/c_lexer_spec.rb
338
346
  - spec/gherkin/formatter/argument_spec.rb
339
347
  - spec/gherkin/formatter/colors_spec.rb
348
+ - spec/gherkin/formatter/filter_formatter_spec.rb
349
+ - spec/gherkin/formatter/model_spec.rb
340
350
  - spec/gherkin/formatter/pretty_formatter_spec.rb
351
+ - spec/gherkin/formatter/tag_count_formatter_spec.rb
341
352
  - spec/gherkin/i18n_lexer_spec.rb
342
353
  - spec/gherkin/i18n_spec.rb
343
354
  - spec/gherkin/java_lexer_spec.rb
344
- - spec/gherkin/json_lexer_spec.rb
355
+ - spec/gherkin/json_parser_spec.rb
345
356
  - spec/gherkin/output_stream_string_io.rb
346
- - spec/gherkin/parser/filter_listener_spec.rb
347
- - spec/gherkin/parser/formatter_listener_spec.rb
348
- - spec/gherkin/parser/parser_spec.rb
349
- - spec/gherkin/parser/tag_expression_spec.rb
350
357
  - spec/gherkin/rb_lexer_spec.rb
351
358
  - spec/gherkin/sexp_recorder.rb
352
359
  - spec/gherkin/shared/lexer_group.rb
353
360
  - spec/gherkin/shared/py_string_group.rb
354
361
  - spec/gherkin/shared/row_group.rb
355
362
  - spec/gherkin/shared/tags_group.rb
363
+ - spec/gherkin/tag_expression_spec.rb
356
364
  - spec/spec_helper.rb
@@ -1,203 +0,0 @@
1
- require 'gherkin/parser/event'
2
- require 'gherkin/parser/tag_expression'
3
- require 'gherkin/native'
4
-
5
- module Gherkin
6
- module Parser
7
- # This class filters events based on filter criteria.
8
- class FilterListener
9
- native_impl('gherkin')
10
-
11
- # Creates a new instance that replays events to +listener+, filtered by +filters+,
12
- # an Array that can contain one of the following:
13
- #
14
- # * Line numbers (Fixnum) to filter on.
15
- # * Name regexen (Regexp) to filter on. Matches against :feature, :background, :scenario, :scenario_outline and :examples
16
- # * Tag expressions (String) to filter on.
17
- #
18
- def initialize(listener, filters)
19
- @listener = listener
20
- @filter_method = detect_filter(filters)
21
-
22
- @meta_buffer = []
23
- @feature_buffer = []
24
- @scenario_buffer = []
25
- @examples_buffer = []
26
- @examples_rows_buffer = []
27
-
28
- @feature_tags = []
29
- @scenario_tags = []
30
- @example_tags = []
31
-
32
- @table_state = :step
33
- end
34
-
35
- def location(uri, offset)
36
- @listener.location(uri, offset)
37
- end
38
-
39
- private
40
-
41
- def method_missing(*event_args)
42
- event = Event.new(event_args)
43
-
44
- return event.replay(@listener) if no_filters?
45
-
46
- case(event.event)
47
- when :tag
48
- @meta_buffer << event
49
- when :comment
50
- @meta_buffer << event
51
- when :feature
52
- @feature_buffer = @meta_buffer
53
- @feature_buffer << event
54
- @feature_tags = extract_tags
55
- @meta_buffer = []
56
- @feature_ok = true if filter_match?(event)
57
- when :background
58
- @feature_buffer += @meta_buffer
59
- @feature_buffer << event
60
- @meta_buffer = []
61
- @table_state = :background
62
- @background_ok = true if filter_match?(event)
63
- when :scenario
64
- replay_examples_rows_buffer
65
- @scenario_buffer = @meta_buffer
66
- @scenario_buffer << event
67
- @scenario_tags = extract_tags
68
- @example_tags = []
69
- @meta_buffer = []
70
- @scenario_ok = filter_match?(*@scenario_buffer) || tag_match?
71
- @examples_ok = false
72
- @background_ok = false
73
- @table_state = :step
74
- when :scenario_outline
75
- replay_examples_rows_buffer
76
- @scenario_buffer = @meta_buffer
77
- @scenario_buffer << event
78
- @scenario_tags = extract_tags
79
- @example_tags = []
80
- @meta_buffer = []
81
- @scenario_ok = filter_match?(*@scenario_buffer)
82
- @examples_ok = false
83
- @background_ok = false
84
- @table_state = :step
85
- when :examples
86
- replay_examples_rows_buffer
87
- @examples_buffer = @meta_buffer
88
- @examples_buffer << event
89
- @example_tags = extract_tags
90
- @meta_buffer = []
91
- @examples_rows_buffer = []
92
- @examples_ok = filter_match?(*@examples_buffer) || tag_match?
93
- @table_state = :examples
94
- when :step
95
- case(@table_state)
96
- when :background
97
- @feature_buffer += @meta_buffer
98
- @feature_buffer << event
99
- @meta_buffer = []
100
- @background_ok = true if filter_match?(event)
101
- else
102
- @scenario_buffer << event
103
- @scenario_ok ||= filter_match?(*@scenario_buffer)
104
- @table_state = :step
105
- end
106
- when :row
107
- case(@table_state)
108
- when :examples
109
- unless header_row_already_buffered?
110
- @examples_buffer << event
111
- @examples_ok = true if filter_match?(*@examples_buffer)
112
- else
113
- @examples_rows_buffer << event if @scenario_ok || @examples_ok || @feature_ok || filter_match?(event)
114
- end
115
- when :step
116
- @scenario_buffer << event
117
- @scenario_ok ||= filter_match?(*@scenario_buffer)
118
- when :background
119
- @feature_buffer += @meta_buffer
120
- @feature_buffer << event
121
- @meta_buffer = []
122
- else
123
- raise "Bad table_state:#{@table_state.inspect}"
124
- end
125
- when :py_string
126
- if @table_state == :background
127
- @feature_buffer << event
128
- @feature_ok ||= filter_match?(*@feature_buffer)
129
- else
130
- @scenario_buffer << event
131
- @scenario_ok ||= filter_match?(*@scenario_buffer)
132
- end
133
- when :eof
134
- replay_examples_rows_buffer
135
- event.replay(@listener)
136
- return
137
- else
138
- super
139
- end
140
-
141
- if @scenario_ok || @examples_ok || @feature_ok || @background_ok
142
- replay_buffers
143
- end
144
- end
145
-
146
- def detect_filter(filters)
147
- @filters = filters
148
- raise "Bad filter: #{filters.inspect}" if filters.map{|filter| filter.class}.uniq.length > 1
149
- @filter_method = case(filters[0])
150
- when Fixnum
151
- :line_match?
152
- when Regexp
153
- :name_match?
154
- when String
155
- TagExpression.new(filters)
156
- end
157
- end
158
-
159
- def no_filters?
160
- @filters.empty?
161
- end
162
-
163
- def header_row_already_buffered?
164
- return @examples_buffer.any? && @examples_buffer[-1].event == :row
165
- end
166
-
167
- def filter_match?(*events)
168
- return false unless[:name_match?, :line_match?].include?(@filter_method)
169
- events.detect{|event| event.__send__(@filter_method, @filters)}
170
- end
171
-
172
- def tag_match?
173
- return TagExpression === @filter_method && @filter_method.eval(current_tags)
174
- end
175
-
176
- def replay_buffers
177
- (@feature_buffer + @scenario_buffer).each do |event|
178
- event.replay(@listener)
179
- end
180
- @feature_buffer = []
181
- @scenario_buffer = []
182
- end
183
-
184
- def replay_examples_rows_buffer
185
- if @examples_rows_buffer.any?
186
- replay_buffers
187
- (@examples_buffer + @examples_rows_buffer).each do |event|
188
- event.replay(@listener)
189
- end
190
- @examples_rows_buffer = []
191
- end
192
- end
193
-
194
- def current_tags
195
- @feature_tags + @scenario_tags + @example_tags
196
- end
197
-
198
- def extract_tags
199
- @meta_buffer.select { |event| event.event == :tag }.map { |event| event.keyword }
200
- end
201
- end
202
- end
203
- end