Class: Gherkin::Parser::FilterListener

Inherits:
Object
  • Object
show all
Defined in:
lib/gherkin/parser/filter_listener.rb

Overview

This class filters events based on filter criteria.

Instance Method Summary collapse

Constructor Details

#initialize(listener, filters) ⇒ FilterListener

Creates a new instance that replays events to listener, filtered by filters, an Array that can contain one of the following:

  • Line numbers (Fixnum) to filter on.

  • Name regexen (Regexp) to filter on. Matches against :feature, :background, :scenario, :scenario_outline and :examples

  • Tag expressions (String) to filter on.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/gherkin/parser/filter_listener.rb', line 18

def initialize(listener, filters)
  @listener = listener
  @filter_method = detect_filter(filters)
  
  @meta_buffer = []
  @feature_buffer = []
  @scenario_buffer = []
  @examples_buffer = []
  @examples_rows_buffer = []

  @feature_tags = []
  @scenario_tags = []
  @example_tags = []

  @table_state = :step
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(*event_args) ⇒ Object (private)



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/gherkin/parser/filter_listener.rb', line 41

def method_missing(*event_args)
  event = Event.new(event_args)

  return event.replay(@listener) if no_filters?

  case(event.event)
  when :tag
    @meta_buffer << event
  when :comment
    @meta_buffer << event
  when :feature
    @feature_buffer = @meta_buffer
    @feature_buffer << event
    @feature_tags = extract_tags
    @meta_buffer = []
    @feature_ok = true if filter_match?(event)
  when :background
    @feature_buffer += @meta_buffer
    @feature_buffer << event
    @meta_buffer = []
    @table_state = :background
    @background_ok = true if filter_match?(event)
  when :scenario
    replay_examples_rows_buffer
    @scenario_buffer = @meta_buffer
    @scenario_buffer << event
    @scenario_tags = extract_tags
    @example_tags = []
    @meta_buffer = []
    @scenario_ok = filter_match?(*@scenario_buffer) || tag_match?
    @examples_ok = false
    @background_ok = false
    @table_state = :step
  when :scenario_outline
    replay_examples_rows_buffer
    @scenario_buffer = @meta_buffer
    @scenario_buffer << event
    @scenario_tags = extract_tags
    @example_tags = []
    @meta_buffer = []
    @scenario_ok = filter_match?(*@scenario_buffer)
    @examples_ok = false
    @background_ok = false
    @table_state = :step
  when :examples
    replay_examples_rows_buffer
    @examples_buffer = @meta_buffer
    @examples_buffer << event
    @example_tags = extract_tags
    @meta_buffer = []
    @examples_rows_buffer = []
    @examples_ok = filter_match?(*@examples_buffer) || tag_match?
    @table_state = :examples
  when :step
    case(@table_state)
    when :background
      @feature_buffer += @meta_buffer
      @feature_buffer << event
      @meta_buffer = []
      @background_ok = true if filter_match?(event)
    else
      @scenario_buffer << event
      @scenario_ok ||= filter_match?(*@scenario_buffer)
      @table_state = :step
    end
  when :row
    case(@table_state)
    when :examples
      unless header_row_already_buffered?
        @examples_buffer << event
        @examples_ok = true if filter_match?(*@examples_buffer)
      else
        @examples_rows_buffer << event if @scenario_ok || @examples_ok || @feature_ok || filter_match?(event)
      end
    when :step
      @scenario_buffer << event
      @scenario_ok ||= filter_match?(*@scenario_buffer)
    when :background
      @feature_buffer += @meta_buffer
      @feature_buffer << event
      @meta_buffer = []
    else
      raise "Bad table_state:#{@table_state.inspect}"
    end
  when :py_string
    if @table_state == :background
      @feature_buffer << event
      @feature_ok ||= filter_match?(*@feature_buffer)
    else
      @scenario_buffer << event
      @scenario_ok ||= filter_match?(*@scenario_buffer)
    end
  when :eof
    replay_examples_rows_buffer
    event.replay(@listener)
    return
  else
    super
  end

  if @scenario_ok || @examples_ok || @feature_ok || @background_ok
    replay_buffers
  end
end

Instance Method Details

#location(uri, offset) ⇒ Object



35
36
37
# File 'lib/gherkin/parser/filter_listener.rb', line 35

def location(uri, offset)
  @listener.location(uri, offset)
end