adwords4r 11.1.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. data/ChangeLog.txt +4 -0
  2. data/Rakefile +76 -70
  3. data/examples/campaign.rb +40 -0
  4. data/examples/{old/framework.rb → framework.rb} +0 -0
  5. data/examples/{old/get_free_usage_this_month.rb → get_free_usage_this_month.rb} +8 -6
  6. data/examples/get_unit_count.rb +21 -0
  7. data/examples/keyword_suggestions.rb +179 -0
  8. data/examples/keyword_tool_demo.rb +31 -0
  9. data/examples/reports.rb +6 -6
  10. data/examples/traffic_estimator.rb +34 -0
  11. data/lib/adwords4r.rb +26 -19
  12. data/lib/adwords4r/credentials.rb +4 -2
  13. data/lib/adwords4r/services.rb +4 -2
  14. data/lib/adwords4r/v11/AccountServiceDriver.rb +3 -3
  15. data/lib/adwords4r/v11/AdGroupServiceDriver.rb +8 -8
  16. data/lib/adwords4r/v11/AdServiceDriver.rb +10 -10
  17. data/lib/adwords4r/v11/CampaignServiceDriver.rb +10 -10
  18. data/lib/adwords4r/v11/CriterionServiceDriver.rb +9 -9
  19. data/lib/adwords4r/v11/InfoServiceDriver.rb +8 -8
  20. data/lib/adwords4r/v11/KeywordToolServiceDriver.rb +2 -2
  21. data/lib/adwords4r/v11/ReportServiceDriver.rb +7 -7
  22. data/lib/adwords4r/v11/SiteSuggestionServiceDriver.rb +4 -4
  23. data/lib/adwords4r/v11/TrafficEstimatorServiceDriver.rb +4 -4
  24. data/lib/adwords4r/{v10 → v12}/AccountService.rb +13 -32
  25. data/lib/adwords4r/{v10 → v12}/AccountServiceDriver.rb +12 -20
  26. data/lib/adwords4r/{v10 → v12}/AccountServiceMappingRegistry.rb +23 -38
  27. data/lib/adwords4r/{v10 → v12}/AdGroupService.rb +43 -37
  28. data/lib/adwords4r/{v10 → v12}/AdGroupServiceDriver.rb +27 -27
  29. data/lib/adwords4r/{v10 → v12}/AdGroupServiceMappingRegistry.rb +46 -42
  30. data/lib/adwords4r/{v10 → v12}/AdService.rb +68 -56
  31. data/lib/adwords4r/{v10 → v12}/AdServiceDriver.rb +33 -33
  32. data/lib/adwords4r/{v10 → v12}/AdServiceMappingRegistry.rb +113 -105
  33. data/lib/adwords4r/{v10 → v12}/CampaignService.rb +99 -44
  34. data/lib/adwords4r/{v10 → v12}/CampaignServiceDriver.rb +41 -33
  35. data/lib/adwords4r/{v10 → v12}/CampaignServiceMappingRegistry.rb +143 -65
  36. data/lib/adwords4r/{v10 → v12}/CriterionService.rb +46 -43
  37. data/lib/adwords4r/{v10 → v12}/CriterionServiceDriver.rb +30 -30
  38. data/lib/adwords4r/{v10 → v12}/CriterionServiceMappingRegistry.rb +67 -65
  39. data/lib/adwords4r/{v10 → v12}/InfoService.rb +19 -19
  40. data/lib/adwords4r/{v10 → v12}/InfoServiceDriver.rb +27 -27
  41. data/lib/adwords4r/{v10 → v12}/InfoServiceMappingRegistry.rb +25 -25
  42. data/lib/adwords4r/{v10 → v12}/KeywordToolService.rb +12 -12
  43. data/lib/adwords4r/{v10 → v12}/KeywordToolServiceDriver.rb +9 -9
  44. data/lib/adwords4r/{v10 → v12}/KeywordToolServiceMappingRegistry.rb +23 -23
  45. data/lib/adwords4r/v12/ReportService.rb +322 -0
  46. data/lib/adwords4r/{v10 → v12}/ReportServiceDriver.rb +29 -21
  47. data/lib/adwords4r/v12/ReportServiceMappingRegistry.rb +298 -0
  48. data/lib/adwords4r/{v10 → v12}/SiteSuggestionService.rb +18 -18
  49. data/lib/adwords4r/{v10 → v12}/SiteSuggestionServiceDriver.rb +15 -15
  50. data/lib/adwords4r/{v10 → v12}/SiteSuggestionServiceMappingRegistry.rb +45 -45
  51. data/lib/adwords4r/{v10 → v12}/TrafficEstimatorService.rb +29 -29
  52. data/lib/adwords4r/{v10 → v12}/TrafficEstimatorServiceDriver.rb +15 -15
  53. data/lib/adwords4r/{v10 → v12}/TrafficEstimatorServiceMappingRegistry.rb +55 -55
  54. data/svn-commit.2.tmp +60 -0
  55. data/svn-commit.tmp +60 -0
  56. metadata +41 -38
  57. data/examples/old/campaign.rb +0 -40
  58. data/examples/old/get_unit_count.rb +0 -21
  59. data/examples/old/keyword_tool_demo.rb +0 -30
  60. data/examples/old/traffic_estimator.rb +0 -34
  61. data/lib/adwords4r/v10/ReportService.rb +0 -652
  62. data/lib/adwords4r/v10/ReportServiceMappingRegistry.rb +0 -559
