adapi 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -18,14 +18,17 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- # require specific version of ad-common and adwords-api gems,
22
- # they're stil changing a lot and automatic updates through '~>'
23
- # can easily break something
21
+ # Requires google-adwords-api gem, which provides low-level interface to
22
+ # AdWords API, and its dependecy, google-ads-common gem.
24
23
  #
25
- # PS: ads-common is "freezed" - required before adwords-api
24
+ # * versions of both gems should be freezed
25
+ # * ads-common should be required before adwords-api
26
26
  #
27
- s.add_dependency "google-ads-common", "0.6.2"
28
- s.add_dependency "google-adwords-api", "0.5.0"
27
+ # PS: versions are freezed because both of these gems change a lot and
28
+ # automatic updates through '~>' can (and already did) break something
29
+ #
30
+ s.add_dependency "google-ads-common", "0.6.3"
31
+ s.add_dependency "google-adwords-api", "0.5.2"
29
32
 
30
33
  s.add_dependency "activemodel", "~> 3.1"
31
34
  s.add_dependency "activesupport", "~> 3.1"
@@ -39,4 +42,5 @@ Gem::Specification.new do |s|
39
42
  s.add_development_dependency "fakeweb"
40
43
  s.add_development_dependency "factory_girl"
41
44
  s.add_development_dependency "minitest"
45
+
42
46
  end
