appoxy_rails 0.0.18 → 0.0.19
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/appoxy_rails.rb +1 -0
- data/lib/railtie.rb +9 -2
- data/lib/sessions/application_controller.rb +15 -10
- data/lib/sessions/sessions_controller.rb +251 -27
- data/lib/sessions/user.rb +10 -4
- data/lib/ui/application_helper.rb +0 -1
- data/lib/utils.rb +11 -0
- metadata +70 -96
data/lib/appoxy_rails.rb
CHANGED
data/lib/railtie.rb
CHANGED
@@ -1,14 +1,21 @@
|
|
1
1
|
# see http://api.rubyonrails.org/classes/Rails/Railtie.html
|
2
2
|
|
3
|
+
# Nice write-up of hooking gems into the views/layouts/statics of Rails 3 apps:
|
4
|
+
# http://numbers.brighterplanet.com/2010/07/26/sharing-views-across-rails-3-apps/
|
5
|
+
|
3
6
|
require 'rails'
|
4
7
|
|
5
|
-
module
|
6
|
-
class Railtie < Rails::Railtie
|
8
|
+
module AppoxyRails
|
9
|
+
class Railtie < ::Rails::Railtie
|
7
10
|
|
8
11
|
initializer "appoxy_rails.configure_rails_initialization" do |app|
|
9
12
|
puts 'Initializing appoxy_rails Railtie'
|
10
13
|
|
11
14
|
# routes = app.routes
|
15
|
+
# app.paths.app.views.push Appoxy::Rails::Layout.view_path
|
16
|
+
|
17
|
+
# config.app_middleware.use '::ActionDispatch::Static', Appoxy::UI.public_path
|
18
|
+
# config.app.append_asset_paths
|
12
19
|
|
13
20
|
end
|
14
21
|
end
|
@@ -5,7 +5,6 @@ module Appoxy
|
|
5
5
|
|
6
6
|
def self.included(base)
|
7
7
|
# Initialize module.
|
8
|
-
puts 'ApplicationController included.'
|
9
8
|
base.helper_method :logged_in?
|
10
9
|
base.helper_method :current_user
|
11
10
|
base.helper_method :base_url
|
@@ -53,14 +52,22 @@ module Appoxy
|
|
53
52
|
|
54
53
|
|
55
54
|
def current_user
|
56
|
-
@current_user ||=
|
55
|
+
@current_user ||= login_from_session
|
57
56
|
@current_user
|
58
57
|
end
|
59
58
|
|
60
59
|
|
61
60
|
def login_from_session
|
62
61
|
#puts 'Login from session=' + session[:user_id].inspect
|
63
|
-
|
62
|
+
u = nil
|
63
|
+
if session[:user_id]
|
64
|
+
begin
|
65
|
+
u = ::User.find(session[:user_id])
|
66
|
+
rescue => ex
|
67
|
+
puts 'User not found: ' + ex.message
|
68
|
+
end
|
69
|
+
end
|
70
|
+
u
|
64
71
|
end
|
65
72
|
|
66
73
|
def current_url
|
@@ -78,10 +85,7 @@ module Appoxy
|
|
78
85
|
end
|
79
86
|
|
80
87
|
def random_string(length=10)
|
81
|
-
|
82
|
-
password = ''
|
83
|
-
length.times { password << chars[rand(chars.size)] }
|
84
|
-
password
|
88
|
+
Appoxy::Utils.random_string(length)
|
85
89
|
end
|
86
90
|
|
87
91
|
def authenticate
|
@@ -100,9 +104,10 @@ module Appoxy
|
|
100
104
|
end
|
101
105
|
end
|
102
106
|
redirect_to :controller=>"sessions", :action=>"new", :ac=>params[:ac]
|
107
|
+
else
|
108
|
+
after_authenticate
|
103
109
|
end
|
104
110
|
|
105
|
-
after_authenticate
|
106
111
|
|
107
112
|
end
|
108
113
|
|
@@ -111,9 +116,9 @@ module Appoxy
|
|
111
116
|
end
|
112
117
|
|
113
118
|
|
114
|
-
|
115
119
|
def facebook_oauth_url(options={})
|
116
|
-
puts 'appconfig==' + Rails.application.config.inspect
|
120
|
+
# puts 'appconfig==' + Rails.application.config.inspect
|
121
|
+
raise "Please config your facebook id and api keys." unless Rails.application.config.respond_to?(:facebook_app_id)
|
117
122
|
raise "Scope must be specified." unless options[:scope]
|
118
123
|
app_id = Rails.application.config.facebook_app_id
|
119
124
|
if app_id
|
@@ -135,8 +135,155 @@ module Appoxy
|
|
135
135
|
destroy
|
136
136
|
end
|
137
137
|
|
138
|
+
def openid_start
|
139
|
+
|
140
|
+
begin
|
141
|
+
identifier = params[:openid_identifier]
|
142
|
+
if identifier.nil?
|
143
|
+
flash[:warning] = "There is no openid identifier."
|
144
|
+
redirect_to root_path
|
145
|
+
return
|
146
|
+
end
|
147
|
+
oidreq = consumer.begin(identifier)
|
148
|
+
rescue OpenID::OpenIDError => e
|
149
|
+
flash[:error] = "Discovery failed for #{identifier}: #{e}"
|
150
|
+
redirect_to root_path
|
151
|
+
return
|
152
|
+
end
|
153
|
+
if true || params[:use_ax]
|
154
|
+
sregreq = OpenID::AX::FetchRequest.new
|
155
|
+
sregreq.add(OpenID::AX::AttrInfo.new("http://schema.openid.net/contact/email", "email", true))
|
156
|
+
oidreq.add_extension(sregreq)
|
157
|
+
oidreq.return_to_args['did_ax'] = 'y'
|
158
|
+
end
|
159
|
+
if params[:use_sreg]
|
160
|
+
sregreq = OpenID::SReg::Request.new
|
161
|
+
# required fields
|
162
|
+
sregreq.request_fields(['email', 'nickname'], true)
|
163
|
+
# optional fields
|
164
|
+
sregreq.request_fields(['dob', 'fullname'], false)
|
165
|
+
oidreq.add_extension(sregreq)
|
166
|
+
oidreq.return_to_args['did_sreg'] = 'y'
|
167
|
+
end
|
168
|
+
if params[:use_pape]
|
169
|
+
papereq = OpenID::PAPE::Request.new
|
170
|
+
papereq.add_policy_uri(OpenID::PAPE::AUTH_PHISHING_RESISTANT)
|
171
|
+
papereq.max_auth_age = 2*60*60
|
172
|
+
oidreq.add_extension(papereq)
|
173
|
+
oidreq.return_to_args['did_pape'] = 'y'
|
174
|
+
end
|
175
|
+
if params[:force_post]
|
176
|
+
oidreq.return_to_args['force_post']='x'*2048
|
177
|
+
end
|
178
|
+
return_to = base_url + "/sessions/openid_complete"
|
179
|
+
realm = base_url
|
180
|
+
|
181
|
+
puts 'about to redirect'
|
182
|
+
|
183
|
+
if oidreq.send_redirect?(realm, return_to, params[:immediate])
|
184
|
+
url = oidreq.redirect_url(realm, return_to, params[:immediate])
|
185
|
+
puts 'yep, redirecting to ' + url
|
186
|
+
# response["x-test-yo"] = "fuck me"
|
187
|
+
redirect_to url
|
188
|
+
else
|
189
|
+
haml oidreq.html_markup(realm, return_to, params[:immediate], {'id' => 'openid_form'})
|
190
|
+
end
|
191
|
+
# dump_flash
|
192
|
+
|
193
|
+
end
|
194
|
+
|
195
|
+
|
196
|
+
def openid_complete
|
197
|
+
|
198
|
+
return if before_create == false
|
199
|
+
|
200
|
+
temp1 = session
|
201
|
+
|
202
|
+
current_url = base_url + "/sessions/openid_complete" # url_for(:action => 'complete', :only_path => false)
|
203
|
+
puts 'current_url=' + current_url.inspect
|
204
|
+
puts 'path_params=' + request.path_parameters.inspect
|
205
|
+
parameters = params.reject { |k, v| request.path_parameters[k.to_sym] }
|
206
|
+
puts 'PARAMETERS=' + parameters.inspect
|
207
|
+
oidresp = consumer.complete(parameters, current_url)
|
208
|
+
puts 'oidresp=' + oidresp.inspect
|
209
|
+
user_data = {}
|
210
|
+
case oidresp.status
|
211
|
+
when OpenID::Consumer::FAILURE
|
212
|
+
if oidresp.display_identifier
|
213
|
+
flash[:error] = ("Verification of #{oidresp.display_identifier} failed: #{oidresp.message}")
|
214
|
+
else
|
215
|
+
flash[:error] = "Verification failed: #{oidresp.message}"
|
216
|
+
end
|
217
|
+
when OpenID::Consumer::SUCCESS
|
218
|
+
logger.info ("Verification of #{oidresp.display_identifier} succeeded.")
|
219
|
+
|
220
|
+
user_data[:open_id] = oidresp.identity_url
|
221
|
+
if params[:did_ax]
|
222
|
+
sreg_resp = OpenID::AX::FetchResponse.from_success_response(oidresp)
|
223
|
+
sreg_message = "AX Registration data was requested"
|
224
|
+
if sreg_resp.data.empty?
|
225
|
+
sreg_message << ", but none was returned."
|
226
|
+
else
|
227
|
+
sreg_message << ". The following data were sent:"
|
228
|
+
sreg_resp.data.each { |k, v|
|
229
|
+
sreg_message << "<br/><b>#{k}</b>: #{v}"
|
230
|
+
}
|
231
|
+
user_data[:email] = sreg_resp.data["http://schema.openid.net/contact/email"][0]
|
232
|
+
end
|
233
|
+
puts sreg_message
|
234
|
+
end
|
235
|
+
if params[:did_sreg]
|
236
|
+
sreg_resp = OpenID::SReg::Response.from_success_response(oidresp)
|
237
|
+
sreg_message = "Simple Registration data was requested"
|
238
|
+
if sreg_resp.empty?
|
239
|
+
sreg_message << ", but none was returned."
|
240
|
+
else
|
241
|
+
sreg_message << ". The following data were sent:"
|
242
|
+
sreg_resp.data.each { |k, v|
|
243
|
+
sreg_message << "<br/><b>#{k}</b>: #{v}"
|
244
|
+
}
|
245
|
+
|
246
|
+
end
|
247
|
+
puts sreg_message
|
248
|
+
end
|
249
|
+
if params[:did_pape]
|
250
|
+
pape_resp = OpenID::PAPE::Response.from_success_response(oidresp)
|
251
|
+
pape_message = "A phishing resistant authentication method was requested"
|
252
|
+
if pape_resp.auth_policies.member? OpenID::PAPE::AUTH_PHISHING_RESISTANT
|
253
|
+
pape_message << ", and the server reported one."
|
254
|
+
else
|
255
|
+
pape_message << ", but the server did not report one."
|
256
|
+
end
|
257
|
+
if pape_resp.auth_time
|
258
|
+
pape_message << "<br><b>Authentication time:</b> #{pape_resp.auth_time} seconds"
|
259
|
+
end
|
260
|
+
if pape_resp.nist_auth_level
|
261
|
+
pape_message << "<br><b>NIST Auth Level:</b> #{pape_resp.nist_auth_level}"
|
262
|
+
end
|
263
|
+
puts pape_message
|
264
|
+
end
|
265
|
+
# todo: CREATE A USER FOR THIS PROJECT HERE WITH IDENITY AND EMAIL
|
266
|
+
user = create_or_update_user(user_data)
|
267
|
+
if user
|
268
|
+
flash[:success] = "Authentication successful."
|
269
|
+
end
|
270
|
+
|
271
|
+
when OpenID::Consumer::SETUP_NEEDED
|
272
|
+
flash[:warning] = "Immediate request failed - Setup Needed"
|
273
|
+
when OpenID::Consumer::CANCEL
|
274
|
+
flash[:warning] = "OpenID transaction cancelled."
|
275
|
+
else
|
276
|
+
end
|
277
|
+
# dump_flash
|
278
|
+
# return_to = session[:return_to]
|
279
|
+
# puts 'return_to=' + return_to.inspect
|
280
|
+
# redirect_to (return_to || after_login_url || root_path)
|
281
|
+
|
282
|
+
|
283
|
+
end
|
138
284
|
|
139
285
|
def create_facebook
|
286
|
+
return if before_create == false
|
140
287
|
if facebook_auth(Rails.application.config.facebook_app_id,
|
141
288
|
Rails.application.config.facebook_secret)
|
142
289
|
after_create
|
@@ -186,22 +333,40 @@ module Appoxy
|
|
186
333
|
@user.save(:dirty=>true)
|
187
334
|
end
|
188
335
|
|
189
|
-
|
190
|
-
@user
|
336
|
+
after_save_setup @user
|
191
337
|
|
192
338
|
end
|
193
339
|
end
|
194
340
|
|
195
|
-
def
|
196
|
-
|
197
|
-
|
341
|
+
def oauth_start(key, secret, callback_url, site, request_token_path, authorize_path, access_token_path)
|
342
|
+
consumer = oauth_consumer(key, secret,
|
343
|
+
callback_url,
|
344
|
+
site,
|
345
|
+
request_token_path,
|
346
|
+
authorize_path,
|
347
|
+
access_token_path
|
348
|
+
)
|
349
|
+
@request_token = consumer.get_request_token(:oauth_callback => callback_url)
|
198
350
|
session[:request_token] = @request_token
|
199
|
-
|
200
|
-
puts
|
201
|
-
redirect_to
|
351
|
+
auth_url = @request_token.authorize_url(:oauth_callback => callback_url)
|
352
|
+
puts auth_url.inspect
|
353
|
+
redirect_to auth_url
|
354
|
+
end
|
355
|
+
|
356
|
+
def twitter_auth
|
357
|
+
signin = true
|
358
|
+
callback_url = "#{base_url}/sessions/#{(signin ? "create_twitter" : "create_twitter_oauth")}"
|
359
|
+
auth_path = signin ? "authenticate" : "authorize"
|
360
|
+
consumer = oauth_start(Rails.application.config.twitter_consumer_key, Rails.application.config.twitter_consumer_secret,
|
361
|
+
callback_url,
|
362
|
+
"https://api.twitter.com",
|
363
|
+
"/oauth/request_token",
|
364
|
+
"/oauth/#{auth_path}",
|
365
|
+
"/oauth/access_token"
|
366
|
+
)
|
202
367
|
end
|
203
368
|
|
204
|
-
# OAUTH VERSION
|
369
|
+
# OAUTH VERSION for oauthing, shouldn't be in this controller
|
205
370
|
def create_twitter_oauth
|
206
371
|
puts 'params=' + params.inspect
|
207
372
|
@request_token = session[:request_token]
|
@@ -228,28 +393,34 @@ module Appoxy
|
|
228
393
|
|
229
394
|
end
|
230
395
|
|
231
|
-
def
|
232
|
-
before_create
|
233
|
-
puts 'params=' + params.inspect
|
396
|
+
def get_oauth_access_token
|
234
397
|
@request_token = session[:request_token]
|
235
398
|
@access_token = @request_token.get_access_token(:oauth_verifier => params[:oauth_verifier])
|
236
399
|
puts 'access_token = ' + @access_token.inspect
|
237
400
|
p @access_token.params
|
401
|
+
@access_token
|
402
|
+
end
|
403
|
+
|
404
|
+
def create_twitter
|
405
|
+
return if before_create == false
|
406
|
+
puts 'params=' + params.inspect
|
407
|
+
get_oauth_access_token()
|
238
408
|
|
239
409
|
@user = User.find_by_twitter_id(@access_token.params[:user_id])
|
240
410
|
unless @user
|
241
|
-
@user = User.new(:username
|
242
|
-
|
243
|
-
|
244
|
-
@user.
|
411
|
+
@user = User.new(# shouldn't set this, because can't say it will be unique ':username =>@access_token.params[:screen_name],
|
412
|
+
:twitter_screen_name=>@access_token.params[:screen_name],
|
413
|
+
:twitter_id =>@access_token.params[:user_id])
|
414
|
+
@user.set_remember
|
415
|
+
@user.save
|
245
416
|
puts '@user=' + @user.inspect
|
246
417
|
else
|
247
418
|
@user.username = @access_token.params[:screen_name]
|
419
|
+
@user.set_remember
|
248
420
|
@user.save(:dirty=>true)
|
249
|
-
|
250
421
|
end
|
251
422
|
|
252
|
-
|
423
|
+
after_save_setup @user
|
253
424
|
|
254
425
|
flash[:success] = "Authorized with Twitter."
|
255
426
|
|
@@ -258,16 +429,69 @@ module Appoxy
|
|
258
429
|
end
|
259
430
|
|
260
431
|
private
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
432
|
+
|
433
|
+
def after_save_setup(user)
|
434
|
+
if user.errors.present?
|
435
|
+
flash[:error] = "Error saving user: #{user.errors.full_messages}"
|
436
|
+
return false
|
437
|
+
else
|
438
|
+
set_user_cookies(user)
|
439
|
+
after_create
|
440
|
+
return user
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
444
|
+
def create_or_update_user(user_data)
|
445
|
+
user = User.find_by_email(user_data[:email]) # google returns different openid all the time so using email User.find_by_openid user_data[:openid]
|
446
|
+
|
447
|
+
unless user
|
448
|
+
user = User.new(user_data)
|
449
|
+
user.set_remember
|
450
|
+
user.save
|
451
|
+
else
|
452
|
+
if user.email.nil? || user.email != user_data[:email]
|
453
|
+
user.email = user_data[:email]
|
454
|
+
end
|
455
|
+
# if user.remember_me.nil? || user.remember_me_expires.nil? || user.remember_me_expires < Time.now
|
456
|
+
# logger.debug "Remember me expired."
|
457
|
+
# user.remember_me = user_data[:remember_me]
|
458
|
+
# user.remember_me_expires = 30.days.since
|
459
|
+
# end
|
460
|
+
user.set_remember
|
461
|
+
user.save(:dirty=>true)
|
462
|
+
end
|
463
|
+
|
464
|
+
# puts 'user=' + user.inspect
|
465
|
+
return after_save_setup(user)
|
466
|
+
end
|
467
|
+
|
468
|
+
def set_user_cookies(user)
|
469
|
+
set_current_user(user)
|
470
|
+
response.set_cookie('user_id', :value => user.id, :expires => user.remember_expires)
|
471
|
+
response.set_cookie('rme', :value=>user.remember_me, :expires => user.remember_expires)
|
472
|
+
end
|
473
|
+
|
474
|
+
|
475
|
+
# todo: allow user to specify store type in options
|
476
|
+
def openid_consumer(options={})
|
477
|
+
@openid_consumer ||= OpenID::Consumer.new(session,
|
478
|
+
OpenID::Store::Filesystem.new("/mnt/tmp/openid"))
|
479
|
+
# todo: add S3Store to appoxy_sessions
|
480
|
+
# @openid_consumer ||= OpenID::Consumer.new(session,
|
481
|
+
# S3Store.new(S3BucketWrapper.new(context, main_bucket)))
|
482
|
+
end
|
483
|
+
|
484
|
+
|
485
|
+
def oauth_consumer(key, secret, callback, site, request_token_path, authorize_path, access_token_path)
|
486
|
+
@consumer = OAuth::Consumer.new(key,
|
487
|
+
secret,
|
488
|
+
:site => site,
|
489
|
+
:oauth_callback => callback,
|
490
|
+
:request_token_path => request_token_path,
|
491
|
+
:authorize_path => authorize_path,
|
492
|
+
:access_token_path => access_token_path)
|
270
493
|
p @consumer
|
494
|
+
@consumer
|
271
495
|
end
|
272
496
|
|
273
497
|
|
data/lib/sessions/user.rb
CHANGED
@@ -16,7 +16,7 @@ module Appoxy
|
|
16
16
|
{:name => :password, :hashed=>true},
|
17
17
|
:first_name,
|
18
18
|
:last_name,
|
19
|
-
:
|
19
|
+
:remember_token,
|
20
20
|
:activation_code,
|
21
21
|
:status, # invited, active
|
22
22
|
:oauth_access_key,
|
@@ -25,18 +25,18 @@ module Appoxy
|
|
25
25
|
:lat, :lng
|
26
26
|
|
27
27
|
has_dates :last_login,
|
28
|
-
:
|
28
|
+
:remember_expires
|
29
29
|
|
30
30
|
|
31
31
|
def validate
|
32
|
-
errors.add("email", "is not valid") unless User.email_is_valid?(email)
|
32
|
+
# errors.add("email", "is not valid") unless User.email_is_valid?(email)
|
33
33
|
|
34
34
|
if status == "invited"
|
35
35
|
# doesn't need password
|
36
36
|
elsif open_id
|
37
37
|
# doesn't need password
|
38
38
|
else
|
39
|
-
errors.add("password", "must be at least 6 characters long.") if password.blank?
|
39
|
+
# errors.add("password", "must be at least 6 characters long.") if password.blank?
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -75,6 +75,12 @@ module Appoxy
|
|
75
75
|
(self.password == password) ? self : nil
|
76
76
|
end
|
77
77
|
|
78
|
+
def set_remember
|
79
|
+
rme_string = random_string(50)
|
80
|
+
self.remember_token = rme_string
|
81
|
+
self.remember_expires = 30.days.since
|
82
|
+
end
|
83
|
+
|
78
84
|
|
79
85
|
end
|
80
86
|
|
data/lib/utils.rb
ADDED
metadata
CHANGED
@@ -1,109 +1,90 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: appoxy_rails
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 18
|
9
|
-
version: 0.0.18
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.19
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Travis Reeder
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
date: 2011-02-07 00:00:00 -08:00
|
12
|
+
date: 2011-02-17 00:00:00.000000000 -08:00
|
18
13
|
default_executable:
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
21
16
|
name: rest-client
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &26527800 !ruby/object:Gem::Requirement
|
24
18
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
- 0
|
30
|
-
version: "0"
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
31
23
|
type: :runtime
|
32
|
-
version_requirements: *id001
|
33
|
-
- !ruby/object:Gem::Dependency
|
34
|
-
name: oauth
|
35
24
|
prerelease: false
|
36
|
-
|
25
|
+
version_requirements: *26527800
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: oauth
|
28
|
+
requirement: &26527464 !ruby/object:Gem::Requirement
|
37
29
|
none: false
|
38
|
-
requirements:
|
39
|
-
- -
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
|
42
|
-
- 0
|
43
|
-
version: "0"
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
44
34
|
type: :runtime
|
45
|
-
version_requirements: *id002
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: ruby-openid
|
48
35
|
prerelease: false
|
49
|
-
|
36
|
+
version_requirements: *26527464
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: ruby-openid
|
39
|
+
requirement: &26527164 !ruby/object:Gem::Requirement
|
50
40
|
none: false
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
|
55
|
-
- 0
|
56
|
-
version: "0"
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
57
45
|
type: :runtime
|
58
|
-
version_requirements: *id003
|
59
|
-
- !ruby/object:Gem::Dependency
|
60
|
-
name: appoxy_api
|
61
46
|
prerelease: false
|
62
|
-
|
47
|
+
version_requirements: *26527164
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: appoxy_api
|
50
|
+
requirement: &26526828 !ruby/object:Gem::Requirement
|
63
51
|
none: false
|
64
|
-
requirements:
|
65
|
-
- -
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
|
68
|
-
- 0
|
69
|
-
version: "0"
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
70
56
|
type: :runtime
|
71
|
-
version_requirements: *id004
|
72
|
-
- !ruby/object:Gem::Dependency
|
73
|
-
name: mini_fb
|
74
57
|
prerelease: false
|
75
|
-
|
58
|
+
version_requirements: *26526828
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: mini_fb
|
61
|
+
requirement: &26526480 !ruby/object:Gem::Requirement
|
76
62
|
none: false
|
77
|
-
requirements:
|
78
|
-
- -
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
|
81
|
-
- 0
|
82
|
-
version: "0"
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
83
67
|
type: :runtime
|
84
|
-
version_requirements: *id005
|
85
|
-
- !ruby/object:Gem::Dependency
|
86
|
-
name: simple_record
|
87
68
|
prerelease: false
|
88
|
-
|
69
|
+
version_requirements: *26526480
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: simple_record
|
72
|
+
requirement: &26526156 !ruby/object:Gem::Requirement
|
89
73
|
none: false
|
90
|
-
requirements:
|
91
|
-
- -
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
|
94
|
-
- 0
|
95
|
-
version: "0"
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
96
78
|
type: :runtime
|
97
|
-
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: *26526156
|
98
81
|
description: Appoxy API Helper gem description...
|
99
82
|
email: travis@appoxy.com
|
100
83
|
executables: []
|
101
|
-
|
102
84
|
extensions: []
|
103
|
-
|
104
|
-
extra_rdoc_files:
|
85
|
+
extra_rdoc_files:
|
105
86
|
- README.markdown
|
106
|
-
files:
|
87
|
+
files:
|
107
88
|
- lib/api/api_controller.rb
|
108
89
|
- lib/api/client.rb
|
109
90
|
- lib/api/client_helper.rb
|
@@ -125,38 +106,31 @@ files:
|
|
125
106
|
- lib/ui/test.rb
|
126
107
|
- lib/ui/time_zoner.rb
|
127
108
|
- lib/ui/visualizations.rb
|
109
|
+
- lib/utils.rb
|
128
110
|
- README.markdown
|
129
111
|
has_rdoc: true
|
130
112
|
homepage: http://www.appoxy.com
|
131
113
|
licenses: []
|
132
|
-
|
133
114
|
post_install_message:
|
134
115
|
rdoc_options: []
|
135
|
-
|
136
|
-
require_paths:
|
116
|
+
require_paths:
|
137
117
|
- lib
|
138
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
139
119
|
none: false
|
140
|
-
requirements:
|
141
|
-
- -
|
142
|
-
- !ruby/object:Gem::Version
|
143
|
-
|
144
|
-
|
145
|
-
version: "0"
|
146
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ! '>='
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
125
|
none: false
|
148
|
-
requirements:
|
149
|
-
- -
|
150
|
-
- !ruby/object:Gem::Version
|
151
|
-
|
152
|
-
- 0
|
153
|
-
version: "0"
|
126
|
+
requirements:
|
127
|
+
- - ! '>='
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
154
130
|
requirements: []
|
155
|
-
|
156
131
|
rubyforge_project:
|
157
|
-
rubygems_version: 1.
|
132
|
+
rubygems_version: 1.5.2
|
158
133
|
signing_key:
|
159
134
|
specification_version: 3
|
160
135
|
summary: Appoxy Rails Helper gem
|
161
136
|
test_files: []
|
162
|
-
|