module CukeModeler::Parsing

A module providing source text parsing functionality.

Attributes

dialect[W]

The dialect that will be used to parse snippets of Gherkin text

Public Class Methods

dialect() click to toggle source

The dialect that will be used to parse snippets of Gherkin text

# File lib/cuke_modeler/parsing.rb, line 31
def dialect
  @dialect || 'en'
end
dialects() click to toggle source

The dialects currently known by the gherkin gem

# File lib/cuke_modeler/parsing.rb, line 36
def dialects
  Gherkin::DIALECTS
end
parse_text(source_text, filename = 'cuke_modeler_fake_file.feature') click to toggle source

Parses the Cucumber feature given in source_text and returns a hash representation of its logical structure. This is a standardized AST that should remain consistent across different versions of `cucumber-gherkin`

# File lib/cuke_modeler/parsing.rb, line 43
def parse_text(source_text, filename = 'cuke_modeler_fake_file.feature')
  unless source_text.is_a?(String)
    raise(ArgumentError, "Text to parse must be a String but got #{source_text.class}")
  end

  begin
    parsed_result = parsing_method(source_text.encode('UTF-8'), filename)
  rescue => e
    raise(ArgumentError, "Error encountered while parsing '#{filename}'\n#{e.class} - #{e.message}")
  end

  adapter_class.new.adapt(parsed_result)
end
parsing_method(source_text, filename) click to toggle source

TODO: make these methods private? NOT A PART OF THE PUBLIC API The method to use for parsing Gherkin text

# File lib/cuke_modeler/parsing.rb, line 70
def parsing_method(source_text, filename)
  messages = Gherkin.from_source(filename,
                                 source_text,
                                 { include_gherkin_document: true })
                    .to_a

  error_message = messages.find(&:parse_error)
  gherkin_ast_message = messages.find(&:gherkin_document)

  raise error_message.parse_error.message if error_message

  gherkin_ast_message.gherkin_document
end

Private Instance Methods

dialect_feature_keyword() click to toggle source
# File lib/cuke_modeler/parsing.rb, line 172
def dialect_feature_keyword
  get_word(Parsing.dialects[Parsing.dialect]['feature'])
end
dialect_outline_keyword() click to toggle source
# File lib/cuke_modeler/parsing.rb, line 180
def dialect_outline_keyword
  get_word(Parsing.dialects[Parsing.dialect]['scenarioOutline'] ||
             Parsing.dialects[Parsing.dialect]['scenario_outline'])
end
dialect_scenario_keyword() click to toggle source
# File lib/cuke_modeler/parsing.rb, line 176
def dialect_scenario_keyword
  get_word(Parsing.dialects[Parsing.dialect]['scenario'])
end
dialect_step_keyword() click to toggle source
# File lib/cuke_modeler/parsing.rb, line 185
def dialect_step_keyword
  get_word(Parsing.dialects[Parsing.dialect]['given'])
end
get_word(word_set) click to toggle source
# File lib/cuke_modeler/parsing.rb, line 189
def get_word(word_set)
  word_set = word_set.is_a?(Array) ? word_set : word_set.split('|')

  word_set.first
end