@@ -1,3 +1,7 @@
1
+ 12.0.0
2
+ - Added support for v12 of the AdWords API.
3
+ Removed support for v10 of the API, which has been deco'ed.
4
+
1
5
  11.1.0
2
6
  - Added additional attributes to the AdWords::Error::ApiError class.
3
7
  This should make it easier to get all the useful SOAP fault information, some of which wasn't available in the previous version.
data/Rakefile CHANGED
@@ -16,7 +16,7 @@ require 'lib/adwords4r/services'
16
16
 
17
17
  CLOBBER.include('pkg')
18
18
 
19
- CURRENT_VERSION = '11.1.0'
19
+ CURRENT_VERSION = '12.0.0'
20
20
  PKG_VERSION = ENV['REL'] ? ENV['REL'] : CURRENT_VERSION
21
21
 
22
22
  SRC_RB = FileList['lib/**/*.rb']
@@ -29,8 +29,8 @@ logger = Logger.new(STDERR)
29
29
 
30
30
  CLEAN.include(WSDLDIR)
31
31
  AdWords::Service.getVersions.each do |v|
32
- vname = "v#{v}"
33
- CLEAN.include(File.join(GENDIR, vname))
32
+ vname = "v#{v}"
33
+ CLEAN.include(File.join(GENDIR, vname))
34
34
  end
35
35
 
36
36
  desc "gets the wsdl and generates the classes"
@@ -38,73 +38,77 @@ task :default => [:getwsdl, :generate]
38
38
 
39
39
  desc "gets the wsdl files for AdWords services"
40
40
  task :getwsdl do
41
- AdWords::Service.getVersions.each do |v|
42
- vname = "v#{v}"
43
- mkdir_p File.join(WSDLDIR, vname)
44
- AdWords::Service.getServices(v).each {|s| save(getfile("adwords.google.com", "/api/adwords/#{vname}/#{s}Service?wsdl"), getWsdlFileName(vname,s))}
45
- end
41
+ AdWords::Service.getVersions.each do |v|
42
+ vname = "v#{v}"
43
+ mkdir_p File.join(WSDLDIR, vname)
44
+ AdWords::Service.getServices(v).each {|s|
45
+ save(getfile("adwords.google.com",
46
+ "/api/adwords/#{vname}/#{s}Service?wsdl"),
47
+ getWsdlFileName(vname,s))}
48
+ end
46
49
  end
47
50
 
48
51
  desc "generates AdWords classes from the wsdl files"
49
52
  task :generate do
50
- AdWords::Service.getVersions.each do |v|
51
- vname = "v#{v}"
52
- gendir = "#{LIBDIR}/adwords4r/#{vname}"
53
- mkdir_p gendir
54
- AdWords::Service.getServices(v).each do |name|
55
- worker = WSDL::SOAP::WSDL2Ruby.new
56
- worker.logger = logger
57
- worker.location = getWsdlFileName(vname,name)
58
- worker.basedir = gendir
59
- worker.opt.update(getWsdlOpt(name))
60
- worker.run
61
- fixImport(v, File.join(gendir, "#{name}Driver.rb"))
62
- fixImport(v, File.join(gendir, "#{name}MappingRegistry.rb"))
63
- fixImport(v, File.join(gendir, "#{name}.rb"))
64
- end
53
+ AdWords::Service.getVersions.each do |v|
54
+ vname = "v#{v}"
55
+ gendir = "#{LIBDIR}/adwords4r/#{vname}"
56
+ mkdir_p gendir
57
+ AdWords::Service.getServices(v).each do |name|
58
+ worker = WSDL::SOAP::WSDL2Ruby.new
59
+ worker.logger = logger
60
+ worker.location = getWsdlFileName(vname,name)
61
+ worker.basedir = gendir
62
+ worker.opt.update(getWsdlOpt(name))
63
+ worker.run
64
+ fixImport(v, File.join(gendir, "#{name}Driver.rb"))
65
+ fixImport(v, File.join(gendir, "#{name}MappingRegistry.rb"))
66
+ fixImport(v, File.join(gendir, "#{name}.rb"))
65
67
  end
