google-adwords-api 0.13.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +4 -0
- data/README.md +5 -5
- data/adwords_api.yml +1 -9
- data/examples/v201402/advanced_operations/add_places_location_extensions.rb +0 -0
- data/examples/v201406/advanced_operations/add_ad_customizer.rb +277 -0
- data/examples/v201406/advanced_operations/add_places_location_extensions.rb +0 -0
- data/examples/v201406/advanced_operations/add_text_ad_with_upgraded_urls.rb +0 -0
- data/examples/v201406/campaign_management/add_campaign_labels.rb +0 -0
- data/examples/v201406/campaign_management/get_campaigns_by_label.rb +0 -0
- data/examples/v201406/misc/create_ad_words_session_without_properties_file.rb +0 -0
- data/examples/v201406/shopping_campaigns/add_product_partition_tree.rb +0 -0
- data/examples/v201406/shopping_campaigns/add_product_scope.rb +0 -0
- data/examples/v201406/shopping_campaigns/add_shopping_campaign.rb +0 -0
- data/examples/v201406/shopping_campaigns/get_product_category_taxonomy.rb +0 -0
- data/examples/v201406/shopping_campaigns/set_product_sales_channel.rb +0 -0
- data/lib/adwords_api.rb +0 -7
- data/lib/adwords_api/api_config.rb +5 -7
- data/lib/adwords_api/credential_handler.rb +0 -5
- data/lib/adwords_api/v201402/ad_group_ad_service.rb +1 -1
- data/lib/adwords_api/v201402/ad_group_ad_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/ad_group_bid_modifier_service.rb +1 -1
- data/lib/adwords_api/v201402/ad_group_bid_modifier_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/ad_group_criterion_service.rb +1 -1
- data/lib/adwords_api/v201402/ad_group_criterion_service_registry.rb +2 -2
- data/lib/adwords_api/v201402/ad_group_feed_service.rb +1 -1
- data/lib/adwords_api/v201402/ad_group_feed_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/ad_group_service.rb +1 -1
- data/lib/adwords_api/v201402/ad_group_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/ad_param_service.rb +1 -1
- data/lib/adwords_api/v201402/ad_param_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/adwords_user_list_service.rb +1 -1
- data/lib/adwords_api/v201402/adwords_user_list_service_registry.rb +2 -2
- data/lib/adwords_api/v201402/alert_service.rb +1 -1
- data/lib/adwords_api/v201402/alert_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/bidding_strategy_service.rb +1 -1
- data/lib/adwords_api/v201402/bidding_strategy_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/budget_order_service.rb +1 -1
- data/lib/adwords_api/v201402/budget_order_service_registry.rb +2 -2
- data/lib/adwords_api/v201402/budget_service.rb +1 -1
- data/lib/adwords_api/v201402/budget_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/campaign_ad_extension_service.rb +1 -1
- data/lib/adwords_api/v201402/campaign_ad_extension_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/campaign_criterion_service.rb +1 -1
- data/lib/adwords_api/v201402/campaign_criterion_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/campaign_feed_service.rb +1 -1
- data/lib/adwords_api/v201402/campaign_feed_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/campaign_service.rb +1 -1
- data/lib/adwords_api/v201402/campaign_service_registry.rb +2 -2
- data/lib/adwords_api/v201402/campaign_shared_set_service.rb +1 -1
- data/lib/adwords_api/v201402/campaign_shared_set_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/constant_data_service.rb +1 -1
- data/lib/adwords_api/v201402/constant_data_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/conversion_tracker_service.rb +1 -1
- data/lib/adwords_api/v201402/conversion_tracker_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/customer_feed_service.rb +1 -1
- data/lib/adwords_api/v201402/customer_feed_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/customer_service.rb +1 -1
- data/lib/adwords_api/v201402/customer_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/customer_sync_service.rb +1 -1
- data/lib/adwords_api/v201402/customer_sync_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/data_service.rb +1 -1
- data/lib/adwords_api/v201402/data_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/experiment_service.rb +1 -1
- data/lib/adwords_api/v201402/experiment_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/feed_item_service.rb +1 -1
- data/lib/adwords_api/v201402/feed_item_service_registry.rb +2 -2
- data/lib/adwords_api/v201402/feed_mapping_service.rb +1 -1
- data/lib/adwords_api/v201402/feed_mapping_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/feed_service.rb +1 -1
- data/lib/adwords_api/v201402/feed_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/geo_location_service.rb +1 -1
- data/lib/adwords_api/v201402/geo_location_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/location_criterion_service.rb +1 -1
- data/lib/adwords_api/v201402/location_criterion_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/managed_customer_service.rb +1 -1
- data/lib/adwords_api/v201402/managed_customer_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/media_service.rb +1 -1
- data/lib/adwords_api/v201402/media_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/mutate_job_service.rb +1 -1
- data/lib/adwords_api/v201402/mutate_job_service_registry.rb +2 -2
- data/lib/adwords_api/v201402/offline_conversion_feed_service.rb +1 -1
- data/lib/adwords_api/v201402/offline_conversion_feed_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/report_definition_service.rb +1 -1
- data/lib/adwords_api/v201402/report_definition_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/shared_criterion_service.rb +1 -1
- data/lib/adwords_api/v201402/shared_criterion_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/shared_set_service.rb +1 -1
- data/lib/adwords_api/v201402/shared_set_service_registry.rb +1 -1
- data/lib/adwords_api/v201402/targeting_idea_service.rb +1 -1
- data/lib/adwords_api/v201402/targeting_idea_service_registry.rb +2 -2
- data/lib/adwords_api/v201402/traffic_estimator_service.rb +1 -1
- data/lib/adwords_api/v201402/traffic_estimator_service_registry.rb +2 -2
- data/lib/adwords_api/v201406/ad_group_ad_service.rb +1 -1
- data/lib/adwords_api/v201406/ad_group_ad_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/ad_group_bid_modifier_service.rb +1 -1
- data/lib/adwords_api/v201406/ad_group_bid_modifier_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/ad_group_criterion_service.rb +1 -1
- data/lib/adwords_api/v201406/ad_group_criterion_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/ad_group_feed_service.rb +1 -1
- data/lib/adwords_api/v201406/ad_group_feed_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/ad_group_service.rb +1 -1
- data/lib/adwords_api/v201406/ad_group_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/ad_param_service.rb +1 -1
- data/lib/adwords_api/v201406/ad_param_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/adwords_user_list_service.rb +1 -1
- data/lib/adwords_api/v201406/adwords_user_list_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/alert_service.rb +1 -1
- data/lib/adwords_api/v201406/alert_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/bidding_strategy_service.rb +1 -1
- data/lib/adwords_api/v201406/bidding_strategy_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/budget_order_service.rb +1 -1
- data/lib/adwords_api/v201406/budget_order_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/budget_service.rb +1 -1
- data/lib/adwords_api/v201406/budget_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/campaign_ad_extension_service.rb +1 -1
- data/lib/adwords_api/v201406/campaign_ad_extension_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/campaign_criterion_service.rb +1 -1
- data/lib/adwords_api/v201406/campaign_criterion_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/campaign_feed_service.rb +1 -1
- data/lib/adwords_api/v201406/campaign_feed_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/campaign_service.rb +1 -1
- data/lib/adwords_api/v201406/campaign_service_registry.rb +2 -2
- data/lib/adwords_api/v201406/campaign_shared_set_service.rb +1 -1
- data/lib/adwords_api/v201406/campaign_shared_set_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/constant_data_service.rb +1 -1
- data/lib/adwords_api/v201406/constant_data_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/conversion_tracker_service.rb +1 -1
- data/lib/adwords_api/v201406/conversion_tracker_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/customer_feed_service.rb +1 -1
- data/lib/adwords_api/v201406/customer_feed_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/customer_service.rb +1 -1
- data/lib/adwords_api/v201406/customer_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/customer_sync_service.rb +1 -1
- data/lib/adwords_api/v201406/customer_sync_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/data_service.rb +1 -1
- data/lib/adwords_api/v201406/data_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/experiment_service.rb +1 -1
- data/lib/adwords_api/v201406/experiment_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/feed_item_service.rb +1 -1
- data/lib/adwords_api/v201406/feed_item_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/feed_mapping_service.rb +1 -1
- data/lib/adwords_api/v201406/feed_mapping_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/feed_service.rb +1 -1
- data/lib/adwords_api/v201406/feed_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/geo_location_service.rb +1 -1
- data/lib/adwords_api/v201406/geo_location_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/label_service.rb +1 -1
- data/lib/adwords_api/v201406/label_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/location_criterion_service.rb +1 -1
- data/lib/adwords_api/v201406/location_criterion_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/managed_customer_service.rb +1 -1
- data/lib/adwords_api/v201406/managed_customer_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/media_service.rb +1 -1
- data/lib/adwords_api/v201406/media_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/mutate_job_service.rb +1 -1
- data/lib/adwords_api/v201406/mutate_job_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/offline_conversion_feed_service.rb +1 -1
- data/lib/adwords_api/v201406/offline_conversion_feed_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/report_definition_service.rb +1 -1
- data/lib/adwords_api/v201406/report_definition_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/shared_criterion_service.rb +1 -1
- data/lib/adwords_api/v201406/shared_criterion_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/shared_set_service.rb +1 -1
- data/lib/adwords_api/v201406/shared_set_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/targeting_idea_service.rb +1 -1
- data/lib/adwords_api/v201406/targeting_idea_service_registry.rb +1 -1
- data/lib/adwords_api/v201406/traffic_estimator_service.rb +1 -1
- data/lib/adwords_api/v201406/traffic_estimator_service_registry.rb +1 -1
- data/lib/adwords_api/version.rb +1 -1
- metadata +167 -171
- checksums.yaml +0 -15
- data/examples/v201402/basic_operations/delete_ad_group.rb~ +0 -104
- data/examples/v201402/basic_operations/delete_campaign.rb~ +0 -91
- data/examples/v201406/basic_operations/remove_ad_group.rb~ +0 -90
- data/examples/v201406/basic_operations/remove_campaign.rb~ +0 -111
- data/lib/adwords_api/client_login_header_handler.rb +0 -37
- data/lib/adwords_api/report_utils.rb~ +0 -283
- data/lib/adwords_api/version.rb~ +0 -26
- data/test/adwords_api/test_adwords_api.rb~ +0 -114
- data/test/adwords_api/test_report_utils.rb~ +0 -216
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
# Encoding: utf-8
|
|
2
|
-
#
|
|
3
|
-
# Author:: api.dklimkin@gmail.com (Danial Klimkin)
|
|
4
|
-
#
|
|
5
|
-
# Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
|
|
6
|
-
#
|
|
7
|
-
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
# you may not use this file except in compliance with the License.
|
|
9
|
-
# You may obtain a copy of the License at
|
|
10
|
-
#
|
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
#
|
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
16
|
-
# implied.
|
|
17
|
-
# See the License for the specific language governing permissions and
|
|
18
|
-
# limitations under the License.
|
|
19
|
-
#
|
|
20
|
-
# Contains utility methods specific to reporting.
|
|
21
|
-
|
|
22
|
-
require 'cgi'
|
|
23
|
-
require 'gyoku'
|
|
24
|
-
require 'nori'
|
|
25
|
-
|
|
26
|
-
require 'ads_common/http'
|
|
27
|
-
require 'adwords_api/errors'
|
|
28
|
-
require 'adwords_api/report_header_handler'
|
|
29
|
-
|
|
30
|
-
module AdwordsApi
|
|
31
|
-
class ReportUtils
|
|
32
|
-
# Default constructor.
|
|
33
|
-
#
|
|
34
|
-
# Args:
|
|
35
|
-
# - api: AdwordsApi object
|
|
36
|
-
# - version: API version to use
|
|
37
|
-
#
|
|
38
|
-
def initialize(api, version)
|
|
39
|
-
@api, @version = api, version
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# Downloads and returns a report.
|
|
43
|
-
#
|
|
44
|
-
# Args:
|
|
45
|
-
# - report_definition: definition of the report in XML text or hash
|
|
46
|
-
# - cid: optional customer ID to run against
|
|
47
|
-
#
|
|
48
|
-
# Returns:
|
|
49
|
-
# - report body
|
|
50
|
-
#
|
|
51
|
-
# Raises:
|
|
52
|
-
# - AdwordsApi::Errors::InvalidReportDefinitionError if the report
|
|
53
|
-
# definition is invalid
|
|
54
|
-
# - AdwordsApi::Errors::ReportError if server-side error occurred
|
|
55
|
-
#
|
|
56
|
-
def download_report(report_definition, cid = nil)
|
|
57
|
-
return get_report_response(report_definition, cid).body
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# Downloads a report and saves it to a file.
|
|
61
|
-
#
|
|
62
|
-
# Args:
|
|
63
|
-
# - report_definition: definition of the report in XML text or hash
|
|
64
|
-
# - path: path to save report to
|
|
65
|
-
# - cid: optional customer ID to run against
|
|
66
|
-
#
|
|
67
|
-
# Returns:
|
|
68
|
-
# - nil
|
|
69
|
-
#
|
|
70
|
-
# Raises:
|
|
71
|
-
# - AdwordsApi::Errors::InvalidReportDefinitionError if the report
|
|
72
|
-
# definition is invalid
|
|
73
|
-
# - AdwordsApi::Errors::ReportError if server-side error occurred
|
|
74
|
-
#
|
|
75
|
-
def download_report_as_file(report_definition, path, cid = nil)
|
|
76
|
-
report_body = download_report(report_definition, cid)
|
|
77
|
-
save_to_file(report_body, path)
|
|
78
|
-
return nil
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# Downloads and returns a report with AWQL.
|
|
82
|
-
#
|
|
83
|
-
# Args:
|
|
84
|
-
# - report_query: query for the report as string
|
|
85
|
-
# - format: format for the report as string
|
|
86
|
-
# - cid: optional customer ID to run report against
|
|
87
|
-
#
|
|
88
|
-
# Returns:
|
|
89
|
-
# - report body
|
|
90
|
-
#
|
|
91
|
-
# Raises:
|
|
92
|
-
# - AdwordsApi::Errors::ReportError if a server-side error has occurred
|
|
93
|
-
#
|
|
94
|
-
def download_report_with_awql(report_query, format, cid = nil)
|
|
95
|
-
return get_report_response_with_awql(report_query, format, cid).body
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# Downloads a report with AWQL and saves it to a file.
|
|
99
|
-
#
|
|
100
|
-
# Args:
|
|
101
|
-
# - report_query: query for the report as string
|
|
102
|
-
# - format: format for the report as string
|
|
103
|
-
# - path: path to save report to
|
|
104
|
-
# - cid: optional customer ID to run report against
|
|
105
|
-
#
|
|
106
|
-
# Returns:
|
|
107
|
-
# - nil
|
|
108
|
-
#
|
|
109
|
-
# Raises:
|
|
110
|
-
# - AdwordsApi::Errors::ReportError if server-side error occurred
|
|
111
|
-
#
|
|
112
|
-
def download_report_as_file_with_awql(report_query, format, path, cid = nil)
|
|
113
|
-
report_body = download_report_with_awql(report_query, format, cid)
|
|
114
|
-
save_to_file(report_body, path)
|
|
115
|
-
return nil
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
private
|
|
119
|
-
|
|
120
|
-
# Minimal set of required fields for report definition.
|
|
121
|
-
REQUIRED_FIELDS = [:selector, :report_name, :report_type, :date_range_type]
|
|
122
|
-
|
|
123
|
-
# Definition fields have to be in particular order in the XML. Here is its
|
|
124
|
-
# specification.
|
|
125
|
-
REPORT_DEFINITION_ORDER = {
|
|
126
|
-
:root => [:selector, :report_name, :report_type, :date_range_type,
|
|
127
|
-
:download_format, :include_zero_impressions],
|
|
128
|
-
:selector => [:fields, :predicates, :date_range, :ordering, :paging],
|
|
129
|
-
:predicates => [:field, :operator, :values],
|
|
130
|
-
:ordering => [:field, :sort_order],
|
|
131
|
-
:paging => [:start_index, :number_results],
|
|
132
|
-
:date_range => [:min, :max]
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
# Send POST request for a report and returns Response object.
|
|
136
|
-
def get_report_response(report_definition, cid)
|
|
137
|
-
definition_text = get_report_definition_text(report_definition)
|
|
138
|
-
data = '__rdxml=%s' % CGI.escape(definition_text)
|
|
139
|
-
return make_adhoc_request(data, cid)
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
# Send POST request for a report with AWQL and returns Response object.
|
|
143
|
-
def get_report_response_with_awql(report_query, format, cid)
|
|
144
|
-
data = '__rdquery=%s&__fmt=%s' %
|
|
145
|
-
[CGI.escape(report_query), CGI.escape(format)]
|
|
146
|
-
return make_adhoc_request(data, cid)
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
# Makes request and AdHoc service and returns response.
|
|
150
|
-
def make_adhoc_request(data, cid)
|
|
151
|
-
url = @api.api_config.adhoc_report_download_url(
|
|
152
|
-
@api.config.read('service.environment'), @version)
|
|
153
|
-
headers = get_report_request_headers(url, cid)
|
|
154
|
-
log_request(url, headers, data)
|
|
155
|
-
response = AdsCommon::Http.post_response(url, data, @api.config, headers)
|
|
156
|
-
check_for_errors(response)
|
|
157
|
-
return response
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
# Converts passed object to XML text. Currently support String (no changes)
|
|
161
|
-
# and Hash (renders XML).
|
|
162
|
-
def get_report_definition_text(report_definition)
|
|
163
|
-
return case report_definition
|
|
164
|
-
when String then report_definition
|
|
165
|
-
when Hash then report_definition_to_xml(report_definition)
|
|
166
|
-
else
|
|
167
|
-
raise AdwordsApi::Errors::InvalidReportDefinitionError,
|
|
168
|
-
'Unknown object for report definition: %s' %
|
|
169
|
-
report_definition.class
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
# Prepares headers for report request.
|
|
174
|
-
def get_report_request_headers(url, cid)
|
|
175
|
-
@header_handler ||= AdwordsApi::ReportHeaderHandler.new(
|
|
176
|
-
@api.credential_handler, @api.get_auth_handler(), @api.config)
|
|
177
|
-
return @header_handler.headers(url, cid)
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
# Saves raw data to a file.
|
|
181
|
-
def save_to_file(data, path)
|
|
182
|
-
open(path, 'wb') { |file| file.write(data) } if path
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
# Logs the request on debug level.
|
|
186
|
-
def log_request(url, headers, body)
|
|
187
|
-
logger = @api.logger
|
|
188
|
-
logger.debug("Report request to: '%s'" % url)
|
|
189
|
-
logger.debug('HTTP headers: [%s]' %
|
|
190
|
-
(headers.map { |k, v| [k, v].join(': ') }.join(', ')))
|
|
191
|
-
logger.debug(body)
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
# Checks downloaded data for error signature. Raises ReportError if it
|
|
195
|
-
# detects an error.
|
|
196
|
-
def check_for_errors(response)
|
|
197
|
-
# Check for error code.
|
|
198
|
-
if response.code != 200
|
|
199
|
-
# Check for error in body.
|
|
200
|
-
report_body = response.body
|
|
201
|
-
check_for_xml_error(report_body, response.code)
|
|
202
|
-
# No XML error found nor raised, falling back to a default message.
|
|
203
|
-
raise AdwordsApi::Errors::ReportError.new(response.code,
|
|
204
|
-
'HTTP code: %d, body: %s' % [response.code, response.body])
|
|
205
|
-
end
|
|
206
|
-
return nil
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
# Checks for an XML error in the response body and raises an exception if
|
|
210
|
-
# it was found.
|
|
211
|
-
def check_for_xml_error(report_body, response_code)
|
|
212
|
-
error_response = Nori.parse(report_body)
|
|
213
|
-
if error_response.include?(:report_download_error) and
|
|
214
|
-
error_response[:report_download_error].include?(:api_error)
|
|
215
|
-
api_error = error_response[:report_download_error][:api_error]
|
|
216
|
-
raise AdwordsApi::Errors::ReportXmlError.new(response_code,
|
|
217
|
-
api_error[:type], api_error[:trigger], api_error[:field_path])
|
|
218
|
-
end
|
|
219
|
-
end
|
|
220
|
-
|
|
221
|
-
# Renders a report definition hash into XML text.
|
|
222
|
-
def report_definition_to_xml(report_definition)
|
|
223
|
-
check_report_definition_hash(report_definition)
|
|
224
|
-
add_report_definition_hash_order(report_definition)
|
|
225
|
-
return Gyoku.xml({:report_definition => report_definition})
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
# Checks if the report definition looks correct.
|
|
229
|
-
def check_report_definition_hash(report_definition)
|
|
230
|
-
# Minimal set of fields required.
|
|
231
|
-
REQUIRED_FIELDS.each do |field|
|
|
232
|
-
unless report_definition.include?(field)
|
|
233
|
-
raise AdwordsApi::Errors::InvalidReportDefinitionError,
|
|
234
|
-
"Required field '%s' is missing in the definition" % field
|
|
235
|
-
end
|
|
236
|
-
end
|
|
237
|
-
# Fields list is also required.
|
|
238
|
-
unless report_definition[:selector].include?(:fields)
|
|
239
|
-
raise AdwordsApi::Errors::InvalidReportDefinitionError,
|
|
240
|
-
'Fields list is required'
|
|
241
|
-
end
|
|
242
|
-
# 'Fields' must be an Array.
|
|
243
|
-
unless report_definition[:selector][:fields].kind_of?(Array)
|
|
244
|
-
raise AdwordsApi::Errors::InvalidReportDefinitionError,
|
|
245
|
-
'Fields list must be an array'
|
|
246
|
-
end
|
|
247
|
-
# We should request at least one field.
|
|
248
|
-
if report_definition[:selector][:fields].empty?
|
|
249
|
-
raise AdwordsApi::Errors::InvalidReportDefinitionError,
|
|
250
|
-
'At least one field needs to be requested'
|
|
251
|
-
end
|
|
252
|
-
# returnMoneyInMicros option is no longer supported as of v201406
|
|
253
|
-
if report_definition.include?(:return_money_in_micros) &&
|
|
254
|
-
@version != :v201402
|
|
255
|
-
raise AdwordsApi::Errors::InvalidReportDefinitionError,
|
|
256
|
-
'returnMoneyInMicros was sunset as of v201406. ' +
|
|
257
|
-
'See the migration guide for info:' +
|
|
258
|
-
'https://developers.google.com/adwords/api/docs/' +
|
|
259
|
-
'guides/migration/v201406'
|
|
260
|
-
end
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
# Adds fields order hint to generator based on specification.
|
|
264
|
-
def add_report_definition_hash_order(node, name = :root)
|
|
265
|
-
def_order = REPORT_DEFINITION_ORDER[name]
|
|
266
|
-
var_order = def_order.reject { |field| !node.include?(field) }
|
|
267
|
-
node.keys.each do |key|
|
|
268
|
-
if REPORT_DEFINITION_ORDER.include?(key)
|
|
269
|
-
case node[key]
|
|
270
|
-
when Hash
|
|
271
|
-
add_report_definition_hash_order(node[key], key)
|
|
272
|
-
when Array
|
|
273
|
-
node[key].each do |item|
|
|
274
|
-
add_report_definition_hash_order(item, key)
|
|
275
|
-
end
|
|
276
|
-
end
|
|
277
|
-
end
|
|
278
|
-
end
|
|
279
|
-
node[:order!] = var_order
|
|
280
|
-
return nil
|
|
281
|
-
end
|
|
282
|
-
end
|
|
283
|
-
end
|
data/lib/adwords_api/version.rb~
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# Encoding: utf-8
|
|
2
|
-
#
|
|
3
|
-
# Authors:: api.dklimkin@gmail.com (Danial Klimkin)
|
|
4
|
-
#
|
|
5
|
-
# Copyright:: Copyright 2012, Google Inc. All Rights Reserved.
|
|
6
|
-
#
|
|
7
|
-
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
# you may not use this file except in compliance with the License.
|
|
9
|
-
# You may obtain a copy of the License at
|
|
10
|
-
#
|
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
#
|
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
16
|
-
# implied.
|
|
17
|
-
# See the License for the specific language governing permissions and
|
|
18
|
-
# limitations under the License.
|
|
19
|
-
#
|
|
20
|
-
# Module to keep the current library version.
|
|
21
|
-
|
|
22
|
-
module AdwordsApi
|
|
23
|
-
module ApiConfig
|
|
24
|
-
CLIENT_LIB_VERSION = '0.12.1'
|
|
25
|
-
end
|
|
26
|
-
end
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# Encoding: utf-8
|
|
3
|
-
#
|
|
4
|
-
# Author:: api.dklimkin@gmail.com (Danial Klimkin)
|
|
5
|
-
#
|
|
6
|
-
# Copyright:: Copyright 2012, Google Inc. All Rights Reserved.
|
|
7
|
-
#
|
|
8
|
-
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
-
# you may not use this file except in compliance with the License.
|
|
10
|
-
# You may obtain a copy of the License at
|
|
11
|
-
#
|
|
12
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
-
#
|
|
14
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
17
|
-
# implied.
|
|
18
|
-
# See the License for the specific language governing permissions and
|
|
19
|
-
# limitations under the License.
|
|
20
|
-
#
|
|
21
|
-
# Tests the AdWords API class features.
|
|
22
|
-
|
|
23
|
-
require 'test/unit'
|
|
24
|
-
|
|
25
|
-
require 'ads_common/config'
|
|
26
|
-
require 'ads_common/api_config'
|
|
27
|
-
require 'adwords_api'
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class LoggerStub
|
|
31
|
-
attr_reader :last_warning
|
|
32
|
-
def warn(message)
|
|
33
|
-
@last_warning = message
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
class TestAdwordsApi < Test::Unit::TestCase
|
|
38
|
-
|
|
39
|
-
API_VERSION = :v201406
|
|
40
|
-
|
|
41
|
-
def setup()
|
|
42
|
-
@logger = LoggerStub.new
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def test_initialize()
|
|
46
|
-
assert_nothing_raised do
|
|
47
|
-
adwords_api = AdwordsApi::Api.new({})
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def test_api_config()
|
|
52
|
-
assert_nothing_raised do
|
|
53
|
-
adwords_api = AdwordsApi::Api.new({})
|
|
54
|
-
api_config = adwords_api.api_config()
|
|
55
|
-
assert_not_nil(api_config)
|
|
56
|
-
assert_kind_of(AdsCommon::ApiConfig, api_config)
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def test_use_mcc()
|
|
61
|
-
adwords_api = AdwordsApi::Api.new({})
|
|
62
|
-
adwords_api.use_mcc = false
|
|
63
|
-
assert(!adwords_api.use_mcc)
|
|
64
|
-
adwords_api.use_mcc do
|
|
65
|
-
assert(adwords_api.use_mcc)
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def test_validate_only()
|
|
70
|
-
adwords_api = AdwordsApi::Api.new({})
|
|
71
|
-
adwords_api.validate_only = false
|
|
72
|
-
assert(!adwords_api.validate_only)
|
|
73
|
-
adwords_api.validate_only do
|
|
74
|
-
assert(adwords_api.validate_only)
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def test_partial_failure()
|
|
79
|
-
adwords_api = AdwordsApi::Api.new({})
|
|
80
|
-
adwords_api.partial_failure = false
|
|
81
|
-
assert(!adwords_api.partial_failure)
|
|
82
|
-
adwords_api.partial_failure do
|
|
83
|
-
assert(adwords_api.partial_failure)
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def test_no_sandbox_env()
|
|
88
|
-
adwords_api = AdwordsApi::Api.new({
|
|
89
|
-
:service => {:environment => 'SANDBOX'}
|
|
90
|
-
})
|
|
91
|
-
assert_raise(AdsCommon::Errors::Error) do
|
|
92
|
-
service = adwords_api.service(:ManagedCustomerService, API_VERSION)
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def test_prod_env()
|
|
97
|
-
adwords_api = AdwordsApi::Api.new({
|
|
98
|
-
:library => {:logger => @logger},
|
|
99
|
-
:service => {:environment => 'PRODUCTION'}
|
|
100
|
-
})
|
|
101
|
-
service = adwords_api.service(:ManagedCustomerService, API_VERSION)
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def test_clientlogin_error()
|
|
105
|
-
adwords_api = AdwordsApi::Api.new({
|
|
106
|
-
:library => {:logger => @logger},
|
|
107
|
-
:authentication => {:method => 'ClientLogin'},
|
|
108
|
-
:service => {:environment => 'PRODUCTION'}
|
|
109
|
-
})
|
|
110
|
-
assert_raise do
|
|
111
|
-
service = adwords_api.service(:CampaignService, API_VERSION)
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
end
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# Encoding: utf-8
|
|
3
|
-
#
|
|
4
|
-
# Author:: api.dklimkin@gmail.com (Danial Klimkin)
|
|
5
|
-
#
|
|
6
|
-
# Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
|
|
7
|
-
#
|
|
8
|
-
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
-
# you may not use this file except in compliance with the License.
|
|
10
|
-
# You may obtain a copy of the License at
|
|
11
|
-
#
|
|
12
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
-
#
|
|
14
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
17
|
-
# implied.
|
|
18
|
-
# See the License for the specific language governing permissions and
|
|
19
|
-
# limitations under the License.
|
|
20
|
-
#
|
|
21
|
-
# Tests report utils.
|
|
22
|
-
|
|
23
|
-
require 'test/unit'
|
|
24
|
-
|
|
25
|
-
require 'adwords_api'
|
|
26
|
-
|
|
27
|
-
# Overriding default access levels to public for tests.
|
|
28
|
-
module AdwordsApi
|
|
29
|
-
class ReportUtils
|
|
30
|
-
public :check_for_errors
|
|
31
|
-
public :check_for_xml_error
|
|
32
|
-
public :add_report_definition_hash_order
|
|
33
|
-
public :check_report_definition_hash
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# Stub class for HTTP response.
|
|
38
|
-
class ResponseStub
|
|
39
|
-
attr_reader :code
|
|
40
|
-
attr_reader :body
|
|
41
|
-
|
|
42
|
-
def initialize(code, body)
|
|
43
|
-
@code, @body = code, body
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
XML_REPLY = {
|
|
48
|
-
:reply => '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><reportDownloadError><ApiError><type>ReportDefinitionError.INVALID_FIELD_NAME_FOR_REPORT</type><trigger>foo</trigger><fieldPath>bar</fieldPath></ApiError></reportDownloadError>',
|
|
49
|
-
:type => 'ReportDefinitionError.INVALID_FIELD_NAME_FOR_REPORT',
|
|
50
|
-
:trigger => 'foo',
|
|
51
|
-
:field_path => 'bar'
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
VALID_REPORT = '"Custom ADGROUP_PERFORMANCE_REPORT (Oct 20, 2011-Oct 26, 2011)"\nCampaign ID,Ad group ID,Impressions,Clicks,Cost\nTotal, --,0,0,0.00'
|
|
55
|
-
GZIPPED_REPORT = "\x1F\x8B\b\x00\x00\x00\x00\x00\x00\x00Sr.-.\xC9\xCFUptq\x0F\xF2\x0F\r\x88\x0Fp\rr\xF3\x0F\xF2u\xF4sv\x8D\x0Fr\r\xF0\x0F\nQ\xD0pIMV0\xD2Q0204\xD4\x05\xB1- lM%.\xE7\xC4\xDC\x82\xC4\xCC\xF4<\x05O\x17\x1D\xC7\x14\x85\xF4\xA2\xFC\xD2\x02\x10\xDB3\xB7\xA0(\xB5\xB883?\xAFX\xC79'39\eH\xE5\x17\x97p\x85\xE4\x97$\xE6\xE8(\xE8\xEA\xEA\x18\x80\xA0\x9E\x81\x01\x17\x00\xBE\x1D\xBE\xAD\x81\x00\x00\x00"
|
|
56
|
-
|
|
57
|
-
class TestReportUtils < Test::Unit::TestCase
|
|
58
|
-
|
|
59
|
-
API_VERSION = :v201406
|
|
60
|
-
|
|
61
|
-
# Initialize tests.
|
|
62
|
-
def setup()
|
|
63
|
-
@api = AdwordsApi::Api.new
|
|
64
|
-
@report_utils = @api.report_utils(API_VERSION)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# Testing HTTP code 400.
|
|
68
|
-
def test_check_for_errors_400()
|
|
69
|
-
begin
|
|
70
|
-
response = ResponseStub.new(400, XML_REPLY[:reply])
|
|
71
|
-
@report_utils.check_for_errors(response)
|
|
72
|
-
assert(false, 'No exception thrown for code 400')
|
|
73
|
-
rescue AdwordsApi::Errors::ReportXmlError => e
|
|
74
|
-
assert_equal(400, e.http_code)
|
|
75
|
-
assert_equal(XML_REPLY[:type], e.type)
|
|
76
|
-
assert_equal(XML_REPLY[:trigger], e.trigger)
|
|
77
|
-
assert_equal(XML_REPLY[:field_path], e.field_path)
|
|
78
|
-
assert_not_nil(e.message)
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# Testing HTTP code 500.
|
|
83
|
-
def test_check_for_errors_500()
|
|
84
|
-
begin
|
|
85
|
-
response = ResponseStub.new(500, nil)
|
|
86
|
-
@report_utils.check_for_errors(response)
|
|
87
|
-
assert(false, 'No exception thrown for code 500')
|
|
88
|
-
rescue AdwordsApi::Errors::ReportError => e
|
|
89
|
-
assert_equal(500, e.http_code)
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
# Testing HTTP code 200 with success.
|
|
94
|
-
def test_check_for_errors_200_success()
|
|
95
|
-
response = ResponseStub.new(200, VALID_REPORT)
|
|
96
|
-
assert_nothing_raised do
|
|
97
|
-
@report_utils.check_for_errors(response)
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
# Testing correct gzipped reply.
|
|
102
|
-
def test_gzipped_data()
|
|
103
|
-
report = (RUBY_VERSION >= '1.9.1') ?
|
|
104
|
-
GZIPPED_REPORT.force_encoding('UTF-8') : GZIPPED_REPORT
|
|
105
|
-
response = ResponseStub.new(200, report)
|
|
106
|
-
assert_nothing_raised do
|
|
107
|
-
@report_utils.check_for_errors(response)
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
# Tests generated hash order for root (complete set).
|
|
112
|
-
def test_add_report_definition_hash_order_root1()
|
|
113
|
-
node = {
|
|
114
|
-
:include_zero_impressions => false,
|
|
115
|
-
:download_format => 'CSV',
|
|
116
|
-
:report_type => 'CRITERIA_PERFORMANCE_REPORT',
|
|
117
|
-
:selector => {},
|
|
118
|
-
:report_name => 'report_name',
|
|
119
|
-
:date_range_type => 'LAST_7_DAYS'
|
|
120
|
-
}
|
|
121
|
-
expected = [:selector, :report_name, :report_type, :date_range_type,
|
|
122
|
-
:download_format, :include_zero_impressions]
|
|
123
|
-
@report_utils.add_report_definition_hash_order(node)
|
|
124
|
-
assert_not_nil(node[:order!])
|
|
125
|
-
assert_equal(expected, node[:order!])
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
# Tests generated hash order for root (incomplete set).
|
|
129
|
-
def test_add_report_definition_hash_order_root2()
|
|
130
|
-
node = {
|
|
131
|
-
:download_format => 'CSV',
|
|
132
|
-
:report_type => 'CRITERIA_PERFORMANCE_REPORT',
|
|
133
|
-
:selector => {},
|
|
134
|
-
:report_name => 'report_name',
|
|
135
|
-
:date_range_type => 'LAST_7_DAYS'
|
|
136
|
-
}
|
|
137
|
-
expected = [:selector, :report_name, :report_type, :date_range_type,
|
|
138
|
-
:download_format]
|
|
139
|
-
@report_utils.add_report_definition_hash_order(node)
|
|
140
|
-
assert_not_nil(node[:order!])
|
|
141
|
-
assert_equal(expected, node[:order!])
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
# Tests generated hash order for whole structure.
|
|
145
|
-
def test_add_report_definition_hash_order_deep()
|
|
146
|
-
node = {
|
|
147
|
-
:report_name => 'report_name',
|
|
148
|
-
:report_type => 'CRITERIA_PERFORMANCE_REPORT',
|
|
149
|
-
:selector => {
|
|
150
|
-
:date_range => {:max => '20120405', :min => '20120405'},
|
|
151
|
-
:predicates => {:operator => 'IN', :field => 'S', :values => ['A']},
|
|
152
|
-
:fields => ['CampaignId']
|
|
153
|
-
},
|
|
154
|
-
:include_zero_impressions => false,
|
|
155
|
-
:download_format => 'CSV',
|
|
156
|
-
:date_range_type => 'LAST_7_DAYS'
|
|
157
|
-
}
|
|
158
|
-
expected1 = [:selector, :report_name, :report_type, :date_range_type,
|
|
159
|
-
:download_format, :include_zero_impressions]
|
|
160
|
-
expected2 = [:fields, :predicates, :date_range]
|
|
161
|
-
expected3 = [:min, :max]
|
|
162
|
-
expected4 = [:field, :operator, :values]
|
|
163
|
-
|
|
164
|
-
@report_utils.add_report_definition_hash_order(node)
|
|
165
|
-
assert_not_nil(node[:order!])
|
|
166
|
-
assert_not_nil(node[:selector][:order!])
|
|
167
|
-
assert_not_nil(node[:selector][:date_range][:order!])
|
|
168
|
-
assert_not_nil(node[:selector][:predicates][:order!])
|
|
169
|
-
|
|
170
|
-
assert_equal(expected1, node[:order!])
|
|
171
|
-
assert_equal(expected2, node[:selector][:order!])
|
|
172
|
-
assert_equal(expected3, node[:selector][:date_range][:order!])
|
|
173
|
-
assert_equal(expected4, node[:selector][:predicates][:order!])
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
# Testing check_for_xml_error.
|
|
177
|
-
def check_for_xml_error()
|
|
178
|
-
begin
|
|
179
|
-
@report_utils.check_for_xml_error(XML_REPLY[:reply], 42)
|
|
180
|
-
assert(false, 'No exception thrown for code 42')
|
|
181
|
-
rescue AdwordsApi::Errors::ReportXmlError => e
|
|
182
|
-
assert_equal(42, e.http_code)
|
|
183
|
-
assert_equal(XML_REPLY[:type], e.type)
|
|
184
|
-
assert_equal(XML_REPLY[:trigger], e.trigger)
|
|
185
|
-
assert_equal(XML_REPLY[:field_path], e.field_path)
|
|
186
|
-
assert_not_nil(e.message)
|
|
187
|
-
end
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
def test_return_money_in_micros_removal()
|
|
191
|
-
node = {
|
|
192
|
-
:report_name => 'report_name',
|
|
193
|
-
:report_type => 'CAMPAIGN_PERFORMANCE_REPORT',
|
|
194
|
-
:selector => {
|
|
195
|
-
:date_range => {:max=> '20120405', :min => '20120405'},
|
|
196
|
-
:predicates => {:operator => 'IN', :field => 'S', :values => ['A']},
|
|
197
|
-
:fields => ['CampaignId']
|
|
198
|
-
},
|
|
199
|
-
:download_format => 'CSV',
|
|
200
|
-
:date_range_type => 'LAST_7_DAYS'
|
|
201
|
-
}
|
|
202
|
-
assert_nothing_raised do
|
|
203
|
-
@report_utils.check_report_definition_hash(node)
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
node[:return_money_in_micros] = true
|
|
207
|
-
assert_raise AdwordsApi::Errors::InvalidReportDefinitionError do
|
|
208
|
-
@report_utils.check_report_definition_hash(node)
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
node[:return_money_in_micros] = false
|
|
212
|
-
assert_raise AdwordsApi::Errors::InvalidReportDefinitionError do
|
|
213
|
-
@report_utils.check_report_definition_hash(node)
|
|
214
|
-
end
|
|
215
|
-
end
|
|
216
|
-
end
|