devise 3.2.2 → 4.8.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.
Files changed (236) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +281 -957
  3. data/MIT-LICENSE +2 -1
  4. data/README.md +410 -120
  5. data/app/controllers/devise/confirmations_controller.rb +11 -5
  6. data/app/controllers/devise/omniauth_callbacks_controller.rb +12 -6
  7. data/app/controllers/devise/passwords_controller.rb +21 -8
  8. data/app/controllers/devise/registrations_controller.rb +59 -26
  9. data/app/controllers/devise/sessions_controller.rb +47 -17
  10. data/app/controllers/devise/unlocks_controller.rb +9 -4
  11. data/app/controllers/devise_controller.rb +69 -33
  12. data/app/helpers/devise_helper.rb +23 -18
  13. data/app/mailers/devise/mailer.rb +13 -3
  14. data/app/views/devise/confirmations/new.html.erb +9 -5
  15. data/app/views/devise/mailer/confirmation_instructions.html.erb +1 -1
  16. data/app/views/devise/mailer/email_changed.html.erb +7 -0
  17. data/app/views/devise/mailer/password_change.html.erb +3 -0
  18. data/app/views/devise/mailer/reset_password_instructions.html.erb +1 -1
  19. data/app/views/devise/mailer/unlock_instructions.html.erb +1 -1
  20. data/app/views/devise/passwords/edit.html.erb +16 -7
  21. data/app/views/devise/passwords/new.html.erb +9 -5
  22. data/app/views/devise/registrations/edit.html.erb +29 -15
  23. data/app/views/devise/registrations/new.html.erb +20 -9
  24. data/app/views/devise/sessions/new.html.erb +19 -10
  25. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  26. data/app/views/devise/shared/{_links.erb → _links.html.erb} +9 -9
  27. data/app/views/devise/unlocks/new.html.erb +9 -5
  28. data/config/locales/en.yml +24 -18
  29. data/lib/devise/controllers/helpers.rb +113 -33
  30. data/lib/devise/controllers/rememberable.rb +15 -6
  31. data/lib/devise/controllers/scoped_views.rb +3 -1
  32. data/lib/devise/controllers/sign_in_out.rb +47 -29
  33. data/lib/devise/controllers/store_location.rb +31 -5
  34. data/lib/devise/controllers/url_helpers.rb +10 -8
  35. data/lib/devise/delegator.rb +2 -0
  36. data/lib/devise/encryptor.rb +24 -0
  37. data/lib/devise/failure_app.rb +119 -40
  38. data/lib/devise/hooks/activatable.rb +7 -6
  39. data/lib/devise/hooks/csrf_cleaner.rb +5 -1
  40. data/lib/devise/hooks/forgetable.rb +2 -0
  41. data/lib/devise/hooks/lockable.rb +5 -3
  42. data/lib/devise/hooks/proxy.rb +4 -2
  43. data/lib/devise/hooks/rememberable.rb +4 -2
  44. data/lib/devise/hooks/timeoutable.rb +16 -9
  45. data/lib/devise/hooks/trackable.rb +3 -1
  46. data/lib/devise/mailers/helpers.rb +15 -12
  47. data/lib/devise/mapping.rb +9 -3
  48. data/lib/devise/models/authenticatable.rb +91 -61
  49. data/lib/devise/models/confirmable.rb +138 -43
  50. data/lib/devise/models/database_authenticatable.rb +112 -31
  51. data/lib/devise/models/lockable.rb +39 -18
  52. data/lib/devise/models/omniauthable.rb +3 -1
  53. data/lib/devise/models/recoverable.rb +64 -28
  54. data/lib/devise/models/registerable.rb +4 -0
  55. data/lib/devise/models/rememberable.rb +62 -33
  56. data/lib/devise/models/timeoutable.rb +4 -8
  57. data/lib/devise/models/trackable.rb +20 -4
  58. data/lib/devise/models/validatable.rb +16 -9
  59. data/lib/devise/models.rb +3 -1
  60. data/lib/devise/modules.rb +12 -10
  61. data/lib/devise/omniauth/config.rb +2 -0
  62. data/lib/devise/omniauth/url_helpers.rb +14 -5
  63. data/lib/devise/omniauth.rb +4 -5
  64. data/lib/devise/orm/active_record.rb +5 -1
  65. data/lib/devise/orm/mongoid.rb +6 -2
  66. data/lib/devise/parameter_filter.rb +4 -0
  67. data/lib/devise/parameter_sanitizer.rb +139 -65
  68. data/lib/devise/rails/deprecated_constant_accessor.rb +39 -0
  69. data/lib/devise/rails/routes.rb +151 -120
  70. data/lib/devise/rails/warden_compat.rb +3 -10
  71. data/lib/devise/rails.rb +10 -13
  72. data/lib/devise/secret_key_finder.rb +27 -0
  73. data/lib/devise/strategies/authenticatable.rb +21 -10
  74. data/lib/devise/strategies/base.rb +3 -1
  75. data/lib/devise/strategies/database_authenticatable.rb +14 -6
  76. data/lib/devise/strategies/rememberable.rb +15 -3
  77. data/lib/devise/test/controller_helpers.rb +167 -0
  78. data/lib/devise/test/integration_helpers.rb +63 -0
  79. data/lib/devise/test_helpers.rb +7 -124
  80. data/lib/devise/time_inflector.rb +4 -2
  81. data/lib/devise/token_generator.rb +3 -41
  82. data/lib/devise/version.rb +3 -1
  83. data/lib/devise.rb +107 -84
  84. data/lib/generators/active_record/devise_generator.rb +64 -12
  85. data/lib/generators/active_record/templates/migration.rb +9 -7
  86. data/lib/generators/active_record/templates/migration_existing.rb +9 -7
  87. data/lib/generators/devise/controllers_generator.rb +46 -0
  88. data/lib/generators/devise/devise_generator.rb +8 -6
  89. data/lib/generators/devise/install_generator.rb +18 -1
  90. data/lib/generators/devise/orm_helpers.rb +10 -21
  91. data/lib/generators/devise/views_generator.rb +49 -28
  92. data/lib/generators/mongoid/devise_generator.rb +21 -19
  93. data/lib/generators/templates/README +13 -12
  94. data/lib/generators/templates/controllers/README +14 -0
  95. data/lib/generators/templates/controllers/confirmations_controller.rb +30 -0
  96. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +30 -0
  97. data/lib/generators/templates/controllers/passwords_controller.rb +34 -0
  98. data/lib/generators/templates/controllers/registrations_controller.rb +62 -0
  99. data/lib/generators/templates/controllers/sessions_controller.rb +27 -0
  100. data/lib/generators/templates/controllers/unlocks_controller.rb +30 -0
  101. data/lib/generators/templates/devise.rb +94 -37
  102. data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
  103. data/lib/generators/templates/markerb/email_changed.markerb +7 -0
  104. data/lib/generators/templates/markerb/password_change.markerb +3 -0
  105. data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
  106. data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
  107. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +6 -2
  108. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +12 -4
  109. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +5 -2
  110. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +14 -6
  111. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +12 -4
  112. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +11 -6
  113. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +5 -2
  114. metadata +50 -284
  115. data/.gitignore +0 -10
  116. data/.travis.yml +0 -20
  117. data/.yardopts +0 -9
  118. data/CONTRIBUTING.md +0 -14
  119. data/Gemfile +0 -31
  120. data/Gemfile.lock +0 -160
  121. data/Rakefile +0 -35
  122. data/devise.gemspec +0 -27
  123. data/devise.png +0 -0
  124. data/gemfiles/Gemfile.rails-3.2.x +0 -31
  125. data/gemfiles/Gemfile.rails-3.2.x.lock +0 -159
  126. data/test/controllers/custom_strategy_test.rb +0 -62
  127. data/test/controllers/helpers_test.rb +0 -276
  128. data/test/controllers/internal_helpers_test.rb +0 -120
  129. data/test/controllers/passwords_controller_test.rb +0 -31
  130. data/test/controllers/sessions_controller_test.rb +0 -99
  131. data/test/controllers/url_helpers_test.rb +0 -59
  132. data/test/delegator_test.rb +0 -19
  133. data/test/devise_test.rb +0 -94
  134. data/test/failure_app_test.rb +0 -232
  135. data/test/generators/active_record_generator_test.rb +0 -103
  136. data/test/generators/devise_generator_test.rb +0 -39
  137. data/test/generators/install_generator_test.rb +0 -13
  138. data/test/generators/mongoid_generator_test.rb +0 -23
  139. data/test/generators/views_generator_test.rb +0 -67
  140. data/test/helpers/devise_helper_test.rb +0 -51
  141. data/test/integration/authenticatable_test.rb +0 -713
  142. data/test/integration/confirmable_test.rb +0 -284
  143. data/test/integration/database_authenticatable_test.rb +0 -84
  144. data/test/integration/http_authenticatable_test.rb +0 -105
  145. data/test/integration/lockable_test.rb +0 -239
  146. data/test/integration/omniauthable_test.rb +0 -133
  147. data/test/integration/recoverable_test.rb +0 -334
  148. data/test/integration/registerable_test.rb +0 -349
  149. data/test/integration/rememberable_test.rb +0 -167
  150. data/test/integration/timeoutable_test.rb +0 -183
  151. data/test/integration/trackable_test.rb +0 -92
  152. data/test/mailers/confirmation_instructions_test.rb +0 -115
  153. data/test/mailers/reset_password_instructions_test.rb +0 -96
  154. data/test/mailers/unlock_instructions_test.rb +0 -91
  155. data/test/mapping_test.rb +0 -127
  156. data/test/models/authenticatable_test.rb +0 -13
  157. data/test/models/confirmable_test.rb +0 -454
  158. data/test/models/database_authenticatable_test.rb +0 -249
  159. data/test/models/lockable_test.rb +0 -298
  160. data/test/models/omniauthable_test.rb +0 -7
  161. data/test/models/recoverable_test.rb +0 -184
  162. data/test/models/registerable_test.rb +0 -7
  163. data/test/models/rememberable_test.rb +0 -183
  164. data/test/models/serializable_test.rb +0 -49
  165. data/test/models/timeoutable_test.rb +0 -51
  166. data/test/models/trackable_test.rb +0 -13
  167. data/test/models/validatable_test.rb +0 -127
  168. data/test/models_test.rb +0 -144
  169. data/test/omniauth/config_test.rb +0 -57
  170. data/test/omniauth/url_helpers_test.rb +0 -54
  171. data/test/orm/active_record.rb +0 -10
  172. data/test/orm/mongoid.rb +0 -13
  173. data/test/parameter_sanitizer_test.rb +0 -81
  174. data/test/rails_app/Rakefile +0 -6
  175. data/test/rails_app/app/active_record/admin.rb +0 -6
  176. data/test/rails_app/app/active_record/shim.rb +0 -2
  177. data/test/rails_app/app/active_record/user.rb +0 -6
  178. data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -6
  179. data/test/rails_app/app/controllers/admins_controller.rb +0 -11
  180. data/test/rails_app/app/controllers/application_controller.rb +0 -9
  181. data/test/rails_app/app/controllers/home_controller.rb +0 -25
  182. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -2
  183. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -2
  184. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -14
  185. data/test/rails_app/app/controllers/users_controller.rb +0 -31
  186. data/test/rails_app/app/helpers/application_helper.rb +0 -3
  187. data/test/rails_app/app/mailers/users/mailer.rb +0 -12
  188. data/test/rails_app/app/mongoid/admin.rb +0 -29
  189. data/test/rails_app/app/mongoid/shim.rb +0 -23
  190. data/test/rails_app/app/mongoid/user.rb +0 -39
  191. data/test/rails_app/app/views/admins/index.html.erb +0 -1
  192. data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
  193. data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
  194. data/test/rails_app/app/views/home/index.html.erb +0 -1
  195. data/test/rails_app/app/views/home/join.html.erb +0 -1
  196. data/test/rails_app/app/views/home/private.html.erb +0 -1
  197. data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
  198. data/test/rails_app/app/views/layouts/application.html.erb +0 -24
  199. data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
  200. data/test/rails_app/app/views/users/index.html.erb +0 -1
  201. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
  202. data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
  203. data/test/rails_app/bin/bundle +0 -3
  204. data/test/rails_app/bin/rails +0 -4
  205. data/test/rails_app/bin/rake +0 -4
  206. data/test/rails_app/config/application.rb +0 -40
  207. data/test/rails_app/config/boot.rb +0 -14
  208. data/test/rails_app/config/database.yml +0 -18
  209. data/test/rails_app/config/environment.rb +0 -5
  210. data/test/rails_app/config/environments/development.rb +0 -30
  211. data/test/rails_app/config/environments/production.rb +0 -80
  212. data/test/rails_app/config/environments/test.rb +0 -36
  213. data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  214. data/test/rails_app/config/initializers/devise.rb +0 -181
  215. data/test/rails_app/config/initializers/inflections.rb +0 -2
  216. data/test/rails_app/config/initializers/secret_token.rb +0 -8
  217. data/test/rails_app/config/initializers/session_store.rb +0 -1
  218. data/test/rails_app/config/routes.rb +0 -104
  219. data/test/rails_app/config.ru +0 -4
  220. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -71
  221. data/test/rails_app/db/schema.rb +0 -55
  222. data/test/rails_app/lib/shared_admin.rb +0 -17
  223. data/test/rails_app/lib/shared_user.rb +0 -29
  224. data/test/rails_app/public/404.html +0 -26
  225. data/test/rails_app/public/422.html +0 -26
  226. data/test/rails_app/public/500.html +0 -26
  227. data/test/rails_app/public/favicon.ico +0 -0
  228. data/test/routes_test.rb +0 -250
  229. data/test/support/assertions.rb +0 -40
  230. data/test/support/helpers.rb +0 -70
  231. data/test/support/integration.rb +0 -92
  232. data/test/support/locale/en.yml +0 -8
  233. data/test/support/webrat/integrations/rails.rb +0 -24
  234. data/test/test_helper.rb +0 -27
  235. data/test/test_helpers_test.rb +0 -173
  236. data/test/test_models.rb +0 -33
