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