class Hurley::Query

Constants

AMP
EMPTY_BRACKET
EMPTY_ESCAPED_BRACKET
END_BRACKET
EQ
FORM_TYPE
MULTIPART_TYPE
START_BRACKET

Public Class Methods

default() click to toggle source
# File lib/hurley/query.rb, line 7
def self.default
  @default ||= Nested
end
inherited(base) click to toggle source
Calls superclass method
# File lib/hurley/query.rb, line 79
def self.inherited(base)
  super
  class << base
    def parse(raw_query)
      q = new
      q.parse_query(raw_query)
      q
    end
  end
end
new(initial = nil) click to toggle source
# File lib/hurley/query.rb, line 15
def initialize(initial = nil)
  @hash = {}
  update(initial) if initial
end
parse(raw_query) click to toggle source
# File lib/hurley/query.rb, line 11
def self.parse(raw_query)
  default.parse(raw_query)
end

Public Instance Methods

inspect() click to toggle source
# File lib/hurley/query.rb, line 72
def inspect
  "#<%s %s>" % [
    self.class.name,
    @hash.inspect,
  ]
end
multipart?() click to toggle source
# File lib/hurley/query.rb, line 53
def multipart?
  any_multipart?(@hash.values)
end
parse_query(raw_query) click to toggle source
# File lib/hurley/query.rb, line 43
def parse_query(raw_query)
  raw_query.to_s.split(AMP).each do |pair|
    next if pair.empty?
    escaped_key, escaped_value = pair.split(EQ, 2)
    key = CGI.unescape(escaped_key)
    value = escaped_value ? CGI.unescape(escaped_value) : nil
    send(:decode_pair, key, value)
  end
end
subset_of?(url) click to toggle source
# File lib/hurley/query.rb, line 30
def subset_of?(url)
  query = url.respond_to?(:query) ? url.query : url
  @hash.keys.all? do |key|
    query[key] == @hash[key]
  end
end
to_form(options = nil) click to toggle source
# File lib/hurley/query.rb, line 61
def to_form(options = nil)
  if multipart?
    boundary = (options || RequestOptions.new).boundary
    return MULTIPART_TYPE % boundary, to_io(boundary)
  else
    return FORM_TYPE, StringIO.new(to_query_string)
  end
end
to_query_string() click to toggle source
# File lib/hurley/query.rb, line 57
def to_query_string
  build_pairs.map!(&:to_s).join(AMP)
end
Also aliased as: to_s
to_s()
Alias for: to_query_string
update(absolute) click to toggle source
# File lib/hurley/query.rb, line 37
def update(absolute)
  absolute.each do |key, value|
    @hash[key] = value unless key?(key)
  end
end

Private Instance Methods

any_multipart?(array) click to toggle source

Private Hurley::Query methods

# File lib/hurley/query.rb, line 190
def any_multipart?(array)
  array.any? do |v|
    case v
    when Array then any_multipart?(v)
    when Hash then any_multipart?(v.values)
    else
      v.respond_to?(:read)
    end
  end
end
build_pairs() click to toggle source
# File lib/hurley/query.rb, line 219
def build_pairs
  pairs = []
  @hash.each do |key, value|
    escaped_key = Url.escape_path(key)
    case value
    when nil then pairs << Pair.new(key, escaped_key, nil)
    when Array
      encode_array(pairs, key, escaped_key, value)
    when Hash
      encode_hash(pairs, key, escaped_key, value)
    else
      pairs << Pair.new(key, escaped_key, value)
    end
  end
  pairs
end
encode_array(pairs, key, escaped_key, value) click to toggle source
# File lib/hurley/query.rb, line 236
def encode_array(pairs, key, escaped_key, value)
  raise NotImplementedError
end
encode_hash(pairs, key, escaped_key, value) click to toggle source
# File lib/hurley/query.rb, line 240
def encode_hash(pairs, key, escaped_key, value)
  raise NotImplementedError
end
to_io(boundary, part_headers = nil) click to toggle source
# File lib/hurley/query.rb, line 201
def to_io(boundary, part_headers = nil)
  parts = []

  part_headers ||= {}
  build_pairs.each do |pair|
    parts << Multipart::Part.new(boundary, pair.key, pair.value, part_headers[pair.key])
  end
  parts << Multipart::EpiloguePart.new(boundary)
  ios = []
  len = 0
  parts.each do |part|
    len += part.length
    ios << part.to_io
  end

  CompositeReadIO.new(len, *ios)
end