devise-secure_password 1.0.5 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/Changelog.md +43 -4
- data/Dockerfile +1 -1
- data/Dockerfile.prev +3 -3
- data/Gemfile +1 -0
- data/Gemfile.lock +215 -205
- data/README.md +33 -10
- data/app/controllers/devise/passwords_with_policy_controller.rb +55 -14
- data/app/views/devise/passwords_with_policy/edit.html.erb +5 -1
- data/config/locales/en.yml +50 -0
- data/devise-secure_password.gemspec +22 -23
- data/gemfiles/rails_6_0.gemfile +57 -0
- data/gemfiles/rails_6_0.gemfile.lock +347 -0
- data/gemfiles/rails_6_1.gemfile +57 -0
- data/gemfiles/rails_6_1.gemfile.lock +352 -0
- data/lib/devise/secure_password.rb +4 -9
- data/lib/devise/secure_password/controllers/devise_helpers.rb +4 -50
- data/lib/devise/secure_password/controllers/helpers.rb +58 -0
- data/lib/devise/secure_password/grammar.rb +13 -0
- data/lib/devise/secure_password/models/password_disallows_frequent_changes.rb +4 -2
- data/lib/devise/secure_password/models/password_disallows_frequent_reuse.rb +1 -0
- data/lib/devise/secure_password/models/password_has_required_content.rb +53 -15
- data/lib/devise/secure_password/models/password_requires_regular_updates.rb +1 -3
- data/lib/devise/secure_password/version.rb +1 -1
- data/lib/support/string/character_counter.rb +3 -1
- data/pkg/devise-secure_password-2.0.0.gem +0 -0
- metadata +66 -168
- data/coverage/assets/0.10.2/application.css +0 -799
- data/coverage/assets/0.10.2/application.js +0 -1707
- data/coverage/assets/0.10.2/colorbox/border.png +0 -0
- data/coverage/assets/0.10.2/colorbox/controls.png +0 -0
- data/coverage/assets/0.10.2/colorbox/loading.gif +0 -0
- data/coverage/assets/0.10.2/colorbox/loading_background.png +0 -0
- data/coverage/assets/0.10.2/favicon_green.png +0 -0
- data/coverage/assets/0.10.2/favicon_red.png +0 -0
- data/coverage/assets/0.10.2/favicon_yellow.png +0 -0
- data/coverage/assets/0.10.2/loading.gif +0 -0
- data/coverage/assets/0.10.2/magnify.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/coverage/assets/0.10.2/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/coverage/index.html +0 -4115
- data/devise-secure_password-1.0.0.gem +0 -0
- data/gemfiles/rails-5_0_6.gemfile +0 -17
- data/gemfiles/rails-5_0_6.gemfile.lock +0 -286
- data/gemfiles/rails-5_1_4.gemfile +0 -16
- data/gemfiles/rails-5_1_4.gemfile.lock +0 -282
- data/lib/devise/secure_password/controllers/active_helpers.rb +0 -45
- data/lib/devise/secure_password/hooks/password_requires_regular_updates.rb +0 -5
- data/pkg/devise-secure_password-1.0.3.gem +0 -0
- data/pkg/devise-secure_password-1.0.4.gem +0 -0
data/README.md
CHANGED
@@ -9,7 +9,7 @@ as well.
|
|
9
9
|
|
10
10
|
## Build Status
|
11
11
|
|
12
|
-
| Service | rails
|
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:
|
36
|
-
- Ruby:
|
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.
|
44
|
-
gem 'devise-secure_password', '~>
|
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.
|
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/
|
238
|
-
prompt> BUNDLE_GEMFILE=gemfiles/
|
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 <
|
3
|
-
before_action :
|
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
|
-
|
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
|
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
|
-
|
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:
|
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
|
-
|
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
|
-
|
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>
|
data/config/locales/en.yml
CHANGED
@@ -1,11 +1,23 @@
|
|
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
|
+
number: "number"
|
11
|
+
special: "special"
|
12
|
+
|
3
13
|
password_has_required_content:
|
4
14
|
errors:
|
5
15
|
messages:
|
6
16
|
unknown_characters: "contains %{count} invalid %{subject}"
|
7
17
|
minimum_characters: "must contain at least %{count} %{type} %{subject}"
|
8
18
|
maximum_characters: "must contain less than %{count} %{type} %{subject}"
|
19
|
+
minimum_length: "must contain at least %{count} %{subject}"
|
20
|
+
maximum_length: "must contain less than %{count} %{subject}"
|
9
21
|
password_disallows_frequent_reuse:
|
10
22
|
errors:
|
11
23
|
messages:
|
@@ -21,6 +33,44 @@ en:
|
|
21
33
|
errors:
|
22
34
|
messages:
|
23
35
|
password_expired: "Your password has expired. Passwords must be changed every %{timeframe}"
|
36
|
+
datetime:
|
37
|
+
# update distance_in_words translations to remove the determiner words:
|
38
|
+
# about, almost, over, less than, etc.
|
39
|
+
precise_distance_in_words:
|
40
|
+
half_a_minute: "half a minute"
|
41
|
+
less_than_x_seconds:
|
42
|
+
one: "1 second" # default was: "less than 1 second"
|
43
|
+
other: "%{count} seconds" # default was: "less than %{count} seconds"
|
44
|
+
x_seconds:
|
45
|
+
one: "1 second"
|
46
|
+
other: "%{count} seconds"
|
47
|
+
less_than_x_minutes:
|
48
|
+
one: "a minute" # default was: "less than a minute"
|
49
|
+
other: "%{count} minutes" # default was: "less than %{count} minutes"
|
50
|
+
x_minutes:
|
51
|
+
one: "1 minute"
|
52
|
+
other: "%{count} minutes"
|
53
|
+
about_x_hours:
|
54
|
+
one: "1 hour" # default was: "about 1 hour"
|
55
|
+
other: "%{count} hours" # default was: "about %{count} hours"
|
56
|
+
x_days:
|
57
|
+
one: "1 day"
|
58
|
+
other: "%{count} days"
|
59
|
+
about_x_months:
|
60
|
+
one: "1 month" # default was: "about 1 month"
|
61
|
+
other: "%{count} months" # default was: "about %{count} months"
|
62
|
+
x_months:
|
63
|
+
one: "1 month"
|
64
|
+
other: "%{count} months"
|
65
|
+
about_x_years:
|
66
|
+
one: "1 year" # default was: "about 1 year"
|
67
|
+
other: "%{count} years" # default was: "about %{count} years"
|
68
|
+
over_x_years:
|
69
|
+
one: "1 year" # default was: "over 1 year"
|
70
|
+
other: "%{count} years" # default was: "over %{count} years"
|
71
|
+
almost_x_years:
|
72
|
+
one: "1 year" # default was: "almost 1 year"
|
73
|
+
other: "%{count} years" # default was: "almost %{count} years"
|
24
74
|
devise:
|
25
75
|
passwords_with_policy:
|
26
76
|
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', '<
|
32
|
+
spec.add_runtime_dependency 'railties', '>= 5.0.0', '< 7.0.0'
|
33
33
|
|
34
|
-
spec.add_development_dependency 'bundler', '
|
35
|
-
spec.add_development_dependency 'capybara', '
|
36
|
-
spec.add_development_dependency 'capybara-screenshot', '
|
37
|
-
spec.add_development_dependency '
|
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', '
|
41
|
-
spec.add_development_dependency 'launchy', '
|
42
|
-
spec.add_development_dependency 'rails', '
|
43
|
-
spec.add_development_dependency 'rake', '
|
44
|
-
spec.add_development_dependency 'rspec', '
|
45
|
-
spec.add_development_dependency '
|
46
|
-
spec.add_development_dependency '
|
47
|
-
spec.add_development_dependency 'rubocop', '>= 0.
|
48
|
-
spec.add_development_dependency '
|
49
|
-
spec.add_development_dependency '
|
50
|
-
spec.add_development_dependency '
|
51
|
-
spec.add_development_dependency '
|
52
|
-
spec.add_development_dependency 'simplecov
|
53
|
-
spec.add_development_dependency '
|
54
|
-
spec.add_development_dependency '
|
55
|
-
|
56
|
-
spec.required_ruby_version = '>= 2.
|
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
|