clearance 2.3.1 → 2.6.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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests.yml +5 -13
  3. data/Appraisals +9 -13
  4. data/{NEWS.md → CHANGELOG.md} +42 -1
  5. data/Gemfile.lock +122 -94
  6. data/README.md +34 -4
  7. data/app/controllers/clearance/passwords_controller.rb +6 -6
  8. data/app/controllers/clearance/sessions_controller.rb +1 -1
  9. data/app/controllers/clearance/users_controller.rb +1 -1
  10. data/app/views/passwords/new.html.erb +1 -1
  11. data/app/views/sessions/_form.html.erb +1 -1
  12. data/app/views/users/_form.html.erb +1 -1
  13. data/clearance.gemspec +2 -1
  14. data/db/schema.rb +2 -2
  15. data/gemfiles/rails_6.0.gemfile +2 -0
  16. data/gemfiles/rails_6.1.gemfile +1 -0
  17. data/gemfiles/rails_7.0.gemfile +21 -0
  18. data/lib/clearance/authentication.rb +3 -1
  19. data/lib/clearance/authorization.rb +9 -3
  20. data/lib/clearance/configuration.rb +18 -1
  21. data/lib/clearance/sign_in_guard.rb +2 -2
  22. data/lib/clearance/user.rb +2 -2
  23. data/lib/clearance/version.rb +1 -1
  24. data/lib/generators/clearance/install/install_generator.rb +10 -6
  25. data/lib/generators/clearance/install/templates/db/migrate/add_clearance_to_users.rb.erb +15 -12
  26. data/lib/generators/clearance/install/templates/db/migrate/create_users.rb.erb +2 -1
  27. data/lib/generators/clearance/specs/templates/support/features/clearance_helpers.rb +1 -0
  28. data/spec/acceptance/clearance_installation_spec.rb +1 -0
  29. data/spec/app_templates/testapp/Gemfile +2 -0
  30. data/spec/configuration_spec.rb +8 -1
  31. data/spec/controllers/passwords_controller_spec.rb +86 -3
  32. data/spec/controllers/sessions_controller_spec.rb +22 -0
  33. data/spec/controllers/users_controller_spec.rb +14 -0
  34. data/spec/dummy/application.rb +6 -21
  35. data/spec/dummy/db/.keep +0 -0
  36. data/spec/generators/clearance/install/install_generator_spec.rb +6 -0
  37. data/spec/requests/password_maintenance_spec.rb +1 -0
  38. data/spec/spec_helper.rb +1 -5
  39. metadata +7 -4
@@ -0,0 +1,21 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "addressable"
6
+ gem "ammeter"
7
+ gem "appraisal"
8
+ gem "capybara"
9
+ gem "database_cleaner"
10
+ gem "erb_lint", require: false
11
+ gem "factory_bot_rails"
12
+ gem "nokogiri"
13
+ gem "pry", require: false
14
+ gem "rails-controller-testing"
15
+ gem "rspec-rails"
16
+ gem "shoulda-matchers"
17
+ gem "sqlite3"
18
+ gem "timecop"
19
+ gem "railties", "~> 7.0"
20
+
21
+ gemspec path: "../"
@@ -24,8 +24,10 @@ module Clearance
24
24
  # `params[:session][:password]` are required.
25
25
  # @return [User, nil] The user or nil if authentication fails.
26
26
  def authenticate(params)
27
+ session_params = params.require(:session)
28
+
27
29
  Clearance.configuration.user_model.authenticate(
28
- params[:session][:email], params[:session][:password]
30
+ session_params[:email], session_params[:password]
29
31
  )
30
32
  end
31
33
 
@@ -77,8 +77,8 @@ module Clearance
77
77
  end
78
78
 
79
79
  # @api private
80
- def redirect_back_or(default)
81
- redirect_to(return_to || default)
80
+ def redirect_back_or(default, **options)
81
+ redirect_to(return_to || default, **options)
82
82
  clear_return_to
83
83
  end
84
84
 
@@ -86,10 +86,16 @@ module Clearance
86
86
  def return_to
87
87
  if return_to_url
88
88
  uri = URI.parse(return_to_url)
89
- "#{uri.path}?#{uri.query}".chomp("?") + "##{uri.fragment}".chomp("#")
89
+ path = path_without_leading_slashes(uri)
90
+ "#{path}?#{uri.query}".chomp("?") + "##{uri.fragment}".chomp("#")
90
91
  end
91
92
  end
92
93
 
