djanowski-facebooker 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. data/CHANGELOG.txt +0 -0
  2. data/COPYING +19 -0
  3. data/History.txt +16 -0
  4. data/Manifest.txt +110 -0
  5. data/README +46 -0
  6. data/README.txt +81 -0
  7. data/Rakefile +76 -0
  8. data/TODO.txt +10 -0
  9. data/generators/facebook/facebook_generator.rb +14 -0
  10. data/generators/facebook/templates/config/facebooker.yml +41 -0
  11. data/generators/facebook/templates/public/javascripts/facebooker.js +106 -0
  12. data/generators/facebook_controller/USAGE +33 -0
  13. data/generators/facebook_controller/facebook_controller_generator.rb +40 -0
  14. data/generators/facebook_controller/templates/controller.rb +7 -0
  15. data/generators/facebook_controller/templates/functional_test.rb +11 -0
  16. data/generators/facebook_controller/templates/helper.rb +2 -0
  17. data/generators/facebook_controller/templates/view.fbml.erb +2 -0
  18. data/generators/facebook_controller/templates/view.html.erb +2 -0
  19. data/generators/facebook_publisher/facebook_publisher_generator.rb +14 -0
  20. data/generators/facebook_publisher/templates/create_facebook_templates.rb +15 -0
  21. data/generators/facebook_publisher/templates/publisher.rb +3 -0
  22. data/generators/facebook_scaffold/USAGE +27 -0
  23. data/generators/facebook_scaffold/facebook_scaffold_generator.rb +118 -0
  24. data/generators/facebook_scaffold/templates/controller.rb +93 -0
  25. data/generators/facebook_scaffold/templates/facebook_style.css +2579 -0
  26. data/generators/facebook_scaffold/templates/functional_test.rb +89 -0
  27. data/generators/facebook_scaffold/templates/helper.rb +2 -0
  28. data/generators/facebook_scaffold/templates/layout.fbml.erb +6 -0
  29. data/generators/facebook_scaffold/templates/layout.html.erb +17 -0
  30. data/generators/facebook_scaffold/templates/style.css +74 -0
  31. data/generators/facebook_scaffold/templates/view_edit.fbml.erb +13 -0
  32. data/generators/facebook_scaffold/templates/view_edit.html.erb +18 -0
  33. data/generators/facebook_scaffold/templates/view_index.fbml.erb +24 -0
  34. data/generators/facebook_scaffold/templates/view_index.html.erb +24 -0
  35. data/generators/facebook_scaffold/templates/view_new.fbml.erb +12 -0
  36. data/generators/facebook_scaffold/templates/view_new.html.erb +17 -0
  37. data/generators/facebook_scaffold/templates/view_show.fbml.erb +10 -0
  38. data/generators/facebook_scaffold/templates/view_show.html.erb +10 -0
  39. data/generators/publisher/publisher_generator.rb +14 -0
  40. data/init.rb +54 -0
  41. data/install.rb +12 -0
  42. data/lib/facebooker/adapters/adapter_base.rb +87 -0
  43. data/lib/facebooker/adapters/bebo_adapter.rb +73 -0
  44. data/lib/facebooker/adapters/facebook_adapter.rb +48 -0
  45. data/lib/facebooker/admin.rb +28 -0
  46. data/lib/facebooker/batch_request.rb +44 -0
  47. data/lib/facebooker/data.rb +57 -0
  48. data/lib/facebooker/feed.rb +78 -0
  49. data/lib/facebooker/logging.rb +51 -0
  50. data/lib/facebooker/model.rb +123 -0
  51. data/lib/facebooker/models/affiliation.rb +10 -0
  52. data/lib/facebooker/models/album.rb +11 -0
  53. data/lib/facebooker/models/applicationproperties.rb +39 -0
  54. data/lib/facebooker/models/cookie.rb +10 -0
  55. data/lib/facebooker/models/education_info.rb +11 -0
  56. data/lib/facebooker/models/event.rb +26 -0
  57. data/lib/facebooker/models/friend_list.rb +14 -0
  58. data/lib/facebooker/models/group.rb +35 -0
  59. data/lib/facebooker/models/info_item.rb +10 -0
  60. data/lib/facebooker/models/info_section.rb +10 -0
  61. data/lib/facebooker/models/location.rb +8 -0
  62. data/lib/facebooker/models/notifications.rb +17 -0
  63. data/lib/facebooker/models/page.rb +27 -0
  64. data/lib/facebooker/models/photo.rb +10 -0
  65. data/lib/facebooker/models/tag.rb +12 -0
  66. data/lib/facebooker/models/user.rb +352 -0
  67. data/lib/facebooker/models/work_info.rb +9 -0
  68. data/lib/facebooker/parser.rb +540 -0
  69. data/lib/facebooker/rails/controller.rb +246 -0
  70. data/lib/facebooker/rails/facebook_asset_path.rb +18 -0
  71. data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
  72. data/lib/facebooker/rails/facebook_pretty_errors.rb +14 -0
  73. data/lib/facebooker/rails/facebook_request_fix.rb +24 -0
  74. data/lib/facebooker/rails/facebook_session_handling.rb +69 -0
  75. data/lib/facebooker/rails/facebook_url_rewriting.rb +39 -0
  76. data/lib/facebooker/rails/helpers.rb +615 -0
  77. data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
  78. data/lib/facebooker/rails/publisher.rb +492 -0
  79. data/lib/facebooker/rails/routing.rb +49 -0
  80. data/lib/facebooker/rails/test_helpers.rb +88 -0
  81. data/lib/facebooker/rails/utilities.rb +22 -0
  82. data/lib/facebooker/server_cache.rb +24 -0
  83. data/lib/facebooker/service.rb +31 -0
  84. data/lib/facebooker/session.rb +564 -0
  85. data/lib/facebooker/version.rb +9 -0
  86. data/lib/facebooker.rb +143 -0
  87. data/lib/net/http_multipart_post.rb +123 -0
  88. data/lib/tasks/facebooker.rake +18 -0
  89. data/lib/tasks/tunnel.rake +46 -0
  90. data/rails/init.rb +1 -0
  91. data/setup.rb +1585 -0
  92. data/templates/layout.erb +24 -0
  93. data/test/adapters_test.rb +98 -0
  94. data/test/batch_request_test.rb +82 -0
  95. data/test/event_test.rb +15 -0
  96. data/test/facebook_admin_test.rb +75 -0
  97. data/test/facebook_cache_test.rb +43 -0
  98. data/test/facebook_data_test.rb +84 -0
  99. data/test/facebooker_test.rb +855 -0
  100. data/test/fixtures/multipart_post_body_with_only_parameters.txt +33 -0
  101. data/test/fixtures/multipart_post_body_with_single_file.txt +38 -0
  102. data/test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt +38 -0
  103. data/test/http_multipart_post_test.rb +54 -0
  104. data/test/logging_test.rb +43 -0
  105. data/test/model_test.rb +91 -0
  106. data/test/publisher_test.rb +436 -0
  107. data/test/rails_integration_test.rb +1126 -0
  108. data/test/session_test.rb +587 -0
  109. data/test/test_helper.rb +60 -0
  110. data/test/user_test.rb +229 -0
  111. metadata +181 -0
