devise-secure_password 1.0.6 → 2.0.1

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 (63) hide show
  1. checksums.yaml +5 -5
  2. data/Changelog.md +39 -4
  3. data/Dockerfile +1 -1
  4. data/Dockerfile.prev +3 -3
  5. data/Gemfile +2 -1
  6. data/Gemfile.lock +218 -214
  7. data/README.md +33 -10
  8. data/app/controllers/devise/passwords_with_policy_controller.rb +55 -14
  9. data/app/views/devise/passwords_with_policy/edit.html.erb +5 -1
  10. data/config/locales/en.yml +51 -0
  11. data/devise-secure_password.gemspec +22 -23
  12. data/gemfiles/rails_6_0.gemfile +57 -0
  13. data/gemfiles/rails_6_0.gemfile.lock +347 -0
  14. data/gemfiles/rails_6_1.gemfile +57 -0
  15. data/gemfiles/rails_6_1.gemfile.lock +352 -0
  16. data/lib/devise/secure_password.rb +4 -9
  17. data/lib/devise/secure_password/controllers/devise_helpers.rb +4 -50
  18. data/lib/devise/secure_password/controllers/helpers.rb +58 -0
  19. data/lib/devise/secure_password/grammar.rb +13 -0
  20. data/lib/devise/secure_password/models/password_disallows_frequent_changes.rb +3 -1
  21. data/lib/devise/secure_password/models/password_disallows_frequent_reuse.rb +1 -0
  22. data/lib/devise/secure_password/models/password_has_required_content.rb +53 -15
  23. data/lib/devise/secure_password/models/password_requires_regular_updates.rb +0 -2
  24. data/lib/devise/secure_password/version.rb +1 -1
  25. data/lib/support/string/character_counter.rb +3 -1
  26. data/pkg/devise-secure_password-2.0.0.gem +0 -0
  27. data/pkg/devise-secure_password-2.0.1.gem +0 -0
  28. metadata +67 -169
  29. data/coverage/assets/0.10.2/application.css +0 -799
  30. data/coverage/assets/0.10.2/application.js +0 -1707
  31. data/coverage/assets/0.10.2/colorbox/border.png +0 -0
  32. data/coverage/assets/0.10.2/colorbox/controls.png +0 -0
  33. data/coverage/assets/0.10.2/colorbox/loading.gif +0 -0
  34. data/coverage/assets/0.10.2/colorbox/loading_background.png +0 -0
  35. data/coverage/assets/0.10.2/favicon_green.png +0 -0
  36. data/coverage/assets/0.10.2/favicon_red.png +0 -0
  37. data/coverage/assets/0.10.2/favicon_yellow.png +0 -0
  38. data/coverage/assets/0.10.2/loading.gif +0 -0
  39. data/coverage/assets/0.10.2/magnify.png +0 -0
  40. data/coverage/assets/0.10.2/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  41. data/coverage/assets/0.10.2/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  42. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  43. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  44. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  45. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  46. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  47. data/coverage/assets/0.10.2/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  48. data/coverage/assets/0.10.2/smoothness/images/ui-icons_222222_256x240.png +0 -0
  49. data/coverage/assets/0.10.2/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  50. data/coverage/assets/0.10.2/smoothness/images/ui-icons_454545_256x240.png +0 -0
  51. data/coverage/assets/0.10.2/smoothness/images/ui-icons_888888_256x240.png +0 -0
  52. data/coverage/assets/0.10.2/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  53. data/coverage/index.html +0 -4115
  54. data/devise-secure_password-1.0.0.gem +0 -0
  55. data/gemfiles/rails-5_0_6.gemfile +0 -17
  56. data/gemfiles/rails-5_0_6.gemfile.lock +0 -286
  57. data/gemfiles/rails-5_1_4.gemfile +0 -16
  58. data/gemfiles/rails-5_1_4.gemfile.lock +0 -282
  59. data/lib/devise/secure_password/controllers/active_helpers.rb +0 -45
  60. data/lib/devise/secure_password/hooks/password_requires_regular_updates.rb +0 -5
  61. data/pkg/devise-secure_password-1.0.3.gem +0 -0
  62. data/pkg/devise-secure_password-1.0.4.gem +0 -0
  63. data/pkg/devise-secure_password-1.0.5.gem +0 -0
data/README.md CHANGED
@@ -9,7 +9,7 @@ as well.
9
9
 
10
10
  ## Build Status
11
11
 
12
- | Service | rails 5.1.4 |
12
+ | Service | rails 6.1 |
13
13
  |:-----------|:-----------:|