68
+ end
66
69
  end
67
70
 
68
71
  def fixImport(version, file)
69
- vname = "v#{version}"
70
- tempfile = file + '.tmp'
71
- outfile = File.new(tempfile,"w")
72
- File.open(file, "r") do |infile|
73
- infile.each do |l|
74
- if (l =~ /require.*Service.*\.rb/) then
75
- outfile.puts l.gsub(/require '(.*)Service(.*)\.rb'/, "require 'adwords4r/#{vname}/\\1Service\\2'")
76
- else
77
- outfile.puts l
78
- end
79
- end
72
+ vname = "v#{version}"
73
+ tempfile = file + '.tmp'
74
+ outfile = File.new(tempfile,"w")
75
+ File.open(file, "r") do |infile|
76
+ infile.each do |l|
77
+ if (l =~ /require.*Service.*\.rb/) then
78
+ outfile.puts l.gsub(/require '(.*)Service(.*)\.rb'/,
79
+ "require 'adwords4r/#{vname}/\\1Service\\2'")
80
+ else
81
+ outfile.puts l
82
+ end
80
83
  end
81
- outfile.close
82
- File.rename(tempfile, file)
84
+ end
85
+ outfile.close
86
+ File.rename(tempfile, file)
83
87
  end
84
88
 
85
89
  def getWsdlOpt(s)
86
- optcmd= {}
87
- s << "Service"
88
- optcmd['classdef'] = s
89
- optcmd['force'] = true
90
- optcmd['mapping_registry'] = true
91
- optcmd['driver'] = nil
92
-
93
- # Causes soap4r to wrap the classes it outputs into the given modules
94
- optcmd['module_path'] = ['AdWords', s]
95
- return optcmd
96
- end
90
+ optcmd= {}
91
+ s << "Service"
92
+ optcmd['classdef'] = s
93
+ optcmd['force'] = true
94
+ optcmd['mapping_registry'] = true
95
+ optcmd['driver'] = nil
97
96
 
97
+ # Causes soap4r to wrap the classes it outputs into the given modules
98
+ optcmd['module_path'] = ['AdWords', s]
99
+ return optcmd
100
+ end
101
+
98
102
  def getWsdlFileName(v,s)
99
- "#{WSDLDIR}/#{v}/#{s}.wsdl"
103
+ "#{WSDLDIR}/#{v}/#{s}.wsdl"
100
104
  end
101
-
105
+
102
106
  def getfile(host, path)
103
- puts "getting https//#{host}#{path}"
104
- https = Net::HTTP.new(host, 443)
105
- https.use_ssl = true
106
- https.verify_mode = OpenSSL::SSL::VERIFY_NONE
107
- https.start { |w| w.get2(path).body }
107
+ puts "getting https//#{host}#{path}"
108
+ https = Net::HTTP.new(host, 443)
109
+ https.use_ssl = true
110
+ https.verify_mode = OpenSSL::SSL::VERIFY_NONE
111
+ https.start { |w| w.get2(path).body }
108
112
  end
109
113
 
110
114
  def fix_attribute(text, name, type)
@@ -112,21 +116,23 @@ def fix_attribute(text, name, type)
112
116
  end
113
117
 
114
118
  def fixWsdl(wsdl)
115
- ['type', 'base'].each {|name| ['long', 'string', 'date', 'int', 'boolean'].each {|type| fix_attribute(wsdl, name, type)}}
116
- schema_ns = "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""
117
- if wsdl !~ Regexp.new(schema_ns)
118
- wsdl.gsub!(/(<wsdl:definitions[^>]*)>/, '\1 ' + schema_ns + '>')
119
- end
120
- return wsdl
121
- #wsdl.gsub(/type=\"long\"/, 'type="xsd:long"')
119
+ ['type', 'base'].each {|name|
120
+ ['long', 'string', 'date', 'int', 'boolean'].each {|type|
121
+ fix_attribute(wsdl, name, type)}}
122
+ schema_ns = "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""
123
+ if wsdl !~ Regexp.new(schema_ns)
124
+ wsdl.gsub!(/(<wsdl:definitions[^>]*)>/, '\1 ' + schema_ns + '>')
125
+ end
126
+ return wsdl
127
+ #wsdl.gsub(/type=\"long\"/, 'type="xsd:long"')
122
128
  end
