google-adwords-api 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,3 +1,8 @@
1
+ 0.4.2:
2
+ - Updated Reporting error codes handling.
3
+ - Fix for old v13 services compatibility.
4
+ - Require google-ads-common 0.5.4 or later from now on.
5
+
1
6
  0.4.1:
2
7
  - Support for v201109.
3
8
  - Added support and example for AdHoc reports.
data/README CHANGED
@@ -29,7 +29,7 @@ which is installed automatically as a dependency.
29
29
  The following gem libraries are required:
30
30
  - savon v0.9.6
31
31
  - httpclient v2.1.2 or greater
32
- - google-ads-common v0.5.2 or later.
32
+ - google-ads-common v0.5.4 or later.
33
33
 
34
34
 
35
35
  == 2 - Using the client library:
data/Rakefile CHANGED
@@ -48,7 +48,7 @@ spec = Gem::Specification.new do |s|
48
48
  s.test_files = tests
49
49
  s.has_rdoc = true
50
50
  s.extra_rdoc_files = docs
51
- s.add_dependency('google-ads-common', '~> 0.5.2')
51
+ s.add_dependency('google-ads-common', '~> 0.5.4')
52
52
  s.add_dependency('savon', '= 0.9.6')
53
53
  end
54
54
 
@@ -71,7 +71,7 @@ task :generate do
71
71
  api_config = AdwordsApi::ApiConfig
72
72
  versions = api_config.versions()
73
73
  versions.each do |version|
74
- code_path = "lib/%s/%s" % [api_config.api_path, version]
74
+ code_path = "lib/%s/%s" % [api_config.api_name.to_s.snakecase, version]
75
75
  wsdls = AdwordsApi::ApiConfig.get_wsdls(version)
76
76
  wsdls.each do |service_name, wsdl_url|
77
77
  logger.info("Processing %s at [%s]..." % [service_name, wsdl_url])
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/ruby
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
+ # This example gets and downloads an Ad Hoc report from a XML report definition
21
+ # using OAuth as authorization method.
22
+
23
+ require 'rubygems'
24
+ require 'adwords_api'
25
+
26
+ API_VERSION = :v201109
27
+ MAX_RETRIES = 3
28
+
29
+ def oauth_report_download()
30
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
31
+ # when called without parameters.
32
+ adwords = AdwordsApi::Api.new
33
+
34
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
35
+ # the configuration file or provide your own logger:
36
+ # adwords.logger = Logger.new('adwords_xml.log')
37
+
38
+ # Get report utilities for the version.
39
+ report_utils = adwords.report_utils(API_VERSION)
40
+
41
+ # File name to write report to. To retrieve the report as return value, use
42
+ # "download_report" method.
43
+ file_name = 'INSERT_OUTPUT_FILE_NAME_HERE'
44
+
45
+ # Define report definition. You can also pass your own XML text as a string.
46
+ report_definition = {
47
+ :selector => {
48
+ :fields => ['CampaignId', 'Id', 'Impressions', 'Clicks', 'Cost'],
49
+ # Predicates are optional.
50
+ :predicates => {
51
+ :field => 'Status',
52
+ :operator => 'IN',
53
+ :values => ['ENABLED', 'PAUSED']
54
+ }
55
+ },
56
+ :report_name => 'Custom ADGROUP_PERFORMANCE_REPORT',
57
+ :report_type => 'ADGROUP_PERFORMANCE_REPORT',
58
+ :download_format => 'CSV',
59
+ :date_range_type => 'LAST_7_DAYS',
60
+ # Enable to get rows with zero impressions.
61
+ :include_zero_impressions => false
62
+ }
63
+
64
+ retry_count = 0
65
+
66
+ begin
67
+ # Download report, using "download_report_as_file" utility method.
68
+ report_utils.download_report_as_file(report_definition, file_name)
69
+ puts "Report was downloaded to '%s'." % file_name
70
+ rescue AdsCommon::Errors::OAuthVerificationRequired => e
71
+ if retry_count < MAX_RETRIES
72
+ puts "Hit Auth error, please navigate to URL:\n\t%s" % e.oauth_url
73
+ print 'log in and type the verification code: '
74
+ verification_code = gets.chomp
75
+ adwords.credential_handler.set_credential(
76
+ :oauth_verification_code, verification_code)
77
+ retry_count += 1
78
+ retry
79
+ else
80
+ raise AdsCommon::Errors::AuthError, 'Failed to authenticate.'
81
+ end
82
+ end
83
+ end
84
+
85
+ if __FILE__ == $0
86
+ begin
87
+ oauth_report_download()
88
+
89
+ # HTTP errors.
90
+ rescue AdsCommon::Errors::HttpError => e
91
+ puts "HTTP Error: %s" % e
92
+
93
+ # API errors.
94
+ rescue AdwordsApi::Errors::ReportError => e
95
+ puts "Reporting Error: %s" % e.message
96
+ end
97
+ end
data/lib/adwords_api.rb CHANGED
@@ -20,7 +20,7 @@
20
20
  #
