sorcery 0.7.6 → 0.7.7

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sorcery might be problematic. Click here for more details.

Files changed (31) hide show
  1. data/.travis.yml +2 -0
  2. data/Gemfile +2 -21
  3. data/Gemfile.lock +86 -52
  4. data/README.rdoc +4 -3
  5. data/VERSION +1 -1
  6. data/lib/generators/sorcery/install_generator.rb +6 -4
  7. data/lib/generators/sorcery/templates/initializer.rb +293 -127
  8. data/lib/sorcery/controller.rb +1 -0
  9. data/lib/sorcery/controller/submodules/external.rb +1 -1
  10. data/lib/sorcery/controller/submodules/external/protocols/oauth2.rb +2 -2
  11. data/lib/sorcery/controller/submodules/external/providers/facebook.rb +7 -2
  12. data/lib/sorcery/controller/submodules/external/providers/github.rb +4 -4
  13. data/lib/sorcery/controller/submodules/external/providers/google.rb +4 -4
  14. data/lib/sorcery/controller/submodules/external/providers/liveid.rb +1 -1
  15. data/lib/sorcery/model/adapters/mongo_mapper.rb +1 -1
  16. data/lib/sorcery/model/adapters/mongoid.rb +2 -2
  17. data/lib/sorcery/model/submodules/brute_force_protection.rb +2 -2
  18. data/lib/sorcery/model/submodules/reset_password.rb +10 -3
  19. data/lib/sorcery/model/submodules/user_activation.rb +14 -6
  20. data/sorcery.gemspec +15 -8
  21. data/spec/Gemfile.lock +15 -18
  22. data/spec/rails3/Gemfile +1 -0
  23. data/spec/rails3/Gemfile.lock +21 -23
  24. data/spec/rails3/spec/controller_oauth2_spec.rb +6 -4
  25. data/spec/rails3_mongo_mapper/Gemfile +1 -0
  26. data/spec/rails3_mongo_mapper/Gemfile.lock +31 -37
  27. data/spec/rails3_mongoid/Gemfile +1 -0
  28. data/spec/rails3_mongoid/Gemfile.lock +23 -24
  29. data/spec/shared_examples/user_activation_shared_examples.rb +71 -41
  30. data/spec/shared_examples/user_reset_password_shared_examples.rb +76 -31
  31. metadata +63 -40
@@ -71,6 +71,7 @@ module Sorcery
71
71
  # and we want to return him back to the page he originally wanted.
72
72
  def redirect_back_or_to(url, flash_hash = {})
73
73
  redirect_to(session[:return_to_url] || url, :flash => flash_hash)
74
+ session[:return_to_url] = nil
74
75
  end
75
76
 
76
77
  # The default action for denying non-authenticated users.
@@ -45,7 +45,7 @@ module Sorcery
45
45
  @provider = Config.send(provider)
46
46
  @provider.process_callback(params,session)
47
47
  @user_hash = @provider.get_user_hash
48
- if user = user_class.load_from_provider(provider,@user_hash[:uid])
48
+ if user = user_class.load_from_provider(provider,@user_hash[:uid].to_s)
49
49
  reset_session
50
50
  auto_login(user)
51
51
  user
@@ -20,9 +20,9 @@ module Sorcery
20
20
 
21
21
  def get_access_token(args, options = {})
22
22
  client = build_client(options)
