Skip to content

Commit e7f809d

Browse files
committed
Do not require ActiveRecord to be loaded to use Devise.
1 parent 5f49852 commit e7f809d

File tree

13 files changed

+102
-82
lines changed

13 files changed

+102
-82
lines changed

CHANGELOG.rdoc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
* enhancement
2+
* [#16] Allow devise to be more agnostic. Do not require ActiveRecord to be loaded.
3+
4+
* deprecations
5+
* Model configuration is on Devise::Models.config and not on Devise.config anymore.
6+
7+
== 0.3.0
8+
19
* bug fix
210
* [#15] Allow yml messages to be configured by not using engine locales
311

README.rdoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ In addition to :except, you can provide some options to devise call:
111111

112112
devise :all, :remember_for => 2.weeks
113113

114-
All those values can also be set in a global way by setting them in Devise:
114+
All those values can also be set in a global way by setting them in Devise::Models:
115115

116-
Devise.confirm_within = 1.week
116+
Devise::Models.confirm_within = 1.week
117117

118118
== Routes
119119

lib/devise.rb

Lines changed: 6 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -9,63 +9,23 @@ module Devise
99
}.freeze
1010

1111
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].freeze
12-
13-
# Creates configuration values for Devise and for the given module.
14-
#
15-
# Devise.model_config(Devise::Authenticable, :stretches, 10)
16-
#
17-
# The line above creates:
18-
#
19-
# 1) An accessor called Devise.stretches, which value is used by default;
20-
#
21-
# 2) Some class methods for your model Model.stretches and Model.stretches=
22-
# which have higher priority than Devise.stretches;
23-
#
24-
# 3) And an instance method stretches.
25-
#
26-
# To add the class methods you need to have a module ClassMethods defined
27-
# inside the given class.
28-
#
29-
def self.model_config(mod, accessor, default=nil) #:nodoc:
30-
mattr_accessor accessor
31-
send(:"#{accessor}=", default)
32-
33-
mod.class_eval <<-METHOD, __FILE__, __LINE__
34-
def #{accessor}
35-
self.class.#{accessor}
36-
end
37-
METHOD
38-
39-
mod.const_get(:ClassMethods).class_eval <<-METHOD, __FILE__, __LINE__
40-
def #{accessor}
41-
if defined?(@#{accessor})
42-
@#{accessor}
43-
elsif superclass.respond_to?(:#{accessor})
44-
superclass.#{accessor}
45-
else
46-
Devise.#{accessor}
47-
end
48-
end
49-
50-
def #{accessor}=(value)
51-
@#{accessor} = value
52-
end
53-
METHOD
54-
end
5512
end
5613

5714
# Devise initialization process goes like this:
5815
#
59-
# 1) Include Devise::ActiveRecord and Devise::Migrations
16+
# 1) Includes in Devise::ActiveRecord and Devise::Migrations
6017
# 2) Load and config warden
6118
# 3) Load devise mapping structure
6219
# 4) Add routes extensions
6320
# 5) Load routes definitions
6421
# 6) Include filters and helpers in controllers and views
6522
#
6623
Rails.configuration.after_initialize do
67-
ActiveRecord::Base.extend Devise::ActiveRecord
68-
ActiveRecord::ConnectionAdapters::TableDefinition.send :include, Devise::Migrations
24+
if defined?(ActiveRecord)
25+
ActiveRecord::Base.extend Devise::Models
26+
ActiveRecord::ConnectionAdapters::TableDefinition.send :include, Devise::Migrations
27+
end
28+
6929
I18n.load_path.unshift File.expand_path(File.join(File.dirname(__FILE__), 'devise', 'locales', 'en.yml'))
7030
end
7131

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,57 @@
11
module Devise
2-
module ActiveRecord
2+
module Models
3+
# Creates configuration values for Devise and for the given module.
4+
#
5+
# Devise::Models.config(Devise::Authenticable, :stretches, 10)
6+
#
7+
# The line above creates:
8+
#
9+
# 1) An accessor called Devise::Models.stretches, which value is used by default;
10+
#
11+
# 2) Some class methods for your model Model.stretches and Model.stretches=
12+
# which have higher priority than Devise.stretches;
13+
#
14+
# 3) And an instance method stretches.
15+
#
16+
# To add the class methods you need to have a module ClassMethods defined
17+
# inside the given class.
18+
#
19+
def self.config(mod, accessor, default=nil) #:nodoc:
20+
mattr_accessor accessor
21+
send(:"#{accessor}=", default)
22+
23+
# TODO Remove me in a next release
24+
Devise.class_eval <<-METHOD, __FILE__, __LINE__
25+
def self.#{accessor}=(value)
26+
ActiveSupport::Deprecation.warn "Devise.#{accessor}= is deprecated, " <<
27+
"use Devise::Models.#{accessor}= instead."
28+
Devise::Models.#{accessor} = value
29+
end
30+
METHOD
31+
32+
mod.class_eval <<-METHOD, __FILE__, __LINE__
33+
def #{accessor}
34+
self.class.#{accessor}
35+
end
36+
METHOD
37+
38+
mod.const_get(:ClassMethods).class_eval <<-METHOD, __FILE__, __LINE__
39+
def #{accessor}
40+
if defined?(@#{accessor})
41+
@#{accessor}
42+
elsif superclass.respond_to?(:#{accessor})
43+
superclass.#{accessor}
44+
else
45+
Devise::Models.#{accessor}
46+
end
47+
end
48+
49+
def #{accessor}=(value)
50+
@#{accessor} = value
51+
end
52+
METHOD
53+
end
54+
355
# Shortcut method for including all devise modules inside your model.
456
# You can give some extra options while declaring devise in your model:
557
#

lib/devise/models/authenticatable.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ def find_or_initialize_with_error_by_email(email)
9090
end
9191
end
9292

93-
Devise.model_config(self, :pepper)
94-
Devise.model_config(self, :stretches, 10)
93+
Devise::Models.config(self, :pepper)
94+
Devise::Models.config(self, :stretches, 10)
9595
end
9696
end
9797
end

lib/devise/models/confirmable.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def confirm!(attributes={})
150150
end
151151
end
152152

153-
Devise.model_config(self, :confirm_within, 0.days)
153+
Devise::Models.config(self, :confirm_within, 0.days)
154154
end
155155
end
156156
end

lib/devise/models/rememberable.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def serialize_from_cookie(cookie)
8989
end
9090
end
9191

92-
Devise.model_config(self, :remember_for, 2.weeks)
92+
Devise::Models.config(self, :remember_for, 2.weeks)
9393
end
9494
end
9595
end

test/integration/confirmable_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,15 @@ def visit_user_confirmation_with_token(confirmation_token)
5959
end
6060

6161
test 'not confirmed user and setup to block without confirmation should not be able to sign in' do
62-
Devise.confirm_within = 0
62+
Devise::Models.confirm_within = 0
6363
user = sign_in_as_user(:confirm => false)
6464

6565
assert_redirected_to new_user_session_path(:unconfirmed => true)
6666
assert_not warden.authenticated?(:user)
6767
end
6868

6969
test 'not confirmed user but configured with some days to confirm should be able to sign in' do
70-
Devise.confirm_within = 1
70+
Devise::Models.confirm_within = 1
7171
user = sign_in_as_user(:confirm => false)
7272

7373
assert_response :success

test/integration/rememberable_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
class RememberMeTest < ActionController::IntegrationTest
44

55
def create_user_and_remember(add_to_token='')
6-
Devise.remember_for = 1
6+
Devise::Models.remember_for = 1
77
user = create_user
88
user.remember_me!
99
cookies['remember_token'] = User.serialize_into_cookie(user) + add_to_token
@@ -39,7 +39,7 @@ def create_user_and_remember(add_to_token='')
3939

4040
test 'do not remember with token expired' do
4141
user = create_user_and_remember
42-
Devise.remember_for = 0
42+
Devise::Models.remember_for = 0
4343
get users_path
4444
assert_response :success
4545
assert_not warden.authenticated?(:user)

test/models/authenticatable_test.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,28 +66,28 @@ def encrypt_password(user, pepper=nil, stretches=1)
6666

6767
test 'should fallback to devise pepper default configuring' do
6868
begin
69-
Devise.pepper = ''
69+
Devise::Models.pepper = ''
7070
user = new_user
7171
assert_equal encrypt_password(user), user.encrypted_password
72-
Devise.pepper = 'new_pepper'
72+
Devise::Models.pepper = 'new_pepper'
7373
user = new_user
7474
assert_equal encrypt_password(user, 'new_pepper'), user.encrypted_password
75-
Devise.pepper = '123456'
75+
Devise::Models.pepper = '123456'
7676
user = new_user
7777
assert_equal encrypt_password(user, '123456'), user.encrypted_password
7878
ensure
79-
Devise.pepper = nil
79+
Devise::Models.pepper = nil
8080
end
8181
end
8282

8383
test 'should fallback to devise stretches default configuring' do
8484
begin
85-
default_stretches = Devise.stretches
86-
Devise.stretches = 1
85+
default_stretches = Devise::Models.stretches
86+
Devise::Models.stretches = 1
8787
user = new_user
8888
assert_equal encrypt_password(user, nil, nil), user.encrypted_password
8989
ensure
90-
Devise.stretches = default_stretches
90+
Devise::Models.stretches = default_stretches
9191
end
9292
end
9393

0 commit comments

Comments
 (0)