21
21
  # Contains the main classes for the client library.
22
22
 
23
- gem 'google-ads-common', '~>0.5.2'
23
+ gem 'google-ads-common', '~>0.5.4'
24
24
 
25
25
  require 'ads_common/api'
26
26
  require 'ads_common/auth/oauth_handler'
@@ -84,7 +84,7 @@ module AdwordsApi
84
84
  end
85
85
  handlers = header_list.map do |header|
86
86
  AdsCommon::SavonHeaders::SimpleHeaderHandler.new(
87
- @credential_handler, auth_handler, header, nil, version)
87
+ @credential_handler, auth_handler, header, namespace, version)
88
88
  end
89
89
  else
90
90
  handlers = case auth_method
@@ -226,8 +226,6 @@ module AdwordsApi
226
226
  return AdwordsApi::ReportUtils.new(self, version)
227
227
  end
228
228
 
229
- private
230
-
231
229
  # Overrides AdsCommon::Api.get_auth_handler to allow version-specific
232
230
  # handlers.
233
231
  def get_auth_handler(environment, version = nil)
@@ -237,6 +235,8 @@ module AdwordsApi
237
235
  return @auth_handler
238
236
  end
239
237
 
238
+ private
239
+
240
240
  # Creates an appropriate authentication handler for each service (reuses the
241
241
  # ClientLogin one to avoid generating multiple tokens unnecessarily).
242
242
  #
@@ -249,7 +249,7 @@ module AdwordsApi
249
249
  #
250
250
  def create_auth_handler(environment, version = nil)
251
251
  return (version == :v13) ?
252
- AdwordsApi::V13LoginHandler.new : super(environment)
252
+ AdwordsApi::V13LoginHandler.new(@config) : super(environment)
253
253
  end
254
254
 
255
255
  # Executes block with a temporary flag set to a given value. Returns block
@@ -41,8 +41,7 @@ module AdwordsApi
41
41
 
42
42
  # Set other constants
43
43
  API_NAME = 'AdwordsApi'
44
- API_PATH = 'adwords_api'
45
- CLIENT_LIB_VERSION = '0.4.1'
44
+ CLIENT_LIB_VERSION = '0.4.2'
46
45
  DEFAULT_CONFIG_FILENAME = 'adwords_api.yml'
47
46
 
48
47
  # Configure the services available to each version
@@ -265,10 +264,6 @@ module AdwordsApi
265
264
  API_NAME
266
265
  end
267
266
 
268
- def self.api_path
269
- API_PATH
270
- end
271
-
272
267
  def self.service_config
273
268
  @@service_config
274
269
  end
@@ -293,32 +288,10 @@ module AdwordsApi
293
288
  @@headers_config
294
289
  end
295
290
 
