plutonium 0.12.13 → 0.13.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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/Appraisals +11 -0
  3. data/README.md +4 -0
  4. data/Rakefile +9 -5
  5. data/app/assets/plutonium.css +1 -1
  6. data/app/views/application/_flash.html.erb +1 -1
  7. data/app/views/application/_flash_toasts.html.erb +1 -1
  8. data/app/views/application/_resource_sidebar.html.erb +1 -1
  9. data/app/views/components/form/form_component.html.erb +1 -2
  10. data/app/views/components/interactive_action_form/interactive_action_form_component.html.erb +1 -1
  11. data/app/views/components/resource_header/resource_header_component.html.erb +3 -3
  12. data/app/views/components/resource_header/resource_header_component.rb +1 -1
  13. data/app/views/components/sidebar/sidebar_component.html.erb +1 -6
  14. data/app/views/components/sidebar/sidebar_component.rb +11 -3
  15. data/app/views/layouts/resource.html.erb +1 -1
  16. data/app/views/layouts/rodauth.html.erb +7 -8
  17. data/app/views/resource/_interactive_resource_action_form.html.erb +4 -4
  18. data/app/views/rodauth/_email_auth_request_form.html.erb +2 -2
  19. data/app/views/rodauth/_login_form.html.erb +24 -18
  20. data/app/views/rodauth/_login_form_footer.html.erb +1 -1
  21. data/app/views/rodauth/change_login.html.erb +20 -11
  22. data/app/views/rodauth/change_password.html.erb +11 -11
  23. data/app/views/rodauth/close_account.html.erb +4 -4
  24. data/app/views/rodauth/create_account.html.erb +44 -18
  25. data/app/views/rodauth/email_auth.html.erb +2 -2
  26. data/app/views/rodauth/login.html.erb +3 -5
  27. data/app/views/rodauth/logout.html.erb +7 -4
  28. data/app/views/rodauth/otp_auth.html.erb +5 -6
  29. data/app/views/rodauth/otp_disable.html.erb +4 -5
  30. data/app/views/rodauth/otp_setup.html.erb +8 -8
  31. data/app/views/rodauth/recovery_auth.html.erb +5 -5
  32. data/app/views/rodauth/recovery_codes.html.erb +5 -5
  33. data/app/views/rodauth/remember.html.erb +2 -2
  34. data/app/views/rodauth/reset_password.html.erb +8 -8
  35. data/app/views/rodauth/reset_password_request.html.erb +14 -10
  36. data/app/views/rodauth/sms_auth.html.erb +4 -4
  37. data/app/views/rodauth/sms_confirm.html.erb +4 -4
  38. data/app/views/rodauth/sms_disable.html.erb +5 -5
  39. data/app/views/rodauth/sms_request.html.erb +2 -2
  40. data/app/views/rodauth/sms_setup.html.erb +7 -7
  41. data/app/views/rodauth/two_factor_disable.html.erb +4 -4
  42. data/app/views/rodauth/unlock_account.html.erb +8 -10
  43. data/app/views/rodauth/unlock_account_request.html.erb +5 -7
  44. data/app/views/rodauth/verify_account.html.erb +8 -8
  45. data/app/views/rodauth/verify_account_resend.html.erb +13 -10
  46. data/app/views/rodauth/verify_login_change.html.erb +2 -2
  47. data/app/views/rodauth/webauthn_auth.html.erb +2 -2
  48. data/app/views/rodauth/webauthn_remove.html.erb +5 -5
  49. data/app/views/rodauth/webauthn_setup.html.erb +5 -5
  50. data/config.ru +9 -0
  51. data/gemfiles/rails_7.gemfile +13 -0
  52. data/gemfiles/rails_7.gemfile.lock +335 -0
  53. data/lib/generators/pu/rodauth/install_generator.rb +0 -5
  54. data/lib/generators/pu/rodauth/migration/active_record/audit_logging.erb +2 -2
  55. data/lib/generators/pu/rodauth/migration_generator.rb +30 -51
  56. data/lib/generators/pu/rodauth/templates/app/mailers/rodauth_mailer.rb.tt +1 -0
  57. data/lib/generators/pu/rodauth/templates/app/models/account.rb.tt +0 -8
  58. data/lib/generators/pu/rodauth/templates/app/rodauth/rodauth_plugin.rb.tt +8 -2
  59. data/lib/generators/pu/rodauth/templates/db/migrate/create_rodauth.rb.tt +0 -8
  60. data/lib/plutonium/auth/rodauth.rb +3 -1
  61. data/lib/plutonium/core/controllers/base.rb +29 -19
  62. data/lib/plutonium/core/fields/inputs/date_time_input.rb +1 -1
  63. data/lib/plutonium/helpers/display_helper.rb +6 -4
  64. data/lib/plutonium/helpers/form_helper.rb +18 -7
  65. data/lib/plutonium/pkg/app.rb +4 -0
  66. data/lib/plutonium/rodauth/controller_methods.rb +1 -0
  67. data/lib/plutonium/version.rb +1 -1
  68. data/lib/plutonium.rb +40 -29
  69. data/sig/plutonium.rbs +10 -2
  70. metadata +118 -21
  71. data/lib/generators/pu/rodauth/migration/sequel/account_expiration.erb +0 -7
  72. data/lib/generators/pu/rodauth/migration/sequel/active_sessions.erb +0 -8
  73. data/lib/generators/pu/rodauth/migration/sequel/audit_logging.erb +0 -17
  74. data/lib/generators/pu/rodauth/migration/sequel/base.erb +0 -25
  75. data/lib/generators/pu/rodauth/migration/sequel/disallow_password_reuse.erb +0 -6
  76. data/lib/generators/pu/rodauth/migration/sequel/email_auth.erb +0 -7
  77. data/lib/generators/pu/rodauth/migration/sequel/jwt_refresh.erb +0 -8
  78. data/lib/generators/pu/rodauth/migration/sequel/lockout.erb +0 -11
  79. data/lib/generators/pu/rodauth/migration/sequel/otp.erb +0 -7
  80. data/lib/generators/pu/rodauth/migration/sequel/password_expiration.erb +0 -5
  81. data/lib/generators/pu/rodauth/migration/sequel/recovery_codes.erb +0 -6
  82. data/lib/generators/pu/rodauth/migration/sequel/remember.erb +0 -6
  83. data/lib/generators/pu/rodauth/migration/sequel/reset_password.erb +0 -7
  84. data/lib/generators/pu/rodauth/migration/sequel/separate_passwords.erb +0 -6
  85. data/lib/generators/pu/rodauth/migration/sequel/single_session.erb +0 -5
  86. data/lib/generators/pu/rodauth/migration/sequel/sms_codes.erb +0 -8
  87. data/lib/generators/pu/rodauth/migration/sequel/verify_account.erb +0 -7
  88. data/lib/generators/pu/rodauth/migration/sequel/verify_login_change.erb +0 -7
  89. data/lib/generators/pu/rodauth/migration/sequel/webauthn.erb +0 -13
