rodauth-rails 1.5.4 → 1.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 (28) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/README.md +6 -6
  4. data/lib/generators/rodauth/install_generator.rb +4 -2
  5. data/lib/generators/rodauth/migration/active_record/account_expiration.erb +2 -1
  6. data/lib/generators/rodauth/migration/active_record/email_auth.erb +2 -2
  7. data/lib/generators/rodauth/migration/active_record/lockout.erb +4 -2
  8. data/lib/generators/rodauth/migration/active_record/otp.erb +2 -1
  9. data/lib/generators/rodauth/migration/active_record/password_expiration.erb +2 -1
  10. data/lib/generators/rodauth/migration/active_record/recovery_codes.erb +1 -1
  11. data/lib/generators/rodauth/migration/active_record/remember.erb +2 -1
  12. data/lib/generators/rodauth/migration/active_record/reset_password.erb +2 -1
  13. data/lib/generators/rodauth/migration/active_record/single_session.erb +2 -1
  14. data/lib/generators/rodauth/migration/active_record/sms_codes.erb +2 -1
  15. data/lib/generators/rodauth/migration/active_record/verify_account.erb +2 -1
  16. data/lib/generators/rodauth/migration/active_record/verify_login_change.erb +2 -1
  17. data/lib/generators/rodauth/migration/active_record/webauthn.erb +2 -1
  18. data/lib/generators/rodauth/migration_generator.rb +35 -14
  19. data/lib/generators/rodauth/templates/app/mailers/rodauth_mailer.rb +6 -6
  20. data/lib/generators/rodauth/templates/app/misc/rodauth_app.rb +2 -2
  21. data/lib/generators/rodauth/templates/app/misc/rodauth_main.rb +2 -0
  22. data/lib/generators/rodauth/views_generator.rb +18 -5
  23. data/lib/rodauth/rails/controller_methods.rb +1 -1
  24. data/lib/rodauth/rails/feature/base.rb +3 -1
  25. data/lib/rodauth/rails/feature/internal_request.rb +4 -2
  26. data/lib/rodauth/rails/feature.rb +2 -2
  27. data/lib/rodauth/rails/version.rb +1 -1
  28. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c63496f359a15bb061b6b419a609cbe63c24991e156731721d9f077ecf9deac4
4
- data.tar.gz: 68212d9c722391c8c79f8bf8c48f8a05a39410ea0d97396876a6c2f5e92f103a
3
+ metadata.gz: 879be6e1bbb5238e3f469002e1152d727948f970d2cda658b6ed0348a26f4b46
4
+ data.tar.gz: 79042f44b03bb8ab7f2225b79697b3399f79de272dc1c414de5ddc91b788b1cb
5
5
  SHA512:
6
- metadata.gz: 3632843dbd0214b73fa23134a0f2b42ec3b8f1c33430af1c776c685956ccf50e475840993299bff9863491456a369ad42b7e688e3ed03b783e51f4585d6be621
7
- data.tar.gz: 6c123e024a51d3c2ba6b224b64c1f21d3b46363523d5b498e93fbe659052489660a61a3dd83da5080a07067d9052a82450da17a7bf156e9c905b2aa81ca861f6
6
+ metadata.gz: 9cb9d96c3e60c64a3f8367dd122f3eff3448f0c9a147510173a8d781483d7de6a88c264a717db14864e26a830a153c09bcbf6bad4865be97d3be248fcd0265d0
7
+ data.tar.gz: 422b0db632d1e0317d0f38c10d60405f2e53daf083919b460fcb29157e238ac0c2e6249660e09dc4a7f452718629d604c7a1211e073d32e4884a0b6ab4fea32a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## 1.6.0 (2022-09-14)
2
+
3
+ * Avoid creating IDENTITY columns for primary foreign keys on SQL Server with Active Record (@janko)
4
+
5
+ * Make configuration name argument required in generated `RodauthMailer` (@janko)
6
+
7
+ * Make the Rails integration work without Action Mailer loaded (@janko)
8
+
9
+ * Don't redirect to login page when account is missing in `current_account` method (@janko)
10
+
11
+ ## 1.5.5 (2022-08-04)
12
+
13
+ * Don't raise `ArgumentError` when calling `#current_account` without being logged in (@benkoshy)
14
+
15
+ * Abort `rodauth:views` generator when unknown feature was specified (@janko)
16
+
17
+ * Abort `rodauth:migration` generator when unknown feature was specified (@janko)
18
+
1
19
  ## 1.5.4 (2022-07-21)