14
14
  | Circle CI | [![Circle CI](https://circleci.com/gh/ValiMail/devise-secure_password/tree/master.svg?style=shield&circle-token=cd173d5f9d2944a9b14737c2d4339b20b08565cf)]() |
15
15
 
@@ -32,16 +32,16 @@ The goal of this project is to provide compatibility for officially supported st
32
32
  and [Ruby on Rails](http://guides.rubyonrails.org/maintenance_policy.html). More specifically, the following releases
33
33
  are currently supported by the __Devise Secure Password Extension__:
34
34
 
35
- - Ruby on Rails: __5.1.Z__, __5.0.Z__ (current and previous stable release)
36
- - Ruby: __2.5.0__, __2.4.3__ (current and previous stable release)
35
+ - Ruby on Rails: __6.1.x__, __6.0.x__ (current and previous stable release)
36
+ - Ruby: __3.0.x__, __2.7.x__ (current and previous stable release)
37
37
 
38
38
  ## Installation
39
39
 
40
40
  Add this line to your application's Gemfile:
41
41
 
42
42
  ```ruby
43
- gem 'devise', '~> 4.2'
44
- gem 'devise-secure_password', '~> 1.0.5'
43
+ gem 'devise', '~> 4.7'
44
+ gem 'devise-secure_password', '~> 2.0'
45
45
  ```
46
46
 
47
47
  And then execute:
@@ -228,14 +228,14 @@ To determine the Ruby on Rails versions supported by this release, run the follo
228
228
  prompt> gem install flay ruby2ruby rubocop rspec
229
229
  prompt> rake test:spec:targets
230
230
 
231
- Available Rails targets: 5.0.6, 5.1.4
231
+ Available Rails targets: 5.1, 5.2
232
232
  ```
233
233
 
234
234
  Reconfigure the project by specifying the correct Gemfile when running bundler, followed by running tests:
235
235
 
236
236
  ```bash
237
- prompt> BUNDLE_GEMFILE=gemfiles/rails-5_0_6.gemfile bundle
238
- prompt> BUNDLE_GEMFILE=gemfiles/rails-5_0_6.gemfile bundle exec rake
237
+ prompt> BUNDLE_GEMFILE=gemfiles/rails_5_2.gemfile bundle
238
+ prompt> BUNDLE_GEMFILE=gemfiles/rails_5_2.gemfile bundle exec rake
239
239
  ```
240
240
 
241
241
  The only time you need to define the `BUNDLE_GEMFILE` environment variable is when testing a non-default target.
@@ -260,11 +260,23 @@ for testing.
260
260
  prompt> brew install chromedriver
261
261
  ```
262
262
 
263
- >NOTE: __ChromeDriver__ < 2.33 has a bug for testing clickable targets; therefore, install >= 2.3.4.
264
-
265
263
  You can always install [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/) by downloading and then
266
264
  unpacking into the `/usr/local/bin` directory.
267
265
 
266
+ #### Automated screenshots on failure
267
+
268
+ The [capybara-screenshot gem](https://github.com/mattheworiordan/capybara-screenshot) supports automated screenshot
269
+ captures on failing tests but this will only take place for tests that have JavaScript enabled. You can temporarily
270
+ modify an example by setting `js: true` as in the following example:
271
+
272
+ ```ruby
273
+ context 'when minimum age enforcement is enabled', js: true do
274
+ ...
275
+ end
276
+ ```
277
+
278
+ Do not submit pull requests with this setting enabled where it wasn't enabled previously.
279
+
268
280
  ### Testing inside the spec/rails-app-X_y_z
269
281
 
270
282
  To debug from inside of the dummy rails-app you will need to first install the rails bin stubs and then perform a db
@@ -325,6 +337,17 @@ initiating any development work including tests.
325
337
  prompt> gem update bundler
326
338
  ```
327
339
 
340
+ #### Updating test.sqlite3.db
341
+
342
+ To update or generate a `db/test/sqlite3.db` database file:
343
+
344
+ ```bash
345
+ prompt> cd spec/rails-app-X_y_z
346
+ prompt> bundle install
347
+ prompt> rake app:update:bin
348
+ prompt> RAILS_ENV=test bundle exec rake db:migrate
349
+ ```
350
+
328
351
  ## Contributing
329
352
 
330
353
  Bug reports and pull requests are welcome on GitHub at https://github.com/valimail/devise-secure_password. This project
@@ -1,26 +1,31 @@
1
1
  module Devise
2
- class PasswordsWithPolicyController < DeviseController
3
- before_action :authenticate_scope!
2
+ class PasswordsWithPolicyController < Devise::RegistrationsController
3
+ before_action :configure_permitted_parameters
4
4
 
5
5
  def edit
6
6
  self.resource = resource_class.new
7
- if warden.session(scope_name)['secure_password_expired']
8
- resource.errors.add(:base, "#{error_string_for_password_expired}.")
9
- end
7
+ resource.errors.add(:base, "#{error_string_for_password_expired}.")
10
8
  render :edit
11
9
  end
12
10
 
13
11
  def update
14
- if resource.update_with_password(password_params)
12
+ if update_resource(resource, account_update_params)
15
13
  prepare_for_redirect
16
14
  redirect_to stored_location_for(scope_name) || :root
17
15
  else
18
- clean_up_passwords(resource)
19
16
  render :edit
20
17
  end
21
18
  end
22
19
 
23
- private
20
+ def devise_parameter_sanitizer
21
+ @devise_parameter_sanitizer ||= Devise::ParameterSanitizer.new(resource_class, resource_name, params)
22
+ end
23
+
24
+ protected
25
+
26
+ def account_update_params
27
+ devise_parameter_sanitizer.sanitize(:account_update)
28
+ end
24
29
 
25
30
  def authenticate_scope!
26
31
  send(:"authenticate_#{scope_name}!")
@@ -31,22 +36,58 @@ module Devise
31
36
  I18n.t('secure_password.password_requires_regular_updates.alerts.messages.password_updated')
32
37
  end
33
38
 
39
+ def configure_permitted_parameters
40
+ devise_parameter_sanitizer.permit(:account_update, keys: [:update_action])
41
+ end
42
+
34
43
  def error_string_for_password_expired
35
44
  return 'password expired' unless warden.user.class.respond_to?(:password_maximum_age)
45
+
36
46
  I18n.t(
37
47
  'secure_password.password_requires_regular_updates.errors.messages.password_expired',
38
- timeframe: distance_of_time_in_words(warden.user.class.password_maximum_age)
48
+ timeframe: precise_distance_of_time_in_words(warden.user.class.password_maximum_age)
39
49
  )
40
50
  end
41
51
 
42
- def password_params
43
- params.require(scope_name).permit(:current_password, :password, :password_confirmation)
44
- end
45
-
46
52
  def prepare_for_redirect
47
- warden.session(scope_name)[:secure_password_expired] = false
53
+ unset_devise_secure_password_expired!
48
54
  flash[:notice] = alert_string_for_password_updated
49
55
  bypass_sign_in resource, scope: scope_name
50
56
  end
57
+
58
+ def update_resource(resource, params)
59
+ update_action = (params[:update_action] ? params.delete(:update_action) : nil)
60
+ return false unless update_action == 'change_password'
61
+
62
+ update_password(resource, params)
63
+
64
+ # do what devise would do under normal circumstances but also be aware of
65
+ # secure_password or other validators that would be ignored by devise.
66
+ result = if resource.errors.count.zero?
67
+ resource.update(params)
68
+ else
69
+ false
70
+ end
71
+
72
+ resource.clean_up_passwords
73
+ result
74
+ end
75
+
76
+ def update_password(resource, params)
77
+ #
78
+ # order of operations that follow is absolutely critical
79
+ #
80
+ current_password = params.delete(:current_password)
81
+ current_password_valid = resource.valid_password?(current_password)
82
+
83
+ # let our installed validator chain handle the validation work
84
+ resource.assign_attributes(params)
85
+ resource.valid?
86
+ unless current_password_valid
87
+ resource.errors.add(:current_password, current_password.blank? ? :blank : :invalid)
88
+ end
89
+
90
+ resource
91
+ end
51
92
  end
52
93
  end
@@ -1,7 +1,11 @@
1
1
  <h2><%= t('.titles.section_title') %></h2>
2
2
 
3
3
  <%= form_for(resource, as: resource_name, url: [resource_name, :password_with_policy], html: { method: :put }) do |f| %>
4
- <%= devise_error_messages! %>
4
+ <% if resource.errors.full_messages.count.positive? %>
5
+ <%= render 'devise/shared/error_messages', resource: resource %>
6
+ <% end %>
7
+
8
+ <%= f.hidden_field :update_action, value: :change_password %>
5
9
 
6
10
  <p><%= f.label :current_password, t('.labels.current_password') %><br />
7
11
  <%= f.password_field :current_password %></p>
@@ -1,11 +1,24 @@
1
1
  en:
2
2
  secure_password:
3
+ character:
4
+ one: "character"
5
+ other: "characters"
6
+
7
+ types:
8
+ uppercase: "uppercase"
9
+ downcase: "downcase"
10
+ lowercase: "lowercase"
11
+ number: "number"
12
+ special: "special"
13
+
3
14
  password_has_required_content:
4
15
  errors:
5
16
  messages:
6
17
  unknown_characters: "contains %{count} invalid %{subject}"
7
18
  minimum_characters: "must contain at least %{count} %{type} %{subject}"
8
19
  maximum_characters: "must contain less than %{count} %{type} %{subject}"
20
+ minimum_length: "must contain at least %{count} %{subject}"
21
+ maximum_length: "must contain less than %{count} %{subject}"
9
22
  password_disallows_frequent_reuse:
10
23
  errors:
11
24
  messages:
@@ -21,6 +34,44 @@ en:
21
34
  errors:
22
35
  messages:
23
36
  password_expired: "Your password has expired. Passwords must be changed every %{timeframe}"
37
+ datetime:
38
+ # update distance_in_words translations to remove the determiner words:
39
+ # about, almost, over, less than, etc.
40
+ precise_distance_in_words:
41
+ half_a_minute: "half a minute"
42
+ less_than_x_seconds:
43
+ one: "1 second" # default was: "less than 1 second"
44
+ other: "%{count} seconds" # default was: "less than %{count} seconds"
45
+ x_seconds:
46
+ one: "1 second"
47
+ other: "%{count} seconds"
48
+ less_than_x_minutes:
49
+ one: "a minute" # default was: "less than a minute"
50
+ other: "%{count} minutes" # default was: "less than %{count} minutes"
51
+ x_minutes:
52
+ one: "1 minute"
53
+ other: "%{count} minutes"
54
+ about_x_hours:
55
+ one: "1 hour" # default was: "about 1 hour"
56
+ other: "%{count} hours" # default was: "about %{count} hours"
57
+ x_days:
58
+ one: "1 day"
59
+ other: "%{count} days"
60
+ about_x_months:
61
+ one: "1 month" # default was: "about 1 month"
62
+ other: "%{count} months" # default was: "about %{count} months"
63
+ x_months:
64
+ one: "1 month"
65
+ other: "%{count} months"
66
+ about_x_years:
67
+ one: "1 year" # default was: "about 1 year"
68
+ other: "%{count} years" # default was: "about %{count} years"
69
+ over_x_years:
70
+ one: "1 year" # default was: "over 1 year"
71
+ other: "%{count} years" # default was: "over %{count} years"
72
+ almost_x_years:
73
+ one: "1 year" # default was: "almost 1 year"
74
+ other: "%{count} years" # default was: "almost %{count} years"
24
75
  devise:
25
76
  passwords_with_policy:
26
77
  edit:
@@ -29,29 +29,28 @@ Gem::Specification.new do |spec|
29
29
  spec.require_paths = ['lib']
30
30
 
31
31
  spec.add_runtime_dependency 'devise', '>= 4.0.0', '< 5.0.0'
32
- spec.add_runtime_dependency 'railties', '>= 5.0.0', '< 6.0.0'
32
+ spec.add_runtime_dependency 'railties', '>= 5.0.0', '< 7.0.0'
33
33
 
34
- spec.add_development_dependency 'bundler', '~> 1.16', '>= 1.16.1'
35
- spec.add_development_dependency 'capybara', '~> 2.16', '>= 2.16.1'
36
- spec.add_development_dependency 'capybara-screenshot', '~> 1.0', '>= 1.0.18'
37
- spec.add_development_dependency 'coffee-rails', '~> 4.2'
38
- spec.add_development_dependency 'database_cleaner', '~> 1.6', '>= 1.6.2'
34
+ spec.add_development_dependency 'bundler', '>= 2.2.14'
35
+ spec.add_development_dependency 'capybara', '>= 3.35.3'
36
+ spec.add_development_dependency 'capybara-screenshot', '>= 1.0.18'
37
+ spec.add_development_dependency 'database_cleaner', '>= 2.0.1'
39
38
  spec.add_development_dependency 'devise', '~> 4.0'
40
- spec.add_development_dependency 'flay', '~> 2.10', '>= 2.10.0'
41
- spec.add_development_dependency 'launchy', '~> 2.4', '>= 2.4.3'
42
- spec.add_development_dependency 'rails', '~> 5.1', '>= 5.1.4'
43
- spec.add_development_dependency 'rake', '~> 12.3'
44
- spec.add_development_dependency 'rspec', '~> 3.7'
45
- spec.add_development_dependency 'rspec-rails', '~> 3.7'
46
- spec.add_development_dependency 'rspec_junit_formatter', '~> 0.3'
47
- spec.add_development_dependency 'rubocop', '>= 0.49.0'
48
- spec.add_development_dependency 'ruby2ruby', '~> 2.4', '>= 2.4.0'
49
- spec.add_development_dependency 'sass-rails', '~> 5.0'
50
- spec.add_development_dependency 'selenium-webdriver', '~> 3.7', '>= 3.7.0'
51
- spec.add_development_dependency 'simplecov', '~> 0.15.1'
52
- spec.add_development_dependency 'simplecov-console', '~> 0.4.2'
53
- spec.add_development_dependency 'sqlite3', '~> 1.3', '>= 1.3.13'
54
- spec.add_development_dependency 'therubyracer', '~> 0.12.3'
55
-
56
- spec.required_ruby_version = '>= 2.4'
39
+ spec.add_development_dependency 'flay', '>= 2.10.0'
40
+ spec.add_development_dependency 'launchy', '>= 2.4.3'
41
+ spec.add_development_dependency 'rails', '>= 5.2.0'
42
+ spec.add_development_dependency 'rake', '>= 12.3'
43
+ spec.add_development_dependency 'rspec', '>= 3.7'
44
+ spec.add_development_dependency 'rspec_junit_formatter', '>= 0.3'
45
+ spec.add_development_dependency 'rspec-rails', '>= 3.7'
46
+ spec.add_development_dependency 'rubocop', '>= 1.0.0'
47
+ spec.add_development_dependency 'rubocop-rails', '>= 2.3.2'
48
+ spec.add_development_dependency 'rubocop-rspec', '>= 1.35.0'
49
+ spec.add_development_dependency 'ruby2ruby', '>= 2.4.0'
50
+ spec.add_development_dependency 'selenium-webdriver', '>= 3.7.0'
51
+ spec.add_development_dependency 'simplecov', '>= 0.18.2'
52
+ spec.add_development_dependency 'simplecov-console', '>= 0.4.2'
53
+ spec.add_development_dependency 'sqlite3', '>= 1.3.13'
54
+
55
+ spec.required_ruby_version = '>= 2.7'
57
56
  end
@@ -0,0 +1,57 @@
1
+ source 'https://rubygems.org'
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ ENV['RAILS_TARGET'] ||= '6.0'
5
+
6
+ gemspec path: '../'
7
+
8
+ # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
9
+ gem 'rails', '~> 6.0.3', '>= 6.0.3.6'
10
+ # Use sqlite3 as the database for Active Record
11
+ gem 'sqlite3', '~> 1.4'
12
+ # Use Puma as the app server
13
+ gem 'puma', '~> 4.1'
14
+ # Use SCSS for stylesheets
15
+ gem 'sass-rails', '>= 6'
16
+ # Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
17
+ gem 'webpacker', '~> 4.0'
18
+ # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
19
+ gem 'turbolinks', '~> 5'
20
+ # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
21
+ gem 'jbuilder', '~> 2.7'
22
+ # Use Redis adapter to run Action Cable in production
23
+ # gem 'redis', '~> 4.0'
24
+ # Use Active Model has_secure_password
25
+ # gem 'bcrypt', '~> 3.1.7'
26
+
27
+ # Use Active Storage variant
28
+ # gem 'image_processing', '~> 1.2'
29
+
30
+ # Reduces boot times through caching; required in config/boot.rb
31
+ gem 'bootsnap', '>= 1.4.2', require: false
32
+
33
+ group :development, :test do
34
+ # Call 'byebug' anywhere in the code to stop execution and get a debugger console
35
+ gem 'byebug', platforms: %i(mri mingw x64_mingw)
36
+ end
37
+
38
+ group :development do
39
+ # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
40
+ gem 'listen', '~> 3.2'
41
+ gem 'web-console', '>= 3.3.0'
42
+ end
43
+
44
+ group :test do
45
+ # Adds support for Capybara system testing and selenium driver
46
+ gem 'capybara', '>= 2.15'
47
+ gem 'codecov', require: false
48
+ gem 'selenium-webdriver'
49
+ gem 'shoulda-matchers'
50
+ # Easy installation and use of web drivers to run system tests with browsers
51
+ gem 'webdrivers'
52
+ end
53
+
54
+ # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
55
+ gem 'tzinfo-data', platforms: %i(mingw mswin x64_mingw jruby)
56
+
57
+ gem 'webrick', '~> 1.7'
@@ -0,0 +1,347 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ devise-secure_password (1.1.0)
5
+ devise (>= 4.0.0, < 5.0.0)
6
+ railties (>= 5.0.0, < 7.0.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ actioncable (6.0.3.6)
12
+ actionpack (= 6.0.3.6)
13
+ nio4r (~> 2.0)
14
+ websocket-driver (>= 0.6.1)
15
+ actionmailbox (6.0.3.6)
16
+ actionpack (= 6.0.3.6)
17
+ activejob (= 6.0.3.6)
18
+ activerecord (= 6.0.3.6)
19
+ activestorage (= 6.0.3.6)
20
+ activesupport (= 6.0.3.6)
21
+ mail (>= 2.7.1)
22
+ actionmailer (6.0.3.6)
23
+ actionpack (= 6.0.3.6)
24
+ actionview (= 6.0.3.6)
25
+ activejob (= 6.0.3.6)
26
+ mail (~> 2.5, >= 2.5.4)
27
+ rails-dom-testing (~> 2.0)
28
+ actionpack (6.0.3.6)
29
+ actionview (= 6.0.3.6)
30
+ activesupport (= 6.0.3.6)
31
+ rack (~> 2.0, >= 2.0.8)
32
+ rack-test (>= 0.6.3)
33
+ rails-dom-testing (~> 2.0)
34
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
35
+ actiontext (6.0.3.6)
36
+ actionpack (= 6.0.3.6)
37
+ activerecord (= 6.0.3.6)
38
+ activestorage (= 6.0.3.6)
39
+ activesupport (= 6.0.3.6)
40
+ nokogiri (>= 1.8.5)
41
+ actionview (6.0.3.6)
42
+ activesupport (= 6.0.3.6)
43
+ builder (~> 3.1)
44
+ erubi (~> 1.4)
45
+ rails-dom-testing (~> 2.0)
46
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
47
+ activejob (6.0.3.6)
48
+ activesupport (= 6.0.3.6)
49
+ globalid (>= 0.3.6)
50
+ activemodel (6.0.3.6)
51
+ activesupport (= 6.0.3.6)
52
+ activerecord (6.0.3.6)
53
+ activemodel (= 6.0.3.6)
54
+ activesupport (= 6.0.3.6)
55
+ activestorage (6.0.3.6)
56
+ actionpack (= 6.0.3.6)
57
+ activejob (= 6.0.3.6)
58
+ activerecord (= 6.0.3.6)
59
+ marcel (~> 1.0.0)
60
+ activesupport (6.0.3.6)
61
+ concurrent-ruby (~> 1.0, >= 1.0.2)
62
+ i18n (>= 0.7, < 2)
63
+ minitest (~> 5.1)
64
+ tzinfo (~> 1.1)
65
+ zeitwerk (~> 2.2, >= 2.2.2)
66
+ addressable (2.7.0)
67
+ public_suffix (>= 2.0.2, < 5.0)
68
+ ansi (1.5.0)
69
+ ast (2.4.2)
70
+ bcrypt (3.1.16)
71
+ bindex (0.8.1)
72
+ bootsnap (1.7.4)
73
+ msgpack (~> 1.0)
74
+ builder (3.2.4)
75
+ byebug (11.1.3)
76
+ capybara (3.35.3)
77
+ addressable
78
+ mini_mime (>= 0.1.3)
79
+ nokogiri (~> 1.8)
80
+ rack (>= 1.6.0)
81
+ rack-test (>= 0.6.3)
82
+ regexp_parser (>= 1.5, < 3.0)
83
+ xpath (~> 3.2)
84
+ capybara-screenshot (1.0.25)
85
+ capybara (>= 1.0, < 4)
86
+ launchy
87
+ childprocess (3.0.0)
88
+ codecov (0.5.2)
89
+ simplecov (>= 0.15, < 0.22)
90
+ concurrent-ruby (1.1.8)
91
+ crass (1.0.6)
92
+ database_cleaner (2.0.1)
93
+ database_cleaner-active_record (~> 2.0.0)
94
+ database_cleaner-active_record (2.0.0)
95
+ activerecord (>= 5.a)
96
+ database_cleaner-core (~> 2.0.0)
97
+ database_cleaner-core (2.0.1)
98
+ devise (4.8.0)
99
+ bcrypt (~> 3.0)
100
+ orm_adapter (~> 0.1)
101
+ railties (>= 4.1.0)
102
+ responders
103
+ warden (~> 1.2.3)
104
+ diff-lcs (1.4.4)
105
+ docile (1.3.5)
106
+ erubi (1.10.0)
107
+ erubis (2.7.0)
108
+ ffi (1.15.0)
109
+ flay (2.12.1)
110
+ erubis (~> 2.7.0)
111
+ path_expander (~> 1.0)
112
+ ruby_parser (~> 3.0)
113
+ sexp_processor (~> 4.0)
114
+ globalid (0.4.2)
115
+ activesupport (>= 4.2.0)
116
+ i18n (1.8.10)
117
+ concurrent-ruby (~> 1.0)
118
+ jbuilder (2.11.2)
119
+ activesupport (>= 5.0.0)
120
+ launchy (2.5.0)
121
+ addressable (~> 2.7)
122
+ listen (3.5.1)
123
+ rb-fsevent (~> 0.10, >= 0.10.3)
124
+ rb-inotify (~> 0.9, >= 0.9.10)
125
+ loofah (2.9.1)
126
+ crass (~> 1.0.2)
127
+ nokogiri (>= 1.5.9)
128
+ mail (2.7.1)
129
+ mini_mime (>= 0.1.1)
130
+ marcel (1.0.1)
131
+ method_source (1.0.0)
132
+ mini_mime (1.1.0)
133
+ mini_portile2 (2.5.1)
134
+ minitest (5.14.4)
135
+ msgpack (1.4.2)
136
+ nio4r (2.5.7)
137
+ nokogiri (1.11.3)
138
+ mini_portile2 (~> 2.5.0)
139
+ racc (~> 1.4)
140
+ orm_adapter (0.5.0)
141
+ parallel (1.20.1)
142
+ parser (3.0.1.1)
143
+ ast (~> 2.4.1)
144
+ path_expander (1.1.0)
145
+ public_suffix (4.0.6)
146
+ puma (4.3.7)
147
+ nio4r (~> 2.0)
148
+ racc (1.5.2)
149
+ rack (2.2.3)
150
+ rack-proxy (0.6.5)
151
+ rack
152
+ rack-test (1.1.0)
153
+ rack (>= 1.0, < 3)
154
+ rails (6.0.3.6)
155
+ actioncable (= 6.0.3.6)
156
+ actionmailbox (= 6.0.3.6)
157
+ actionmailer (= 6.0.3.6)
158
+ actionpack (= 6.0.3.6)
159
+ actiontext (= 6.0.3.6)
160
+ actionview (= 6.0.3.6)
161
+ activejob (= 6.0.3.6)
162
+ activemodel (= 6.0.3.6)
163
+ activerecord (= 6.0.3.6)
164
+ activestorage (= 6.0.3.6)
165
+ activesupport (= 6.0.3.6)
166
+ bundler (>= 1.3.0)
167
+ railties (= 6.0.3.6)
168
+ sprockets-rails (>= 2.0.0)
169
+ rails-dom-testing (2.0.3)
170
+ activesupport (>= 4.2.0)
171
+ nokogiri (>= 1.6)
172
+ rails-html-sanitizer (1.3.0)
173
+ loofah (~> 2.3)
174
+ railties (6.0.3.6)
175
+ actionpack (= 6.0.3.6)
176
+ activesupport (= 6.0.3.6)
177
+ method_source
178
+ rake (>= 0.8.7)
179
+ thor (>= 0.20.3, < 2.0)
180
+ rainbow (3.0.0)
181
+ rake (13.0.3)
182
+ rb-fsevent (0.10.4)
183
+ rb-inotify (0.10.1)
184
+ ffi (~> 1.0)
185
+ regexp_parser (2.1.1)
186
+ responders (3.0.1)
187
+ actionpack (>= 5.0)
188
+ railties (>= 5.0)
189
+ rexml (3.2.5)
190
+ rspec (3.10.0)
191
+ rspec-core (~> 3.10.0)
192
+ rspec-expectations (~> 3.10.0)
193
+ rspec-mocks (~> 3.10.0)
194
+ rspec-core (3.10.1)
195
+ rspec-support (~> 3.10.0)
196
+ rspec-expectations (3.10.1)
197
+ diff-lcs (>= 1.2.0, < 2.0)
198
+ rspec-support (~> 3.10.0)
199
+ rspec-mocks (3.10.2)
200
+ diff-lcs (>= 1.2.0, < 2.0)
201
+ rspec-support (~> 3.10.0)
202
+ rspec-rails (5.0.1)
203
+ actionpack (>= 5.2)
204
+ activesupport (>= 5.2)
205
+ railties (>= 5.2)
206
+ rspec-core (~> 3.10)
207
+ rspec-expectations (~> 3.10)
208
+ rspec-mocks (~> 3.10)
209
+ rspec-support (~> 3.10)
210
+ rspec-support (3.10.2)
211
+ rspec_junit_formatter (0.4.1)
212
+ rspec-core (>= 2, < 4, != 2.12.0)
213
+ rubocop (1.13.0)
214
+ parallel (~> 1.10)
215
+ parser (>= 3.0.0.0)
216
+ rainbow (>= 2.2.2, < 4.0)
217
+ regexp_parser (>= 1.8, < 3.0)
218
+ rexml
219
+ rubocop-ast (>= 1.2.0, < 2.0)
220
+ ruby-progressbar (~> 1.7)
221
+ unicode-display_width (>= 1.4.0, < 3.0)
222
+ rubocop-ast (1.5.0)
223
+ parser (>= 3.0.1.1)
224
+ rubocop-rails (2.9.1)
225
+ activesupport (>= 4.2.0)
226
+ rack (>= 1.1)
227
+ rubocop (>= 0.90.0, < 2.0)
228
+ rubocop-rspec (2.3.0)
229
+ rubocop (~> 1.0)
230
+ rubocop-ast (>= 1.1.0)
231
+ ruby-progressbar (1.11.0)
232
+ ruby2ruby (2.4.4)
233
+ ruby_parser (~> 3.1)
234
+ sexp_processor (~> 4.6)
235
+ ruby_parser (3.15.1)
236
+ sexp_processor (~> 4.9)
237
+ rubyzip (2.3.0)
238
+ sass-rails (6.0.0)
239
+ sassc-rails (~> 2.1, >= 2.1.1)
240
+ sassc (2.4.0)
241
+ ffi (~> 1.9)
242
+ sassc-rails (2.1.2)
243
+ railties (>= 4.0.0)
244
+ sassc (>= 2.0)
245
+ sprockets (> 3.0)
246
+ sprockets-rails
247
+ tilt
248
+ selenium-webdriver (3.142.7)
249
+ childprocess (>= 0.5, < 4.0)
250
+ rubyzip (>= 1.2.2)
251
+ sexp_processor (4.15.2)
252
+ shoulda-matchers (4.5.1)
253
+ activesupport (>= 4.2.0)
254
+ simplecov (0.21.2)
255
+ docile (~> 1.1)
256
+ simplecov-html (~> 0.11)
257
+ simplecov_json_formatter (~> 0.1)
258
+ simplecov-console (0.9.1)
259
+ ansi
260
+ simplecov
261
+ terminal-table
262
+ simplecov-html (0.12.3)
263
+ simplecov_json_formatter (0.1.3)
264
+ sprockets (4.0.2)
265
+ concurrent-ruby (~> 1.0)
266
+ rack (> 1, < 3)
267
+ sprockets-rails (3.2.2)
268
+ actionpack (>= 4.0)
269
+ activesupport (>= 4.0)
270
+ sprockets (>= 3.0.0)
271
+ sqlite3 (1.4.2)
272
+ terminal-table (3.0.0)
273
+ unicode-display_width (~> 1.1, >= 1.1.1)
274
+ thor (1.1.0)
275
+ thread_safe (0.3.6)
276
+ tilt (2.0.10)
277
+ turbolinks (5.2.1)
278
+ turbolinks-source (~> 5.2)
279
+ turbolinks-source (5.2.0)
280
+ tzinfo (1.2.9)
281
+ thread_safe (~> 0.1)
282
+ unicode-display_width (1.7.0)
283
+ warden (1.2.9)
284
+ rack (>= 2.0.9)
285
+ web-console (4.1.0)
286
+ actionview (>= 6.0.0)
287
+ activemodel (>= 6.0.0)
288
+ bindex (>= 0.4.0)
289
+ railties (>= 6.0.0)
290
+ webdrivers (4.6.0)
291
+ nokogiri (~> 1.6)
292
+ rubyzip (>= 1.3.0)
293
+ selenium-webdriver (>= 3.0, < 4.0)
294
+ webpacker (4.3.0)
295
+ activesupport (>= 4.2)
296
+ rack-proxy (>= 0.6.1)
297
+ railties (>= 4.2)
298
+ webrick (1.7.0)
299
+ websocket-driver (0.7.3)
300
+ websocket-extensions (>= 0.1.0)
301
+ websocket-extensions (0.1.5)
302
+ xpath (3.2.0)
303
+ nokogiri (~> 1.8)
304
+ zeitwerk (2.4.2)
305
+
306
+ PLATFORMS
307
+ ruby
308
+
309
+ DEPENDENCIES
310
+ bootsnap (>= 1.4.2)
311
+ bundler (>= 2.2.16)
312
+ byebug
313
+ capybara (>= 2.15)
314
+ capybara-screenshot (>= 1.0.18)
315
+ codecov
316
+ database_cleaner (>= 2.0.1)
317
+ devise (~> 4.0)
318
+ devise-secure_password!
319
+ flay (>= 2.10.0)
320
+ jbuilder (~> 2.7)
321
+ launchy (>= 2.4.3)
322
+ listen (~> 3.2)
323
+ puma (~> 4.1)
324
+ rails (~> 6.0.3, >= 6.0.3.6)
325
+ rake (>= 12.3)
326
+ rspec (>= 3.7)
327
+ rspec-rails (>= 3.7)
328
+ rspec_junit_formatter (>= 0.3)
329
+ rubocop (>= 1.0.0)
330
+ rubocop-rails (>= 2.3.2)
331
+ rubocop-rspec (>= 1.35.0)
332
+ ruby2ruby (>= 2.4.0)
333
+ sass-rails (>= 6)
334
+ selenium-webdriver
335
+ shoulda-matchers
336
+ simplecov (>= 0.18.2)
337
+ simplecov-console (>= 0.4.2)
338
+ sqlite3 (~> 1.4)
339
+ turbolinks (~> 5)
340
+ tzinfo-data
341
+ web-console (>= 3.3.0)
342
+ webdrivers
343
+ webpacker (~> 4.0)
344
+ webrick (~> 1.7)
345
+
346
+ BUNDLED WITH
347
+ 2.2.16