Class: Facebooker::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/facebooker/parser.rb,
lib/facebooker/parser.rb

Defined Under Namespace

Modules: REXMLElementExtensions, REXMLTextExtensions

Constant Summary collapse

PARSERS =
{
  'facebook.auth.revokeAuthorization' => RevokeAuthorization,
  'facebook.auth.createToken' => CreateToken,
  'facebook.auth.getSession' => GetSession,
  'facebook.connect.registerUsers' => RegisterUsers,
  'facebook.connect.unregisterUsers' => UnregisterUsers,
  'facebook.connect.getUnconnectedFriendsCount' => GetUnconnectedFriendsCount,
  'facebook.users.getInfo' => UserInfo,
  'facebook.users.getStandardInfo' => UserStandardInfo,
  'facebook.users.setStatus' => SetStatus,
  'facebook.status.get' => GetStatus,
  'facebook.users.getLoggedInUser' => GetLoggedInUser,
  'facebook.users.hasAppPermission' => UserHasPermission,
  'facebook.pages.isAdmin' => PagesIsAdmin,
  'facebook.pages.getInfo' => PagesGetInfo,
  'facebook.pages.isFan' => PagesIsFan,
  'facebook.friends.get' => GetFriends,
  'facebook.friends.getLists' => FriendListsGet,
  'facebook.friends.areFriends' => AreFriends,
  'facebook.friends.getAppUsers' => GetAppUsers,
  'facebook.feed.publishStoryToUser' => PublishStoryToUser,
  'facebook.feed.publishActionOfUser' => PublishActionOfUser,
  'facebook.feed.publishTemplatizedAction' => PublishTemplatizedAction,
  'facebook.feed.registerTemplateBundle' => RegisterTemplateBundle,
  'facebook.feed.deactivateTemplateBundleByID' => DeactivateTemplateBundleByID,
  'facebook.feed.getRegisteredTemplateBundles' => GetRegisteredTemplateBundles,
  'facebook.feed.publishUserAction' => PublishUserAction,
  'facebook.notifications.get' => NotificationsGet,
  'facebook.notifications.send' => NotificationsSend,
  'facebook.notifications.sendRequest' => SendRequest,
  'facebook.profile.getFBML' => ProfileFBML,
  'facebook.profile.setFBML' => ProfileFBMLSet,
  'facebook.profile.getInfo' => ProfileInfo,
  'facebook.profile.setInfo' => ProfileInfoSet,
  'facebook.fbml.setRefHandle' => SetRefHandle,
  'facebook.fbml.refreshRefUrl' => RefreshRefURL,
  'facebook.fbml.refreshImgSrc' => RefreshImgSrc,
  'facebook.data.setCookie' => SetCookie,
  'facebook.data.getCookies' => GetCookies,
  'facebook.admin.setAppProperties' => SetAppProperties,
  'facebook.admin.getAppProperties' => GetAppProperties,
  'facebook.admin.setRestrictionInfo' => SetRestrictionInfo,
  'facebook.admin.getRestrictionInfo' => GetRestrictionInfo,
  'facebook.admin.getAllocation' => GetAllocation,
  'facebook.application.getPublicInfo' => GetPublicInfo,
  'facebook.batch.run' => BatchRun,
  'facebook.fql.query' => FqlQuery,
  'facebook.fql.multiquery' => FqlMultiquery,
  'facebook.photos.get' => GetPhotos,
  'facebook.photos.getAlbums' => GetAlbums,
  'facebook.photos.createAlbum' => CreateAlbum,
  'facebook.photos.getTags' => GetTags,
  'facebook.photos.addTag' => AddTags,
  'facebook.photos.upload' => UploadPhoto,
  'facebook.stream.publish' => StreamPublish,
  'facebook.stream.addComment' => StreamAddComment,
  'facebook.stream.addLike' => StreamAddLike,
  'facebook.events.create' => EventsCreate,
  'facebook.events.cancel' => EventsCancel,
  'facebook.events.get' => EventsGet,
  'facebook.events.rsvp' => EventsRsvp,
  'facebook.groups.get' => GroupsGet,
  'facebook.events.getMembers' => EventMembersGet,
  'facebook.groups.getMembers' => GroupGetMembers,
  'facebook.notifications.sendEmail' => NotificationsSendEmail,
  'facebook.data.getUserPreference' => GetPreference,
  'facebook.data.setUserPreference' => SetPreference,
  'facebook.video.upload' => UploadVideo,
  'facebook.sms.send' => SmsSend,
  'facebook.sms.canSend' => SmsCanSend
}

Class Method Summary collapse

Class Method Details

.anonymous_field_from(child, hash) ⇒ Object



116
117
118
119
120
# File 'lib/facebooker/parser.rb', line 116

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) ⇒ Object



42
43
44
45
46
47
48
49
50
# File 'lib/facebooker/parser.rb', line 42

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) ⇒ Object



58
59
60
61
62
# File 'lib/facebooker/parser.rb', line 58

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) ⇒ Object



52
53
54
55
56
# File 'lib/facebooker/parser.rb', line 52

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) ⇒ Object



112
113
114
# File 'lib/facebooker/parser.rb', line 112

def self.booleanize(response)
  response == "1" ? true : false
end

.element(name, data) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/facebooker/parser.rb', line 64

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_or_value_for(element) ⇒ Object



83
84
85
86
87
88
89
# File 'lib/facebooker/parser.rb', line 83

def self.hash_or_value_for(element)
  if element.children.size == 1 && element.children.first.text?
    element.content.strip
  else
    hashinate(element)
  end
end

.hashinate(response_element) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/facebooker/parser.rb', line 91

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

.parse(method, data) ⇒ Object



35
36
37
38
39
40
# File 'lib/facebooker/parser.rb', line 35

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