2
20
 
3
21
  * Generate account fixtures in `spec/fixtures` directory when using RSpec (@benkoshy)
data/README.md CHANGED
@@ -14,7 +14,7 @@ Provides Rails integration for the [Rodauth] authentication framework.
14
14
  🎥 Screencasts:
15
15
 
16
16
  * [Rails Authentication with Rodauth](https://www.youtube.com/watch?v=2hDpNikacf0)
17
- * [Multifactor Authentication via TOTP with Rodauth](https://www.youtube.com/watch?v=9ON-kgXpz2A)
17
+ * [Multifactor Authentication with Rodauth](https://www.youtube.com/watch?v=9ON-kgXpz2A&list=PLkGQXZLACDTGKsaRWstkHQdm2CUmT3SZ-) ([TOTP](https://youtu.be/9ON-kgXpz2A), [Recovery Codes](https://youtu.be/lkFCcE1Q5-w))
18
18
 
19
19
  📚 Articles:
20
20
 
@@ -194,7 +194,7 @@ class RodauthApp < Rodauth::Rails::App
194
194
 
195
195
  # require authentication for /dashboard/* and /account/* routes
196
196
  if r.path.start_with?("/dashboard") || r.path.start_with?("/account")
197
- rodauth.require_authentication # redirect to login page if not authenticated
197
+ rodauth.require_account # redirect to login page if not authenticated
198
198
  end
199
199
  end
200
200
  end
@@ -208,7 +208,7 @@ class ApplicationController < ActionController::Base
208
208
  private
209
209
 
210
210
  def authenticate
211
- rodauth.require_authentication # redirect to login page if not authenticated
211
+ rodauth.require_account # redirect to login page if not authenticated
212
212
  end
213
213
  end
214
214
  ```
@@ -727,7 +727,7 @@ For controller tests, you can log in accounts by modifying the session:
727
727
  ```rb
728
728
  # app/controllers/articles_controller.rb
729
729
  class ArticlesController < ApplicationController
730
- before_action -> { rodauth.require_authentication }
730
+ before_action -> { rodauth.require_account }
731
731
 
732
732
  def index
733
733
  # ...
@@ -951,7 +951,7 @@ end
951
951
 
952
952
  In addition to Zeitwerk compatibility, this extra layer catches Rodauth redirects
953
953
  that happen on the controller level (e.g. when calling
954
- `rodauth.require_authentication` in a `before_action` filter).
954
+ `rodauth.require_account` in a `before_action` filter).
955
955
 
956
956
  ### Roda app
957
957
 
@@ -1180,7 +1180,7 @@ License](https://opensource.org/licenses/MIT).
1180
1180
 
1181
1181
  Everyone interacting in the rodauth-rails project's codebases, issue trackers,
1182
1182
  chat rooms and mailing lists is expected to follow the [code of
1183
- conduct](https://github.com/janko/rodauth-rails/blob/master/CODE_OF_CONDUCT.md).
1183
+ conduct](CODE_OF_CONDUCT.md).
1184
1184
 
1185
1185
  [Rodauth]: https://github.com/jeremyevans/rodauth
1186
1186
  [Sequel]: https://github.com/jeremyevans/sequel
@@ -63,6 +63,8 @@ module Rodauth
63
63
  end
64
64
 
65
65
  def create_mailer
66
+ return unless defined?(ActionMailer)
67
+
66
68
  template "app/mailers/rodauth_mailer.rb"
67
69
 
68
70
  MAILER_VIEWS.each do |view|
@@ -88,8 +90,8 @@ module Rodauth
88
90
  private
89
91
 
90
92
  def migration_features
91
- features = [:base, :reset_password, :verify_account, :verify_login_change]
92
- features << :remember unless jwt?
93
+ features = ["base", "reset_password", "verify_account", "verify_login_change"]
94
+ features << "remember" unless jwt?
93
95
  features
94
96
  end
95
97
 
@@ -1,5 +1,6 @@
1
1
  # Used by the account expiration feature
2
- create_table :account_activity_times<%= primary_key_type %> do |t|
2
+ create_table :account_activity_times, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
3
4
  t.foreign_key :accounts, column: :id
4
5
  t.datetime :last_activity_at, null: false
5
6
  t.datetime :last_login_at, null: false
@@ -1,6 +1,6 @@
1
1
  # Used by the email auth feature
2
- create_table :account_email_auth_keys<%= primary_key_type %> do |t|
3
- t.foreign_key :accounts, column: :id
2
+ create_table :account_email_auth_keys, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
4
4
  t.string :key, null: false
5
5
  t.datetime :deadline, null: false
6
6
  t.datetime :email_last_sent, null: false, default: <%= current_timestamp %>
@@ -1,9 +1,11 @@
1
1
  # Used by the lockout feature
2
- create_table :account_login_failures<%= primary_key_type %> do |t|
2
+ create_table :account_login_failures, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
3
4
  t.foreign_key :accounts, column: :id
4
5
  t.integer :number, null: false, default: 1
5
6
  end
6
- create_table :account_lockouts<%= primary_key_type %> do |t|
7
+ create_table :account_lockouts, id: false do |t|
8
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
7
9
  t.foreign_key :accounts, column: :id
8
10
  t.string :key, null: false
9
11
  t.datetime :deadline, null: false
@@ -1,5 +1,6 @@
1
1
  # Used by the otp feature
2
- create_table :account_otp_keys<%= primary_key_type %> do |t|
2
+ create_table :account_otp_keys, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
3
4
  t.foreign_key :accounts, column: :id
4
5
  t.string :key, null: false
5
6
  t.integer :num_failures, null: false, default: 0
@@ -1,5 +1,6 @@
1
1
  # Used by the password expiration feature
2
- create_table :account_password_change_times<%= primary_key_type %> do |t|
2
+ create_table :account_password_change_times, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
3
4
  t.foreign_key :accounts, column: :id
4
5
  t.datetime :changed_at, null: false, default: <%= current_timestamp %>
5
6
  end
@@ -1,6 +1,6 @@
1
1
  # Used by the recovery codes feature
2
2
  create_table :account_recovery_codes, primary_key: [:id, :code] do |t|
3
- t.column :id, :<%= primary_key_type(nil) || :bigint %>
3
+ t.<%= primary_key_type(nil) %> :id
4
4
  t.foreign_key :accounts, column: :id
5
5
  t.string :code
6
6
  end
@@ -1,5 +1,6 @@
1
1
  # Used by the remember me feature
2
- create_table :account_remember_keys<%= primary_key_type %> do |t|
2
+ create_table :account_remember_keys, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
3
4
  t.foreign_key :accounts, column: :id
4
5
  t.string :key, null: false
5
6
  t.datetime :deadline, null: false
@@ -1,5 +1,6 @@
1
1
  # Used by the password reset feature
2
- create_table :account_password_reset_keys<%= primary_key_type %> do |t|
2
+ create_table :account_password_reset_keys, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
3
4
  t.foreign_key :accounts, column: :id
4
5
  t.string :key, null: false
5
6
  t.datetime :deadline, null: false
@@ -1,5 +1,6 @@
1
1
  # Used by the single session feature
2
- create_table :account_session_keys<%= primary_key_type %> do |t|
2
+ create_table :account_session_keys, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
3
4
  t.foreign_key :accounts, column: :id
4
5
  t.string :key, null: false
5
6
  end
@@ -1,5 +1,6 @@
1
1
  # Used by the sms codes feature
2
- create_table :account_sms_codes<%= primary_key_type %> do |t|
2
+ create_table :account_sms_codes, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
3
4
  t.foreign_key :accounts, column: :id
4
5
  t.string :phone_number, null: false
5
6
  t.integer :num_failures
@@ -1,5 +1,6 @@
1
1
  # Used by the account verification feature
2
- create_table :account_verification_keys<%= primary_key_type %> do |t|
2
+ create_table :account_verification_keys, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
3
4
  t.foreign_key :accounts, column: :id
4
5
  t.string :key, null: false
5
6
  t.datetime :requested_at, null: false, default: <%= current_timestamp %>
@@ -1,5 +1,6 @@
1
1
  # Used by the verify login change feature
2
- create_table :account_login_change_keys<%= primary_key_type %> do |t|
2
+ create_table :account_login_change_keys, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
3
4
  t.foreign_key :accounts, column: :id
4
5
  t.string :key, null: false
5
6
  t.string :login, null: false
@@ -1,5 +1,6 @@
1
1
  # Used by the webauthn feature
2
- create_table :account_webauthn_user_ids<%= primary_key_type %> do |t|
2
+ create_table :account_webauthn_user_ids, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
3
4
  t.foreign_key :accounts, column: :id
4
5
  t.string :webauthn_id, null: false
5
6
  end
@@ -17,7 +17,7 @@ module Rodauth
17
17
  desc: "Name of the generated migration file"
18
18
 
19
19
  def create_rodauth_migration
20
- return if features.empty?
20
+ validate_features or return
21
21
 
22
22
  migration_template "db/migrate/create_rodauth.rb", File.join(db_migrate_path, "#{migration_name}.rb")
23
23
  end
@@ -30,7 +30,6 @@ module Rodauth
30
30
 
31
31
  def migration_content
32
32
  features
33
- .select { |feature| File.exist?(migration_chunk(feature)) }
34
33
  .map { |feature| File.read(migration_chunk(feature)) }
35
34
  .map { |content| erb_eval(content) }
36
35
  .join("\n")
@@ -45,19 +44,37 @@ module Rodauth
45
44
  end
46
45
  end
47
46
 
47
+ def migration_chunk(feature)
48
+ "#{MIGRATION_DIR}/#{feature}.erb"
49
+ end
50
+
51
+ def validate_features
52
+ if features.empty?
53
+ say "No features specified!", :yellow
54
+ false
55
+ elsif (features - valid_features).any?
56
+ say "No available migration for feature(s): #{(features - valid_features).join(", ")}", :red
57
+ false
58
+ else
59
+ true
60
+ end
61
+ end
62
+
63
+ def valid_features
64
+ Dir["#{MIGRATION_DIR}/*.erb"].map { |filename| File.basename(filename, ".erb") }
65
+ end
66
+
48
67
  if defined?(::ActiveRecord::Railtie) # Active Record
49
68
  include ::ActiveRecord::Generators::Migration
50
69
 
70
+ MIGRATION_DIR = "#{__dir__}/migration/active_record"
71
+
51
72
  def db_migrate_path
52
73
  return "db/migrate" unless ActiveRecord.version >= Gem::Version.new("5.0")
53
74
 
54
75
  super
55
76
  end
56
77
 
57
- def migration_chunk(feature)
58
- "#{__dir__}/migration/active_record/#{feature}.erb"
59
- end
60
-
61
78
  def migration_version
62
79
  return unless ActiveRecord.version >= Gem::Version.new("5.0")
63
80
 
@@ -76,12 +93,18 @@ module Rodauth
76
93
  generators = ::Rails.application.config.generators
77
94
  column_type = generators.options[:active_record][:primary_key_type]
78
95
 
79
- return unless column_type
80
-
81
96
  if key
82
- ", #{key}: :#{column_type}"
97
+ ", #{key}: :#{column_type}" if column_type
83
98
  else
84
- column_type
99
+ column_type || default_primary_key_type
100
+ end
101
+ end
102
+
103
+ def default_primary_key_type
104
+ if ActiveRecord.version >= Gem::Version.new("5.1") && activerecord_adapter != "sqlite3"
105
+ :bigint
106
+ else
107
+ :integer
85
108
  end
86
109
  end
87
110
 
@@ -95,6 +118,8 @@ module Rodauth
95
118
  else # Sequel
96
119
  include ::Rails::Generators::Migration
97
120
 
121
+ MIGRATION_DIR = "#{__dir__}/migration/sequel"
122
+
98
123
  def self.next_migration_number(dirname)
99
124
  next_migration_number = current_migration_number(dirname) + 1
100
125
  [Time.now.utc.strftime('%Y%m%d%H%M%S'), format('%.14d', next_migration_number)].max
@@ -104,10 +129,6 @@ module Rodauth
104
129
  "db/migrate"
105
130
  end
106
131
 
107
- def migration_chunk(feature)
108
- "#{__dir__}/migration/sequel/#{feature}.erb"
109
- end
110
-
111
132
  def db
112
133
  db = ::Sequel::DATABASES.first if defined?(::Sequel)
113
134
  db or fail Rodauth::Rails::Error, "missing Sequel database connection"
@@ -1,19 +1,19 @@
1
1
  class RodauthMailer < ApplicationMailer
2
- def verify_account(name = nil, account_id, key)
2
+ def verify_account(name, account_id, key)
3
3
  @email_link = email_link(name, :verify_account, account_id, key)
4
4
  @account = find_account(name, account_id)
5
5
 
6
6
  mail to: @account.email, subject: rodauth(name).verify_account_email_subject
7
7
  end
8
8
 
9
- def reset_password(name = nil, account_id, key)
9
+ def reset_password(name, account_id, key)
10
10
  @email_link = email_link(name, :reset_password, account_id, key)
11
11
  @account = find_account(name, account_id)
12
12
 
13
13
  mail to: @account.email, subject: rodauth(name).reset_password_email_subject
14
14
  end
15
15
 
16
- def verify_login_change(name = nil, account_id, key)
16
+ def verify_login_change(name, account_id, key)
17
17
  @email_link = email_link(name, :verify_login_change, account_id, key)
18
18
  @account = find_account(name, account_id)
19
19
  @new_email = @account.login_change_key.login
@@ -21,20 +21,20 @@ class RodauthMailer < ApplicationMailer
21
21
  mail to: @new_email, subject: rodauth(name).verify_login_change_email_subject
22
22
  end
23
23
 
24
- def password_changed(name = nil, account_id)
24
+ def password_changed(name, account_id)
25
25
  @account = find_account(name, account_id)
26
26
 
27
27
  mail to: @account.email, subject: rodauth(name).password_changed_email_subject
28
28
  end
29
29
 
30
- # def email_auth(name = nil, account_id, key)
30
+ # def email_auth(name, account_id, key)
31
31
  # @email_link = email_link(name, :email_auth, account_id, key)
32
32
  # @account = find_account(name, account_id)
33
33
 
34
34
  # mail to: @account.email, subject: rodauth(name).email_auth_email_subject
35
35
  # end
36
36
 
37
- # def unlock_account(name = nil, account_id, key)
37
+ # def unlock_account(name, account_id, key)
38
38
  # @email_link = email_link(name, :unlock_account, account_id, key)
39
39
  # @account = find_account(name, account_id)
40
40
 
@@ -13,12 +13,12 @@ class RodauthApp < Rodauth::Rails::App
13
13
  r.rodauth # route rodauth requests
14
14
 
15
15
  # ==> Authenticating requests
16
- # Call `rodauth.require_authentication` for requests that you want to
16
+ # Call `rodauth.require_account` for requests that you want to
17
17
  # require authentication for. For example:
18
18
  #
19
19
  # # authenticate /dashboard/* and /account/* requests
20
20
  # if r.path.start_with?("/dashboard") || r.path.start_with?("/account")
21
- # rodauth.require_authentication
21
+ # rodauth.require_account
22
22
  # end
23
23
 
24
24
  # ==> Secondary configurations
@@ -56,6 +56,7 @@ class RodauthMain < Rodauth::Rails::Auth
56
56
  # Redirect to the app from login and registration pages if already logged in.
57
57
  # already_logged_in { redirect login_redirect }
58
58
 
59
+ <% if defined?(ActionMailer) -%>
59
60
  # ==> Emails
60
61
  # Use a custom mailer for delivering authentication emails.
61
62
  create_reset_password_email do
@@ -81,6 +82,7 @@ class RodauthMain < Rodauth::Rails::Auth
81
82
  db.after_commit { email.deliver_later }
82
83
  end
83
84
 
85
+ <% end -%>
84
86
  # ==> Flash
85
87
  <% unless json? || jwt? -%>
86
88
  # Match flash keys with ones already used in the Rails app.
@@ -46,10 +46,7 @@ module Rodauth
46
46
  }
47
47
 
48
48
  def create_views
49
- views = features.inject([]) do |list, feature|
50
- list |= VIEWS[feature] || []
51
- list |= VIEWS[DEPENDENCIES[feature]] || []
52
- end
49
+ validate_features or return
53
50
 
54
51
  views.each do |view|
55
52
  copy_file "app/views/rodauth/#{view}.html.erb", "app/views/#{directory}/#{view}.html.erb" do |content|
@@ -63,13 +60,29 @@ module Rodauth
63
60
 
64
61
  private
65
62
 
63
+ def views
64
+ features.inject([]) do |list, feature|
65
+ list |= VIEWS.fetch(feature)
66
+ list |= VIEWS[DEPENDENCIES[feature]] || []
67
+ end
68
+ end
69
+
70
+ def validate_features
71
+ if (features - VIEWS.keys).any?
72
+ say "No available view template for feature(s): #{(features - VIEWS.keys).join(", ")}", :error
73
+ false
74
+ else
75
+ true
76
+ end
77
+ end
78
+
66
79
  def features
67
80
  if options[:all]
68
81
  VIEWS.keys
69
82
  elsif selected_features
70
83
  selected_features.map(&:to_sym)
71
84
  else
72
- rodauth_configuration.features
85
+ rodauth_configuration.features & VIEWS.keys
73
86
  end
74
87
  end
75
88
 
@@ -9,7 +9,7 @@ module Rodauth
9
9
  end
10
10
 
11
11
  def current_account(name = nil)
12
- rodauth(name).rails_account || rodauth(name).login_required
12
+ rodauth(name).rails_account
13
13
  end
14
14
 
15
15
  def rodauth(name = nil)
@@ -9,10 +9,12 @@ module Rodauth
9
9
  end
10
10
 
11
11
  def rails_account
12
+ return unless logged_in?
13
+
12
14
  account_from_session unless account
13
15
 
14
16
  unless account
15
- clear_session if logged_in?
17
+ clear_session
16
18
  return
17
19
  end
18
20
 
@@ -3,13 +3,13 @@ module Rodauth
3
3
  module Feature
4
4
  module InternalRequest
5
5
  def domain
6
- return super unless missing_host?
6
+ return super unless missing_host? && rails_url_options
7
7
 
8
8
  rails_url_options.fetch(:host)
9
9
  end
10
10
 
11
11
  def base_url
12
- return super unless missing_host? && domain
12
+ return super unless missing_host? && domain && rails_url_options
13
13
 
14
14
  scheme = rails_url_options[:protocol] || "http"
15
15
  port = rails_url_options[:port]
@@ -43,6 +43,8 @@ module Rodauth
43
43
  end
44
44
 
45
45
  def rails_url_options
46
+ return nil unless defined?(ActionMailer)
47
+
46
48
  ::Rails.application.config.action_mailer.default_url_options or
47
49
  fail Error, "There is no information to set the URL host from. Please set config.action_mailer.default_url_options in your Rails application, or configure #domain and #base_url in your Rodauth configuration."
48
50
  end
@@ -8,7 +8,7 @@ module Rodauth
8
8
  require "rodauth/rails/feature/callbacks"
9
9
  require "rodauth/rails/feature/csrf"
10
10
  require "rodauth/rails/feature/render"
11
- require "rodauth/rails/feature/email"
11
+ require "rodauth/rails/feature/email" if defined?(ActionMailer)
12
12
  require "rodauth/rails/feature/instrumentation"
13
13
  require "rodauth/rails/feature/internal_request"
14
14
 
@@ -16,7 +16,7 @@ module Rodauth
16
16
  include Rodauth::Rails::Feature::Callbacks
17
17
  include Rodauth::Rails::Feature::Csrf
18
18
  include Rodauth::Rails::Feature::Render
19
- include Rodauth::Rails::Feature::Email
19
+ include Rodauth::Rails::Feature::Email if defined?(ActionMailer)
20
20
  include Rodauth::Rails::Feature::Instrumentation
21
21
  include Rodauth::Rails::Feature::InternalRequest
22
22
  end
@@ -1,5 +1,5 @@
1
1
  module Rodauth
2
2
  module Rails
3
- VERSION = "1.5.4"
3
+ VERSION = "1.6.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rodauth-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.4
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janko Marohnić
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-21 00:00:00.000000000 Z
11
+ date: 2022-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties