google-adwords-api 0.16.1 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (343) hide show
  1. checksums.yaml +8 -8
  2. data/ChangeLog +6 -1
  3. data/README.md +1 -1
  4. data/examples/v201502/account_management/create_account.rb +1 -1
  5. data/examples/v201502/account_management/get_account_hierarchy.rb +1 -1
  6. data/examples/v201502/reporting/parallel_report_download.rb +1 -1
  7. data/examples/v201506/account_management/create_account.rb +1 -1
  8. data/examples/v201506/account_management/get_account_hierarchy.rb +1 -1
  9. data/examples/v201506/reporting/parallel_report_download.rb +1 -1
  10. data/examples/v201509/account_management/create_account.rb +88 -0
  11. data/examples/v201509/account_management/get_account_changes.rb +139 -0
  12. data/examples/v201509/account_management/get_account_hierarchy.rb +94 -0
  13. data/examples/v201509/advanced_operations/add_ad_customizers.rb +184 -0
  14. data/examples/v201509/advanced_operations/add_ad_group_bid_modifier.rb +101 -0
  15. data/examples/v201509/advanced_operations/add_click_to_download_ad.rb +133 -0
  16. data/examples/v201509/advanced_operations/add_html5_ad.rb +137 -0
  17. data/examples/v201509/advanced_operations/add_text_ad_with_upgraded_urls.rb +134 -0
  18. data/examples/v201509/advanced_operations/create_and_attach_shared_keyword_set.rb +141 -0
  19. data/examples/v201509/advanced_operations/find_and_remove_criteria_from_shared_set.rb +174 -0
  20. data/examples/v201509/advanced_operations/get_ad_group_bid_modifiers.rb +102 -0
  21. data/examples/v201509/advanced_operations/upload_offline_conversions.rb +113 -0
  22. data/examples/v201509/advanced_operations/use_shared_bidding_strategy.rb +147 -0
  23. data/examples/v201509/basic_operations/add_ad_groups.rb +140 -0
  24. data/examples/v201509/basic_operations/add_campaigns.rb +139 -0
  25. data/examples/v201509/basic_operations/add_keywords.rb +114 -0
  26. data/examples/v201509/basic_operations/add_text_ads.rb +109 -0
  27. data/examples/v201509/basic_operations/get_ad_groups.rb +102 -0
  28. data/examples/v201509/basic_operations/get_campaigns.rb +97 -0
  29. data/examples/v201509/basic_operations/get_campaigns_with_awql.rb +89 -0
  30. data/examples/v201509/basic_operations/get_keywords.rb +109 -0
  31. data/examples/v201509/basic_operations/get_text_ads.rb +110 -0
  32. data/examples/v201509/basic_operations/pause_ad.rb +88 -0
  33. data/examples/v201509/basic_operations/remove_ad.rb +89 -0
  34. data/examples/v201509/basic_operations/remove_ad_group.rb +85 -0
  35. data/examples/v201509/basic_operations/remove_campaign.rb +87 -0
  36. data/examples/v201509/basic_operations/remove_keyword.rb +94 -0
  37. data/examples/v201509/basic_operations/update_ad_group.rb +85 -0
  38. data/examples/v201509/basic_operations/update_campaign.rb +86 -0
  39. data/examples/v201509/basic_operations/update_keyword.rb +106 -0
  40. data/examples/v201509/campaign_management/add_campaign_labels.rb +82 -0
  41. data/examples/v201509/campaign_management/add_complete_campaigns_using_batch_job.rb +362 -0
  42. data/examples/v201509/campaign_management/add_experiment.rb +162 -0
  43. data/examples/v201509/campaign_management/add_keywords_in_bulk.rb +153 -0
  44. data/examples/v201509/campaign_management/get_all_disapproved_ads.rb +97 -0
  45. data/examples/v201509/campaign_management/get_all_disapproved_ads_with_awql.rb +89 -0
  46. data/examples/v201509/campaign_management/get_campaigns_by_label.rb +108 -0
  47. data/examples/v201509/campaign_management/promote_experiment.rb +81 -0
  48. data/examples/v201509/campaign_management/set_ad_parameters.rb +118 -0
  49. data/examples/v201509/campaign_management/set_criterion_bid_modifier.rb +104 -0
  50. data/examples/v201509/campaign_management/validate_text_ad.rb +110 -0
  51. data/examples/v201509/error_handling/handle_partial_failures.rb +130 -0
  52. data/examples/v201509/error_handling/handle_policy_violation_error.rb +141 -0
  53. data/examples/v201509/extensions/add_google_my_business_location_extensions.rb +193 -0
  54. data/examples/v201509/extensions/add_site_links.rb +164 -0
  55. data/examples/v201509/extensions/add_site_links_using_feeds.rb +281 -0
  56. data/examples/v201509/migration/migrate_to_extension_settings.rb +386 -0
  57. data/examples/v201509/migration/upgrade_ad_url.rb +93 -0
  58. data/examples/v201509/misc/get_all_images_and_videos.rb +104 -0
  59. data/examples/v201509/misc/setup_oauth2.rb +84 -0
  60. data/examples/v201509/misc/upload_image.rb +93 -0
  61. data/examples/v201509/misc/upload_media_bundle.rb +90 -0
  62. data/examples/v201509/misc/use_oauth2_jwt.rb +93 -0
  63. data/examples/v201509/misc/use_runtime_config.rb +92 -0
  64. data/examples/v201509/optimization/estimate_keyword_traffic.rb +146 -0
  65. data/examples/v201509/optimization/get_keyword_bid_simulations.rb +95 -0
  66. data/examples/v201509/optimization/get_keyword_ideas.rb +126 -0
  67. data/examples/v201509/remarketing/add_audience.rb +118 -0
  68. data/examples/v201509/remarketing/add_conversion_tracker.rb +98 -0
  69. data/examples/v201509/remarketing/add_crm_based_user_list.rb +121 -0
  70. data/examples/v201509/remarketing/add_rule_based_user_lists.rb +167 -0
  71. data/examples/v201509/reporting/download_criteria_report.rb +92 -0
  72. data/examples/v201509/reporting/download_criteria_report_with_awql.rb +93 -0
  73. data/examples/v201509/reporting/get_report_fields.rb +75 -0
  74. data/examples/v201509/reporting/parallel_report_download.rb +166 -0
  75. data/examples/v201509/shopping_campaigns/add_product_partition_tree.rb +267 -0
  76. data/examples/v201509/shopping_campaigns/add_product_scope.rb +129 -0
  77. data/examples/v201509/shopping_campaigns/add_shopping_campaign.rb +129 -0
  78. data/examples/v201509/shopping_campaigns/get_product_category_taxonomy.rb +115 -0
  79. data/examples/v201509/targeting/add_campaign_targeting_criteria.rb +180 -0
  80. data/examples/v201509/targeting/add_demographic_targeting_criteria.rb +112 -0
  81. data/examples/v201509/targeting/get_campaign_targeting_criteria.rb +106 -0
  82. data/examples/v201509/targeting/get_targetable_languages_and_carriers.rb +89 -0
  83. data/examples/v201509/targeting/lookup_location.rb +108 -0
  84. data/lib/adwords_api/api_config.rb +91 -4
  85. data/lib/adwords_api/batch_job_utils.rb +234 -0
  86. data/lib/adwords_api/errors.rb +3 -0
  87. data/lib/adwords_api/report_utils.rb +22 -6
  88. data/lib/adwords_api/v201502/account_label_service.rb +9 -1
  89. data/lib/adwords_api/v201502/account_label_service_registry.rb +1 -1
  90. data/lib/adwords_api/v201502/ad_customizer_feed_service.rb +9 -1
  91. data/lib/adwords_api/v201502/ad_customizer_feed_service_registry.rb +1 -1
  92. data/lib/adwords_api/v201502/ad_group_ad_service.rb +21 -1
  93. data/lib/adwords_api/v201502/ad_group_ad_service_registry.rb +2 -2
  94. data/lib/adwords_api/v201502/ad_group_bid_modifier_service.rb +13 -1
  95. data/lib/adwords_api/v201502/ad_group_bid_modifier_service_registry.rb +1 -1
  96. data/lib/adwords_api/v201502/ad_group_criterion_service.rb +17 -1
  97. data/lib/adwords_api/v201502/ad_group_criterion_service_registry.rb +1 -1
  98. data/lib/adwords_api/v201502/ad_group_extension_setting_service.rb +13 -1
  99. data/lib/adwords_api/v201502/ad_group_extension_setting_service_registry.rb +2 -2
  100. data/lib/adwords_api/v201502/ad_group_feed_service.rb +13 -1
  101. data/lib/adwords_api/v201502/ad_group_feed_service_registry.rb +1 -1
  102. data/lib/adwords_api/v201502/ad_group_service.rb +17 -1
  103. data/lib/adwords_api/v201502/ad_group_service_registry.rb +2 -2
  104. data/lib/adwords_api/v201502/ad_param_service.rb +9 -1
  105. data/lib/adwords_api/v201502/ad_param_service_registry.rb +1 -1
  106. data/lib/adwords_api/v201502/adwords_user_list_service.rb +9 -1
  107. data/lib/adwords_api/v201502/adwords_user_list_service_registry.rb +1 -1
  108. data/lib/adwords_api/v201502/bidding_strategy_service.rb +13 -1
  109. data/lib/adwords_api/v201502/bidding_strategy_service_registry.rb +1 -1
  110. data/lib/adwords_api/v201502/budget_order_service.rb +13 -1
  111. data/lib/adwords_api/v201502/budget_order_service_registry.rb +1 -1
  112. data/lib/adwords_api/v201502/budget_service.rb +13 -1
  113. data/lib/adwords_api/v201502/budget_service_registry.rb +1 -1
  114. data/lib/adwords_api/v201502/campaign_criterion_service.rb +13 -1
  115. data/lib/adwords_api/v201502/campaign_criterion_service_registry.rb +1 -1
  116. data/lib/adwords_api/v201502/campaign_extension_setting_service.rb +13 -1
  117. data/lib/adwords_api/v201502/campaign_extension_setting_service_registry.rb +2 -2
  118. data/lib/adwords_api/v201502/campaign_feed_service.rb +13 -1
  119. data/lib/adwords_api/v201502/campaign_feed_service_registry.rb +1 -1
  120. data/lib/adwords_api/v201502/campaign_service.rb +17 -1
  121. data/lib/adwords_api/v201502/campaign_service_registry.rb +2 -2
  122. data/lib/adwords_api/v201502/campaign_shared_set_service.rb +9 -1
  123. data/lib/adwords_api/v201502/campaign_shared_set_service_registry.rb +1 -1
  124. data/lib/adwords_api/v201502/constant_data_service.rb +37 -1
  125. data/lib/adwords_api/v201502/constant_data_service_registry.rb +1 -1
  126. data/lib/adwords_api/v201502/conversion_tracker_service.rb +13 -1
  127. data/lib/adwords_api/v201502/conversion_tracker_service_registry.rb +1 -1
  128. data/lib/adwords_api/v201502/customer_extension_setting_service.rb +13 -1
  129. data/lib/adwords_api/v201502/customer_extension_setting_service_registry.rb +2 -2
  130. data/lib/adwords_api/v201502/customer_feed_service.rb +13 -1
  131. data/lib/adwords_api/v201502/customer_feed_service_registry.rb +1 -1
  132. data/lib/adwords_api/v201502/customer_service.rb +9 -1
  133. data/lib/adwords_api/v201502/customer_service_registry.rb +1 -1
  134. data/lib/adwords_api/v201502/customer_sync_service.rb +5 -1
  135. data/lib/adwords_api/v201502/customer_sync_service_registry.rb +1 -1
  136. data/lib/adwords_api/v201502/data_service.rb +25 -1
  137. data/lib/adwords_api/v201502/data_service_registry.rb +1 -1
  138. data/lib/adwords_api/v201502/experiment_service.rb +9 -1
  139. data/lib/adwords_api/v201502/experiment_service_registry.rb +1 -1
  140. data/lib/adwords_api/v201502/feed_item_service.rb +13 -1
  141. data/lib/adwords_api/v201502/feed_item_service_registry.rb +1 -1
  142. data/lib/adwords_api/v201502/feed_mapping_service.rb +13 -1
  143. data/lib/adwords_api/v201502/feed_mapping_service_registry.rb +1 -1
  144. data/lib/adwords_api/v201502/feed_service.rb +13 -1
  145. data/lib/adwords_api/v201502/feed_service_registry.rb +1 -1
  146. data/lib/adwords_api/v201502/geo_location_service.rb +5 -1
  147. data/lib/adwords_api/v201502/geo_location_service_registry.rb +1 -1
  148. data/lib/adwords_api/v201502/label_service.rb +13 -1
  149. data/lib/adwords_api/v201502/label_service_registry.rb +1 -1
  150. data/lib/adwords_api/v201502/location_criterion_service.rb +9 -1
  151. data/lib/adwords_api/v201502/location_criterion_service_registry.rb +2 -2
  152. data/lib/adwords_api/v201502/managed_customer_service.rb +25 -1
  153. data/lib/adwords_api/v201502/managed_customer_service_registry.rb +1 -1
  154. data/lib/adwords_api/v201502/media_service.rb +13 -1
  155. data/lib/adwords_api/v201502/media_service_registry.rb +1 -1
  156. data/lib/adwords_api/v201502/mutate_job_service.rb +13 -1
  157. data/lib/adwords_api/v201502/mutate_job_service_registry.rb +2 -2
  158. data/lib/adwords_api/v201502/offline_conversion_feed_service.rb +5 -1
  159. data/lib/adwords_api/v201502/offline_conversion_feed_service_registry.rb +1 -1
  160. data/lib/adwords_api/v201502/report_definition_service.rb +5 -1
  161. data/lib/adwords_api/v201502/report_definition_service_registry.rb +1 -1
  162. data/lib/adwords_api/v201502/shared_criterion_service.rb +9 -1
  163. data/lib/adwords_api/v201502/shared_criterion_service_registry.rb +1 -1
  164. data/lib/adwords_api/v201502/shared_set_service.rb +9 -1
  165. data/lib/adwords_api/v201502/shared_set_service_registry.rb +1 -1
  166. data/lib/adwords_api/v201502/targeting_idea_service.rb +5 -1
  167. data/lib/adwords_api/v201502/targeting_idea_service_registry.rb +2 -2
  168. data/lib/adwords_api/v201502/traffic_estimator_service.rb +5 -1
  169. data/lib/adwords_api/v201502/traffic_estimator_service_registry.rb +2 -2
  170. data/lib/adwords_api/v201506/account_label_service.rb +9 -1
  171. data/lib/adwords_api/v201506/account_label_service_registry.rb +1 -1
  172. data/lib/adwords_api/v201506/ad_customizer_feed_service.rb +9 -1
  173. data/lib/adwords_api/v201506/ad_customizer_feed_service_registry.rb +1 -1
  174. data/lib/adwords_api/v201506/ad_group_ad_service.rb +21 -1
  175. data/lib/adwords_api/v201506/ad_group_ad_service_registry.rb +2 -2
  176. data/lib/adwords_api/v201506/ad_group_bid_modifier_service.rb +13 -1
  177. data/lib/adwords_api/v201506/ad_group_bid_modifier_service_registry.rb +1 -1
  178. data/lib/adwords_api/v201506/ad_group_criterion_service.rb +17 -1
  179. data/lib/adwords_api/v201506/ad_group_criterion_service_registry.rb +1 -1
  180. data/lib/adwords_api/v201506/ad_group_extension_setting_service.rb +13 -1
  181. data/lib/adwords_api/v201506/ad_group_extension_setting_service_registry.rb +2 -2
  182. data/lib/adwords_api/v201506/ad_group_feed_service.rb +13 -1
  183. data/lib/adwords_api/v201506/ad_group_feed_service_registry.rb +1 -1
  184. data/lib/adwords_api/v201506/ad_group_service.rb +17 -1
  185. data/lib/adwords_api/v201506/ad_group_service_registry.rb +2 -2
  186. data/lib/adwords_api/v201506/ad_param_service.rb +9 -1
  187. data/lib/adwords_api/v201506/ad_param_service_registry.rb +1 -1
  188. data/lib/adwords_api/v201506/adwords_user_list_service.rb +9 -1
  189. data/lib/adwords_api/v201506/adwords_user_list_service_registry.rb +1 -1
  190. data/lib/adwords_api/v201506/bidding_strategy_service.rb +13 -1
  191. data/lib/adwords_api/v201506/bidding_strategy_service_registry.rb +1 -1
  192. data/lib/adwords_api/v201506/budget_order_service.rb +13 -1
  193. data/lib/adwords_api/v201506/budget_order_service_registry.rb +1 -1
  194. data/lib/adwords_api/v201506/budget_service.rb +13 -1
  195. data/lib/adwords_api/v201506/budget_service_registry.rb +1 -1
  196. data/lib/adwords_api/v201506/campaign_criterion_service.rb +13 -1
  197. data/lib/adwords_api/v201506/campaign_criterion_service_registry.rb +1 -1
  198. data/lib/adwords_api/v201506/campaign_extension_setting_service.rb +13 -1
  199. data/lib/adwords_api/v201506/campaign_extension_setting_service_registry.rb +2 -2
  200. data/lib/adwords_api/v201506/campaign_feed_service.rb +13 -1
  201. data/lib/adwords_api/v201506/campaign_feed_service_registry.rb +1 -1
  202. data/lib/adwords_api/v201506/campaign_service.rb +17 -1
  203. data/lib/adwords_api/v201506/campaign_service_registry.rb +1 -1
  204. data/lib/adwords_api/v201506/campaign_shared_set_service.rb +13 -1
  205. data/lib/adwords_api/v201506/campaign_shared_set_service_registry.rb +1 -1
  206. data/lib/adwords_api/v201506/constant_data_service.rb +37 -1
  207. data/lib/adwords_api/v201506/constant_data_service_registry.rb +1 -1
  208. data/lib/adwords_api/v201506/conversion_tracker_service.rb +13 -1
  209. data/lib/adwords_api/v201506/conversion_tracker_service_registry.rb +1 -1
  210. data/lib/adwords_api/v201506/customer_extension_setting_service.rb +13 -1
  211. data/lib/adwords_api/v201506/customer_extension_setting_service_registry.rb +2 -2
  212. data/lib/adwords_api/v201506/customer_feed_service.rb +13 -1
  213. data/lib/adwords_api/v201506/customer_feed_service_registry.rb +1 -1
  214. data/lib/adwords_api/v201506/customer_service.rb +9 -1
  215. data/lib/adwords_api/v201506/customer_service_registry.rb +1 -1
  216. data/lib/adwords_api/v201506/customer_sync_service.rb +5 -1
  217. data/lib/adwords_api/v201506/customer_sync_service_registry.rb +1 -1
  218. data/lib/adwords_api/v201506/data_service.rb +25 -1
  219. data/lib/adwords_api/v201506/data_service_registry.rb +1 -1
  220. data/lib/adwords_api/v201506/experiment_service.rb +9 -1
  221. data/lib/adwords_api/v201506/experiment_service_registry.rb +1 -1
  222. data/lib/adwords_api/v201506/feed_item_service.rb +13 -1
  223. data/lib/adwords_api/v201506/feed_item_service_registry.rb +1 -1
  224. data/lib/adwords_api/v201506/feed_mapping_service.rb +13 -1
  225. data/lib/adwords_api/v201506/feed_mapping_service_registry.rb +1 -1
  226. data/lib/adwords_api/v201506/feed_service.rb +13 -1
  227. data/lib/adwords_api/v201506/feed_service_registry.rb +1 -1
  228. data/lib/adwords_api/v201506/geo_location_service.rb +5 -1
  229. data/lib/adwords_api/v201506/geo_location_service_registry.rb +1 -1
  230. data/lib/adwords_api/v201506/label_service.rb +13 -1
  231. data/lib/adwords_api/v201506/label_service_registry.rb +1 -1
  232. data/lib/adwords_api/v201506/location_criterion_service.rb +9 -1
  233. data/lib/adwords_api/v201506/location_criterion_service_registry.rb +2 -2
  234. data/lib/adwords_api/v201506/managed_customer_service.rb +25 -1
  235. data/lib/adwords_api/v201506/managed_customer_service_registry.rb +1 -1
  236. data/lib/adwords_api/v201506/media_service.rb +13 -1
  237. data/lib/adwords_api/v201506/media_service_registry.rb +1 -1
  238. data/lib/adwords_api/v201506/mutate_job_service.rb +13 -1
  239. data/lib/adwords_api/v201506/mutate_job_service_registry.rb +1 -1
  240. data/lib/adwords_api/v201506/offline_conversion_feed_service.rb +5 -1
  241. data/lib/adwords_api/v201506/offline_conversion_feed_service_registry.rb +1 -1
  242. data/lib/adwords_api/v201506/report_definition_service.rb +5 -1
  243. data/lib/adwords_api/v201506/report_definition_service_registry.rb +1 -1
  244. data/lib/adwords_api/v201506/shared_criterion_service.rb +13 -1
  245. data/lib/adwords_api/v201506/shared_criterion_service_registry.rb +1 -1
  246. data/lib/adwords_api/v201506/shared_set_service.rb +13 -1
  247. data/lib/adwords_api/v201506/shared_set_service_registry.rb +1 -1
  248. data/lib/adwords_api/v201506/targeting_idea_service.rb +5 -1
  249. data/lib/adwords_api/v201506/targeting_idea_service_registry.rb +1 -1
  250. data/lib/adwords_api/v201506/traffic_estimator_service.rb +5 -1
  251. data/lib/adwords_api/v201506/traffic_estimator_service_registry.rb +1 -1
  252. data/lib/adwords_api/v201509/account_label_service.rb +46 -0
  253. data/lib/adwords_api/v201509/account_label_service_registry.rb +46 -0
  254. data/lib/adwords_api/v201509/ad_customizer_feed_service.rb +46 -0
  255. data/lib/adwords_api/v201509/ad_customizer_feed_service_registry.rb +46 -0
  256. data/lib/adwords_api/v201509/ad_group_ad_service.rb +70 -0
  257. data/lib/adwords_api/v201509/ad_group_ad_service_registry.rb +46 -0
  258. data/lib/adwords_api/v201509/ad_group_bid_modifier_service.rb +54 -0
  259. data/lib/adwords_api/v201509/ad_group_bid_modifier_service_registry.rb +46 -0
  260. data/lib/adwords_api/v201509/ad_group_criterion_service.rb +62 -0
  261. data/lib/adwords_api/v201509/ad_group_criterion_service_registry.rb +46 -0
  262. data/lib/adwords_api/v201509/ad_group_extension_setting_service.rb +54 -0
  263. data/lib/adwords_api/v201509/ad_group_extension_setting_service_registry.rb +46 -0
  264. data/lib/adwords_api/v201509/ad_group_feed_service.rb +54 -0
  265. data/lib/adwords_api/v201509/ad_group_feed_service_registry.rb +46 -0
  266. data/lib/adwords_api/v201509/ad_group_service.rb +62 -0
  267. data/lib/adwords_api/v201509/ad_group_service_registry.rb +46 -0
  268. data/lib/adwords_api/v201509/ad_param_service.rb +46 -0
  269. data/lib/adwords_api/v201509/ad_param_service_registry.rb +46 -0
  270. data/lib/adwords_api/v201509/adwords_user_list_service.rb +54 -0
  271. data/lib/adwords_api/v201509/adwords_user_list_service_registry.rb +46 -0
  272. data/lib/adwords_api/v201509/batch_job_service.rb +54 -0
  273. data/lib/adwords_api/v201509/batch_job_service_registry.rb +46 -0
  274. data/lib/adwords_api/v201509/bidding_strategy_service.rb +54 -0
  275. data/lib/adwords_api/v201509/bidding_strategy_service_registry.rb +46 -0
  276. data/lib/adwords_api/v201509/budget_order_service.rb +54 -0
  277. data/lib/adwords_api/v201509/budget_order_service_registry.rb +46 -0
  278. data/lib/adwords_api/v201509/budget_service.rb +54 -0
  279. data/lib/adwords_api/v201509/budget_service_registry.rb +46 -0
  280. data/lib/adwords_api/v201509/campaign_criterion_service.rb +54 -0
  281. data/lib/adwords_api/v201509/campaign_criterion_service_registry.rb +46 -0
  282. data/lib/adwords_api/v201509/campaign_extension_setting_service.rb +54 -0
  283. data/lib/adwords_api/v201509/campaign_extension_setting_service_registry.rb +46 -0
  284. data/lib/adwords_api/v201509/campaign_feed_service.rb +54 -0
  285. data/lib/adwords_api/v201509/campaign_feed_service_registry.rb +46 -0
  286. data/lib/adwords_api/v201509/campaign_service.rb +62 -0
  287. data/lib/adwords_api/v201509/campaign_service_registry.rb +46 -0
  288. data/lib/adwords_api/v201509/campaign_shared_set_service.rb +54 -0
  289. data/lib/adwords_api/v201509/campaign_shared_set_service_registry.rb +46 -0
  290. data/lib/adwords_api/v201509/constant_data_service.rb +102 -0
  291. data/lib/adwords_api/v201509/constant_data_service_registry.rb +46 -0
  292. data/lib/adwords_api/v201509/conversion_tracker_service.rb +54 -0
  293. data/lib/adwords_api/v201509/conversion_tracker_service_registry.rb +46 -0
  294. data/lib/adwords_api/v201509/customer_extension_setting_service.rb +54 -0
  295. data/lib/adwords_api/v201509/customer_extension_setting_service_registry.rb +46 -0
  296. data/lib/adwords_api/v201509/customer_feed_service.rb +54 -0
  297. data/lib/adwords_api/v201509/customer_feed_service_registry.rb +46 -0
  298. data/lib/adwords_api/v201509/customer_service.rb +46 -0
  299. data/lib/adwords_api/v201509/customer_service_registry.rb +46 -0
  300. data/lib/adwords_api/v201509/customer_sync_service.rb +38 -0
  301. data/lib/adwords_api/v201509/customer_sync_service_registry.rb +47 -0
  302. data/lib/adwords_api/v201509/data_service.rb +78 -0
  303. data/lib/adwords_api/v201509/data_service_registry.rb +46 -0
  304. data/lib/adwords_api/v201509/experiment_service.rb +46 -0
  305. data/lib/adwords_api/v201509/experiment_service_registry.rb +46 -0
  306. data/lib/adwords_api/v201509/feed_item_service.rb +54 -0
  307. data/lib/adwords_api/v201509/feed_item_service_registry.rb +46 -0
  308. data/lib/adwords_api/v201509/feed_mapping_service.rb +54 -0
  309. data/lib/adwords_api/v201509/feed_mapping_service_registry.rb +46 -0
  310. data/lib/adwords_api/v201509/feed_service.rb +54 -0
  311. data/lib/adwords_api/v201509/feed_service_registry.rb +46 -0
  312. data/lib/adwords_api/v201509/label_service.rb +54 -0
  313. data/lib/adwords_api/v201509/label_service_registry.rb +46 -0
  314. data/lib/adwords_api/v201509/location_criterion_service.rb +46 -0
  315. data/lib/adwords_api/v201509/location_criterion_service_registry.rb +46 -0
  316. data/lib/adwords_api/v201509/managed_customer_service.rb +78 -0
  317. data/lib/adwords_api/v201509/managed_customer_service_registry.rb +46 -0
  318. data/lib/adwords_api/v201509/media_service.rb +54 -0
  319. data/lib/adwords_api/v201509/media_service_registry.rb +46 -0
  320. data/lib/adwords_api/v201509/mutate_job_service.rb +54 -0
  321. data/lib/adwords_api/v201509/mutate_job_service_registry.rb +46 -0
  322. data/lib/adwords_api/v201509/offline_conversion_feed_service.rb +38 -0
  323. data/lib/adwords_api/v201509/offline_conversion_feed_service_registry.rb +46 -0
  324. data/lib/adwords_api/v201509/report_definition_service.rb +38 -0
  325. data/lib/adwords_api/v201509/report_definition_service_registry.rb +46 -0
  326. data/lib/adwords_api/v201509/shared_criterion_service.rb +54 -0
  327. data/lib/adwords_api/v201509/shared_criterion_service_registry.rb +46 -0
  328. data/lib/adwords_api/v201509/shared_set_service.rb +54 -0
  329. data/lib/adwords_api/v201509/shared_set_service_registry.rb +46 -0
  330. data/lib/adwords_api/v201509/targeting_idea_service.rb +38 -0
  331. data/lib/adwords_api/v201509/targeting_idea_service_registry.rb +46 -0
  332. data/lib/adwords_api/v201509/traffic_estimator_service.rb +38 -0
  333. data/lib/adwords_api/v201509/traffic_estimator_service_registry.rb +46 -0
  334. data/lib/adwords_api/version.rb +1 -1
  335. data/lib/adwords_api.rb +16 -0
  336. data/test/adwords_api/test_batch_job_utils.rb +95 -0
  337. data/test/templates/v201502/basic_operations_get_campaigns.def +1 -1
  338. data/test/templates/v201502/misc_use_oauth2_service_account.def +1 -1
  339. data/test/templates/v201506/basic_operations_get_campaigns.def +1 -1
  340. data/test/templates/v201506/misc_use_oauth2_service_account.def +1 -1
  341. data/test/templates/v201509/basic_operations_get_campaigns.def +116 -0
  342. data/test/templates/v201509/misc_use_oauth2_service_account.def +131 -0
  343. metadata +166 -5
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
5
+ #
6
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15
+ # implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # This example illustrates how to retrieve all the campaign targets. To set
20
+ # campaign targets, run add_campaign_targeting_criteria.rb.
21
+
22
+ require 'adwords_api'
23
+
24
+ def get_campaign_targeting_criteria(campaign_id)
25
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
26
+ # when called without parameters.
27
+ adwords = AdwordsApi::Api.new
28
+
29
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
30
+ # the configuration file or provide your own logger:
31
+ # adwords.logger = Logger.new('adwords_xml.log')
32
+
33
+ campaign_criterion_srv =
34
+ adwords.service(:CampaignCriterionService, API_VERSION)
35
+
36
+ # Selector to get all the targeting for this campaign.
37
+ selector = {
38
+ :fields => ['Id', 'CriteriaType', 'KeywordText'],
39
+ :predicates => [
40
+ {:field => 'CampaignId', :operator => 'EQUALS', :values => [campaign_id]}
41
+ ],
42
+ :paging => {
43
+ :start_index => 0,
44
+ :number_results => PAGE_SIZE
45
+ }
46
+ }
47
+
48
+ # Set initial values.
49
+ offset, page = 0, {}
50
+
51
+ begin
52
+ page = campaign_criterion_srv.get(selector)
53
+ if page[:entries]
54
+ page[:entries].each do |typed_criterion|
55
+ negative = typed_criterion[:xsi_type] == 'NegativeCampaignCriterion' ?
56
+ ' (negative)' : ''
57
+ criterion = typed_criterion[:criterion]
58
+ puts ("Campaign criterion%s with ID %d, type '%s' and text '%s'" +
59
+ " was found.") %
60
+ [negative, criterion[:id], criterion[:type], criterion[:text]]
61
+ end
62
+ # Increment values to request the next page.
63
+ offset += PAGE_SIZE
64
+ selector[:paging][:start_index] = offset
65
+ end
66
+ end while page[:total_num_entries] > offset
67
+
68
+ if page.include?(:total_num_entries)
69
+ puts "\tCampaign ID %d has %d criteria." %
70
+ [campaign_id, page[:total_num_entries]]
71
+ end
72
+ end
73
+
74
+ if __FILE__ == $0
75
+ API_VERSION = :v201509
76
+ PAGE_SIZE = 500
77
+
78
+ begin
79
+ # Specify campaign ID to get targeting for.
80
+ campaign_id = 'INSERT_CAMPAIGN_ID_HERE'.to_i
81
+ get_campaign_targeting_criteria(campaign_id)
82
+
83
+ # Authorization error.
84
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
85
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
86
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
87
+ "to retrieve and store OAuth2 tokens."
88
+ puts "See this wiki page for more details:\n\n " +
89
+ 'https://github.com/googleads/google-api-ads-ruby/wiki/OAuth2'
90
+
91
+ # HTTP errors.
92
+ rescue AdsCommon::Errors::HttpError => e
93
+ puts "HTTP Error: %s" % e
94
+
95
+ # API errors.
96
+ rescue AdwordsApi::Errors::ApiException => e
97
+ puts "Message: %s" % e.message
98
+ puts 'Errors:'
99
+ e.errors.each_with_index do |error, index|
100
+ puts "\tError [%d]:" % (index + 1)
101
+ error.each do |field, value|
102
+ puts "\t\t%s: %s" % [field, value]
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
5
+ #
6
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15
+ # implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # This example illustrates how to retrieve all languages and carriers available
20
+ # for targeting.
21
+
22
+ require 'adwords_api'
23
+
24
+ def get_targetable_languages_and_carriers()
25
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
26
+ # when called without parameters.
27
+ adwords = AdwordsApi::Api.new
28
+
29
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
30
+ # the configuration file or provide your own logger:
31
+ # adwords.logger = Logger.new('adwords_xml.log')
32
+
33
+ constant_data_srv = adwords.service(:ConstantDataService, API_VERSION)
34
+
35
+ # Get all languages from ConstantDataService.
36
+ languages = constant_data_srv.get_language_criterion()
37
+
38
+ if languages
39
+ languages.each do |language|
40
+ puts "Language name is '%s', ID is %d and code is '%s'." %
41
+ [language[:name], language[:id], language[:code]]
42
+ end
43
+ else
44
+ puts 'No languages were found.'
45
+ end
46
+
47
+ # Get all carriers from ConstantDataService.
48
+ carriers = constant_data_srv.get_carrier_criterion()
49
+
50
+ if carriers
51
+ carriers.each do |carrier|
52
+ puts "Carrier name is '%s', ID is %d and country code is '%s'." %
53
+ [carrier[:name], carrier[:id], carrier[:country_code]]
54
+ end
55
+ else
56
+ puts 'No carriers were retrieved.'
57
+ end
58
+ end
59
+
60
+ if __FILE__ == $0
61
+ API_VERSION = :v201509
62
+
63
+ begin
64
+ get_targetable_languages_and_carriers()
65
+
66
+ # Authorization error.
67
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
68
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
69
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
70
+ "to retrieve and store OAuth2 tokens."
71
+ puts "See this wiki page for more details:\n\n " +
72
+ 'https://github.com/googleads/google-api-ads-ruby/wiki/OAuth2'
73
+
74
+ # HTTP errors.
75
+ rescue AdsCommon::Errors::HttpError => e
76
+ puts "HTTP Error: %s" % e
77
+
78
+ # API errors.
79
+ rescue AdwordsApi::Errors::ApiException => e
80
+ puts "Message: %s" % e.message
81
+ puts 'Errors:'
82
+ e.errors.each_with_index do |error, index|
83
+ puts "\tError [%d]:" % (index + 1)
84
+ error.each do |field, value|
85
+ puts "\t\t%s: %s" % [field, value]
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
5
+ #
6
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15
+ # implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # This example gets location criteria by name.
20
+
21
+ require 'adwords_api'
22
+
23
+ def lookup_location()
24
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
25
+ # when called without parameters.
26
+ adwords = AdwordsApi::Api.new
27
+
28
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
29
+ # the configuration file or provide your own logger:
30
+ # adwords.logger = Logger.new('adwords_xml.log')
31
+
32
+ location_criterion_srv =
33
+ adwords.service(:LocationCriterionService, API_VERSION)
34
+
35
+ # List of locations to look up.
36
+ location_names = ['Paris', 'Quebec', 'Spain', 'Deutschland']
37
+ # Locale to retrieve names in.
38
+ locale = 'en'
39
+
40
+ # Get the criteria by names.
41
+ selector = {
42
+ :fields => ['Id', 'LocationName', 'CanonicalName', 'DisplayType',
43
+ 'ParentLocations', 'Reach', 'TargetingStatus'],
44
+ :predicates => [
45
+ # Location names must match exactly, only EQUALS and IN are supported.
46
+ {:field => 'LocationName',
47
+ :operator => 'IN',
48
+ :values => location_names},
49
+ # Set the locale of the returned location names.
50
+ {:field => 'Locale', :operator => 'EQUALS', :values => [locale]}
51
+ ]
52
+ }
53
+ criteria = location_criterion_srv.get(selector)
54
+
55
+ if criteria
56
+ criteria.each do |criterion|
57
+ # Extract all parent location names as one comma-separated string.
58
+ parent_location = if criterion[:location][:parent_locations] and
59
+ !criterion[:location][:parent_locations].empty?
60
+ locations_array = criterion[:location][:parent_locations].map do |loc|
61
+ loc[:location_name]
62
+ end
63
+ locations_array.join(', ')
64
+ else
65
+ 'N/A'
66
+ end
67
+ puts ("The search term '%s' returned the location '%s' of type '%s' " +
68
+ "with ID %d, parent locations '%s' and reach %d (%s)") %
69
+ [criterion[:search_term], criterion[:location][:location_name],
70
+ criterion[:location][:criterion_type], criterion[:location][:id],
71
+ parent_location, criterion[:reach],
72
+ criterion[:location][:targeting_status]]
73
+ end
74
+ else
75
+ puts 'No criteria were returned.'
76
+ end
77
+ end
78
+
79
+ if __FILE__ == $0
80
+ API_VERSION = :v201509
81
+
82
+ begin
83
+ lookup_location()
84
+
85
+ # Authorization error.
86
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
87
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
88
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
89
+ "to retrieve and store OAuth2 tokens."
90
+ puts "See this wiki page for more details:\n\n " +
91
+ 'https://github.com/googleads/google-api-ads-ruby/wiki/OAuth2'
92
+
93
+ # HTTP errors.
94
+ rescue AdsCommon::Errors::HttpError => e
95
+ puts "HTTP Error: %s" % e
96
+
97
+ # API errors.
98
+ rescue AdwordsApi::Errors::ApiException => e
99
+ puts "Message: %s" % e.message
100
+ puts 'Errors:'
101
+ e.errors.each_with_index do |error, index|
102
+ puts "\tError [%d]:" % (index + 1)
103
+ error.each do |field, value|
104
+ puts "\t\t%s: %s" % [field, value]
105
+ end
106
+ end
107
+ end
108
+ end
@@ -33,9 +33,9 @@ module AdwordsApi
33
33
  end