@@ -1,99 +1,173 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
- class BaseSanitizer
3
- attr_reader :params, :resource_name, :resource_class
4
+ # The +ParameterSanitizer+ deals with permitting specific parameters values
5
+ # for each +Devise+ scope in the application.
6
+ #
7
+ # The sanitizer knows about Devise default parameters (like +password+ and
8
+ # +password_confirmation+ for the `RegistrationsController`), and you can
9
+ # extend or change the permitted parameters list on your controllers.
10
+ #
11
+ # === Permitting new parameters
12
+ #
13
+ # You can add new parameters to the permitted list using the +permit+ method
14
+ # in a +before_action+ method, for instance.
15
+ #
16
+ # class ApplicationController < ActionController::Base
17
+ # before_action :configure_permitted_parameters, if: :devise_controller?
18
+ #
19
+ # protected
20
+ #
21
+ # def configure_permitted_parameters
22
+ # # Permit the `subscribe_newsletter` parameter along with the other
23
+ # # sign up parameters.
24
+ # devise_parameter_sanitizer.permit(:sign_up, keys: [:subscribe_newsletter])
25
+ # end
26
+ # end
27
+ #
28
+ # Using a block yields an +ActionController::Parameters+ object so you can
29
+ # permit nested parameters and have more control over how the parameters are
30
+ # permitted in your controller.
31
+ #
32
+ # def configure_permitted_parameters
33
+ # devise_parameter_sanitizer.permit(:sign_up) do |user|
34
+ # user.permit(newsletter_preferences: [])
35
+ # end
36
+ # end
37
+ class ParameterSanitizer
38
+ DEFAULT_PERMITTED_ATTRIBUTES = {
39
+ sign_in: [:password, :remember_me],
40
+ sign_up: [:password, :password_confirmation],
41
+ account_update: [:password, :password_confirmation, :current_password]
42
+ }
4
43
 