@@ -0,0 +1,335 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ plutonium (0.12.13)
5
+ active_interaction (~> 5.3)
6
+ dry-initializer (~> 3.1)
7
+ listen (~> 3.8)
8
+ pagy (~> 7.0)
9
+ pundit (~> 2.3)
10
+ rabl (~> 0.16.1)
11
+ rails (>= 7.1, < 8.0)
12
+ semantic_range (~> 3.0)
13
+ simple_form (~> 5.3)
14
+ tty-prompt (~> 0.23.1)
15
+ view_component (~> 3)
16
+ view_component-form (~> 0.2.6)
17
+ zeitwerk
18
+
19
+ GEM
20
+ remote: https://rubygems.org/
21
+ specs:
22
+ actioncable (7.1.3.4)
23
+ actionpack (= 7.1.3.4)
24
+ activesupport (= 7.1.3.4)
25
+ nio4r (~> 2.0)
26
+ websocket-driver (>= 0.6.1)
27
+ zeitwerk (~> 2.6)
28
+ actionmailbox (7.1.3.4)
29
+ actionpack (= 7.1.3.4)
30
+ activejob (= 7.1.3.4)
31
+ activerecord (= 7.1.3.4)
32
+ activestorage (= 7.1.3.4)
33
+ activesupport (= 7.1.3.4)
34
+ mail (>= 2.7.1)
35
+ net-imap
36
+ net-pop
37
+ net-smtp
38
+ actionmailer (7.1.3.4)
39
+ actionpack (= 7.1.3.4)
40
+ actionview (= 7.1.3.4)
41
+ activejob (= 7.1.3.4)
42
+ activesupport (= 7.1.3.4)
43
+ mail (~> 2.5, >= 2.5.4)
44
+ net-imap
45
+ net-pop
46
+ net-smtp
47
+ rails-dom-testing (~> 2.2)
48
+ actionpack (7.1.3.4)
49
+ actionview (= 7.1.3.4)
50
+ activesupport (= 7.1.3.4)
51
+ nokogiri (>= 1.8.5)
52
+ racc
53
+ rack (>= 2.2.4)
54
+ rack-session (>= 1.0.1)
55
+ rack-test (>= 0.6.3)
56
+ rails-dom-testing (~> 2.2)
57
+ rails-html-sanitizer (~> 1.6)
58
+ actiontext (7.1.3.4)
59
+ actionpack (= 7.1.3.4)
60
+ activerecord (= 7.1.3.4)
61
+ activestorage (= 7.1.3.4)
62
+ activesupport (= 7.1.3.4)
63
+ globalid (>= 0.6.0)
64
+ nokogiri (>= 1.8.5)
65
+ actionview (7.1.3.4)
66
+ activesupport (= 7.1.3.4)
67
+ builder (~> 3.1)
68
+ erubi (~> 1.11)
69
+ rails-dom-testing (~> 2.2)
70
+ rails-html-sanitizer (~> 1.6)
71
+ active_interaction (5.3.0)
72
+ activemodel (>= 5.2, < 8)
73
+ activesupport (>= 5.2, < 8)
74
+ activejob (7.1.3.4)
75
+ activesupport (= 7.1.3.4)
76
+ globalid (>= 0.3.6)
77
+ activemodel (7.1.3.4)
78
+ activesupport (= 7.1.3.4)
79
+ activerecord (7.1.3.4)
80
+ activemodel (= 7.1.3.4)
81
+ activesupport (= 7.1.3.4)
82
+ timeout (>= 0.4.0)
83
+ activestorage (7.1.3.4)
84
+ actionpack (= 7.1.3.4)
85
+ activejob (= 7.1.3.4)
86
+ activerecord (= 7.1.3.4)
87
+ activesupport (= 7.1.3.4)
88
+ marcel (~> 1.0)
89
+ activesupport (7.1.3.4)
90
+ base64
91
+ bigdecimal
92
+ concurrent-ruby (~> 1.0, >= 1.0.2)
93
+ connection_pool (>= 2.2.5)
94
+ drb
95
+ i18n (>= 1.6, < 2)
96
+ minitest (>= 5.1)
97
+ mutex_m
98
+ tzinfo (~> 2.0)
99
+ ansi (1.5.0)
100
+ appraisal (2.5.0)
101
+ bundler
102
+ rake
103
+ thor (>= 0.14.0)
104
+ ast (2.4.2)
105
+ base64 (0.2.0)
106
+ bigdecimal (3.1.8)
107
+ brakeman (6.1.2)
108
+ racc
109
+ builder (3.3.0)
110
+ bundle-audit (0.1.0)
111
+ bundler-audit
112
+ bundler-audit (0.9.1)
113
+ bundler (>= 1.2.0, < 3)
114
+ thor (~> 1.0)
115
+ combustion (1.4.0)
116
+ activesupport (>= 3.0.0)
117
+ railties (>= 3.0.0)
118
+ thor (>= 0.14.6)
119
+ concurrent-ruby (1.3.3)
120
+ connection_pool (2.4.1)
121
+ crass (1.0.6)
122
+ date (3.3.4)
123
+ drb (2.2.1)
124
+ dry-initializer (3.1.1)
125
+ erubi (1.12.0)
126
+ ffi (1.17.0-x86_64-darwin)
127
+ globalid (1.2.1)
128
+ activesupport (>= 6.1)
129
+ i18n (1.14.5)
130
+ concurrent-ruby (~> 1.0)
131
+ importmap-rails (2.0.1)
132
+ actionpack (>= 6.0.0)
133
+ activesupport (>= 6.0.0)
134
+ railties (>= 6.0.0)
135
+ io-console (0.7.2)
136
+ irb (1.13.1)
137
+ rdoc (>= 4.0.0)
138
+ reline (>= 0.4.2)
139
+ json (2.7.2)
140
+ language_server-protocol (3.17.0.3)
141
+ lint_roller (1.1.0)
142
+ listen (3.9.0)
143
+ rb-fsevent (~> 0.10, >= 0.10.3)
144
+ rb-inotify (~> 0.9, >= 0.9.10)
145
+ loofah (2.22.0)
146
+ crass (~> 1.0.2)
147
+ nokogiri (>= 1.12.0)
148
+ mail (2.8.1)
149
+ mini_mime (>= 0.1.1)
150
+ net-imap
151
+ net-pop
152
+ net-smtp
153
+ marcel (1.0.4)
154
+ method_source (1.1.0)
155
+ mini_mime (1.1.5)
156
+ minitest (5.23.1)
157
+ minitest-reporters (1.6.1)
158
+ ansi
159
+ builder
160
+ minitest (>= 5.0)
161
+ ruby-progressbar
162
+ mutex_m (0.2.0)
163
+ net-imap (0.4.12)
164
+ date
165
+ net-protocol
166
+ net-pop (0.1.2)
167
+ net-protocol
168
+ net-protocol (0.2.2)
169
+ timeout
170
+ net-smtp (0.5.0)
171
+ net-protocol
172
+ nio4r (2.7.3)
173
+ nokogiri (1.16.5-x86_64-darwin)
174
+ racc (~> 1.4)
175
+ pagy (7.0.11)
176
+ parallel (1.25.1)
177
+ parser (3.3.2.0)
178
+ ast (~> 2.4.1)
179
+ racc
180
+ pastel (0.8.0)
181
+ tty-color (~> 0.5)
182
+ psych (5.1.2)
183
+ stringio
184
+ puma (6.4.2)
185
+ nio4r (~> 2.0)
186
+ pundit (2.3.2)
187
+ activesupport (>= 3.0.0)
188
+ rabl (0.16.1)
189
+ activesupport (>= 2.3.14)
190
+ racc (1.8.0)
191
+ rack (3.1.3)
192
+ rack-session (2.0.0)
193
+ rack (>= 3.0.0)
194
+ rack-test (2.1.0)
195
+ rack (>= 1.3)
196
+ rackup (2.1.0)
197
+ rack (>= 3)
198
+ webrick (~> 1.8)
199
+ rails (7.1.3.4)
200
+ actioncable (= 7.1.3.4)
201
+ actionmailbox (= 7.1.3.4)
202
+ actionmailer (= 7.1.3.4)
203
+ actionpack (= 7.1.3.4)
204
+ actiontext (= 7.1.3.4)
205
+ actionview (= 7.1.3.4)
206
+ activejob (= 7.1.3.4)
207
+ activemodel (= 7.1.3.4)
208
+ activerecord (= 7.1.3.4)
209
+ activestorage (= 7.1.3.4)
210
+ activesupport (= 7.1.3.4)
211
+ bundler (>= 1.15.0)
212
+ railties (= 7.1.3.4)
213
+ rails-dom-testing (2.2.0)
214
+ activesupport (>= 5.0.0)
215
+ minitest
216
+ nokogiri (>= 1.6)
217
+ rails-html-sanitizer (1.6.0)
218
+ loofah (~> 2.21)
219
+ nokogiri (~> 1.14)
220
+ railties (7.1.3.4)
221
+ actionpack (= 7.1.3.4)
222
+ activesupport (= 7.1.3.4)
223
+ irb
224
+ rackup (>= 1.0.0)
225
+ rake (>= 12.2)
226
+ thor (~> 1.0, >= 1.2.2)
227
+ zeitwerk (~> 2.6)
228
+ rainbow (3.1.1)
229
+ rake (13.2.1)
230
+ rb-fsevent (0.11.2)
231
+ rb-inotify (0.11.1)
232
+ ffi (~> 1.0)
233
+ rdoc (6.7.0)
234
+ psych (>= 4.0.0)
235
+ regexp_parser (2.9.2)
236
+ reline (0.5.9)
237
+ io-console (~> 0.5)
238
+ rexml (3.3.0)
239
+ strscan
240
+ rubocop (1.63.5)
241
+ json (~> 2.3)
242
+ language_server-protocol (>= 3.17.0)
243
+ parallel (~> 1.10)
244
+ parser (>= 3.3.0.2)
245
+ rainbow (>= 2.2.2, < 4.0)
246
+ regexp_parser (>= 1.8, < 3.0)
247
+ rexml (>= 3.2.5, < 4.0)
248
+ rubocop-ast (>= 1.31.1, < 2.0)
249
+ ruby-progressbar (~> 1.7)
250
+ unicode-display_width (>= 2.4.0, < 3.0)
251
+ rubocop-ast (1.31.3)
252
+ parser (>= 3.3.1.0)
253
+ rubocop-performance (1.21.0)
254
+ rubocop (>= 1.48.1, < 2.0)
255
+ rubocop-ast (>= 1.31.1, < 2.0)
256
+ ruby-progressbar (1.13.0)
257
+ semantic_range (3.0.0)
258
+ simple_form (5.3.1)
259
+ actionpack (>= 5.2)
260
+ activemodel (>= 5.2)
261
+ sqlite3 (1.7.3-x86_64-darwin)
262
+ standard (1.36.0)
263
+ language_server-protocol (~> 3.17.0.2)
264
+ lint_roller (~> 1.0)
265
+ rubocop (~> 1.63.0)
266
+ standard-custom (~> 1.0.0)
267
+ standard-performance (~> 1.4)
268
+ standard-custom (1.0.2)
269
+ lint_roller (~> 1.0)
270
+ rubocop (~> 1.50)
271
+ standard-performance (1.4.0)
272
+ lint_roller (~> 1.1)
273
+ rubocop-performance (~> 1.21.0)
274
+ stimulus-rails (1.3.3)
275
+ railties (>= 6.0.0)
276
+ stringio (3.1.0)
277
+ strscan (3.1.0)
278
+ thor (1.3.1)
279
+ timeout (0.4.1)
280
+ tty-color (0.6.0)
281
+ tty-cursor (0.7.1)
282
+ tty-prompt (0.23.1)
283
+ pastel (~> 0.8)
284
+ tty-reader (~> 0.8)
285
+ tty-reader (0.9.0)
286
+ tty-cursor (~> 0.7)
287
+ tty-screen (~> 0.8)
288
+ wisper (~> 2.0)
289
+ tty-screen (0.8.2)
290
+ turbo-rails (2.0.5)
291
+ actionpack (>= 6.0.0)
292
+ activejob (>= 6.0.0)
293
+ railties (>= 6.0.0)
294
+ tzinfo (2.0.6)
295
+ concurrent-ruby (~> 1.0)
296
+ unicode-display_width (2.5.0)
297
+ view_component (3.12.1)
298
+ activesupport (>= 5.2.0, < 8.0)
299
+ concurrent-ruby (~> 1.0)
300
+ method_source (~> 1.0)
301
+ view_component-form (0.2.6)
302
+ actionview (>= 6.0.0, < 7.2)
303
+ activesupport (>= 6.0.0, < 7.2)
304
+ view_component (>= 2.34.0, < 4.0)
305
+ zeitwerk (~> 2.5)
306
+ webrick (1.8.1)
307
+ websocket-driver (0.7.6)
308
+ websocket-extensions (>= 0.1.0)
309
+ websocket-extensions (0.1.5)
310
+ wisper (2.0.1)
311
+ zeitwerk (2.6.15)
312
+
313
+ PLATFORMS
314
+ x86_64-darwin
315
+
316
+ DEPENDENCIES
317
+ appraisal
318
+ brakeman
319
+ bundle-audit
320
+ combustion
321
+ importmap-rails
322
+ minitest
323
+ minitest-reporters
324
+ plutonium!
325
+ puma (>= 5.0)
326
+ rails (~> 7.1.3, >= 7.1.3.4)
327
+ rake
328
+ sqlite3 (~> 1.4)
329
+ standard
330
+ stimulus-rails
331
+ turbo-rails
332
+ tzinfo-data
333
+
334
+ BUNDLED WITH
335
+ 2.5.6
@@ -61,11 +61,6 @@ module Pu
61
61
 