34
34
 
35
35
  # Set defaults
36
- DEFAULT_VERSION = :v201506
36
+ DEFAULT_VERSION = :v201509
37
37
  DEFAULT_ENVIRONMENT = :PRODUCTION
38
- LATEST_VERSION = :v201506
38
+ LATEST_VERSION = :v201509
39
39
 
40
40
  # Set other constants
41
41
  API_NAME = 'AdwordsApi'
@@ -128,6 +128,49 @@ module AdwordsApi
128
128
  :SharedSetService,
129
129
  :TargetingIdeaService,
130
130
  :TrafficEstimatorService
131
+ ],
132
+ :v201509 => [
133
+ :AccountLabelService,
134
+ :AdCustomizerFeedService,
135
+ :AdGroupAdService,
136
+ :AdGroupBidModifierService,
137
+ :AdGroupCriterionService,
138
+ :AdGroupExtensionSettingService,
139
+ :AdGroupFeedService,
140
+ :AdGroupService,
141
+ :AdParamService,
142
+ :AdwordsUserListService,
143
+ :BatchJobService,
144
+ :BiddingStrategyService,
145
+ :BudgetOrderService,
146
+ :BudgetService,
147
+ :CampaignCriterionService,
148
+ :CampaignExtensionSettingService,
149
+ :CampaignFeedService,
150
+ :CampaignService,
151
+ :CampaignSharedSetService,
152
+ :ConstantDataService,
153
+ :ConversionTrackerService,
154
+ :CustomerExtensionSettingService,
155
+ :CustomerFeedService,
156
+ :CustomerService,
157
+ :CustomerSyncService,
158
+ :DataService,
159
+ :ExperimentService,
160
+ :FeedItemService,
161
+ :FeedMappingService,
162
+ :FeedService,
163
+ :LabelService,
164
+ :LocationCriterionService,
165
+ :ManagedCustomerService,
166
+ :MediaService,
167
+ :MutateJobService,
168
+ :OfflineConversionFeedService,
169
+ :ReportDefinitionService,
170
+ :SharedCriterionService,
171
+ :SharedSetService,
172
+ :TargetingIdeaService,
173
+ :TrafficEstimatorService
131
174
  ]
