class Facebooker::Parser

Constants

PARSERS

Public Class Methods

anonymous_field_from(child, hash) click to toggle source
# File lib/facebooker/parser.rb, line 161
def self.anonymous_field_from(child, hash)
  if child.name == 'anon'
    (hash[child.name] || []) << child.content.strip
  end
end
array_of(response_element, element_name) { |element| ... } click to toggle source
# File lib/facebooker/parser.rb, line 44
def self.array_of(response_element, element_name)
  values_to_return = []
  response_element.children.each do |element|
    next if element.text?
    next unless element.name == element_name
    values_to_return << yield(element)
  end
  values_to_return
end
array_of_hashes(response_element, element_name) click to toggle source
# File lib/facebooker/parser.rb, line 60
def self.array_of_hashes(response_element, element_name)
  array_of(response_element, element_name) do |element|
    hashinate(element)
  end
end
array_of_text_values(response_element, element_name) click to toggle source
# File lib/facebooker/parser.rb, line 54
def self.array_of_text_values(response_element, element_name)
  array_of(response_element, element_name) do |element|
    element.content.strip
  end
end
booleanize(response) click to toggle source
# File lib/facebooker/parser.rb, line 157
def self.booleanize(response)
  response == "1" ? true : false
end
element(name, data) click to toggle source
# File lib/facebooker/parser.rb, line 66
def self.element(name, data)
  data = data.body rescue data # either data or an HTTP response
  if Object.const_defined?(:Nokogiri)
    xml = Nokogiri::XML(data.strip)
    if node = xml.at(name)
      return node
    end
    if xml.root.name == name
      return xml.root
    end
  else
    doc = REXML::Document.new(data)
    doc.elements.each(name) do |element|
      return element
    end
  end
  raise "Element #{name} not found in #{data}"
end
hash_by_key_or_value_for(element, convert_1_to_true=false) click to toggle source
# File lib/facebooker/parser.rb, line 119
def self.hash_by_key_or_value_for(element, convert_1_to_true=false)
  if element.children.size == 0
    { element['key'] => nil }
  elsif element.children.size == 1 && element.children.first.text?
    { element['key'] => (convert_1_to_true ? element.content.strip == '1' : element.content.strip) }
  else
    hashinate_by_key(element, convert_1_to_true)
  end
end
hash_or_value_for(element) click to toggle source
# File lib/facebooker/parser.rb, line 85
def self.hash_or_value_for(element)
  if element.children.size == 1 && element.children.first.text?
    element.content.strip
  else
    # We can have lists in not list item
    if element['list'] == 'true'
      element.children.reject{|c| c.text? }.map { |subchild| hash_or_value_for(subchild)}
    else
      hashinate(element)
    end
  end
end
hashinate(response_element) click to toggle source
# File lib/facebooker/parser.rb, line 98
def self.hashinate(response_element)
  response_element.children.reject{|c| c.text? }.inject({}) do |hash, child|
    # If the node hasn't any child, and is not a list, we want empty strings, not empty hashes,
    #   except if attributes['nil'] == true
    hash[child.name] =
    if (child['nil'] == 'true')
      nil
    elsif (child.children.size == 1 && child.children.first.text?) || (child.children.size == 0 && child['list'] != 'true')
      anonymous_field_from(child, hash) || child.content.strip
    elsif child['list'] == 'true'
      child.children.reject{|c| c.text? }.map { |subchild| hash_or_value_for(subchild)}
    else
      child.children.reject{|c| c.text? }.inject({}) do |subhash, subchild|
        subhash[subchild.name] = hash_or_value_for(subchild)
        subhash
      end
    end #if (child.attributes)
    hash
  end #do |hash, child|
end
hashinate_by_key(response_element, convert_1_to_true=false) click to toggle source

A modification to hashinate. The new dashboard API returns XML in a different format than the other calls. What used to be the element name has become an attribute called “key”.

# File lib/facebooker/parser.rb, line 131
def self.hashinate_by_key(response_element, convert_1_to_true=false)
  response_element.children.reject{|c| c.text? }.inject({}) do |hash, child|
    
    # If the node hasn't any child, and is not a list, we want empty strings, not empty hashes,
    #   except if attributes['nil'] == true
    hash[child['key']] =
    if (child['nil'] == 'true')
      nil
    elsif (child.children.size == 1 && child.children.first.text?) || (child.children.size == 0 && child['list'] != 'true')
      anonymous_field_from(child, hash) || (convert_1_to_true ? child.content.strip == '1' : child.content.strip)
    elsif child['list'] == 'true' && child.children.reject {|subchild| subchild.text?}.all? { |subchild| !subchild.text? && subchild['key'].nil? }
      child.children.reject{|c| c.text? }.map { |subchild| hash_by_key_or_value_for(subchild, convert_1_to_true)}
    elsif child['list'] == 'true'
      hash_by_key_or_value_for(child, convert_1_to_true)
    else
      child.children.reject{|c| c.text? }.inject({}) do |subhash, subchild|
        subhash[subchild['key']] = hash_by_key_or_value_for(subchild, convert_1_to_true)
        subhash
      end
    end
    hash
  end
end
parse(method, data) click to toggle source
# File lib/facebooker/parser.rb, line 37
def self.parse(method, data)
  Errors.process(data)
  parser = Parser::PARSERS[method]
  raise "Can't find a parser for '#{method}'" unless parser
  parser.process(data)
end