douaparale 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3afcd5bb83630e8ab3f342b09591ff531b9f6fa3
4
+ data.tar.gz: 54a7ca4290dd988f2ba6412c4e2f4a9c05f469bf
5
+ SHA512:
6
+ metadata.gz: 171ec04d36bd6c6efdd3a181486770e9b1c66d1452b792d1d298fdaf8a1d10447f2516ae0443d367f741c432da0c4029162d2400c70a85280716f751fc4a9b95
7
+ data.tar.gz: 36d057aaa6f131df6d454573efc76ebb737ba277754f57888709d186d7908ddb22cacf0cb12a26e22424572f69600180a611a21835934e480636390ec07b6c10
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
22
+ lib/test.rb
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Andrei Bocan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # 2Performant Ruby API
2
+
3
+ The API allows you to integrate any 2Performant network in your application.
4
+
5
+ Its goal is to make sure developers can implement anything that can be done via the web interface using API functions.
6
+
7
+ The API is RESTful XML over HTTP using all four verbs (GET/POST/PUT/DELETE).
8
+
9
+ The current implementation is a straight port of the PHP library, so the documentation applies, for the most part, to both libraries.
10
+
11
+ API documentation can be found at:
12
+ http://help.2performant.com/API
13
+
14
+
15
+ ## Some Examples
16
+
17
+ Interacting with 2Performant networks is very easy.
18
+
19
+
20
+ To initialize the object using simple authentication
21
+
22
+ session = TwoPerformant.new(:simple, {
23
+ :user => 'user',
24
+ :pass => 'password',
25
+ }, 'http://api.yournetwork.com')
26
+
27
+ To use oauth
28
+
29
+ tp = TwoPerformant.new(:oauth, {
30
+ :consumer_token => 'consumer_token',
31
+ :consumer_secret => 'consumer_secret',
32
+ :access_token => 'access_token',
33
+ :access_secret => 'access_secret'
34
+ }, 'http://api.yournetwork.com')
35
+
36
+
37
+ Afterwards you can call any function from the TPerformant class:
38
+
39
+ # display the last 6 received messages
40
+ p session.received_messages_list
41
+
42
+ For details about each API function the documentation can be found at:
43
+ http://help.2performant.com/API
44
+
45
+
46
+ ## Advanced Applications
47
+
48
+ You can build advanced applications using the 2Performant API and have them distributed over 2Performant App Store.
49
+
50
+ Get Started at: http://apps.2performant.com and http://help.2performant.com/Developers-Area
51
+
52
+ ## Reporting Problems
53
+
54
+ If you encounters any problems don't hesitate to contact us at:
55
+ support (at) 2performant.com
data/Rakefile ADDED
@@ -0,0 +1,55 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "douaparale"
8
+ gem.summary = %Q{Library for the 2Parale API}
9
+ gem.description = %Q{Library for the 2Parale API}
10
+ gem.email = "gems@2parale.ro"
11
+ gem.homepage = "http://github.com/2performant/2Performant"
12
+ gem.authors = ["2Parale"]
13
+ gem.add_dependency "httparty"
14
+ gem.add_dependency "oauth"
15
+ gem.add_development_dependency "shoulda", ">= 0"
16
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
+ end
22
+
23
+ require 'rake/testtask'
24
+ Rake::TestTask.new(:test) do |test|
25
+ test.libs << 'lib' << 'test'
26
+ test.pattern = 'test/**/test_*.rb'
27
+ test.verbose = true
28
+ end
29
+
30
+ begin
31
+ require 'rcov/rcovtask'
32
+ Rcov::RcovTask.new do |test|
33
+ test.libs << 'test'
34
+ test.pattern = 'test/**/test_*.rb'
35
+ test.verbose = true
36
+ end
37
+ rescue LoadError
38
+ task :rcov do
39
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
40
+ end
41
+ end
42
+
43
+ task :test => :check_dependencies
44
+
45
+ task :default => :test
46
+
47
+ require 'rake/rdoctask'
48
+ Rake::RDocTask.new do |rdoc|
49
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
50
+
51
+ rdoc.rdoc_dir = 'rdoc'
52
+ rdoc.title = "2Parale #{version}"
53
+ rdoc.rdoc_files.include('README*')
54
+ rdoc.rdoc_files.include('lib/**/*.rb')
55
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.8
@@ -0,0 +1,61 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{douaparale}
8
+ s.version = "0.0.8"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["2Parale"]
12
+ s.date = %q{2010-07-26}
13
+ s.description = %q{Library for the 2Performant API}
14
+ s.email = %q{gems@2parale.ro}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "douaparale.gemspec",
23
+ "LICENSE",
24
+ "README.md",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "lib/douaparale.rb",
28
+ "lib/douaparale/oauth.rb",
29
+ "test/helper.rb",
30
+ "test/test_2performant.rb"
31
+ ]
32
+ s.homepage = %q{http://github.com/2performant/2Performant}
33
+ s.rdoc_options = ["--charset=UTF-8"]
34
+ s.require_paths = ["lib"]
35
+ s.rubygems_version = %q{1.3.7}
36
+ s.summary = %q{Library for the 2Performant API}
37
+ s.test_files = [
38
+ "test/helper.rb",
39
+ "test/test_2performant.rb"
40
+ ]
41
+
42
+ if s.respond_to? :specification_version then
43
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
44
+ s.specification_version = 3
45
+
46
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
47
+ s.add_runtime_dependency(%q<httparty>, [">= 0"])
48
+ s.add_runtime_dependency(%q<oauth>, [">= 0"])
49
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
50
+ else
51
+ s.add_dependency(%q<httparty>, [">= 0"])
52
+ s.add_dependency(%q<oauth>, [">= 0"])
53
+ s.add_dependency(%q<shoulda>, [">= 0"])
54
+ end
55
+ else
56
+ s.add_dependency(%q<httparty>, [">= 0"])
57
+ s.add_dependency(%q<oauth>, [">= 0"])
58
+ s.add_dependency(%q<shoulda>, [">= 0"])
59
+ end
60
+ end
61
+
data/lib/douaparale.rb ADDED
@@ -0,0 +1,715 @@
1
+ require 'httparty'
2
+ require 'douaparale/oauth'
3
+
4
+ class DouaParale
5
+ include HTTParty
6
+ format :xml
7
+ headers 'Content-Type' => 'text/xml'
8
+
9
+ attr_accessor :user, :pass, :host, :version, :auth_type, :oauth, :oauth_request
10
+
11
+ def initialize(auth_type, auth_obj, host)
12
+ if auth_type == :simple
13
+ self.class.basic_auth auth_obj[:user], auth_obj[:pass]
14
+ elsif auth_type == :oauth
15
+ self.oauth = TwoPerformant::OAuth.new(auth_obj, host)
16
+ else
17
+ return false
18
+ end
19
+
20
+ self.version = "v1.0"
21
+ self.auth_type = auth_type
22
+ self.host = host
23
+ self.class.base_uri host
24
+ end
25
+
26
+ # =======
27
+ # Users
28
+ # =======
29
+ def user_show(user_id)
30
+ self.hook("/users/#{user_id}.xml", "user");
31
+ end
32
+
33
+
34
+ # Display public information about the logged in user
35
+ def user_loggedin
36
+ self.hook("/users/loggedin.xml", "user");
37
+ end
38
+
39
+ # ===========
40
+ # Campaigns
41
+ # ===========
42
+
43
+ # List campaigns. Displays the first 6 entries by default.
44
+ def campaigns_list(category_id=nil, page=1, perpage=6)
45
+ request = {
46
+ 'category_id' => category_id,
47
+ 'page' => page,
48
+ 'perpage' => perpage
49
+ }
50
+
51
+ self.hook("/campaigns.xml", "campaign", request, 'GET')
52
+ end
53
+
54
+ # Search for campaigns
55
+ def campaigns_search(search, page = 1, perpage = 6)
56
+ request = {
57
+ 'page' => page,
58
+ 'perpage' => perpage,
59
+ 'search' => search
60
+ }
61
+
62
+ self.hook("/campaigns/search.xml", "campaign", request, 'GET')
63
+ end
64
+
65
+ # Display public information about a campaign
66
+ def campaign_show(campaign_id)
67
+ self.hook("/campaigns/#{campaign_id}.xml", "campaign")
68
+ end
69
+
70
+ # Affiliates: List campaigns which have the logged in user accepted
71
+ def campaigns_listforaffiliate
72
+ self.hook("/campaigns/listforaffiliate.xml", "campaign")
73
+ end
74
+
75
+ # Merchants: List all campaigns created by the logged in user
76
+ def campaigns_listforowner
77
+ self.hook("/campaigns/listforowner.xml", "campaign")
78
+ end
79
+
80
+ # Merchants: Display complete information about a campaign (only available to owner)
81
+ def campaign_showforowner(campaign_id)
82
+ self.hook("/campaigns/#{campaign_id}/showforowner.xml", "campaign")
83
+ end
84
+
85
+ # Merchants: Update a campaign
86
+ def campaign_update(campaign_id, campaign)
87
+ request = {
88
+ 'campaign' => campaign
89
+ }
90
+ self.hook("/campaigns/#{campaign_id}.xml", "campaign", request, 'PUT')
91
+ end
92
+
93
+ # Create a Deep Link. This method was created so it wouldn't make a request for every Quick Link.
94
+ # You may need to get some data before using it.
95
+ def campaign_quicklink(campaign_id, aff_code, redirect)
96
+ url = "#{self.host}/events/click?ad_type=quicklink&aff_code=#{aff_code}&unique=#{campaign_id}&redirect_to=#{redirect}"
97
+
98
+ if (self.auth_type == :oauth)
99
+ url << "&app=#{self.oauth}"
100
+ end
101
+
102
+ url
103
+ end
104
+
105
+ # ============
106
+ # Sales
107
+ # ============
108
+
109
+ def sale_create(campaign_id, sale)
110
+ request = {
111
+ 'sale' => sale
112
+ }
113
+
114
+ self.hook("/campaigns/#{campaign_id}/sales.xml", "sale", request, "POST")
115
+ end
116
+
117
+ # ============
118
+ # Leads
119
+ # ============
120
+
121
+ def lead_create(campaign_id, lead)
122
+ request = {
123
+ 'lead' => lead
124
+ }
125
+
126
+ self.hook("/campaigns/#{campaign_id}/leads.xml", "lead", request, "POST")
127
+ end
128
+
129
+ # ============
130
+ # Affiliates
131
+ # ============
132
+
133
+ # Search for affiliates
134
+ def affiliates_search(search, page=1, perpage=6)
135
+ request = {
136
+ 'page' => page,
137
+ 'perpage' => perpage,
138
+ 'search' => search
139
+ }
140
+
141
+ self.hook("/affiliates/search.xml", "user", request, 'GET')
142
+ end
143
+
144
+ # Merchants: List affiliates approved in campaigns
145
+ def affiliates_listformerchant(campaign_id=nil)
146
+ request = {
147
+ 'campaign_id' => campaign_id
148
+ }
149
+ self.hook("/affiliates/listformerchant.xml", "user", request, 'GET')
150
+ end
151
+
152
+ # =============
153
+ # Commissions
154
+ # =============
155
+
156
+ # Search for commissions. Month: 01 to 12; Year: 20xx. Status: accepted, pending or rejected. nil if empty search.
157
+ def commissions_search(options, campaign_id=nil, month=nil, year=nil, page=1, perpage=6)
158
+ request = {
159
+ 'campaign_id' => campaign_id,
160
+ 'month' => month,
161
+ 'year' => year,
162
+ 'page' => page,
163
+ 'perpage' => perpage
164
+ }
165
+
166
+ request = request.merge(options)
167
+
168
+ self.hook("/commissions/search.xml", "commission", request, 'GET')
169
+ end
170
+
171
+ # Merchants: List commissions on campaigns. Month: 01 to 12; Year: 20xx.
172
+ def commissions_listformerchant(campaign_id, month, year)
173
+ request = {
174
+ 'campaign_id' => campaign_id,
175
+ 'month' => month,
176
+ 'year' => year
177
+ }
178
+
179
+ self.hook("/commissions/listformerchant.xml", "campaign", request, 'GET')
180
+ end
181
+
182
+ # Affiliates: List commissions on campaigns. Month: 01 to 12; Year: 20xx.
183
+ def commissions_listforaffiliate(campaign_id, month, year)
184
+ request = {
185
+ 'campaign_id' => campaign_id,
186
+ 'month' => month,
187
+ 'year' => year
188
+ }
189
+
190
+ self.hook("/commissions/listforaffiliate.xml", "commission", request, 'GET')
191
+ end
192
+
193
+ # Merchant Campaign Owner or Affiliate Commission Owner: Show information about a commission
194
+ def commission_show(commission_id)
195
+ self.hook("/commissions/#{commission_id}.xml", "commission")
196
+ end
197
+
198
+ # Merchant: Update a commission
199
+ def commission_update(commission_id, commission)
200
+ request = {
201
+ 'commission' => commission
202
+ }
203
+ self.hook("/commissions/#{commission_id}.xml", "commission", request, 'PUT')
204
+ end
205
+
206
+ # =======
207
+ # Sites
208
+ # =======
209
+
210
+ # List sites. Displays the first 6 entries by default.
211
+ def sites_list(category_id=nil, page=1, perpage=6)
212
+ request = {
213
+ 'category_id' => category_id,
214
+ 'page' => page,
215
+ 'perpage' => perpage
216
+ }
217
+
218
+ self.hook("/sites.xml", "site", request)
219
+ end
220
+
221
+ # Display information about a site
222
+ def site_show(site_id)
223
+ self.hook("/sites/#{site_id}.xml", "site")
224
+ end
225
+
226
+ # Search for sites
227
+ def sites_search(search, page=1, perpage=6)
228
+ request = {
229
+ 'page' => page,
230
+ 'perpage' => perpage,
231
+ 'search' => search
232
+ }
233
+
234
+ self.hook("/sites/search.xml", "site", request, 'GET')
235
+ end
236
+
237
+ # Affiliates: List all sites created by the logged in user
238
+ def sites_listforowner
239
+ self.hook("/sites/listforowner.xml", "site")
240
+ end
241
+
242
+ # Affiliates: Update a site
243
+ def site_update(site_id, site)
244
+ request = {
245
+ 'site' => site
246
+ }
247
+ self.hook("/sites/#{site_id}.xml", "site", request, 'PUT')
248
+ end
249
+
250
+
251
+ # Affiliates: Destroy a site
252
+ def site_destroy(site_id)
253
+ self.hook("/sites/#{site_id}.xml", "site", request, 'DELETE')
254
+ end
255
+
256
+ # ============
257
+ # Text Links
258
+ # ============
259
+
260
+ # List text links from a campaign. Displays the first 6 entries by default.
261
+ def txtlinks_list(campaign_id, page=1, perpage=6)
262
+ request = {
263
+ 'page' => page,
264
+ 'perpage' => perpage
265
+ }
266
+
267
+ self.hook("/campaigns/#{campaign_id}/txtlinks.xml", "txtlink", request, 'GET')
268
+ end
269
+
270
+ # Display information about a text link
271
+ def txtlink_show(campaign_id, txtlink_id)
272
+ self.hook("/campaigns/#{campaign_id}/txtlinks/#{txtlink_id}.xml", "txtlink")
273
+ end
274
+
275
+ # Search for text links in a campaign
276
+ def txtlinks_search(campaign_id, search, page=1, perpage=6, sort='date')
277
+ request = {
278
+ 'page' => page,
279
+ 'perpage' => perpage,
280
+ 'search' => search,
281
+ 'sort' => sort,
282
+ }
283
+
284
+ self.hook("/campaigns/#{campaign_id}/txtlinks/search.xml", "txtlink", request, 'GET')
285
+ end
286
+
287
+ #
288
+ # Merchants: Create Text Link.
289
+ #
290
+ # Txtlink must be a hash of:
291
+ # { "title" => "title",
292
+ # "url" => "url",
293
+ # "help" => "help"
294
+ # }, where "help" is optional
295
+
296
+ def txtlink_create(campaign_id, txtlink)
297
+ request = {
298
+ 'txtlink' => txtlink
299
+ }
300
+
301
+ self.hook("/campaigns/#{campaign_id}/txtlinks.xml", "txtlink", request, 'POST')
302
+ end
303
+
304
+ # Merchants: Update a text link
305
+ def txtlink_update(campaign_id, txtlink_id, txtlink)
306
+ request = {
307
+ 'txtlink' => txtlink
308
+ }
309
+ self.hook("/campaigns/#{campaign_id}/txtlinks/#{txtlink_id}.xml", "txtlink", request, 'PUT')
310
+ end
311
+
312
+ # Merchants: Destroy a text link
313
+ def txtlink_destroy(campaign_id, txtlink_id)
314
+ self.hook("/campaigns/#{campaign_id}/txtlinks/#{txtlink_id}.xml", "txtlink", nil, 'DELETE')
315
+ end
316
+
317
+ # ============
318
+ # Text Ads
319
+ # ============
320
+
321
+ # List text ads from a campaign. Displays the first 6 entries by default.
322
+ def txtads_list(campaign_id, page=1, perpage=6)
323
+ request = {
324
+ 'page' => page,
325
+ 'perpage' => perpage
326
+ }
327
+
328
+ self.hook("/campaigns/#{campaign_id}/txtads.xml", "txtad", request, 'GET')
329
+ end
330
+
331
+ # Display information about a text ad
332
+ def txtad_show(campaign_id, txtad_id)
333
+ self.hook("/campaigns/#{campaign_id}/txtads/#{txtad_id}.xml", "txtad")
334
+ end
335
+
336
+ # Search for text ads in a campaign
337
+ def txtads_search(campaign_id, search, page=1, perpage=6, sort='date')
338
+ request = {
339
+ 'page' => page,
340
+ 'perpage' => perpage,
341
+ 'search' => search,
342
+ 'sort' => sort
343
+ }
344
+
345
+ self.hook("/campaigns/#{campaign_id}/txtads/search.xml", "txtad", request, 'GET')
346
+ end
347
+
348
+ #
349
+ # Merchants: Create Text Ad.
350
+ # Txtad must be a hash of:
351
+ # { "title" => "title",
352
+ # "content" => "content",
353
+ # "url" => "url",
354
+ # "help" => "help"
355
+ # }, where "help" is optional
356
+ def txtad_create(campaign_id, txtad)
357
+ request = {
358
+ 'txtad' => txtad
359
+ }
360
+
361
+ self.hook("/campaigns/#{campaign_id}/txtads.xml", "txtad", request, 'POST')
362
+ end
363
+
364
+
365
+ # Merchants: Update a text ad
366
+ def txtad_update(campaign_id, txtad_id, txtad)
367
+ request = {
368
+ 'txtad' => txtad
369
+ }
370
+
371
+ self.hook("/campaigns/#{campaign_id}/txtads/#{txtad_id}.xml", "txtad", request, 'PUT')
372
+ end
373
+
374
+ # Merchants: Destroy a text ad
375
+ def txtad_destroy(campaign_id, txtad_id)
376
+ self.hook("/campaigns/#{campaign_id}/txtads/#{txtad_id}.xml", "txtad", nil, 'DELETE')
377
+ end
378
+
379
+ # =========
380
+ # Banners
381
+ # =========
382
+
383
+ # List banners from a campaign. Displays the first 6 entries by default.
384
+ def banners_list(campaign_id, page=1, perpage=6)
385
+ request = {
386
+ 'page' => page,
387
+ 'perpage' => perpage
388
+ }
389
+
390
+ self.hook("/campaigns/#{campaign_id}/banners.xml", "banner", request, 'GET')
391
+ end
392
+
393
+ # Display information about a banner
394
+ def banner_show(campaign_id, banner_id)
395
+ self.hook("/campaigns/#{campaign_id}/banners/#{banner_id}.xml", "banner")
396
+ end
397
+
398
+ # Search for banners in a campaign
399
+ def banners_search(campaign_id, search, page=1, perpage=6, sort='date')
400
+ request = {
401
+ 'page' => page,
402
+ 'perpage' => perpage,
403
+ 'search' => search,
404
+ 'sort' => sort
405
+ }
406
+
407
+ self.hook("/campaigns/#{campaign_id}/banners/search.xml", "banner", request, 'GET')
408
+ end
409
+
410
+ # Merchants: Create a banner
411
+ def banner_create(campaign_id, banner, banner_picture)
412
+ request = {
413
+ 'banner' => banner,
414
+ 'banner_picture' => banner_picture
415
+ }
416
+
417
+ self.hook("/campaigns/#{campaign_id}/banners.xml", "banner", request, 'POST')
418
+ end
419
+
420
+ # Merchants: Update a banner
421
+ def banner_update(campaign_id, banner_id, banner)
422
+ request = {
423
+ 'banner' => banner
424
+ }
425
+
426
+ self.hook("/campaigns/#{campaign_id}/banners/#{banner_id}.xml", "banner", request, 'PUT')
427
+ end
428
+
429
+ # Merchants: Destroy a banner
430
+ def banner_destroy(campaign_id, banner_id)
431
+ self.hook("/campaigns/#{campaign_id}/banners/#{banner_id}.xml", "banner", nil, 'DELETE')
432
+ end
433
+
434
+ # ===============
435
+ # Product Stores
436
+ # ===============
437
+
438
+ # List Product Stores from a Campaign
439
+ def product_stores_list(campaign_id)
440
+ request = {
441
+ 'campaign_id' => campaign_id
442
+ }
443
+
444
+ self.hook("/product_stores.xml", "product-store", request)
445
+ end
446
+
447
+ # Show a Product Store
448
+ def product_store_show(product_store_id)
449
+ self.hook("/product_stores/#{product_store_id}.xml", "product-store")
450
+ end
451
+
452
+ # Show Products from a Product Store
453
+ def product_store_showitems(product_store_id, category=nil, page=1, perpage=6, uniq_products=nil)
454
+ request = {
455
+ 'category' => category,
456
+ 'page' => page,
457
+ 'perpage' => perpage
458
+ }
459
+
460
+ request['uniq_products'] = uniq_products if (uniq_products)
461
+
462
+ self.hook("/product_stores/#{product_store_id}/showitems.xml", "product-store-data", request)
463
+ end
464
+
465
+ # Show a Product from a Product Store
466
+ def product_store_showitem(product_store_id, product_id)
467
+ request = {
468
+ 'product_id' => product_id
469
+ }
470
+
471
+ self.hook("/product_stores/#{product_store_id}/showitem.xml", "product-store-data", request)
472
+ end
473
+
474
+
475
+ # Search for Products in a Product Store
476
+ def product_store_products_search(campaign_id, search, product_store_id='all', category=nil, page=1, perpage=6, sort='date', uniq_products=false)
477
+ request = {
478
+ 'page' => page,
479
+ 'perpage' => perpage,
480
+ 'search' => search,
481
+ 'category' => category,
482
+ 'campaign_id' => campaign_id,
483
+ 'sort' => sort
484
+ }
485
+
486
+ request['uniq_products'] = uniq_products if uniq_products
487
+
488
+ product_store_id = 'all' if !product_store_id
489
+
490
+ self.hook("/product_stores/#{product_store_id}/searchpr.xml", "product-store-data", request, 'GET')
491
+ end
492
+
493
+ # Merchants: Update a Product Store
494
+ def product_store_update(product_store_id, product_store)
495
+ request = {
496
+ 'product_store' => product_store
497
+ }
498
+
499
+ self.hook("/product_stores/#{product_store_id}.xml", "product-store", request, 'PUT')
500
+ end
501
+
502
+ # Merchants: Destroy a Product Store
503
+ def product_store_destroy(product_store_id)
504
+ self.hook("/product_stores/#{product_store_id}.xml", "product-store", nil, 'DELETE')
505
+ end
506
+
507
+ #
508
+ # Merchants: Create a Product Store Product.
509
+ # Product Store Product must be a hash of:
510
+ # { "title" => "title",
511
+ # "description" => "desc",
512
+ # "caption" => "caption",
513
+ # "price" => "price(integer in RON)",
514
+ # "promoted" => "promoted (0 or 1)",
515
+ # "category" => "category",
516
+ # "subcategory" => "subcategory",
517
+ # "url" => "url",
518
+ # "image_url" => "url to image location",
519
+ # "prid" => "product id"
520
+ # }
521
+ def product_store_createitem(product_store_id, product)
522
+ request = {
523
+ 'product' => product
524
+ }
525
+
526
+ self.hook("/product_stores/#{product_store_id}/createitem.xml", "product-store-data", request, 'POST')
527
+ end
528
+
529
+ # Merchants: Update a product
530
+ def product_store_updateitem(product_store_id, product_id, product)
531
+ request = {
532
+ 'product' => product,
533
+ 'product_id' => product_id
534
+ }
535
+
536
+ self.hook("/product_stores/#{product_store_id}/updateitem.xml", "product-store-data", request, 'PUT')
537
+ end
538
+
539
+ # Merchants: Destroy a product
540
+ def product_store_destroyitem(product_store_id, product_id)
541
+ request = {
542
+ 'pr_id' => product_id
543
+ }
544
+
545
+ self.hook("/product_stores/#{product_store_id}/destroyitem.xml", "product-store-data", request, 'DELETE')
546
+ end
547
+
548
+ # =====================
549
+ # Affiliate Ad Groups
550
+ # =====================
551
+
552
+ # Affiliates: List Ad Groups
553
+ def ad_groups_list
554
+ self.hook("/ad_groups.xml", "ad_group", nil, "GET")
555
+ end
556
+
557
+ # Affiliates: Display information about an Ad Group
558
+ def ad_group_show(ad_group_id)
559
+ self.hook("/ad_groups/#{ad_group_id}.xml", "ad_group", nil, "GET")
560
+ end
561
+
562
+ # Affiliates: Add item to an Ad Group / Crate new Ad Group
563
+ def ad_group_createitem(group_id, tool_type, tool_id, new_group = nil)
564
+ request = {
565
+ 'group_id' => group_id,
566
+ 'new_group' => new_group,
567
+ 'tool_type' => tool_type,
568
+ 'tool_id' => tool_id
569
+ }
570
+
571
+ self.hook("/ad_groups/createitem.xml", "ad_group", request, 'POST')
572
+ end
573
+
574
+ # Affiliates: Destroy an Ad Group
575
+ def ad_group_destroy(ad_group_id)
576
+ self.hook("/ad_groups/#{ad_group_id}.xml", "ad_group", nil, "DELETE")
577
+ end
578
+
579
+ # Affiliates: Delete an Tool from a Group. tooltype is one of 'txtlink', 'txtad' or 'banner'.
580
+ def ad_group_destroyitem(ad_group_id, tool_type, tool_id)
581
+ request = {
582
+ 'tool_type' => tool_type,
583
+ 'tool_id' => tool_id
584
+ }
585
+
586
+ self.hook("/ad_groups/#{ad_group_id}/destroyitem.xml", "ad_group", request, "DELETE")
587
+ end
588
+
589
+ #=================
590
+ # Affiliate Feeds
591
+ #=================
592
+
593
+ # Affiliates: List Feeds
594
+ def feeds_list()
595
+ self.hook("/feeds.xml", "feed", nil, "GET")
596
+ end
597
+
598
+ # Affiliates: Create a Feed
599
+ def feed_create(feed)
600
+ request = {
601
+ 'feed' => feed
602
+ }
603
+
604
+ self.hook("/feeds.xml", "feed", request, 'POST')
605
+ end
606
+
607
+ # Affiliates: Update a Feed
608
+ def feed_update(feed_id, feed)
609
+ request = {
610
+ 'feed' => feed
611
+ }
612
+
613
+ self.hook("/feeds/#{feed_id}.xml", "feed", request, 'PUT')
614
+ end
615
+
616
+
617
+ # Affiliates: Destroy a Feed
618
+ def feed_destroy(feed_id)
619
+ self.hook("/feeds/#{feed_id}.xml", "feed", nil, "DELETE")
620
+ end
621
+
622
+ # ==========
623
+ # Messages
624
+ # ==========
625
+
626
+ # List received messages. Displays the first 6 entries by default.
627
+ def received_messages_list(page=1, perpage=6)
628
+ request = {
629
+ 'page' => page,
630
+ 'perpage' => perpage
631
+ }
632
+
633
+ self.hook("/messages.xml", "message", nil, "GET")
634
+ end
635
+
636
+ # List sent messages. Displays the first 6 entries by default.
637
+ def sent_messages_list(page=1, perpage=6)
638
+ request = {
639
+ 'page' => page,
640
+ 'perpage' => perpage
641
+ }
642
+
643
+ self.hook("/messages/sent.xml", "message", nil, "GET")
644
+ end
645
+
646
+ # Display information about a message
647
+ def message_show(message_id)
648
+ self.hook("/messages/#{message_id}.xml", "message")
649
+ end
650
+
651
+ # Destroy a message
652
+ def message_destroy(message_id)
653
+ self.hook("/messages/#{message_id}.xml", "message", nil, 'DELETE')
654
+ end
655
+
656
+
657
+ #=======
658
+ # Hooks
659
+ #=======
660
+
661
+ # List Hooks
662
+ def hooks_list(oauth_token_key = 'current')
663
+ hook("/oauth_clients/#{oauth_token_key}/hooks.xml", "hook", nil, 'GET')
664
+ end
665
+
666
+
667
+ # Create a Hook
668
+ def hook_create(hook, oauth_token_key = 'current')
669
+ request = {
670
+ 'hook' => hook
671
+ }
672
+
673
+ hook("/oauth_clients/#{oauth_token_key}/hooks.xml", "hook", request, 'POST')
674
+ end
675
+
676
+ # Destroy a Hook
677
+ def hook_destroy(hook_id, oauth_token_key = 'current')
678
+ hook("/oauth_clients/#{oauth_token_key}/hooks/#{hook_id}.xml", "hook", nil, 'DELETE')
679
+ end
680
+
681
+ def hook(path, expected, send = nil, method = 'GET') #:nodoc:
682
+ params = normalize_params(send, method)
683
+
684
+ if self.oauth
685
+ result = self.oauth.send(method.downcase, "/#{version}#{path}", send, params)
686
+ else
687
+ result = self.class.send(method.downcase, "/#{version}#{path}", :body => params)
688
+ end
689
+
690
+ # scrap the container
691
+ if result.respond_to? :values
692
+ result.values.first
693
+ else
694
+ result
695
+ end
696
+ end
697
+
698
+ def normalize_params(params, method)
699
+ hash_to_xml(:request => params).to_s
700
+ end
701
+
702
+ def hash_to_xml(var, document = nil)
703
+ document = REXML::Document.new if document.nil?
704
+
705
+ if var.respond_to? :keys
706
+ var.keys.each do |key|
707
+ hash_to_xml(var[key], document.add_element(key.to_s))
708
+ end
709
+ else
710
+ document.add_text(var.to_s)
711
+ end
712
+
713
+ document
714
+ end
715
+ end
@@ -0,0 +1,34 @@
1
+ require 'oauth'
2
+
3
+ class DouaParale
4
+ class OAuth
5
+ attr_accessor :access_token, :consumer
6
+
7
+ def initialize(options, host)
8
+ consumer = ::OAuth::Consumer.new(options[:consumer_token], options[:consumer_secret], {:site => host})
9
+ @access_token = ::OAuth::AccessToken.new(consumer, options[:access_token], options[:access_secret])
10
+ @headers = { 'Accept' => 'application/xml', 'Content-Type' => 'application/xml' }
11
+ end
12
+
13
+ def get(path, params_hash, params_xml)
14
+ params_hash ||= {}
15
+ response = access_token.get("#{path}?#{params_hash.to_params}")
16
+ Crack::XML.parse(response.body)
17
+ end
18
+
19
+ def post(path, params_hash, params_xml)
20
+ response = access_token.post(path, params_xml, @headers)
21
+ Crack::XML.parse(response.body)
22
+ end
23
+
24
+ def put(path, params_hash, params_xml)
25
+ response = access_token.put(path, params_xml, @headers)
26
+ Crack::XML.parse(response.body)
27
+ end
28
+
29
+ def delete(path, params)
30
+ response = access_token.delete("#{path}?#{params.to_params}")
31
+ Crack::XML.parse(response.body)
32
+ end
33
+ end
34
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require '2performant'
8
+
9
+ class Test::Unit::TestCase
10
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class Test2performant < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: douaparale
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.8
5
+ platform: ruby
6
+ authors:
7
+ - 2Parale
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2010-07-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: oauth
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: shoulda
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Library for the 2Performant API
56
+ email: gems@2parale.ro
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files:
60
+ - LICENSE
61
+ - README.md
62
+ files:
63
+ - .document
64
+ - .gitignore
65
+ - LICENSE
66
+ - README.md
67
+ - Rakefile
68
+ - VERSION
69
+ - douaparale.gemspec
70
+ - lib/douaparale.rb
71
+ - lib/douaparale/oauth.rb
72
+ - test/helper.rb
73
+ - test/test_2performant.rb
74
+ homepage: http://github.com/2performant/2Performant
75
+ licenses: []
76
+ metadata: {}
77
+ post_install_message:
78
+ rdoc_options:
79
+ - --charset=UTF-8
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubyforge_project:
94
+ rubygems_version: 2.2.2
95
+ signing_key:
96
+ specification_version: 3
97
+ summary: Library for the 2Performant API
98
+ test_files:
99
+ - test/helper.rb
100
+ - test/test_2performant.rb