23
- client.auth_code.get_access_token(
23
+ client.auth_code.get_token(
24
24
  args[:code],
25
- :redirect_uri => @callback_url
25
+ { :redirect_uri => @callback_url, :parse => options.delete(:parse) }, options
26
26
  )
27
27
  end
28
28
 
@@ -46,12 +46,16 @@ module Sorcery
46
46
  @scope = "email,offline_access"
47
47
  @user_info_mapping = {}
48
48
  @display = "page"
49
+ @token_url = "oauth/access_token"
50
+ @mode = :query
51
+ @parse = :query
52
+ @param_name = "access_token"
49
53
  end
50
54
 
51
55
  def get_user_hash
52
56
  user_hash = {}
53
57
  response = @access_token.get(@user_info_path)
54
- user_hash[:user_info] = JSON.parse(response)
58
+ user_hash[:user_info] = JSON.parse(response.body)
55
59
  user_hash[:uid] = user_hash[:user_info]['id']
56
60
  user_hash
57
61
  end
@@ -69,8 +73,9 @@ module Sorcery
69
73
  # tries to login the user from access token
70
74
  def process_callback(params,session)
71
75
  args = {}
76
+ options = { :token_url => @token_url, :mode => @mode, :param_name => @param_name, :parse => @parse }
72
77
  args.merge!({:code => params[:code]}) if params[:code]
73
- @access_token = self.get_access_token(args)
78
+ @access_token = self.get_access_token(args, options)
74
79
  end
75
80
 
76
81
  end
@@ -51,7 +51,7 @@ module Sorcery
51
51
  def get_user_hash
52
52
  user_hash = {}
53
53
  response = @access_token.get(@user_info_path)
54
- user_hash[:user_info] = JSON.parse(response)
54
+ user_hash[:user_info] = JSON.parse(response.body)
55
55
  user_hash[:uid] = user_hash[:user_info]['id']
56
56
  user_hash
57
57
  end
@@ -63,7 +63,7 @@ module Sorcery
63
63
  # calculates and returns the url to which the user should be redirected,
64
64
  # to get authenticated at the external provider's site.
65
65
  def login_url(params,session)
66
- self.authorize_url({:authorize_path => @auth_path})
66
+ self.authorize_url({:authorize_url => @auth_path})
67
67
  end
68
68
 
69
69
  # tries to login the user from access token
@@ -71,8 +71,8 @@ module Sorcery
71
71
  args = {}
72
72
  args.merge!({:code => params[:code]}) if params[:code]
73
73
  options = {
74
- :access_token_path => @token_path,
75
- :access_token_method => :post
74
+ :token_url => @token_path,
75
+ :token_method => :post
76
76
  }
77
77
  @access_token = self.get_access_token(args, options)
78
78
  end
@@ -44,7 +44,7 @@ module Sorcery
44
44
  def init
45
45
  @site = "https://accounts.google.com"
46
46
  @auth_url = "/o/oauth2/auth"
47
- @token_path = "/o/oauth2/token"
47
+ @token_url = "/o/oauth2/token"
48
48
  @user_info_url = "https://www.googleapis.com/oauth2/v1/userinfo"
49
49
  @scope = "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"
50
50
  @user_info_mapping = {}
@@ -53,7 +53,7 @@ module Sorcery
53
53
  def get_user_hash
54
54
  user_hash = {}
55
55
  response = @access_token.get(@user_info_url)
56
- user_hash[:user_info] = JSON.parse(response)
56
+ user_hash[:user_info] = JSON.parse(response.body)
57
57
  user_hash[:uid] = user_hash[:user_info]['id']
58
58
  user_hash
59
59
  end
@@ -73,8 +73,8 @@ module Sorcery
73
73
  args = {}
74
74
  args.merge!({:code => params[:code]}) if params[:code]
75
75
  options = {
76
- :access_token_path => @token_path,
77
- :access_token_method => :post
76
+ :token_url => @token_url,
77
+ :token_method => :post
78
78
  }
79
79
  @access_token = self.get_access_token(args, options)
80
80
  end
@@ -54,7 +54,7 @@ module Sorcery
54
54
  user_hash = {}
55
55
  @access_token.token_param = "access_token"
56
56
  response = @access_token.get(@user_info_url)
57
- user_hash[:user_info] = JSON.parse(response)
57
+ user_hash[:user_info] = JSON.parse(response.body)
58
58
  user_hash[:uid] = user_hash[:user_info]['id']
59
59
  user_hash
60
60
  end
@@ -10,7 +10,7 @@ module Sorcery
10
10
 
11
11
  module InstanceMethods
12
12
  def increment(attr)
13
- self.inc(attr,1)
13
+ self.class.increment(id, attr => 1)
14
14
  end
15
15
 
16
16
  def save!(options = {})
@@ -72,8 +72,8 @@ module Sorcery
72
72
  def get_current_users
73
73
  config = sorcery_config
74
74
  where(config.last_activity_at_attribute_name.ne => nil) \
75
- .any_of({config.last_logout_at_attribute_name => nil},{config.last_activity_at_attribute_name.gt => config.last_logout_at_attribute_name}) \
76
- .and(config.last_activity_at_attribute_name.gt => config.activity_timeout.seconds.ago.utc.to_s(:db)).order_by([:_id,:asc])
75
+ .and("this.#{config.last_logout_at_attribute_name} == null || this.#{config.last_activity_at_attribute_name} > this.#{config.last_logout_at_attribute_name}") \
76
+ .and(config.last_activity_at_attribute_name.gt => config.activity_timeout.seconds.ago.utc).order_by([:_id,:asc])
77
77
  end
78
78
  end
79
79
  end
@@ -37,12 +37,12 @@ module Sorcery
37
37
  protected
38
38
 
39
39
  def define_brute_force_protection_mongoid_fields
40
- field sorcery_config.failed_logins_count_attribute_name, :type => Integer
40
+ field sorcery_config.failed_logins_count_attribute_name, :type => Integer, :default => 0
41
41
  field sorcery_config.lock_expires_at_attribute_name, :type => Time
42
42
  end
43
43
 
44
44
  def define_brute_force_protection_mongo_mapper_fields
45
- key sorcery_config.failed_logins_count_attribute_name, Integer
45
+ key sorcery_config.failed_logins_count_attribute_name, Integer, :default => 0
46
46
  key sorcery_config.lock_expires_at_attribute_name, Time
47
47
  end
48
48
  end
@@ -18,6 +18,11 @@ module Sorcery
18
18
  # protection.
19
19
 
20
20
  :reset_password_mailer, # mailer class. Needed.
21
+
22
+ :reset_password_mailer_disabled, # when true sorcery will not automatically
23
+ # email password reset details and allow you to
24
+ # manually handle how and when email is sent
25
+
21
26
  :reset_password_email_method_name, # reset password email method on your
22
27
  # mailer class.
23
28
 
@@ -34,6 +39,7 @@ module Sorcery
34
39
  :@reset_password_token_expires_at_attribute_name => :reset_password_token_expires_at,
35
40
  :@reset_password_email_sent_at_attribute_name => :reset_password_email_sent_at,
36
41
  :@reset_password_mailer => nil,
42
+ :@reset_password_mailer_disabled => false,
37
43
  :@reset_password_email_method_name => :reset_password_email,
38
44
  :@reset_password_expiration_period => nil,
39
45
  :@reset_password_time_between_emails => 5 * 60 )
@@ -64,10 +70,11 @@ module Sorcery
64
70
 
65
71
  protected
66
72
 
67
- # This submodule requires the developer to define his own mailer class to be used by it.
73
+ # This submodule requires the developer to define his own mailer class to be used by it
74
+ # when reset_password_mailer_disabled is false
68
75
  def validate_mailer_defined
69
76
  msg = "To use reset_password submodule, you must define a mailer (config.reset_password_mailer = YourMailerClass)."
70
- raise ArgumentError, msg if @sorcery_config.reset_password_mailer == nil
77
+ raise ArgumentError, msg if @sorcery_config.reset_password_mailer == nil and @sorcery_config.reset_password_mailer_disabled == false
71
78
  end
72
79
 
73
80
  def define_reset_password_mongoid_fields
@@ -94,7 +101,7 @@ module Sorcery
94
101
  self.send(:"#{config.reset_password_email_sent_at_attribute_name}=", Time.now.in_time_zone)
95
102
  self.class.transaction do
96
103
  self.save!(:validate => false)
97
- generic_send_email(:reset_password_email_method_name, :reset_password_mailer)
104
+ generic_send_email(:reset_password_email_method_name, :reset_password_mailer) unless config.reset_password_mailer_disabled
98
105
  end
99
106
  end
100
107
 