132
175
  }
133
176
 
@@ -137,7 +180,8 @@ module AdwordsApi
137
180
  :oauth_scope => 'https://www.googleapis.com/auth/adwords',
138
181
  :header_ns => 'https://adwords.google.com/api/adwords/cm/',
139
182
  :v201502 => 'https://adwords.google.com/api/adwords/',
140
- :v201506 => 'https://adwords.google.com/api/adwords/'
183
+ :v201506 => 'https://adwords.google.com/api/adwords/',
184
+ :v201509 => 'https://adwords.google.com/api/adwords/'
141
185
  }
142
186
  }
143
187
 
@@ -227,7 +271,49 @@ module AdwordsApi
227
271
  [:v201506, :BudgetService] => 'cm/',
228
272
  [:v201506, :BiddingStrategyService] => 'cm/',
229
273
  [:v201506, :AdwordsUserListService] => 'rm/',
230
- [:v201506, :LabelService] => 'cm/'
274
+ [:v201506, :LabelService] => 'cm/',
275
+ # v201509
276
+ [:v201509, :AccountLabelService] => 'mcm/',
277
+ [:v201509, :AdCustomizerFeedService] => 'cm/',
278
+ [:v201509, :AdGroupAdService] => 'cm/',
279
+ [:v201509, :AdGroupBidModifierService] => 'cm/',
280
+ [:v201509, :AdGroupCriterionService] => 'cm/',
281
+ [:v201509, :AdGroupExtensionSettingService] => 'cm/',
282
+ [:v201509, :AdGroupFeedService] => 'cm/',
283
+ [:v201509, :AdGroupService] => 'cm/',
284
+ [:v201509, :AdParamService] => 'cm/',
285
+ [:v201509, :BatchJobService] => 'cm/',
286
+ [:v201509, :BudgetOrderService] => 'billing/',
287
+ [:v201509, :CampaignCriterionService] => 'cm/',
288
+ [:v201509, :CampaignExtensionSettingService] => 'cm/',
289
+ [:v201509, :CampaignFeedService] => 'cm/',
290
+ [:v201509, :CampaignService] => 'cm/',
291
+ [:v201509, :CampaignSharedSetService] => 'cm/',
292
+ [:v201509, :ConstantDataService] => 'cm/',
293
+ [:v201509, :ConversionTrackerService] => 'cm/',
294
+ [:v201509, :CustomerExtensionSettingService] => 'cm/',
295
+ [:v201509, :CustomerSyncService] => 'ch/',
296
+ [:v201509, :DataService] => 'cm/',
297
+ [:v201509, :ExperimentService] => 'cm/',
298
+ [:v201509, :FeedItemService] => 'cm/',
299
+ [:v201509, :FeedMappingService] => 'cm/',
300
+ [:v201509, :FeedService] => 'cm/',
301
+ [:v201509, :LocationCriterionService] => 'cm/',
302
+ [:v201509, :MediaService] => 'cm/',
303
+ [:v201509, :MutateJobService] => 'cm/',
304
+ [:v201509, :OfflineConversionFeedService] => 'cm/',
305
+ [:v201509, :ReportDefinitionService] => 'cm/',
306
+ [:v201509, :SharedCriterionService] => 'cm/',
307
+ [:v201509, :SharedSetService] => 'cm/',
308
+ [:v201509, :TargetingIdeaService] => 'o/',
309
+ [:v201509, :TrafficEstimatorService] => 'o/',
310
+ [:v201509, :ManagedCustomerService] => 'mcm/',
311
+ [:v201509, :CustomerService] => 'mcm/',
312
+ [:v201509, :CustomerFeedService] => 'cm/',
313
+ [:v201509, :BudgetService] => 'cm/',
314
+ [:v201509, :BiddingStrategyService] => 'cm/',
315
+ [:v201509, :AdwordsUserListService] => 'rm/',
316
+ [:v201509, :LabelService] => 'cm/'
231
317
  }
