zanox 0.1.0 → 0.2.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/README.textile +6 -0
- data/Rakefile +72 -0
- data/lib/zanox.rb +261 -23
- data/spec/zanox_specs.rb +55 -0
- data/test/zanox_tests.rb +12 -0
- data/zanox.gemspec +35 -0
- metadata +83 -48
- data/License.txt +0 -20
- data/README.txt +0 -82
- data/lib/zanox/zanox_base.rb +0 -48
- data/lib/zanox/zanox_json.rb +0 -19
- data/lib/zanox/zanox_soap.rb +0 -581
- data/lib/zanox/zanox_xml.rb +0 -552
data/README.textile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
include Config
|
3
|
+
|
4
|
+
task :default => [:test]
|
5
|
+
|
6
|
+
case CONFIG['host_os']
|
7
|
+
when /mswin|windows/i
|
8
|
+
# Windows
|
9
|
+
$windows = true
|
10
|
+
when /linux/i
|
11
|
+
# Linux
|
12
|
+
$linux = true
|
13
|
+
when /sunos|solaris/i
|
14
|
+
# Solaris
|
15
|
+
$solaris = true
|
16
|
+
else
|
17
|
+
# Whatever
|
18
|
+
$mac = true
|
19
|
+
end
|
20
|
+
|
21
|
+
$gem_name = "zanox"
|
22
|
+
|
23
|
+
desc "Test the library"
|
24
|
+
task :test do
|
25
|
+
ruby Dir.glob("test/*")
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Run specs"
|
29
|
+
task :spec do
|
30
|
+
sh "spec spec/* --format specdoc --color"
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "Build the gem"
|
34
|
+
task :build do
|
35
|
+
sh "gem build #$gem_name.gemspec"
|
36
|
+
if windows?
|
37
|
+
sh "move /Y *.gem ./pkg"
|
38
|
+
else
|
39
|
+
sh "mv #$gem_name*.gem ./pkg"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "Install the library at local machine"
|
44
|
+
task :install => :build do
|
45
|
+
if windows?
|
46
|
+
sh "gem install ./pkg/#$gem_name -l"
|
47
|
+
else
|
48
|
+
sh "sudo gem install ./pkg/#$gem_name -l"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
desc "Uninstall the library from local machine"
|
53
|
+
task :uninstall do
|
54
|
+
if windows?
|
55
|
+
sh "gem uninstall #$gem_name"
|
56
|
+
else
|
57
|
+
sh "sudo gem uninstall #$gem_name"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
desc "Reinstall the library in the local machine"
|
62
|
+
task :reinstall => [:uninstall, :install] do
|
63
|
+
end
|
64
|
+
|
65
|
+
desc "Clean"
|
66
|
+
task :clean do
|
67
|
+
# sh "rm #$gem_name*.gem"
|
68
|
+
end
|
69
|
+
|
70
|
+
def windows?
|
71
|
+
!!$windows
|
72
|
+
end
|
data/lib/zanox.rb
CHANGED
@@ -1,34 +1,272 @@
|
|
1
|
-
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
-
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
-
|
4
1
|
require 'rubygems'
|
5
|
-
require 'active_support'
|
6
|
-
|
7
|
-
require 'zanox/zanox_base'
|
8
|
-
require 'zanox/zanox_xml'
|
9
|
-
require 'zanox/zanox_json'
|
10
|
-
require 'zanox/zanox_soap'
|
11
2
|
|
12
|
-
# Module to encapsule the Zanox API.
|
13
3
|
module Zanox
|
4
|
+
module API
|
5
|
+
require 'soap/wsdlDriver'
|
6
|
+
require 'base64'
|
7
|
+
require 'hmac-sha1'
|
8
|
+
require 'digest/md5'
|
9
|
+
|
10
|
+
class AuthError < ArgumentError; end
|
11
|
+
|
12
|
+
attr_accessor :connect_id
|
13
|
+
attr_accessor :secret_key
|
14
|
+
attr_accessor :wsdl
|
15
|
+
|
16
|
+
def self.request(method, options)
|
17
|
+
puts method + " " + options.inspect if $DEBUG
|
18
|
+
|
19
|
+
options.merge!(:connectId=>Zanox::API.connect_id)
|
20
|
+
|
21
|
+
raise AuthError, "Missing connect id. Try calling Zanox::API.authenticate('your connect id', 'your secret key') before your requests", caller[caller.length - 1] if !!options[:connect_id]
|
22
|
+
|
23
|
+
wsdl = 'http://api.zanox.com/wsdl/2009-07-01/' unless !!wsdl
|
24
|
+
$driver = SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver unless !!$driver
|
25
|
+
$driver.wiredump_dev = STDOUT if $DEBUG
|
26
|
+
$driver.options['protocol.http.ssl_config.verify_mode'] = OpenSSL::SSL::VERIFY_NONE if $DEBUG
|
27
|
+
$driver.method(method.to_sym).call(options)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.generate_nonce
|
31
|
+
mt = Time.new.usec
|
32
|
+
rand = rand()
|
33
|
+
Digest::MD5.hexdigest((mt + rand).to_s)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.get_timestamp
|
37
|
+
Time.new.gmtime.strftime("%Y-%m-%dT%H:%M:%S.000Z")
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.create_signature(secret_key, string2sign)
|
41
|
+
signature = Base64.encode64(HMAC::SHA1.new(secret_key).update(string2sign).digest)[0..-2]
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.authenticate(connect_id, secret_key=nil)
|
45
|
+
#todo: real session request with connect flow
|
46
|
+
@connect_id = connect_id
|
47
|
+
@secret_key = secret_key
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
51
|
+
self.instance_methods.each do |method|
|
52
|
+
module_function method.to_sym
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
module Item
|
57
|
+
attr_accessor :id
|
14
58
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
59
|
+
def new(item=nil)
|
60
|
+
item.extend(self)
|
61
|
+
item.id= item.xmlattr_id
|
62
|
+
return item
|
63
|
+
end
|
64
|
+
|
65
|
+
def find_every(options)
|
66
|
+
items = []
|
67
|
+
class_name = self.name.split('::').last
|
68
|
+
api_method = 'get'+self.pluralize
|
69
|
+
timestamp = Zanox::API.get_timestamp
|
70
|
+
nonce = Zanox::API.generate_nonce
|
71
|
+
|
72
|
+
signature = Zanox::API.create_signature(Zanox::API.secret_key, "publisherservice"+api_method.downcase + timestamp + nonce)
|
73
|
+
options.merge!(:timestamp=>timestamp, :nonce=>nonce, :signature=>signature)
|
74
|
+
|
75
|
+
response = Zanox::API.request(api_method, options)
|
76
|
+
|
77
|
+
m1_name = (class_name.downcase+'Items').to_sym
|
78
|
+
m2_name = (class_name.downcase+'Item').to_sym
|
79
|
+
|
80
|
+
if(response.respond_to?(m1_name))
|
81
|
+
items_object = response.method(m1_name).call
|
82
|
+
if(items_object.respond_to?(m2_name))
|
83
|
+
item_object = items_object.method(m2_name).call
|
84
|
+
if(item_object.is_a?(Array))
|
85
|
+
item_list = item_object
|
86
|
+
else
|
87
|
+
item_list = [item_object]
|
88
|
+
end
|
89
|
+
[*item_object].each do |item|
|
90
|
+
items.push self.new(item)
|
91
|
+
end
|
92
|
+
end
|
27
93
|
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def find_other(args, options)
|
97
|
+
ids = []
|
98
|
+
queries = []
|
99
|
+
items = []
|
100
|
+
args.each do |arg|
|
101
|
+
self.is_key?(arg) ? ids.push(arg) : queries.push(arg)
|
102
|
+
end
|
103
|
+
|
104
|
+
puts "found ids: "+ids.to_s if $DEBUG
|
105
|
+
puts "found query strings: "+queries.to_s if $DEBUG
|
106
|
+
|
107
|
+
class_name = self.name.split('::').last
|
108
|
+
api_method = ''
|
109
|
+
timestamp = Zanox::API.get_timestamp
|
110
|
+
nonce = Zanox::API.generate_nonce
|
111
|
+
|
112
|
+
if(ids.size>0)
|
113
|
+
api_method = 'get'+class_name.capitalize
|
114
|
+
signature = Zanox::API.create_signature(Zanox::API.secret_key, "publisherservice"+api_method.downcase + timestamp + nonce)
|
115
|
+
options.merge!(:timestamp=>timestamp, :nonce=>nonce, :signature=>signature)
|
28
116
|
|
29
|
-
|
117
|
+
ids.each do |id|
|
118
|
+
options.merge!(self.key_symbol=>id)
|
119
|
+
response = Zanox::API.request(api_method, options)
|
120
|
+
item = self.new(response.method((class_name.downcase+'Item').to_sym).call)
|
121
|
+
items.push item
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
if(queries.size>0)
|
126
|
+
api_method = 'search'+self.pluralize
|
127
|
+
|
128
|
+
queries.each do |query|
|
129
|
+
options.merge!(:query=>query)
|
130
|
+
response = Zanox::API.request(api_method, options)
|
131
|
+
m1_name = (class_name.downcase+'Items').to_sym
|
132
|
+
m2_name = (class_name.downcase+'Item').to_sym
|
133
|
+
|
134
|
+
if(response.respond_to?(m1_name))
|
135
|
+
items_object = response.method(m1_name).call
|
136
|
+
if(items_object.respond_to?(m2_name))
|
137
|
+
item_object = items_object.method(m2_name).call
|
138
|
+
if(item_object.is_a?(Array))
|
139
|
+
item_list = item_object
|
140
|
+
else
|
141
|
+
item_list = [item_object]
|
142
|
+
end
|
143
|
+
[*item_object].each do |item|
|
144
|
+
items.push self.new(item)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
items
|
30
152
|
end
|
31
153
|
|
154
|
+
def find(*args)
|
155
|
+
|
156
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
157
|
+
|
158
|
+
puts "Arguments: " + args.inspect if $DEBUG
|
159
|
+
puts "Options: " + options.inspect if $DEBUG
|
160
|
+
|
161
|
+
case args.first
|
162
|
+
when :all then find_every(options)
|
163
|
+
when nil then find_every(options)
|
164
|
+
else find_other(args, options)
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
module Program
|
171
|
+
include Item
|
172
|
+
extend Item
|
173
|
+
|
174
|
+
def self.key_symbol
|
175
|
+
:programId
|
176
|
+
end
|
177
|
+
|
178
|
+
def self.pluralize
|
179
|
+
"Programs"
|
180
|
+
end
|
181
|
+
|
182
|
+
def self.is_key?(id)
|
183
|
+
id.to_s[/[0-9]{3,6}/] ? true : false
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
module Admedium
|
188
|
+
include Item
|
189
|
+
extend Item
|
190
|
+
|
191
|
+
def self.key_symbol
|
192
|
+
:admediumId
|
193
|
+
end
|
194
|
+
|
195
|
+
def self.pluralize
|
196
|
+
"Admedia"
|
197
|
+
end
|
198
|
+
|
199
|
+
def self.is_key?(id)
|
200
|
+
id.to_s[/[0-9]{3,6}/] ? true : false
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
module Product
|
205
|
+
include Item
|
206
|
+
extend Item
|
207
|
+
|
208
|
+
def self.key_symbol
|
209
|
+
:zupId
|
210
|
+
end
|
211
|
+
|
212
|
+
def self.pluralize
|
213
|
+
"Products"
|
214
|
+
end
|
215
|
+
|
216
|
+
def self.is_key?(id)
|
217
|
+
id.to_s[/[0-9A-Fa-f]{32}/] ? true : false
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
module Adspace
|
222
|
+
include Item
|
223
|
+
extend Item
|
224
|
+
|
225
|
+
def self.key_symbol
|
226
|
+
:adspaceId
|
227
|
+
end
|
228
|
+
|
229
|
+
def self.pluralize
|
230
|
+
"Adspaces"
|
231
|
+
end
|
232
|
+
|
233
|
+
def self.is_key?(id)
|
234
|
+
id.to_s[/[0-9]/] ? true : false
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
module Sale
|
239
|
+
include Item
|
240
|
+
extend Item
|
241
|
+
|
242
|
+
def self.key_symbol
|
243
|
+
:saleId
|
244
|
+
end
|
245
|
+
|
246
|
+
def self.pluralize
|
247
|
+
"Sales"
|
248
|
+
end
|
249
|
+
|
250
|
+
def self.is_key?(id)
|
251
|
+
id.to_s[/[0-9]/] ? true : false
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
module Lead
|
256
|
+
include Item
|
257
|
+
extend Item
|
258
|
+
|
259
|
+
def self.key_symbol
|
260
|
+
:leadId
|
261
|
+
end
|
262
|
+
|
263
|
+
def self.pluralize
|
264
|
+
"Leads"
|
265
|
+
end
|
266
|
+
|
267
|
+
def self.is_key?(id)
|
268
|
+
id.to_s[/[0-9]/] ? true : false
|
269
|
+
end
|
32
270
|
end
|
33
271
|
|
34
272
|
end
|
data/spec/zanox_specs.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__),"..","lib","zanox.rb")
|
2
|
+
|
3
|
+
describe Zanox::API do
|
4
|
+
|
5
|
+
# authenticate
|
6
|
+
TEST_CONNECT_ID = "your connect id here"
|
7
|
+
TEST_SECRET_KEY = "your secret key here"
|
8
|
+
|
9
|
+
before(:all) do
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should authenticate a developer" do
|
13
|
+
Zanox::API.authenticate(TEST_CONNECT_ID, TEST_SECRET_KEY).should == true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe Zanox::Product do
|
18
|
+
# Product.find
|
19
|
+
TEST_PRODUCT_QUERY = "ipod"
|
20
|
+
TEST_PRODUCT_ID = "afdd090e0ee25e796e5146f6fcd7b15e"
|
21
|
+
|
22
|
+
it "should find products by a keyword" do
|
23
|
+
Zanox::Product.find(TEST_PRODUCT_QUERY).size.should >= 1
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should find a specific product by its id" do
|
27
|
+
Zanox::Product.find(TEST_PRODUCT_ID).size.should == 1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe Zanox::Program do
|
32
|
+
# Program.find
|
33
|
+
TEST_PROGRAM_QUERY = "Amazon"
|
34
|
+
TEST_PROGRAM_ID = "1648"
|
35
|
+
|
36
|
+
it "should find programs by a keyword" do
|
37
|
+
Zanox::Program.find(TEST_PROGRAM_QUERY).size.should >= 1
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should find a specific program by its id" do
|
41
|
+
Zanox::Program.find(TEST_PROGRAM_ID).size.should == 1
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe Zanox::Adspace do
|
46
|
+
# Adspace.find
|
47
|
+
TEST_ADSPACE_ID = "1289612"
|
48
|
+
|
49
|
+
it "should find all user's Adspaces" do
|
50
|
+
Zanox::Adspace.find(:all).size.should >=1
|
51
|
+
end
|
52
|
+
it "should find the users Adspace by an id" do
|
53
|
+
Zanox::Adspace.find(TEST_ADSPACE_ID).size.should == 1
|
54
|
+
end
|
55
|
+
end
|
data/test/zanox_tests.rb
ADDED
data/zanox.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# require 'rubygems'
|
2
|
+
# require 'rubygems/gem_runner'
|
3
|
+
# #Gem.manage_gems
|
4
|
+
# require 'rake/gempackagetask'
|
5
|
+
require 'rake'
|
6
|
+
|
7
|
+
spec = Gem::Specification.new do |s|
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.name = %q{zanox}
|
10
|
+
s.version = "0.2.0"
|
11
|
+
s.authors = ["Krispin Schulz"]
|
12
|
+
s.homepage = %q{http://kr1sp1n.com/}
|
13
|
+
s.date = %q{2010-05-07}
|
14
|
+
s.email = %q{krispinone@googlemail.com}
|
15
|
+
s.summary = %q{One gem to rule the zanox web services.}
|
16
|
+
s.description = %q{The easy way to the zanox web services.}
|
17
|
+
s.files = FileList['Rakefile', 'zanox.gemspec', 'README.textile', 'lib/**/*', 'test/*', 'spec/*'].to_a
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
s.rubygems_version = %q{1.3.5}
|
20
|
+
s.test_files = Dir.glob("{test, spec}/**/*")
|
21
|
+
# include README while generating rdoc
|
22
|
+
s.rdoc_options = ["--main", "README.textile"]
|
23
|
+
s.has_rdoc = true
|
24
|
+
s.extra_rdoc_files = ["README.textile"]
|
25
|
+
s.add_dependency("soap4r",">=1.5.8")
|
26
|
+
s.add_dependency("ruby-hmac", ">=0.4.0")
|
27
|
+
end
|
28
|
+
|
29
|
+
# Rake::GemPackageTask.new(spec) do |pkg|
|
30
|
+
# pkg.need_tar = true
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# task :default => "pkg/#{spec.name}-#{spec.version}.gem" do
|
34
|
+
# puts "generated latest version"
|
35
|
+
# end
|