gs_graph 2.6.5

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 (348) hide show
  1. data/.document +5 -0
  2. data/.gitattributes +22 -0
  3. data/.gitignore +26 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +3 -0
  6. data/Gemfile +11 -0
  7. data/Gemfile.lock +95 -0
  8. data/LICENSE +20 -0
  9. data/README.rdoc +314 -0
  10. data/Rakefile +25 -0
  11. data/VERSION +1 -0
  12. data/assets/fb_graph.ai +1726 -6
  13. data/assets/fb_graph.png +0 -0
  14. data/gs_graph.gemspec +28 -0
  15. data/lib/gs_graph.rb +174 -0
  16. data/lib/gs_graph/achievement.rb +44 -0
  17. data/lib/gs_graph/action.rb +12 -0
  18. data/lib/gs_graph/ad_account.rb +51 -0
  19. data/lib/gs_graph/ad_campaign.rb +39 -0
  20. data/lib/gs_graph/ad_campaign_stat.rb +22 -0
  21. data/lib/gs_graph/ad_connection_object.rb +53 -0
  22. data/lib/gs_graph/ad_creative.rb +44 -0
  23. data/lib/gs_graph/ad_group.rb +51 -0
  24. data/lib/gs_graph/ad_group_stat.rb +22 -0
  25. data/lib/gs_graph/ad_keyword.rb +20 -0
  26. data/lib/gs_graph/ad_keyword_suggestion.rb +8 -0
  27. data/lib/gs_graph/ad_keyword_valid.rb +23 -0
  28. data/lib/gs_graph/ad_preview.rb +10 -0
  29. data/lib/gs_graph/ad_user.rb +58 -0
  30. data/lib/gs_graph/age_range.rb +12 -0
  31. data/lib/gs_graph/album.rb +59 -0
  32. data/lib/gs_graph/app_request.rb +24 -0
  33. data/lib/gs_graph/application.rb +119 -0
  34. data/lib/gs_graph/auth.rb +88 -0
  35. data/lib/gs_graph/auth/cookie.rb +20 -0
  36. data/lib/gs_graph/auth/signed_request.rb +44 -0
  37. data/lib/gs_graph/broad_targeting_category.rb +13 -0
  38. data/lib/gs_graph/checkin.rb +51 -0
  39. data/lib/gs_graph/collection.rb +55 -0
  40. data/lib/gs_graph/comment.rb +24 -0
  41. data/lib/gs_graph/comparison.rb +13 -0
  42. data/lib/gs_graph/connection.rb +37 -0
  43. data/lib/gs_graph/connections.rb +3 -0
  44. data/lib/gs_graph/connections/accounts.rb +23 -0
  45. data/lib/gs_graph/connections/achievements.rb +21 -0
  46. data/lib/gs_graph/connections/activities.rb +14 -0
  47. data/lib/gs_graph/connections/ad_accounts.rb +15 -0
  48. data/lib/gs_graph/connections/ad_campaign_stats.rb +22 -0
  49. data/lib/gs_graph/connections/ad_campaigns.rb +30 -0
  50. data/lib/gs_graph/connections/ad_connection_objects.rb +14 -0
  51. data/lib/gs_graph/connections/ad_creatives.rb +14 -0
  52. data/lib/gs_graph/connections/ad_group_stats.rb +22 -0
  53. data/lib/gs_graph/connections/ad_groups.rb +35 -0
  54. data/lib/gs_graph/connections/ad_previews.rb +10 -0
  55. data/lib/gs_graph/connections/admins.rb +10 -0
  56. data/lib/gs_graph/connections/albums.rb +21 -0
  57. data/lib/gs_graph/connections/app_notifications.rb +10 -0
  58. data/lib/gs_graph/connections/app_requests.rb +21 -0
  59. data/lib/gs_graph/connections/attending.rb +26 -0
  60. data/lib/gs_graph/connections/banned.rb +31 -0
  61. data/lib/gs_graph/connections/blocked.rb +36 -0
  62. data/lib/gs_graph/connections/books.rb +14 -0
  63. data/lib/gs_graph/connections/broad_targeting_categories.rb +14 -0
  64. data/lib/gs_graph/connections/checkins.rb +21 -0
  65. data/lib/gs_graph/connections/comments.rb +21 -0
  66. data/lib/gs_graph/connections/conversations.rb +14 -0
  67. data/lib/gs_graph/connections/declined.rb +25 -0
  68. data/lib/gs_graph/connections/docs.rb +14 -0
  69. data/lib/gs_graph/connections/events.rb +21 -0
  70. data/lib/gs_graph/connections/family.rb +14 -0
  71. data/lib/gs_graph/connections/feed.rb +21 -0
  72. data/lib/gs_graph/connections/former_participants.rb +14 -0
  73. data/lib/gs_graph/connections/friend_lists.rb +21 -0
  74. data/lib/gs_graph/connections/friend_requests.rb +12 -0
  75. data/lib/gs_graph/connections/friends.rb +14 -0
  76. data/lib/gs_graph/connections/games.rb +14 -0
  77. data/lib/gs_graph/connections/groups.rb +14 -0
  78. data/lib/gs_graph/connections/home.rb +14 -0
  79. data/lib/gs_graph/connections/inbox.rb +20 -0
  80. data/lib/gs_graph/connections/insights.rb +27 -0
  81. data/lib/gs_graph/connections/interests.rb +14 -0
  82. data/lib/gs_graph/connections/invited.rb +36 -0
  83. data/lib/gs_graph/connections/likes.rb +29 -0
  84. data/lib/gs_graph/connections/links.rb +21 -0
  85. data/lib/gs_graph/connections/maybe.rb +25 -0
  86. data/lib/gs_graph/connections/members.rb +22 -0
  87. data/lib/gs_graph/connections/messages.rb +22 -0
  88. data/lib/gs_graph/connections/milestones.rb +21 -0
  89. data/lib/gs_graph/connections/movies.rb +14 -0
  90. data/lib/gs_graph/connections/music.rb +14 -0
  91. data/lib/gs_graph/connections/mutual_friends.rb +26 -0
  92. data/lib/gs_graph/connections/noreply.rb +23 -0
  93. data/lib/gs_graph/connections/notes.rb +21 -0
  94. data/lib/gs_graph/connections/notifications.rb +18 -0
  95. data/lib/gs_graph/connections/offers.rb +22 -0
  96. data/lib/gs_graph/connections/outbox.rb +20 -0
  97. data/lib/gs_graph/connections/participants.rb +14 -0
  98. data/lib/gs_graph/connections/payments.rb +14 -0
  99. data/lib/gs_graph/connections/permissions.rb +16 -0
  100. data/lib/gs_graph/connections/photos.rb +21 -0
  101. data/lib/gs_graph/connections/picture.rb +39 -0
  102. data/lib/gs_graph/connections/pokes.rb +12 -0
  103. data/lib/gs_graph/connections/posts.rb +14 -0
  104. data/lib/gs_graph/connections/promotable_posts.rb +14 -0
  105. data/lib/gs_graph/connections/question_options.rb +14 -0
  106. data/lib/gs_graph/connections/questions.rb +22 -0
  107. data/lib/gs_graph/connections/reach_estimates.rb +12 -0
  108. data/lib/gs_graph/connections/roles.rb +36 -0
  109. data/lib/gs_graph/connections/scores.rb +22 -0
  110. data/lib/gs_graph/connections/senders.rb +14 -0
  111. data/lib/gs_graph/connections/settings.rb +65 -0
  112. data/lib/gs_graph/connections/statuses.rb +14 -0
  113. data/lib/gs_graph/connections/subscribed_to.rb +14 -0
  114. data/lib/gs_graph/connections/subscribers.rb +14 -0
  115. data/lib/gs_graph/connections/subscriptions.rb +53 -0
  116. data/lib/gs_graph/connections/tabs.rb +23 -0
  117. data/lib/gs_graph/connections/tagged.rb +14 -0
  118. data/lib/gs_graph/connections/tags.rb +23 -0
  119. data/lib/gs_graph/connections/television.rb +14 -0
  120. data/lib/gs_graph/connections/test_users.rb +19 -0
  121. data/lib/gs_graph/connections/threads.rb +14 -0
  122. data/lib/gs_graph/connections/user_achievements.rb +22 -0
  123. data/lib/gs_graph/connections/user_likes.rb +19 -0
  124. data/lib/gs_graph/connections/videos.rb +21 -0
  125. data/lib/gs_graph/connections/votes.rb +9 -0
  126. data/lib/gs_graph/cover.rb +10 -0
  127. data/lib/gs_graph/debugger.rb +28 -0
  128. data/lib/gs_graph/device.rb +11 -0
  129. data/lib/gs_graph/doc.rb +18 -0
  130. data/lib/gs_graph/domain.rb +32 -0
  131. data/lib/gs_graph/education.rb +32 -0
  132. data/lib/gs_graph/event.rb +52 -0
  133. data/lib/gs_graph/exception.rb +139 -0
  134. data/lib/gs_graph/friend_list.rb +13 -0
  135. data/lib/gs_graph/friend_request.rb +14 -0
  136. data/lib/gs_graph/group.rb +29 -0
  137. data/lib/gs_graph/image.rb +11 -0
  138. data/lib/gs_graph/insight.rb +13 -0
  139. data/lib/gs_graph/klass.rb +31 -0
  140. data/lib/gs_graph/link.rb +32 -0
  141. data/lib/gs_graph/location.rb +20 -0
  142. data/lib/gs_graph/message.rb +30 -0
  143. data/lib/gs_graph/milestone.rb +26 -0
  144. data/lib/gs_graph/node.rb +149 -0
  145. data/lib/gs_graph/note.rb +32 -0
  146. data/lib/gs_graph/notification.rb +32 -0
  147. data/lib/gs_graph/offer.rb +33 -0
  148. data/lib/gs_graph/open_graph.rb +3 -0
  149. data/lib/gs_graph/open_graph/action.rb +42 -0
  150. data/lib/gs_graph/open_graph/application_context.rb +10 -0
  151. data/lib/gs_graph/open_graph/object.rb +29 -0
  152. data/lib/gs_graph/open_graph/user_context.rb +21 -0
  153. data/lib/gs_graph/order.rb +55 -0
  154. data/lib/gs_graph/page.rb +57 -0
  155. data/lib/gs_graph/page/category_attributes.rb +117 -0
  156. data/lib/gs_graph/photo.rb +48 -0
  157. data/lib/gs_graph/picture.rb +14 -0
  158. data/lib/gs_graph/place.rb +7 -0
  159. data/lib/gs_graph/poke.rb +19 -0
  160. data/lib/gs_graph/post.rb +117 -0
  161. data/lib/gs_graph/privacy.rb +27 -0
  162. data/lib/gs_graph/project.rb +4 -0
  163. data/lib/gs_graph/promotable_post.rb +34 -0
  164. data/lib/gs_graph/property.rb +13 -0
  165. data/lib/gs_graph/query.rb +47 -0
  166. data/lib/gs_graph/question.rb +26 -0
  167. data/lib/gs_graph/question_option.rb +22 -0
  168. data/lib/gs_graph/reach_estimate.rb +22 -0
  169. data/lib/gs_graph/role.rb +13 -0
  170. data/lib/gs_graph/score.rb +16 -0
  171. data/lib/gs_graph/searchable.rb +33 -0
  172. data/lib/gs_graph/searchable/result.rb +31 -0
  173. data/lib/gs_graph/serialization.rb +19 -0
  174. data/lib/gs_graph/status.rb +27 -0
  175. data/lib/gs_graph/subscription.rb +14 -0
  176. data/lib/gs_graph/tab.rb +17 -0
  177. data/lib/gs_graph/tag.rb +30 -0
  178. data/lib/gs_graph/tagged_object.rb +23 -0
  179. data/lib/gs_graph/targeting.rb +23 -0
  180. data/lib/gs_graph/test_user.rb +24 -0
  181. data/lib/gs_graph/thread.rb +71 -0
  182. data/lib/gs_graph/user.rb +153 -0
  183. data/lib/gs_graph/user_achievement.rb +35 -0
  184. data/lib/gs_graph/venue.rb +14 -0
  185. data/lib/gs_graph/video.rb +41 -0
  186. data/lib/gs_graph/work.rb +48 -0
  187. data/lib/patch/rack/oauth2/access_token.rb +11 -0
  188. data/lib/patch/rack/oauth2/access_token/introspectable.rb +37 -0
  189. data/lib/patch/rack/oauth2/client.rb +13 -0
  190. data/lib/patch/rack/oauth2/grant/fb_exchange_token.rb +11 -0
  191. data/lib/patch/rack/oauth2/util.rb +14 -0
  192. data/spec/gs_graph/achievement_spec.rb +59 -0
  193. data/spec/gs_graph/ad_account_spec.rb +124 -0
  194. data/spec/gs_graph/ad_campaign_spec.rb +99 -0
  195. data/spec/gs_graph/ad_connection_object_spec.rb +71 -0
  196. data/spec/gs_graph/ad_creative_spec.rb +87 -0
  197. data/spec/gs_graph/ad_group_spec.rb +95 -0
  198. data/spec/gs_graph/ad_keyword_spec.rb +27 -0
  199. data/spec/gs_graph/ad_keyword_suggestion_spec.rb +17 -0
  200. data/spec/gs_graph/ad_keyword_valid_spec.rb +19 -0
  201. data/spec/gs_graph/ad_user_spec.rb +67 -0
  202. data/spec/gs_graph/album_spec.rb +93 -0
  203. data/spec/gs_graph/app_request_spec.rb +40 -0
  204. data/spec/gs_graph/application_spec.rb +251 -0
  205. data/spec/gs_graph/auth/cookie_spec.rb +29 -0
  206. data/spec/gs_graph/auth/signed_request_spec.rb +22 -0
  207. data/spec/gs_graph/auth_spec.rb +223 -0
  208. data/spec/gs_graph/broad_targeting_category_spec.rb +17 -0
  209. data/spec/gs_graph/checkin_spec.rb +42 -0
  210. data/spec/gs_graph/collection_spec.rb +50 -0
  211. data/spec/gs_graph/comment_spec.rb +31 -0
  212. data/spec/gs_graph/connection_spec.rb +42 -0
  213. data/spec/gs_graph/connections/accounts_spec.rb +78 -0
  214. data/spec/gs_graph/connections/achievements_spec.rb +27 -0
  215. data/spec/gs_graph/connections/activities_spec.rb +34 -0
  216. data/spec/gs_graph/connections/ad_accounts_spec.rb +28 -0
  217. data/spec/gs_graph/connections/ad_campaign_stat_spec.rb +35 -0
  218. data/spec/gs_graph/connections/ad_campaigns_spec.rb +36 -0
  219. data/spec/gs_graph/connections/ad_connection_objects_spec.rb +20 -0
  220. data/spec/gs_graph/connections/ad_creatives_spec.rb +29 -0
  221. data/spec/gs_graph/connections/ad_group_stat_spec.rb +54 -0
  222. data/spec/gs_graph/connections/ad_groups_spec.rb +92 -0
  223. data/spec/gs_graph/connections/ad_previews_spec.rb +18 -0
  224. data/spec/gs_graph/connections/admins_spec.rb +20 -0
  225. data/spec/gs_graph/connections/albums_spec.rb +63 -0
  226. data/spec/gs_graph/connections/app_notifications_spec.rb +23 -0
  227. data/spec/gs_graph/connections/app_requests_spec.rb +28 -0
  228. data/spec/gs_graph/connections/attending_spec.rb +47 -0
  229. data/spec/gs_graph/connections/banned_spec.rb +63 -0
  230. data/spec/gs_graph/connections/blocked_spec.rb +56 -0
  231. data/spec/gs_graph/connections/books_spec.rb +32 -0
  232. data/spec/gs_graph/connections/broad_targeting_categories_spec.rb +18 -0
  233. data/spec/gs_graph/connections/checkins_spec.rb +153 -0
  234. data/spec/gs_graph/connections/comments_spec.rb +75 -0
  235. data/spec/gs_graph/connections/conversations_spec.rb +19 -0
  236. data/spec/gs_graph/connections/declined_spec.rb +47 -0
  237. data/spec/gs_graph/connections/docs_spec.rb +14 -0
  238. data/spec/gs_graph/connections/events_spec.rb +52 -0
  239. data/spec/gs_graph/connections/family_spec.rb +32 -0
  240. data/spec/gs_graph/connections/feed_spec.rb +124 -0
  241. data/spec/gs_graph/connections/former_participants_spec.rb +44 -0
  242. data/spec/gs_graph/connections/friend_lists_spec.rb +26 -0
  243. data/spec/gs_graph/connections/friend_requests_spec.rb +16 -0
  244. data/spec/gs_graph/connections/friends_spec.rb +51 -0
  245. data/spec/gs_graph/connections/games_spec.rb +20 -0
  246. data/spec/gs_graph/connections/groups_spec.rb +31 -0
  247. data/spec/gs_graph/connections/home_spec.rb +62 -0
  248. data/spec/gs_graph/connections/inbox_spec.rb +16 -0
  249. data/spec/gs_graph/connections/insights_spec.rb +104 -0
  250. data/spec/gs_graph/connections/interests_spec.rb +12 -0
  251. data/spec/gs_graph/connections/invited_spec.rb +84 -0
  252. data/spec/gs_graph/connections/likes_spec.rb +127 -0
  253. data/spec/gs_graph/connections/links_spec.rb +31 -0
  254. data/spec/gs_graph/connections/maybe_spec.rb +47 -0
  255. data/spec/gs_graph/connections/members_spec.rb +57 -0
  256. data/spec/gs_graph/connections/messages_spec.rb +58 -0
  257. data/spec/gs_graph/connections/milestones_spec.rb +40 -0
  258. data/spec/gs_graph/connections/movies_spec.rb +12 -0
  259. data/spec/gs_graph/connections/music_spec.rb +12 -0
  260. data/spec/gs_graph/connections/mutual_friends_spec.rb +28 -0
  261. data/spec/gs_graph/connections/noreply_spec.rb +39 -0
  262. data/spec/gs_graph/connections/notes_spec.rb +31 -0
  263. data/spec/gs_graph/connections/notifications_spec.rb +30 -0
  264. data/spec/gs_graph/connections/outbox_spec.rb +16 -0
  265. data/spec/gs_graph/connections/participants_spec.rb +42 -0
  266. data/spec/gs_graph/connections/payments_spec.rb +17 -0
  267. data/spec/gs_graph/connections/permissions_spec.rb +44 -0
  268. data/spec/gs_graph/connections/photos_spec.rb +39 -0
  269. data/spec/gs_graph/connections/picture_spec.rb +92 -0
  270. data/spec/gs_graph/connections/pokes_spec.rb +16 -0
  271. data/spec/gs_graph/connections/posts_spec.rb +34 -0
  272. data/spec/gs_graph/connections/promotable_posts_spec.rb +24 -0
  273. data/spec/gs_graph/connections/question_options_spec.rb +14 -0
  274. data/spec/gs_graph/connections/questions_spec.rb +31 -0
  275. data/spec/gs_graph/connections/reach_estimates_spec.rb +18 -0
  276. data/spec/gs_graph/connections/roles_spec.rb +59 -0
  277. data/spec/gs_graph/connections/scores_spec.rb +40 -0
  278. data/spec/gs_graph/connections/senders_spec.rb +42 -0
  279. data/spec/gs_graph/connections/settings_spec.rb +62 -0
  280. data/spec/gs_graph/connections/statuses_spec.rb +72 -0
  281. data/spec/gs_graph/connections/subscribed_to_spec.rb +12 -0
  282. data/spec/gs_graph/connections/subscribers_spec.rb +12 -0
  283. data/spec/gs_graph/connections/subscriptions_spec.rb +47 -0
  284. data/spec/gs_graph/connections/tabs_spec.rb +47 -0
  285. data/spec/gs_graph/connections/tagged_spec.rb +42 -0
  286. data/spec/gs_graph/connections/tags_spec.rb +30 -0
  287. data/spec/gs_graph/connections/television_spec.rb +12 -0
  288. data/spec/gs_graph/connections/test_users_spec.rb +65 -0
  289. data/spec/gs_graph/connections/threads_spec.rb +12 -0
  290. data/spec/gs_graph/connections/user_achievements_spec.rb +37 -0
  291. data/spec/gs_graph/connections/user_likes_spec.rb +55 -0
  292. data/spec/gs_graph/connections/videos_spec.rb +27 -0
  293. data/spec/gs_graph/connections/votes_spec.rb +15 -0
  294. data/spec/gs_graph/debugger_spec.rb +33 -0
  295. data/spec/gs_graph/doc_spec.rb +27 -0
  296. data/spec/gs_graph/domain_spec.rb +23 -0
  297. data/spec/gs_graph/education_spec.rb +61 -0
  298. data/spec/gs_graph/event_spec.rb +70 -0
  299. data/spec/gs_graph/exception_spec.rb +310 -0
  300. data/spec/gs_graph/friend_list_spec.rb +22 -0
  301. data/spec/gs_graph/group_spec.rb +28 -0
  302. data/spec/gs_graph/image_spec.rb +16 -0
  303. data/spec/gs_graph/insight_spec.rb +18 -0
  304. data/spec/gs_graph/link_spec.rb +41 -0
  305. data/spec/gs_graph/location_spec.rb +28 -0
  306. data/spec/gs_graph/message_spec.rb +47 -0
  307. data/spec/gs_graph/node_spec.rb +91 -0
  308. data/spec/gs_graph/note_spec.rb +37 -0
  309. data/spec/gs_graph/notification_spec.rb +59 -0
  310. data/spec/gs_graph/offer_spec.rb +30 -0
  311. data/spec/gs_graph/open_graph/action_spec.rb +112 -0
  312. data/spec/gs_graph/open_graph/application_context_spec.rb +28 -0
  313. data/spec/gs_graph/open_graph/object_spec.rb +76 -0
  314. data/spec/gs_graph/open_graph/user_context_spec.rb +33 -0
  315. data/spec/gs_graph/order_spec.rb +66 -0
  316. data/spec/gs_graph/page/local_business_spec.rb +88 -0
  317. data/spec/gs_graph/page/movie_spec.rb +25 -0
  318. data/spec/gs_graph/page/music_spec.rb +25 -0
  319. data/spec/gs_graph/page/person_spec.rb +23 -0
  320. data/spec/gs_graph/page/product_spec.rb +36 -0
  321. data/spec/gs_graph/page_spec.rb +81 -0
  322. data/spec/gs_graph/photo_spec.rb +85 -0
  323. data/spec/gs_graph/place_spec.rb +8 -0
  324. data/spec/gs_graph/post_spec.rb +238 -0
  325. data/spec/gs_graph/privacy_spec.rb +33 -0
  326. data/spec/gs_graph/project_spec.rb +46 -0
  327. data/spec/gs_graph/promotable_post_spec.rb +57 -0
  328. data/spec/gs_graph/qeustion_option_spec.rb +35 -0
  329. data/spec/gs_graph/query_spec.rb +73 -0
  330. data/spec/gs_graph/question_spec.rb +73 -0
  331. data/spec/gs_graph/reach_estimate_spec.rb +48 -0
  332. data/spec/gs_graph/searchable_spec.rb +47 -0
  333. data/spec/gs_graph/seriarization_spec.rb +29 -0
  334. data/spec/gs_graph/status_spec.rb +31 -0
  335. data/spec/gs_graph/subscription_spec.rb +5 -0
  336. data/spec/gs_graph/tag_spec.rb +34 -0
  337. data/spec/gs_graph/tagged_object_spec.rb +45 -0
  338. data/spec/gs_graph/targeting_spec.rb +34 -0
  339. data/spec/gs_graph/test_user_spec.rb +50 -0
  340. data/spec/gs_graph/thread_spec.rb +86 -0
  341. data/spec/gs_graph/user_achievement_spec.rb +53 -0
  342. data/spec/gs_graph/user_spec.rb +185 -0
  343. data/spec/gs_graph/venue_spec.rb +23 -0
  344. data/spec/gs_graph/video_spec.rb +31 -0
  345. data/spec/gs_graph/work_spec.rb +101 -0
  346. data/spec/gs_graph_spec.rb +57 -0
  347. data/spec/spec_helper.rb +9 -0
  348. metadata +538 -0