62
62
  private
63
63
 
64
- def sequel_activerecord_integration?
65
- defined?(ActiveRecord::Railtie) &&
66
- (!defined?(Sequel) || Sequel::DATABASES.empty?)
67
- end
68
-
69
64
  def sequel_adapter
70
65
  SEQUEL_ADAPTERS[activerecord_adapter] || activerecord_adapter
71
66
  end
@@ -11,6 +11,6 @@ create_table :<%= table_prefix %>_authentication_audit_logs<%= primary_key_type
11
11
  <% else -%>
12
12
  t.string :metadata
13
13
  <% end -%>
14
- t.index [:<%= table_prefix %>_id, :at], name: "audit_<%= table_prefix %>_at_idx"
15
- t.index :at, name: "audit_at_idx"
14
+ t.index [:<%= table_prefix %>_id, :at], name: "audit_<%= table_prefix %>_<%= table_prefix %>_id_at_idx"
15
+ t.index :at, name: "audit_<%= table_prefix %>_at_idx"
16
16
  end
@@ -11,9 +11,12 @@ require "#{__dir__}/concerns/account_selector"
11
11
  module Pu
12
12
  module Rodauth
13
13
  class MigrationGenerator < ::Rails::Generators::Base
14
+ include ::ActiveRecord::Generators::Migration
14
15
  include Concerns::Configuration
