kern 0.5.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 (84) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +22 -0
  3. data/Gemfile.lock +423 -0
  4. data/README.md +178 -0
  5. data/Rakefile +31 -0
  6. data/app/assets/builds/tailwind.css +2 -0
  7. data/app/controllers/concerns/authentication.rb +55 -0
  8. data/app/controllers/concerns/authentication.rb.tt +55 -0
  9. data/app/controllers/kern/application_controller.rb +7 -0
  10. data/app/controllers/kern/pages_controller.rb +6 -0
  11. data/app/controllers/kern/passwords_controller.rb +40 -0
  12. data/app/controllers/kern/sessions_controller.rb +30 -0
  13. data/app/controllers/kern/settings/users_controller.rb +26 -0
  14. data/app/controllers/kern/settings_controller.rb +6 -0
  15. data/app/controllers/kern/signups_controller.rb +31 -0
  16. data/app/controllers/kern/signups_controller.rb.tt +31 -0
  17. data/app/helpers/kern/component_helper.rb +15 -0
  18. data/app/helpers/kern/turbo_stream_actions_helper.rb +10 -0
  19. data/app/mailers/kern/application_mailer.rb +6 -0
  20. data/app/mailers/kern/passwords_mailer.rb +9 -0
  21. data/app/models/actor.rb +4 -0
  22. data/app/models/application_form.rb +12 -0
  23. data/app/models/current.rb +8 -0
  24. data/app/models/member/acting.rb +28 -0
  25. data/app/models/member/setup.rb +37 -0
  26. data/app/models/member.rb +10 -0
  27. data/app/models/role.rb +5 -0
  28. data/app/models/session.rb +5 -0
  29. data/app/models/signup.rb +38 -0
  30. data/app/models/user/workspace_member.rb +12 -0
  31. data/app/models/user.rb +14 -0
  32. data/app/models/workspace/members.rb +10 -0
  33. data/app/models/workspace/setup.rb +21 -0
  34. data/app/models/workspace.rb +7 -0
  35. data/app/views/components/_container.html.erb +2 -0
  36. data/app/views/components/_flash.html.erb +7 -0
  37. data/app/views/components/_heading.html.erb +12 -0
  38. data/app/views/components/flash/_message.html.erb +4 -0
  39. data/app/views/kern/pages/welcome.html.erb +42 -0
  40. data/app/views/kern/passwords/edit.html.erb +12 -0
  41. data/app/views/kern/passwords/new.html.erb +10 -0
  42. data/app/views/kern/passwords_mailer/reset.html.erb +6 -0
  43. data/app/views/kern/passwords_mailer/reset.html.erb.tt +6 -0
  44. data/app/views/kern/passwords_mailer/reset.text.erb +4 -0
  45. data/app/views/kern/passwords_mailer/reset.text.erb.tt +4 -0
  46. data/app/views/kern/sessions/new.html.erb +16 -0
  47. data/app/views/kern/settings/_cards.html.erb +10 -0
  48. data/app/views/kern/settings/show.html.erb +5 -0
  49. data/app/views/kern/settings/users/show.html.erb +15 -0
  50. data/app/views/kern/signups/new.html.erb +16 -0
  51. data/app/views/layouts/kern/application/_navigation.html.erb +30 -0
  52. data/app/views/layouts/kern/application.html.erb +31 -0
  53. data/app/views/layouts/kern/application.html.erb.tt +31 -0
  54. data/app/views/layouts/kern/auth.html.erb +42 -0
  55. data/bin/dev +4 -0
  56. data/bin/rails +14 -0
  57. data/bin/release +35 -0
  58. data/config/routes.rb +13 -0
  59. data/db/migrate/20250101000001_create_users.rb +13 -0
  60. data/db/migrate/20250101000002_create_sessions.rb +11 -0
  61. data/db/migrate/20250101000003_create_workspaces.rb +12 -0
  62. data/db/migrate/20250101000004_create_members.rb +15 -0
  63. data/db/migrate/20250101000005_create_roles.rb +11 -0
  64. data/db/migrate/20250101000006_create_actors.rb +10 -0
  65. data/kern.gemspec +22 -0
  66. data/lib/generators/kern/feature/USAGE +17 -0
  67. data/lib/generators/kern/feature/feature_generator.rb +77 -0
  68. data/lib/generators/kern/helpers.rb +28 -0
  69. data/lib/generators/kern/install/USAGE +13 -0
  70. data/lib/generators/kern/install/install_generator.rb +48 -0
  71. data/lib/generators/kern/install/templates/configurations/README.md +33 -0
  72. data/lib/generators/kern/install/templates/configurations/urls.yml +9 -0
  73. data/lib/generators/kern/views/USAGE +22 -0
  74. data/lib/generators/kern/views/views_generator.rb +42 -0
  75. data/lib/kern/config.rb +25 -0
  76. data/lib/kern/engine.rb +17 -0
  77. data/lib/kern/form_builder/input.rb +100 -0
  78. data/lib/kern/form_builder/styles.rb +53 -0
  79. data/lib/kern/form_builder.rb +101 -0
  80. data/lib/kern/version.rb +3 -0
  81. data/lib/kern.rb +7 -0
  82. data/lib/sluggable.rb +66 -0
  83. data/lib/tasks/kern_tasks.rake +4 -0
  84. metadata +139 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 51b072139e6f1ddd51d9f6ed4d54b6b86766cbebe5c47ba442bdf3e6b7dc4682
