punchtab 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.
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .rvmrc
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
3
+ ## 0.0.1 - 05/07/2013
4
+ * Initial version
5
+
6
+ ## 0.1.0 - 05/24/2013
7
+ * All APIs methods covered
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Rupak Ganguly
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.
@@ -0,0 +1,317 @@
1
+ # punchtab
2
+
3
+ Ruby wrapper for [PunchTab API](http://www.punchtab.com/developer-docs), the world's first instant loyalty platform.
4
+
5
+ ## Installation
6
+
7
+ ```
8
+ gem install punchtab
9
+ ```
10
+
11
+ ## Prerequisites
12
+
13
+ 1. Get a developer account at [PunchTab](http://www.punchtab.com).
14
+ 2. Make sure your PunchTab account is enabled for SSO authentication. Do so, by going to the developer account page,
15
+ and checking the 'Single Sign On (SSO)' checkbox.
16
+
17
+ ![Enable SSO authentication for PunchTab account](punchtab-enable-sso.png "Enable SSO authentication for PunchTab account")
18
+
19
+ ## Getting Started
20
+
21
+ ### Authenticate using Single Sign On (SSO)
22
+
23
+ ```ruby
24
+ # authenticate with PunchTab
25
+ client = Punchtab::Client.new(
26
+ :client_id => 'your client_id',
27
+ :access_key => 'your access_key',
28
+ :secret_key => 'your secret_key',
29
+ :domain => 'www.mydomain.com',
30
+ :user_info => {
31
+ :first_name => 'your first_name',
32
+ :last_name => 'your last_name',
33
+ :email => 'me@mydomain.com'}
34
+ )
35
+ # if authentication is successful, you should get an access token back
36
+ puts "Access Token: #{client.access_token}"
37
+
38
+ # if authentication fails, an exception is thrown
39
+
40
+ ```
41
+ > Note: You can get all of the above values from your Punchtab [developer account page](https://www.punchtab.com/account/).
42
+
43
+ ### Authentication
44
+
45
+ ```ruby
46
+ # check authentication status
47
+ client.status
48
+ => {"status"=>"connected",
49
+ "authResponse"=>
50
+ {"userID"=>"111111_1111",
51
+ "uid"=>"111111",
52
+ "accessToken"=>"ed17a5f0ad9e52db0576f39602083dc7"}}
53
+ ```
54
+
55
+ ```ruby
56
+ # logout
57
+ client.logout
58
+ => {"status"=>"disconnected"}
59
+ ```
60
+
61
+ ### Activity
62
+
63
+ ```ruby
64
+ # get all activities
65
+ client.get_activity
66
+ => [{"domain"=>"www.webintellix.com",
67
+ "display_name"=>"Webintellix",
68
+ "name"=>"comment",
69
+ "referrer"=>"http://www.webintellix.com",
70
+ "points"=>600,
71
+ "date_created"=>"2013-05-23 06:37:54",
72
+ "_id"=>"xxxxxxxxxxxxxxxxxx",
73
+ "publisher_id"=>2222},
74
+ {"domain"=>"www.webintellix.com",
75
+ "display_name"=>"Webintellix",
76
+ "name"=>"comment",
77
+ "referrer"=>"http://www.webintellix.com",
78
+ "points"=>600,
79
+ "date_created"=>"2013-05-22 04:50:53",
80
+ "_id"=>"xxxxxxxxxxxxxxxxxx",
81
+ "publisher_id"=>2222},
82
+ {"domain"=>"www.webintellix.com",
83
+ "display_name"=>"Webintellix",
84
+ "name"=>"plusone",
85
+ "referrer"=>"http://www.webintellix.com",
86
+ "points"=>500,
87
+ "date_created"=>"2013-05-22 03:36:13",
88
+ "_id"=>"xxxxxxxxxxxxxxxxxx",
89
+ "publisher_id"=>2222},
90
+ {"domain"=>"www.webintellix.com",
91
+ "display_name"=>"Webintellix",
92
+ "name"=>"like",
93
+ "referrer"=>"http://www.webintellix.com",
94
+ "points"=>400,
95
+ "date_created"=>"2013-05-22 02:58:27",
96
+ "_id"=>"xxxxxxxxxxxxxxxxxx",
97
+ "publisher_id"=>2222}]
98
+ ```
99
+
100
+ ```ruby
101
+ # get 2 activities
102
+ client.get_activity(:limit => 2)
103
+ => [{"domain"=>"www.webintellix.com",
104
+ "display_name"=>"Webintellix",
105
+ "name"=>"comment",
106
+ "referrer"=>"http://www.webintellix.com",
107
+ "points"=>600,
108
+ "date_created"=>"2013-05-22 04:50:53",
109
+ "_id"=>"xxxxxxxxxxxxxxxxxx",
110
+ "publisher_id"=>2222},
111
+ {"domain"=>"www.webintellix.com",
112
+ "display_name"=>"Webintellix",
113
+ "name"=>"plusone",
114
+ "referrer"=>"http://www.webintellix.com",
115
+ "points"=>500,
116
+ "date_created"=>"2013-05-22 03:36:13",
117
+ "_id"=>"xxxxxxxxxxxxxxxxxx",
118
+ "publisher_id"=>2222}]
119
+ ```
120
+
121
+ ```ruby
122
+ # get only 'like' activities
123
+ client.get_activity(:activity_name => :like)
124
+ => [{"domain"=>"www.webintellix.com",
125
+ "display_name"=>"Webintellix",
126
+ "name"=>"like",
127
+ "referrer"=>"http://www.webintellix.com",
128
+ "points"=>400,
129
+ "date_created"=>"2013-05-22 02:58:27",
130
+ "_id"=>"xxxxxxxxxxxxxxxxxx",
131
+ "publisher_id"=>2222}]
132
+ ```
133
+
134
+ ```ruby
135
+ # create a new activity, and assign it relevant 'points'
136
+ client.create_activity(:comment, 600)
137
+ => [{"domain"=>"www.webintellix.com",
138
+ "user_id"=>111111,
139
+ "name"=>"comment",
140
+ "referrer"=>"http://www.webintellix.com",
141
+ "points"=>600,
142
+ "date_created"=>"2013-05-22 03:54:42",
143
+ "_id"=>"xxxxxxxxxxxxxxxxxx",
144
+ "publisher_id"=>2222,
145
+ "display_name"=>"Webintellix"}]
146
+ ```
147
+
148
+ ```ruby
149
+ # redeem offer for an activity using a 'reward_id'
150
+ client.redeem_activity_offer(123)
151
+ ```
152
+
153
+ ### User
154
+
155
+ ```ruby
156
+ # get details about the current user
157
+ client.get_user
158
+ => {"first_name"=>"Rupak",
159
+ "last_name"=>"Ganguly",
160
+ "user_id"=>111111,
161
+ "name"=>"Rupak Ganguly",
162
+ "timeline"=>false,
163
+ "badge_count"=>0,
164
+ "foursquare"=>false,
165
+ "optedOut"=>false,
166
+ "redemptions"=>0,
167
+ "new_lb"=>1,
168
+ "redeemable_points"=>3200,
169
+ "total_points_earned"=>3200,
170
+ "avatar"=>
171
+ "https://s3.amazonaws.com/punchtab-static/img/default_facebook_avatar.jpg"}
172
+ ```
173
+
174
+ ### Reward
175
+
176
+ ```ruby
177
+ # get all the rewards
178
+ client.get_reward
179
+ => [{"merchantname"=>"Target",
180
+ "image"=>{},
181
+ "label"=>"$5 Target Gift Card",
182
+ "points"=>15000,
183
+ "redeemable"=>false,
184
+ "shipping_address"=>false,
185
+ "id"=>33333,
186
+ "reward_id"=>33333},
187
+ {"merchantname"=>"Starbucks",
188
+ "image"=>{},
189
+ "label"=>"$5 Starbucks Card",
190
+ "points"=>10000,
191
+ "redeemable"=>false,
192
+ "shipping_address"=>false,
193
+ "id"=>44444,
194
+ "reward_id"=>44444}]
195
+ ```
196
+
197
+ ```ruby
198
+ # get specified number of rewards
199
+ client.get_reward(:limit => 1)
200
+ => [{"merchantname"=>"Target",
201
+ "image"=>{},
202
+ "label"=>"$5 Target Gift Card",
203
+ "points"=>15000,
204
+ "redeemable"=>false,
205
+ "shipping_address"=>false,
206
+ "id"=>33333,
207
+ "reward_id"=>33333}]
208
+ ```
209
+
210
+ ### Leaderboard
211
+
212
+ ```ruby
213
+ # get the current user's leaderboard
214
+ client.get_leaderboard
215
+ => [{"username"=>"111111_1111",
216
+ "recent_activity"=>
217
+ {"domain"=>"www.webintellix.com",
218
+ "display_name"=>"Webintellix",
219
+ "name"=>"comment",
220
+ "referrer"=>"",
221
+ "points"=>600,
222
+ "date_created"=>"2013-05-23 06:37:54.296496",
223
+ "_id"=>"",
224
+ "publisher_id"=>2222},
225
+ "name"=>"Rupak Ganguly",
226
+ "self"=>true,
227
+ "rank"=>1,
228
+ "points"=>3200,
229
+ "avatar"=>
230
+ "https://s3.amazonaws.com/punchtab-static/img/default_facebook_avatar.jpg",
231
+ "user_id"=>111111}]
232
+ ```
233
+
234
+ ```ruby
235
+ # get the specified user's leaderboard
236
+ client.get_leaderboard(111111)
237
+ => [{"username"=>"111111_1111",
238
+ "recent_activity"=>
239
+ {"domain"=>"www.webintellix.com",
240
+ "display_name"=>"Webintellix",
241
+ "name"=>"comment",
242
+ "referrer"=>"",
243
+ "points"=>600,
244
+ "date_created"=>"2013-05-23 06:37:54.296496",
245
+ "_id"=>"",
246
+ "publisher_id"=>2222},
247
+ "name"=>"Rupak Ganguly",
248
+ "self"=>true,
249
+ "rank"=>1,
250
+ "points"=>3200,
251
+ "avatar"=>
252
+ "https://s3.amazonaws.com/punchtab-static/img/default_facebook_avatar.jpg",
253
+ "user_id"=>111111}]
254
+ ```
255
+
256
+ ```ruby
257
+ # get leaderboard for current user with optional parameters
258
+ client.get_leaderboard(:days => 10, :limit => 3, :page => 1)
259
+ => [{"username"=>"111111_1111",
260
+ "user_id"=>111111,
261
+ "name"=>"Rupak Ganguly",
262
+ "self"=>true,
263
+ "rank"=>1,
264
+ "points"=>3200,
265
+ "avatar"=>
266
+ "https://s3.amazonaws.com/punchtab-static/img/default_facebook_avatar.jpg",
267
+ "recent_activity"=>
268
+ {"domain"=>"www.webintellix.com",
269
+ "display_name"=>"Webintellix",
270
+ "name"=>"comment",
271
+ "referrer"=>"http://www.webintellix.com",
272
+ "points"=>600,
273
+ "date_created"=>"2013-05-23 06:37:54",
274
+ "_id"=>"xxxxxxxxxxxxxxxxxxx",
275
+ "publisher_id"=>2222}}]
276
+ ```
277
+
278
+ ```ruby
279
+ # get leaderboard for specified user's leaderboard, with optional parameters
280
+ client.get_leaderboard(:with => 111111, :days => 10, :limit => 3, :page => 1)
281
+ => [{"username"=>"111111_1111",
282
+ "user_id"=>111111,
283
+ "name"=>"Rupak Ganguly",
284
+ "self"=>true,
285
+ "rank"=>1,
286
+ "points"=>3200,
287
+ "avatar"=>
288
+ "https://s3.amazonaws.com/punchtab-static/img/default_facebook_avatar.jpg",
289
+ "recent_activity"=>
290
+ {"domain"=>"www.webintellix.com",
291
+ "display_name"=>"Webintellix",
292
+ "name"=>"comment",
293
+ "referrer"=>"http://www.webintellix.com",
294
+ "points"=>600,
295
+ "date_created"=>"2013-05-23 06:37:54",
296
+ "_id"=>"xxxxxxxxxxxxxxxxxxx",
297
+ "publisher_id"=>2222}}]
298
+ ```
299
+
300
+ ## Roadmap
301
+
302
+ * Add tests
303
+
304
+ ## Contributions
305
+
306
+ Patches and Pull Requests are most welcome.
307
+
308
+ * Fork the project.
309
+ * Make your feature addition or bug fix.
310
+ * Add tests for it. This is important so I don't break it in a future version unintentionally.
311
+ * Commit, but do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but
312
+ bump version in a commit by itself, so I can ignore when I pull)
313
+ * Send me a pull request. Bonus points for topic branches.
314
+
315
+ ## Copyright
316
+
317
+ Copyright (c) 2013 [Rupak Ganguly](http://about.me/rupakg). See [LICENSE](https://github.com/rupakg/punchtab/blob/master/LICENSE) for details.
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,68 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+
3
+ require 'rubygems'
4
+ require 'hashie'
5
+
6
+ require 'punchtab/version'
7
+ require 'punchtab/utils'
8
+ require 'punchtab/api'
9
+
10
+ module Punchtab
11
+
12
+ class Client
13
+
14
+ attr_reader :access_token
15
+
16
+ def self.version
17
+ Punchtab::VERSION
18
+ end
19
+
20
+ # authentication api methods
21
+ def initialize(options = {})
22
+ # initialize the API
23
+ @api = Punchtab::API.new(options)
24
+
25
+ # authenticate
26
+ @access_token = @api.authenticate
27
+
28
+ end
29
+
30
+ def status
31
+ @api.status
32
+ end
33
+
34
+ def logout
35
+ @api.logout
36
+ end
37
+
38
+ # activity api methods
39
+ def get_activity(options={})
40
+ @api.get_activity(options)
41
+ end
42
+
43
+ def create_activity(activity_name, options={})
44
+ @api.create_activity(activity_name, options)
45
+ end
46
+
47
+ def redeem_activity_offer(reward_id)
48
+ @api.redeem_activity_offer(reward_id)
49
+ end
50
+
51
+ # user api methods
52
+ def get_user
53
+ @api.get_user
54
+ end
55
+
56
+ # reward api methods
57
+ def get_reward(options={})
58
+ @api.get_reward(options)
59
+ end
60
+
61
+ # leaderboard api methods
62
+ def get_leaderboard(options={})
63
+ @api.get_leaderboard(options)
64
+ end
65
+
66
+ end
67
+ end
68
+
@@ -0,0 +1,261 @@
1
+ require 'httparty'
2
+ require 'json'
3
+
4
+ module Punchtab
5
+
6
+ class API
7
+ include HTTParty
8
+ include Utils
9
+
10
+ BASE_API_URL = 'https://api.punchtab.com/v1'
11
+ ACTIVITIES = %w(visit tweet like plusone comment invite reply apply share purchase addtotimeline search download view checkin subscribe follow)
12
+
13
+ base_uri BASE_API_URL
14
+ format :json
15
+ # enable debug mode
16
+ if ENV['PUNCHTAB_DEBUG'] == '1'
17
+ debug_output
18
+ end
19
+
20
+ attr_reader :access_token
21
+
22
+ def initialize(options = {})
23
+ @client_id = options[:client_id] # required
24
+ @access_key = options[:access_key] # required
25
+ @secret_key = options[:secret_key] # required
26
+ @domain = options[:domain] # required
27
+ @user_info = options[:user_info] # optional
28
+
29
+ Punchtab::API.headers 'Referer' => "http://#{@domain}"
30
+
31
+ unless @client_id && @access_key && @secret_key && @domain
32
+ raise Exception.new('Client Id, Access Key, Secret Key and Domain are required to authenticate, before using PunchTab services.')
33
+ end
34
+ end
35
+
36
+ ######### Authentication APIs
37
+
38
+ # https://api.punchtab.com/v1/auth/sso
39
+ def authenticate
40
+ # setup the user data structure
41
+ user_data = {:id => @client_id}
42
+ if @user_info
43
+ user_data.merge!(@user_info)
44
+ end
45
+
46
+ # prepare authentication params
47
+ time_stamp = Time.now.to_i
48
+ auth_request = Base64.encode64(JSON.dump(user_data))
49
+ string_to_sign = "#{auth_request} #{time_stamp}"
50
+ hmac = OpenSSL::HMAC.new(@secret_key, OpenSSL::Digest::SHA1.new)
51
+ signature = hmac.update(string_to_sign).hexdigest
52
+
53
+ # make the POST call
54
+ path = '/auth/sso'
55
+
56
+ # setup the post params
57
+ post_data = {
58
+ :client_id => @client_id,
59
+ :key => @access_key,
60
+ :auth_request => auth_request,
61
+ :timestamp => time_stamp,
62
+ :signature => signature
63
+ }
64
+ raw_response = Punchtab::API.post(path, :body => post_data)
65
+ response = Punchtab::Utils.process_response(raw_response)
66
+ # return the access token
67
+ @access_token = response.authResponse.accessToken
68
+ end
69
+
70
+ # Required Parameters
71
+ # None
72
+ # Optional Parameters
73
+ # None
74
+ # Return
75
+ # https://api.punchtab.com/v1/auth/logout
76
+ def logout
77
+ # make the POST call
78
+ path = '/auth/logout'
79
+
80
+ # setup the post params
81
+ post_data = {
82
+ :token => @access_token,
83
+ :key => @access_key
84
+ }
85
+ raw_response = Punchtab::API.post(path, :body => post_data)
86
+ Punchtab::Utils.process_response(raw_response)
87
+ end
88
+
89
+ # Required Parameters
90
+ # None
91
+ # Optional Parameters
92
+ # None
93
+ # Return
94
+ # https://api.punchtab.com/v1/auth/status
95
+ def status
96
+ # make the POST call
97
+ path = '/auth/status'
98
+
99
+ # setup the post params
100
+ post_data = {
101
+ :token => @access_token,
102
+ :key => @access_key
103
+ }
104
+ raw_response = Punchtab::API.post(path, :body => post_data)
105
+ Punchtab::Utils.process_response(raw_response)
106
+ end
107
+
108
+ ######### Activity APIs
109
+
110
+ # Required Parameters
111
+ # None
112
+ # Optional Parameters
113
+ # options<~Hash>
114
+ # * 'activity_name'<~String> - retrieve only a list of activities for the activity.
115
+ # * 'limit'<~Integer> - limits the number of activities.
116
+ # * 'user_id'<~Integer> - retrieve the activity for a specific user_id, instead of the user currently logged in.
117
+ # Return
118
+ # https://api.punchtab.com/v1/activity/[activity_name]?access_token=<access_token>
119
+ def get_activity(options={})
120
+ activity_name = options.delete(:activity_name)
121
+ unless activity_name.nil? || activity_valid?(activity_name)
122
+ puts "Specify an activity from the list: '#{activity_list}'"
123
+ return
124
+ end
125
+ # make the GET call
126
+ if activity_name
127
+ path = "/activity/#{activity_name}"
128
+ else
129
+ path = '/activity'
130
+ end
131
+
132
+ options.merge!({:access_token => @access_token})
133
+ raw_response = Punchtab::API.get(path, :query => options)
134
+ Punchtab::Utils.process_response(raw_response)
135
+ end
136
+
137
+ # Required Parameters
138
+ # * 'activity_name'<~String> - retrieve only a list of activity from the activity_name.
139
+ # * 'points'<~Integer> - points for the activity, default is 100
140
+ # Optional Parameters
141
+ # None
142
+ # Return
143
+ # curl i -X POST 'points=200' https://api.punchtab.com/v1/activity/<activity_name>?access_token=<access_token>
144
+ def create_activity(activity_name, points=100)
145
+ unless activity_valid?(activity_name)
146
+ puts "Specify an activity from the list: '#{activity_list}'"
147
+ return
148
+ end
149
+ # make the POST call
150
+ if activity_name
151
+ path = "/activity/#{activity_name}"
152
+ else
153
+ path = '/activity'
154
+ end
155
+
156
+ options = {:access_token => @access_token}
157
+ raw_response = Punchtab::API.post(path, {:body => "points=#{points}", :query => options})
158
+ Punchtab::Utils.process_response(raw_response)
159
+ end
160
+
161
+ # Required Parameters
162
+ # * 'reward_id'<~Integer> - reward id for the activity offer to redeem
163
+ # Optional Parameters
164
+ # None
165
+ # Return
166
+ # curl i -X POST 'reward_id=123' https://api.punchtab.com/v1/activity/redeem?access_token=<access_token>
167
+ def redeem_activity_offer(reward_id)
168
+
169
+ # make the POST call
170
+ path = '/activity/redeem'
171
+
172
+ options = {:access_token => @access_token}
173
+ raw_response = Punchtab::API.post(path, {:body => "reward_id=#{reward_id}", :query => options })
174
+ Punchtab::Utils.process_response(raw_response)
175
+ end
176
+
177
+ ######### User APIs
178
+
179
+ # Required Parameters
180
+ # None
181
+ # Optional Parameters
182
+ # None
183
+ # Return
184
+ # https://api.punchtab.com/v1/user?access_token=<access_token>
185
+ def get_user
186
+ # make the GET call
187
+ path = '/user'
188
+
189
+ options = {:access_token => @access_token}
190
+ raw_response = Punchtab::API.get(path, :query => options)
191
+ Punchtab::Utils.process_response(raw_response)
192
+ end
193
+
194
+ ######### Reward APIs
195
+
196
+ # Required Parameters
197
+ # None
198
+ # Optional Parameters
199
+ # options<~Hash>
200
+ # * 'limit'<~Integer> - limits the number of rewards.
201
+ # Return
202
+ # https://api.punchtab.com/v1/reward?access_token=<access_token>
203
+ def get_reward(options={})
204
+ # make the GET call
205
+ path = '/reward'
206
+
207
+ options.merge!({:access_token => @access_token})
208
+ raw_response = Punchtab::API.get(path, :query => options)
209
+ Punchtab::Utils.process_response(raw_response)
210
+ end
211
+
212
+ ######### Leaderboard APIs
213
+
214
+ # Required Parameters
215
+ # None
216
+ # Optional Parameters
217
+ # options<~Hash>
218
+ # * 'with'<~String> - User Id or 'me'. Defaults to 'me', which will get a leaderboard with the current user.
219
+ # * 'days'<~String> - if set to 'all' returns the leaderboard from the beginning using redeemable points, otherwise it returns the leaderboard from the last 30 days.
220
+ # * 'limit'<~Integer> - limits the number of users in the leaderboard.
221
+ # * 'page'<~Integer> - specifies the page of result you want (rank will be relative to the page).
222
+ # Return
223
+ # https://api.punchtab.com/v1/leaderboard?access_token=<access_token>
224
+ def get_leaderboard(options={})
225
+ # make the GET call
226
+ path = '/leaderboard'
227
+
228
+ options.merge!({:with => 'me', :access_token => @access_token})
229
+ raw_response = Punchtab::API.get(path, :query => options)
230
+ Punchtab::Utils.process_response(raw_response)
231
+ end
232
+
233
+
234
+ private
235
+
236
+ def activity_valid?(activity_name)
237
+ ACTIVITIES.include?(activity_name.to_s)
238
+ end
239
+
240
+ def activity_list
241
+ ACTIVITIES.join(',')
242
+ end
243
+ end
244
+
245
+ end
246
+
247
+ ### Hack monkey-patch to rescue parsing errors
248
+ module HTTParty
249
+ class Request
250
+
251
+ private
252
+ def parse_response(body)
253
+ begin
254
+ parser.call(body, format)
255
+ rescue Exception
256
+ body
257
+ end
258
+ end
259
+
260
+ end
261
+ end
@@ -0,0 +1,28 @@
1
+ module Punchtab
2
+
3
+ module Utils
4
+
5
+ def self.process_response(raw_response)
6
+ if (500..599).include?(raw_response.code)
7
+ raise Exception.new("#{raw_response.code} Server Error")
8
+ elsif raw_response.code == 400
9
+ raise Exception.new("#{raw_response.code} Bad Request")
10
+ elsif (200..208).include?(raw_response.code) || raw_response.code == 226
11
+ begin
12
+ response = Hashie::Mash.new(raw_response)
13
+ rescue
14
+ return raw_response
15
+ end
16
+ begin
17
+ if response.error
18
+ raise Exception.new(raw_response)
19
+ else
20
+ return response
21
+ end
22
+ rescue
23
+ raise Exception.new(raw_response)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,3 @@
1
+ module Punchtab
2
+ VERSION = '0.1.0'
3
+ end
Binary file
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'punchtab/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'punchtab'
7
+ s.version = Punchtab::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Rupak Ganguly']
10
+ s.date = %q{2013-05-24}
11
+ s.email = ['rupakg@gmail.com']
12
+ s.homepage = %q{http://github.com/rupakg/punchtab}
13
+ s.summary = %q{Ruby wrapper for PunchTab API}
14
+ s.description = %q{Ruby wrapper for PunchTab API. PunchTab is the world's first instant loyalty platform.}
15
+ s.license = 'MIT'
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ['lib']
21
+
22
+ s.add_runtime_dependency('json', '~> 1.7.7')
23
+ s.add_runtime_dependency('hashie', '~> 2.0')
24
+ s.add_runtime_dependency('httparty', '~> 0.11')
25
+
26
+ #s.add_development_dependency(%q<shoulda>, ['>= 2.10.1'])
27
+ #s.add_development_dependency(%q<jnunemaker-matchy>, ['= 0.4.0'])
28
+ #s.add_development_dependency(%q<mocha>, ['~> 0.9.12'])
29
+ #s.add_development_dependency(%q<fakeweb>, ['~> 1.3.0'])
30
+
31
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: punchtab
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Rupak Ganguly
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2013-05-24 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: 1.7.7
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: hashie
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: "2.0"
35
+ type: :runtime
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: httparty
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: "0.11"
46
+ type: :runtime
47
+ version_requirements: *id003
48
+ description: Ruby wrapper for PunchTab API. PunchTab is the world's first instant loyalty platform.
49
+ email:
50
+ - rupakg@gmail.com
51
+ executables: []
52
+
53
+ extensions: []
54
+
55
+ extra_rdoc_files: []
56
+
57
+ files:
58
+ - .gitignore
59
+ - CHANGELOG.md
60
+ - Gemfile
61
+ - LICENSE
62
+ - README.md
63
+ - Rakefile
64
+ - lib/punchtab.rb
65
+ - lib/punchtab/api.rb
66
+ - lib/punchtab/utils.rb
67
+ - lib/punchtab/version.rb
68
+ - punchtab-enable-sso.png
69
+ - punchtab.gemspec
70
+ homepage: http://github.com/rupakg/punchtab
71
+ licenses:
72
+ - MIT
73
+ post_install_message:
74
+ rdoc_options: []
75
+
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: "0"
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ requirements: []
91
+
92
+ rubyforge_project:
93
+ rubygems_version: 1.8.24
94
+ signing_key:
95
+ specification_version: 3
96
+ summary: Ruby wrapper for PunchTab API
97
+ test_files: []
98
+