296
- # Returns the full interface class name for a given service. Overriding this
297
- # method from ads_common to fix odd behaviour with v13 class names.
298
- #
299
- # Args:
300
- # - version: the API version (as an integer)
301
- # - service: the service name (as a string)
302
- #
303
- # Returns:
304
- # The full interface class name for the given service (as a string)
305
- #
306
- def self.interface_name(version, service)
307
- service_str = service.to_s
308
- service_str = service_str.sub(/Service$/, '') if version == :v13
309
- return module_name(version, service) + "::" + service_str
310
- end
311
-
312
- def self.do_require(version, service)
313
- service_name = service.to_s.snakecase()
314
- filename = "%s/%s/%s" % [api_path, version, service_name]
315
- require filename
316
- end
317
-
318
291
  # Get the download URL for reports.
319
292
  #
320
293
  # Args:
321
- # - environment: the service environment to be used (as a string)
294
+ # - environment: the service environment to be used
322
295
  # - version: the API version (as a symbol)
323
296
  #
324
297
  # Returns:
@@ -335,7 +308,7 @@ module AdwordsApi
335
308
  # Get the download URL for Ad Hoc reports.
336
309
  #
337
310
  # Args:
338
- # - environment: the service environment to be used (as a string)
311
+ # - environment: the service environment to be used
339
312
  # - version: the API version (as a symbol)
340
313
  #
341
314
  # Returns:
@@ -60,6 +60,23 @@ module AdwordsApi
60
60
  end
61
61
 
62
62
  private
63
+ # Generates SOAP request header with login credentials and namespace
64
+ # definition.
65
+ #
66
+ # Args:
67
+ # - None
68
+ #
69
+ # Returns:
70
+ # - Hash containing a header with filled in credentials
71
+ #
72
+ def generate_request_header()
73
+ headers = @auth_handler.headers(@credential_handler.credentials(@version))
74
+ return headers.inject({}) do |request_header, (header, value)|
75
+ request_header[prepend_namespace(header)] = value
76
+ request_header
77
+ end
78
+ end
79
+
63
80
  # Skips namespace prefixes for all elements except top level. Use default
64
81
  # (inherited) prefixing for the top level key.
65
82
  #
@@ -66,6 +66,12 @@ module AdwordsApi
66
66
 
67
67
  # Error for server-side report error.
68
68
  class ReportError < AdsCommon::Errors::ApiException
69
+ attr_reader :http_code
70
+
71
+ def initialize(http_code, message)
72
+ super(message)
73
+ @http_code = http_code
74
+ end
69
75
  end
70
76
  end
71
77
  end
@@ -20,8 +20,10 @@
20
20
  # Contains extensions to the API, that is, service helper methods provided in
21
21
  # client-side by the client library.
22
22
 
23
- require 'rexml/document'
24
23
  require 'csv'
24
+ require 'httpi/request'
25
+ require 'rexml/document'
26
+
25
27
  require 'ads_common/http'
26
28
 
27
29
  module AdwordsApi
@@ -223,18 +225,19 @@ module AdwordsApi
223
225
 
224
226
  # Gets a report response for a given parameters.
225
227
  def self.get_report_response(wrapper, url)
226
- headers = get_report_request_headers(wrapper)
228
+ headers = get_report_request_headers(wrapper, url)
227
229
  report_response = AdsCommon::Http.get_response(url, wrapper.api.config,
228
230
  headers)
229
231
  return report_response
230
232
  end
231
233
 
232
- def self.get_report_request_headers(wrapper)
234
+ def self.get_report_request_headers(wrapper, url)
233
235
  headers = {}
234
236
  credentials = wrapper.api.credential_handler.credentials
235
- auth_handler = wrapper.api.client_login_handler
236
- headers['Authorization'] = "GoogleLogin auth=%s" %
237
- auth_handler.headers(credentials)[:authToken]
237
+ auth_handler = wrapper.api.get_auth_handler(
238
+ wrapper.api.config.read('service.environment'), wrapper.version)
239
+ headers['Authorization'] = auth_handler.auth_string(credentials,
240
+ HTTPI::Request.new(url))
238
241
  if credentials[:clientCustomerId]