@@ -0,0 +1,20 @@
1
+ require 'digest/md5'
2
+
3
+ module GSGraph
4
+ class Auth
5
+ # NOTE:
6
+ # If you want access token, use GSGraph::Auth.new(APP_ID, APP_SECRET, :cookie => {..}) instead
7
+ class Cookie
8
+ def self.parse(client, cookie)
9
+ signed_request = case cookie
10
+ when String
11
+ cookie
12
+ else
13
+ cookie["fbsr_#{client.identifier}"]
14
+ end
15
+ raise VerificationFailed.new('Facebook cookie not found') if signed_request.blank?
16
+ SignedRequest.verify(client, signed_request)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,44 @@
1
+ require 'base64'
2
+ require 'openssl'
3
+
4
+ module GSGraph
5
+ class Auth
6
+ class SignedRequest
7
+
8
+ def self.oauth_dialog_endpoint
9
+ return GSGraph.www_url + '/dialog/oauth'
10
+ end
11
+
12
+ def self.verify(client, signed_request)
13
+ signature, payload = signed_request.split('.')
14
+ raise VerificationFailed.new('No Signature') if signature.blank?
15
+ raise VerificationFailed.new('No Payload') if payload.blank?
16
+ signature = base64_url_decode signature
17
+ data = decode_json base64_url_decode(payload)
18
+ raise VerificationFailed.new('Unexpected Signature Algorithm') unless data[:algorithm] == 'HMAC-SHA256'
19
+ _signature_ = sign(client.secret, payload)
20
+ raise VerificationFailed.new('Signature Invalid') unless signature == _signature_
21
+ data
22
+ end
23
+
24
+ private
25
+
26
+ def self.sign(key, payload)
27
+ klass = OpenSSL::Digest::SHA256.new
28
+ OpenSSL::HMAC.digest(klass, key, payload)
29
+ end
30
+
31
+ def self.decode_json(json)
32
+ MultiJson.load(json).with_indifferent_access
33
+ rescue => e
34
+ raise VerificationFailed.new('Invalid JSON')
35
+ end
36
+
37
+ def self.base64_url_decode(str)
38
+ str += '=' * (4 - str.length.modulo(4))
39
+ str = str.gsub('-', '+').gsub('_', '/')
40
+ Base64.decode64 str
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,13 @@
1
+ module GSGraph
2
+ class BroadTargetingCategory < Node
3
+ attr_accessor :name, :parent_category
4
+
5
+ def initialize(identifier, attributes = {})
6
+ super
7
+
8
+ %w(name parent_category).each do |field|
9
+ self.send("#{field}=", attributes[field.to_sym])
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,51 @@
1
+ module GSGraph
2
+ class Checkin < Node
3
+ include Connections::Comments
4
+ include Connections::Likes
5
+ include Connections::Likes::Likable
6
+ extend Searchable
7
+
8
+ attr_accessor :from, :tags, :place, :message, :application, :created_time
9
+
10
+ def initialize(identifier, attributes = {})
11
+ super
12
+ if (from = attributes[:from])
13
+ @from = User.new(from[:id], from)
14
+ end
15
+ @tags = []
16
+ if (tags = attributes[:tags])
17
+ case tags
18
+ when Hash
19
+ Collection.new(tags).each do |user|
20
+ @tags << User.new(user[:id], user)
21
+ end
22
+ when String, Array
23
+ Array(tags).each do |user_id|
24
+ @tags << User.new(user_id)
25
+ end
26
+ end
27
+ end
28
+ if (place = attributes[:place])
29
+ @place = case place
30
+ when Place
31
+ place
32
+ when String, Integer
33
+ Place.new(place)
34
+ when Hash
35
+ Place.new(place[:id], place)
36
+ end
37
+ end
38
+ @message = attributes[:message]
39
+ if (application = attributes[:application])
40
+ @application = Application.new(application[:id], application)
41
+ end
42
+ if (created_time = attributes[:created_time])
43
+ @created_time = Time.parse(created_time).utc
44
+ end
45
+ end
46
+
47
+ def self.search(options = {})
48
+ super(nil, options)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,55 @@
1
+ module GSGraph
2
+ class Collection < Array
3
+ attr_reader :previous, :next, :total_count, :unread_count, :updated_time
4
+
5
+ def initialize(collection = nil)
6
+ collection = case collection
7
+ when Array
8
+ {:data => collection, :count => collection.size}
9
+ when Hash
10
+ collection[:data] ||= []
11
+ collection
12
+ when nil
13
+ collection = {:data => [], :count => 0}
14
+ else
15
+ raise ArgumentError.new("Invalid collection")
16
+ end
17
+
18
+ # NOTE: Graph API returns {"data":{"to":[null]}} sometimes... :(
19
+ collection[:data].delete_if(&:nil?)
20
+
21
+ replace collection[:data]
22
+
23
+ if (summary = collection[:summary]).present?
24
+ @total_count = summary[:total_count]
25
+ @unread_count = summary[:unread_count]
26
+ @updated_time = Time.parse(summary[:updated_time]) if summary[:updated_time]
27
+ else
28
+ @total_count = collection[:count]
29
+ end
30
+ @previous, @next = {}, {}
31
+ if (paging = collection[:paging])
32
+ if paging[:previous]
33
+ @previous = fetch_params(paging[:previous])
34
+ end
35
+ if paging[:next]
36
+ @next = fetch_params(paging[:next])
37
+ end
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def fetch_params(url)
44
+ query = URI.parse(URI.encode(url)).query
45
+ params = {}
46
+ query.split('&').each do |q|
47
+ key, value = q.split('=')
48
+ if ['limit', 'offset', 'until', 'since'].include?(key)
49
+ params[key.to_sym] = URI.unescape(value)
50
+ end
51
+ end
52
+ params
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,24 @@
1
+ module GSGraph
2
+ class Comment < Node
3
+ include Connections::Likes
4
+ include Connections::Likes::Likable
5
+
6
+ attr_accessor :from, :message, :created_time, :like_count
7
+
8
+ def initialize(identifier, attributes = {})
9
+ super
10
+ if (from = attributes[:from])
11
+ @from = if from[:category]
12
+ Page.new(from[:id], from)
13
+ else
14
+ User.new(from[:id], from)
15
+ end
16
+ end
17
+ @message = attributes[:message]
18
+ @like_count = attributes[:likes]
19
+ if attributes[:created_time]
20
+ @created_time = Time.parse(attributes[:created_time]).utc
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ module GSGraph
2
+ module Comparison
3
+ def ==(other)
4
+ instance_variables.all? do |key|
5
+ if key.to_s == '@raw_attributes'
6
+ :ignore_difference!
7
+ else
8
+ instance_variable_get(key) == other.instance_variable_get(key)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ module GSGraph
2
+ class Connection < Collection
3
+ attr_accessor :collection, :connection, :owner, :options
4
+ delegate :total_count, :unread_count, :updated_time, :to => :collection
5
+
6
+ def initialize(owner, connection, options = {})
7
+ @owner = owner
8
+ @options = options
9
+ @connection = connection
10
+ @collection = options.delete(:collection) || Collection.new
11
+ replace collection
12
+ end
13
+
14
+ def next(_options_ = {})
15
+ if self.collection.next.present?
16
+ connection_method = if self.owner.respond_to?(self.connection)
17
+ self.connection
18
+ else
19
+ self.owner.public_methods.detect do |method|
20
+ method.to_s.gsub('_', '') == self.connection.to_s
21
+ end
22
+ end
23
+ self.owner.send(connection_method, self.options.merge(_options_).merge(self.collection.next))
24
+ else
25
+ self.class.new(self.owner, self.connection)
26
+ end
27
+ end
28
+
29
+ def previous(_options_ = {})
30
+ if self.collection.previous.present?
31
+ self.owner.send(self.connection, self.options.merge(_options_).merge(self.collection.previous))
32
+ else
33
+ self.class.new(self.owner, self.connection)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ Dir[File.dirname(__FILE__) + '/connections/*.rb'].each do |file|
2
+ require file
3
+ end
@@ -0,0 +1,23 @@
1
+ module GSGraph
2
+ module Connections
3
+ module Accounts
4
+ def accounts(options = {})
5
+ accounts = self.connection :accounts, options
6
+ accounts.map! do |account|
7
+ account[:access_token] ||= options[:access_token] || self.access_token
8
+ case self
9
+ when User
10
+ if account[:category] == 'Application'
11
+ account.delete(:category)
12
+ Application.new account[:id], account
13
+ else
14
+ Page.new account[:id], account
15
+ end
16
+ when Application
17
+ TestUser.new account[:id], account
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ module GSGraph
2
+ module Connections
3
+ module Achievements
4
+ def achievements(options = {})
5
+ options[:access_token] ||= self.access_token
6
+ achievements = self.connection :achievements, options
7
+ achievements.map! do |achievement|
8
+ Achievement.new achievement[:id], achievement.merge(:access_token => options[:access_token])
9
+ end
10
+ end
11
+
12
+ def achievement!(achievement_url, options = {})
13
+ post options.merge(:connection => :achievements, :achievement => achievement_url)
14
+ end
15
+
16
+ def unregister_achievement!(achievement_url, options = {})
17
+ delete options.merge(:connection => :achievements, :achievement => achievement_url)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ module GSGraph
2
+ module Connections
3
+ module Activities
4
+ def activities(options = {})
5
+ activities = self.connection :activities, options
6
+ activities.map! do |activity|
7
+ Page.new activity[:id], activity.merge(
8
+ :access_token => options[:access_token] || self.access_token
9
+ )
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ module GSGraph
2
+ module Connections
3
+ module AdAccounts
4
+ def ad_accounts(options = {})
5
+ ad_accounts = self.connection :adaccounts, options
6
+ ad_accounts.map! do |ad_account|
7
+ AdAccount.new ad_account[:id], ad_account.merge(
8
+ :access_token => options[:access_token] || self.access_token
9
+ )
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,22 @@
1
+ module GSGraph
2
+ module Connections
3
+ module AdCampaignStats
4
+ # When retrieving stats at the AdAccount level we use the 'adcampaignstats' connection
5
+ # This returns an Array of statistics
6
+ def ad_campaign_stats(options = {})
7
+ ad_campaign_stats = self.connection :adcampaignstats, options
8
+ ad_campaign_stats.map! do |ad_campaign_stat|
9
+ AdCampaignStat.new ad_campaign_stat[:id], ad_campaign_stat.merge(
10
+ :access_token => options[:access_token] || self.access_token
11
+ )
12
+ end
13
+ end
14
+
15
+ # Note: This could also be a connection on the AdCampaign model, but it has a different connection name
16
+ # 'stats' instead of 'adcampaignstats'
17
+ # In addition, it returns a single JSON response that does not conform to the standard connections
18
+ # array structure, making it difficult to parse with the underlying gs_graph Connection object.
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,30 @@
1
+ module GSGraph
2
+ module Connections
3
+ module AdCampaigns
4
+ def ad_campaigns(options = {})
5
+ ad_campaigns = self.connection :adcampaigns, options
6
+ ad_campaigns.map! do |ad_campaign|
7
+ AdCampaign.new ad_campaign[:id], ad_campaign.merge(
8
+ :access_token => options[:access_token] || self.access_token
9
+ )
10
+ end
11
+ end
12
+
13
+ def ad_campaign!(options = {})
14
+ ad_campaign = post options.merge(:connection => :adcampaigns)
15
+
16
+ ad_campaign_id = ad_campaign[:id]
17
+
18
+ merged_attrs = options.merge(
19
+ :access_token => options[:access_token] || self.access_token
20
+ )
21
+
22
+ if options[:redownload]
23
+ merged_attrs = merged_attrs.merge(ad_campaign[:data][:campaigns][ad_campaign_id]).with_indifferent_access
24
+ end
25
+
26
+ AdCampaign.new ad_campaign_id, merged_attrs
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,14 @@
1
+ module GSGraph
2
+ module Connections
3
+ module AdConnectionObjects
4
+ def connection_objects(options = {})
5
+ connection_objects = self.connection :connectionobjects, options
6
+ connection_objects.map! do |connection_object|
7
+ AdConnectionObject.new connection_object[:id], connection_object.merge(
8
+ :access_token => options[:access_token] || self.access_token
9
+ )
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module GSGraph
2
+ module Connections
3
+ module AdCreatives
4
+ def ad_creatives(options = {})
5
+ ad_creatives = self.connection :adcreatives, options
6
+ ad_creatives.map! do |ad_creative|
7
+ AdCreative.new ad_creative[:id], ad_creative.merge(
8
+ :access_token => options[:access_token] || self.access_token
9
+ )
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end