15
16
  include Concerns::AccountSelector
16
17
 
18
+ MIGRATION_DIR = "#{__dir__}/migration/active_record"
19
+
17
20
  source_root "#{__dir__}/templates"
18
21
 
19
22
  desc "Generate migrations for supported features\n\n" \
@@ -124,63 +127,39 @@ module Pu
124
127
  Dir["#{MIGRATION_DIR}/*.erb"].map { |filename| File.basename(filename, ".erb").to_sym }
125
128
  end
126
129
 
127
- if defined?(::ActiveRecord::Railtie) # Active Record
128
- include ::ActiveRecord::Generators::Migration
129
-
130
- MIGRATION_DIR = "#{__dir__}/migration/active_record"
131
-
132
- def activerecord_adapter
133
- if ActiveRecord::Base.respond_to?(:connection_db_config)
134
- ActiveRecord::Base.connection_db_config.adapter
135
- else
136
- ActiveRecord::Base.connection_config.fetch(:adapter)
137
- end
130
+ def activerecord_adapter
131
+ if ActiveRecord::Base.respond_to?(:connection_db_config)
132
+ ActiveRecord::Base.connection_db_config.adapter
133
+ else
134
+ ActiveRecord::Base.connection_config.fetch(:adapter)
138
135
  end
136
+ end
139
137
 