94
+ # @api private
95
+ def path_without_leading_slashes(uri)
96
+ uri.path.sub(/\A\/+/, "/")
97
+ end
98
+
93
99
  # @api private
94
100
  def return_to_url
95
101
  session[:return_to]
@@ -118,6 +118,17 @@ module Clearance
118
118
  # @return [Array<String>]
119
119
  attr_accessor :allowed_backdoor_environments
120
120
 
121
+ # The parameter for user routes. By default this is derived from the user
122
+ # model.
123
+ # @return [Symbol]
124
+ attr_accessor :user_parameter
125
+
126
+ # Controls wether users are automatically signed in after successfully
127
+ # resetting their password.
128
+ # Defaults to `true`.
129
+ # @return [Boolean]
130
+ attr_writer :sign_in_on_password_reset
131
+
121
132
  def initialize
122
133
  @allow_sign_up = true
123
134
  @allowed_backdoor_environments = ["test", "ci", "development"]
@@ -134,6 +145,8 @@ module Clearance
134
145
  @secure_cookie = false
135
146
  @signed_cookie = false
136
147
  @sign_in_guards = []
148
+ @user_parameter = nil
149
+ @sign_in_on_password_reset = true
137
150
  end
138
151
 
139
152
  def signed_cookie=(value)
@@ -183,7 +196,7 @@ module Clearance
183
196
  # In the default configuration, this is `user`.
184
197
  # @return [Symbol]
185
198
  def user_parameter
186
- user_model.model_name.singular.to_sym
199
+ @user_parameter ||= user_model.model_name.singular.to_sym
187
200
  end
188
201
 
189
202
  # The name of foreign key parameter for the configured user model.
@@ -214,6 +227,10 @@ module Clearance
214
227
  def rotate_csrf_on_sign_in?
215
228
  !!rotate_csrf_on_sign_in
216
229
  end
230
+
231
+ def sign_in_on_password_reset?
232
+ @sign_in_on_password_reset
233
+ end
217
234
  end
218
235
 
219
236
  # @return [Clearance::Configuration] Clearance's current configuration
@@ -16,10 +16,10 @@ module Clearance
16
16
  #
17
17
  # # in config/initializers/clearance.rb
18
18
  # Clearance.configure do |config|
19
- # config.sign_in_guards = [ConfirmationGuard]
19
+ # config.sign_in_guards = ["ConfirmationGuard"]
20
20
  # end
21
21
  #
22
- # # in lib/guards/confirmation_guard.rb
22
+ # # in app/guards/confirmation_guard.rb
23
23
  # class ConfirmationGuard < Clearance::SignInGuard
24
24
  # def call
25
25
  # if signed_in? && current_user.email_confirmed?
@@ -234,7 +234,7 @@ module Clearance
234
234
  # Always false. Override this method in your user model to allow for other
235
235
  # forms of user authentication (username, Facebook, etc).
236
236
  #
237
- # @return [false]
237
+ # @return [Boolean]
238
238
  def email_optional?
239
239
  false
240
240
  end
@@ -242,7 +242,7 @@ module Clearance
242
242
  # Always false. Override this method in your user model to allow for other
243
243
  # forms of user authentication (username, Facebook, etc).
244
244
  #
245
- # @return [false]
245
+ # @return [Boolean]
246
246
  def password_optional?
247
247
  false
248
248
  end
@@ -1,3 +1,3 @@
1
1
  module Clearance
2
- VERSION = "2.3.1".freeze
2
+ VERSION = "2.6.0".freeze
3
3
  end
@@ -73,17 +73,21 @@ module Clearance
73
73
 
74
74
  def new_columns
75
75
  @new_columns ||= {
76
- email: 't.string :email',
77
- encrypted_password: 't.string :encrypted_password, limit: 128',
78
- confirmation_token: 't.string :confirmation_token, limit: 128',
79
- remember_token: 't.string :remember_token, limit: 128'
76
+ email: "t.string :email",
77
+ encrypted_password: "t.string :encrypted_password, limit: 128",
78
+ confirmation_token: "t.string :confirmation_token, limit: 128",
79
+ remember_token: "t.string :remember_token, limit: 128",
80
80
  }.reject { |column| existing_users_columns.include?(column.to_s) }
81
81
  end
82
82
 
83
83
  def new_indexes