5
44
  def initialize(resource_class, resource_name, params)
6
- @resource_class = resource_class
7
- @resource_name = resource_name
45
+ @auth_keys = extract_auth_keys(resource_class)
8
46
  @params = params
9
- @blocks = Hash.new
10
- end
47
+ @resource_name = resource_name
48
+ @permitted = {}
11
49
 
12
- def for(kind, &block)
13
- if block_given?
14
- @blocks[kind] = block
15
- else
16
- default_for(kind)
50
+ DEFAULT_PERMITTED_ATTRIBUTES.each_pair do |action, keys|
51
+ permit(action, keys: keys)
17
52
  end
18
53
  end
19
54
 
20
- def sanitize(kind)
21
- if block = @blocks[kind]
22
- block.call(default_params)
55
+ # Sanitize the parameters for a specific +action+.
56
+ #
57
+ # === Arguments
58
+ #
59
+ # * +action+ - A +Symbol+ with the action that the controller is
60
+ # performing, like +sign_up+, +sign_in+, etc.
61
+ #
62
+ # === Examples
63
+ #
64
+ # # Inside the `RegistrationsController#create` action.
65
+ # resource = build_resource(devise_parameter_sanitizer.sanitize(:sign_up))
66
+ # resource.save
67
+ #
68
+ # Returns an +ActiveSupport::HashWithIndifferentAccess+ with the permitted
69
+ # attributes.
70
+ def sanitize(action)
71
+ permissions = @permitted[action]
72
+
73
+ if permissions.respond_to?(:call)
74
+ cast_to_hash permissions.call(default_params)
75
+ elsif permissions.present?
76
+ cast_to_hash permit_keys(default_params, permissions)
23
77
  else
