adapi 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|