84
84
  @new_indexes ||= {
85
- index_users_on_email: 'add_index :users, :email',
86
- index_users_on_remember_token: 'add_index :users, :remember_token'
85
+ index_users_on_email:
86
+ "add_index :users, :email",
87
+ index_users_on_confirmation_token:
88
+ "add_index :users, :confirmation_token, unique: true",
89
+ index_users_on_remember_token:
90
+ "add_index :users, :remember_token, unique: true",
87
91
  }.reject { |index| existing_users_indexes.include?(index.to_s) }
88
92
  end
89
93
 
@@ -1,31 +1,34 @@
1
1
  class AddClearanceToUsers < ActiveRecord::Migration<%= migration_version %>
2
2
  def self.up
3
+ <% if config[:new_columns].any? -%>
3
4
  change_table :users do |t|
4
5
  <% config[:new_columns].values.each do |column| -%>
5
6
  <%= column %>
6
7
  <% end -%>
7
8
  end
8
-
9
+ <% end -%>
10
+ <% if config[:new_indexes].any? -%>
9
11
  <% config[:new_indexes].values.each do |index| -%>
10
12
  <%= index %>
11
13
  <% end -%>
12
-
13
- users = select_all("SELECT id FROM users WHERE remember_token IS NULL")
14
-
15
- users.each do |user|
16
- update <<-SQL.squish
17
- UPDATE users
18
- SET remember_token = '#{Clearance::Token.new}'
19
- WHERE id = '#{user['id']}'
20
- SQL
14
+ <% end -%>
15
+ <% if config[:new_columns].keys.include?(:remember_token) -%>
16
+ Clearance.configuration.user_model.where(remember_token: nil).each do |user|
17
+ user.update_columns(remember_token: Clearance::Token.new)
21
18
  end
19
+ <% end -%>
22
20
  end
23
21
 
24
22
  def self.down
25
- change_table :users do |t|
23
+ <% config[:new_indexes].values.each do |index| -%>
24
+ <%= index.sub("add_index", "remove_index") %>
25
+ <% end -%>
26
26
  <% if config[:new_columns].any? -%>
27
- t.remove <%= new_columns.keys.map { |column| ":#{column}" }.join(", ") %>
27
+ change_table :users do |t|
28
+ <% config[:new_columns].keys.each do |key| -%>
29
+ t.remove <%= key.inspect %>
28
30
  <% end -%>
29
31
  end
32
+ <% end -%>
30
33
  end
31
34
  end
@@ -9,6 +9,7 @@ class CreateUsers < ActiveRecord::Migration<%= migration_version %>
9
9
  end
10
10
 
11
11
  add_index :users, :email
12
- add_index :users, :remember_token
12
+ add_index :users, :confirmation_token, unique: true
13
+ add_index :users, :remember_token, unique: true
13
14
  end
14
15
  end
@@ -36,6 +36,7 @@ module Features
36
36
  end
37
37
 
38
38
  def expect_user_to_be_signed_out
39
+ visit root_path
39
40
  expect(page).to have_content I18n.t("layouts.application.sign_in")
40
41
  end
41
42
 
@@ -35,6 +35,7 @@ describe "Clearance Installation" do
35
35
  --skip-javascript
36
36
  --skip-keeps
37
37
  --skip-sprockets
38
+ --skip-asset-pipeline
38
39
  CMD
39
40
  end
40
41
 
@@ -1,3 +1,5 @@
1
+ source "https://rubygems.org"
2
+
1
3
  gem "rails"
2
4
  gem "sqlite3"
3
5
  gem "rspec-rails"
@@ -167,7 +167,14 @@ describe Clearance::Configuration do
167
167
  end
168
168
 
169
169
  describe "#user_parameter" do
170
- it "returns the parameter key to use based on the user_model" do
170
+ context "when user_parameter is configured" do
171
+ it "returns the configured parameter" do
172
+ Clearance.configure { |config| config.user_parameter = :custom_param }
173
+ expect(Clearance.configuration.user_parameter).to eq :custom_param
174
+ end
175
+ end
176
+
177
+ it "returns the parameter key to use based on the user_model by default" do
171
178
  Account = Class.new(ActiveRecord::Base)
172
179
  Clearance.configure { |config| config.user_model = Account }
173
180
 
@@ -35,6 +35,16 @@ describe Clearance::PasswordsController do
35
35
  email = ActionMailer::Base.deliveries.last
36
36
  expect(email.subject).to match(/change your password/i)
37
37
  end
38
+
39
+ it "re-renders the page when turbo is enabled" do
40
+ user = create(:user)
41
+
42
+ post :create, params: {
43
+ password: { email: user.email.upcase },
44
+ }
45
+
46
+ expect(response).to have_http_status(:accepted)
47
+ end
38
48
  end