140
- def primary_key_type(key = :id)
141
- generators = ::Rails.application.config.generators
142
- column_type = generators.options[:active_record][:primary_key_type]
143
- if key
144
- ", #{key}: :#{column_type}" if column_type
145
- else
146
- column_type || default_primary_key_type
147
- end
148
- end
149
-
150
- def default_primary_key_type
151
- if ActiveRecord.version >= Gem::Version.new("5.1")
152
- :bigint
153
- else
154
- :integer
155
- end
156
- end
157
-
158
- # Active Record 7+ sets default precision to 6 for timestamp columns,
159
- # so we need to ensure we match this when setting the default value.
160
- def current_timestamp
161
- if ActiveRecord.version >= Gem::Version.new("7.0") && ["mysql2", "trilogy"].include?(activerecord_adapter) && ActiveRecord::Base.connection.supports_datetime_with_precision?
162
- "CURRENT_TIMESTAMP(6)"
163
- else
164
- "CURRENT_TIMESTAMP"
165
- end
166
- end
167
- else # Sequel
168
- include ::Rails::Generators::Migration
169
-
170
- MIGRATION_DIR = "#{__dir__}/migration/sequel"
171
-
172
- def self.next_migration_number(dirname)
173
- next_migration_number = current_migration_number(dirname) + 1
174
- [Time.now.utc.strftime("%Y%m%d%H%M%S"), format("%.14d", next_migration_number)].max
138
+ def primary_key_type(key = :id)
139
+ generators = ::Rails.application.config.generators
140
+ column_type = generators.options[:active_record][:primary_key_type]
141
+ if key
142
+ ", #{key}: :#{column_type}" if column_type
143
+ else
144
+ column_type || default_primary_key_type
175
145
  end