24
- default_sanitize(kind)
78
+ unknown_action!(action)
25
79
  end
26
80
  end
27
81
 
28
- private
82
+ # Add or remove new parameters to the permitted list of an +action+.
83
+ #
84
+ # === Arguments
85
+ #
86
+ # * +action+ - A +Symbol+ with the action that the controller is
87
+ # performing, like +sign_up+, +sign_in+, etc.
88
+ # * +keys:+ - An +Array+ of keys that also should be permitted.
89
+ # * +except:+ - An +Array+ of keys that shouldn't be permitted.
90
+ # * +block+ - A block that should be used to permit the action
91
+ # parameters instead of the +Array+ based approach. The block will be
92
+ # called with an +ActionController::Parameters+ instance.
93
+ #
94
+ # === Examples
95
+ #
96
+ # # Adding new parameters to be permitted in the `sign_up` action.
97
+ # devise_parameter_sanitizer.permit(:sign_up, keys: [:subscribe_newsletter])
98
+ #
99
+ # # Removing the `password` parameter from the `account_update` action.
100
+ # devise_parameter_sanitizer.permit(:account_update, except: [:password])
101
+ #
102
+ # # Using the block form to completely override how we permit the
103
+ # # parameters for the `sign_up` action.
104
+ # devise_parameter_sanitizer.permit(:sign_up) do |user|
105
+ # user.permit(:email, :password, :password_confirmation)
106
+ # end
107
+ #
108
+ #
109
+ # Returns nothing.
110
+ def permit(action, keys: nil, except: nil, &block)
111
+ if block_given?
112
+ @permitted[action] = block
113
+ end
29
114
 
