adapi 0.0.5 → 0.0.6
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/adapi.gemspec +10 -6
- data/examples/add_campaign.rb +1 -1
- data/examples/add_campaign_criteria.rb +1 -1
- data/examples/find_campaign.rb +2 -3
- data/examples/find_campaign_criteria.rb +7 -98
- data/examples/find_locations.rb +9 -3
- data/examples/test_diacritics.rb +18 -0
- data/lib/adapi/campaign.rb +3 -1
- data/lib/adapi/campaign_criterion.rb +14 -12
- data/lib/adapi/version.rb +6 -1
- metadata +32 -31
data/adapi.gemspec
CHANGED
@@ -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
|
-
#
|
22
|
-
#
|
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
|
-
#
|
24
|
+
# * versions of both gems should be freezed
|
25
|
+
# * ads-common should be required before adwords-api
|
26
26
|
#
|
27
|
-
|
28
|
-
|
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
|
data/examples/add_campaign.rb
CHANGED
@@ -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 => [
|
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
|
},
|
data/examples/find_campaign.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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 '
|
3
|
+
require 'adapi'
|
27
4
|
|
28
|
-
|
29
|
-
|
5
|
+
# create campaign
|
6
|
+
require_relative 'add_campaign_criteria'
|
30
7
|
|
31
|
-
|
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
|
-
|
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
|
-
|
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 }
|
data/examples/find_locations.rb
CHANGED
@@ -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
|
-
|
20
|
-
|
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
|
data/lib/adapi/campaign.rb
CHANGED
@@ -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
|
-
|
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, :
|
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
|
-
|
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
|
-
|
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
|
data/lib/adapi/version.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module Adapi
|
4
|
-
VERSION = "0.0.
|
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.
|
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-
|
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: &
|
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.
|
21
|
+
version: 0.6.3
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *5230940
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: google-adwords-api
|
27
|
-
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.
|
32
|
+
version: 0.5.2
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *5229860
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: activemodel
|
38
|
-
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: *
|
46
|
+
version_requirements: *5229100
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: activesupport
|
49
|
-
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: *
|
57
|
+
version_requirements: *5228260
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rake
|
60
|
-
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: *
|
68
|
+
version_requirements: *5227180
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: curb
|
71
|
-
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: *
|
79
|
+
version_requirements: *5226200
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: yard
|
82
|
-
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: *
|
90
|
+
version_requirements: *8121020
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rcov
|
93
|
-
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: *
|
101
|
+
version_requirements: *8117900
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: turn
|
104
|
-
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: *
|
112
|
+
version_requirements: *8115180
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: shoulda
|
115
|
-
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: *
|
123
|
+
version_requirements: *8102400
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: fakeweb
|
126
|
-
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: *
|
134
|
+
version_requirements: *8100640
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: factory_girl
|
137
|
-
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: *
|
145
|
+
version_requirements: *8099340
|
146
146
|
- !ruby/object:Gem::Dependency
|
147
147
|
name: minitest
|
148
|
-
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: *
|
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.
|
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
|