146
+ end
176
147
 
177
- def db_migrate_path
178
- "db/migrate"
148
+ def default_primary_key_type
149
+ if ActiveRecord.version >= Gem::Version.new("5.1")
150
+ :bigint
151
+ else
152
+ :integer
179
153
  end
154
+ end
180
155
 
181
- def db
182
- db = ::Sequel::DATABASES.first if defined?(::Sequel)
183
- db or fail Rodauth::Rails::Error, "missing Sequel database connection"
156
+ # Active Record 7+ sets default precision to 6 for timestamp columns,
157
+ # so we need to ensure we match this when setting the default value.
158
+ def current_timestamp
159
+ if ActiveRecord.version >= Gem::Version.new("7.0") && ["mysql2", "trilogy"].include?(activerecord_adapter) && ActiveRecord::Base.connection.supports_datetime_with_precision?
160
+ "CURRENT_TIMESTAMP(6)"
161
+ else
162
+ "CURRENT_TIMESTAMP"
184
163
  end
185
164
  end
186
165
  end
@@ -55,6 +55,7 @@ class RodauthMailer < ApplicationMailer
55
55
 
56
56
  def rodauth(name, account_id, &block)
57
57
  instance = RodauthApp.rodauth(name).allocate
58
+ instance.url_options = default_url_options
58
59
  instance.instance_eval { @account = account_ds(account_id).first! }
