class Pact::Query

Constants

COMMON_SEP
DEFAULT_SEP

Public Class Methods

create(query) click to toggle source
# File lib/pact/consumer_contract/query.rb, line 11
def self.create query
  if query.is_a? Hash
    Pact::QueryHash.new(query)
  else
    Pact::QueryString.new(query)
  end
end
is_a_query_object?(object) click to toggle source
# File lib/pact/consumer_contract/query.rb, line 19
def self.is_a_query_object?(object)
  object.is_a?(Pact::QueryHash) || object.is_a?(Pact::QueryString)
end
normalize_params(params, name, v) click to toggle source
# File lib/pact/consumer_contract/query.rb, line 79
def self.normalize_params(params, name, v)
  name =~ %r(\A[\[\]]*([^\[\]]+)\]*)
  k = $1 || ''
  after = $' || ''

  if k.empty?
    if !v.nil? && name == "[]"
      return Array(v)
    else
      return
    end
  end

  if after == ''
    params[k] = v
  elsif after == "["
    params[name] = v
  elsif after == "[]"
    params[k] ||= []
    raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
    params[k] << v
  elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$)
    child_key = $1
    params[k] ||= []
    raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
    if params_hash_type?(params[k].last) && !params_hash_has_key?(params[k].last, child_key)
      normalize_params(params[k].last, child_key, v)
    else
      params[k] << normalize_params({}, child_key, v)
    end
  else
    params[k] ||= {}
    raise ParameterTypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params_hash_type?(params[k])
    params[k] = normalize_params(params[k], after, v)
  end

  params
end
params_hash_has_key?(hash, key) click to toggle source
# File lib/pact/consumer_contract/query.rb, line 122
def self.params_hash_has_key?(hash, key)
  return false if key =~ /\[\]/

  key.split(/[\[\]]+/).inject(hash) do |h, part|
    next h if part == ''
    return false unless params_hash_type?(h) && h.key?(part)
    h[part]
  end

  true
end
params_hash_type?(obj) click to toggle source
# File lib/pact/consumer_contract/query.rb, line 118
def self.params_hash_type?(obj)
  obj.is_a?(Hash)
end
parse_string(query_string) click to toggle source
# File lib/pact/consumer_contract/query.rb, line 27
def self.parse_string query_string
  parsed_query = parse_string_as_non_nested_query(query_string)

  # If Rails nested params...
  if parsed_query.keys.any?{ | key| key =~ /\[.*\]/ }
    parse_string_as_nested_query(query_string)
  else
    parsed_query.each_with_object({}) do | (key, value), new_hash |
      new_hash[key] = [*value]
    end
  end
end
parse_string_as_nested_query(qs, d = nil) click to toggle source
# File lib/pact/consumer_contract/query.rb, line 65
def self.parse_string_as_nested_query(qs, d = nil)
  params = {}

  unless qs.nil? || qs.empty?
    (qs || '').split(d ? (COMMON_SEP[d] || /[#{d}] */n) : DEFAULT_SEP).each do |p|
      k, v = p.split('=', 2).map! { |s| unescape(s) }

      normalize_params(params, k, v)
    end
  end

  return NestedQuery[params.to_h]
end
parse_string_as_non_nested_query(qs, d = nil, &unescaper) click to toggle source

Ripped from Rack to avoid adding an unnecessary dependency, thank you Rack github.com/rack/rack/blob/649c72bab9e7b50d657b5b432d0c205c95c2be07/lib/rack/utils.rb

# File lib/pact/consumer_contract/query.rb, line 42
def self.parse_string_as_non_nested_query(qs, d = nil, &unescaper)
  unescaper ||= method(:unescape)

  params = {}

  (qs || '').split(d ? (COMMON_SEP[d] || /[#{d}] */n) : DEFAULT_SEP).each do |p|
    next if p.empty?
    k, v = p.split('=', 2).map!(&unescaper)

    if cur = params[k]
      if cur.class == Array
        params[k] << v
      else
        params[k] = [cur, v]
      end
    else
      params[k] = v
    end
  end

  return params.to_h
end
parsed_as_nested?(object) click to toggle source
# File lib/pact/consumer_contract/query.rb, line 23
def self.parsed_as_nested?(object)
  object.is_a?(NestedQuery)
end
unescape(s, encoding = Encoding::UTF_8) click to toggle source
# File lib/pact/consumer_contract/query.rb, line 134
def self.unescape(s, encoding = Encoding::UTF_8)
  URI.decode_www_form_component(s, encoding)
end