239
242
  headers['clientCustomerId'] = credentials[:clientCustomerId]
240
243
  elsif credentials[:clientEmail]
@@ -20,6 +20,7 @@
20
20
  # Contains utility methods specific to reporting.
21
21
 
22
22
  require 'gyoku'
23
+ require 'httpi/request'
23
24
 
24
25
  require 'adwords_api/errors'
25
26
 
@@ -89,10 +90,10 @@ module AdwordsApi
89
90
  # Send POST request for a report and returns Response object.
90
91
  def get_report_response(report_definition)
91
92
  definition_text = get_report_definition_text(report_definition)
92
- data = {"__rdxml" => definition_text}
93
+ data = {'__rdxml' => definition_text}
93
94
  url = @api.api_config.adhoc_report_download_url(
94
95
  @api.config.read('service.environment'), @version)
95
- headers = get_report_request_headers()
96
+ headers = get_report_request_headers(url)
96
97
  response = AdsCommon::Http.post_response(url, data, @api.config, headers)
97
98
  check_for_errors(response)
98
99
  return response
@@ -102,8 +103,8 @@ module AdwordsApi
102
103
  # and Hash (renders XML).
103
104
  def get_report_definition_text(report_definition)
104
105
  return case report_definition
105
- when String: report_definition
106
- when Hash: report_definition_to_xml(report_definition)
106
+ when String then report_definition
107
+ when Hash then report_definition_to_xml(report_definition)
107
108
  else
108
109
  raise AdwordsApi::Errors::InvalidReportDefinitionError,
109
110
  "Unknown object for report definition: %s" %
@@ -112,13 +113,17 @@ module AdwordsApi
112
113
  end
113
114
 
114
115
  # Prepares headers for report request.
115
- def get_report_request_headers()
116
+ def get_report_request_headers(url)
116
117
  credentials = @api.credential_handler.credentials
117
- auth_string = @api.client_login_handler.headers(credentials)[:authToken]
118
+ auth_handler = @api.get_auth_handler(
119
+ @api.config.read('service.environment'), @version)
120
+ auth_string = auth_handler.auth_string(
121
+ credentials, HTTPI::Request.new(url))
118
122
  headers = {
119
- 'Authorization' => "GoogleLogin auth=%s" % auth_string,
123
+ 'Authorization' => auth_string,
120
124
  'ClientCustomerId' => credentials[:clientCustomerId],
121
- 'Content-Type' => 'multipart/form-data'
125
+ 'Content-Type' => 'multipart/form-data',
126
+ 'developerToken' => credentials[:developerToken]
122
127
  }
123
128
  return headers
124
129
  end
@@ -131,20 +136,23 @@ module AdwordsApi
131
136
  # Checks downloaded data for error signature. Raises ReportError if it
132
137
  # detects an error.
133
138
  def check_for_errors(response)
134
- # Check for error code.
135
- unless response.code == 200
136
- raise AdwordsApi::Errors::ReportError,
137
- "Report download error occured, http code: %d" % response.code
138
- end
139
139
  # Check for error in body.
140
140
  report_body = response.body
141
- error_message_regex = '^!!!(-?\d+)\|\|\|(-?\d+)\|\|\|(.*)\?\?\?'
142
- data = report_body.slice(0, 1024)
143
- matches = data.match(error_message_regex)
144
- if matches
145
- message = (matches[3].nil?) ? data : matches[3]
146
- raise AdwordsApi::Errors::ReportError,
147
- "Report download error occured: %s" % message
141
+ if report_body
142
+ error_message_regex = '^!!!(-?\d+)\|\|\|(-?\d+)\|\|\|(.*)\?\?\?'
143
+ data = report_body.slice(0, 1024)
144
+ matches = data.match(error_message_regex)
145
+ if matches
146
+ message = (matches[3].nil?) ? data : matches[3]
147
+ raise AdwordsApi::Errors::ReportError.new(response.code,
148
+ "Report download error occured: %s" % message)
149
+ end
150
+ end
151
+ # Check for error code.
152
+ unless response.code == 200
153
+ raise AdwordsApi::Errors::ReportError.new(response.code,
154
+ "Report download error occured, http code: %d, body: %s" %
155
+ [response.code, response.body])
148
156
  end