39
49
 
40
50
  context "email param is missing" do
@@ -46,6 +56,14 @@ describe Clearance::PasswordsController do
46
56
  expect(flash.now[:alert]).to match(/email can't be blank/i)
47
57
  expect(response).to render_template(:new)
48
58
  end
59
+
60
+ it "re-renders the page when turbo is enabled" do
61
+ post :create, params: {
62
+ password: {},
63
+ }
64
+
65
+ expect(response).to have_http_status(:unprocessable_entity)
66
+ end
49
67
  end
50
68
 
51
69
  context "email param is blank" do
@@ -53,12 +71,22 @@ describe Clearance::PasswordsController do
53
71
  post :create, params: {
54
72
  password: {
55
73
  email: "",
56
- }
74
+ },
57
75
  }
58
76
 
59
77
  expect(flash.now[:alert]).to match(/email can't be blank/i)
60
78
  expect(response).to render_template(:new)
61
79
  end
80
+
81
+ it "re-renders the page when turbo is enabled" do
82
+ post :create, params: {
83
+ password: {
84
+ email: "",
85
+ },
86
+ }
87
+
88
+ expect(response).to have_http_status(:unprocessable_entity)
89
+ end
62
90
  end
63
91
 
64
92
  context "email does not belong to an existing user" do
@@ -73,7 +101,7 @@ describe Clearance::PasswordsController do
73
101
  expect(ActionMailer::Base.deliveries).to be_empty
74
102
  end
75
103
 
76
- it "still responds with success so as not to leak registered users" do
104
+ it "still responds with error so as not to leak registered users" do
77
105
  email = "this_user_does_not_exist@non_existent_domain.com"
78
106
 
79
107
  post :create, params: {
@@ -83,6 +111,16 @@ describe Clearance::PasswordsController do
83
111
  expect(response).to be_successful
84
112
  expect(response).to render_template "passwords/create"
85
113
  end
114
+
115
+ it "has the same status code as a successful request" do
116
+ email = "this_user_does_not_exist@non_existent_domain.com"
117
+
118
+ post :create, params: {
119
+ password: { email: email },
120
+ }
121
+
122
+ expect(response).to have_http_status(:accepted)
123
+ end
86
124
  end
87
125
  end
88
126
 
@@ -97,6 +135,7 @@ describe Clearance::PasswordsController do
97
135
  }
98
136
 
99
137
  expect(response).to be_redirect
138
+ expect(response).to have_http_status(:found)
100
139
  expect(response).to redirect_to edit_user_password_url(user)
101
140
  expect(session[:password_reset_token]).to eq user.confirmation_token
102
141
  end
@@ -172,6 +211,35 @@ describe Clearance::PasswordsController do
172
211
  )
173
212
 
174
213
  expect(user.reload.encrypted_password).not_to eq old_encrypted_password
214
+ expect(response).to have_http_status(:see_other)
215
+ end
216
+
217
+ it "signs in the user" do
218
+ user = create(:user, :with_forgotten_password)
219
+
220
+ put :update, params: update_parameters(
221
+ user,
222
+ new_password: "my_new_password",
223
+ )
224
+
225
+ expect(current_user).to eq(user)
226
+ end
227
+
228
+ context "when Clearance is configured to not sign in the user" do
229
+ it "doesn't sign in the user" do
230
+ Clearance.configure do |config|
231
+ config.sign_in_on_password_reset = false
232
+ end
233
+
234
+ user = create(:user, :with_forgotten_password)
235
+
236
+ put :update, params: update_parameters(
237
+ user,
238
+ new_password: "my_new_password",
239
+ )
240
+
241
+ expect(current_user).to be_nil
242
+ end
175
243
  end
176
244
  end
177
245
 
@@ -211,8 +279,19 @@ describe Clearance::PasswordsController do
211
279
  )
212
280
 
213
281
  expect(flash.now[:alert]).to match(/password can't be blank/i)
282
+ expect(response).to have_http_status(:unprocessable_entity)
214
283
  expect(response).to render_template(:edit)
215
- expect(cookies[:remember_token]).to be_nil
284
+ end
285
+
286
+ it "doesn't sign in the user" do
287
+ user = create(:user, :with_forgotten_password)
288
+
289
+ put :update, params: update_parameters(
290
+ user,
291
+ new_password: "",
292
+ )
293
+
294
+ expect(current_user).to be_nil
216
295
  end
217
296
  end
218
297
  end
@@ -226,4 +305,8 @@ describe Clearance::PasswordsController do
226
305
  password_reset: { password: new_password }
227
306
  }