30
- def default_for(kind)
31
- raise ArgumentError, "a block is expected in Devise base sanitizer"
32
- end
115
+ if keys.present?
116
+ @permitted[action] ||= @auth_keys.dup
117
+ @permitted[action].concat(keys)
118
+ end
33
119
 
34
- def default_sanitize(kind)
35
- default_params
120
+ if except.present?
121
+ @permitted[action] ||= @auth_keys.dup
122
+ @permitted[action] = @permitted[action] - except
123
+ end
36
124
  end
37
125
 
38
- def default_params
39
- params.fetch(resource_name, {})
40
- end
41
- end
126
+ private
42
127
 
43
- class ParameterSanitizer < BaseSanitizer
44
- def initialize(*)
45
- super
46
- @permitted = Hash.new { |h,k| h[k] = attributes_for(k) }
128
+ # Cast a sanitized +ActionController::Parameters+ to a +HashWithIndifferentAccess+
129
+ # that can be used elsewhere.
130
+ #
131
+ # Returns an +ActiveSupport::HashWithIndifferentAccess+.
132
+ def cast_to_hash(params)
133
+ # TODO: Remove the `with_indifferent_access` method call when we only support Rails 5+.
134
+ params && params.to_h.with_indifferent_access
47
135
  end
48
136
 
49
- def sign_in
50
- permit self.for(:sign_in)
137
+ def default_params
138
+ if hashable_resource_params?
139
+ @params.fetch(@resource_name)
140
+ else
141
+ empty_params
142
+ end
51
143
  end