232
318
 
233
319
  public
@@ -288,3 +374,4 @@ module AdwordsApi
288
374
  end
289
375
  end
290
376
  end
377
+
@@ -0,0 +1,234 @@
1
+ # Encoding: utf-8
2
+ #
3
+ # Copyright:: Copyright 2015, Google Inc. All Rights Reserved.
4
+ #
5
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
14
+ # implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ # Contains utility methods specific to using the BatchJobService.
19
+
20
+ require 'nokogiri'
21
+ require 'nori'
22
+
23
+ require 'ads_common/http'
24
+ require 'ads_common/savon_service'
25
+ require 'adwords_api/errors'
26
+
27
+ module AdwordsApi
28
+ class BatchJobUtils
29
+ # Default constructor.
30
+ #
31
+ # Args:
32
+ # - api: AdwordsApi object
33
+ # - version: API version to use
34
+ #
35
+ def initialize(api, version)
36
+ @api, @version = api, version
37
+ end
38
+
39
+ # Generates SOAP operations from a ruby hash. The hash uses the same format
40
+ # as a normal request.
41
+ #
42
+ # Args:
43
+ # - hash_operations: An array of ruby hash of operations to convert to SOAP
44
+ # - service_name: The name of the AdwordsApi service as a symbol that would
45
+ # normally make this request
46
+ #
47
+ # Returns:
48
+ # - operations elements of SOAP body as an array of strings
49
+ #
50
+ def generate_soap_operations(hash_operations)
51
+ unless hash_operations.is_a?(Array)
52
+ raise AdwordsApi::Errors::InvalidBatchJobOperationError,
53
+ 'Operations must be in an array.'
54
+ end
55
+ return hash_operations.map do |operation|
56
+ operation_type = operation[:xsi_type]
57
+ if operation_type.nil?
58
+ raise AdwordsApi::Errors::InvalidBatchJobOperationError,
59
+ ':xsi_type for operations must be defined ' +
60
+ 'explicitly for batch jobs.'
61
+ end
62
+ service_name = SERVICES_BY_OPERATION_TYPE[operation_type]
63
+ if service_name.nil?
64
+ raise AdwordsApi::Errors::InvalidBatchJobOperationError,
65
+ 'Unknown operation type: %s' % operation_type
66
+ end
67
+ method_name = METHODS_BY_OPERATION_TYPE[operation_type]
68
+ service = @api.service(service_name, @version)
69
+ full_soap_xml = service.send(method_name, [operation])
70
+ operation_xml = extract_soap_operations(full_soap_xml)
71
+ operation_xml
72
+ end
73
+ end
74
+
75
+ # Posts the provided SOAP operations to the provided URL.
76
+ #
77
+ # Args:
78
+ # - soap_operations: An array including SOAP operations provided by
79
+ # generate_soap_operations
80
+ # - batch_job_url: The URL provided by BatchJobService to post the provided
81
+ # operations to
82
+ #
83
+ def post_soap_operations(soap_operations, batch_job_url)
84
+ headers = DEFAULT_HEADERS
85
+ request_body = UPLOAD_XML_SKELETON % [@version, soap_operations.join]
86
+ log_request(batch_job_url, headers, request_body)
87
+ response = AdsCommon::Http.post_response(
88
+ batch_job_url, request_body, @api.config, headers)
89
+ end
90
+
91
+ # A convenience method that will generate SOAP operations and immediately
92
+ # execute them. This is useful if your operations all would be
93
+ # processed by a single service.
94
+ #
95
+ # Args:
96
+ # - hash_operations: An array of ruby has operations to execute by
97
+ # posting them to the provided URL
98
+ # - service_name: The name of the AdwordsApi service as a symbol that would
99
+ # normally make this request
100
+ # - batch_job_url: The URL provided by BatchjobService to post the provided
101
+ # operations to
102
+ #
103
+ def execute_hash_operations(hash_operations, batch_job_url)
104
+ soap_operations = generate_soap_operations(hash_operations)
105
+ post_soap_operations(soap_operations, batch_job_url)
106
+ end
107
+
108
+ # Downloads the results of a batch job from the specified URL.
109
+ #
110
+ # Args:
111
+ # - batch_job_url: The URL provided by BatchJobService to fetch the results
112
+ # from
113
+ #
114
+ # Returns:
115
+ # - the results of the batch job, as a ruby hash, or nil if none yet exist
116
+ #
117
+ def get_job_results(batch_job_url)
118
+ xml_response = AdsCommon::Http.get_response(batch_job_url, @api.config)
119
+ begin
120
+ return sanitize_result(
121
+ get_nori().parse(xml_response.body)[:mutate_response][:rval])
122
+ rescue
123
+ return nil
124
+ end
125
+ end
126
+
127
+ private
128
+
129
+ UPLOAD_XML_SKELETON = '<?xml version="1.0" encoding="UTF-8"?><ns1:mutate ' +
130
+ 'xmlns:ns1="https://adwords.google.com/api/adwords/cm/%s">%s' +
131
+ '</ns1:mutate>'
132
+ DEFAULT_HEADERS = {"Content-Type" => "application/xml"}
133
+
134
+ SERVICES_BY_OPERATION_TYPE = {
135
+ 'AdGroupAdOperation' => :AdGroupAdService,
136
+ 'AdGroupAdLabelOperation' => :AdGroupAdService,
137
+ 'AdGroupBidModifierOperation' => :AdGroupBidModifierService,
138
+ 'AdGroupCriterionOperation' => :AdGroupCriterionService,
139
+ 'AdGroupCriterionLabelOperation' => :AdGroupCriterionService,
140
+ 'AdGroupOperation' => :AdGroupService,
141
+ 'AdGroupLabelOperation' => :AdGroupService,
142
+ 'BudgetOperation' => :BudgetService,
143
+ 'CampaignCriterionOperation' => :CampaignCriterionService,
144
+ 'CampaignOperation' => :CampaignService,
145
+ 'CampaignLabelOperation' => :CampaignService,
146
+ 'FeedItemOperation' => :FeedItemService
147
+ }
148
+
149
+ METHODS_BY_OPERATION_TYPE = {
150
+ 'AdGroupAdOperation' => 'mutate_to_xml',
151
+ 'AdGroupAdLabelOperation' => 'mutate_label_to_xml',
152
+ 'AdGroupBidModifierOperation' => 'mutate_to_xml',
153
+ 'AdGroupCriterionOperation' => 'mutate_to_xml',
154
+ 'AdGroupCriterionLabelOperation' => 'mutate_label_to_xml',
155
+ 'AdGroupOperation' => 'mutate_to_xml',
156
+ 'AdGroupLabelOperation' => 'mutate_label_to_xml',
157
+ 'BudgetOperation' => 'mutate_to_xml',
158
+ 'CampaignCriterionOperation' => 'mutate_to_xml',
159
+ 'CampaignOperation' => 'mutate_to_xml',
160
+ 'CampaignLabelOperation' => 'mutate_label_to_xml',
161
+ 'FeedItemOperation' => 'mutate_to_xml'
162
+ }
163
+
164
+ # Given a full SOAP xml string, extract just the operations element
165
+ # from the SOAP body as a string.
166
+ def extract_soap_operations(full_soap_xml)
167
+ doc = Nokogiri::XML(full_soap_xml)
168
+ operations = doc.css('wsdl|operations')
169
+ operations.attr('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance')
170
+ operations.each do |element|
171
+ check_xsi_type(element)
172
+ end
173
+ return operations.to_s
174
+ end
175
+
176
+ def check_xsi_type(xml_node)
177
+ xsi_type = xml_node['xsi:type']
178
+ unless xsi_type.nil? or xsi_type.start_with?('ns1:')
179
+ xml_node['xsi:type'] = 'ns1:' + xsi_type
180
+ end
181
+ children = xml_node.children
182
+ unless children.empty?
183
+ children.each do |element|
184
+ check_xsi_type(element)
185
+ end
186
+ end
187
+ end
188
+
189
+ # Logs the request on debug level.
190
+ def log_request(url, headers, body)
191
+ logger = @api.logger
192
+ logger.debug("Report request to: '%s'" % url)
193
+ logger.debug('HTTP headers: [%s]' %
194
+ (headers.map { |k, v| [k, v].join(': ') }.join(', ')))
195
+ logger.debug(body)
196
+ end
197
+
198
+ # Removes extraneous XML information from return hash.
199
+ def sanitize_result(results)
200
+ if results.is_a?(Array)
201
+ ret = []
202
+ results.each do |result|
203
+ ret << sanitize_result(result)
204
+ end
205
+ return ret
206
+ end
207
+
208
+ if results.is_a?(Hash)
209
+ ret = {}
210
+ results.each do |k, v|
211
+ v = sanitize_result(v) if v.is_a?(Hash)
212
+ ret[k] = v unless k.to_s.start_with?('@')
213
+ end
214
+ return ret
215
+ end
216
+
217
+ return results
218
+ end
219
+
220
+ def get_nori()
221
+ return @nori if @nori
222
+
223
+ nori_options = {
224
+ :strip_namespaces => true,
225
+ :convert_tags_to => lambda { |tag| tag.snakecase.to_sym },
226
+ :advanced_typecasting => false
227
+ }
228
+
229
+ @nori = Nori.new(nori_options)
230
+
231
+ return @nori
232
+ end
233
+ end
234
+ end
@@ -92,5 +92,8 @@ module AdwordsApi
92
92
  @field_path = error_field_path
93
93
  end
94
94
  end
95
+
96
+ class InvalidBatchJobOperationError < AdsCommon::Errors::ApiException
97
+ end
95
98
  end
96
99
  end