class Gherkin::JSONParser

Public Class Methods

new(reporter, formatter) click to toggle source
# File lib/gherkin/json_parser.rb, line 13
def initialize(reporter, formatter)
  @reporter, @formatter = reporter, formatter
end

Public Instance Methods

parse(o) click to toggle source

Parse a gherkin object o, which can either be a JSON String, or a Hash (from a parsed JSON String).

# File lib/gherkin/json_parser.rb, line 19
def parse(o)
  o = JSON.parse(o) if String === o

  o.each do |f|
    @formatter.uri(f['uri'])
    Formatter::Model::Feature.new(comments(f), tags(f), keyword(f), name(f), description(f), line(f), id(f)).replay(@formatter)
    (f["elements"] || []).each do |feature_element|
      feature_element(feature_element).replay(@formatter)

      (feature_element["before"] || []).each do |hook|
        before(hook)
      end

      (feature_element["steps"] || []).each do |step|
        step(step).replay(@formatter)
        match(step)
        result(step)
        embeddings(step)
        output(step)
      end

      (feature_element["after"] || []).each do |hook|
        after(hook)
      end

      (feature_element["examples"] || []).each do |eo|
        Formatter::Model::Examples.new(comments(eo), tags(eo), keyword(eo), name(eo), description(eo), line(eo), id(eo), examples_rows(eo['rows'])).replay(@formatter)
      end
    end
  end

  @formatter.eof
end

Private Instance Methods

after(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 101
def after(o)
  m = o['match']
  match = Formatter::Model::Match.new([], location(m))
  r = o['result']
  result = Formatter::Model::Result.new(status(r), duration(r), error_message(r))
  @reporter.after(match, result)
end
arguments(m) click to toggle source
# File lib/gherkin/json_parser.rb, line 157
def arguments(m)
  m['arguments'].map{|a| Formatter::Argument.new(a['offset'], a['val'])}
end
before(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 93
def before(o)
  m = o['match']
  match = Formatter::Model::Match.new([], location(m))
  r = o['result']
  result = Formatter::Model::Result.new(status(r), duration(r), error_message(r))
  @reporter.before(match, result)
end
comments(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 125
def comments(o)
  (o['comments'] || []).map do |comment|
    Formatter::Model::Comment.new(comment['value'], comment['line'])
  end
end
description(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 145
def description(o)
  o['description']
end
duration(r) click to toggle source
# File lib/gherkin/json_parser.rb, line 169
def duration(r)
  r['duration']
end
embeddings(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 109
def embeddings(o)
  (o['embeddings'] || []).each do |embedding|
    @reporter.embedding(embedding['mime_type'], Base64::decode64(embedding['data']))
  end
end
error_message(r) click to toggle source
# File lib/gherkin/json_parser.rb, line 173
def error_message(r)
  r['error_message']
end
examples_rows(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 121
def examples_rows(o)
  o.map{|row| Formatter::Model::ExamplesTableRow.new(comments(row), row['cells'], row['line'], row['id'])}
end
feature_element(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 55
def feature_element(o)
  case o['type']
  when 'background'
    Formatter::Model::Background.new(comments(o), keyword(o), name(o), description(o), line(o))
  when 'scenario'
    Formatter::Model::Scenario.new(comments(o), tags(o), keyword(o), name(o), description(o), line(o), id(o))
  when 'scenario_outline'
    Formatter::Model::ScenarioOutline.new(comments(o), tags(o), keyword(o), name(o), description(o), line(o), id(o))
  end
end
id(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 153
def id(o)
  o['id']
end
keyword(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 137
def keyword(o)
  o['keyword']
end
line(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 149
def line(o)
  o['line']
end
location(m) click to toggle source
# File lib/gherkin/json_parser.rb, line 161
def location(m)
  m['location']
end
match(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 81
def match(o)
  if(m = o['match'])
    Formatter::Model::Match.new(arguments(m), location(m)).replay(@reporter)
  end
end
name(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 141
def name(o)
  o['name']
end
output(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 115
def output(o)
  (o['output'] || []).each do |text|
    @reporter.write(text)
  end
end
result(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 87
def result(o)
  if(r = o['result'])
    Formatter::Model::Result.new(status(r), duration(r), error_message(r)).replay(@reporter)
  end
end
status(r) click to toggle source
# File lib/gherkin/json_parser.rb, line 165
def status(r)
  r['status']
end
step(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 66
def step(o)
  builder = Formatter::Model::Step::Builder.new(comments(o), keyword(o), name(o), line(o))

  (o['rows'] || []).each do |row|
    builder.row comments(row), row['cells'], row['line'], nil
  end

  if(o['doc_string'])
    ds = o['doc_string']
    builder.doc_string ds['value'], ds['content_type'].to_s, ds['line']
  end

  builder.build
end
tags(o) click to toggle source
# File lib/gherkin/json_parser.rb, line 131
def tags(o)
  (o['tags'] || []).map do |tag|
    Formatter::Model::Tag.new(tag['name'], tag['line'])
  end
end