228
307
  end
308
+
309
+ def current_user
310
+ request.env[:clearance].current_user
311
+ end
229
312
  end
@@ -24,6 +24,14 @@ describe Clearance::SessionsController do
24
24
  end
25
25
 
26
26
  describe "on POST to #create" do
27
+ context "when missing parameters" do
28
+ it "raises an error" do
29
+ expect do
30
+ post :create
31
+ end.to raise_error(ActionController::ParameterMissing)
32
+ end
33
+ end
34
+
27
35
  context "when password is optional" do
28
36
  it "renders the page with error" do
29
37
  user = create(:user_with_optional_password)
@@ -58,6 +66,19 @@ describe Clearance::SessionsController do
58
66
  end
59
67
 
60
68
  context "with good credentials and a session return url" do
69
+ it "redirects to the return URL removing leading slashes" do
70
+ user = create(:user)
71
+ url = "/url_in_the_session?foo=bar#baz"
72
+ return_url = "//////#{url}"
73
+ request.session[:return_to] = return_url
74
+
75
+ post :create, params: {
76
+ session: { email: user.email, password: user.password },
77
+ }
78
+
79
+ should redirect_to(url)
80
+ end
81
+
61
82
  it "redirects to the return URL maintaining query and fragment" do
62
83
  user = create(:user)
63
84
  return_url = "/url_in_the_session?foo=bar#baz"
@@ -104,6 +125,7 @@ describe Clearance::SessionsController do
104
125
  end
105
126
 
106
127
  it { should redirect_to_url_after_destroy }
128
+ it { expect(response).to have_http_status(:see_other) }
107
129
  end
108
130
 
109
131
  context "with a cookie" do
@@ -67,6 +67,20 @@ describe Clearance::UsersController do
67
67
  expect(response).to redirect_to(return_url)
68
68
  end
69
69
  end
70
+
71
+ context "with invalid attributes" do
72
+ it "renders the page with error" do
73
+ user_attributes = FactoryBot.attributes_for(:user, email: nil)
74
+ old_user_count = User.count
75
+
76
+ post :create, params: {
77
+ user: user_attributes,
78
+ }
79
+
80
+ expect(User.count).to eq old_user_count
81
+ expect(response).to have_http_status(:unprocessable_entity)
82
+ end
83
+ end
70
84
  end
71
85
 
72
86
  context "when signed in" do
@@ -1,50 +1,35 @@
1
1
  require "rails/all"
2
+
2
3
  require "clearance"
3
4
 
4
5
  module Dummy
5
6
  APP_ROOT = File.expand_path("..", __FILE__).freeze
6
7
 
7
- I18n.enforce_available_locales = true
8
-
9
8
  class Application < Rails::Application
10
- config.action_controller.allow_forgery_protection = false
11
9
  config.action_controller.perform_caching = false
12
- config.action_dispatch.show_exceptions = false
13
10
  config.action_mailer.default_url_options = { host: "dummy.example.com" }
14
11
  config.action_mailer.delivery_method = :test
15
12
  config.active_support.deprecation = :stderr
16
- config.active_support.test_order = :random
17
- config.cache_classes = true
18
- config.consider_all_requests_local = true
19
13
  config.eager_load = false
20
- config.encoding = "utf-8"
14
+
21
15
  config.paths["app/controllers"] << "#{APP_ROOT}/app/controllers"
22
16
  config.paths["app/models"] << "#{APP_ROOT}/app/models"
23
17
  config.paths["app/views"] << "#{APP_ROOT}/app/views"
24
18
  config.paths["config/database"] = "#{APP_ROOT}/config/database.yml"
25
19
  config.paths["log"] = "tmp/log/development.log"
26
-
27
20
  config.paths.add "config/routes.rb", with: "#{APP_ROOT}/config/routes.rb"
28
- config.secret_key_base = "SECRET_KEY_BASE"
29
21
 
30
- if config.active_record.sqlite3.respond_to?(:represent_boolean_as_integer)
31
- if Rails::VERSION::MAJOR < 6
32
- config.active_record.sqlite3.represent_boolean_as_integer = true
33
- end
22
+ if Rails.version.match?(/^6.0/)
23
+ config.active_record.sqlite3.represent_boolean_as_integer = true
24
+ else
25
+ config.active_record.legacy_connection_handling = false
34
26
  end
