facebookbusiness 0.3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (297) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +17 -0
  3. data/README.md +256 -0
  4. data/lib/facebook_ads.rb +72 -0
  5. data/lib/facebook_ads/ad_object.rb +177 -0
  6. data/lib/facebook_ads/ad_objects/ad.rb +243 -0
  7. data/lib/facebook_ads/ad_objects/ad_account.rb +771 -0
  8. data/lib/facebook_ads/ad_objects/ad_account_ad_rules_history.rb +59 -0
  9. data/lib/facebook_ads/ad_objects/ad_account_contextual_targeting.rb +36 -0
  10. data/lib/facebook_ads/ad_objects/ad_account_creation_request.rb +217 -0
  11. data/lib/facebook_ads/ad_objects/ad_account_delivery_estimate.rb +65 -0
  12. data/lib/facebook_ads/ad_objects/ad_account_roas.rb +97 -0
  13. data/lib/facebook_ads/ad_objects/ad_account_targeting_unified.rb +151 -0
  14. data/lib/facebook_ads/ad_objects/ad_account_user.rb +40 -0
  15. data/lib/facebook_ads/ad_objects/ad_activity.rb +125 -0
  16. data/lib/facebook_ads/ad_objects/ad_asset_feed_spec.rb +98 -0
  17. data/lib/facebook_ads/ad_objects/ad_asset_feed_spec_asset_label.rb +37 -0
  18. data/lib/facebook_ads/ad_objects/ad_asset_feed_spec_body.rb +39 -0
  19. data/lib/facebook_ads/ad_objects/ad_asset_feed_spec_caption.rb +39 -0
  20. data/lib/facebook_ads/ad_objects/ad_asset_feed_spec_description.rb +39 -0
  21. data/lib/facebook_ads/ad_objects/ad_asset_feed_spec_group_rule.rb +43 -0
  22. data/lib/facebook_ads/ad_objects/ad_asset_feed_spec_image.rb +41 -0
  23. data/lib/facebook_ads/ad_objects/ad_asset_feed_spec_link_url.rb +42 -0
  24. data/lib/facebook_ads/ad_objects/ad_asset_feed_spec_title.rb +39 -0
  25. data/lib/facebook_ads/ad_objects/ad_asset_feed_spec_video.rb +42 -0
  26. data/lib/facebook_ads/ad_objects/ad_async_request.rb +67 -0
  27. data/lib/facebook_ads/ad_objects/ad_async_request_set.rb +68 -0
  28. data/lib/facebook_ads/ad_objects/ad_async_request_set_notification_result.rb +38 -0
  29. data/lib/facebook_ads/ad_objects/ad_campaign_delivery_estimate.rb +65 -0
  30. data/lib/facebook_ads/ad_objects/ad_campaign_frequency_control_specs.rb +39 -0
  31. data/lib/facebook_ads/ad_objects/ad_creative.rb +178 -0
  32. data/lib/facebook_ads/ad_objects/ad_creative_collection_thumbnail_info.rb +39 -0
  33. data/lib/facebook_ads/ad_objects/ad_creative_link_data.rb +79 -0
  34. data/lib/facebook_ads/ad_objects/ad_creative_link_data_app_link_spec.rb +40 -0
  35. data/lib/facebook_ads/ad_objects/ad_creative_link_data_call_to_action.rb +87 -0
  36. data/lib/facebook_ads/ad_objects/ad_creative_link_data_call_to_action_value.rb +46 -0
  37. data/lib/facebook_ads/ad_objects/ad_creative_link_data_child_attachment.rb +47 -0
  38. data/lib/facebook_ads/ad_objects/ad_creative_link_data_custom_overlay_spec.rb +100 -0
  39. data/lib/facebook_ads/ad_objects/ad_creative_link_data_image_overlay_spec.rb +101 -0
  40. data/lib/facebook_ads/ad_objects/ad_creative_object_story_spec.rb +43 -0
  41. data/lib/facebook_ads/ad_objects/ad_creative_photo_data.rb +43 -0
  42. data/lib/facebook_ads/ad_objects/ad_creative_place_data.rb +42 -0
  43. data/lib/facebook_ads/ad_objects/ad_creative_post_click_configuration.rb +38 -0
  44. data/lib/facebook_ads/ad_objects/ad_creative_text_data.rb +37 -0
  45. data/lib/facebook_ads/ad_objects/ad_creative_video_data.rb +53 -0
  46. data/lib/facebook_ads/ad_objects/ad_image.rb +57 -0
  47. data/lib/facebook_ads/ad_objects/ad_keyword_stats.rb +55 -0
  48. data/lib/facebook_ads/ad_objects/ad_label.rb +57 -0
  49. data/lib/facebook_ads/ad_objects/ad_network_analytics_async_query_result.rb +41 -0
  50. data/lib/facebook_ads/ad_objects/ad_network_analytics_sync_query_result.rb +38 -0
  51. data/lib/facebook_ads/ad_objects/ad_place_page_set.rb +44 -0
  52. data/lib/facebook_ads/ad_objects/ad_preview.rb +62 -0
  53. data/lib/facebook_ads/ad_objects/ad_promoted_object.rb +64 -0
  54. data/lib/facebook_ads/ad_objects/ad_recommendation.rb +55 -0
  55. data/lib/facebook_ads/ad_objects/ad_recommendation_data.rb +37 -0
  56. data/lib/facebook_ads/ad_objects/ad_report_run.rb +71 -0
  57. data/lib/facebook_ads/ad_objects/ad_rule.rb +56 -0
  58. data/lib/facebook_ads/ad_objects/ad_rule_evaluation_spec.rb +44 -0
  59. data/lib/facebook_ads/ad_objects/ad_rule_execution_options.rb +44 -0
  60. data/lib/facebook_ads/ad_objects/ad_rule_execution_spec.rb +49 -0
  61. data/lib/facebook_ads/ad_objects/ad_rule_filters.rb +55 -0
  62. data/lib/facebook_ads/ad_objects/ad_rule_history.rb +58 -0
  63. data/lib/facebook_ads/ad_objects/ad_rule_history_result.rb +45 -0
  64. data/lib/facebook_ads/ad_objects/ad_rule_history_result_action.rb +40 -0
  65. data/lib/facebook_ads/ad_objects/ad_rule_schedule.rb +39 -0
  66. data/lib/facebook_ads/ad_objects/ad_rule_schedule_spec.rb +38 -0
  67. data/lib/facebook_ads/ad_objects/ad_rule_trigger.rb +63 -0
  68. data/lib/facebook_ads/ad_objects/ad_set.rb +300 -0
  69. data/lib/facebook_ads/ad_objects/ad_study.rb +104 -0
  70. data/lib/facebook_ads/ad_objects/ad_study_ads_asset_user_permissions.rb +46 -0
  71. data/lib/facebook_ads/ad_objects/ad_study_cell.rb +59 -0
  72. data/lib/facebook_ads/ad_objects/ad_study_objective.rb +58 -0
  73. data/lib/facebook_ads/ad_objects/adgroup_placement_specific_review_feedback.rb +50 -0
  74. data/lib/facebook_ads/ad_objects/adgroup_relevance_score.rb +40 -0
  75. data/lib/facebook_ads/ad_objects/adgroup_review_feedback.rb +38 -0
  76. data/lib/facebook_ads/ad_objects/ads_action_stats.rb +55 -0
  77. data/lib/facebook_ads/ad_objects/ads_data_partner.rb +37 -0
  78. data/lib/facebook_ads/ad_objects/ads_image_crops.rb +43 -0
  79. data/lib/facebook_ads/ad_objects/ads_insights.rb +224 -0
  80. data/lib/facebook_ads/ad_objects/ads_pixel.rb +76 -0
  81. data/lib/facebook_ads/ad_objects/ads_pixel_stats.rb +40 -0
  82. data/lib/facebook_ads/ad_objects/ads_pixel_stats_result.rb +51 -0
  83. data/lib/facebook_ads/ad_objects/agency_client_declaration.rb +48 -0
  84. data/lib/facebook_ads/ad_objects/album.rb +102 -0
  85. data/lib/facebook_ads/ad_objects/android_app_link.rb +40 -0
  86. data/lib/facebook_ads/ad_objects/app_links.rb +43 -0
  87. data/lib/facebook_ads/ad_objects/assigned_user.rb +38 -0
  88. data/lib/facebook_ads/ad_objects/attribution_spec.rb +38 -0
  89. data/lib/facebook_ads/ad_objects/audience_permission.rb +39 -0
  90. data/lib/facebook_ads/ad_objects/audio_copyright.rb +46 -0
  91. data/lib/facebook_ads/ad_objects/broad_targeting_categories.rb +46 -0
  92. data/lib/facebook_ads/ad_objects/business.rb +523 -0
  93. data/lib/facebook_ads/ad_objects/business_activity_log_event.rb +55 -0
  94. data/lib/facebook_ads/ad_objects/business_ad_account_request.rb +37 -0
  95. data/lib/facebook_ads/ad_objects/business_advertisable_applications_result.rb +38 -0
  96. data/lib/facebook_ads/ad_objects/business_application_request.rb +37 -0
  97. data/lib/facebook_ads/ad_objects/business_matched_search_applications_edge_data.rb +58 -0
  98. data/lib/facebook_ads/ad_objects/business_page_request.rb +37 -0
  99. data/lib/facebook_ads/ad_objects/business_project.rb +45 -0
  100. data/lib/facebook_ads/ad_objects/business_role_request.rb +61 -0
  101. data/lib/facebook_ads/ad_objects/business_user.rb +52 -0
  102. data/lib/facebook_ads/ad_objects/campaign.rb +233 -0
  103. data/lib/facebook_ads/ad_objects/canvas.rb +52 -0
  104. data/lib/facebook_ads/ad_objects/canvas_body_element.rb +37 -0
  105. data/lib/facebook_ads/ad_objects/check_batch_request_status.rb +40 -0
  106. data/lib/facebook_ads/ad_objects/conversion_action_query.rb +62 -0
  107. data/lib/facebook_ads/ad_objects/copyright_attribution_insights.rb +41 -0
  108. data/lib/facebook_ads/ad_objects/cover_photo.rb +40 -0
  109. data/lib/facebook_ads/ad_objects/custom_audience.rb +174 -0
  110. data/lib/facebook_ads/ad_objects/custom_audience_ad_account.rb +36 -0
  111. data/lib/facebook_ads/ad_objects/custom_audience_data_source.rb +104 -0
  112. data/lib/facebook_ads/ad_objects/custom_audience_permission.rb +41 -0
  113. data/lib/facebook_ads/ad_objects/custom_audience_prefill_state.rb +39 -0
  114. data/lib/facebook_ads/ad_objects/custom_audience_session.rb +44 -0
  115. data/lib/facebook_ads/ad_objects/custom_audience_status.rb +38 -0
  116. data/lib/facebook_ads/ad_objects/custom_audiences_tos.rb +38 -0
  117. data/lib/facebook_ads/ad_objects/custom_conversion.rb +109 -0
  118. data/lib/facebook_ads/ad_objects/custom_conversion_stats_result.rb +50 -0
  119. data/lib/facebook_ads/ad_objects/day_part.rb +40 -0
  120. data/lib/facebook_ads/ad_objects/delivery_check.rb +40 -0
  121. data/lib/facebook_ads/ad_objects/delivery_check_extra_info.rb +39 -0
  122. data/lib/facebook_ads/ad_objects/direct_deal.rb +66 -0
  123. data/lib/facebook_ads/ad_objects/direct_debit.rb +45 -0
  124. data/lib/facebook_ads/ad_objects/domain.rb +37 -0
  125. data/lib/facebook_ads/ad_objects/engagement.rb +43 -0
  126. data/lib/facebook_ads/ad_objects/ent_with_sponsor.rb +39 -0
  127. data/lib/facebook_ads/ad_objects/event.rb +190 -0
  128. data/lib/facebook_ads/ad_objects/event_source_group.rb +53 -0
  129. data/lib/facebook_ads/ad_objects/extended_credit.rb +70 -0
  130. data/lib/facebook_ads/ad_objects/extended_credit_allocation_config.rb +61 -0
  131. data/lib/facebook_ads/ad_objects/extended_credit_invoice_group.rb +43 -0
  132. data/lib/facebook_ads/ad_objects/external_event_source.rb +38 -0
  133. data/lib/facebook_ads/ad_objects/flexible_targeting.rb +64 -0
  134. data/lib/facebook_ads/ad_objects/funding_source_details.rb +39 -0
  135. data/lib/facebook_ads/ad_objects/funding_source_details_coupon.rb +40 -0
  136. data/lib/facebook_ads/ad_objects/helpers/custom_audience_helpers.rb +170 -0
  137. data/lib/facebook_ads/ad_objects/hotel_room.rb +43 -0
  138. data/lib/facebook_ads/ad_objects/id_name.rb +37 -0
  139. data/lib/facebook_ads/ad_objects/insights_result.rb +73 -0
  140. data/lib/facebook_ads/ad_objects/instagram_insights_result.rb +67 -0
  141. data/lib/facebook_ads/ad_objects/instagram_insights_value.rb +38 -0
  142. data/lib/facebook_ads/ad_objects/instant_article.rb +47 -0
  143. data/lib/facebook_ads/ad_objects/instant_article_insights_query_result.rb +61 -0
  144. data/lib/facebook_ads/ad_objects/ios_app_link.rb +39 -0
  145. data/lib/facebook_ads/ad_objects/lead.rb +47 -0
  146. data/lib/facebook_ads/ad_objects/lead_gen_conditional_questions_group.rb +37 -0
  147. data/lib/facebook_ads/ad_objects/lead_gen_data_draft.rb +94 -0
  148. data/lib/facebook_ads/ad_objects/lead_gen_draft_question.rb +44 -0
  149. data/lib/facebook_ads/ad_objects/lead_gen_form_preview_details.rb +47 -0
  150. data/lib/facebook_ads/ad_objects/lead_gen_legal_content.rb +43 -0
  151. data/lib/facebook_ads/ad_objects/lead_gen_qualifier.rb +40 -0
  152. data/lib/facebook_ads/ad_objects/lead_gen_question.rb +43 -0
  153. data/lib/facebook_ads/ad_objects/lead_gen_question_option.rb +38 -0
  154. data/lib/facebook_ads/ad_objects/leadgen_form.rb +118 -0
  155. data/lib/facebook_ads/ad_objects/legacy_business_ad_account_request.rb +38 -0
  156. data/lib/facebook_ads/ad_objects/life_event.rb +54 -0
  157. data/lib/facebook_ads/ad_objects/live_video.rb +100 -0
  158. data/lib/facebook_ads/ad_objects/location.rb +49 -0
  159. data/lib/facebook_ads/ad_objects/lookalike_spec.rb +43 -0
  160. data/lib/facebook_ads/ad_objects/mailing_address.rb +42 -0
  161. data/lib/facebook_ads/ad_objects/measurement_report.rb +47 -0
  162. data/lib/facebook_ads/ad_objects/media_fingerprint.rb +47 -0
  163. data/lib/facebook_ads/ad_objects/messaging_feature_review.rb +38 -0
  164. data/lib/facebook_ads/ad_objects/messenger_profile.rb +55 -0
  165. data/lib/facebook_ads/ad_objects/minimum_budget.rb +41 -0
  166. data/lib/facebook_ads/ad_objects/native_offer.rb +113 -0
  167. data/lib/facebook_ads/ad_objects/offline_conversion_data_set.rb +137 -0
  168. data/lib/facebook_ads/ad_objects/offline_terms_of_service.rb +37 -0
  169. data/lib/facebook_ads/ad_objects/offsite_pixel.rb +57 -0
  170. data/lib/facebook_ads/ad_objects/open_graph_context.rb +35 -0
  171. data/lib/facebook_ads/ad_objects/open_graph_rating.rb +43 -0
  172. data/lib/facebook_ads/ad_objects/oracle_transaction.rb +51 -0
  173. data/lib/facebook_ads/ad_objects/outcome_prediction_point.rb +40 -0
  174. data/lib/facebook_ads/ad_objects/owned_domain.rb +37 -0
  175. data/lib/facebook_ads/ad_objects/page.rb +1231 -0
  176. data/lib/facebook_ads/ad_objects/page_admin_note.rb +37 -0
  177. data/lib/facebook_ads/ad_objects/page_call_to_action.rb +104 -0
  178. data/lib/facebook_ads/ad_objects/page_category.rb +39 -0
  179. data/lib/facebook_ads/ad_objects/page_change_proposal.rb +39 -0
  180. data/lib/facebook_ads/ad_objects/page_insights_async_export_run.rb +43 -0
  181. data/lib/facebook_ads/ad_objects/page_label.rb +47 -0
  182. data/lib/facebook_ads/ad_objects/page_parking.rb +39 -0
  183. data/lib/facebook_ads/ad_objects/page_payment_options.rb +41 -0
  184. data/lib/facebook_ads/ad_objects/page_post.rb +159 -0
  185. data/lib/facebook_ads/ad_objects/page_restaurant_services.rb +46 -0
  186. data/lib/facebook_ads/ad_objects/page_restaurant_specialties.rb +41 -0
  187. data/lib/facebook_ads/ad_objects/page_saved_filter.rb +134 -0
  188. data/lib/facebook_ads/ad_objects/page_settings.rb +38 -0
  189. data/lib/facebook_ads/ad_objects/page_start_info.rb +38 -0
  190. data/lib/facebook_ads/ad_objects/page_upcoming_change.rb +39 -0
  191. data/lib/facebook_ads/ad_objects/page_videos_you_can_use.rb +38 -0
  192. data/lib/facebook_ads/ad_objects/partner_category.rb +51 -0
  193. data/lib/facebook_ads/ad_objects/partner_integration_linked.rb +42 -0
  194. data/lib/facebook_ads/ad_objects/persona.rb +37 -0
  195. data/lib/facebook_ads/ad_objects/photo.rb +102 -0
  196. data/lib/facebook_ads/ad_objects/place_topic.rb +49 -0
  197. data/lib/facebook_ads/ad_objects/product_catalog.rb +335 -0
  198. data/lib/facebook_ads/ad_objects/product_catalog_hotel_rooms_batch.rb +50 -0
  199. data/lib/facebook_ads/ad_objects/product_catalog_image_settings.rb +38 -0
  200. data/lib/facebook_ads/ad_objects/product_catalog_image_settings_operation.rb +37 -0
  201. data/lib/facebook_ads/ad_objects/product_catalog_pricing_variables_batch.rb +50 -0
  202. data/lib/facebook_ads/ad_objects/product_catalog_product_sets_batch.rb +40 -0
  203. data/lib/facebook_ads/ad_objects/product_da_event_samples_batch.rb +54 -0
  204. data/lib/facebook_ads/ad_objects/product_event_stat.rb +74 -0
  205. data/lib/facebook_ads/ad_objects/product_feed.rb +126 -0
  206. data/lib/facebook_ads/ad_objects/product_feed_schedule.rb +62 -0
  207. data/lib/facebook_ads/ad_objects/product_feed_upload.rb +57 -0
  208. data/lib/facebook_ads/ad_objects/product_feed_upload_error.rb +49 -0
  209. data/lib/facebook_ads/ad_objects/product_group.rb +98 -0
  210. data/lib/facebook_ads/ad_objects/product_item.rb +155 -0
  211. data/lib/facebook_ads/ad_objects/product_item_commerce_insights.rb +39 -0
  212. data/lib/facebook_ads/ad_objects/product_set.rb +52 -0
  213. data/lib/facebook_ads/ad_objects/product_variant.rb +39 -0
  214. data/lib/facebook_ads/ad_objects/products_quality_issue.rb +42 -0
  215. data/lib/facebook_ads/ad_objects/profile.rb +62 -0
  216. data/lib/facebook_ads/ad_objects/profile_picture_source.rb +53 -0
  217. data/lib/facebook_ads/ad_objects/publisher_space.rb +37 -0
  218. data/lib/facebook_ads/ad_objects/reach_estimate.rb +39 -0
  219. data/lib/facebook_ads/ad_objects/reach_frequency_prediction.rb +101 -0
  220. data/lib/facebook_ads/ad_objects/reach_frequency_spec.rb +43 -0
  221. data/lib/facebook_ads/ad_objects/rev_share_policy.rb +38 -0
  222. data/lib/facebook_ads/ad_objects/rtb_dynamic_post.rb +44 -0
  223. data/lib/facebook_ads/ad_objects/saved_message_response.rb +49 -0
  224. data/lib/facebook_ads/ad_objects/screen_name.rb +39 -0
  225. data/lib/facebook_ads/ad_objects/shadow_ig_comment.rb +47 -0
  226. data/lib/facebook_ads/ad_objects/shadow_ig_media.rb +61 -0
  227. data/lib/facebook_ads/ad_objects/shadow_ig_user.rb +74 -0
  228. data/lib/facebook_ads/ad_objects/system_user.rb +48 -0
  229. data/lib/facebook_ads/ad_objects/tab.rb +45 -0
  230. data/lib/facebook_ads/ad_objects/targeting.rb +134 -0
  231. data/lib/facebook_ads/ad_objects/targeting_dynamic_rule.rb +44 -0
  232. data/lib/facebook_ads/ad_objects/targeting_geo_location.rb +47 -0
  233. data/lib/facebook_ads/ad_objects/targeting_geo_location_city.rb +43 -0
  234. data/lib/facebook_ads/ad_objects/targeting_geo_location_custom_location.rb +50 -0
  235. data/lib/facebook_ads/ad_objects/targeting_geo_location_electoral_district.rb +40 -0
  236. data/lib/facebook_ads/ad_objects/targeting_geo_location_market.rb +40 -0
  237. data/lib/facebook_ads/ad_objects/targeting_geo_location_place.rb +45 -0
  238. data/lib/facebook_ads/ad_objects/targeting_geo_location_political_district.rb +40 -0
  239. data/lib/facebook_ads/ad_objects/targeting_geo_location_region.rb +39 -0
  240. data/lib/facebook_ads/ad_objects/targeting_geo_location_zip.rb +41 -0
  241. data/lib/facebook_ads/ad_objects/targeting_product_audience_spec.rb +39 -0
  242. data/lib/facebook_ads/ad_objects/targeting_product_audience_sub_spec.rb +38 -0
  243. data/lib/facebook_ads/ad_objects/targeting_sentence_line.rb +38 -0
  244. data/lib/facebook_ads/ad_objects/transaction.rb +51 -0
  245. data/lib/facebook_ads/ad_objects/transaction_currency_amount.rb +39 -0
  246. data/lib/facebook_ads/ad_objects/unified_thread.rb +49 -0
  247. data/lib/facebook_ads/ad_objects/url.rb +41 -0
  248. data/lib/facebook_ads/ad_objects/user.rb +268 -0
  249. data/lib/facebook_ads/ad_objects/user_lead_gen_disclaimer_response.rb +38 -0
  250. data/lib/facebook_ads/ad_objects/user_lead_gen_field_data.rb +38 -0
  251. data/lib/facebook_ads/ad_objects/video_copyright.rb +58 -0
  252. data/lib/facebook_ads/ad_objects/video_copyright_rule.rb +46 -0
  253. data/lib/facebook_ads/ad_objects/video_list.rb +52 -0
  254. data/lib/facebook_ads/ad_objects/video_thumbnail.rb +42 -0
  255. data/lib/facebook_ads/ad_objects/voip_info.rb +43 -0
  256. data/lib/facebook_ads/ad_objects/web_app_link.rb +38 -0
  257. data/lib/facebook_ads/ad_objects/windows_app_link.rb +40 -0
  258. data/lib/facebook_ads/ad_objects/windows_phone_app_link.rb +39 -0
  259. data/lib/facebook_ads/api_request.rb +123 -0
  260. data/lib/facebook_ads/api_response.rb +47 -0
  261. data/lib/facebook_ads/batch_api/batch.rb +86 -0
  262. data/lib/facebook_ads/batch_api/batch_proxy.rb +67 -0
  263. data/lib/facebook_ads/config.rb +43 -0
  264. data/lib/facebook_ads/edge.rb +184 -0
  265. data/lib/facebook_ads/errors.rb +55 -0
  266. data/lib/facebook_ads/field_types.rb +65 -0
  267. data/lib/facebook_ads/field_types/ad_object.rb +37 -0
  268. data/lib/facebook_ads/field_types/base.rb +33 -0
  269. data/lib/facebook_ads/field_types/boolean.rb +25 -0
  270. data/lib/facebook_ads/field_types/datetime.rb +47 -0
  271. data/lib/facebook_ads/field_types/double.rb +29 -0
  272. data/lib/facebook_ads/field_types/enum.rb +31 -0
  273. data/lib/facebook_ads/field_types/integer.rb +33 -0
  274. data/lib/facebook_ads/field_types/list.rb +57 -0
  275. data/lib/facebook_ads/field_types/object.rb +45 -0
  276. data/lib/facebook_ads/field_types/string_type.rb +39 -0
  277. data/lib/facebook_ads/field_types/upload_file.rb +121 -0
  278. data/lib/facebook_ads/fields.rb +66 -0
  279. data/lib/facebook_ads/helpers/edge_helpers.rb +57 -0
  280. data/lib/facebook_ads/helpers/node_helpers.rb +80 -0
  281. data/lib/facebook_ads/helpers/shortcuts.rb +34 -0
  282. data/lib/facebook_ads/param_set.rb +74 -0
  283. data/lib/facebook_ads/ruby2patch.rb +27 -0
  284. data/lib/facebook_ads/session.rb +99 -0
  285. data/lib/facebook_ads/test.rb +23 -0
  286. data/lib/facebook_ads/test/base.rb +98 -0
  287. data/lib/facebook_ads/test/config.rb +55 -0
  288. data/lib/facebook_ads/test/errors.rb +23 -0
  289. data/lib/facebook_ads/test/exit_codes.rb +29 -0
  290. data/lib/facebook_ads/test/exit_hook.rb +35 -0
  291. data/lib/facebook_ads/test/fixtures.rb +107 -0
  292. data/lib/facebook_ads/utils/utils.rb +29 -0
  293. data/lib/facebook_ads/version.rb +24 -0
  294. data/lib/facebook_ads/videos/video_io.rb +25 -0
  295. data/lib/facebook_ads/videos/video_request.rb +42 -0
  296. data/lib/facebookbusiness.rb +1 -0
  297. metadata +508 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8a17922edffc590a7659c5ea3d636d17d80ebc6bb41288b261f79012c73a8a9c