@@ -20,7 +20,13 @@ module Sorcery
20
20
  :activation_token_expiration_period, # how many seconds before the activation code
21
21
  # expires. nil for never expires.
22
22
 
23
- :user_activation_mailer, # your mailer class. Required.
23
+ :user_activation_mailer, # your mailer class. Required when
24
+ # activation_mailer_disabled == false.
25
+
26
+ :activation_mailer_disabled, # when true sorcery will not automatically
27
+ # email activation details and allow you to
28
+ # manually handle how and when email is sent
29
+
24
30
  :activation_needed_email_method_name, # activation needed email method on your
25
31
  # mailer class.
26
32
 
@@ -37,6 +43,7 @@ module Sorcery
37
43
  :@activation_token_expires_at_attribute_name => :activation_token_expires_at,
38
44
  :@activation_token_expiration_period => nil,
39
45
  :@user_activation_mailer => nil,
46
+ :@activation_mailer_disabled => false,
40
47
  :@activation_needed_email_method_name => :activation_needed_email,
41
48
  :@activation_success_email_method_name => :activation_success_email,
42
49
  :@prevent_non_active_users_to_login => true)
@@ -47,7 +54,7 @@ module Sorcery
47
54
  # don't setup activation if no password supplied - this user is created automatically
48
55
  before_create :setup_activation, :if => Proc.new { |user| user.send(sorcery_config.password_attribute_name).present? }
49
56
  # don't send activation needed email if no crypted password created - this user is external (OAuth etc.)
50
- after_create :send_activation_needed_email!, :if => Proc.new { |user| !user.external?}
57
+ after_create :send_activation_needed_email!, :if => Proc.new { |user| !user.external? }
51
58
  end
52
59
 
53
60
  base.sorcery_config.after_config << :validate_mailer_defined
@@ -74,10 +81,11 @@ module Sorcery
74
81
 
75
82
  protected
76
83
 
77
- # This submodule requires the developer to define his own mailer class to be used by it.
84
+ # This submodule requires the developer to define his own mailer class to be used by it
85
+ # when activation_mailer_disabled is false
78
86
  def validate_mailer_defined
79
87
  msg = "To use user_activation submodule, you must define a mailer (config.user_activation_mailer = YourMailerClass)."
80
- raise ArgumentError, msg if @sorcery_config.user_activation_mailer == nil
88
+ raise ArgumentError, msg if @sorcery_config.user_activation_mailer == nil and @sorcery_config.activation_mailer_disabled == false
81
89
  end
82
90
 
83
91
  def define_user_activation_mongoid_fields
@@ -119,11 +127,11 @@ module Sorcery
119
127
 
120
128
  # called automatically after user initial creation.
121
129
  def send_activation_needed_email!
122
- generic_send_email(:activation_needed_email_method_name, :user_activation_mailer) unless sorcery_config.activation_needed_email_method_name.nil?
130
+ generic_send_email(:activation_needed_email_method_name, :user_activation_mailer) unless sorcery_config.activation_needed_email_method_name.nil? or sorcery_config.activation_mailer_disabled == true
123
131
  end
124
132
 
125
133
  def send_activation_success_email!
126
- generic_send_email(:activation_success_email_method_name, :user_activation_mailer) unless sorcery_config.activation_success_email_method_name.nil?
134
+ generic_send_email(:activation_success_email_method_name, :user_activation_mailer) unless sorcery_config.activation_success_email_method_name.nil? or sorcery_config.activation_mailer_disabled == true
127
135
  end
128
136
 
129
137
  def prevent_non_active_login
data/sorcery.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "sorcery"
8
- s.version = "0.7.6"
8
+ s.version = "0.7.7"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Noam Ben Ari"]
12
- s.date = "2012-01-03"
12
+ s.date = "2012-03-03"
13
13
  s.description = "Provides common authentication needs such as signing in/out, activating by email and resetting password."