149
157
  return nil
150
158
  end
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/ruby
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
+ # Tests the general API features.
21
+
22
+ require 'rubygems'
23
+ require 'test/unit'
24
+ require 'adwords_api'
25
+
26
+ class TestApiConfig < Test::Unit::TestCase
27
+ # Initialize tests.
28
+ def setup
29
+ @config = AdwordsApi::ApiConfig
30
+ end
31
+
32
+ # Test correct require path.
33
+ def test_do_require
34
+ name1 = @config.do_require(:v201109, :InfoService)
35
+ assert_equal('adwords_api/v201109/info_service', name1)
36
+ name2 = @config.do_require(:v13, :AccountService)
37
+ assert_equal('adwords_api/v13/account_service', name2)
38
+ end
39
+
40
+ # Test correct module name.
41
+ def test_module_name
42
+ name1 = @config.module_name(:v201109, :InfoService)
43
+ assert_equal('AdwordsApi::V201109::InfoService', name1)
44
+ name2 = @config.module_name(:v13, :AccountService)
45
+ assert_equal('AdwordsApi::V13::AccountService', name2)
46
+ end
47
+
48
+ # Test correct interface name.
49
+ def test_interface_name
50
+ name1 = @config.interface_name(:v201109, :InfoService)
51
+ assert_equal('AdwordsApi::V201109::InfoService::InfoService', name1)
52
+ name2 = @config.interface_name(:v13, :AccountService)
53
+ assert_equal('AdwordsApi::V13::AccountService::AccountService', name2)
54
+ end
55
+ end
@@ -0,0 +1,110 @@
1
+ #!/usr/bin/ruby
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
+ # Tests report utils.
21
+
22
+ require 'rubygems'
23
+ require 'test/unit'
24
+ require 'adwords_api'
25
+
26
+ API_VERSION = :v201109
27
+
28
+ # Overriding default access levels to public for tests.
29
+ module AdwordsApi
30
+ class ReportUtils
31
+ public :check_for_errors
32
+ end
33
+ end
34
+
35
+ # Stub class for HTTP response.
36
+ class ResponseStub
37
+ attr_reader :code
38
+ attr_reader :body
39
+
40
+ def initialize(code, body)
41
+ @code, @body = code, body
42
+ end
43
+ end
44
+
45
+ # Typical reply types.
46
+ REPLY_TYPES = [
47
+ {:reply => '!!!2|||-1|||Improperly formatted report request???',
48
+ :message => 'Improperly formatted report request'},
49
+ {:reply => "!!!2|||-1|||ReportDefinitionError.INVALID_FIELD_NAME_FOR_REPORT @ ; trigger:'bCampaignId'???",
50
+ :message => "ReportDefinitionError.INVALID_FIELD_NAME_FOR_REPORT @ ; trigger:'bCampaignId'"}
51
+ ]
52
+
53
+ 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'
54
+
55
+ class TestReportUtils < Test::Unit::TestCase
56
+ # Initialize tests.
57
+ def setup
58
+ @api = AdwordsApi::Api.new
59
+ @report_utils = @api.report_utils(API_VERSION)
60
+ end
61
+
62
+ # Testing HTTP code 400.
63
+ def test_check_for_errors_400
64
+ REPLY_TYPES.each do |reply_type|
65
+ begin
66
+ response = ResponseStub.new(400, reply_type[:reply])
67
+ @report_utils.check_for_errors(response)
68
+ assert(false, 'No exception thrown for code 400')
69
+ rescue AdwordsApi::Errors::ReportError => e
70
+ assert_equal(400, e.http_code)
71
+ assert(e.message.include?(reply_type[:message]))
72
+ end
73
+ end
74
+ end
75
+
76
+ # Testing HTTP code 500.
77
+ def test_check_for_errors_500
78
+ REPLY_TYPES.each do |reply_type|
79
+ begin
80
+ response = ResponseStub.new(500, nil)
81
+ @report_utils.check_for_errors(response)
82
+ assert(false, 'No exception thrown for code 500')
83
+ rescue AdwordsApi::Errors::ReportError => e
84
+ assert_equal(500, e.http_code)
85
+ end
86
+ end
87
+ end
88
+
89
+ # Testing HTTP code 200 with success.
90
+ def test_check_for_errors_200_success
91
+ response = ResponseStub.new(200, VALID_REPORT)
92
+ assert_nothing_raised do
93
+ @report_utils.check_for_errors(response)
94
+ end
95
+ end
96
+
97
+ # Testing HTTP code 200 with failure.
98
+ def test_check_for_errors_200_success
99
+ REPLY_TYPES.each do |reply_type|
100
+ begin
101
+ response = ResponseStub.new(200, reply_type[:reply])
102
+ @report_utils.check_for_errors(response)
103
+ assert(false, 'No exception thrown for code 200')
104
+ rescue AdwordsApi::Errors::ReportError => e
105
+ assert_equal(200, e.http_code)
106
+ assert(e.message.include?(reply_type[:message]))
107
+ end
108
+ end
109
+ end
110
+ end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-adwords-api
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 4
9
- - 1
10
- version: 0.4.1
8
+ - 2
9
+ version: 0.4.2
11
10
  platform: ruby
12
11
  authors:
13
12
  - Danial Klimkin
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2011-10-20 00:00:00 +04:00
17
+ date: 2011-11-01 00:00:00 +04:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
@@ -26,12 +25,11 @@ dependencies:
26
25
  requirements:
27
26
  - - ~>
28
27
  - !ruby/object:Gem::Version
29
- hash: 15
30
28
  segments:
31
29
  - 0
32
30
  - 5
33
- - 2
34
- version: 0.5.2
31
+ - 4
32
+ version: 0.5.4
35
33
  type: :runtime
36
34
  version_requirements: *id001
37
35
  - !ruby/object:Gem::Dependency
@@ -42,7 +40,6 @@ dependencies:
42
40
  requirements:
43
41
  - - "="
44
42
  - !ruby/object:Gem::Version
45
- hash: 55
46
43
  segments:
47
44
  - 0
48
45
  - 9
@@ -517,6 +514,7 @@ files:
517
514
  - examples/v201109/get_geo_location_info.rb
518
515
  - examples/v201109/get_all_languages.rb
519
516
  - examples/v201109/delete_ad_group.rb
517
+ - examples/v201109/oauth_report_download.rb
520
518
  - examples/v201109/download_report.rb
521
519
  - examples/v201109/get_all_images.rb
522
520
  - examples/v201109/check_campaigns.rb
@@ -569,6 +567,8 @@ files:
569
567
  - examples/v201109/get_total_usage_units_per_month.rb
570
568
  - Rakefile
571
569
  - test/bugs/test_issue_00000031.rb
570
+ - test/adwords_api/test_api_config.rb
571
+ - test/adwords_api/test_report_utils.rb
572
572
  - README
573
573
  - COPYING
574
574
  - ChangeLog
@@ -586,7 +586,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
586
586
  requirements:
587
587
  - - ">="
588
588
  - !ruby/object:Gem::Version
589
- hash: 3
590
589
  segments:
591
590
  - 0
592
591
  version: "0"
@@ -595,7 +594,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
595
594
  requirements:
596
595
  - - ">="
597
596
  - !ruby/object:Gem::Version
598
- hash: 3
599
597
  segments:
600
598
  - 0
601
599
  version: "0"
@@ -608,3 +606,5 @@ specification_version: 3
608
606
  summary: Ruby Client libraries for AdWords API
609
607
  test_files:
610
608
  - test/bugs/test_issue_00000031.rb
609
+ - test/adwords_api/test_api_config.rb
610
+ - test/adwords_api/test_report_utils.rb