module Airborne::PathMatcher

Public Instance Methods

get_by_path(path, json) { |json| ... } click to toggle source
# File lib/airborne/path_matcher.rb, line 5
def get_by_path(path, json, &block)
  fail PathError, "Invalid Path, contains '..'" if /\.\./ =~ path
  type = false
  parts = path.split('.')
  parts.each_with_index do |part, index|
    if part == '*' || part == '?'
      ensure_array(path, json)
      type = part
      if index < parts.length.pred
        walk_with_path(type, index, path, parts, json, &block) && return
      end
      next
    end
    begin
      json = process_json(part, json)
    rescue
      raise PathError, "Expected #{json.class}\nto be an object with property #{part}"
    end
  end
  if type == '*'
    expect_all(json, &block)
  elsif type == '?'
    expect_one(path, json, &block)
  else
    yield json
  end
end

Private Instance Methods

ensure_array(path, json) click to toggle source
# File lib/airborne/path_matcher.rb, line 97
def ensure_array(path, json)
  fail RSpec::Expectations::ExpectationNotMetError, "Expected #{path} to be array got #{json.class} from JSON response" unless json.class == Array
end
ensure_match_all(error) click to toggle source
# File lib/airborne/path_matcher.rb, line 93
def ensure_match_all(error)
  fail error unless error.nil?
end
ensure_match_one(path, item_count, error_count) click to toggle source
# File lib/airborne/path_matcher.rb, line 89
def ensure_match_one(path, item_count, error_count)
  fail RSpec::Expectations::ExpectationNotMetError, "Expected one object in path #{path} to match provided JSON values" if item_count == error_count
end
expect_all(json) { |part| ... } click to toggle source
# File lib/airborne/path_matcher.rb, line 79
def expect_all(json, &block)
  last_error = nil
  begin
    json.each { |part| yield part }
  rescue Exception => e
    last_error = e
  end
  ensure_match_all(last_error)
end
expect_one(path, json) { |part| ... } click to toggle source
# File lib/airborne/path_matcher.rb, line 66
def expect_one(path, json, &block)
  item_count = json.length
  error_count = 0
  json.each do |part|
    begin
      yield part
    rescue Exception
      error_count += 1
      ensure_match_one(path, item_count, error_count)
    end
  end
end
index?(part) click to toggle source
# File lib/airborne/path_matcher.rb, line 62
def index?(part)
  part =~ /^\d+$/
end
process_json(part, json) click to toggle source
# File lib/airborne/path_matcher.rb, line 52
def process_json(part, json)
  if index?(part) && json.is_a?(Array)
    part = part.to_i
    json = json[part]
  else
    json = json[part.to_sym]
  end
  json
end
walk_with_path(type, index, path, parts, json, &block) click to toggle source
# File lib/airborne/path_matcher.rb, line 35
def walk_with_path(type, index, path, parts, json, &block)
  last_error  = nil
  item_count = json.length
  error_count = 0
  json.each do |element|
    begin
      sub_path = parts[(index.next)...(parts.length)].join('.')
      get_by_path(sub_path, element, &block)
    rescue Exception => e
      last_error = e
      error_count += 1
    end
    ensure_match_all(last_error) if type == '*'
    ensure_match_one(path, item_count, error_count) if type == '?'
  end
end