require 'gherkin/native' require 'gherkin/parser/row' module Gherkin module Parser # Adapter from the "raw" Gherkin Listener API # to the slightly more high-level Formatter API, # which is easier to implement (less state to keep track of). class FormatterListener native_impl('gherkin') def initialize(formatter) @formatter = formatter @comments = [] @tags = [] @table = nil end def location(uri, offset) @uri = uri @offset = offset end def comment(content, line) @comments << content end def tag(name, line) @tags << name end def feature(keyword, name, description, line) @formatter.feature(grab_comments!, grab_tags!, keyword, name, description, @uri) end def background(keyword, name, description, line) @formatter.background(grab_comments!, keyword, name, description, line) end def scenario(keyword, name, description, line) replay_step_or_examples @formatter.scenario(grab_comments!, grab_tags!, keyword, name, description, line) end def scenario_outline(keyword, name, description, line) replay_step_or_examples @formatter.scenario_outline(grab_comments!, grab_tags!, keyword, name, description, line) end def examples(keyword, name, description, line) replay_step_or_examples @examples = [grab_comments!, grab_tags!, keyword, name, description, line] end def step(keyword, name, line) replay_step_or_examples @step = [grab_comments!, keyword, name, line] end def row(cells, line) @table ||= [] @table << Row.new(cells, grab_comments!, line) end def py_string(py_string, line) @py_string = py_string end def eof replay_step_or_examples @formatter.eof end private def grab_comments! comments = @comments @comments = [] comments end def grab_tags! tags = @tags @tags = [] tags end def grab_table! table = @table @table = nil table end def grab_py_string! py_string = @py_string @py_string = nil py_string end def replay_step_or_examples if(@step) multiline_arg = grab_py_string! || grab_table! @formatter.step(*(@step + [multiline_arg, nil, nil, nil, nil])) @step = nil end if(@examples) @formatter.examples(*(@examples + [grab_table!])) @examples = nil end end end end end