14
14
  s.email = "nbenari@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.files = [
20
20
  ".document",
21
21
  ".rspec",
22
+ ".travis.yml",
22
23
  "Gemfile",
23
24
  "Gemfile.lock",
24
25
  "LICENSE.txt",
@@ -427,8 +428,8 @@ Gem::Specification.new do |s|
427
428
  s.specification_version = 3
428
429
 
429
430
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
430
- s.add_runtime_dependency(%q<oauth>, ["~> 0.4.4"])
431
- s.add_runtime_dependency(%q<oauth2>, ["~> 0.5.1"])
431
+ s.add_runtime_dependency(%q<sorcery>, [">= 0"])
432
+ s.add_development_dependency(%q<bcrypt-ruby>, ["~> 3.0.0"])
432
433
  s.add_development_dependency(%q<rails>, [">= 3.0.0"])
433
434
  s.add_development_dependency(%q<json>, [">= 1.5.1"])
434
435
  s.add_development_dependency(%q<rspec>, ["~> 2.5.0"])
@@ -439,13 +440,15 @@ Gem::Specification.new do |s|
439
440
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
440
441
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
441
442
  s.add_development_dependency(%q<simplecov>, [">= 0.3.8"])
443
+ s.add_development_dependency(%q<capybara>, [">= 1.1.2"])
444
+ s.add_development_dependency(%q<mongoid>, ["~> 2.4.4"])
442
445
  s.add_development_dependency(%q<timecop>, [">= 0"])
443
446
  s.add_runtime_dependency(%q<bcrypt-ruby>, ["~> 3.0.0"])
444
447
  s.add_runtime_dependency(%q<oauth>, ["~> 0.4.4"])
445
448
  s.add_runtime_dependency(%q<oauth2>, ["~> 0.5.1"])
446
449
  else
447
- s.add_dependency(%q<oauth>, ["~> 0.4.4"])
448
- s.add_dependency(%q<oauth2>, ["~> 0.5.1"])
450
+ s.add_dependency(%q<sorcery>, [">= 0"])
451
+ s.add_dependency(%q<bcrypt-ruby>, ["~> 3.0.0"])
449
452
  s.add_dependency(%q<rails>, [">= 3.0.0"])
450
453
  s.add_dependency(%q<json>, [">= 1.5.1"])
451
454
  s.add_dependency(%q<rspec>, ["~> 2.5.0"])
@@ -456,14 +459,16 @@ Gem::Specification.new do |s|
456
459
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
457
460
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
458
461
  s.add_dependency(%q<simplecov>, [">= 0.3.8"])
462
+ s.add_dependency(%q<capybara>, [">= 1.1.2"])
463
+ s.add_dependency(%q<mongoid>, ["~> 2.4.4"])
459
464
  s.add_dependency(%q<timecop>, [">= 0"])
460
465
  s.add_dependency(%q<bcrypt-ruby>, ["~> 3.0.0"])
461
466
  s.add_dependency(%q<oauth>, ["~> 0.4.4"])
462
467
  s.add_dependency(%q<oauth2>, ["~> 0.5.1"])
463
468
  end
464
469
  else
465
- s.add_dependency(%q<oauth>, ["~> 0.4.4"])
466
- s.add_dependency(%q<oauth2>, ["~> 0.5.1"])
470
+ s.add_dependency(%q<sorcery>, [">= 0"])
471
+ s.add_dependency(%q<bcrypt-ruby>, ["~> 3.0.0"])
467
472
  s.add_dependency(%q<rails>, [">= 3.0.0"])
468
473
  s.add_dependency(%q<json>, [">= 1.5.1"])
469
474
  s.add_dependency(%q<rspec>, ["~> 2.5.0"])
@@ -474,6 +479,8 @@ Gem::Specification.new do |s|
474
479
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
475
480
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
476
481
  s.add_dependency(%q<simplecov>, [">= 0.3.8"])