@@ -0,0 +1,540 @@
1
+ require 'rexml/document'
2
+ require 'facebooker/session'
3
+ module Facebooker
4
+ class Parser
5
+
6
+ module REXMLElementExtensions
7
+ def text_value
8
+ self.children.first.to_s.strip
9
+ end
10
+ end
11
+
12
+ ::REXML::Element.__send__(:include, REXMLElementExtensions)
13
+
14
+ def self.parse(method, data)
15
+ Errors.process(data)
16
+ parser = Parser::PARSERS[method]
17
+ parser.process(
18
+ data
19
+ )
20
+ end
21
+
22
+ def self.array_of(response_element, element_name)
23
+ values_to_return = []
24
+ response_element.elements.each(element_name) do |element|
25
+ values_to_return << yield(element)
26
+ end
27
+ values_to_return
28
+ end
29
+
30
+ def self.array_of_text_values(response_element, element_name)
31
+ array_of(response_element, element_name) do |element|
32
+ element.text_value
33
+ end
34
+ end
35
+
36
+ def self.array_of_hashes(response_element, element_name)
37
+ array_of(response_element, element_name) do |element|
38
+ hashinate(element)
39
+ end
40
+ end
41
+
42
+ def self.element(name, data)
43
+ data = data.body rescue data # either data or an HTTP response
44
+ doc = REXML::Document.new(data)
45
+ doc.elements.each(name) do |element|
46
+ return element
47
+ end
48
+ raise "Element #{name} not found in #{data}"
49
+ end
50
+
51
+ def self.hash_or_value_for(element)
52
+ if element.children.size == 1 && element.children.first.kind_of?(REXML::Text)
53
+ element.text_value
54
+ else
55
+ hashinate(element)
56
+ end
57
+ end
58
+
59
+ def self.hashinate(response_element)
60
+ response_element.children.reject{|c| c.kind_of? REXML::Text}.inject({}) do |hash, child|
61
+ # If the node hasn't any child, and is not a list, we want empty strings, not empty hashes.
62
+ hash[child.name] = if (child.children.size == 1 && child.children.first.kind_of?(REXML::Text)) || (child.children.size == 0 && child.attributes['list'] != 'true')
63
+ anonymous_field_from(child, hash) || child.text_value
64
+ else
65
+ if child.attributes['list'] == 'true'
66
+ child.children.reject{|c| c.kind_of? REXML::Text}.map do |subchild|
67
+ hash_or_value_for(subchild)
68
+ end
69
+ else
70
+ child.children.reject{|c| c.kind_of? REXML::Text}.inject({}) do |subhash, subchild|
71
+ subhash[subchild.name] = hash_or_value_for(subchild)
72
+ subhash
73
+ end
74
+ end
75
+ end
76
+ hash
77
+ end
78
+ end
79
+
80
+ def self.anonymous_field_from(child, hash)
81
+ if child.name == 'anon'
82
+ (hash[child.name] || []) << child.text_value
83
+ end
84
+ end
85
+
86
+ end
87
+
88
+ class CreateToken < Parser#:nodoc:
89
+ def self.process(data)
90
+ element('auth_createToken_response', data).text_value
91
+ end
92
+ end
93
+
94
+ class RegisterUsers < Parser
95
+ def self.process(data)
96
+ array_of_text_values(element("connect_registerUsers_response", data), "connect_registerUsers_response_elt")
97
+ end
98
+ end
99
+
100
+ class GetSession < Parser#:nodoc:
101
+ def self.process(data)
102
+ hashinate(element('auth_getSession_response', data))
103
+ end
104
+ end
105
+
106
+ class GetFriends < Parser#:nodoc:
107
+ def self.process(data)
108
+ array_of_text_values(element('friends_get_response', data), 'uid')
109
+ end
110
+ end
111
+
112
+ class FriendListsGet < Parser#:nodoc:
113
+ def self.process(data)
114
+ array_of_hashes(element('friends_getLists_response', data), 'friendlist')
115
+ end
116
+ end
117
+
118
+ class UserInfo < Parser#:nodoc:
119
+ def self.process(data)
120
+ array_of_hashes(element('users_getInfo_response', data), 'user')
121
+ end
122
+ end
123
+
124
+ class UserStandardInfo < Parser#:nodoc:
125
+ def self.process(data)
126
+ array_of_hashes(element('users_getStandardInfo_response', data), 'standard_user_info')
127
+ end
128
+ end
129
+
130
+ class GetLoggedInUser < Parser#:nodoc:
131
+ def self.process(data)
132
+ Integer(element('users_getLoggedInUser_response', data).text_value)
133
+ end
134
+ end
135
+
136
+ class PagesIsAdmin < Parser#:nodoc:
137
+ def self.process(data)
138
+ element('pages_isAdmin_response', data).text_value == '1'
139
+ end
140
+ end
141
+
142
+ class PagesGetInfo < Parser#:nodoc:
143
+ def self.process(data)
144
+ array_of_hashes(element('pages_getInfo_response', data), 'page')
145
+ end
146
+ end
147
+
148
+ class PublishStoryToUser < Parser#:nodoc:
149
+ def self.process(data)
150
+ element('feed_publishStoryToUser_response', data).text_value
151
+ end
152
+ end
153
+
154
+ class RegisterTemplateBundle < Parser#:nodoc:
155
+ def self.process(data)
156
+ element('feed_registerTemplateBundle_response', data).text_value.to_i
157
+ end
158
+ end
159
+
160
+ class GetRegisteredTemplateBundles < Parser
161
+ def self.process(data)
162
+ array_of_hashes(element('feed_getRegisteredTemplateBundles_response',data), 'template_bundle')
163
+ end
164
+ end
165
+
166
+ class DeactivateTemplateBundleByID < Parser#:nodoc:
167
+ def self.process(data)
168
+ element('feed_deactivateTemplateBundleByID_response', data).text_value == '1'
169
+ end
170
+ end
171
+
172
+ class PublishUserAction < Parser#:nodoc:
173
+ def self.process(data)
174
+ element('feed_publishUserAction_response', data).children[1].text_value == "1"
175
+ end
176
+ end
177
+
178
+ class PublishActionOfUser < Parser#:nodoc:
179
+ def self.process(data)
180
+ element('feed_publishActionOfUser_response', data).text_value
181
+ end
182
+ end
183
+
184
+ class PublishTemplatizedAction < Parser#:nodoc:
185
+ def self.process(data)
186
+ element('feed_publishTemplatizedAction_response', data).children[1].text_value
187
+ end
188
+ end
189
+
190
+ class SetAppProperties < Parser#:nodoc:
191
+ def self.process(data)
192
+ element('admin_setAppProperties_response', data).text_value
193
+ end
194
+ end
195
+
196
+ class GetAppProperties < Parser#:nodoc:
197
+ def self.process(data)
198
+ element('admin_getAppProperties_response', data).text_value
199
+ end
200
+ end
201
+
202
+ class GetAllocation < Parser#:nodoc:
203
+ def self.process(data)
204
+ element('admin_getAllocation_response', data).text_value
205
+ end
206
+ end
207
+
208
+ class BatchRun < Parser #:nodoc:
209
+ class << self
210
+ def current_batch=(current_batch)
211
+ Thread.current[:facebooker_current_batch]=current_batch
212
+ end
213
+ def current_batch
214
+ Thread.current[:facebooker_current_batch]
215
+ end
216
+ end
217
+ def self.process(data)
218
+ array_of_text_values(element('batch_run_response',data),"batch_run_response_elt").each_with_index do |response,i|
219
+ batch_request=current_batch[i]
220
+ body=Struct.new(:body).new
221
+ body.body=CGI.unescapeHTML(response)
222
+ begin
223
+ batch_request.result=Parser.parse(batch_request.method,body)
224
+ rescue Exception=>ex
225
+ batch_request.exception_raised=ex
226
+ end
227
+ end
228
+ end
229
+ end
230
+
231
+ class GetAppUsers < Parser#:nodoc:
232
+ def self.process(data)
233
+ array_of_text_values(element('friends_getAppUsers_response', data), 'uid')
234
+ end
235
+ end
236
+
237
+ class NotificationsGet < Parser#:nodoc:
238
+ def self.process(data)
239
+ hashinate(element('notifications_get_response', data))
240
+ end
241
+ end
242
+
243
+ class NotificationsSend < Parser#:nodoc:
244
+ def self.process(data)
245
+ element('notifications_send_response', data).text_value
246
+ end
247
+ end
248
+
249
+ class NotificationsSendEmail < Parser#:nodoc:
250
+ def self.process(data)
251
+ element('notifications_sendEmail_response', data).text_value
252
+ end
253
+ end
254
+
255
+ class GetTags < Parser#nodoc:
256
+ def self.process(data)
257
+ array_of_hashes(element('photos_getTags_response', data), 'photo_tag')
258
+ end
259
+ end
260
+
261
+ class AddTags < Parser#nodoc:
262
+ def self.process(data)
263
+ element('photos_addTag_response', data)
264
+ end
265
+ end
266
+
267
+ class GetPhotos < Parser#nodoc:
268
+ def self.process(data)
269
+ array_of_hashes(element('photos_get_response', data), 'photo')
270
+ end
271
+ end
272
+
273
+ class GetAlbums < Parser#nodoc:
274
+ def self.process(data)
275
+ array_of_hashes(element('photos_getAlbums_response', data), 'album')
276
+ end
277
+ end
278
+
279
+ class CreateAlbum < Parser#:nodoc:
280
+ def self.process(data)
281
+ hashinate(element('photos_createAlbum_response', data))
282
+ end
283
+ end
284
+
285
+ class UploadPhoto < Parser#:nodoc:
286
+ def self.process(data)
287
+ hashinate(element('photos_upload_response', data))
288
+ end
289
+ end
290
+
291
+ class SendRequest < Parser#:nodoc:
292
+ def self.process(data)
293
+ element('notifications_sendRequest_response', data).text_value
294
+ end
295
+ end
296
+
297
+ class ProfileFBML < Parser#:nodoc:
298
+ def self.process(data)
299
+ element('profile_getFBML_response', data).text_value
300
+ end
301
+ end
302
+
303
+ class ProfileFBMLSet < Parser#:nodoc:
304
+ def self.process(data)
305
+ element('profile_setFBML_response', data).text_value
306
+ end
307
+ end
308
+
309
+ class ProfileInfo < Parser#:nodoc:
310
+ def self.process(data)
311
+ hashinate(element('profile_getInfo_response info_fields', data))
312
+ end
313
+ end
314
+
315
+ class ProfileInfoSet < Parser#:nodoc:
316
+ def self.process(data)
317
+ element('profile_setInfo_response', data).text_value
318
+ end
319
+ end
320
+
321
+ class FqlQuery < Parser#nodoc
322
+ def self.process(data)
323
+ root = element('fql_query_response', data)
324
+ first_child = root.children.reject{|c| c.kind_of?(REXML::Text)}.first
325
+ first_child.nil? ? [] : [first_child.name, array_of_hashes(root, first_child.name)]
326
+ end
327
+ end
328
+
329
+ class SetRefHandle < Parser#:nodoc:
330
+ def self.process(data)
331
+ element('fbml_setRefHandle_response', data).text_value
332
+ end
333
+ end
334
+
335
+ class RefreshRefURL < Parser#:nodoc:
336
+ def self.process(data)
337
+ element('fbml_refreshRefUrl_response', data).text_value
338
+ end
339
+ end
340
+
341
+ class RefreshImgSrc < Parser#:nodoc:
342
+ def self.process(data)
343
+ element('fbml_refreshImgSrc_response', data).text_value
344
+ end
345
+ end
346
+
347
+ class SetCookie < Parser#:nodoc:
348
+ def self.process(data)
349
+ element('data_setCookie_response', data).text_value
350
+ end
351
+ end
352
+
353
+ class GetCookies < Parser#:nodoc:
354
+ def self.process(data)
355
+ array_of_hashes(element('data_getCookie_response', data), 'cookies')
356
+ end
357
+ end
358
+
359
+ class EventsGet < Parser#:nodoc:
360
+ def self.process(data)
361
+ array_of_hashes(element('events_get_response', data), 'event')
362
+ end
363
+ end
364
+
365
+ class GroupGetMembers < Parser#:nodoc:
366
+ def self.process(data)
367
+ root = element('groups_getMembers_response', data)
368
+ result = ['members', 'admins', 'officers', 'not_replied'].map do |position|
369
+ array_of(root, position) {|element| element}.map do |element|
370
+ array_of_text_values(element, 'uid').map do |uid|
371
+ {:position => position}.merge(:uid => uid)
372
+ end
373
+ end
374
+ end.flatten
375
+ end
376
+ end
377
+
378
+ class EventMembersGet < Parser#:nodoc:
379
+ def self.process(data)
380
+ root = element('events_getMembers_response', data)
381
+ result = ['attending', 'declined', 'unsure', 'not_replied'].map do |rsvp_status|
382
+ array_of(root, rsvp_status) {|element| element}.map do |element|
383
+ array_of_text_values(element, 'uid').map do |uid|
384
+ {:rsvp_status => rsvp_status}.merge(:uid => uid)
385
+ end
386
+ end
387
+ end.flatten
388
+ end
389
+ end
390
+
391
+ class GroupsGet < Parser#:nodoc:
392
+ def self.process(data)
393
+ array_of_hashes(element('groups_get_response', data), 'group')
394
+ end
395
+ end
396
+
397
+ class AreFriends < Parser#:nodoc:
398
+ def self.process(data)
399
+ array_of_hashes(element('friends_areFriends_response', data), 'friend_info').inject({}) do |memo, hash|
400
+ memo[[Integer(hash['uid1']), Integer(hash['uid2'])].sort] = are_friends?(hash['are_friends'])
401
+ memo
402
+ end
403
+ end
404
+
405
+ private
406
+ def self.are_friends?(raw_value)
407
+ if raw_value == '1'
408
+ true
409
+ elsif raw_value == '0'
410
+ false
411
+ else
412
+ nil
413
+ end
414
+ end
415
+ end
416
+
417
+ class SetStatus < Parser
418
+ def self.process(data)
419
+ element('users_setStatus_response',data).text_value == '1'
420
+ end
421
+ end
422
+
423
+ class GetPreference < Parser#:nodoc:
424
+ def self.process(data)
425
+ element('data_getUserPreference_response', data).text_value
426
+ end
427
+ end
428
+
429
+ class SetPreference < Parser#:nodoc:
430
+ def self.process(data)
431
+ element('data_setUserPreference_response', data).text_value
432
+ end
433
+ end
434
+
435
+ class Errors < Parser#:nodoc:
436
+ EXCEPTIONS = {
437
+ 1 => Facebooker::Session::UnknownError,
438
+ 2 => Facebooker::Session::ServiceUnavailable,
439
+ 4 => Facebooker::Session::MaxRequestsDepleted,
440
+ 5 => Facebooker::Session::HostNotAllowed,
441
+ 100 => Facebooker::Session::MissingOrInvalidParameter,
442
+ 101 => Facebooker::Session::InvalidAPIKey,
443
+ 102 => Facebooker::Session::SessionExpired,
444
+ 103 => Facebooker::Session::CallOutOfOrder,
445
+ 104 => Facebooker::Session::IncorrectSignature,
446
+ 120 => Facebooker::Session::InvalidAlbumId,
447
+ 250 => Facebooker::Session::ExtendedPermissionRequired,
448
+ 321 => Facebooker::Session::AlbumIsFull,
449
+ 324 => Facebooker::Session::MissingOrInvalidImageFile,
450
+ 325 => Facebooker::Session::TooManyUnapprovedPhotosPending,
451
+ 330 => Facebooker::Session::TemplateDataMissingRequiredTokens,
452
+ 340 => Facebooker::Session::TooManyUserCalls,
453
+ 341 => Facebooker::Session::TooManyUserActionCalls,
454
+ 342 => Facebooker::Session::InvalidFeedTitleLink,
455
+ 343 => Facebooker::Session::InvalidFeedTitleLength,
456
+ 344 => Facebooker::Session::InvalidFeedTitleName,
457
+ 345 => Facebooker::Session::BlankFeedTitle,
458
+ 346 => Facebooker::Session::FeedBodyLengthTooLong,
459
+ 347 => Facebooker::Session::InvalidFeedPhotoSource,
460
+ 348 => Facebooker::Session::InvalidFeedPhotoLink,
461
+ 330 => Facebooker::Session::FeedMarkupInvalid,
462
+ 360 => Facebooker::Session::FeedTitleDataInvalid,
463
+ 361 => Facebooker::Session::FeedTitleTemplateInvalid,
464
+ 362 => Facebooker::Session::FeedBodyDataInvalid,
465
+ 363 => Facebooker::Session::FeedBodyTemplateInvalid,
466
+ 364 => Facebooker::Session::FeedPhotosNotRetrieved,
467
+ 366 => Facebooker::Session::FeedTargetIdsInvalid,
468
+ 601 => Facebooker::Session::FQLParseError,
469
+ 602 => Facebooker::Session::FQLFieldDoesNotExist,
470
+ 603 => Facebooker::Session::FQLTableDoesNotExist,
471
+ 604 => Facebooker::Session::FQLStatementNotIndexable,
472
+ 605 => Facebooker::Session::FQLFunctionDoesNotExist,
473
+ 606 => Facebooker::Session::FQLWrongNumberArgumentsPassedToFunction,
474
+ 807 => Facebooker::Session::TemplateBundleInvalid
475
+ }
476
+ def self.process(data)
477
+ response_element = element('error_response', data) rescue nil
478
+ if response_element
479
+ hash = hashinate(response_element)
480
+ exception = EXCEPTIONS[Integer(hash['error_code'])] || StandardError
481
+ raise exception.new(hash['error_msg'])
482
+ end
483
+ end
484
+ end
485
+
486
+ class Parser
487
+ PARSERS = {
488
+ 'facebook.auth.createToken' => CreateToken,
489
+ 'facebook.auth.getSession' => GetSession,
490
+ 'facebook.connect.registerUsers' => RegisterUsers,
491
+ 'facebook.users.getInfo' => UserInfo,
492
+ 'facebook.users.getStandardInfo' => UserStandardInfo,
493
+ 'facebook.users.setStatus' => SetStatus,
494
+ 'facebook.users.getLoggedInUser' => GetLoggedInUser,
495
+ 'facebook.pages.isAdmin' => PagesIsAdmin,
496
+ 'facebook.pages.getInfo' => PagesGetInfo,
497
+ 'facebook.friends.get' => GetFriends,
498
+ 'facebook.friends.getLists' => FriendListsGet,
499
+ 'facebook.friends.areFriends' => AreFriends,
500
+ 'facebook.friends.getAppUsers' => GetAppUsers,
501
+ 'facebook.feed.publishStoryToUser' => PublishStoryToUser,
502
+ 'facebook.feed.publishActionOfUser' => PublishActionOfUser,
503
+ 'facebook.feed.publishTemplatizedAction' => PublishTemplatizedAction,
504
+ 'facebook.feed.registerTemplateBundle' => RegisterTemplateBundle,
505
+ 'facebook.feed.deactivateTemplateBundleByID' => DeactivateTemplateBundleByID,
506
+ 'facebook.feed.getRegisteredTemplateBundles' => GetRegisteredTemplateBundles,
507
+ 'facebook.feed.publishUserAction' => PublishUserAction,
508
+ 'facebook.notifications.get' => NotificationsGet,
509
+ 'facebook.notifications.send' => NotificationsSend,
510
+ 'facebook.notifications.sendRequest' => SendRequest,
511
+ 'facebook.profile.getFBML' => ProfileFBML,
512
+ 'facebook.profile.setFBML' => ProfileFBMLSet,
513
+ 'facebook.profile.getInfo' => ProfileInfo,
514
+ 'facebook.profile.setInfo' => ProfileInfoSet,
515
+ 'facebook.fbml.setRefHandle' => SetRefHandle,
516
+ 'facebook.fbml.refreshRefUrl' => RefreshRefURL,
517
+ 'facebook.fbml.refreshImgSrc' => RefreshImgSrc,
518
+ 'facebook.data.setCookie' => SetCookie,
519
+ 'facebook.data.getCookies' => GetCookies,
520
+ 'facebook.admin.setAppProperties' => SetAppProperties,
521
+ 'facebook.admin.getAppProperties' => GetAppProperties,
522
+ 'facebook.admin.getAllocation' => GetAllocation,
523
+ 'facebook.batch.run' => BatchRun,
524
+ 'facebook.fql.query' => FqlQuery,
525
+ 'facebook.photos.get' => GetPhotos,
526
+ 'facebook.photos.getAlbums' => GetAlbums,
527
+ 'facebook.photos.createAlbum' => CreateAlbum,
528
+ 'facebook.photos.getTags' => GetTags,
529
+ 'facebook.photos.addTag' => AddTags,
530
+ 'facebook.photos.upload' => UploadPhoto,
531
+ 'facebook.events.get' => EventsGet,
532
+ 'facebook.groups.get' => GroupsGet,
533
+ 'facebook.events.getMembers' => EventMembersGet,
534
+ 'facebook.groups.getMembers' => GroupGetMembers,
535
+ 'facebook.notifications.sendEmail' => NotificationsSendEmail,
536
+ 'facebook.data.getUserPreference' => GetPreference,
537
+ 'facebook.data.setUserPreference' => SetPreference
538
+ }
539
+ end
540
+ end