@@ -21,7 +21,7 @@ campaign_data = {
21
21
 
22
22
  # PS: :targets key is obsolete, this should be named :criteria, but it still works
23
23
  :targets => {
24
- :language => [ 'en', 'cs' ],
24
+ :language => [ :en, :cs ],
25
25
  # TODO test together with city target
26
26
  :geo => { :proximity => { :geo_point => '38.89859,-77.035971', :radius => '10 km' } }
27
27
  },
@@ -7,7 +7,7 @@ require_relative 'add_bare_campaign'
7
7
 
8
8
  $campaign_criterion = Adapi::CampaignCriterion.new(
9
9
  :campaign_id => $campaign[:id],
10
- :criteria => {
10
+ :targets => { # obsolete, use :criteria instead
11
11
  :language => %w{ en cs },
12
12
 
13
13
  :location => {
@@ -18,10 +18,9 @@ puts "Budget period: %s" % $campaign[:budget][:period]
18
18
  puts "\nBidding strategy type: %s" % $campaign[:bidding_strategy][:xsi_type]
19
19
  # TODO bidding_strategy.bid_ceiling
20
20
 
21
- puts "\nCriteria:"
21
+ puts "\nCriteria (%d in total):" % $campaign[:criteria].size
22
22
  $campaign[:criteria].each do |criterion|
23
- p criterion[:xsi_type]
24
- p criterion
23
+ puts criterion.inspect
25
24
  end
26
25
 
27
26
  puts "\nAd groups (#{$campaign[:ad_groups].size} in total):"
@@ -1,103 +1,12 @@
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
- # This example illustrates how to retrieve all the campaign targets. To set
22
- # campaign targets, run add_campaign_targeting_criteria.rb.
23
- #
24
- # Tags: CampaignCriterionService.get
1
+ # encoding: utf-8
25
2
 
26
- require 'adwords_api'
3
+ require 'adapi'
27
4
 
28
- API_VERSION = :v201109
29
- PAGE_SIZE = 500
5
+ # create campaign
6
+ require_relative 'add_campaign_criteria'
30
7
 
31
- def get_campaign_targeting_criteria()
32
- # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
33
- # when called without parameters.
34
- adwords = AdwordsApi::Api.new
8
+ $criteria = Adapi::CampaignCriterion.find(:campaign_id => $campaign.to_param)
35
9
 
36
- # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
37
- # the configuration file or provide your own logger:
38
- # adwords.logger = Logger.new('adwords_xml.log')
10
+ puts "Found %d criteria:\n" % $criteria.size
39
11
 
40
- campaign_criterion_srv =
41
- adwords.service(:CampaignCriterionService, API_VERSION)
42
-
43
- # Specify campaign ID to get targeting for.
44
- campaign_id = 'INSERT_CAMPAIGN_ID_HERE'.to_i
45
-
46
- # Selector to get all the targeting for this campaign.
47
- selector = {
48
- :fields => ['Id', 'CriteriaType', 'KeywordText'],
49
- :predicates => [
50
- {:field => 'CampaignId', :operator => 'EQUALS', :values => [campaign_id]}
51
- ],
52
- :paging => {
53
- :start_index => 0,
54
- :number_results => PAGE_SIZE
55
- }
56
- }
57
-
58
- # Set initial values.
59
- offset, page = 0, {}
60
-
61
- begin
62
- page = campaign_criterion_srv.get(selector)
63
- if page[:entries]
64
- page[:entries].each do |typed_criterion|
65
- negative = typed_criterion[:xsi_type] == 'NegativeCampaignCriterion' ?
66
- ' (negative)' : ''
67
- criterion = typed_criterion[:criterion]
68
- puts ("Campaign criterion%s with ID %d, type '%s' and text '%s'" +
69
- " was found.") %
70
- [negative, criterion[:id], criterion[:type], criterion[:text]]
71
- end
72
- # Increment values to request the next page.
73
- offset += PAGE_SIZE
74
- selector[:paging][:start_index] = offset
75
- end
76
- end while page[:total_num_entries] > offset
77
-
78
- if page.include?(:total_num_entries)
79
- puts "\tCampaign ID %d has %d criteria." %
80
- [campaign_id, page[:total_num_entries]]
81
- end
82
- end
83
-
84
- if __FILE__ == $0
85
- begin
86
- get_campaign_targeting_criteria()
87
-
88
- # HTTP errors.
89
- rescue AdsCommon::Errors::HttpError => e
90
- puts "HTTP Error: %s" % e
91
-
92
- # API errors.
93
- rescue AdwordsApi::Errors::ApiException => e
94
- puts "Message: %s" % e.message
95
- puts 'Errors:'
96
- e.errors.each_with_index do |error, index|
97
- puts "\tError [%d]:" % (index + 1)
98
- error.each do |field, value|
99
- puts "\t\t%s: %s" % [field, value]
100
- end
101
- end
102
- end
103
- end
12
+ $criteria.each { |criterion| p criterion }
@@ -11,11 +11,17 @@ $search_params = [
11
11
  { :province => 'Prague' },
12
12
  { :city => 'Prague' }
13
13
  ]
14
-
14
+
15
15
  $search_params.each do |params|
16
16
  $location = Adapi::Location.find(params)
17
17
 
18
18
  puts "\nSearched for: " + params.inspect
19
- # puts "Found Location ID: #{Adapi::Location.location_tree($location)}"
20
- puts "Found Location ID: #{$location[:id]}"
19
+
20
+ if $location.nil?
21
+ puts "Not found."
22
+ next
23
+ else
24
+ # puts "Found Location ID: #{Adapi::Location.location_tree($location)}"
25
+ puts "Found Location ID: #{$location[:id]}"
26
+ end
21
27
  end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adapi'
4
+
5
+ # this test should not raise an exception (sic!)
6
+
7
+ $search_params = { :city => 'São Paulo' }
8
+
9
+ $location = Adapi::Location.find($search_params)
10
+
11
+ puts "\nSearched for: " + $search_params.inspect
12
+
13
+ if $location.nil?
14
+ puts "Not found."
15
+ else
16
+ # puts "Found Location ID: #{Adapi::Location.location_tree($location)}"
17
+ puts "Found Location ID: #{$location[:id]}"
18
+ end
@@ -54,7 +54,9 @@ module Adapi
54
54
  # PS: not sure if this should be a default. maybe we don't even need it
55
55
  @budget[:delivery_method] ||= 'STANDARD'
56
56
 
57
- @criteria ||= []
57
+ # HOTFIX backward compatibility with old field for criteria
58
+ @criteria ||= params[:targets] || {}
59
+
58
60
  @ad_groups ||= []
59
61
 
60
62
  super(params)
@@ -33,12 +33,15 @@ module Adapi
33
33
  self.send "#{param_name}=", params[param_name.to_sym]
34
34
  end
35
35
 
36
+ # HOTFIX backward compatibility with old field for criteria
37
+ @criteria ||= params[:targets] || {}
38
+
36
39
  super(params)
37
40
  end
38
41
 
39
42
  def create
40
43
  # step 1 - convert input hash to new array of criteria
41
- # example: :language => [ :en, :cz ] -> [:language, :en]
44
+ # example: :language => [ :en, :cs ] -> [ [:language, :en], [:language, :cs] ]
42
45
  criteria_array = []
43
46
 
44
47
  @criteria.each_pair do |criterion_type, criterion_settings|
@@ -136,9 +139,6 @@ module Adapi
136
139
 
137
140
  def self.find(params = {})
138
141
  params.symbolize_keys!
139
-
140
- # by default, skip criteria types that have no criterion data
141
- params[:skip_empty_criterion_types] ||= true
142
142
 
143
143
  if params[:conditions]
144
144
  params[:campaign_id] = params[:campaign_id] || params[:conditions][:campaign_id]
@@ -154,9 +154,11 @@ module Adapi
154
154
  end
155
155
  end.compact
156
156
 
157
- # TODO: get more fields
157
+ # TODO: get more fields - tricky, because value files differ for most types
158
+ #
158
159
  selector = {
159
- :fields => ['Id'],
160
+ # HOTFIX added LocationName - and values for other criterion types mysteriously appeared as well!
161
+ :fields => ['Id', 'CriteriaType', 'KeywordText', 'LocationName'],
160
162
  :ordering => [{:field => 'Id', :sort_order => 'ASCENDING'}],
161
163
  :predicates => predicates
162
164
  }
@@ -165,16 +167,15 @@ module Adapi
165
167
 
166
168
  response = (response and response[:entries]) ? response[:entries] : []
167
169
 
168
- # return everything or only
169
- if params[:skip_empty_criterion_types]
170
- response.select! { |criterion_type| criterion_type.has_key?(:criteria) }
171
- end
172
-
173
170
  # TODO optionally return just certain type(s)
174
171
  # easy, just add condition (single type or array), filter and set
175
172
  # :skip_empty_target_types option to false
176
173
 
177
- response
174
+ # TODO add custom column :value, which will return criterion value
175
+ # unrelated to the actual column where value is stored (code,
176
+ # location_name, etc.)
177
+
178
+ response.map { |entry| entry[:criterion] }.compact
178
179
  end
179
180
 
180
181
  # Transforms our custom high-level criteria parameters to AdWords API parameters
@@ -185,6 +186,7 @@ module Adapi
185
186
  # :language => [ :en, :cs ]
186
187
  # :language => [ 1000, 1021 ] # integers!
187
188
  #
189
+ # TODO return error if language cannot be found
188
190
  #
189
191
  def self.create_criterion(criterion_type, criterion_data)
190
192
  case criterion_type
@@ -1,10 +1,15 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Adapi
4
- VERSION = "0.0.5"
4
+ VERSION = "0.0.6"
5
5
 
6
6
  # CHANGELOG:
7
7
  #
8
+ # 0.0.6
9
+ # updated to latest adwords-api and ads-common gems, which fix many issues with AdWords API version v201109
10
+ # fix CampaignCriterion service
11
+ # fix examples
12
+ #
8
13
  # 0.0.5
9
14
  # converted to AdWords API version v201109
10
15
  # moved from CampaignTarget to CampaignCriterion
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,33 +9,33 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-27 00:00:00.000000000 Z
12
+ date: 2012-03-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: google-ads-common
16
- requirement: &10751680 !ruby/object:Gem::Requirement
16
+ requirement: &5230940 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - =
20
20
  - !ruby/object:Gem::Version
21
- version: 0.6.2
21
+ version: 0.6.3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *10751680
24
+ version_requirements: *5230940
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: google-adwords-api
27
- requirement: &10749800 !ruby/object:Gem::Requirement
27
+ requirement: &5229860 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - =
31
31
  - !ruby/object:Gem::Version
32
- version: 0.5.0
32
+ version: 0.5.2
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *10749800
35
+ version_requirements: *5229860
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: activemodel
38
- requirement: &10748340 !ruby/object:Gem::Requirement
38
+ requirement: &5229100 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '3.1'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *10748340
46
+ version_requirements: *5229100
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: activesupport
49
- requirement: &10747280 !ruby/object:Gem::Requirement
49
+ requirement: &5228260 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '3.1'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *10747280
57
+ version_requirements: *5228260
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
- requirement: &10743320 !ruby/object:Gem::Requirement
60
+ requirement: &5227180 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.9.2
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *10743320
68
+ version_requirements: *5227180
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: curb
71
- requirement: &10742640 !ruby/object:Gem::Requirement
71
+ requirement: &5226200 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0.7'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *10742640
79
+ version_requirements: *5226200
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: yard
82
- requirement: &10740660 !ruby/object:Gem::Requirement
82
+ requirement: &8121020 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0.7'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *10740660
90
+ version_requirements: *8121020
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rcov
93
- requirement: &10739480 !ruby/object:Gem::Requirement
93
+ requirement: &8117900 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0.9'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *10739480
101
+ version_requirements: *8117900
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: turn
104
- requirement: &10738540 !ruby/object:Gem::Requirement
104
+ requirement: &8115180 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - =
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 0.8.2
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *10738540
112
+ version_requirements: *8115180
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: shoulda
115
- requirement: &10737680 !ruby/object:Gem::Requirement
115
+ requirement: &8102400 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *10737680
123
+ version_requirements: *8102400
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: fakeweb
126
- requirement: &10732740 !ruby/object:Gem::Requirement
126
+ requirement: &8100640 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *10732740
134
+ version_requirements: *8100640
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: factory_girl
137
- requirement: &10729600 !ruby/object:Gem::Requirement
137
+ requirement: &8099340 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '0'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *10729600
145
+ version_requirements: *8099340
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: minitest
148
- requirement: &10726800 !ruby/object:Gem::Requirement
148
+ requirement: &8097340 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,7 +153,7 @@ dependencies:
153
153
  version: '0'
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *10726800
156
+ version_requirements: *8097340
157
157
  description: This gem provides user-friendly interface to Google Adwords API.
158
158
  email:
159
159
  - lucastej@gmail.com
@@ -188,6 +188,7 @@ files:
188
188
  - examples/find_locations.rb
189
189
  - examples/log_to_specific_account.rb
190
190
  - examples/rollback_campaign.rb
191
+ - examples/test_diacritics.rb
191
192
  - examples/update_campaign.rb
192
193
  - examples/update_campaign_status.rb
193
194
  - lib/adapi.rb
@@ -240,7 +241,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
240
241
  version: '0'
241
242
  requirements: []
242
243
  rubyforge_project: adapi
243
- rubygems_version: 1.8.10
244
+ rubygems_version: 1.8.15
244
245
  signing_key:
245
246
  specification_version: 3
246
247
  summary: User-friendly interface to Google Adwords API