482
+ s.add_dependency(%q<capybara>, [">= 1.1.2"])
483
+ s.add_dependency(%q<mongoid>, ["~> 2.4.4"])
477
484
  s.add_dependency(%q<timecop>, [">= 0"])
478
485
  s.add_dependency(%q<bcrypt-ruby>, ["~> 3.0.0"])
479
486
  s.add_dependency(%q<oauth>, ["~> 0.4.4"])
data/spec/Gemfile.lock CHANGED
@@ -1,11 +1,8 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- sorcery (0.7.5)
5
- bcrypt-ruby (~> 3.0.0)
4
+ sorcery (0.7.6)
6
5
  oauth (~> 0.4.4)
7
- oauth (~> 0.4.4)
8
- oauth2 (~> 0.5.1)
9
6
  oauth2 (~> 0.5.1)
10
7
 
11
8
  GEM
@@ -38,19 +35,19 @@ GEM
38
35
  activemodel (= 3.0.3)
39
36
  activesupport (= 3.0.3)
40
37
  activesupport (3.0.3)
41
- addressable (2.2.6)
38
+ addressable (2.2.7)
42
39
  archive-tar-minitar (0.5.2)
43
40
  arel (2.0.10)
44
41
  bcrypt-ruby (3.0.1)
45
42
  builder (2.1.2)
46
- columnize (0.3.5)
43
+ columnize (0.3.6)
47
44
  diff-lcs (1.1.3)
48
45
  erubis (2.6.6)
49
46
  abstract (>= 1.0.0)
50
- faraday (0.7.5)
51
- addressable (~> 2.2.6)
52
- multipart-post (~> 1.1.3)
53
- rack (>= 1.1.0, < 2)
47
+ faraday (0.7.6)
48
+ addressable (~> 2.2)
49
+ multipart-post (~> 1.1)
50
+ rack (~> 1.1)
54
51
  i18n (0.6.0)
55
52
  linecache19 (0.5.12)
56
53
  ruby_core_source (>= 0.1.4)
@@ -60,14 +57,14 @@ GEM
60
57
  mime-types (~> 1.16)
61
58
  treetop (~> 1.4.8)
62
59
  mime-types (1.17.2)
63
- multi_json (1.0.3)
64
- multipart-post (1.1.4)
60
+ multi_json (1.1.0)
61
+ multipart-post (1.1.5)
65
62
  oauth (0.4.5)
66
- oauth2 (0.5.1)
67
- faraday (~> 0.7.4)
68
- multi_json (~> 1.0.3)
63
+ oauth2 (0.5.2)
64
+ faraday (~> 0.7)
65
+ multi_json (~> 1.0)
69
66
  polyglot (0.3.3)
70
- rack (1.2.4)
67
+ rack (1.2.5)
71
68
  rack-mount (0.6.14)
72
69
  rack (>= 1.0.0)
73
70
  rack-test (0.5.7)
@@ -104,8 +101,8 @@ GEM
104
101
  ruby-debug-base19 (>= 0.11.19)
105
102
  ruby_core_source (0.1.5)
106
103
  archive-tar-minitar (>= 0.5.2)
107
- simplecov (0.5.4)
108
- multi_json (~> 1.0.3)
104
+ simplecov (0.6.1)
105
+ multi_json (~> 1.0)
109
106
  simplecov-html (~> 0.5.3)
110
107
  simplecov-html (0.5.3)
111
108
  thor (0.14.6)
data/spec/rails3/Gemfile CHANGED
@@ -1,5 +1,6 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
+ gem 'bcrypt-ruby', '~> 3.0.0'
3
4
  gem 'rails', '3.0.3'
4
5
  gem 'sqlite3-ruby', :require => 'sqlite3'
5
6
  gem "sorcery", '>= 0.1.0', :path => '../../'
@@ -1,11 +1,8 @@
1
1
  PATH
2
2
  remote: ../../
3
3
  specs:
4
- sorcery (0.7.5)
5
- bcrypt-ruby (~> 3.0.0)
4
+ sorcery (0.7.6)
6
5
  oauth (~> 0.4.4)
7
- oauth (~> 0.4.4)
8
- oauth2 (~> 0.5.1)
9
6
  oauth2 (~> 0.5.1)
10
7
 
11
8
  GEM
@@ -38,7 +35,7 @@ GEM
38
35
  activemodel (= 3.0.3)
39
36
  activesupport (= 3.0.3)
40
37
  activesupport (3.0.3)
41
- addressable (2.2.6)
38
+ addressable (2.2.7)
42
39
  archive-tar-minitar (0.5.2)
43
40
  arel (2.0.10)
44
41
  bcrypt-ruby (3.0.1)
@@ -50,16 +47,16 @@ GEM
50
47
  rack-test (>= 0.5.4)
51
48
  selenium-webdriver (~> 2.0)
52
49
  xpath (~> 0.1.4)
53
- childprocess (0.2.3)
50
+ childprocess (0.3.1)
54
51
  ffi (~> 1.0.6)
55
52
  columnize (0.3.6)
56
53
  diff-lcs (1.1.3)
57
54
  erubis (2.6.6)
58
55
  abstract (>= 1.0.0)
59
- faraday (0.7.5)
60
- addressable (~> 2.2.6)
61
- multipart-post (~> 1.1.3)
62
- rack (>= 1.1.0, < 2)
56
+ faraday (0.7.6)
57
+ addressable (~> 2.2)
58
+ multipart-post (~> 1.1)
59
+ rack (~> 1.1)
63
60
  ffi (1.0.11)
64
61
  i18n (0.6.0)
65
62
  launchy (2.0.5)
@@ -72,15 +69,15 @@ GEM
72
69
  mime-types (~> 1.16)
73
70
  treetop (~> 1.4.8)
74
71
  mime-types (1.17.2)
75
- multi_json (1.0.4)
76
- multipart-post (1.1.4)
72
+ multi_json (1.1.0)
73
+ multipart-post (1.1.5)
77
74
  nokogiri (1.5.0)
78
75
  oauth (0.4.5)
79
- oauth2 (0.5.1)
80
- faraday (~> 0.7.4)
81
- multi_json (~> 1.0.3)
76
+ oauth2 (0.5.2)
77
+ faraday (~> 0.7)
78
+ multi_json (~> 1.0)
82
79
  polyglot (0.3.3)
83
- rack (1.2.4)
80
+ rack (1.2.5)
84
81
  rack-mount (0.6.14)
85
82
  rack (>= 1.0.0)
86
83
  rack-test (0.5.7)
@@ -122,14 +119,14 @@ GEM
122
119
  ruby-debug-base19 (>= 0.11.19)
123
120
  ruby_core_source (0.1.5)
124
121
  archive-tar-minitar (>= 0.5.2)
125
- rubyzip (0.9.5)
126
- selenium-webdriver (2.15.0)
127
- childprocess (>= 0.2.1)
128
- ffi (~> 1.0.9)
129
- multi_json (~> 1.0.4)
122
+ rubyzip (0.9.6.1)
123
+ selenium-webdriver (2.20.0)
124
+ childprocess (>= 0.2.5)
125
+ ffi (~> 1.0)
126
+ multi_json (~> 1.0)
130
127
  rubyzip
131
- simplecov (0.5.4)
132
- multi_json (~> 1.0.3)
128
+ simplecov (0.6.1)
129
+ multi_json (~> 1.0)
133
130
  simplecov-html (~> 0.5.3)
134
131
  simplecov-html (0.5.3)
135
132
  sqlite3 (1.3.5)
@@ -148,6 +145,7 @@ PLATFORMS
148
145
  ruby
149
146
 
150
147
  DEPENDENCIES
148
+ bcrypt-ruby (~> 3.0.0)
151
149
  capybara (~> 1.1.1)
152
150
  launchy (~> 2.0.5)
153
151
  rails (= 3.0.3)