4
+ data.tar.gz: 132894d87cf48e72cc1a82558c5e4f35d8d5c99802664eb5464eac3f7b6b2fc6
5
+ SHA512:
6
+ metadata.gz: 9321bcea3ff10630d2275d0d442601677fe87c93b46878ddc901eddba880102df592bb57494c6cd1a8a1b559e3fc4a36beeb62df3a99857b86c76ddec2a93286
7
+ data.tar.gz: 6b04d771533a1526fbe4e403a21fb4c383c3b725f6cd7eb12030e067ac7f59aa98f05aae7018e3e9ae2b5ff8c9de1c88e3bda5d77a74aee006f408bfa68f3d79
@@ -0,0 +1,17 @@
1
+ Copyright (c) 2017-present, Facebook, Inc. All rights reserved.
2
+
3
+ You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
4
+ copy, modify, and distribute this software in source code or binary form for use
5
+ in connection with the web services and APIs provided by Facebook.
6
+
7
+ As with any software that integrates with the Facebook platform, your use of
8
+ this software is subject to the Facebook Platform Policy
9
+ [http://developers.facebook.com/policy/]. This copyright notice shall be
10
+ included in all copies or substantial portions of the software.
11
+
12
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
14
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
15
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
16
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
17
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,256 @@
1
+ # Facebook Business SDK for Ruby
2
+
3
+ ### Introduction
4
+
5
+ The Facebook <a href="https://developers.facebook.com/docs/business-sdk" target="_blank">Business SDK</a> is a one-stop shop to help our partners better serve their businesses. Partners are using multiple Facebook API's to server the needs of their clients. Adopting all these API's and keeping them up to date across the various platforms can be time consuming and ultimately prohibitive. For this reason Facebook has developed the Business SDK bundling many of its APIs into one SDK to ease implementation and upkeep. The Business SDK is an upgraded version of the Marketing API SDK that includes the Marketing API as well as many Facebook APIs from different platforms such as Pages, Business Manager, Instagram, etc.
6
+
7
+ ## Quick Start
8
+
9
+ Business SDK <a href="https://developers.facebook.com/docs/business-sdk/getting-started" target="_blank">Getting Started Guide</a>
10
+
11
+ ## Pre-requisites
12
+
13
+ ### Ruby Version
14
+ We developed this SDK using Ruby 2.0, and supports Ruby 2.0+, however, the SDK is not thread-safe at the moment.
15
+
16
+ ### Register An App
17
+
18
+ To get started with the SDK, you must have an app
19
+ registered on <a href="https://developers.facebook.com/" target="_blank">developers.facebook.com</a>.
20
+
21
+ To manage the Marketing API, please visit your
22
+ <a href="https://developers.facebook.com/apps/<YOUR APP ID>/dashboard"> App Dashboard </a>
23
+ and add the <b>Marketing API</b> product to your app.
24
+
25
+ **IMPORTANT**: For security, it is recommended that you turn on 'App Secret
26
+ Proof for Server API calls' in your app's Settings->Advanced page.
27
+
28
+ ### Obtain An Access Token
29
+
30
+ When someone connects with an app using Facebook Login and approves the request
31
+ for permissions, the app obtains an access token that provides temporary, secure
32
+ access to Facebook APIs.
33
+
34
+ An access token is an opaque string that identifies a User, app, or Page.
35
+
36
+ For example, to access the Marketing API, you need to generate a User access token
37
+ for your app and ask for the ``ads_management`` permission; to access Pages API,
38
+ you need to generate a Page access token for your app and ask for the ``manage_page`` permission.
39
+
40
+ Refer to our
41
+ <a href="https://developers.facebook.com/docs/facebook-login/access-tokens" target="_blank">
42
+ Access Token Guide</a> to learn more.
43
+
44
+ For now, we can use the
45
+ <a href="https://developers.facebook.com/tools/explorer" target="_blank">Graph Explorer</a>
46
+ to get an access token.
47
+
48
+ ## Installation
49
+ The SDK is available as a RubyGem. To use the gem, you can add the following to Gemfile
50
+
51
+ ```ruby
52
+ gem 'facebookads'
53
+ ```
54
+
55
+ or install it using command line
56
+
57
+ ```bash
58
+ gem install facebookads
59
+ ```
60
+
61
+ and then in your code
62
+
63
+ ```ruby
64
+ require 'facebook_ads'
65
+ ```
66
+
67
+
68
+ ## Configuration
69
+ ### Access Token
70
+ There are several ways to configure access token and app secret. If you only use one access token and app secret (example: an internal app managing only your own assets). You can set a global access token and app secret will will be used across all requests
71
+
72
+ ```ruby
73
+ FacebookAds.configure do |config|
74
+ config.access_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
75
+ config.app_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
76
+ end
77
+ ```
78
+
79
+ Another way is to configure using environment variables, which will be picked up by the SDK as the default
80
+
81
+ ```bash
82
+ FB_ACCESS_TOKEN=asdsadasds
83
+ FB_APP_SECRET=asdasdsa
84
+ ```
85
+
86
+ Or you can create a session object for particular object
87
+
88
+ ```ruby
89
+ # Create a Session object to be reused
90
+ session = FacebookAds::Session.new(access_token: <ACCESS_TOKEN>, app_secret: <APP SECRET>)
91
+ ad_account = FacebookAds::AdAccount.get('act_12334', 'name', session)
92
+
93
+ # Or a using shortcut during object instantiation
94
+ ad_account = FacebookAds::AdAccount.get('act_12334', 'name', {
95
+ access_token: <ACCESS_TOKEN>, app_secret: <APP SECRET>
96
+ })
97
+ ```
98
+
99
+ ## Basic Operations
100
+
101
+ ### Reading a node
102
+ The SDK contains ad object files auto generated from our API metadata, each node type has its own corresponding Ruby class under the `FacebookAds` module. For example, to fetch an AdAccount
103
+
104
+ ```ruby
105
+ ad_account = FacebookAds::AdAccount.get('act_1234567', 'name')
106
+ puts "Ad Account Name: #{ad_account.name}"
107
+ ```
108
+
109
+ The `#get` method doesn't trigger the `GET` request immediately. The API request for `GET` is fired on-demand. In the example above, API request won't fire until `ad_account.name` is executed.
110
+
111
+ ### Updating a node
112
+ To update a node, you can use the `#save` method of ad object classes.
113
+
114
+ ```ruby
115
+ ad_account = FacebookAds::AdAccount.get('act_1234567', 'name')
116
+ ad_account.name = "New Ad Account"
117
+ ad_account.save
118
+
119
+ # Fetch it again
120
+ ad_account.reload!
121
+ ad_account.name
122
+ => "New Ad Account"
123
+ ```
124
+
125
+ ### Deleting a node
126
+ To delete a node, you can use the `#destroy` method.
127
+
128
+ ```ruby
129
+ campaign = FacebookAds::Campaign.get('<CAMPAIGN_ID>')
130
+ campaign.destroy
131
+ ```
132
+
133
+ ### Reference
134
+ You can refer to our [Marketing API reference](https://developers.facebook.com/docs/marketing-api/reference/) or look inside `lib/facebook_ads/ad_objects` directory of the code base to see the complete list of available ad objects.
135
+
136
+ ## Interacting with Edges
137
+
138
+ To interact with an edge, you first need to instantiate the parent node. Since, as mentioned above, `GET` request of a node is triggered on-demand, so you don't need to worry about consuming unnecessary API quota.
139
+
140
+ ### Fetching Edges (GET)
141
+
142
+ Iterating edges is easy, instantiate the parent nodes and then simply iterate with `#each`. The edge is an `Enumerable` so a bunch of handy methods such as `#map`, `#select`, `#find` etc. come for free!
143
+
144
+ ```ruby
145
+ ad_account = FacebookAds::AdAccount.get('act_1234567', 'name')
146
+
147
+ # Printing all campaign names
148
+ ad_account.campaigns(fields: 'name').each do |campaign|
149
+ puts campaign.name
150
+ end
151
+
152
+ # Getting all campaign names
153
+ ad_account.campaigns(fields: 'name').map(&:name)
154
+
155
+ ```
156
+
157
+ ### Creating new nodes (POST)
158
+ To `POST` to a edge, you can use the `#create` method on the edge and supply parameter if needed
159
+
160
+ ```ruby
161
+ campaign = ad_account.campaigns.create({
162
+ name: "My First campaign",
163
+ objective: "CONVERSIONS",
164
+ })
165
+ ```
166
+
167
+ ### Removing from edge (DELETE)
168
+ To `DELETE` an edge, you can use the `#destroy` method on the edge and supply parameter if needed
169
+
170
+ ```ruby
171
+ # Deleting an AdImage by its hash
172
+ ad_account.adimages.destroy({hash: 'abcd1234'})
173
+ ```
174
+
175
+ ## Images/Videos
176
+ The SDK supports image/video uploads. Just supply a parameter of `File` type.
177
+
178
+ Image upload example:
179
+
180
+ ```ruby
181
+ # AdImage supports multiple images upload
182
+ ad_account.adimages.create({
183
+ 'logo1.png' => File.open('./assets/logo1.jpg'),
184
+ 'logo2.png' => File.open('./assets/logo2.jpg'),
185
+ })
186
+ => [#<FacebookAds::AdImage {:hash=>"..."}>, #<FacebookAds::AdImage {:hash=>"..."}>]
187
+ ```
188
+
189
+ Video upload example:
190
+
191
+ ```ruby
192
+ ad_account.advideos.create({
193
+ name: 'My first video',
194
+ source: File.open(File.expand_path("../video_ad_example.mp4", __FILE__))
195
+ })
196
+ ```
197
+
198
+ ## Batch API
199
+
200
+ [Batch API](https://developers.facebook.com/docs/marketing-api/asyncrequests) allows you to make API calls in a batch. You can collect a bunch of API requests and fire them all at once to reduce wait time. To create a batch, just wrap operations with a block to `FacebookAds::Batch#with_batch`
201
+
202
+ ```ruby
203
+ ad_account = FacebookAds::AdAccount.get('act_<ACT_ID>')
204
+
205
+ batch = FacebookAds::Batch.with_batch do
206
+ 10.times.map do |n|
207
+ ad_account.campaigns.create({
208
+ name: 'My Test Campaign #' + n,
209
+ objective: 'CONVERSIONS',
210
+ status: 'PAUSED',
211
+ })
212
+ end
213
+ end
214
+
215
+ batch.execute
216
+ ```
217
+
218
+ ### Dependencies within a batch (Experimental)
219
+ Dependencies between requests is supported, the SDK simplifies the use of JSONPath references between batched operations.
220
+
221
+ ```ruby
222
+ ad_account = FacebookAds::AdAccount.get('act_12334')
223
+
224
+ batch = FacebookAds::Batch.with_batch do
225
+ # This won't be sent out immediately!
226
+ campaign = ad_account.campaigns.create({
227
+ name: 'My Test Campaign',
228
+ objective: 'CONVERSIONS',
229
+ status: 'PAUSED',
230
+ })
231
+
232
+ # Even the request above is not being sent yet, reference to campaign.id still works
233
+ ad_accounts.adsets.create({
234
+ name: 'My AdSet',
235
+ campaign_id: campaign.id, # campaign.id here will return {result=create-campaign:$.id}
236
+ ...
237
+ ...
238
+ ...
239
+ })
240
+ end
241
+ ```
242
+
243
+ ## Logging
244
+
245
+ ```ruby
246
+ FacebookAds.configure do |config|
247
+ # Logger for debugger
248
+ config.logger = ::Logger.new(STDOUT).tap { |d| d.level = Logger::DEBUG }
249
+
250
+ # Log Http request & response to logger
251
+ config.log_api_bodies = true
252
+ end
253
+ ```
254
+
255
+ ## Reporting Bugs/Feedback
256
+ Please raise any issue on GitHub.
@@ -0,0 +1,72 @@
1
+ # Copyright (c) 2017-present, Facebook, Inc. All rights reserved.
2
+ #
3
+ # You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
4
+ # copy, modify, and distribute this software in source code or binary form for use
5
+ # in connection with the web services and APIs provided by Facebook.
6
+ #
7
+ # As with any software that integrates with the Facebook platform, your use of
8
+ # this software is subject to the Facebook Platform Policy
9
+ # [http://developers.facebook.com/policy/]. This copyright notice shall be
10
+ # included in all copies or substantial portions of the software.
11
+ #
12
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
14
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
15
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
16
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
17
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18
+
19
+ require 'facebook_ads/version'
20
+ require 'facebook_ads/helpers/shortcuts'
21
+
22
+ module FacebookAds
23
+ DEFAULT_API_VERSION = 'v' + API_VERSION
24
+ DEFAULT_HOST = 'graph.facebook.com'
25
+
26
+ extend self
27
+ extend Shortcuts
28
+
29
+ def with_session(access_token, secret = nil, api_version = DEFAULT_API_VERSION)
30
+ original_session = Session.current_session
31
+ Session.current_session = Session.new(access_token, secret, api_version)
32
+ yield
33
+ Session.current_session = original_session
34
+ end
35
+
36
+ def configure
37
+ @config ||= Config.new
38
+ yield @config if block_given?
39
+ @config
40
+ end
41
+
42
+ alias_method :config, :configure
43
+
44
+ require 'facebook_ads/ruby2patch'
45
+
46
+ require 'facebook_ads/config'
47
+ require 'facebook_ads/errors'
48
+ require 'facebook_ads/session'
49
+ require 'facebook_ads/fields'
50
+ require 'facebook_ads/edge'
51
+ require 'facebook_ads/param_set'
52
+ require 'facebook_ads/ad_object'
53
+ require 'facebook_ads/field_types'
54
+
55
+ require 'facebook_ads/utils/utils'
56
+ require 'facebook_ads/videos/video_io'
57
+
58
+ require 'facebook_ads/batch_api/batch'
59
+ require 'facebook_ads/batch_api/batch_proxy'
60
+
61
+ # Autoload Ab Objects Helpers
62
+ Dir.glob(File.expand_path(File.join(__FILE__, '..', 'facebook_ads', 'ad_objects', 'helpers', '*.rb'))).each do |file|
63
+ class_name = File.basename(file, '.rb').split('_').map(&:capitalize).join.to_sym
64
+ autoload class_name, file
65
+ end
66
+
67
+ # Autoload AdObjects
68
+ Dir.glob(File.expand_path(File.join(__FILE__, '..', 'facebook_ads', 'ad_objects', '*.rb'))).each do |file|
69
+ class_name = File.basename(file, '.rb').split('_').map(&:capitalize).join.to_sym
70
+ autoload class_name, file
71
+ end
72
+ end
@@ -0,0 +1,177 @@
1
+ # Copyright (c) 2017-present, Facebook, Inc. All rights reserved.
2
+ #
3
+ # You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
4
+ # copy, modify, and distribute this software in source code or binary form for use
5
+ # in connection with the web services and APIs provided by Facebook.
6
+ #
7
+ # As with any software that integrates with the Facebook platform, your use of
8
+ # this software is subject to the Facebook Platform Policy
9
+ # [http://developers.facebook.com/policy/]. This copyright notice shall be
10
+ # included in all copies or substantial portions of the software.
11
+ #
12
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
14
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
15
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
16
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
17
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18
+
19
+ require 'json'
20
+ require 'facebook_ads/api_request'
21
+ require 'facebook_ads/api_response'
22
+ require 'facebook_ads/helpers/node_helpers'
23
+ require 'facebook_ads/helpers/edge_helpers'
24
+
25
+ module FacebookAds
26
+ class AdObject
27
+ attr_reader :attributes, :__all_fields, :last_api_response
28
+ attr_accessor :deserializer
29
+ attr_accessor :last_saved, :last_destroyed
30
+
31
+ include Fields
32
+ include GraphNodes
33
+ include GraphEdges
34
+
35
+ def initialize(attributes, *args)
36
+ if attributes.empty?
37
+ raise InvalidParameterError, 'Invalid attributes. Must include at least one attribute'
38
+ end
39
+
40
+ update_attributes(attributes)
41
+ # assume object with only id in the attributes as not loaded
42
+
43
+ # is next arg a list of fields?
44
+ fields = (args[0].is_a?(Array) || args[0].is_a?(String)) ? args.shift : []
45
+ fields = fields.split(',') if fields.is_a?(String)
46
+ session = args.shift
47
+
48
+ self.__all_fields = fields + attributes.keys
49
+ self.session = session
50
+ end
51
+
52
+ def self.get(id, *args)
53
+ obj = new({id: id}, *args)
54
+ yield obj if block_given?
55
+ obj
56
+ end
57
+
58
+ def id
59
+ self[:id]
60
+ end
61
+
62
+ def update_attributes(attrs)
63
+ @attributes ||= {}
64
+ @attributes.merge!(
65
+ self.class.deserializer ?
66
+ self.class.deserializer.deserialize(symbolize_keys_shallow(attrs)) :
67
+ symbolize_keys_shallow(attrs)
68
+ )
69
+ self
70
+ end
71
+
72
+ def [](attr_name)
73
+ @attributes[attr_name.to_sym]
74
+ end
75
+
76
+ def to_hash
77
+ @attributes.merge(changes)
78
+ end
79
+
80
+ def as_json(*opts)
81
+ to_hash
82
+ end
83
+
84
+ def to_json(*a)
85
+ as_json.to_json(*a)
86
+ end
87
+
88
+ def inspect
89
+ "#<#{self.class.name} #{to_hash.inspect}>"
90
+ end
91
+
92
+ def fields_as_string
93
+ @__all_fields.to_a.join(',')
94
+ end
95
+
96
+ def __all_fields=(fields)
97
+ @__all_fields = Set.new((fields.is_a?(String) ? fields.split(',') : fields.map(&:to_s)).map(&:to_sym))
98
+ end
99
+
100
+ def loaded?
101
+ (@__all_fields - attributes.keys).empty?
102
+ end
103
+
104
+ def load!
105
+ get(graph_params) do |attrs|
106
+ update_attributes(attrs)
107
+ end
108
+ end
109
+
110
+ def reload!
111
+ # delete all attribute except id
112
+ @attributes = @attributes.keep_if { |k,_| k == :id }
113
+ end
114
+
115
+ # TODO refactor this to somewhere
116
+ def graph_params
117
+ {fields: fields_as_string}
118
+ end
119
+
120
+ [:get, :post, :delete].each do |verb|
121
+ define_method(verb) do |params = {}, &block|
122
+ params, options = extract_options(params)
123
+ APIRequest.new(verb, self.id, session: session, params: params, options: options).execute do |api_response|
124
+ @last_api_response = api_response
125
+ block ? block[api_response.result] : api_response
126
+ end
127
+ end
128
+
129
+ define_method("#{verb}_edge") do |edge_name, params = {}, &block|
130
+ params, options = extract_options(params)
131
+ path = "#{self.id}/#{edge_name}"
132
+ APIRequest.new(verb, path, session: session, params: params, options: options).execute do |api_response|
133
+ @last_api_response = api_response
134
+ block ? block[api_response.result] : api_response
135
+ end
136
+ end
137
+ end
138
+
139
+ def save(params = {})
140
+ post(graph_params.merge(changes).merge(params)) do |attrs|
141
+ update_attributes(attrs)
142
+ @changes = {}
143
+ self.last_saved = Time.now
144
+ end
145
+ end
146
+
147
+ def destroy(params = {})
148
+ delete(params) do |attrs|
149
+ self.last_destroyed = Time.now if attrs['success']
150
+ end
151
+ end
152
+
153
+ def changes
154
+ @changes ||= {}
155
+ end
156
+
157
+ def session
158
+ @session || Session.default_session
159
+ end
160
+
161
+ def session=(session)
162
+ @session = session.is_a?(Hash) ? Session.new(session) : session
163
+ end
164
+
165
+ private
166
+ def symbolize_keys_shallow(hash)
167
+ Hash[hash.map { |k,v| [k.to_sym,v] }]
168
+ end
169
+
170
+ def extract_options(params)
171
+ option_keys = [:batch_opts]
172
+ options = {}
173
+ option_keys.each { |k| options[k] = params.delete(k) if params.has_key?(k) }
174
+ [params, options]
175
+ end
176
+ end
177
+ end