123
129
 
124
130
  # Saves this document to the specified @var path.
125
131
  #doesn't create the file if contains markup for google 404 page
126
132
  def save(content, path)
127
- if content !~ /<H2>Error 404<\/H2>/
128
- File::open(path, 'w') {|f| f.write(fixWsdl(content))}
129
- end
133
+ if content !~ /<H2>Error 404<\/H2>/
134
+ File::open(path, 'w') {|f| f.write(fixWsdl(content))}
135
+ end
130
136
  end
131
137
 
132
138
  # ====================================================================
@@ -138,7 +144,7 @@ PKG_FILES = FileList[
138
144
  'Rakefile',
139
145
  'lib/**/*.rb',
140
146
  'examples/**/*.rb',
141
- # 'test/**/*.rb',
147
+ # 'test/**/*.rb',
142
148
  'scripts/**/*.rb'
143
149
  ]
144
150
 
@@ -152,7 +158,7 @@ else
152
158
  spec = Gem::Specification.new do |s|
153
159
 
154
160
  #### Basic information.
155
-
161
+
156
162
  s.name = 'adwords4r'
157
163
  s.version = PKG_VERSION
158
164
  s.summary = "Client library for the AdWords API."
@@ -163,7 +169,7 @@ Currently the following AdWords API versions are supported:\
163
169
  * V10\
164
170
  * V11\
165
171
  }
166
-
172
+
167
173
  s.files = PKG_FILES.to_a
168
174
  s.require_path = 'lib'
169
175
  s.autorequire = 'adwords4r'
@@ -174,9 +180,9 @@ Currently the following AdWords API versions are supported:\
174
180
  s.has_rdoc = false
175
181
  #s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
176
182
  #s.rdoc_options <<
177
- # '--title' << 'Builder -- Easy XML Building' <<
178
- # '--main' << 'README' <<
179
- # '--line-numbers'
183
+ # '--title' << 'Builder -- Easy XML Building' <<
184
+ # '--main' << 'README' <<
185
+ # '--line-numbers'
180
186
 
181
187
  s.author = "Jeffrey Posnick, Patrick Chanezon, Ryan Leavengood"
182
188
  s.email = "jeffy@google.com"
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Use adwords4r in parent dir
4
+ $LOAD_PATH.unshift '../lib/'
5
+
6
+ require 'adwords4r'
7
+
8
+ SEP = "---"
9
+
10
+ def dumpObj(o)
11
+ str = ""
12
+ o.instance_variables.each { |v| str << dumpAttr(o, v)}
13
+ return str << SEP
14
+ end
15
+
16
+ def dumpAttr(o, v)
17
+ name = v.sub(/@/,'')
18
+ value = eval("o.#{name}.to_s")
19
+ return "#{name}: #{value}\n"
20
+ end
21
+
22
+ begin
23
+ adwords = AdWords::API.new
24
+
25
+ res = adwords.getAllAdWordsCampaigns(123).getAllAdWordsCampaignsReturn
26
+ res.each {|c| puts dumpObj(c)}
27
+
28
+ c = AdWords::Campaign.new
29
+ c.dailyBudget = 10000
30
+ c.status = 'Paused'
31
+ c.name = "Test Campaign #{rand(10000)}"
32
+ c.endDay = SOAP::SOAPDate.new("2010-01-01")
33
+ puts dumpObj(adwords.addCampaign(c).addCampaignReturn)
34
+
35
+ rescue AdWords::Error::UnknownAPICall => e
36
+ puts e
37
+ rescue AdWords::Error::ApiError => e
38
+ puts e.code
39
+ puts e.message
40
+ end
@@ -6,13 +6,15 @@ $LOAD_PATH.unshift '../lib/'
6
6
  require 'adwords4r'
7
7
 
8
8
  begin
9
- adwords = AdWords::API.new
10
- puts "result = #{adwords.getFreeUsageQuotaThisMonth().getFreeUsageQuotaThisMonthReturn}"
11
-
9
+ adwords = AdWords::API.new
10
+ result = adwords.getFreeUsageQuotaThisMonth().
11
+ getFreeUsageQuotaThisMonthReturn
12
+ puts "result = #{result}"
13
+
12
14
  rescue AdWords::Error::UnknownAPICall => e
13
- puts e
15
+ puts e
14
16
  rescue AdWords::Error::ApiError => e
15
- puts e.code
16
- puts e.message
17
+ puts e.code
18
+ puts e.message
17
19
  end
18
20
 
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Use adwords4r in parent dir
4
+ $LOAD_PATH.unshift '../lib/'
5
+
6
+ require 'adwords4r'
7
+
8
+ begin
9
+ adwords = AdWords::API.new
10
+ # Get the units for the last month or so
11
+ end = Date.today
12
+ start = end_date - 31
13
+ puts "result = #{adwords.getUnitCount(start, end).getUnitCountReturn}"
14
+
15
+ rescue AdWords::Error::UnknownAPICall => e
16
+ puts e
17
+ rescue AdWords::Error::ApiError => e
18
+ puts e.code
19
+ puts e.message
20
+ end
21
+
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/ruby
2
+ #
3
+ # Copyright 2008, Google Inc. All Rights Reserved.
4
+ #
5
+ # 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 implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+ # This code sample illustrates how to get keyword variations for seed keyword(s)
18
+ # and then estimate the traffic that the "top" variations might receive.
19
+
20
+ require 'rubygems'
21
+ gem 'soap4r', '>= 1.5.8'
22
+ require 'adwords4r'
23
+
24
+
25
+ def main()
26
+ begin
27
+ # AdWords::AdWordsCredentials.new will read a credentials file from
28
+ # ENV['HOME']/adwords.properties when called without parameters.
29
+ # The latest versioned release of the API will be assumed.
30
+ #
31
+ # Credentials can be either for the production or Sandbox environments.
32
+ # Production environment credentials overview:
33
+ # http://www.google.com/apis/adwords/developer/index.html
34
+ # Sandbox environment credentials overview:
35
+ # http://www.google.com/apis/adwords/developer/adwords_api_sandbox.html
36
+ #
37
+ # Instead of reading them from a file, the credentials can be
38
+ # specified inline as a hash:
39
+ #
40
+ # creds = {
41
+ # 'developerToken' => 'user@domain.com++USD',
42
+ # 'useragent' => 'Sample User Agent',
43
+ # 'password' => 'password',
44
+ # 'email' => 'user@domain.com',
45
+ # 'clientEmail' => 'client_1+user@domain.com',
46
+ # 'applicationToken' => 'IGNORED',
47
+ # 'alternateUrl' => 'https://sandbox.google.com/api/adwords/v11/',
48
+ # }
49
+ # adwords = AdWords::API.new(AdWords::AdWordsCredentials.new(creds), 11)
50
+
51
+ adwords = AdWords::API.new
52
+
53
+ # Modify the following values to set the seed keywords, language,
54
+ # country targeting, and synonyms options.
55
+
56
+ keywords = ['hot dog']
57
+ languages = %w{en}
58
+ countries = %w{US}
59
+ use_synonyms = false
60
+
61
+ seed_keywords = []
62
+ keywords.each do |keyword|
63
+ seed_keyword = AdWords::KeywordToolService::SeedKeyword.new
64
+ seed_keyword.text = keyword
65
+ seed_keyword.type = 'Broad' # Or 'Phrase' or 'Exact' if desired.
66
+ seed_keywords << seed_keyword
67
+ end
68
+
69
+ variations = adwords.getKeywordVariations(seed_keywords, use_synonyms,
70
+ languages, countries
71
+ ).getKeywordVariationsReturn
72
+
73
+ variation_objects = []
74
+ unless variations.moreSpecific.nil?
75
+ variation_objects.concat(variations.moreSpecific)
76
+ end
77
+ unless variations.additionalToConsider.nil?
78
+ variation_objects.concat(variations.additionalToConsider)
79
+ end
80
+ variation_objects.sort! do |a, b|
81
+ if b.searchVolumeScale == a.searchVolumeScale
82
+ a.advertiserCompetitionScale <=> b.advertiserCompetitionScale
83
+ else
84
+ b.searchVolumeScale <=> a.searchVolumeScale
85
+ end
86
+ end
87
+
88
+ max_estimates = 3
89
+ keywords_to_estimate = []
90
+ variation_objects[0..max_estimates - 1].each do |variation_object|
91
+ keywords_to_estimate << variation_object.text
92
+ end
93
+
94
+ ad_group_request = AdWords::TrafficEstimatorService::AdGroupRequest.new
95
+ ad_group_request.maxCpc = 1000000
96
+ keywords_to_estimate.each do |keyword_to_estimate|
97
+ keyword_request = AdWords::TrafficEstimatorService::KeywordRequest.new
98
+ keyword_request.text = keyword_to_estimate
99
+ keyword_request.type = 'Broad' # Or 'Phrase' or 'Exact' if desired.
100
+ ad_group_request.keywordRequests << keyword_request
101
+ end
102
+
103
+ geo_targeting = AdWords::TrafficEstimatorService::GeoTarget.new
104
+ geo_targeting.countryTargets = countries
105
+
106
+ campaign_request = AdWords::TrafficEstimatorService::CampaignRequest.new
107
+ campaign_request.adGroupRequests = ad_group_request
108
+ campaign_request.geoTargeting = geo_targeting
109
+ campaign_request.languageTargeting = languages
110
+ campaign_request.networkTargeting = %w{SearchNetwork ContentNetwork}
111
+
112
+ campaign_estimate = adwords.estimateCampaignList([campaign_request]).first
113
+ ad_group_estimate = campaign_estimate.adGroupEstimates.first
114
+ keyword_estimates = ad_group_estimate.keywordEstimates
115
+ for i in 0..keyword_estimates.length - 1
116
+ estimate = keyword_estimates[i]
117
+ text = keywords_to_estimate[i]
118
+
119
+ puts "Keyword: %s\tClicks: %f - %f\tCPC: %d - %d\tPosition: %f - %f" %
120
+ [text, estimate.lowerClicksPerDay, estimate.upperClicksPerDay,
121
+ estimate.lowerCpc, estimate.upperCpc, estimate.lowerAvgPosition,
122
+ estimate.upperAvgPosition]
123
+ end
124
+
125
+ rescue Errno::ECONNRESET, SOAP::HTTPStreamError, SocketError => e
126
+ # This exception indicates a connection-level error.
127
+ # In general, it is likely to be transitory.
128
+
129
+ puts 'Connection Error: %s' % e
130
+ puts 'Source: %s' % e.backtrace.first
131
+
132
+ rescue AdWords::Error::UnknownAPICall => e
133
+ # This exception is thrown when an unknown SOAP method is invoked.
134
+
135
+ puts e
136
+ puts 'Source: %s' % e.backtrace.first
137
+
138
+ rescue AdWords::Error::ApiError => e
139
+ # This exception maps to receiving a SOAP Fault back from the service.
140
+ # The e.soap_faultstring_ex, e.code_ex, and potentially e.trigger_ex
141
+ # attributes are the most useful, but other attributes may be populated
142
+ # as well. To display all attributes, the following can be used:
143
+ #
144
+ # e.instance_variables.each do |var|
145
+ # value = e.instance_variable_get(var)
146
+ # if ! value.nil?
147
+ # puts '%s => %s' % [var, value]
148
+ # end
149
+ # end
150
+
151
+ puts 'SOAP Error: %s (code: %d)' % [e.soap_faultstring_ex, e.code_ex]
152
+ puts 'Trigger: %s' % e.trigger_ex unless e.trigger_ex.nil?
153
+ puts 'Source: %s' % e.backtrace.first
154
+
155
+ ensure
156
+ # Display API unit usage info. This data is stored as a class variable
157
+ # in the AdWords::API class and accessed via static methods.
158
+ # AdWords::API.get_total_units() returns a running total of units used in
159
+ # the scope of the current program.
160
+ # AdWords::API.get_last_units() returns the number used in the last call.
161
+
162
+ puts
163
+ puts '%d API units consumed total (%d in last call).' %
164
+ [AdWords::API.get_total_units(), AdWords::API.get_last_units()]
165
+ end
166
+ end
167
+
168
+
169
+ if __FILE__ == $0
170
+ # The adwords4r library can log all SOAP requests and responses to files.
171
+ # This is often useful for debugging purposes.
172
+ # To enable this, set the ADWORDS4R_DEBUG environement varaible to 'true'.
173
+ # This can be done either from your operating system environment or via
174
+ # code, as done below.
175
+
176
+ ENV['ADWORDS4R_DEBUG'] = 'false'
177
+
178
+ main()
179
+ end