SuperRewards 0.5.1
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/History.txt +5 -0
- data/Manifest.txt +9 -0
- data/README.txt +50 -0
- data/Rakefile +18 -0
- data/bin/super_rewards +0 -0
- data/lib/super_rewards.rb +13 -0
- data/lib/super_rewards/client.rb +53 -0
- data/lib/super_rewards/parser.rb +68 -0
- data/test/test_super_rewards.rb +110 -0
- metadata +65 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/README.txt
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
SuperRewards
|
2
|
+
by Shane Vitarana
|
3
|
+
http://shanesbrain.net
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
A Ruby client for the Super Rewards API by KITN Media
|
8
|
+
|
9
|
+
== FEATURES/PROBLEMS:
|
10
|
+
|
11
|
+
* Aims to implement all the functionality of the Super Rewards PHP client
|
12
|
+
|
13
|
+
== SYNOPSIS:
|
14
|
+
|
15
|
+
offer_code = SuperRewards::Client.offers_display(:iframe, uid)
|
16
|
+
points = SuperRewards::Client.get_points(uids).first.user.points
|
17
|
+
|
18
|
+
== REQUIREMENTS:
|
19
|
+
|
20
|
+
* API / Secret keys for the Super Rewards service
|
21
|
+
* Shoulda gem (for testing)
|
22
|
+
|
23
|
+
== INSTALL:
|
24
|
+
|
25
|
+
* sudo gem install super_rewards
|
26
|
+
|
27
|
+
== LICENSE:
|
28
|
+
|
29
|
+
(The MIT License)
|
30
|
+
|
31
|
+
Copyright (c) 2007 Shane Vitarana
|
32
|
+
|
33
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
34
|
+
a copy of this software and associated documentation files (the
|
35
|
+
'Software'), to deal in the Software without restriction, including
|
36
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
37
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
38
|
+
permit persons to whom the Software is furnished to do so, subject to
|
39
|
+
the following conditions:
|
40
|
+
|
41
|
+
The above copyright notice and this permission notice shall be
|
42
|
+
included in all copies or substantial portions of the Software.
|
43
|
+
|
44
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
45
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
46
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
47
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
48
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
49
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
50
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
require './lib/super_rewards.rb'
|
6
|
+
|
7
|
+
Hoe.new('SuperRewards', SuperRewards::VERSION) do |p|
|
8
|
+
p.rubyforge_name = 'superrewards'
|
9
|
+
p.author = 'Shane Vitarana'
|
10
|
+
p.email = 'shanev@gmail.com'
|
11
|
+
p.summary = 'A Ruby client for the Super Rewards web service'
|
12
|
+
p.description = 'A Ruby client for the Super Rewards web service'
|
13
|
+
p.url = 'http://shanesbrain.net'
|
14
|
+
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
15
|
+
p.remote_rdoc_dir = ''
|
16
|
+
end
|
17
|
+
|
18
|
+
# vim: syntax=Ruby
|
data/bin/super_rewards
ADDED
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'rexml/document'
|
3
|
+
require 'lib/super_rewards/parser'
|
4
|
+
require 'lib/super_rewards/client'
|
5
|
+
|
6
|
+
module SuperRewards
|
7
|
+
VERSION = '0.5.1'
|
8
|
+
|
9
|
+
SUPERREWARDS_API_KEY = "gsdf7g987sdg987dsfg897sd9g87sdf98g7dfs"
|
10
|
+
SUPERREWARDS_SECRET_KEY = "adsfasdf908asdf908asdf09a8dsf09ad8sf09ads8"
|
11
|
+
SUPERREWARDS_ENDPOINT = "http://apps.kitnmedia.com/superrewards/service.php"
|
12
|
+
SUPERREWARDS_VERSION = "1.0"
|
13
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module SuperRewards
|
2
|
+
class Client
|
3
|
+
def self.get_required_fields(uid)
|
4
|
+
instance.post('superrewards.users.getRequiredFields', :uid => uid)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.offers_display(mode, uid, user_info=nil)
|
8
|
+
if user_info
|
9
|
+
instance.post('superrewards.offers.display', :display_mode => mode.to_s, :uid => uid, :user_info => user_info)
|
10
|
+
else
|
11
|
+
instance.post('superrewards.offers.display', :display_mode => mode.to_s, :uid => uid)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.get_points(uids)
|
16
|
+
instance.post('superrewards.users.getPoints', :uids => uids.join(','))
|
17
|
+
end
|
18
|
+
|
19
|
+
def post(method, params = {})
|
20
|
+
params[:method] = method
|
21
|
+
params[:api_key] = SUPERREWARDS_API_KEY
|
22
|
+
params[:version] = SUPERREWARDS_VERSION
|
23
|
+
service.post(params.merge(:sig => signature_for(params)))
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.instance
|
27
|
+
@instance ||= self.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def service
|
31
|
+
@service ||= Service.new
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
def signature_for(params)
|
36
|
+
raw_string = params.inject([]) do |collection, pair|
|
37
|
+
collection << pair.join("=")
|
38
|
+
collection
|
39
|
+
end.sort.join
|
40
|
+
Digest::MD5.hexdigest([SUPERREWARDS_SECRET_KEY, raw_string].join)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Service
|
45
|
+
def post(params)
|
46
|
+
Parser.parse(params[:method], Net::HTTP.post_form(url, params))
|
47
|
+
end
|
48
|
+
private
|
49
|
+
def url
|
50
|
+
URI.parse(SUPERREWARDS_ENDPOINT)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module SuperRewards
|
2
|
+
class Parser
|
3
|
+
module REXMLElementExtensions
|
4
|
+
def text_value
|
5
|
+
self.children.first.to_s.strip
|
6
|
+
end
|
7
|
+
end
|
8
|
+
::REXML::Element.__send__(:include, REXMLElementExtensions)
|
9
|
+
|
10
|
+
def self.parse(method, data)
|
11
|
+
parser = Parser::PARSERS[method]
|
12
|
+
parser.process(data)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.element(name, data)
|
16
|
+
data = data.body rescue data # either data or an HTTP response
|
17
|
+
doc = REXML::Document.new(data)
|
18
|
+
doc.elements.each(name) do |element|
|
19
|
+
return element
|
20
|
+
end
|
21
|
+
raise "Element #{name} not found in #{data}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class GetRequiredFields < Parser
|
26
|
+
def self.process(data)
|
27
|
+
fields = element('users_getRequiredFields_response', data).text_value
|
28
|
+
fields.split(',').map { |f| f.to_sym }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class OffersDisplay < Parser
|
33
|
+
def self.process(data)
|
34
|
+
element('offers_display_response', data).text_value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class User
|
39
|
+
attr_accessor :uid, :points
|
40
|
+
end
|
41
|
+
|
42
|
+
class GetPoints < Parser
|
43
|
+
def self.process(data)
|
44
|
+
users = []
|
45
|
+
data = data.body rescue data # either data or an HTTP response
|
46
|
+
doc = REXML::Document.new(data)
|
47
|
+
doc.elements.each("users_getPoints_response/user") do |element|
|
48
|
+
user = User.new
|
49
|
+
element.each_element("uid") do |uid_element|
|
50
|
+
user.uid = uid_element.get_text.to_s
|
51
|
+
end
|
52
|
+
element.each_element("points") do |points_element|
|
53
|
+
user.points = points_element.get_text.to_s.to_i
|
54
|
+
end
|
55
|
+
users << user
|
56
|
+
end
|
57
|
+
users
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class Parser
|
62
|
+
PARSERS = {
|
63
|
+
'superrewards.users.getRequiredFields' => GetRequiredFields,
|
64
|
+
'superrewards.offers.display' => OffersDisplay,
|
65
|
+
'superrewards.users.getPoints' => GetPoints
|
66
|
+
}
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'digest/md5'
|
3
|
+
require 'cgi'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'shoulda'
|
6
|
+
require 'super_rewards'
|
7
|
+
|
8
|
+
class TestSuperRewards < Test::Unit::TestCase
|
9
|
+
|
10
|
+
TEST_UID = "1342314"
|
11
|
+
|
12
|
+
context "Using curl" do
|
13
|
+
setup do
|
14
|
+
@params = {}
|
15
|
+
@params[:api_key] = SuperRewards::SUPERREWARDS_API_KEY
|
16
|
+
@params[:version] = SuperRewards::SUPERREWARDS_VERSION
|
17
|
+
end
|
18
|
+
|
19
|
+
context "for a single user" do
|
20
|
+
setup do
|
21
|
+
@params[:uid] = TEST_UID
|
22
|
+
end
|
23
|
+
|
24
|
+
should "get required fields" do
|
25
|
+
@params[:method] = "superrewards.users.getRequiredFields"
|
26
|
+
out = `curl -d "#{curl_params}" #{SuperRewards::SUPERREWARDS_ENDPOINT}`
|
27
|
+
assert_equal "<?xml version=\"1.0\" encoding=\"UTF-8\"?><users_getRequiredFields_response>affiliations,birthday,sex,meeting_for</users_getRequiredFields_response>", out
|
28
|
+
end
|
29
|
+
|
30
|
+
should "get offer display code" do
|
31
|
+
@params[:method] = "superrewards.offers.display"
|
32
|
+
@params[:display_mode] = "iframe"
|
33
|
+
# TODO: sending the XML user_info always gives us an invalid signature
|
34
|
+
# @params[:user_info] = CGI.escape(user_info.to_s)
|
35
|
+
out = `curl -d "#{curl_params}" #{SuperRewards::SUPERREWARDS_ENDPOINT}`
|
36
|
+
assert_match(/<offers_display_response>/, out)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
should "get points for the given users" do
|
41
|
+
@params[:method] = "superrewards.users.getPoints"
|
42
|
+
@params[:uids] = TEST_UID
|
43
|
+
out = `curl -d "#{curl_params}" #{SuperRewards::SUPERREWARDS_ENDPOINT}`
|
44
|
+
assert_match(/users_getPoints_response list=\"true\"/, out)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "Using SuperRewards Ruby API" do
|
49
|
+
should "get required fields" do
|
50
|
+
fields = SuperRewards::Client.get_required_fields(TEST_UID)
|
51
|
+
[ :affiliations, :birthday, :sex, :meeting_for ].each do |field|
|
52
|
+
assert fields.include?(field)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
should "get offer display code" do
|
57
|
+
offer_code = SuperRewards::Client.offers_display(:iframe, TEST_UID, nil)
|
58
|
+
assert_match(/offers.php/, offer_code)
|
59
|
+
end
|
60
|
+
|
61
|
+
should "get points for the given users" do
|
62
|
+
uids = [TEST_UID, "1234"]
|
63
|
+
users = SuperRewards::Client.get_points(uids)
|
64
|
+
assert_equal TEST_UID, users.first.uid
|
65
|
+
assert_equal 0, users.first.points
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
def curl_params
|
71
|
+
@params.map { |k,v| "#{k}=#{v}" }.join('&') + "&sig=#{signature_for(@params)}"
|
72
|
+
end
|
73
|
+
|
74
|
+
def signature_for(params)
|
75
|
+
raw_string = params.inject([]) do |collection, pair|
|
76
|
+
collection << pair.join("=")
|
77
|
+
collection
|
78
|
+
end.sort.join
|
79
|
+
Digest::MD5.hexdigest([SuperRewards::SUPERREWARDS_SECRET_KEY, raw_string].join)
|
80
|
+
end
|
81
|
+
|
82
|
+
def user_info
|
83
|
+
xml =<<EOF
|
84
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
85
|
+
<users_getInfo_response xmlns='http://api.facebook.com/1.0/'
|
86
|
+
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
|
87
|
+
xsi:schemaLocation='http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd' list='true'>
|
88
|
+
<user>
|
89
|
+
<uid>8055</uid>
|
90
|
+
<affiliations list='true'>
|
91
|
+
<affiliation>
|
92
|
+
<nid>50453093</nid>
|
93
|
+
<name>Facebook Developers</name>
|
94
|
+
<type>work</type>
|
95
|
+
<status/>
|
96
|
+
<year/>
|
97
|
+
</affiliation>
|
98
|
+
</affiliations>
|
99
|
+
<birthday>November 3</birthday>
|
100
|
+
<meeting_for list='true'>
|
101
|
+
<seeking>Friendship</seeking>
|
102
|
+
</meeting_for>
|
103
|
+
<sex>male</sex>
|
104
|
+
</user>
|
105
|
+
</users_getInfo_response>
|
106
|
+
EOF
|
107
|
+
xml.gsub!(/[\t\r\n]/,'')
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
metadata
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.4
|
3
|
+
specification_version: 1
|
4
|
+
name: SuperRewards
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.5.1
|
7
|
+
date: 2007-12-17 00:00:00 -06:00
|
8
|
+
summary: A Ruby client for the Super Rewards web service
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: shanev@gmail.com
|
12
|
+
homepage: http://shanesbrain.net
|
13
|
+
rubyforge_project: superrewards
|
14
|
+
description: A Ruby client for the Super Rewards web service
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Shane Vitarana
|
31
|
+
files:
|
32
|
+
- History.txt
|
33
|
+
- Manifest.txt
|
34
|
+
- README.txt
|
35
|
+
- Rakefile
|
36
|
+
- bin/super_rewards
|
37
|
+
- lib/super_rewards.rb
|
38
|
+
- lib/super_rewards/client.rb
|
39
|
+
- lib/super_rewards/parser.rb
|
40
|
+
- test/test_super_rewards.rb
|
41
|
+
test_files:
|
42
|
+
- test/test_super_rewards.rb
|
43
|
+
rdoc_options:
|
44
|
+
- --main
|
45
|
+
- README.txt
|
46
|
+
extra_rdoc_files:
|
47
|
+
- History.txt
|
48
|
+
- Manifest.txt
|
49
|
+
- README.txt
|
50
|
+
executables:
|
51
|
+
- super_rewards
|
52
|
+
extensions: []
|
53
|
+
|
54
|
+
requirements: []
|
55
|
+
|
56
|
+
dependencies:
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: hoe
|
59
|
+
version_requirement:
|
60
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 1.3.0
|
65
|
+
version:
|