52
144
 
53
- def sign_up
54
- permit self.for(:sign_up)
145
+ def hashable_resource_params?
146
+ @params[@resource_name].respond_to?(:permit)
55
147
  end
56
148
 
57
- def account_update
58
- permit self.for(:account_update)
149
+ def empty_params
150
+ ActionController::Parameters.new({})
59
151
  end
60
152
 
61
- private
62
-
63
- # TODO: We do need to flatten so it works with strong_parameters
64
- # gem. We should drop it once we move to Rails 4 only support.
65
- def permit(keys)
66
- default_params.permit(*Array(keys))
153
+ def permit_keys(parameters, keys)
154
+ parameters.permit(*keys)
67
155
  end
68
156
 
69
- # Change for(kind) to return the values in the @permitted
70
- # hash, allowing the developer to customize at runtime.
71
- def default_for(kind)
72
- @permitted[kind] || raise("No sanitizer provided for #{kind}")
73
- end
157
+ def extract_auth_keys(klass)
158
+ auth_keys = klass.authentication_keys
74
159
 
75
- def default_sanitize(kind)
76
- if respond_to?(kind, true)
77
- send(kind)
78
- else
79
- raise NotImplementedError, "Devise doesn't know how to sanitize parameters for #{kind}"
80
- end
160
+ auth_keys.respond_to?(:keys) ? auth_keys.keys : auth_keys
81
161
  end
82
162
 
83
- def attributes_for(kind)
84
- case kind
85
- when :sign_in
86
- auth_keys + [:password, :remember_me]
87
- when :sign_up
88
- auth_keys + [:password, :password_confirmation]
89
- when :account_update
90
- auth_keys + [:password, :password_confirmation, :current_password]
91
- end
92
- end
163
+ def unknown_action!(action)
164
+ raise NotImplementedError, <<-MESSAGE.strip_heredoc
165
+ "Devise doesn't know how to sanitize parameters for '#{action}'".
166
+ If you want to define a new set of parameters to be sanitized use the
167
+ `permit` method first:
93
168
 
94
- def auth_keys
95
- @auth_keys ||= @resource_class.authentication_keys.respond_to?(:keys) ?
96
- @resource_class.authentication_keys.keys : @resource_class.authentication_keys
169
+ devise_parameter_sanitizer.permit(:#{action}, keys: [:param1, :param2, :param3])
170
+ MESSAGE
97
171
  end
98
172
  end
99
173
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ require 'active_support/deprecation/constant_accessor'
5
+
6
+ module Devise
7
+ DeprecatedConstantAccessor = ActiveSupport::Deprecation::DeprecatedConstantAccessor #:nodoc:
8
+ end
9
+ rescue LoadError
10
+
11
+ # Copy of constant deprecation module from Rails / Active Support version 6, so we can use it
12
+ # with Rails <= 5.0 versions. This can be removed once we support only Rails 5.1 or greater.
13
+ module Devise
14
+ module DeprecatedConstantAccessor #:nodoc:
15
+ def self.included(base)
16
+ require "active_support/inflector/methods"
17
+
18
+ extension = Module.new do
19
+ def const_missing(missing_const_name)
20
+ if class_variable_defined?(:@@_deprecated_constants)
21
+ if (replacement = class_variable_get(:@@_deprecated_constants)[missing_const_name.to_s])
22
+ replacement[:deprecator].warn(replacement[:message] || "#{name}::#{missing_const_name} is deprecated! Use #{replacement[:new]} instead.", Rails::VERSION::MAJOR == 4 ? caller : caller_locations)
23
+ return ActiveSupport::Inflector.constantize(replacement[:new].to_s)
24
+ end
25
+ end
26
+ super
27
+ end
28
+
29
+ def deprecate_constant(const_name, new_constant, message: nil, deprecator: ActiveSupport::Deprecation.instance)
30
+ class_variable_set(:@@_deprecated_constants, {}) unless class_variable_defined?(:@@_deprecated_constants)
31
+ class_variable_get(:@@_deprecated_constants)[const_name.to_s] = { new: new_constant, message: message, deprecator: deprecator }
32
+ end
33
+ end
34
+ base.singleton_class.prepend extension
35
+ end
36
+ end
37
+ end
38
+
39
+ end