sklik-api 0.0.16 → 0.1.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.
- data/Rakefile +28 -4
- data/VERSION +1 -1
- data/lib/sklik-api/campaign.rb +112 -67
- data/lib/sklik-api/campaign_parts/adgroup.rb +272 -95
- data/lib/sklik-api/campaign_parts/adtext.rb +165 -31
- data/lib/sklik-api/campaign_parts/keyword.rb +192 -38
- data/lib/sklik-api/client.rb +4 -4
- data/lib/sklik-api/connection.rb +36 -13
- data/lib/sklik-api/exceptions.rb +6 -0
- data/lib/sklik-api/sklik_object.rb +29 -1
- data/lib/sklik-api.rb +20 -3
- data/sklik-api.gemspec +11 -3
- data/test/integration/adgroup_test.rb +126 -0
- data/test/integration/adtext_test.rb +106 -0
- data/test/integration/campaign_test.rb +87 -0
- data/test/integration/errors_test.rb +164 -0
- data/test/integration/keyword_test.rb +131 -0
- data/test/unit/adgroup_test.rb +147 -0
- data/test/unit/campaign_test.rb +318 -0
- data/test/unit/client_test.rb +27 -0
- metadata +12 -4
- data/test/unit/campaign.rb +0 -180
data/Rakefile
CHANGED
@@ -36,10 +36,34 @@ unless File.exists?(File.join(CONF_DIR, "access.rb"))
|
|
36
36
|
end
|
37
37
|
|
38
38
|
require 'rake/testtask'
|
39
|
-
Rake::TestTask.new(:test) do |
|
40
|
-
|
41
|
-
|
42
|
-
|
39
|
+
Rake::TestTask.new(:test) do |t|
|
40
|
+
t.libs << 'lib' << 'test'
|
41
|
+
t.test_files = FileList['test/functional/**/*_test.rb', 'test/unit/**/*_test.rb','test/integration/**/*_test.rb']
|
42
|
+
t.warning = false
|
43
|
+
t.verbose = false
|
44
|
+
end
|
45
|
+
|
46
|
+
namespace :test do
|
47
|
+
Rake::TestTask.new(:unit) do |t|
|
48
|
+
t.libs << 'lib' << 'test'
|
49
|
+
t.test_files = FileList['test/unit/**/*_test.rb']
|
50
|
+
t.warning = false
|
51
|
+
t.verbose = false
|
52
|
+
end
|
53
|
+
|
54
|
+
Rake::TestTask.new(:functional) do |t|
|
55
|
+
t.libs << 'lib' << 'test'
|
56
|
+
t.test_files = FileList['test/functional/**/*_test.rb']
|
57
|
+
t.warning = false
|
58
|
+
t.verbose = false
|
59
|
+
end
|
60
|
+
|
61
|
+
Rake::TestTask.new(:integration) do |t|
|
62
|
+
t.libs << 'lib' << 'test'
|
63
|
+
t.test_files = FileList['test/integration/**/*_test.rb']
|
64
|
+
t.warning = false
|
65
|
+
t.verbose = false
|
66
|
+
end
|
43
67
|
end
|
44
68
|
|
45
69
|
require 'rcov/rcovtask'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/lib/sklik-api/campaign.rb
CHANGED
@@ -9,7 +9,7 @@ class SklikApi
|
|
9
9
|
:adSelection, :startDate, :endDate, :premiseId
|
10
10
|
]
|
11
11
|
|
12
|
-
include
|
12
|
+
include SklikObject
|
13
13
|
=begin
|
14
14
|
Example of input hash
|
15
15
|
{
|
@@ -57,14 +57,13 @@ Example of input hash
|
|
57
57
|
#variable where are saved current data from system
|
58
58
|
@campaign_data = nil
|
59
59
|
|
60
|
-
|
61
|
-
@errors = []
|
60
|
+
@args = args
|
62
61
|
|
63
62
|
#initialize adgroups
|
64
63
|
@adgroups = []
|
65
64
|
if args[:ad_groups] && args[:ad_groups].size > 0
|
66
65
|
args[:ad_groups].each do |adgroup|
|
67
|
-
@adgroups << SklikApi::Adgroup.new(self
|
66
|
+
@adgroups << SklikApi::Adgroup.new(adgroup.merge(:campaign => self))
|
68
67
|
end
|
69
68
|
end
|
70
69
|
|
@@ -72,27 +71,52 @@ Example of input hash
|
|
72
71
|
super args
|
73
72
|
end
|
74
73
|
|
75
|
-
def
|
76
|
-
|
74
|
+
def self.get id
|
75
|
+
return ArgumentError, "Please provide param (campaign id)" unless id
|
76
|
+
if campaign = super(NAME, id)
|
77
|
+
SklikApi::Campaign.new(process_sklik_data campaign)
|
78
|
+
else
|
79
|
+
nil
|
80
|
+
end
|
77
81
|
end
|
78
82
|
|
79
83
|
def self.find args = {}
|
80
84
|
out = []
|
85
|
+
|
86
|
+
#asking fo campaign by ID
|
87
|
+
if args.is_a?(Integer)
|
88
|
+
return get args
|
89
|
+
|
90
|
+
#asking for campaign by hash with adgroup_id
|
91
|
+
elsif args.is_a?(Hash) && args[:campaign_id]
|
92
|
+
if campaign = get(args[:campaign_id])
|
93
|
+
return [campaign]
|
94
|
+
else
|
95
|
+
return []
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
81
99
|
super(NAME, args[:customer_id]).each do |campaign|
|
82
|
-
if (args[:
|
83
|
-
(args[:
|
84
|
-
out << SklikApi::Campaign.new(
|
85
|
-
:campaign_id => campaign[:id],
|
86
|
-
:customer_id => args[:customer_id],
|
87
|
-
:budget => campaign[:dayBudget].to_f/100.0,
|
88
|
-
:name => campaign[:name],
|
89
|
-
:status => fix_status(campaign)
|
90
|
-
)
|
100
|
+
if (args[:status].nil? || (args[:status] && args[:status] == fix_status(campaign))) && # find by status
|
101
|
+
(args[:name].nil? || (args[:name] == campaign[:name]))
|
102
|
+
out << SklikApi::Campaign.new(process_sklik_data campaign)
|
91
103
|
end
|
92
104
|
end
|
93
105
|
out
|
94
106
|
end
|
95
107
|
|
108
|
+
def self.process_sklik_data campaign = {}
|
109
|
+
{
|
110
|
+
:campaign_id => campaign[:id],
|
111
|
+
:customer_id => campaign[:userId],
|
112
|
+
:budget => campaign[:dayBudget].to_f/100.0,
|
113
|
+
:name => campaign[:name],
|
114
|
+
:status => fix_status(campaign),
|
115
|
+
:excluded_search_services => campaign[:excludedSearchServices],
|
116
|
+
:network_setting=> {:content=>campaign[:context], :search=>true}
|
117
|
+
}
|
118
|
+
end
|
119
|
+
|
96
120
|
def self.list_search_services
|
97
121
|
connection.call("listSearchServices") do |param|
|
98
122
|
return param[:searchServices].collect{|c| c.symbolize_keys}
|
@@ -111,27 +135,22 @@ Example of input hash
|
|
111
135
|
end
|
112
136
|
end
|
113
137
|
|
114
|
-
def
|
115
|
-
if @args[:
|
116
|
-
|
117
|
-
|
118
|
-
return "suspend"
|
138
|
+
def adgroups
|
139
|
+
if @args[:campaign_id] && get_current_status == :stopped
|
140
|
+
SklikApi.log :error, "Campaign: #{@args[:campaign_id]} - Can't get adgroups for stopped Campaign!"
|
141
|
+
[]
|
119
142
|
else
|
120
|
-
|
143
|
+
Adgroup.find(campaign_id: self.args[:campaign_id])
|
121
144
|
end
|
122
145
|
end
|
123
146
|
|
124
|
-
def adgroups
|
125
|
-
Adgroup.find(self)
|
126
|
-
end
|
127
|
-
|
128
147
|
def to_hash
|
129
148
|
if @campaign_data
|
130
149
|
@campaign_data
|
131
150
|
else
|
132
151
|
@campaign_data = @args
|
133
152
|
if @args[:status] != :stopped
|
134
|
-
@campaign_data[:ad_groups] = Adgroup.find(self).collect{|a| a.to_hash}
|
153
|
+
@campaign_data[:ad_groups] = Adgroup.find(campaign_id: self.args[:campaign_id]).collect{|a| a.to_hash}
|
135
154
|
else
|
136
155
|
@campaign_data[:ad_groups] = []
|
137
156
|
end
|
@@ -146,17 +165,17 @@ Example of input hash
|
|
146
165
|
out << @args[:campaign_id]
|
147
166
|
|
148
167
|
#prepare campaign struct
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
168
|
+
u_args = {}
|
169
|
+
u_args[:name] = @args[:name] if @args[:name]
|
170
|
+
u_args[:status] = status_for_update if status_for_update
|
171
|
+
u_args[:dayBudget] = (@args[:budget] * 100).to_i if @args[:budget]
|
172
|
+
u_args[:context] = @args[:network_setting][:content].nil? || @args[:network_setting][:content] if @args[:network_setting]
|
154
173
|
ADDITIONAL_FIELDS.each do |add_info|
|
155
174
|
field_name = add_info.to_s.underscore.to_sym
|
156
|
-
|
175
|
+
u_args[add_info] = @args[field_name] if @args[field_name]
|
157
176
|
end
|
158
177
|
|
159
|
-
out <<
|
178
|
+
out << u_args
|
160
179
|
|
161
180
|
out
|
162
181
|
end
|
@@ -165,16 +184,16 @@ Example of input hash
|
|
165
184
|
out = []
|
166
185
|
|
167
186
|
#prepare campaign struct
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
187
|
+
c_args = {}
|
188
|
+
c_args[:name] = @args[:name]
|
189
|
+
c_args[:status] = status_for_update if status_for_update
|
190
|
+
c_args[:dayBudget] = (@args[:budget] * 100).to_i if @args[:budget]
|
191
|
+
c_args[:context] = @args[:network_setting][:content].nil? || @args[:network_setting][:content] if @args[:network_setting]
|
172
192
|
ADDITIONAL_FIELDS.each do |add_info|
|
173
193
|
field_name = add_info.to_s.underscore.to_sym
|
174
|
-
|
194
|
+
c_args[add_info] = @args[field_name] if @args[field_name]
|
175
195
|
end
|
176
|
-
|
177
|
-
out << args
|
196
|
+
out << c_args
|
178
197
|
|
179
198
|
#add customer id on which account campaign should be created
|
180
199
|
out << @customer_id if @customer_id
|
@@ -183,10 +202,8 @@ Example of input hash
|
|
183
202
|
|
184
203
|
def self.get_current_status args = {}
|
185
204
|
raise ArgumentError, "Campaign_id is required" unless args[:campaign_id]
|
186
|
-
|
187
|
-
|
188
|
-
if campaigns.size == 1
|
189
|
-
campaigns.first.args[:status]
|
205
|
+
if campaign = self.get(args[:campaign_id])
|
206
|
+
campaign.args[:status]
|
190
207
|
else
|
191
208
|
raise ArgumentError, "Campaign by #{args.inspect} couldn't be found!"
|
192
209
|
end
|
@@ -204,14 +221,22 @@ Example of input hash
|
|
204
221
|
if args[:ad_groups] && args[:ad_groups].size > 0
|
205
222
|
@adgroups_update = true
|
206
223
|
args[:ad_groups].each do |adgroup|
|
207
|
-
@adgroups << SklikApi::Adgroup.new(self
|
224
|
+
@adgroups << SklikApi::Adgroup.new(adgroup.merge(campaign: self))
|
208
225
|
end
|
209
226
|
end
|
210
227
|
|
211
228
|
save
|
212
229
|
end
|
213
230
|
|
231
|
+
def valid?
|
232
|
+
clear_errors
|
233
|
+
log_error "name is required" unless args[:name] && args[:name].size > 0
|
234
|
+
log_error "budget must be more than 1 CZK" unless args[:budget] && args[:budget] > 1.0
|
235
|
+
!errors.any?
|
236
|
+
end
|
237
|
+
|
214
238
|
def save
|
239
|
+
clear_errors
|
215
240
|
if @args[:campaign_id] #do update
|
216
241
|
#get current status of campaign
|
217
242
|
before_status = get_current_status
|
@@ -241,7 +266,9 @@ Example of input hash
|
|
241
266
|
#adgroups to be created
|
242
267
|
(@new_adgroups.keys - @saved_adgroups.keys).each do |k|
|
243
268
|
puts "creating new adgroup: #{@new_adgroups[k].args[:name]}"
|
244
|
-
@new_adgroups[k].save
|
269
|
+
unless @new_adgroups[k].save
|
270
|
+
log_error({"Creation of: #{@new_adgroups[k].args[:name]}"=> @new_adgroups[k].errors})
|
271
|
+
end
|
245
272
|
end
|
246
273
|
|
247
274
|
#check status to be running
|
@@ -251,47 +278,65 @@ Example of input hash
|
|
251
278
|
@saved_adgroups[k].restore
|
252
279
|
end
|
253
280
|
puts "updating adgroup: #{@saved_adgroups[k].args[:name]}"
|
254
|
-
@saved_adgroups[k].update @new_adgroups[k]
|
281
|
+
unless @saved_adgroups[k].update @new_adgroups[k]
|
282
|
+
log_error({"Creation of: #{@saved_adgroups[k].args[:name]}"=> @saved_adgroups[k].errors})
|
283
|
+
end
|
255
284
|
end
|
256
285
|
|
257
286
|
end
|
258
287
|
|
259
288
|
rescue Exception => e
|
260
|
-
|
289
|
+
log_error e.message
|
261
290
|
end
|
262
291
|
|
263
292
|
#remove it if new status is stopped or status doesn't changed and before it was stopped
|
264
293
|
remove if (@args[:status] == :stopped) || (@args[:status].nil? && before_status == :stopped)
|
265
294
|
|
266
|
-
raise ArgumentError, "Problem with updating campaign datas #{@errors}" unless @errors.size == 0
|
267
|
-
|
268
|
-
return true
|
269
295
|
else #do save
|
270
296
|
#create campaign
|
271
297
|
begin
|
272
298
|
create
|
273
299
|
rescue Exception => e
|
274
|
-
|
300
|
+
log_error e.message
|
301
|
+
#don't continue with creating campaign!
|
275
302
|
return false
|
276
303
|
end
|
277
304
|
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
@campaign_data = @args
|
283
|
-
raise ArgumentError, "Problem with creating campaign datas" unless @errors.size == 0
|
284
|
-
return true
|
285
|
-
rescue Exception => e
|
286
|
-
@errors << e.message
|
287
|
-
#update name
|
288
|
-
update :name => "#{@args[:name]} FAILED ON CREATION - #{Time.now.strftime("%Y.%m.%d %H:%M:%S")}"
|
289
|
-
#remove campaign
|
290
|
-
remove
|
291
|
-
#return false because error occured
|
292
|
-
return false
|
305
|
+
#create adgroups
|
306
|
+
unless @adgroups.all?{ |adgroup| adgroup.save }
|
307
|
+
return rollback!
|
293
308
|
end
|
309
|
+
|
310
|
+
@campaign_data = @args
|
311
|
+
|
312
|
+
#remove campaign when it was started with stopped status!
|
313
|
+
remove if @args[:status] && @args[:status].to_s.to_sym == :stopped
|
314
|
+
|
294
315
|
end
|
316
|
+
|
317
|
+
!errors.any?
|
318
|
+
end
|
319
|
+
|
320
|
+
def log_error message
|
321
|
+
errors << message
|
322
|
+
end
|
323
|
+
|
324
|
+
def rollback!
|
325
|
+
#don't rollback if it is disabled!
|
326
|
+
return false unless SklikApi.use_rollback?
|
327
|
+
|
328
|
+
#remember errors!
|
329
|
+
old_errors = errors
|
330
|
+
|
331
|
+
SklikApi.log :info, "Campaign: #{@args[:campaign_id]} - ROLLBACK!"
|
332
|
+
update :name => "#{@args[:name]} FAILED ON CREATION - #{Time.now.strftime("%Y.%m.%d %H:%M:%S")}"
|
333
|
+
#remove adgroup
|
334
|
+
remove
|
335
|
+
|
336
|
+
#return remembered errors!
|
337
|
+
@errors = old_errors
|
338
|
+
#don't continue with creating adgroup!
|
339
|
+
return false
|
295
340
|
end
|
296
341
|
end
|
297
342
|
end
|