35
27
 
36
- if Rails::VERSION::MAJOR >= 6
37
- config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob"
38
- end
39
-
40
- config.active_job.queue_adapter = :inline
41
-
42
28
  def require_environment!
43
29
  initialize!
44
30
  end
45
31
 
46
32
  def initialize!(&block)
47
- FileUtils.mkdir_p(Rails.root.join("db").to_s)
48
33
  super unless @initialized
49
34
  end
50
35
  end
File without changes
@@ -135,6 +135,12 @@ describe Clearance::Generators::InstallGenerator, :generator do
135
135
  expect(migration).to contain("add_index :users, :email")
136
136
  expect(migration).not_to contain("t.string :remember_token")
137
137
  expect(migration).not_to contain("add_index :users, :remember_token")
138
+ expect(migration).to(
139
+ contain("add_index :users, :confirmation_token, unique: true"),
140
+ )
141
+ expect(migration).to(
142
+ contain("remove_index :users, :confirmation_token, unique: true"),
143
+ )
138
144
  end
139
145
  end
140
146
  end
@@ -12,6 +12,7 @@ describe "Password maintenance" do
12
12
  }
13
13
 
14
14
  expect(response).to redirect_to(Clearance.configuration.redirect_url)
15
+ expect(response).to have_http_status(:see_other)
15
16
  expect(cookies["remember_token"]).to be_present
16
17
  end
17
18
  end
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,7 @@ require "dummy/application"
5
5
 
6
6
  require "clearance/rspec"
7
7
  require "factory_bot_rails"
8
+ require "rails-controller-testing"
8
9
  require "rspec/rails"
9
10
  require "shoulda-matchers"
10
11
  require "timecop"
@@ -28,11 +29,6 @@ RSpec.configure do |config|
28
29
  end
29
30
 
30
31
  config.before { restore_default_warning_free_config }
31
-
32
- require 'rails-controller-testing'
33
- config.include Rails::Controller::Testing::TestProcess
34
- config.include Rails::Controller::Testing::TemplateAssertions
35
- config.include Rails::Controller::Testing::Integration
36
32
  end
37
33
 
38
34
  Shoulda::Matchers.configure do |config|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clearance
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Croak
@@ -22,10 +22,11 @@ authors:
22
22
  - Jason Morrison
23
23
  - Galen Frechette
24
24
  - Josh Steiner
25
+ - Dorian Marié
25
26
  autorequire:
26
27
  bindir: bin
27
28
  cert_chain: []
28
- date: 2021-03-05 00:00:00.000000000 Z
29
+ date: 2022-06-12 00:00:00.000000000 Z
29
30
  dependencies:
30
31
  - !ruby/object:Gem::Dependency
31
32
  name: bcrypt
@@ -149,11 +150,11 @@ files:
149
150
  - ".gitignore"
150
151
  - ".yardopts"
151
152
  - Appraisals
153
+ - CHANGELOG.md
152
154
  - CONTRIBUTING.md
153
155
  - Gemfile
154
156
  - Gemfile.lock
155
157
  - LICENSE
156
- - NEWS.md
157
158
  - README.md
158
159
  - RELEASING.md
159
160
  - Rakefile
@@ -185,6 +186,7 @@ files:
185
186
  - gemfiles/rails_5.2.gemfile
186
187
  - gemfiles/rails_6.0.gemfile
187
188
  - gemfiles/rails_6.1.gemfile
189
+ - gemfiles/rails_7.0.gemfile
188
190
  - lib/clearance.rb
189
191
  - lib/clearance/authentication.rb
190
192
  - lib/clearance/authorization.rb
@@ -266,6 +268,7 @@ files:
266
268
  - spec/dummy/application.rb
267
269
  - spec/dummy/config/database.yml
268
270
  - spec/dummy/config/routes.rb
271
+ - spec/dummy/db/.keep
269
272
  - spec/factories.rb
270
273
  - spec/generators/clearance/install/install_generator_spec.rb
271
274
  - spec/generators/clearance/routes/routes_generator_spec.rb
@@ -311,7 +314,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
311
314
  - !ruby/object:Gem::Version
312
315
  version: '0'
313
316
  requirements: []
314
- rubygems_version: 3.1.2
317
+ rubygems_version: 3.1.6
315
318
  signing_key:
316
319
  specification_version: 4
317
320
  summary: Rails authentication & authorization with email & password.