role_fu 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7d8ca75bef3838c779e395c17a16c8e61ddb6a7fdab7b2819412cd9356213436
4
+ data.tar.gz: b3b280add77cac1f4778c7e72b4ec3717e9554ab053cbcce869ef7180dd98ed2
5
+ SHA512:
6
+ metadata.gz: 0c7448aa048ad1836888270417e15d2acf5375cef727059cac77e9dea5c644d2b5156fc9e90134d9918367b38e4c127f753f5dda01b836c24794baf0102646dd
7
+ data.tar.gz: 57a6f48677cb49653b3c22e298b13fb3ac13003bb7e8d895e9c17396304e8385b7fb7162db426a7862ce1aad3031396e66dda60a897f898952594ee6011a4784
data/Appraisals ADDED
@@ -0,0 +1,19 @@
1
+ appraise "rails-7.0" do
2
+ gem "rails", "~> 7.0.0"
3
+ end
4
+
5
+ appraise "rails-7.1" do
6
+ gem "rails", "~> 7.1.0"
7
+ end
8
+
9
+ appraise "rails-7.2" do
10
+ gem "rails", "~> 7.2.0"
11
+ end
12
+
13
+ appraise "rails-8.0" do
14
+ gem "rails", "~> 8.0.0"
15
+ end
16
+
17
+ appraise "rails-8.1" do
18
+ gem "rails", "~> 8.1.0"
19
+ end
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2026-02-03
4
+
5
+ - Initial release: modern role management for Rails with explicit models and N+1 prevention.
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2026 Alexey Poimtsev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,144 @@
1
+ # RoleFu
2
+
3
+ RoleFu is a modern, explicit role management gem for Ruby on Rails. It is designed as a cleaner, more performant alternative to `rolify`.
4
+
5
+ ## Why RoleFu?
6
+
7
+ - **Explicit Models**: Unlike Rolify which often uses hidden `has_and_belongs_to_many` tables, RoleFu uses an explicit `RoleAssignment` join model. This makes it easier to extend with metadata (e.g., `created_by`, `expires_at`).
8
+ - **N+1 Prevention**: Built-in support for `has_cached_role?` to work with preloaded associations.
9
+ - **Strict by Default**: Focused on resource-specific roles with clear `has_role?` semantics.
10
+ - **Orphaned Role Cleanup**: Automatically deletes roles when the last user assignment is removed.
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem 'role_fu'
18
+ ```
19
+
20
+ And then execute:
21
+
22
+ ```bash
23
+ bundle install
24
+ ```
25
+
26
+ ### Setup
27
+
28
+ 1. Run the install generator to create the configuration:
29
+ ```bash
30
+ rails generate role_fu:install
31
+ ```
32
+
33
+ 2. Generate the Role models (default names are `Role` and `RoleAssignment`):
34
+ ```bash
35
+ rails generate role_fu Role User
36
+ ```
37
+
38
+ 3. Run migrations:
39
+ ```bash
40
+ rails db:migrate
41
+ ```
42
+
43
+ ## Usage
44
+
45
+ ### Roleable (User Model)
46
+
47
+ Include `RoleFu::Roleable` in your User model (done automatically by the generator).
48
+
49
+ ```ruby
50
+ class User < ApplicationRecord
51
+ include RoleFu::Roleable
52
+
53
+ # Optional callbacks
54
+ role_fu_options after_add: :notify_user
55
+
56
+ def notify_user(role)
57
+ # ...
58
+ end
59
+ end
60
+ ```
61
+
62
+ #### Basic Operations
63
+
64
+ ```ruby
65
+ user = User.find(1)
66
+
67
+ # Global roles
68
+ user.add_role(:admin)
69
+ user.grant(:admin) # Alias
70
+ user.has_role?(:admin) # => true
71
+ user.remove_role(:admin)
72
+ user.revoke(:admin) # Alias
73
+
74
+ # Resource-specific roles
75
+ org = Organization.first
76
+ user.add_role(:manager, org)
77
+ user.has_role?(:manager, org) # => true
78
+ user.has_role?(:manager) # => false (strict check)
79
+ user.has_role?(:manager, :any) # => true
80
+ user.only_has_role?(:manager, org) # => true if this is their only role
81
+
82
+ # Scopes (Finders)
83
+ User.with_role(:admin)
84
+ User.with_role(:manager, org)
85
+ User.without_role(:admin)
86
+ User.with_any_role(:admin, :editor)
87
+ User.with_all_roles(:admin, :manager)
88
+
89
+ # Resource Scopes
90
+ Organization.with_role(:manager, user)
91
+ Organization.without_role(:manager, user)
92
+ ```
93
+
94
+ #### Performance (N+1 Prevention)
95
+
96
+ Use `has_cached_role?` when roles are preloaded.
97
+
98
+ ```ruby
99
+ users = User.includes(:roles).all
100
+ users.each do |user|
101
+ user.has_cached_role?(:admin) # No extra queries!
102
+ end
103
+ ```
104
+
105
+ ### Resourceable (Models with roles)
106
+
107
+ Include `RoleFu::Resourceable` in any model that should have roles scoped to it.
108
+
109
+ ```ruby
110
+ class Organization < ApplicationRecord
111
+ include RoleFu::Resourceable
112
+ end
113
+
114
+ org = Organization.first
115
+ org.users_with_role(:manager)
116
+ org.count_users_with_role(:admin)
117
+ org.available_roles # ["manager", "admin"]
118
+ ```
119
+
120
+ ## Comparison with Rolify
121
+
122
+ | Feature | Rolify | RoleFu |
123
+ |---------|--------|--------|
124
+ | Join Model | Implicit (HABTM) | Explicit (RoleAssignment) |
125
+ | Performance | Frequent N+1 | Cached role support + Optimized Scopes |
126
+ | Orphaned Roles | Configurable cleanup | Automatic cleanup |
127
+ | Scopes | `User.with_role` | `User.with_role`, `without_role`, `with_any`, `with_all` |
128
+ | Modern Rails | Older codebase | Optimized for Rails 7+ |
129
+
130
+ ## Configuration
131
+
132
+ If your models are named differently (e.g., `Account` instead of `User`, or `Group` instead of `Role`), you can configure them in `config/initializers/role_fu.rb`:
133
+
134
+ ```ruby
135
+ RoleFu.configure do |config|
136
+ config.user_class_name = "Account"
137
+ config.role_class_name = "Group"
138
+ config.role_assignment_class_name = "GroupAssignment" # Optional
139
+ end
140
+ ```
141
+
142
+ ## License
143
+
144
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ # Mock :environment task since we are not in a Rails app
13
+ task :environment do
14
+ # No-op
15
+ end
16
+
17
+ namespace :maintenance do
18
+ desc "Update all appraisal lockfiles"
19
+ task :update_appraisals do
20
+ sh "bundle exec appraisal install"
21
+ sh "bundle exec appraisal bundle update --all"
22
+ end
23
+ end
24
+
25
+ task default: %i[spec rubocop]
@@ -0,0 +1,16 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "irb"
6
+ gem "rake", "~> 13.0"
7
+ gem "rspec", "~> 3.0"
8
+ gem "standard", ">= 1.35.1", require: false
9
+ gem "rubocop-rspec", require: false
10
+ gem "rubocop-performance", require: false
11
+ gem "lefthook", require: false
12
+ gem "appraisal", require: false
13
+ gem "simplecov", require: false
14
+ gem "rails", "~> 7.0.0"
15
+
16
+ gemspec path: "../"
@@ -0,0 +1,419 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ role_fu (0.1.0)
5
+ activerecord (>= 7.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actioncable (7.0.10)
11
+ actionpack (= 7.0.10)
12
+ activesupport (= 7.0.10)
13
+ nio4r (~> 2.0)
14
+ websocket-driver (>= 0.6.1)
15
+ actionmailbox (7.0.10)
16
+ actionpack (= 7.0.10)
17
+ activejob (= 7.0.10)
18
+ activerecord (= 7.0.10)
19
+ activestorage (= 7.0.10)
20
+ activesupport (= 7.0.10)
21
+ mail (>= 2.7.1)
22
+ net-imap
23
+ net-pop
24
+ net-smtp
25
+ actionmailer (7.0.10)
26
+ actionpack (= 7.0.10)
27
+ actionview (= 7.0.10)
28
+ activejob (= 7.0.10)
29
+ activesupport (= 7.0.10)
30
+ mail (~> 2.5, >= 2.5.4)
31
+ net-imap
32
+ net-pop
33
+ net-smtp
34
+ rails-dom-testing (~> 2.0)
35
+ actionpack (7.0.10)
36
+ actionview (= 7.0.10)
37
+ activesupport (= 7.0.10)
38
+ racc
39
+ rack (~> 2.0, >= 2.2.4)
40
+ rack-test (>= 0.6.3)
41
+ rails-dom-testing (~> 2.0)
42
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
43
+ actiontext (7.0.10)
44
+ actionpack (= 7.0.10)
45
+ activerecord (= 7.0.10)
46
+ activestorage (= 7.0.10)
47
+ activesupport (= 7.0.10)
48
+ globalid (>= 0.6.0)
49
+ nokogiri (>= 1.8.5)
50
+ actionview (7.0.10)
51
+ activesupport (= 7.0.10)
52
+ builder (~> 3.1)
53
+ erubi (~> 1.4)
54
+ rails-dom-testing (~> 2.0)
55
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
56
+ activejob (7.0.10)
57
+ activesupport (= 7.0.10)
58
+ globalid (>= 0.3.6)
59
+ activemodel (7.0.10)
60
+ activesupport (= 7.0.10)
61
+ activerecord (7.0.10)
62
+ activemodel (= 7.0.10)
63
+ activesupport (= 7.0.10)
64
+ activestorage (7.0.10)
65
+ actionpack (= 7.0.10)
66
+ activejob (= 7.0.10)
67
+ activerecord (= 7.0.10)
68
+ activesupport (= 7.0.10)
69
+ marcel (~> 1.0)
70
+ mini_mime (>= 1.1.0)
71
+ activesupport (7.0.10)
72
+ base64
73
+ benchmark (>= 0.3)
74
+ bigdecimal
75
+ concurrent-ruby (~> 1.0, >= 1.0.2)
76
+ drb
77
+ i18n (>= 1.6, < 2)
78
+ logger (>= 1.4.2)
79
+ minitest (>= 5.1)
80
+ mutex_m
81
+ securerandom (>= 0.3)
82
+ tzinfo (~> 2.0)
83
+ appraisal (2.5.0)
84
+ bundler
85
+ rake
86
+ thor (>= 0.14.0)
87
+ ast (2.4.3)
88
+ base64 (0.3.0)
89
+ benchmark (0.5.0)
90
+ bigdecimal (4.0.1)
91
+ builder (3.3.0)
92
+ concurrent-ruby (1.3.6)
93
+ crass (1.0.6)
94
+ date (3.5.1)
95
+ diff-lcs (1.6.2)
96
+ docile (1.4.1)
97
+ drb (2.2.3)
98
+ erb (6.0.1)
99
+ erubi (1.13.1)
100
+ globalid (1.3.0)
101
+ activesupport (>= 6.1)
102
+ i18n (1.14.8)
103
+ concurrent-ruby (~> 1.0)
104
+ io-console (0.8.2)
105
+ irb (1.16.0)
106
+ pp (>= 0.6.0)
107
+ rdoc (>= 4.0.0)
108
+ reline (>= 0.4.2)
109
+ json (2.18.1)
110
+ language_server-protocol (3.17.0.5)
111
+ lefthook (2.1.0)
112
+ lint_roller (1.1.0)
113
+ logger (1.7.0)
114
+ loofah (2.25.0)
115
+ crass (~> 1.0.2)
116
+ nokogiri (>= 1.12.0)
117
+ mail (2.9.0)
118
+ logger
119
+ mini_mime (>= 0.1.1)
120
+ net-imap
121
+ net-pop
122
+ net-smtp
123
+ marcel (1.1.0)
124
+ method_source (1.1.0)
125
+ mini_mime (1.1.5)
126
+ minitest (6.0.1)
127
+ prism (~> 1.5)
128
+ mutex_m (0.3.0)
129
+ net-imap (0.6.2)
130
+ date
131
+ net-protocol
132
+ net-pop (0.1.2)
133
+ net-protocol
134
+ net-protocol (0.2.2)
135
+ timeout
136
+ net-smtp (0.5.1)
137
+ net-protocol
138
+ nio4r (2.7.5)
139
+ nokogiri (1.19.0-aarch64-linux-gnu)
140
+ racc (~> 1.4)
141
+ nokogiri (1.19.0-aarch64-linux-musl)
142
+ racc (~> 1.4)
143
+ nokogiri (1.19.0-arm-linux-gnu)
144
+ racc (~> 1.4)
145
+ nokogiri (1.19.0-arm-linux-musl)
146
+ racc (~> 1.4)
147
+ nokogiri (1.19.0-arm64-darwin)
148
+ racc (~> 1.4)
149
+ nokogiri (1.19.0-x86_64-darwin)
150
+ racc (~> 1.4)
151
+ nokogiri (1.19.0-x86_64-linux-gnu)
152
+ racc (~> 1.4)
153
+ nokogiri (1.19.0-x86_64-linux-musl)
154
+ racc (~> 1.4)
155
+ parallel (1.27.0)
156
+ parser (3.3.10.1)
157
+ ast (~> 2.4.1)
158
+ racc
159
+ pp (0.6.3)
160
+ prettyprint
161
+ prettyprint (0.2.0)
162
+ prism (1.9.0)
163
+ psych (5.3.1)
164
+ date
165
+ stringio
166
+ racc (1.8.1)
167
+ rack (2.2.21)
168
+ rack-test (2.2.0)
169
+ rack (>= 1.3)
170
+ rails (7.0.10)
171
+ actioncable (= 7.0.10)
172
+ actionmailbox (= 7.0.10)
173
+ actionmailer (= 7.0.10)
174
+ actionpack (= 7.0.10)
175
+ actiontext (= 7.0.10)
176
+ actionview (= 7.0.10)
177
+ activejob (= 7.0.10)
178
+ activemodel (= 7.0.10)
179
+ activerecord (= 7.0.10)
180
+ activestorage (= 7.0.10)
181
+ activesupport (= 7.0.10)
182
+ bundler (>= 1.15.0)
183
+ railties (= 7.0.10)
184
+ rails-dom-testing (2.3.0)
185
+ activesupport (>= 5.0.0)
186
+ minitest
187
+ nokogiri (>= 1.6)
188
+ rails-html-sanitizer (1.6.2)
189
+ loofah (~> 2.21)
190
+ 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)
191
+ railties (7.0.10)
192
+ actionpack (= 7.0.10)
193
+ activesupport (= 7.0.10)
194
+ method_source
195
+ rake (>= 12.2)
196
+ thor (~> 1.0)
197
+ zeitwerk (~> 2.5)
198
+ rainbow (3.1.1)
199
+ rake (13.3.1)
200
+ rdoc (7.1.0)
201
+ erb
202
+ psych (>= 4.0.0)
203
+ tsort
204
+ regexp_parser (2.11.3)
205
+ reline (0.6.3)
206
+ io-console (~> 0.5)
207
+ rspec (3.13.2)
208
+ rspec-core (~> 3.13.0)
209
+ rspec-expectations (~> 3.13.0)
210
+ rspec-mocks (~> 3.13.0)
211
+ rspec-core (3.13.6)
212
+ rspec-support (~> 3.13.0)
213
+ rspec-expectations (3.13.5)
214
+ diff-lcs (>= 1.2.0, < 2.0)
215
+ rspec-support (~> 3.13.0)
216
+ rspec-mocks (3.13.7)
217
+ diff-lcs (>= 1.2.0, < 2.0)
218
+ rspec-support (~> 3.13.0)
219
+ rspec-support (3.13.7)
220
+ rubocop (1.82.1)
221
+ json (~> 2.3)
222
+ language_server-protocol (~> 3.17.0.2)
223
+ lint_roller (~> 1.1.0)
224
+ parallel (~> 1.10)
225
+ parser (>= 3.3.0.2)
226
+ rainbow (>= 2.2.2, < 4.0)
227
+ regexp_parser (>= 2.9.3, < 3.0)
228
+ rubocop-ast (>= 1.48.0, < 2.0)
229
+ ruby-progressbar (~> 1.7)
230
+ unicode-display_width (>= 2.4.0, < 4.0)
231
+ rubocop-ast (1.49.0)
232
+ parser (>= 3.3.7.2)
233
+ prism (~> 1.7)
234
+ rubocop-performance (1.26.1)
235
+ lint_roller (~> 1.1)
236
+ rubocop (>= 1.75.0, < 2.0)
237
+ rubocop-ast (>= 1.47.1, < 2.0)
238
+ rubocop-rspec (3.9.0)
239
+ lint_roller (~> 1.1)
240
+ rubocop (~> 1.81)
241
+ ruby-progressbar (1.13.0)
242
+ securerandom (0.4.1)
243
+ simplecov (0.22.0)
244
+ docile (~> 1.1)
245
+ simplecov-html (~> 0.11)
246
+ simplecov_json_formatter (~> 0.1)
247
+ simplecov-html (0.13.2)
248
+ simplecov_json_formatter (0.1.4)
249
+ sqlite3 (2.9.0-aarch64-linux-gnu)
250
+ sqlite3 (2.9.0-aarch64-linux-musl)
251
+ sqlite3 (2.9.0-arm-linux-gnu)
252
+ sqlite3 (2.9.0-arm-linux-musl)
253
+ sqlite3 (2.9.0-arm64-darwin)
254
+ sqlite3 (2.9.0-x86_64-darwin)
255
+ sqlite3 (2.9.0-x86_64-linux-gnu)
256
+ sqlite3 (2.9.0-x86_64-linux-musl)
257
+ standard (1.53.0)
258
+ language_server-protocol (~> 3.17.0.2)
259
+ lint_roller (~> 1.0)
260
+ rubocop (~> 1.82.0)
261
+ standard-custom (~> 1.0.0)
262
+ standard-performance (~> 1.8)
263
+ standard-custom (1.0.2)
264
+ lint_roller (~> 1.0)
265
+ rubocop (~> 1.50)
266
+ standard-performance (1.9.0)
267
+ lint_roller (~> 1.1)
268
+ rubocop-performance (~> 1.26.0)
269
+ stringio (3.2.0)
270
+ thor (1.5.0)
271
+ timeout (0.6.0)
272
+ tsort (0.2.0)
273
+ tzinfo (2.0.6)
274
+ concurrent-ruby (~> 1.0)
275
+ unicode-display_width (3.2.0)
276
+ unicode-emoji (~> 4.1)
277
+ unicode-emoji (4.2.0)
278
+ websocket-driver (0.8.0)
279
+ base64
280
+ websocket-extensions (>= 0.1.0)
281
+ websocket-extensions (0.1.5)
282
+ zeitwerk (2.7.4)
283
+
284
+ PLATFORMS
285
+ aarch64-linux-gnu
286
+ aarch64-linux-musl
287
+ arm-linux-gnu
288
+ arm-linux-musl
289
+ arm64-darwin
290
+ x86_64-darwin
291
+ x86_64-linux-gnu
292
+ x86_64-linux-musl
293
+
294
+ DEPENDENCIES
295
+ appraisal
296
+ irb
297
+ lefthook
298
+ rails (~> 7.0.0)
299
+ rake (~> 13.0)
300
+ role_fu!
301
+ rspec (~> 3.0)
302
+ rubocop-performance
303
+ rubocop-rspec
304
+ simplecov
305
+ sqlite3 (~> 2.0)
306
+ standard (>= 1.35.1)
307
+
308
+ CHECKSUMS
309
+ actioncable (7.0.10) sha256=7aa02ea26d6cc21c33e604bb28a0759c5212653311bc42105f96f709e507afab
310
+ actionmailbox (7.0.10) sha256=1236f472d86db056f97b3602391becab69c84d9f79d963b9c9b50056e213c1e6
311
+ actionmailer (7.0.10) sha256=53bc7aac1659ef97a216c43002ea8286931d7b97f252b27152ac15de1b2585ef
312
+ actionpack (7.0.10) sha256=4c524b3b401cc828efb3fcd6f3de56ac1ec0180843b74f54357f58b0256f9509
313
+ actiontext (7.0.10) sha256=ffadcbb9b21c09e9bfe946a79739d92abc92a9097eb1db7675e52484804c1c8c
314
+ actionview (7.0.10) sha256=e5a9475ccfcde80dddf7ced701f44aedc4f8262286051db84ae2c48322ec000e
315
+ activejob (7.0.10) sha256=f31b974206569a362e8c6c07aa00f3099fcc0f365880929c23e79c739d90fceb
316
+ activemodel (7.0.10) sha256=e2e1e0a4664b69606363e9f6f59afadeab6fa8843c5fb73cd037bb72a40fa498
317
+ activerecord (7.0.10) sha256=63bc193d4c6944d85f53255362b67269d246a51bd664e09b1aa2cecfe5288c9a
318
+ activestorage (7.0.10) sha256=41906d59536170abcb480d05b2368ee06305307edcafc5e4891ffb7b0970eaa2
319
+ activesupport (7.0.10) sha256=01487b0774045918b36893af4f012986db8375f6c5850c0ffc75b940ede72305
320
+ appraisal (2.5.0) sha256=36989221be127913b0dba8d114da2001e6b2dceea7bd4951200eaba764eed3ce
321
+ ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
322
+ base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
323
+ benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
324
+ bigdecimal (4.0.1) sha256=8b07d3d065a9f921c80ceaea7c9d4ae596697295b584c296fe599dd0ad01c4a7
325
+ builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f
326
+ concurrent-ruby (1.3.6) sha256=6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab
327
+ crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d
328
+ date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
329
+ diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
330
+ docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
331
+ drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
332
+ erb (6.0.1) sha256=28ecdd99c5472aebd5674d6061e3c6b0a45c049578b071e5a52c2a7f13c197e5
333
+ erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9
334
+ globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11
335
+ i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5
336
+ io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
337
+ irb (1.16.0) sha256=2abe56c9ac947cdcb2f150572904ba798c1e93c890c256f8429981a7675b0806
338
+ json (2.18.1) sha256=fe112755501b8d0466b5ada6cf50c8c3f41e897fa128ac5d263ec09eedc9f986
339
+ language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
340
+ lefthook (2.1.0) sha256=a100dc90139806e62b9aa40cf32e9edf34f6cff10c8b55ebd14a1b0add4b86bf
341
+ lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
342
+ logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
343
+ loofah (2.25.0) sha256=df5ed7ac3bac6a4ec802df3877ee5cc86d027299f8952e6243b3dac446b060e6
344
+ mail (2.9.0) sha256=6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941
345
+ marcel (1.1.0) sha256=fdcfcfa33cc52e93c4308d40e4090a5d4ea279e160a7f6af988260fa970e0bee
346
+ method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5
347
+ mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
348
+ minitest (6.0.1) sha256=7854c74f48e2e975969062833adc4013f249a4b212f5e7b9d5c040bf838d54bb
349
+ mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
350
+ net-imap (0.6.2) sha256=08caacad486853c61676cca0c0c47df93db02abc4a8239a8b67eb0981428acc6
351
+ net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3
352
+ net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8
353
+ net-smtp (0.5.1) sha256=ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736
354
+ nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1
355
+ nokogiri (1.19.0-aarch64-linux-gnu) sha256=11a97ecc3c0e7e5edcf395720b10860ef493b768f6aa80c539573530bc933767
356
+ nokogiri (1.19.0-aarch64-linux-musl) sha256=eb70507f5e01bc23dad9b8dbec2b36ad0e61d227b42d292835020ff754fb7ba9
357
+ nokogiri (1.19.0-arm-linux-gnu) sha256=572a259026b2c8b7c161fdb6469fa2d0edd2b61cd599db4bbda93289abefbfe5
358
+ nokogiri (1.19.0-arm-linux-musl) sha256=23ed90922f1a38aed555d3de4d058e90850c731c5b756d191b3dc8055948e73c
359
+ nokogiri (1.19.0-arm64-darwin) sha256=0811dfd936d5f6dd3f6d32ef790568bf29b2b7bead9ba68866847b33c9cf5810
360
+ nokogiri (1.19.0-x86_64-darwin) sha256=1dad56220b603a8edb9750cd95798bffa2b8dd9dd9aa47f664009ee5b43e3067
361
+ nokogiri (1.19.0-x86_64-linux-gnu) sha256=f482b95c713d60031d48c44ce14562f8d2ce31e3a9e8dd0ccb131e9e5a68b58c
362
+ nokogiri (1.19.0-x86_64-linux-musl) sha256=1c4ca6b381622420073ce6043443af1d321e8ed93cc18b08e2666e5bd02ffae4
363
+ parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130
364
+ parser (3.3.10.1) sha256=06f6a725d2cd91e5e7f2b7c32ba143631e1f7c8ae2fb918fc4cebec187e6a688
365
+ pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6
366
+ prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
367
+ prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
368
+ psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974
369
+ racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
370
+ rack (2.2.21) sha256=14e2f72f0765455fe424ff601588ac5ce84e95784f59e99251ffe1527152f739
371
+ rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463
372
+ rails (7.0.10) sha256=866eb2c53d3184543fdb770d7ea308e4ee518063226a9e176229f3c7a9537c25
373
+ rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d
374
+ rails-html-sanitizer (1.6.2) sha256=35fce2ca8242da8775c83b6ba9c1bcaad6751d9eb73c1abaa8403475ab89a560
375
+ railties (7.0.10) sha256=d52a8b7a61ad941121a15a6596b2150e05c70b199c3afc9e9b73e63b3b1a57a7
376
+ rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
377
+ rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c
378
+ rdoc (7.1.0) sha256=494899df0706c178596ca6e1d50f1b7eb285a9b2aae715be5abd742734f17363
379
+ regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4
380
+ reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
381
+ role_fu (0.1.0)
382
+ rspec (3.13.2) sha256=206284a08ad798e61f86d7ca3e376718d52c0bc944626b2349266f239f820587
383
+ rspec-core (3.13.6) sha256=a8823c6411667b60a8bca135364351dda34cd55e44ff94c4be4633b37d828b2d
384
+ rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836
385
+ rspec-mocks (3.13.7) sha256=0979034e64b1d7a838aaaddf12bf065ea4dc40ef3d4c39f01f93ae2c66c62b1c
386
+ rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c
387
+ rubocop (1.82.1) sha256=09f1a6a654a960eda767aebea33e47603080f8e9c9a3f019bf9b94c9cab5e273
388
+ rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd
389
+ rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
390
+ rubocop-rspec (3.9.0) sha256=8fa70a3619408237d789aeecfb9beef40576acc855173e60939d63332fdb55e2
391
+ ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
392
+ securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
393
+ simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
394
+ simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246
395
+ simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
396
+ sqlite3 (2.9.0-aarch64-linux-gnu) sha256=cfe1e0216f46d7483839719bf827129151e6c680317b99d7b8fc1597a3e13473
397
+ sqlite3 (2.9.0-aarch64-linux-musl) sha256=56a35cb2d70779afc2ac191baf2c2148242285ecfed72f9b021218c5c4917913
398
+ sqlite3 (2.9.0-arm-linux-gnu) sha256=a19a21504b0d7c8c825fbbf37b358ae316b6bd0d0134c619874060b2eef05435
399
+ sqlite3 (2.9.0-arm-linux-musl) sha256=fca5b26197c70e3363115d3faaea34d7b2ad9c7f5fa8d8312e31b64e7556ee07
400
+ sqlite3 (2.9.0-arm64-darwin) sha256=a917bd9b84285766ff3300b7d79cd583f5a067594c8c1263e6441618c04a6ed3
401
+ sqlite3 (2.9.0-x86_64-darwin) sha256=59fe51baa3cb33c36d27ce78b4ed9360cd33ccca09498c2ae63850c97c0a6026
402
+ sqlite3 (2.9.0-x86_64-linux-gnu) sha256=72fff9bd750070ba3af695511ba5f0e0a2d8a9206f84869640b3e99dfaf3d5a5
403
+ sqlite3 (2.9.0-x86_64-linux-musl) sha256=ef716ba7a66d7deb1ccc402ac3a6d7343da17fac862793b7f0be3d2917253c90
404
+ standard (1.53.0) sha256=f3c9493385db7079d0abce6f7582f553122156997b81258cd361d3480eeacf9c
405
+ standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
406
+ standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
407
+ stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1
408
+ thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73
409
+ timeout (0.6.0) sha256=6d722ad619f96ee383a0c557ec6eb8c4ecb08af3af62098a0be5057bf00de1af
410
+ tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
411
+ tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
412
+ unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
413
+ unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
414
+ websocket-driver (0.8.0) sha256=ed0dba4b943c22f17f9a734817e808bc84cdce6a7e22045f5315aa57676d4962
415
+ websocket-extensions (0.1.5) sha256=1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241
416
+ zeitwerk (2.7.4) sha256=2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b
417
+
418
+ BUNDLED WITH
419
+ 4.0.5
@@ -0,0 +1,16 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "irb"
6
+ gem "rake", "~> 13.0"
7
+ gem "rspec", "~> 3.0"
8
+ gem "standard", ">= 1.35.1", require: false
9
+ gem "rubocop-rspec", require: false
10
+ gem "rubocop-performance", require: false
11
+ gem "lefthook", require: false
12
+ gem "appraisal", require: false
13
+ gem "simplecov", require: false
14
+ gem "rails", "~> 7.1.0"
15
+
16
+ gemspec path: "../"