4
+ data.tar.gz: faa1c2937aff2ae45731f0f519d010a216215c5b1d1f61786aa53205872cb286
5
+ SHA512:
6
+ metadata.gz: 0d3ebbe105034fd6f4fcedfeda2df9e5a177ffdc9e358a996a3bf28cff52b9a70506cee37bbc6a90749029e6d84102c2f9e9fbb4d3fb6c10be6cce56cba5596f
7
+ data.tar.gz: 768a29e1c27f2d72caff3700ebd14dea167be3b4bc534b9a74a980180d8f04fe1ac99578e1fc80fa959e84e3cda49e5defd8b7c77995fa2d1d0b6418ebe05b60
data/Gemfile ADDED
@@ -0,0 +1,22 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in kern.gemspec.
4
+ gemspec
5
+
6
+ gem "rails", "~> 8.1.0"
7
+ gem "bcrypt"
8
+ gem "propshaft"
9
+ gem "puma"
10
+ gem "sqlite3"
11
+ gem "tailwindcss-rails"
12
+ gem "turbo-rails"
13
+
14
+ group :development do
15
+ gem "standard", "~> 1.50.0"
16
+ end
17
+
18
+ group :development, :test do
19
+ gem "rake", "~> 13.3.0"
20
+ gem "minitest", "~> 5.25", ">= 5.25.5"
21
+ gem "debug", "~> 1.11.0"
22
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,423 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ kern (0.5.0)
5
+ rails (>= 8.0.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ action_text-trix (2.1.15)
11
+ railties
12
+ actioncable (8.1.1)
13
+ actionpack (= 8.1.1)
14
+ activesupport (= 8.1.1)
15
+ nio4r (~> 2.0)
16
+ websocket-driver (>= 0.6.1)
17
+ zeitwerk (~> 2.6)
18
+ actionmailbox (8.1.1)
19
+ actionpack (= 8.1.1)
20
+ activejob (= 8.1.1)
21
+ activerecord (= 8.1.1)
22
+ activestorage (= 8.1.1)
23
+ activesupport (= 8.1.1)
24
+ mail (>= 2.8.0)
25
+ actionmailer (8.1.1)
26
+ actionpack (= 8.1.1)
27
+ actionview (= 8.1.1)
28
+ activejob (= 8.1.1)
29
+ activesupport (= 8.1.1)
30
+ mail (>= 2.8.0)
31
+ rails-dom-testing (~> 2.2)
32
+ actionpack (8.1.1)
33
+ actionview (= 8.1.1)
34
+ activesupport (= 8.1.1)
35
+ nokogiri (>= 1.8.5)
36
+ rack (>= 2.2.4)
37
+ rack-session (>= 1.0.1)
38
+ rack-test (>= 0.6.3)
39
+ rails-dom-testing (~> 2.2)
40
+ rails-html-sanitizer (~> 1.6)
41
+ useragent (~> 0.16)
42
+ actiontext (8.1.1)
43
+ action_text-trix (~> 2.1.15)
44
+ actionpack (= 8.1.1)
45
+ activerecord (= 8.1.1)
46
+ activestorage (= 8.1.1)
47
+ activesupport (= 8.1.1)
48
+ globalid (>= 0.6.0)
49
+ nokogiri (>= 1.8.5)
50
+ actionview (8.1.1)
51
+ activesupport (= 8.1.1)
52
+ builder (~> 3.1)
53
+ erubi (~> 1.11)
54
+ rails-dom-testing (~> 2.2)
55
+ rails-html-sanitizer (~> 1.6)
56
+ activejob (8.1.1)
57
+ activesupport (= 8.1.1)
58
+ globalid (>= 0.3.6)
59
+ activemodel (8.1.1)
60
+ activesupport (= 8.1.1)
61
+ activerecord (8.1.1)
62
+ activemodel (= 8.1.1)
63
+ activesupport (= 8.1.1)
64
+ timeout (>= 0.4.0)
65
+ activestorage (8.1.1)
66
+ actionpack (= 8.1.1)
67
+ activejob (= 8.1.1)
68
+ activerecord (= 8.1.1)
69
+ activesupport (= 8.1.1)
70
+ marcel (~> 1.0)
71
+ activesupport (8.1.1)
72
+ base64
73
+ bigdecimal
74
+ concurrent-ruby (~> 1.0, >= 1.3.1)
75
+ connection_pool (>= 2.2.5)
76
+ drb
77
+ i18n (>= 1.6, < 2)
78
+ json
79
+ logger (>= 1.4.2)
80
+ minitest (>= 5.1)
81
+ securerandom (>= 0.3)
82
+ tzinfo (~> 2.0, >= 2.0.5)
83
+ uri (>= 0.13.1)
84
+ ast (2.4.3)
85
+ base64 (0.3.0)
86
+ bcrypt (3.1.20)
87
+ bigdecimal (3.3.1)
88
+ builder (3.3.0)
89
+ concurrent-ruby (1.3.5)
90
+ connection_pool (3.0.2)
91
+ crass (1.0.6)
92
+ date (3.5.1)
93
+ debug (1.11.0)
94
+ irb (~> 1.10)
95
+ reline (>= 0.3.8)
96
+ drb (2.2.3)
97
+ erb (6.0.0)
98
+ erubi (1.13.1)
99
+ globalid (1.3.0)
100
+ activesupport (>= 6.1)
101
+ i18n (1.14.7)
102
+ concurrent-ruby (~> 1.0)
103
+ io-console (0.8.1)
104
+ irb (1.15.3)
105
+ pp (>= 0.6.0)
106
+ rdoc (>= 4.0.0)
107
+ reline (>= 0.4.2)
108
+ json (2.17.1)
109
+ language_server-protocol (3.17.0.5)
110
+ lint_roller (1.1.0)
111
+ logger (1.7.0)
112
+ loofah (2.24.1)
113
+ crass (~> 1.0.2)
114
+ nokogiri (>= 1.12.0)
115
+ mail (2.9.0)
116
+ logger
117
+ mini_mime (>= 0.1.1)
118
+ net-imap
119
+ net-pop
120
+ net-smtp
121
+ marcel (1.1.0)
122
+ mini_mime (1.1.5)
123
+ minitest (5.26.2)
124
+ net-imap (0.5.12)
125
+ date
126
+ net-protocol
127
+ net-pop (0.1.2)
128
+ net-protocol
129
+ net-protocol (0.2.2)
130
+ timeout
131
+ net-smtp (0.5.1)
132
+ net-protocol
133
+ nio4r (2.7.5)
134
+ nokogiri (1.18.10-aarch64-linux-gnu)
135
+ racc (~> 1.4)
136
+ nokogiri (1.18.10-aarch64-linux-musl)
137
+ racc (~> 1.4)
138
+ nokogiri (1.18.10-arm-linux-gnu)
139
+ racc (~> 1.4)
140
+ nokogiri (1.18.10-arm-linux-musl)
141
+ racc (~> 1.4)
142
+ nokogiri (1.18.10-arm64-darwin)
143
+ racc (~> 1.4)
144
+ nokogiri (1.18.10-x86_64-darwin)
145
+ racc (~> 1.4)
146
+ nokogiri (1.18.10-x86_64-linux-gnu)
147
+ racc (~> 1.4)
148
+ nokogiri (1.18.10-x86_64-linux-musl)
149
+ racc (~> 1.4)
150
+ parallel (1.27.0)
151
+ parser (3.3.10.0)
152
+ ast (~> 2.4.1)
153
+ racc
154
+ pp (0.6.3)
155
+ prettyprint
156
+ prettyprint (0.2.0)
157
+ prism (1.6.0)
158
+ propshaft (1.3.1)
159
+ actionpack (>= 7.0.0)
160
+ activesupport (>= 7.0.0)
161
+ rack
162
+ psych (5.3.0)
163
+ date
164
+ stringio
165
+ puma (7.1.0)
166
+ nio4r (~> 2.0)
167
+ racc (1.8.1)
168
+ rack (3.2.4)
169
+ rack-session (2.1.1)
170
+ base64 (>= 0.1.0)
171
+ rack (>= 3.0.0)
172
+ rack-test (2.2.0)
173
+ rack (>= 1.3)
174
+ rackup (2.3.1)
175
+ rack (>= 3)
176
+ rails (8.1.1)
177
+ actioncable (= 8.1.1)
178
+ actionmailbox (= 8.1.1)
179
+ actionmailer (= 8.1.1)
180
+ actionpack (= 8.1.1)
181
+ actiontext (= 8.1.1)
182
+ actionview (= 8.1.1)
183
+ activejob (= 8.1.1)
184
+ activemodel (= 8.1.1)
185
+ activerecord (= 8.1.1)
186
+ activestorage (= 8.1.1)
187
+ activesupport (= 8.1.1)
188
+ bundler (>= 1.15.0)
189
+ railties (= 8.1.1)
190
+ rails-dom-testing (2.3.0)
191
+ activesupport (>= 5.0.0)
192
+ minitest
193
+ nokogiri (>= 1.6)
194
+ rails-html-sanitizer (1.6.2)
195
+ loofah (~> 2.21)
196
+ nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
197
+ railties (8.1.1)
198
+ actionpack (= 8.1.1)
199
+ activesupport (= 8.1.1)
200
+ irb (~> 1.13)
201
+ rackup (>= 1.0.0)
202
+ rake (>= 12.2)
203
+ thor (~> 1.0, >= 1.2.2)
204
+ tsort (>= 0.2)
205
+ zeitwerk (~> 2.6)
206
+ rainbow (3.1.1)
207
+ rake (13.3.1)
208
+ rdoc (6.17.0)
209
+ erb
210
+ psych (>= 4.0.0)
211
+ tsort
212
+ regexp_parser (2.11.3)
213
+ reline (0.6.3)
214
+ io-console (~> 0.5)
215
+ rubocop (1.75.8)
216
+ json (~> 2.3)
217
+ language_server-protocol (~> 3.17.0.2)
218
+ lint_roller (~> 1.1.0)
219
+ parallel (~> 1.10)
220
+ parser (>= 3.3.0.2)
221
+ rainbow (>= 2.2.2, < 4.0)
222
+ regexp_parser (>= 2.9.3, < 3.0)
223
+ rubocop-ast (>= 1.44.0, < 2.0)
224
+ ruby-progressbar (~> 1.7)
225
+ unicode-display_width (>= 2.4.0, < 4.0)
226
+ rubocop-ast (1.48.0)
227
+ parser (>= 3.3.7.2)
228
+ prism (~> 1.4)
229
+ rubocop-performance (1.26.1)
230
+ lint_roller (~> 1.1)
231
+ rubocop (>= 1.75.0, < 2.0)
232
+ rubocop-ast (>= 1.47.1, < 2.0)
233
+ ruby-progressbar (1.13.0)
234
+ securerandom (0.4.1)
235
+ sqlite3 (2.8.1-aarch64-linux-gnu)
236
+ sqlite3 (2.8.1-aarch64-linux-musl)
237
+ sqlite3 (2.8.1-arm-linux-gnu)
238
+ sqlite3 (2.8.1-arm-linux-musl)
239
+ sqlite3 (2.8.1-arm64-darwin)
240
+ sqlite3 (2.8.1-x86_64-darwin)
241
+ sqlite3 (2.8.1-x86_64-linux-gnu)
242
+ sqlite3 (2.8.1-x86_64-linux-musl)
243
+ standard (1.50.0)
244
+ language_server-protocol (~> 3.17.0.2)
245
+ lint_roller (~> 1.0)
246
+ rubocop (~> 1.75.5)
247
+ standard-custom (~> 1.0.0)
248
+ standard-performance (~> 1.8)
249
+ standard-custom (1.0.2)
250
+ lint_roller (~> 1.0)
251
+ rubocop (~> 1.50)
252
+ standard-performance (1.9.0)
253
+ lint_roller (~> 1.1)
254
+ rubocop-performance (~> 1.26.0)
255
+ stringio (3.1.9)
256
+ tailwindcss-rails (4.4.0)
257
+ railties (>= 7.0.0)
258
+ tailwindcss-ruby (~> 4.0)
259
+ tailwindcss-ruby (4.1.16)
260
+ tailwindcss-ruby (4.1.16-aarch64-linux-gnu)
261
+ tailwindcss-ruby (4.1.16-aarch64-linux-musl)
262
+ tailwindcss-ruby (4.1.16-arm64-darwin)
263
+ tailwindcss-ruby (4.1.16-x86_64-darwin)
264
+ tailwindcss-ruby (4.1.16-x86_64-linux-gnu)
265
+ tailwindcss-ruby (4.1.16-x86_64-linux-musl)
266
+ thor (1.4.0)
267
+ timeout (0.5.0)
268
+ tsort (0.2.0)
269
+ turbo-rails (2.0.20)
270
+ actionpack (>= 7.1.0)
271
+ railties (>= 7.1.0)
272
+ tzinfo (2.0.6)
273
+ concurrent-ruby (~> 1.0)
274
+ unicode-display_width (3.2.0)
275
+ unicode-emoji (~> 4.1)
276
+ unicode-emoji (4.1.0)
277
+ uri (1.1.1)
278
+ useragent (0.16.11)
279
+ websocket-driver (0.8.0)
280
+ base64
281
+ websocket-extensions (>= 0.1.0)
282
+ websocket-extensions (0.1.5)
283
+ zeitwerk (2.7.3)
284
+
285
+ PLATFORMS
286
+ aarch64-linux-gnu
287
+ aarch64-linux-musl
288
+ arm-linux-gnu
289
+ arm-linux-musl
290
+ arm64-darwin
291
+ x86_64-darwin
292
+ x86_64-linux-gnu
293
+ x86_64-linux-musl
294
+
295
+ DEPENDENCIES
296
+ bcrypt
297
+ debug (~> 1.11.0)
298
+ kern!
299
+ minitest (~> 5.25, >= 5.25.5)
300
+ propshaft
301
+ puma
302
+ rails (~> 8.1.0)
303
+ rake (~> 13.3.0)
304
+ sqlite3
305
+ standard (~> 1.50.0)
306
+ tailwindcss-rails
307
+ turbo-rails
308
+
309
+ CHECKSUMS
310
+ action_text-trix (2.1.15) sha256=4bf9bbd8fa95954de3f0022dae0d927bce22c1bb31d5dc9c3766f8c145c109c1
311
+ actioncable (8.1.1) sha256=7262307e9693f09b299e281590110ce4b6ba7e4e4cee6da4b9d987eaf56f9139
312
+ actionmailbox (8.1.1) sha256=aa99703a9b2fa32c5a4a93bb21fef79e2935d8db4d1fd5ef0772847be5d43205
313
+ actionmailer (8.1.1) sha256=45755d7d4561363490ae82b17a5919bdef4dfe3bb400831819947c3a1d82afdf
314
+ actionpack (8.1.1) sha256=192e27c39a63c7d801ac7b6d50505f265e389516985eed9b2ee364896a6a06d7
315
+ actiontext (8.1.1) sha256=fd8d8da1e6bc0b04ff72fccfd127e78431238a99a82e736c7b52727c576a7640
316
+ actionview (8.1.1) sha256=ca480c8b099dea0862b0934f24182b84c2d29092e7dbf464fb3e6d4eb9b468dc
317
+ activejob (8.1.1) sha256=94f438a9f3b5a6b130fef53d8313f869dbd379309e7d639891bda36b12509383
318
+ activemodel (8.1.1) sha256=8b7e2496b9e333ced06248c16a43217b950192c98e0fe3aa117eee21501c6fbd
319
+ activerecord (8.1.1) sha256=e32c3a03e364fd803498eb4150c21bedc995aa83bc27122a94d480ab1dcb3d17
320
+ activestorage (8.1.1) sha256=bc01d8b4c55e309a0a2e218bfe502c382c9f232e28b1f4b0adc9d8719d2bf28d
321
+ activesupport (8.1.1) sha256=5e92534e8d0c8b8b5e6b16789c69dbea65c1d7b752269f71a39422e9546cea67
322
+ ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
323
+ base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
324
+ bcrypt (3.1.20) sha256=8410f8c7b3ed54a3c00cd2456bf13917d695117f033218e2483b2e40b0784099
325
+ bigdecimal (3.3.1) sha256=eaa01e228be54c4f9f53bf3cc34fe3d5e845c31963e7fcc5bedb05a4e7d52218
326
+ builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f
327
+ concurrent-ruby (1.3.5) sha256=813b3e37aca6df2a21a3b9f1d497f8cbab24a2b94cab325bffe65ee0f6cbebc6
328
+ connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
329
+ crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d
330
+ date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
331
+ debug (1.11.0) sha256=1425db64cfa0130c952684e3dc974985be201dd62899bf4bbe3f8b5d6cf1aef2
332
+ drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
333
+ erb (6.0.0) sha256=2730893f9d8c9733f16cab315a4e4b71c1afa9cabc1a1e7ad1403feba8f52579
334
+ erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9
335
+ globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11
336
+ i18n (1.14.7) sha256=ceba573f8138ff2c0915427f1fc5bdf4aa3ab8ae88c8ce255eb3ecf0a11a5d0f
337
+ io-console (0.8.1) sha256=1e15440a6b2f67b6ea496df7c474ed62c860ad11237f29b3bd187f054b925fcb
338
+ irb (1.15.3) sha256=4349edff1efa7ff7bfd34cb9df74a133a588ba88c2718098b3b4468b81184aaa
339
+ json (2.17.1) sha256=e0e4824541336a44915436f53e7ea74c687314fb8f88080fa1456f6a34ead92e
340
+ kern (0.5.0)
341
+ language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
342
+ lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
343
+ logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
344
+ loofah (2.24.1) sha256=655a30842b70ec476410b347ab1cd2a5b92da46a19044357bbd9f401b009a337
345
+ mail (2.9.0) sha256=6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941
346
+ marcel (1.1.0) sha256=fdcfcfa33cc52e93c4308d40e4090a5d4ea279e160a7f6af988260fa970e0bee
347
+ mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
348
+ minitest (5.26.2) sha256=f021118a6185b9ba9f5af71f2ba103ad770c75afde9f2ab8da512677c550cde3
349
+ net-imap (0.5.12) sha256=cb8cd05bd353fcc19b6cbc530a9cb06b577a969ea10b7ddb0f37787f74be4444
350
+ net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3
351
+ net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8
352
+ net-smtp (0.5.1) sha256=ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736
353
+ nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1
354
+ nokogiri (1.18.10-aarch64-linux-gnu) sha256=7fb87235d729c74a2be635376d82b1d459230cc17c50300f8e4fcaabc6195344
355
+ nokogiri (1.18.10-aarch64-linux-musl) sha256=7e74e58314297cc8a8f1b533f7212d1999dbe2639a9ee6d97b483ea2acc18944
356
+ nokogiri (1.18.10-arm-linux-gnu) sha256=51f4f25ab5d5ba1012d6b16aad96b840a10b067b93f35af6a55a2c104a7ee322
357
+ nokogiri (1.18.10-arm-linux-musl) sha256=1c6ea754e51cecc85c30ee8ab1e6aa4ce6b6e134d01717e9290e79374a9e00aa
358
+ nokogiri (1.18.10-arm64-darwin) sha256=c2b0de30770f50b92c9323fa34a4e1cf5a0af322afcacd239cd66ee1c1b22c85
359
+ nokogiri (1.18.10-x86_64-darwin) sha256=536e74bed6db2b5076769cab5e5f5af0cd1dccbbd75f1b3e1fa69d1f5c2d79e2
360
+ nokogiri (1.18.10-x86_64-linux-gnu) sha256=ff5ba26ba2dbce5c04b9ea200777fd225061d7a3930548806f31db907e500f72
361
+ nokogiri (1.18.10-x86_64-linux-musl) sha256=0651fccf8c2ebbc2475c8b1dfd7ccac3a0a6d09f8a41b72db8c21808cb483385
362
+ parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130
363
+ parser (3.3.10.0) sha256=ce3587fa5cc55a88c4ba5b2b37621b3329aadf5728f9eafa36bbd121462aabd6
364
+ pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6
365
+ prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
366
+ prism (1.6.0) sha256=bfc0281a81718c4872346bc858dc84abd3a60cae78336c65ad35c8fbff641c6b
367
+ propshaft (1.3.1) sha256=9acc664ef67e819ffa3d95bd7ad4c3623ea799110c5f4dee67fa7e583e74c392
368
+ psych (5.3.0) sha256=8976a41ae29ea38c88356e862629345290347e3bfe27caf654f7c5a920e95eeb
369
+ puma (7.1.0) sha256=e45c10cb124f224d448c98db653a75499794edbecadc440ad616cf50f2fd49dd
370
+ racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
371
+ rack (3.2.4) sha256=5d74b6f75082a643f43c1e76b419c40f0e5527fcfee1e669ac1e6b73c0ccb6f6
372
+ rack-session (2.1.1) sha256=0b6dc07dea7e4b583f58a48e8b806d4c9f1c6c9214ebc202ec94562cbea2e4e9
373
+ rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463
374
+ rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868
375
+ rails (8.1.1) sha256=877509b7aef309239978685883097d2c03e21383a50a3f78882cf9b3b5c136f7
376
+ rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d
377
+ rails-html-sanitizer (1.6.2) sha256=35fce2ca8242da8775c83b6ba9c1bcaad6751d9eb73c1abaa8403475ab89a560
378
+ railties (8.1.1) sha256=fb0c7038b147bea41bf6697fa443ff1c5c47d3bb1eedd9ecf1bceeb90efcb868
379
+ rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
380
+ rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c
381
+ rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7
382
+ regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4
383
+ reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
384
+ rubocop (1.75.8) sha256=c80ab4286c5dcfc49d7ad1787cdba5569b63b58c96ee7afde4ec47a9c8a85be9
385
+ rubocop-ast (1.48.0) sha256=22df9bbf3f7a6eccde0fad54e68547ae1e2a704bf8719e7c83813a99c05d2e76
386
+ rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
387
+ ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
388
+ securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
389
+ sqlite3 (2.8.1-aarch64-linux-gnu) sha256=9bce166d3e3595a42fc92c28d986ea11d499b55be8bd1cd491be04af30029543
390
+ sqlite3 (2.8.1-aarch64-linux-musl) sha256=34912f6acf3e9c43c7998c6f99ba3146708e654cf9716b2983e260315cdeed72
391
+ sqlite3 (2.8.1-arm-linux-gnu) sha256=9118d6abb5ca7ea4f1b50a6c42c763e612670f5eb673bbdf12e8d3bd63339bde
392
+ sqlite3 (2.8.1-arm-linux-musl) sha256=48a50815521f812713310190589a8ae196fa48b70b62b72f5766bafebae77e33
393
+ sqlite3 (2.8.1-arm64-darwin) sha256=3cb617640577ec9c1b7c09744d1e368ad3d3851c2494540f5f007387da943477
394
+ sqlite3 (2.8.1-x86_64-darwin) sha256=0028f5dd0b7a1ee6f1dadf31fc632abf7d815cb0baa0606549634fa45578f92e
395
+ sqlite3 (2.8.1-x86_64-linux-gnu) sha256=878f4a0c5c2c4d9d4345afe2a142a87805f388a24aa8a3c2dfe2f964d7686b7a
396
+ sqlite3 (2.8.1-x86_64-linux-musl) sha256=0c191ddfd71437b439e107a0d148630bef29a1eebd7b28bcc931470c328f657d
397
+ standard (1.50.0) sha256=b6c67f61fd6cedeec90ee338c6e913d9ccc4c467660ad1575da8aa6ba10f4aec
398
+ standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
399
+ standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
400
+ stringio (3.1.9) sha256=c111af13d3a73eab96a3bc2655ecf93788d13d28cb8e25c1dcbff89ace885121
401
+ tailwindcss-rails (4.4.0) sha256=efa2961351a52acebe616e645a81a30bb4f27fde46cc06ce7688d1cd1131e916
402
+ tailwindcss-ruby (4.1.16) sha256=d30e4713152bb89ebe1fddb5b5f9b31d7755bf5576453e601eb58b19174c48c0
403
+ tailwindcss-ruby (4.1.16-aarch64-linux-gnu) sha256=916554206b47b4218ba9130ee369687a6546fba0224b7168f118e4f955b2f97e
404
+ tailwindcss-ruby (4.1.16-aarch64-linux-musl) sha256=ba4e58bfc5e74a8ab1052becb4de8448ff9d432c477486d647100da47e1871c6
405
+ tailwindcss-ruby (4.1.16-arm64-darwin) sha256=fc26566f31ef5b8a891ec3e52405b008d83ab950a84a46b52c8438e3ad2d6507
406
+ tailwindcss-ruby (4.1.16-x86_64-darwin) sha256=ddabf7513cad1245d111f98ec394b2a376ad0aa7bc358fb37aa1dd1e7eb204fb
407
+ tailwindcss-ruby (4.1.16-x86_64-linux-gnu) sha256=4d7948dbab71afd9d51ed1be77cf99cd47768ab3ddc4701623e8c6b861363941
408
+ tailwindcss-ruby (4.1.16-x86_64-linux-musl) sha256=1f00ac1da0077473a3790e1359709406a9b2b3740e7571a86c64312e9d85b42e
409
+ thor (1.4.0) sha256=8763e822ccb0f1d7bee88cde131b19a65606657b847cc7b7b4b82e772bcd8a3d
410
+ timeout (0.5.0) sha256=852aefd13f41d84c2d0d83099b275034c6517395884b58e635acc8847c9190cb
411
+ tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
412
+ turbo-rails (2.0.20) sha256=cbcbb4dd3ce59f6471c9f911b1655b2c721998cc8303959d982da347f374ea95
413
+ tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
414
+ unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
415
+ unicode-emoji (4.1.0) sha256=4997d2d5df1ed4252f4830a9b6e86f932e2013fbff2182a9ce9ccabda4f325a5
416
+ uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
417
+ useragent (0.16.11) sha256=700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844
418
+ websocket-driver (0.8.0) sha256=ed0dba4b943c22f17f9a734817e808bc84cdce6a7e22045f5315aa57676d4962
419
+ websocket-extensions (0.1.5) sha256=1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241
420
+ zeitwerk (2.7.3) sha256=b2e86b4a9b57d26ba68a15230dcc7fe6f040f06831ce64417b0621ad96ba3e85
421
+
422
+ BUNDLED WITH
423
+ 4.0.1
data/README.md ADDED
@@ -0,0 +1,178 @@
1
+ # Kern
2
+
3
+ Rails engine that handles the SaaS foundation: authentication, team invitations, subscription/billing, and common partials. Skip the boilerplate and start shipping the actual product. Launch faster.
4
+
5
+
6
+ <table>
7
+ <tr>
8
+ <td>
9
+ <a href="https://raw.githubusercontent.com/Rails-Designer/kern/HEAD/.github/kern__auth.jpg" target="_blank">
10
+ <img src="https://raw.githubusercontent.com/Rails-Designer/kern/HEAD/.github/kern__auth.jpg" alt="Authentication" width="400">
11
+ </a>
12
+ </td>
13
+ <td>
14
+ <a href="https://raw.githubusercontent.com/Rails-Designer/kern/HEAD/.github/kern__dashboard.jpg" target="_blank">
15
+ <img src="https://raw.githubusercontent.com/Rails-Designer/kern/HEAD/.github/kern__dashboard.jpg" alt="Dashboard" width="400">
16
+ </a>
17
+ </td>
18
+ </tr>
19
+ </table>
20
+
21
+ <a href="https://railsdesigner.com/" target="_blank">
22
+ <picture>
23
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/Rails-Designer/kern/HEAD/.github/logo-dark.svg">
24
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/Rails-Designer/kern/HEAD/.github/logo-light.svg">
25
+ <img alt="Rails Designer" src="https://raw.githubusercontent.com/Rails-Designer/kern/HEAD/.github/logo-light.svg" width="240" style="max-width: 100%;">
26
+ </picture>
27
+ </a>
28
+
29
+
30
+
31
+ **Sponsored By [Rails Designer](https://railsdesigner.com/)**
32
+
33
+
34
+ > **kern** (Dutch/German, noun) — core, nucleus, foundation. The essential element at the center of something; the foundational part upon which everything else is built.
35
+
36
+
37
+ ## Quickstart
38
+
39
+ ```bash
40
+ bundle add kern
41
+ rails generate kern:install
42
+ rails db:migrate
43
+ ```
44
+
45
+
46
+ ## Installation
47
+
48
+ Add Kern to your Gemfile:
49
+ ```bash
50
+ bundle add kern
51
+ ```
52
+
53
+ Run the install generator:
54
+ ```bash
55
+ rails generate kern:install
56
+ ```
57
+
58
+ Run migrations:
59
+ ```bash
60
+ rails db:migrate
61
+ ```
62
+
63
+ Set your root route in `config/routes.rb`:
64
+ ```ruby
65
+ root "dashboard#show"
66
+ ```
67
+
68
+ ## Usage
69
+
70
+ Kern works out of the box after installation. All features are available immediately.
71
+
72
+
73
+ ### Generators
74
+
75
+ If you want to customize any available view or feature, you can run:
76
+
77
+ - `bin/rails generate kern:views`;
78
+ - `bin/rails generate kern:feature`.
79
+
80
+ Append `--help` to see the generator's help.
81
+
82
+
83
+ ## Included
84
+
85
+ Kern has all the foundational features for a SaaS built-in, so you can skip the boilerplate and ship your actual product.
86
+
87
+ > [!NOTE]
88
+ > Not all features listed below are part of Kern just yet.
89
+
90
+
91
+ ### Authentication
92
+
93
+ Built on Rails' authentication generator.
94
+
95
+
96
+ ### Sign up
97
+
98
+ Create an account for your app using email address and password.
99
+
100
+
101
+ ### User settings
102
+
103
+ Update user's email and password.
104
+
105
+
106
+ ### Multi-tenancy
107
+
108
+ By default a `Workspace` record is created upon sign up. Each user is associated to it using a `Member` join table. Next to that: each `Member` can have multiple `Role`'s you can use to determine if they are authorized.
109
+
110
+
111
+ ### Billing & subscriptions using Stripe
112
+
113
+ Following [Rails Designer's Stripe Billing set up](https://railsdesigner.com/saas/billing-with-stripe/), offer subscriptions right away.
114
+
115
+
116
+ ### Team invitations
117
+
118
+ Add more users to your `Workspace`, update roles or remove them again.
119
+
120
+
121
+ ### Form Builder
122
+
123
+ Pulled from [Rails Designer's Components](https://railsdesigner.com/components/), the included Form Builder lets you quicly build beautiful forms. Including a magic `input` helper that works like this:
124
+
125
+ ```erb
126
+ <%= form_with url: session_path do |form| %>
127
+ <%= form.input :email_address, required: true %>
128
+
129
+ <%= form.input :password, required: true %>
130
+ <% end %>
131
+ ```
132
+
133
+
134
+ ### Component Helper
135
+
136
+ Some basic components are included like:
137
+
138
+ - container; keep all your app's content in check
139
+ - heading; have consistent headings for each screen
140
+ - enhanced dialog element (works with Turbo Frames and can be shown as a `modal` or a `slider`)
141
+ - flash messages (notifiy your users from the bottom-right)
142
+
143
+ These are built using vanilla Rails, as [described in this article]() (`component` helper included).
144
+
145
+
146
+ ### Application/dashboard layout
147
+
148
+ A clean, minimal (application) layout is included with a (collapsible sidebar to the left)
149
+
150
+
151
+ ### Turbo Stream `notify` helper
152
+
153
+ When using Turbo Stream responses, use `turbo_stream.notify "Updated"` to notifiy user on a successful request.
154
+
155
+
156
+ ## Rails Icons support
157
+
158
+ The application/dashboard layout and the Form Builder have support for [Rails Icons](https://github.com/Rails-Desiger/rails_icons).
159
+
160
+
161
+ ### Sluggable concern
162
+
163
+ If you do not want to expose the record's primary key, use the `Sluggable` concern. Include it in the model, make sure it has a (unique) `slug` column, and look up records now using `ModelName.sluggable.find(params[:id])`.
164
+
165
+
166
+ ### Configuration
167
+
168
+ Little syntactic sugar on top of Rails' `config_for` as explained [in this article](https://railsdesigner.com/saas/configuration/). Keep configuration together in, e.g. `config/configuration/urls.yml` and call each value like `Config::Urls.docs`.^
169
+
170
+
171
+ ## Contributing
172
+
173
+ This project uses [Standard](https://github.com/testdouble/standard) for formatting Ruby code. Minitest for testing. Please run `rake` before submitting pull requests.
174
+
175
+
176
+ ## License
177
+
178
+ Kern is released under the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "minitest/test_task"
4
+ require "standard/rake"
5
+
6
+ Minitest::TestTask.create
7
+
8
+ require "bundler/setup"
9
+
10
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
11
+ load "rails/tasks/engine.rake"
12
+
13
+ require "bundler/gem_tasks"
14
+
15
+ namespace :assets do
16
+ desc "Build Tailwind CSS for distribution"
17
+ task :precompile do
18
+ Dir.chdir("test/dummy") do
19
+ sh "bin/rails tailwindcss:build"
20
+
21
+ FileUtils.mkdir_p "../../app/assets/builds"
22
+ FileUtils.cp(
23
+ "app/assets/builds/tailwind.css",
24
+ "../../app/assets/builds/tailwind.css"
25
+ )
26
+ end
27
+ end
28
+ end
29
+
30
+ task default: %i[test standard]
31
+ task build: "assets:precompile"