59
60
  instance.instance_eval(&block) if block
60
61
  instance
@@ -1,4 +1,3 @@
1
- <% if defined?(ActiveRecord::Railtie) -%>
2
1
  class <%= account_path.classify %> < ResourceRecord
3
2
  include Rodauth::Rails.model<%= "(:#{table_prefix})" unless primary? %>
4
3
  # add concerns above.
@@ -30,10 +29,3 @@ class <%= account_path.classify %> < ResourceRecord
30
29
 
31
30
  # add methods above.
32
31
  end
33
- <% else -%>
34
- class <%= table_prefix.camelize %> < Sequel::Model
35
- include Rodauth::Rails.model
36
- plugin :enum
37
- enum :status, unverified: 1, verified: 2, closed: 3
38
- end
39
- <% end -%>
@@ -1,6 +1,8 @@
1
1
  require "sequel/core"
2
2
 
3
3
  class RodauthPlugin < Rodauth::Rails::Auth
4
+ attr_accessor :url_options
5
+
4
6
  configure do
5
7
  # ==> Features
6
8
  # See the Rodauth documentation for the list of available config options:
@@ -14,7 +16,6 @@ class RodauthPlugin < Rodauth::Rails::Auth
14
16
 
15
17
  # ==> General
16
18
 
17
- <% if sequel_activerecord_integration? -%>
18
19
  # Initialize Sequel and have it reuse Active Record's database connection.
19
20
  <% if RUBY_ENGINE == "jruby" -%>
20
21
  db Sequel.connect("jdbc:<%= sequel_adapter %>://", extensions: :activerecord_connection, keep_reference: false)
@@ -26,7 +27,6 @@ class RodauthPlugin < Rodauth::Rails::Auth
26
27
  # https://github.com/janko/rodauth-rails/issues/244
27
28
  convert_token_id_to_integer? true
28
29
 
29
- <% end -%>
30
30
  # Change prefix of table and foreign key column names from default "account"
31
31
  # accounts_table :users
32
32
  # verify_account_table :user_verification_keys
@@ -228,4 +228,10 @@ class RodauthPlugin < Rodauth::Rails::Auth
228
228
  # Does not work with only_json?
229
229
  # remember_deadline_interval Hash[days: 30]
230
230
  end
231
+
232
+ private
233
+
234
+ def rails_url_options
235
+ url_options || super
236
+ end
231
237
  end
@@ -1,13 +1,5 @@
1
- <% if defined?(::ActiveRecord::Railtie) -%>
2
1
  class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
3
2
  def change
4
3
  <%= migration_content -%>
5
4
  end
6
5
  end
7
- <% else -%>
8
- Sequel.migration do
9
- change do
10
- <%= migration_content -%>
11
- end
12
- end
13
- <% end -%>
@@ -14,7 +14,9 @@ module Plutonium
14
14
  private
15
15
 
