role_fu 0.4.0 → 0.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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/CHANGELOG.md +27 -0
- data/README.md +92 -0
- data/gemfiles/rails_7.2.gemfile.lock +116 -123
- data/gemfiles/rails_8.0.gemfile.lock +180 -187
- data/gemfiles/rails_8.1.gemfile.lock +182 -189
- data/lib/generators/role_fu/templates/abilities_migration.rb.erb +3 -2
- data/lib/generators/role_fu/templates/upgrade_permissions_field_migration.rb.erb +8 -0
- data/lib/generators/role_fu/upgrade_generator.rb +83 -0
- data/lib/role_fu/ability.rb +39 -4
- data/lib/role_fu/adapters/cancancan.rb +13 -4
- data/lib/role_fu/authorizable.rb +45 -0
- data/lib/role_fu/role.rb +8 -0
- data/lib/role_fu/roleable.rb +5 -5
- data/lib/role_fu/version.rb +1 -1
- data/lib/role_fu.rb +15 -2
- data/mise.toml +14 -0
- metadata +19 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8895d1ec974d84a207c9a1ef584910237b328442cb76f78d84a382b640527e43
|
|
4
|
+
data.tar.gz: da9cf4d703ecc9eef0e92bf2c883dc6cdacd49cd96e8c898289980465f96b445
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 84626ecc3ac908297ad8dd95649126b851d990975ea74fb86fc73b8fe0f38af1c72630232393ce418720b722a3e695a64b55b9c05874c8d0e4b1010235d8770c
|
|
7
|
+
data.tar.gz: 4cd9382ad8db4b60fda9ebdc256cfe44f15662e07392c0b27170acb744c3947705acb58b985bf8811f816b9e5f111f470f17988680bf297219da78cb1a530126
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
4.0.6
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,30 @@
|
|
|
1
|
+
## [0.6.0] - 2026-09-22
|
|
2
|
+
|
|
3
|
+
### Added
|
|
4
|
+
|
|
5
|
+
- **Field-level Abilities**: `role_fu_can?(action, field:)` and `role_fu_permitted_fields(action)` allow scoping a `Permission` to a single attribute (e.g. `reports.update` + `field: "status"`). A permission granted without a `field` remains a wildcard for that action, so existing action-only permissions are unaffected. The `permissions` table gains an optional `field` column (nullable — existing installs keep working without it).
|
|
6
|
+
- **CanCanCan Adapter**: field-scoped permissions now translate into CanCanCan's own native attribute restriction (`can :update, Report, :status`) instead of role_fu re-implementing attribute-level authorization.
|
|
7
|
+
- **Role Name Normalization**: role names are now canonicalized (`"Admin"`, `"admin"`, `"Admin User"`, `"admin-user"` all resolve to the same role) to prevent case/formatting duplicates. Does not singularize.
|
|
8
|
+
- **`RoleFu::Authorizable`**: a minimal, framework-agnostic guard concern (`role_fu_authorize!`, `role_fu_can!`, raising `RoleFu::AccessDenied`) for apps that want a guard clause without adding a full authorization gem. Deliberately not an `allow`/`deny` DSL — see README for the Pundit/CanCanCan adapters when you need real rule resolution.
|
|
9
|
+
- **`role_fu:upgrade` generator**: run after bumping the gem to catch up on optional schema/data changes. Inspects your actual schema/data instead of tracking "which version you were on" (nothing persists that reliably), so it's safe to run regardless of how many releases you skipped and safe to re-run. Currently detects the missing `permissions.field` column (generates the migration) and denormalized role names (reports only — never auto-merges, since two differently-cased roles may already coexist with their own assignments).
|
|
10
|
+
- **Post-install banner**: `gem install`/`bundle install` now print a reminder to run `rails generate role_fu:upgrade` after upgrading.
|
|
11
|
+
|
|
12
|
+
### BREAKING CHANGES
|
|
13
|
+
|
|
14
|
+
- **Role name normalization** changes the stored `name` for newly created/looked-up roles (e.g. `"Admin"` -> `"admin"`). Existing rows with mixed-case names are **not** migrated automatically — run `rails generate role_fu:upgrade` after upgrading; it will detect and report them so you can decide how to merge duplicates before backfilling.
|
|
15
|
+
|
|
16
|
+
## [0.5.0] - 2026-07-15
|
|
17
|
+
|
|
18
|
+
### BREAKING CHANGES
|
|
19
|
+
|
|
20
|
+
- **Drop Ruby 3.2 support**: Minimum required Ruby version is now 3.3+
|
|
21
|
+
- Updated `required_ruby_version` from `>= 3.2.0` to `>= 3.3.0`
|
|
22
|
+
- Removed Ruby 3.2 from CI test matrix
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- **Dependencies**: Updated development and test dependencies (Rails 8.1.3, concurrent-ruby 1.3.7, and security patches for activesupport, erb, and json).
|
|
27
|
+
|
|
1
28
|
## [0.4.0] - 2026-02-08
|
|
2
29
|
|
|
3
30
|
### Added
|
data/README.md
CHANGED
|
@@ -99,6 +99,16 @@ user.has_role?(:manager, :any) # => true
|
|
|
99
99
|
user.only_has_role?(:manager, org) # => true if this is their only role
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
+
> **Role names are normalized** (`"Admin"`, `"admin"`, `"Admin User"` and
|
|
103
|
+
> `"admin-user"` all resolve to the same role) so casing/formatting mistakes
|
|
104
|
+
> don't silently create duplicate roles. Normalization does **not**
|
|
105
|
+
> singularize — `"sales"` stays `"sales"` — since blindly singularizing
|
|
106
|
+
> arbitrary business terms tends to mangle them. **Upgrading?** Existing rows
|
|
107
|
+
> with mixed-case names aren't rewritten automatically —
|
|
108
|
+
> `rails generate role_fu:upgrade` will detect and warn about them (it won't
|
|
109
|
+
> backfill on its own: two differently-cased roles may already coexist and
|
|
110
|
+
> need a human to decide how to merge them).
|
|
111
|
+
|
|
102
112
|
#### Scopes (Finders)
|
|
103
113
|
|
|
104
114
|
```ruby
|
|
@@ -185,6 +195,36 @@ manager_role.permissions.create(action: "posts.edit")
|
|
|
185
195
|
user.role_fu_can?("posts.edit") # => true
|
|
186
196
|
```
|
|
187
197
|
|
|
198
|
+
**Field-level granularity:**
|
|
199
|
+
|
|
200
|
+
Permissions can optionally be scoped to a single attribute. A permission granted
|
|
201
|
+
*without* a `field` is a wildcard that satisfies any field-scoped check for that
|
|
202
|
+
same action — so existing `action`-only permissions keep working unchanged.
|
|
203
|
+
|
|
204
|
+
```ruby
|
|
205
|
+
support_role.permissions.create(action: "reports.update", field: "status")
|
|
206
|
+
|
|
207
|
+
user.role_fu_can?("reports.update") # => true (can do *something* here)
|
|
208
|
+
user.role_fu_can?("reports.update", field: :status) # => true
|
|
209
|
+
user.role_fu_can?("reports.update", field: :amount) # => false
|
|
210
|
+
|
|
211
|
+
# Build a form / strong params allowlist dynamically:
|
|
212
|
+
user.role_fu_permitted_fields("reports.update")
|
|
213
|
+
# => ["status"] if scoped to specific fields
|
|
214
|
+
# => :all if granted without a field restriction
|
|
215
|
+
# => [] if the action isn't granted at all
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
> **Upgrading an existing `permissions` table?** Run `rails generate role_fu:upgrade`
|
|
219
|
+
> — it inspects your current schema/config and generates only the migrations
|
|
220
|
+
> you're actually missing (here: adding `field` to `permissions`). Safe to
|
|
221
|
+
> re-run any time, regardless of which version you're upgrading from. Without
|
|
222
|
+
> the column, RoleFu transparently falls back to action-only checks.
|
|
223
|
+
|
|
224
|
+
The **CanCanCan adapter** translates field-scoped permissions into CanCanCan's
|
|
225
|
+
own native attribute restriction (`can :update, Report, :status`) instead of
|
|
226
|
+
role_fu re-implementing attribute-level authorization itself.
|
|
227
|
+
|
|
188
228
|
---
|
|
189
229
|
|
|
190
230
|
### Adapters (Pundit & CanCanCan)
|
|
@@ -212,6 +252,40 @@ end
|
|
|
212
252
|
|
|
213
253
|
_`PostPolicy#update?` will automatically check `user.role_fu_can?('posts.update')`._
|
|
214
254
|
|
|
255
|
+
#### Lightweight Guard (no authorization gem)
|
|
256
|
+
|
|
257
|
+
If you don't want to add Pundit or CanCanCan as a dependency just to raise on
|
|
258
|
+
a missing role, `RoleFu::Authorizable` gives you two guard-clause helpers
|
|
259
|
+
built on top of `has_role?` / `role_fu_can?`. **It is intentionally not an
|
|
260
|
+
`allow`/`deny` DSL or a rule-resolution engine** — for anything beyond "raise
|
|
261
|
+
unless this check passes" (policy objects, scopes, composable rules), use the
|
|
262
|
+
Pundit or CanCanCan adapters instead.
|
|
263
|
+
|
|
264
|
+
```ruby
|
|
265
|
+
class ApplicationController < ActionController::Base
|
|
266
|
+
include RoleFu::Authorizable
|
|
267
|
+
|
|
268
|
+
rescue_from RoleFu::AccessDenied, with: :render_forbidden
|
|
269
|
+
|
|
270
|
+
private
|
|
271
|
+
|
|
272
|
+
def render_forbidden
|
|
273
|
+
head :forbidden
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
class PostsController < ApplicationController
|
|
278
|
+
def destroy
|
|
279
|
+
role_fu_authorize!(:admin) # raises RoleFu::AccessDenied unless current_user.has_role?(:admin)
|
|
280
|
+
role_fu_can!("posts.destroy") # raises RoleFu::AccessDenied unless current_user.role_fu_can?("posts.destroy")
|
|
281
|
+
# ...
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
Resolves the acting user via `current_user` by default; override
|
|
287
|
+
`role_fu_current_user` for jobs/service objects that don't have one.
|
|
288
|
+
|
|
215
289
|
---
|
|
216
290
|
|
|
217
291
|
### Performance (N+1 Prevention)
|
|
@@ -315,6 +389,24 @@ User.in_group(:admin) # Alias for with_group/with_role
|
|
|
315
389
|
User.not_in_group(:admin) # Alias for without_group/without_role
|
|
316
390
|
```
|
|
317
391
|
|
|
392
|
+
## Upgrading RoleFu
|
|
393
|
+
|
|
394
|
+
After bumping the gem version, run:
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
rails generate role_fu:upgrade
|
|
398
|
+
rails db:migrate
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
It inspects your actual schema/config (not "which version you were on" —
|
|
402
|
+
nothing persists that reliably) and generates only what's missing, so it's
|
|
403
|
+
safe to run regardless of how many releases you skipped, and safe to re-run.
|
|
404
|
+
Currently checks for: the `field` column on `permissions` (see
|
|
405
|
+
[Field-level granularity](#4-role-abilities-permissions)), and role names
|
|
406
|
+
that don't match RoleFu's [normalized format](#roleable-user-model) (reported
|
|
407
|
+
only — never auto-merged, since two differently-cased roles may already
|
|
408
|
+
coexist).
|
|
409
|
+
|
|
318
410
|
## Migrating from Rolify
|
|
319
411
|
|
|
320
412
|
1. **Code Changes**: Replace `rolify` with `include RoleFu::Roleable` and `resourcify` with `include RoleFu::Resourceable`.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: ..
|
|
3
3
|
specs:
|
|
4
|
-
role_fu (0.
|
|
4
|
+
role_fu (0.6.0)
|
|
5
5
|
activerecord (>= 7.2)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
@@ -87,47 +87,47 @@ GEM
|
|
|
87
87
|
ast (2.4.3)
|
|
88
88
|
base64 (0.3.0)
|
|
89
89
|
benchmark (0.5.0)
|
|
90
|
-
bigdecimal (4.
|
|
90
|
+
bigdecimal (4.1.2)
|
|
91
91
|
builder (3.3.0)
|
|
92
|
-
cgi (0.5.
|
|
93
|
-
concurrent-ruby (1.3.
|
|
92
|
+
cgi (0.5.2)
|
|
93
|
+
concurrent-ruby (1.3.7)
|
|
94
94
|
connection_pool (3.0.2)
|
|
95
|
-
crass (1.0.
|
|
95
|
+
crass (1.0.7)
|
|
96
96
|
date (3.5.1)
|
|
97
97
|
diff-lcs (1.6.2)
|
|
98
|
-
docile (1.4.1)
|
|
99
98
|
drb (2.2.3)
|
|
100
|
-
erb (6.0.
|
|
99
|
+
erb (6.0.4)
|
|
101
100
|
erubi (1.13.1)
|
|
102
|
-
globalid (1.
|
|
101
|
+
globalid (1.4.0)
|
|
103
102
|
activesupport (>= 6.1)
|
|
104
|
-
i18n (1.
|
|
103
|
+
i18n (1.15.2)
|
|
105
104
|
concurrent-ruby (~> 1.0)
|
|
106
105
|
io-console (0.8.2)
|
|
107
|
-
irb (1.
|
|
106
|
+
irb (1.18.0)
|
|
108
107
|
pp (>= 0.6.0)
|
|
109
108
|
prism (>= 1.3.0)
|
|
110
109
|
rdoc (>= 4.0.0)
|
|
111
110
|
reline (>= 0.4.2)
|
|
112
|
-
json (2.
|
|
113
|
-
language_server-protocol (3.17.0.
|
|
114
|
-
lefthook (2.1.
|
|
111
|
+
json (2.21.1)
|
|
112
|
+
language_server-protocol (3.17.0.6)
|
|
113
|
+
lefthook (2.1.10)
|
|
115
114
|
lint_roller (1.1.0)
|
|
116
115
|
logger (1.7.0)
|
|
117
|
-
loofah (2.25.
|
|
116
|
+
loofah (2.25.1)
|
|
118
117
|
crass (~> 1.0.2)
|
|
119
118
|
nokogiri (>= 1.12.0)
|
|
120
|
-
mail (2.9.
|
|
119
|
+
mail (2.9.1)
|
|
121
120
|
logger
|
|
122
121
|
mini_mime (>= 0.1.1)
|
|
123
122
|
net-imap
|
|
124
123
|
net-pop
|
|
125
124
|
net-smtp
|
|
126
|
-
marcel (1.1
|
|
125
|
+
marcel (1.2.1)
|
|
127
126
|
mini_mime (1.1.5)
|
|
128
|
-
minitest (6.0.
|
|
127
|
+
minitest (6.0.6)
|
|
128
|
+
drb (~> 2.0)
|
|
129
129
|
prism (~> 1.5)
|
|
130
|
-
net-imap (0.6.
|
|
130
|
+
net-imap (0.6.4.1)
|
|
131
131
|
date
|
|
132
132
|
net-protocol
|
|
133
133
|
net-pop (0.1.2)
|
|
@@ -137,36 +137,33 @@ GEM
|
|
|
137
137
|
net-smtp (0.5.1)
|
|
138
138
|
net-protocol
|
|
139
139
|
nio4r (2.7.5)
|
|
140
|
-
nokogiri (1.19.
|
|
140
|
+
nokogiri (1.19.4-aarch64-linux-gnu)
|
|
141
141
|
racc (~> 1.4)
|
|
142
|
-
nokogiri (1.19.
|
|
142
|
+
nokogiri (1.19.4-aarch64-linux-musl)
|
|
143
143
|
racc (~> 1.4)
|
|
144
|
-
nokogiri (1.19.
|
|
144
|
+
nokogiri (1.19.4-arm-linux-gnu)
|
|
145
145
|
racc (~> 1.4)
|
|
146
|
-
nokogiri (1.19.
|
|
146
|
+
nokogiri (1.19.4-arm-linux-musl)
|
|
147
147
|
racc (~> 1.4)
|
|
148
|
-
nokogiri (1.19.
|
|
148
|
+
nokogiri (1.19.4-arm64-darwin)
|
|
149
149
|
racc (~> 1.4)
|
|
150
|
-
nokogiri (1.19.
|
|
150
|
+
nokogiri (1.19.4-x86_64-darwin)
|
|
151
151
|
racc (~> 1.4)
|
|
152
|
-
nokogiri (1.19.
|
|
152
|
+
nokogiri (1.19.4-x86_64-linux-gnu)
|
|
153
153
|
racc (~> 1.4)
|
|
154
|
-
nokogiri (1.19.
|
|
154
|
+
nokogiri (1.19.4-x86_64-linux-musl)
|
|
155
155
|
racc (~> 1.4)
|
|
156
|
-
parallel (1.
|
|
157
|
-
parser (3.3.
|
|
156
|
+
parallel (2.1.0)
|
|
157
|
+
parser (3.3.11.1)
|
|
158
158
|
ast (~> 2.4.1)
|
|
159
159
|
racc
|
|
160
|
-
pp (0.6.
|
|
160
|
+
pp (0.6.4)
|
|
161
161
|
prettyprint
|
|
162
162
|
prettyprint (0.2.0)
|
|
163
163
|
prism (1.9.0)
|
|
164
|
-
psych (5.3.1)
|
|
165
|
-
date
|
|
166
|
-
stringio
|
|
167
164
|
racc (1.8.1)
|
|
168
|
-
rack (3.2.
|
|
169
|
-
rack-session (2.1.
|
|
165
|
+
rack (3.2.6)
|
|
166
|
+
rack-session (2.1.2)
|
|
170
167
|
base64 (>= 0.1.0)
|
|
171
168
|
rack (>= 3.0.0)
|
|
172
169
|
rack-test (2.2.0)
|
|
@@ -191,8 +188,8 @@ GEM
|
|
|
191
188
|
activesupport (>= 5.0.0)
|
|
192
189
|
minitest
|
|
193
190
|
nokogiri (>= 1.6)
|
|
194
|
-
rails-html-sanitizer (1.
|
|
195
|
-
loofah (~> 2.
|
|
191
|
+
rails-html-sanitizer (1.7.0)
|
|
192
|
+
loofah (~> 2.25)
|
|
196
193
|
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
194
|
railties (7.2.3)
|
|
198
195
|
actionpack (= 7.2.3)
|
|
@@ -205,12 +202,17 @@ GEM
|
|
|
205
202
|
tsort (>= 0.2)
|
|
206
203
|
zeitwerk (~> 2.6)
|
|
207
204
|
rainbow (3.1.1)
|
|
208
|
-
rake (13.
|
|
209
|
-
|
|
205
|
+
rake (13.4.2)
|
|
206
|
+
rbs (4.0.3)
|
|
207
|
+
logger
|
|
208
|
+
prism (>= 1.6.0)
|
|
209
|
+
tsort
|
|
210
|
+
rdoc (8.0.0)
|
|
210
211
|
erb
|
|
211
|
-
|
|
212
|
+
prism (>= 1.6.0)
|
|
213
|
+
rbs (>= 4.0.0)
|
|
212
214
|
tsort
|
|
213
|
-
regexp_parser (2.
|
|
215
|
+
regexp_parser (2.12.0)
|
|
214
216
|
reline (0.6.3)
|
|
215
217
|
io-console (~> 0.5)
|
|
216
218
|
rspec (3.13.2)
|
|
@@ -222,51 +224,47 @@ GEM
|
|
|
222
224
|
rspec-expectations (3.13.5)
|
|
223
225
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
224
226
|
rspec-support (~> 3.13.0)
|
|
225
|
-
rspec-mocks (3.13.
|
|
227
|
+
rspec-mocks (3.13.8)
|
|
226
228
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
227
229
|
rspec-support (~> 3.13.0)
|
|
228
230
|
rspec-support (3.13.7)
|
|
229
|
-
rubocop (1.
|
|
231
|
+
rubocop (1.87.0)
|
|
230
232
|
json (~> 2.3)
|
|
231
233
|
language_server-protocol (~> 3.17.0.2)
|
|
232
234
|
lint_roller (~> 1.1.0)
|
|
233
|
-
parallel (
|
|
235
|
+
parallel (>= 1.10)
|
|
234
236
|
parser (>= 3.3.0.2)
|
|
235
237
|
rainbow (>= 2.2.2, < 4.0)
|
|
236
238
|
regexp_parser (>= 2.9.3, < 3.0)
|
|
237
|
-
rubocop-ast (>= 1.
|
|
239
|
+
rubocop-ast (>= 1.49.0, < 2.0)
|
|
238
240
|
ruby-progressbar (~> 1.7)
|
|
239
241
|
unicode-display_width (>= 2.4.0, < 4.0)
|
|
240
|
-
rubocop-ast (1.
|
|
242
|
+
rubocop-ast (1.50.0)
|
|
241
243
|
parser (>= 3.3.7.2)
|
|
242
244
|
prism (~> 1.7)
|
|
243
245
|
rubocop-performance (1.26.1)
|
|
244
246
|
lint_roller (~> 1.1)
|
|
245
247
|
rubocop (>= 1.75.0, < 2.0)
|
|
246
248
|
rubocop-ast (>= 1.47.1, < 2.0)
|
|
247
|
-
rubocop-rspec (3.
|
|
249
|
+
rubocop-rspec (3.10.2)
|
|
248
250
|
lint_roller (~> 1.1)
|
|
249
|
-
|
|
251
|
+
regexp_parser (>= 2.0)
|
|
252
|
+
rubocop (~> 1.86, >= 1.86.2)
|
|
250
253
|
ruby-progressbar (1.13.0)
|
|
251
254
|
securerandom (0.4.1)
|
|
252
|
-
simplecov (0.
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
sqlite3 (2.9.
|
|
259
|
-
sqlite3 (2.9.
|
|
260
|
-
sqlite3 (2.9.
|
|
261
|
-
|
|
262
|
-
sqlite3 (2.9.0-arm64-darwin)
|
|
263
|
-
sqlite3 (2.9.0-x86_64-darwin)
|
|
264
|
-
sqlite3 (2.9.0-x86_64-linux-gnu)
|
|
265
|
-
sqlite3 (2.9.0-x86_64-linux-musl)
|
|
266
|
-
standard (1.53.0)
|
|
255
|
+
simplecov (1.0.1)
|
|
256
|
+
sqlite3 (2.9.5-aarch64-linux-gnu)
|
|
257
|
+
sqlite3 (2.9.5-aarch64-linux-musl)
|
|
258
|
+
sqlite3 (2.9.5-arm-linux-gnu)
|
|
259
|
+
sqlite3 (2.9.5-arm-linux-musl)
|
|
260
|
+
sqlite3 (2.9.5-arm64-darwin)
|
|
261
|
+
sqlite3 (2.9.5-x86_64-darwin)
|
|
262
|
+
sqlite3 (2.9.5-x86_64-linux-gnu)
|
|
263
|
+
sqlite3 (2.9.5-x86_64-linux-musl)
|
|
264
|
+
standard (1.55.0)
|
|
267
265
|
language_server-protocol (~> 3.17.0.2)
|
|
268
266
|
lint_roller (~> 1.0)
|
|
269
|
-
rubocop (~> 1.
|
|
267
|
+
rubocop (~> 1.87.0)
|
|
270
268
|
standard-custom (~> 1.0.0)
|
|
271
269
|
standard-performance (~> 1.8)
|
|
272
270
|
standard-custom (1.0.2)
|
|
@@ -275,9 +273,8 @@ GEM
|
|
|
275
273
|
standard-performance (1.9.0)
|
|
276
274
|
lint_roller (~> 1.1)
|
|
277
275
|
rubocop-performance (~> 1.26.0)
|
|
278
|
-
stringio (3.2.0)
|
|
279
276
|
thor (1.5.0)
|
|
280
|
-
timeout (0.6.
|
|
277
|
+
timeout (0.6.1)
|
|
281
278
|
tsort (0.2.0)
|
|
282
279
|
tzinfo (2.0.6)
|
|
283
280
|
concurrent-ruby (~> 1.0)
|
|
@@ -285,11 +282,11 @@ GEM
|
|
|
285
282
|
unicode-emoji (~> 4.1)
|
|
286
283
|
unicode-emoji (4.2.0)
|
|
287
284
|
useragent (0.16.11)
|
|
288
|
-
websocket-driver (0.8.
|
|
285
|
+
websocket-driver (0.8.2)
|
|
289
286
|
base64
|
|
290
287
|
websocket-extensions (>= 0.1.0)
|
|
291
288
|
websocket-extensions (0.1.5)
|
|
292
|
-
zeitwerk (2.
|
|
289
|
+
zeitwerk (2.8.2)
|
|
293
290
|
|
|
294
291
|
PLATFORMS
|
|
295
292
|
aarch64-linux-gnu
|
|
@@ -331,102 +328,98 @@ CHECKSUMS
|
|
|
331
328
|
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
|
|
332
329
|
base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
|
|
333
330
|
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
|
|
334
|
-
bigdecimal (4.
|
|
331
|
+
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
|
|
335
332
|
builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f
|
|
336
|
-
cgi (0.5.
|
|
337
|
-
concurrent-ruby (1.3.
|
|
333
|
+
cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb
|
|
334
|
+
concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
|
|
338
335
|
connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
|
|
339
|
-
crass (1.0.
|
|
336
|
+
crass (1.0.7) sha256=94868719948664c89ddcaf0a37c65048413dfcb1c869470a5f7a7ceb5390b295
|
|
340
337
|
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
|
|
341
338
|
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
|
|
342
|
-
docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
|
|
343
339
|
drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
|
|
344
|
-
erb (6.0.
|
|
340
|
+
erb (6.0.4) sha256=38e3803694be357fe2bfe312487c74beaf9fb4e5beb3e22498952fe1645b95d9
|
|
345
341
|
erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9
|
|
346
|
-
globalid (1.
|
|
347
|
-
i18n (1.
|
|
342
|
+
globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427
|
|
343
|
+
i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5
|
|
348
344
|
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
|
|
349
|
-
irb (1.
|
|
350
|
-
json (2.
|
|
351
|
-
language_server-protocol (3.17.0.
|
|
352
|
-
lefthook (2.1.
|
|
345
|
+
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
|
|
346
|
+
json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
|
|
347
|
+
language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
|
|
348
|
+
lefthook (2.1.10) sha256=cc9c06bd8ea689e8b8016eab9769e54d696d07951860c1c6d28e8f6812e61b65
|
|
353
349
|
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
|
|
354
350
|
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
|
|
355
|
-
loofah (2.25.
|
|
356
|
-
mail (2.9.
|
|
357
|
-
marcel (1.1
|
|
351
|
+
loofah (2.25.1) sha256=d436c73dbd0c1147b16c4a41db097942d217303e1f7728704b37e4df9f6d2e04
|
|
352
|
+
mail (2.9.1) sha256=06574eca475253d6c18145dd70af80d0eb970182d55053497c5f4d797ea160e8
|
|
353
|
+
marcel (1.2.1) sha256=1678e9360e32f9eafa917c80029e2f6d10b2715c66a4b87b6d0da9b9cd1f859f
|
|
358
354
|
mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
|
|
359
|
-
minitest (6.0.
|
|
360
|
-
net-imap (0.6.
|
|
355
|
+
minitest (6.0.6) sha256=153ea36d1d987a62942382b61075745042a2b3123b1cd48f4c3675af9cc7d6f1
|
|
356
|
+
net-imap (0.6.4.1) sha256=29f0360d75a7efd3539f16ac1957dea5c0a51ddeceb348db4553c3120914ea0d
|
|
361
357
|
net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3
|
|
362
358
|
net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8
|
|
363
359
|
net-smtp (0.5.1) sha256=ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736
|
|
364
360
|
nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1
|
|
365
|
-
nokogiri (1.19.
|
|
366
|
-
nokogiri (1.19.
|
|
367
|
-
nokogiri (1.19.
|
|
368
|
-
nokogiri (1.19.
|
|
369
|
-
nokogiri (1.19.
|
|
370
|
-
nokogiri (1.19.
|
|
371
|
-
nokogiri (1.19.
|
|
372
|
-
nokogiri (1.19.
|
|
373
|
-
parallel (1.
|
|
374
|
-
parser (3.3.
|
|
375
|
-
pp (0.6.
|
|
361
|
+
nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f
|
|
362
|
+
nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af
|
|
363
|
+
nokogiri (1.19.4-arm-linux-gnu) sha256=a301313e38bb065d68239e79734bcd6f56fb6efaacebde29e9abf2a4735340ca
|
|
364
|
+
nokogiri (1.19.4-arm-linux-musl) sha256=588923c101bcfa78869734d247d25b598674323e7f22474fc468f6e5647311eb
|
|
365
|
+
nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527
|
|
366
|
+
nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551
|
|
367
|
+
nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a
|
|
368
|
+
nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b
|
|
369
|
+
parallel (2.1.0) sha256=b35258865c2e31134c5ecb708beaaf6772adf9d5efae28e93e99260877b09356
|
|
370
|
+
parser (3.3.11.1) sha256=d17ace7aabe3e72c3cc94043714be27cc6f852f104d81aa284c2281aecc65d54
|
|
371
|
+
pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
|
|
376
372
|
prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
|
|
377
373
|
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
|
|
378
|
-
psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974
|
|
379
374
|
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
|
|
380
|
-
rack (3.2.
|
|
381
|
-
rack-session (2.1.
|
|
375
|
+
rack (3.2.6) sha256=5ed78e1f73b2e25679bec7d45ee2d4483cc4146eb1be0264fc4d94cb5ef212c2
|
|
376
|
+
rack-session (2.1.2) sha256=595434f8c0c3473ae7d7ac56ecda6cc6dfd9d37c0b2b5255330aa1576967ffe8
|
|
382
377
|
rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463
|
|
383
378
|
rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868
|
|
384
379
|
rails (7.2.3) sha256=9a9812eb131189676e64665f6883fc9c4051f412cc87ef9e3fa242a09c609bff
|
|
385
380
|
rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d
|
|
386
|
-
rails-html-sanitizer (1.
|
|
381
|
+
rails-html-sanitizer (1.7.0) sha256=28b145cceaf9cc214a9874feaa183c3acba036c9592b19886e0e45efc62b1e89
|
|
387
382
|
railties (7.2.3) sha256=6eb010a6bfe6f223e783f739ddfcbdb5b88b1f3a87f7739f0a0685e466250422
|
|
388
383
|
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
|
|
389
|
-
rake (13.
|
|
390
|
-
|
|
391
|
-
|
|
384
|
+
rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
|
|
385
|
+
rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
|
|
386
|
+
rdoc (8.0.0) sha256=03bf8c08a9639658855a0cfd77c0abca8325c227693f7f33f82957811348c469
|
|
387
|
+
regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
|
|
392
388
|
reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
|
|
393
|
-
role_fu (0.
|
|
389
|
+
role_fu (0.6.0)
|
|
394
390
|
rspec (3.13.2) sha256=206284a08ad798e61f86d7ca3e376718d52c0bc944626b2349266f239f820587
|
|
395
391
|
rspec-core (3.13.6) sha256=a8823c6411667b60a8bca135364351dda34cd55e44ff94c4be4633b37d828b2d
|
|
396
392
|
rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836
|
|
397
|
-
rspec-mocks (3.13.
|
|
393
|
+
rspec-mocks (3.13.8) sha256=086ad3d3d17533f4237643de0b5c42f04b66348c28bf6b9c2d3f4a3b01af1d47
|
|
398
394
|
rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c
|
|
399
|
-
rubocop (1.
|
|
400
|
-
rubocop-ast (1.
|
|
395
|
+
rubocop (1.87.0) sha256=b9d9ddf55116a513f8ef2c7ae660662d8b49301f118d3f0df61865b33a5c188d
|
|
396
|
+
rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db
|
|
401
397
|
rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
|
|
402
|
-
rubocop-rspec (3.
|
|
398
|
+
rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2
|
|
403
399
|
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
|
|
404
400
|
securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
|
|
405
|
-
simplecov (0.
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
sqlite3 (2.9.
|
|
409
|
-
sqlite3 (2.9.
|
|
410
|
-
sqlite3 (2.9.
|
|
411
|
-
sqlite3 (2.9.
|
|
412
|
-
sqlite3 (2.9.
|
|
413
|
-
sqlite3 (2.9.
|
|
414
|
-
|
|
415
|
-
sqlite3 (2.9.0-x86_64-linux-musl) sha256=ef716ba7a66d7deb1ccc402ac3a6d7343da17fac862793b7f0be3d2917253c90
|
|
416
|
-
standard (1.53.0) sha256=f3c9493385db7079d0abce6f7582f553122156997b81258cd361d3480eeacf9c
|
|
401
|
+
simplecov (1.0.1) sha256=419d93c40484159d20b40e26e9a83cdd4c3afa2f3fd443bb8946c301cd658d75
|
|
402
|
+
sqlite3 (2.9.5-aarch64-linux-gnu) sha256=78075b6337d3d182c6d2b4691049ed45cd220826160c9ea18946bf6a1de200dc
|
|
403
|
+
sqlite3 (2.9.5-aarch64-linux-musl) sha256=18c801185deb4adc01ddb281e8f672a39e3d1729979ca91e39439cd3eac0402d
|
|
404
|
+
sqlite3 (2.9.5-arm-linux-gnu) sha256=1bdfca0c7d63998c60b0f4a8e3c8df2d33800ccc4abd2d612eddbbbc92a4c48b
|
|
405
|
+
sqlite3 (2.9.5-arm-linux-musl) sha256=bae1109d12b2e9f588455967729b008e1ff4feb7761749df695019c9079913c6
|
|
406
|
+
sqlite3 (2.9.5-arm64-darwin) sha256=d0cf444a70fc9395d513cfbcc1e6719e224aa645314e3824cb0474c721425aa2
|
|
407
|
+
sqlite3 (2.9.5-x86_64-darwin) sha256=8e9caae38bd7ebb29cbeee3e7ab1d12dc2327d9a1b92c7fcf0dda05589627a81
|
|
408
|
+
sqlite3 (2.9.5-x86_64-linux-gnu) sha256=233dbcb6714148dd23bc5aeb33e8efd6eac974969564ddd5794c23d5f52b231e
|
|
409
|
+
sqlite3 (2.9.5-x86_64-linux-musl) sha256=e7d3a7474e8af0f96150c21abc203fbab5437206bfcdf11deab7741c0ca516f2
|
|
410
|
+
standard (1.55.0) sha256=8a8f2c3e681a4db3aafde1b301561b0f3d7c5f06c160167cb744a4d7baf0426e
|
|
417
411
|
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
|
|
418
412
|
standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
|
|
419
|
-
stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1
|
|
420
413
|
thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73
|
|
421
|
-
timeout (0.6.
|
|
414
|
+
timeout (0.6.1) sha256=78f57368a7e7bbadec56971f78a3f5ecbcfb59b7fcbb0a3ed6ddc08a5094accb
|
|
422
415
|
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
|
|
423
416
|
tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
|
|
424
417
|
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
|
|
425
418
|
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
|
|
426
419
|
useragent (0.16.11) sha256=700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844
|
|
427
|
-
websocket-driver (0.8.
|
|
420
|
+
websocket-driver (0.8.2) sha256=97c556b019bf3410b4961002ac501621e9322d3f8a7bc02161a09301cc4c4146
|
|
428
421
|
websocket-extensions (0.1.5) sha256=1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241
|
|
429
|
-
zeitwerk (2.
|
|
422
|
+
zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
|
|
430
423
|
|
|
431
424
|
BUNDLED WITH
|
|
432
425
|
4.0.5
|