16
16
  def rodauth(name = :#{name})
17
- super(name)
17
+ instance = super(name)
18
+ instance.url_options = default_url_options.presence
19
+ instance
18
20
  end
19
21
 
20
22
  def current_user
@@ -35,18 +35,18 @@ module Plutonium
35
35
  end
36
36
 
37
37
  #
38
- # Returns a dynamic list of args to be used with `url_for` which considers the route namespace and nesting.
39
- # The current entity and parent record (for nested routes) are inserted appropriately, ensuring that generated urls
38
+ # Returns a dynamic list of args to be used with `url_for`, which considers the route namespace and nesting.
39
+ # The current entity and parent record (for nested routes) are inserted appropriately, ensuring that generated URLs
40
40
  # obey the current routing.
41
41
  #
42
- # e.g. of route helpers that will be invoked given the output of this method
42
+ # e.g., of route helpers that will be invoked given the output of this method
43
43
  #
44
44
  # - when invoked in a root route (/acme/dashboard/users)
45
45
  #
46
46
  # `resource_url_args_for User` => `entity_users_*`
47
47
  # `resource_url_args_for @user` => `entity_user_*`
48
48
  # `resource_url_args_for @user, action: :edit` => `edit_entity_user_*`
49
- # `resource_url_args_for @user, Post => `entity_user_posts_*`
49
+ # `resource_url_args_for @user, Post` => `entity_user_posts_*`
50
50
  #
51
51
  # - when invoked in a nested route (/acme/dashboard/users/1/post/1)
52
52
  #
@@ -55,26 +55,36 @@ module Plutonium
55
55
  # `resource_url_args_for @post, action: :edit` => `edit_entity_user_post_*`
56
56
  #
57
57
  # @param [Class, ApplicationRecord] *args arguments you would normally pass to `url_for`
58
- # @param [Symbol] action optional action to invoke e.g. :new, :edit
58
+ # @param [Symbol] action optional action to invoke, e.g., :new, :edit
59
+ # @param [ApplicationRecord] parent the parent record for nested routes, if any
60
+ # @param [Hash] kwargs additional keyword arguments to pass to `url_for`
59
61
  #
60
- # @return [Array[Class, ApplicationRecord, Symbol]] args to pass to `url_for`
62
+ # @return [Hash] args to pass to `url_for`
61
63
  #
62
64
  def resource_url_args_for(*args, action: nil, parent: nil, **kwargs)
63
- # If the last item is a class and the action is :new e.g. `resource_url User, action: :new`,
64
- # it must be converted into a symbol to generate the appropriate helper i.e `new_user_*`
65
- # to match the url helper generated by `resources :users`
66
- resource = args.pop
67
- resource = resource.model_name.singular_route_key.to_sym if action == :new && resource.is_a?(Class)
68
- args.push resource
69
-
70
- base_args = if scoped_to_entity? && scoped_entity_strategy == :path
71
- [action, current_scoped_entity.becomes(scoped_entity_class), parent]
72
- else
73
- [action, parent]
65
+ url_args = {**kwargs, action: action}.compact
66
+
67
+ controller_chain = [current_package.to_s]
68
+ [parent, *args].compact.each_with_index do |element, index|
69
+ if element.is_a?(Class)
70
+ controller_chain << element.to_s.pluralize
71
+ else
72
+ controller_chain << element.class.to_s.pluralize
73
+ if index == args.length - 1
74
+ url_args[:id] = element.to_param
75
+ url_args[:action] ||= :show
76
+ else
77
+ url_args[element.model_name.singular_route_key.to_sym] = element.to_param
78
+ end
79
+ end
80
+ end
81
+ url_args[:controller] = "/#{controller_chain.join("::").underscore}"
82
+
83
+ if scoped_to_entity? && scoped_entity_strategy == :path
84
+ url_args[scoped_entity_param_key] = current_scoped_entity
74
85
  end
75
86
 
76
- # rails compacts this list. no need to handle nils
77
- base_args + args + [**kwargs]
87
+ url_args
78
88
  end
79
89
 
80
90
  def resource_url_for(...)
@@ -6,7 +6,7 @@ module Plutonium
6
6
  private
7
7
 
8
8
  def input_options
9
- {wrapper: :resource_multi_select}
9
+ {wrapper: :resource_multi_select, include_blank: true}
10
10
  end
11
11
  end
12
12
  end
@@ -47,10 +47,12 @@ module Plutonium
47
47
 
48
48
  def display_association_value(association)
49
49
  display_name = display_name_of(association)
50
- link_to display_name, resource_url_for(association, parent: nil),
51
- class: "font-medium text-primary-600 dark:text-primary-500"
52
- rescue NoMethodError
53
- display_name
50
+ if registered_resources.include?(association.class)
51
+ link_to display_name, resource_url_for(association, parent: nil),
52
+ class: "font-medium text-primary-600 dark:text-primary-500"
53
+ else
54
+ display_name
55
+ end
54
56
  end
55
57
 
56
58
  def display_numeric_value(value)