active_subscriber 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: '08f3097b061295b4d01fdc6d527cb57c3305abcffd7e0b1a24c8b4124327e3a3'
4
+ data.tar.gz: c844b38c89b0c48b8b7be6ba25d943f86a8d6210505ffb8193a0dbb2f1c5fce4
5
+ SHA512:
6
+ metadata.gz: d554add5eef74326f58c6fc244db11b07ebb069f196b84c8ce54d9fa6a69df101eccb3f486a036ac63beff055e02ad7a83d5510903814202b893f2ab2c415762
7
+ data.tar.gz: dc184ec881bbd3d4d84b0d1fe502628342779a0359de9f40e98268e858650408fef234a83546504216fe58c685ec96e4815283021754ccf74cf0098d9eadaac5
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/CHANGELOG.md ADDED
@@ -0,0 +1,35 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.0] - 2025-06-03
11
+
12
+ ### Added
13
+
14
+ - Initial release of ActiveSubscriber
15
+ - Publisher module for publishing events using ActiveSupport::Notifications
16
+ - Base subscriber class with DSL for event subscription
17
+ - Support for specific event subscription and pattern matching
18
+ - Lifecycle callbacks (before, after, around)
19
+ - Rails engine integration with automatic subscriber loading
20
+ - AnalyticsHelper for controllers
21
+ - Generators for installation and subscriber creation
22
+ - Configuration system with minimal options
23
+ - Thread-safe subscriber registry
24
+ - Automatic method dispatch based on event names
25
+ - Error handling and logging
26
+ - Comprehensive documentation and examples
27
+
28
+ ### Features
29
+
30
+ - Auto-loading of subscribers from `app/subscribers/` directory
31
+ - Support for custom subscriber paths
32
+ - Event filtering capabilities
33
+ - Timing wrapper methods for performance tracking
34
+ - Rails integration with proper autoloading and reloading
35
+ - Generator templates for easy setup
@@ -0,0 +1,275 @@
1
+ # ActiveSubscriber Gem Development Plan
2
+
3
+ ## Overview
4
+
5
+ Building a Rails engine that implements a pub/sub pattern using ActiveSupport Notifications, providing a clean interface for event publishing and subscribing with automatic subscriber discovery and minimal configuration.
6
+
7
+ ## Architecture Design
8
+
9
+ ```mermaid
10
+ graph TB
11
+ A[Rails Application] --> B[ActiveSubscriber Engine]
12
+ B --> C[Publisher Module]
13
+ B --> D[Base Subscriber Class]
14
+ B --> E[Helper Modules]
15
+ B --> F[Auto-loader]
16
+ B --> G[Configuration]
17
+
18
+ C --> H[ActiveSupport::Notifications]
19
+ D --> H
20
+ F --> I[app/subscribers/]
21
+ F --> J[Custom Paths]
22
+
23
+ K[Controllers] --> E
24
+ L[Services] --> C
25
+ M[Subscribers] --> D
26
+ ```
27
+
28
+ ## Gem Structure
29
+
30
+ ```
31
+ active_subscriber/
32
+ ├── lib/
33
+ │ ├── active_subscriber.rb # Main entry point
34
+ │ ├── active_subscriber/
35
+ │ │ ├── engine.rb # Rails engine
36
+ │ │ ├── version.rb # Version constant
37
+ │ │ ├── configuration.rb # Configuration class
38
+ │ │ ├── publisher.rb # Publisher module
39
+ │ │ ├── base.rb # Base subscriber class
40
+ │ │ ├── registry.rb # Subscriber registry
41
+ │ │ ├── loader.rb # Auto-loader
42
+ │ │ └── helpers/
43
+ │ │ └── analytics_helper.rb # Controller helper
44
+ │ └── generators/
45
+ │ └── active_subscriber/
46
+ │ ├── install_generator.rb # Installation generator
47
+ │ └── subscriber_generator.rb # Subscriber generator
48
+ ├── app/
49
+ │ └── subscribers/ # Default subscriber location
50
+ ├── config/
51
+ │ └── initializers/
52
+ │ └── active_subscriber.rb # Default configuration
53
+ ├── active_subscriber.gemspec
54
+ ├── Gemfile
55
+ ├── README.md
56
+ └── spec/ # Test suite
57
+ ```
58
+
59
+ ## Core Components
60
+
61
+ ### 1. Engine Setup (`lib/active_subscriber/engine.rb`)
62
+
63
+ - Rails engine that integrates with Rails application lifecycle
64
+ - Handles auto-loading of subscribers from `app/subscribers/`
65
+ - Sets up initializers and configuration
66
+
67
+ ### 2. Publisher Module (`lib/active_subscriber/publisher.rb`)
68
+
69
+ - Provides `publish_event` method
70
+ - Wraps ActiveSupport::Notifications.instrument
71
+ - Handles event naming conventions and context passing
72
+
73
+ ### 3. Base Subscriber Class (`lib/active_subscriber/base.rb`)
74
+
75
+ - DSL for subscribing to events (`subscribe_to`, `subscribe_to_pattern`)
76
+ - Lifecycle callbacks (`before_handle_event`, `after_handle_event`, `around_handle_event`)
77
+ - Automatic method dispatch based on event names
78
+ - Pattern matching support for wildcard subscriptions
79
+
80
+ ### 4. Registry System (`lib/active_subscriber/registry.rb`)
81
+
82
+ - Tracks all registered subscribers
83
+ - Manages event subscriptions
84
+ - Handles subscriber lifecycle
85
+
86
+ ### 5. Auto-loader (`lib/active_subscriber/loader.rb`)
87
+
88
+ - Scans `app/subscribers/` directory
89
+ - Loads subscriber classes automatically
90
+ - Supports custom paths through configuration
91
+
92
+ ### 6. Configuration (`lib/active_subscriber/configuration.rb`)
93
+
94
+ - Enable/disable functionality
95
+ - Basic event filtering
96
+ - Custom subscriber paths
97
+ - Minimal, focused options
98
+
99
+ ## Implementation Plan
100
+
101
+ ### Phase 1: Core Infrastructure
102
+
103
+ 1. **Gem Setup**
104
+
105
+ - Create gemspec with Rails engine dependencies
106
+ - Set up basic file structure
107
+ - Configure RSpec for testing
108
+
109
+ 2. **Engine Foundation**
110
+
111
+ - Implement Rails engine class
112
+ - Set up auto-loading hooks
113
+ - Create basic configuration system
114
+
115
+ 3. **Publisher Module**
116
+ - Implement event publishing interface
117
+ - Add context handling
118
+ - Create timing wrapper methods
119
+
120
+ ### Phase 2: Subscriber System
121
+
122
+ 1. **Base Subscriber Class**
123
+
124
+ - Implement DSL for event subscription
125
+ - Add method dispatch logic
126
+ - Create lifecycle callback system
127
+
128
+ 2. **Registry and Auto-loading**
129
+
130
+ - Build subscriber registry
131
+ - Implement auto-discovery from `app/subscribers/`
132
+ - Add support for custom paths
133
+
134
+ 3. **Pattern Matching**
135
+ - Implement regex-based event matching
136
+ - Handle wildcard subscriptions
137
+ - Optimize performance for pattern matching
138
+
139
+ ### Phase 3: Rails Integration
140
+
141
+ 1. **Helper Modules**
142
+
143
+ - Create AnalyticsHelper for controllers
144
+ - Add convenience methods for common patterns
145
+ - Integrate with Rails request lifecycle
146
+
147
+ 2. **Generators**
148
+
149
+ - Install generator for initial setup
150
+ - Subscriber generator for creating new subscribers
151
+ - Configuration templates
152
+
153
+ 3. **Initializers**
154
+ - Default configuration setup
155
+ - Auto-loading initialization
156
+ - Integration with Rails boot process
157
+
158
+ ### Phase 4: Testing and Documentation
159
+
160
+ 1. **Comprehensive Test Suite**
161
+
162
+ - Unit tests for all components
163
+ - Integration tests with Rails
164
+ - Performance benchmarks
165
+
166
+ 2. **Documentation**
167
+ - README with usage examples
168
+ - API documentation
169
+ - Rails integration guide
170
+
171
+ ## Key Features
172
+
173
+ ### Event Publishing
174
+
175
+ ```ruby
176
+ class AnalyticsService
177
+ include ActiveSubscriber::Publisher
178
+
179
+ def self.track_analytics(event_name, properties = {}, context: analytics_context)
180
+ publish_event(event_name, properties, context)
181
+ end
182
+ end
183
+ ```
184
+
185
+ ### Subscriber Definition
186
+
187
+ ```ruby
188
+ class LoggingSubscriber < ActiveSubscriber::Base
189
+ subscribe_to :user_signed_in, :user_signed_up
190
+ subscribe_to_pattern "analytics.*"
191
+
192
+ after_handle_event :increment_stats
193
+
194
+ def handle_user_signed_in(context)
195
+ # Automatic method dispatch
196
+ end
197
+
198
+ def handle_all_events(event_name, context)
199
+ # Pattern-matched events
200
+ end
201
+ end
202
+ ```
203
+
204
+ ### Controller Integration
205
+
206
+ ```ruby
207
+ class PostController < ApplicationController
208
+ include ActiveSubscriber::Helpers::AnalyticsHelper
209
+
210
+ def index
211
+ @posts = Post.all
212
+ track_analytics("posts.viewed", { count: @posts.count })
213
+ end
214
+ end
215
+ ```
216
+
217
+ ## Configuration Options
218
+
219
+ ```ruby
220
+ ActiveSubscriber.configure do |config|
221
+ config.enabled = true
222
+ config.subscriber_paths = ["app/subscribers", "lib/subscribers"]
223
+ config.event_filter = ->(event_name) { !event_name.start_with?("internal.") }
224
+ config.auto_load = true
225
+ end
226
+ ```
227
+
228
+ ## Installation and Setup
229
+
230
+ 1. **Gem Installation**
231
+
232
+ ```ruby
233
+ # Gemfile
234
+ gem 'active_subscriber'
235
+ ```
236
+
237
+ 2. **Generator Usage**
238
+
239
+ ```bash
240
+ rails generate active_subscriber:install
241
+ rails generate active_subscriber:subscriber Analytics
242
+ ```
243
+
244
+ 3. **Manual Setup**
245
+ - Subscribers auto-loaded from `app/subscribers/`
246
+ - Include modules where needed
247
+ - Configure through initializer if customization needed
248
+
249
+ ## Technical Considerations
250
+
251
+ ### Performance
252
+
253
+ - Lazy loading of subscribers to minimize boot time impact
254
+ - Efficient pattern matching using compiled regex
255
+ - Minimal overhead for event publishing
256
+
257
+ ### Error Handling
258
+
259
+ - Graceful degradation when subscribers fail
260
+ - Configurable error handling strategies
261
+ - Logging of subscription and event processing errors
262
+
263
+ ### Thread Safety
264
+
265
+ - Thread-safe subscriber registry
266
+ - Proper handling of concurrent event processing
267
+ - No shared mutable state in core components
268
+
269
+ ### Rails Integration
270
+
271
+ - Respect Rails autoloading and reloading in development
272
+ - Integration with Rails logging system
273
+ - Proper cleanup during application shutdown
274
+
275
+ This plan provides a solid foundation for building a Rails-integrated pub/sub system that's easy to use, well-integrated with Rails conventions, and focused on the core functionality outlined in the requirements.
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in active_subscriber.gemspec
6
+ gemspec
7
+
8
+ gem 'rake', '~> 13.0'
9
+ gem 'rspec', '~> 3.0'
10
+ gem 'rspec-rails', '~> 5.0'
11
+ gem 'rubocop', '~> 1.21'
12
+ gem 'rubocop-rails', '~> 2.0'
13
+ gem 'rubocop-rspec', '~> 2.0'
14
+
15
+ # For testing with Rails
16
+ gem 'rails', '>= 8.0'
17
+ gem 'sqlite3', '>= 1.4'
data/Gemfile.lock ADDED
@@ -0,0 +1,304 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ active_subscriber (0.1.0)
5
+ activesupport (>= 6.0)
6
+ rails (>= 6.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ actioncable (8.0.2)
12
+ actionpack (= 8.0.2)
13
+ activesupport (= 8.0.2)
14
+ nio4r (~> 2.0)
15
+ websocket-driver (>= 0.6.1)
16
+ zeitwerk (~> 2.6)
17
+ actionmailbox (8.0.2)
18
+ actionpack (= 8.0.2)
19
+ activejob (= 8.0.2)
20
+ activerecord (= 8.0.2)
21
+ activestorage (= 8.0.2)
22
+ activesupport (= 8.0.2)
23
+ mail (>= 2.8.0)
24
+ actionmailer (8.0.2)
25
+ actionpack (= 8.0.2)
26
+ actionview (= 8.0.2)
27
+ activejob (= 8.0.2)
28
+ activesupport (= 8.0.2)
29
+ mail (>= 2.8.0)
30
+ rails-dom-testing (~> 2.2)
31
+ actionpack (8.0.2)
32
+ actionview (= 8.0.2)
33
+ activesupport (= 8.0.2)
34
+ nokogiri (>= 1.8.5)
35
+ rack (>= 2.2.4)
36
+ rack-session (>= 1.0.1)
37
+ rack-test (>= 0.6.3)
38
+ rails-dom-testing (~> 2.2)
39
+ rails-html-sanitizer (~> 1.6)
40
+ useragent (~> 0.16)
41
+ actiontext (8.0.2)
42
+ actionpack (= 8.0.2)
43
+ activerecord (= 8.0.2)
44
+ activestorage (= 8.0.2)
45
+ activesupport (= 8.0.2)
46
+ globalid (>= 0.6.0)
47
+ nokogiri (>= 1.8.5)
48
+ actionview (8.0.2)
49
+ activesupport (= 8.0.2)
50
+ builder (~> 3.1)
51
+ erubi (~> 1.11)
52
+ rails-dom-testing (~> 2.2)
53
+ rails-html-sanitizer (~> 1.6)
54
+ activejob (8.0.2)
55
+ activesupport (= 8.0.2)
56
+ globalid (>= 0.3.6)
57
+ activemodel (8.0.2)
58
+ activesupport (= 8.0.2)
59
+ activerecord (8.0.2)
60
+ activemodel (= 8.0.2)
61
+ activesupport (= 8.0.2)
62
+ timeout (>= 0.4.0)
63
+ activestorage (8.0.2)
64
+ actionpack (= 8.0.2)
65
+ activejob (= 8.0.2)
66
+ activerecord (= 8.0.2)
67
+ activesupport (= 8.0.2)
68
+ marcel (~> 1.0)
69
+ activesupport (8.0.2)
70
+ base64
71
+ benchmark (>= 0.3)
72
+ bigdecimal
73
+ concurrent-ruby (~> 1.0, >= 1.3.1)
74
+ connection_pool (>= 2.2.5)
75
+ drb
76
+ i18n (>= 1.6, < 2)
77
+ logger (>= 1.4.2)
78
+ minitest (>= 5.1)
79
+ securerandom (>= 0.3)
80
+ tzinfo (~> 2.0, >= 2.0.5)
81
+ uri (>= 0.13.1)
82
+ ast (2.4.3)
83
+ base64 (0.3.0)
84
+ benchmark (0.4.1)
85
+ bigdecimal (3.2.1)
86
+ builder (3.3.0)
87
+ concurrent-ruby (1.3.5)
88
+ connection_pool (2.5.3)
89
+ crass (1.0.6)
90
+ date (3.4.1)
91
+ diff-lcs (1.6.2)
92
+ drb (2.2.3)
93
+ erb (5.0.1)
94
+ erubi (1.13.1)
95
+ globalid (1.2.1)
96
+ activesupport (>= 6.1)
97
+ i18n (1.14.7)
98
+ concurrent-ruby (~> 1.0)
99
+ io-console (0.8.0)
100
+ irb (1.15.2)
101
+ pp (>= 0.6.0)
102
+ rdoc (>= 4.0.0)
103
+ reline (>= 0.4.2)
104
+ json (2.12.2)
105
+ language_server-protocol (3.17.0.5)
106
+ lint_roller (1.1.0)
107
+ logger (1.7.0)
108
+ loofah (2.24.1)
109
+ crass (~> 1.0.2)
110
+ nokogiri (>= 1.12.0)
111
+ mail (2.8.1)
112
+ mini_mime (>= 0.1.1)
113
+ net-imap
114
+ net-pop
115
+ net-smtp
116
+ marcel (1.0.4)
117
+ mini_mime (1.1.5)
118
+ minitest (5.27.0)
119
+ net-imap (0.5.8)
120
+ date
121
+ net-protocol
122
+ net-pop (0.1.2)
123
+ net-protocol
124
+ net-protocol (0.2.2)
125
+ timeout
126
+ net-smtp (0.5.1)
127
+ net-protocol
128
+ nio4r (2.7.4)
129
+ nokogiri (1.19.0-aarch64-linux-gnu)
130
+ racc (~> 1.4)
131
+ nokogiri (1.19.0-aarch64-linux-musl)
132
+ racc (~> 1.4)
133
+ nokogiri (1.19.0-arm-linux-gnu)
134
+ racc (~> 1.4)
135
+ nokogiri (1.19.0-arm-linux-musl)
136
+ racc (~> 1.4)
137
+ nokogiri (1.19.0-arm64-darwin)
138
+ racc (~> 1.4)
139
+ nokogiri (1.19.0-x86_64-darwin)
140
+ racc (~> 1.4)
141
+ nokogiri (1.19.0-x86_64-linux-gnu)
142
+ racc (~> 1.4)
143
+ nokogiri (1.19.0-x86_64-linux-musl)
144
+ racc (~> 1.4)
145
+ parallel (1.27.0)
146
+ parser (3.3.8.0)
147
+ ast (~> 2.4.1)
148
+ racc
149
+ pp (0.6.2)
150
+ prettyprint
151
+ prettyprint (0.2.0)
152
+ prism (1.4.0)
153
+ psych (5.2.6)
154
+ date
155
+ stringio
156
+ racc (1.8.1)
157
+ rack (3.1.15)
158
+ rack-session (2.1.1)
159
+ base64 (>= 0.1.0)
160
+ rack (>= 3.0.0)
161
+ rack-test (2.2.0)
162
+ rack (>= 1.3)
163
+ rackup (2.2.1)
164
+ rack (>= 3)
165
+ rails (8.0.2)
166
+ actioncable (= 8.0.2)
167
+ actionmailbox (= 8.0.2)
168
+ actionmailer (= 8.0.2)
169
+ actionpack (= 8.0.2)
170
+ actiontext (= 8.0.2)
171
+ actionview (= 8.0.2)
172
+ activejob (= 8.0.2)
173
+ activemodel (= 8.0.2)
174
+ activerecord (= 8.0.2)
175
+ activestorage (= 8.0.2)
176
+ activesupport (= 8.0.2)
177
+ bundler (>= 1.15.0)
178
+ railties (= 8.0.2)
179
+ rails-dom-testing (2.3.0)
180
+ activesupport (>= 5.0.0)
181
+ minitest
182
+ nokogiri (>= 1.6)
183
+ rails-html-sanitizer (1.6.2)
184
+ loofah (~> 2.21)
185
+ 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)
186
+ railties (8.0.2)
187
+ actionpack (= 8.0.2)
188
+ activesupport (= 8.0.2)
189
+ irb (~> 1.13)
190
+ rackup (>= 1.0.0)
191
+ rake (>= 12.2)
192
+ thor (~> 1.0, >= 1.2.2)
193
+ zeitwerk (~> 2.6)
194
+ rainbow (3.1.1)
195
+ rake (13.3.0)
196
+ rdoc (6.14.0)
197
+ erb
198
+ psych (>= 4.0.0)
199
+ regexp_parser (2.10.0)
200
+ reline (0.6.1)
201
+ io-console (~> 0.5)
202
+ rspec (3.13.1)
203
+ rspec-core (~> 3.13.0)
204
+ rspec-expectations (~> 3.13.0)
205
+ rspec-mocks (~> 3.13.0)
206
+ rspec-core (3.13.4)
207
+ rspec-support (~> 3.13.0)
208
+ rspec-expectations (3.13.5)
209
+ diff-lcs (>= 1.2.0, < 2.0)
210
+ rspec-support (~> 3.13.0)
211
+ rspec-mocks (3.13.5)
212
+ diff-lcs (>= 1.2.0, < 2.0)
213
+ rspec-support (~> 3.13.0)
214
+ rspec-rails (5.1.2)
215
+ actionpack (>= 5.2)
216
+ activesupport (>= 5.2)
217
+ railties (>= 5.2)
218
+ rspec-core (~> 3.10)
219
+ rspec-expectations (~> 3.10)
220
+ rspec-mocks (~> 3.10)
221
+ rspec-support (~> 3.10)
222
+ rspec-support (3.13.4)
223
+ rubocop (1.75.8)
224
+ json (~> 2.3)
225
+ language_server-protocol (~> 3.17.0.2)
226
+ lint_roller (~> 1.1.0)
227
+ parallel (~> 1.10)
228
+ parser (>= 3.3.0.2)
229
+ rainbow (>= 2.2.2, < 4.0)
230
+ regexp_parser (>= 2.9.3, < 3.0)
231
+ rubocop-ast (>= 1.44.0, < 2.0)
232
+ ruby-progressbar (~> 1.7)
233
+ unicode-display_width (>= 2.4.0, < 4.0)
234
+ rubocop-ast (1.45.0)
235
+ parser (>= 3.3.7.2)
236
+ prism (~> 1.4)
237
+ rubocop-capybara (2.22.1)
238
+ lint_roller (~> 1.1)
239
+ rubocop (~> 1.72, >= 1.72.1)
240
+ rubocop-factory_bot (2.27.1)
241
+ lint_roller (~> 1.1)
242
+ rubocop (~> 1.72, >= 1.72.1)
243
+ rubocop-rails (2.32.0)
244
+ activesupport (>= 4.2.0)
245
+ lint_roller (~> 1.1)
246
+ rack (>= 1.1)
247
+ rubocop (>= 1.75.0, < 2.0)
248
+ rubocop-ast (>= 1.44.0, < 2.0)
249
+ rubocop-rspec (2.31.0)
250
+ rubocop (~> 1.40)
251
+ rubocop-capybara (~> 2.17)
252
+ rubocop-factory_bot (~> 2.22)
253
+ rubocop-rspec_rails (~> 2.28)
254
+ rubocop-rspec_rails (2.29.1)
255
+ rubocop (~> 1.61)
256
+ ruby-progressbar (1.13.0)
257
+ securerandom (0.4.1)
258
+ sqlite3 (2.9.0-aarch64-linux-gnu)
259
+ sqlite3 (2.9.0-aarch64-linux-musl)
260
+ sqlite3 (2.9.0-arm-linux-gnu)
261
+ sqlite3 (2.9.0-arm-linux-musl)
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
+ stringio (3.1.7)
267
+ thor (1.3.2)
268
+ timeout (0.4.3)
269
+ tzinfo (2.0.6)
270
+ concurrent-ruby (~> 1.0)
271
+ unicode-display_width (3.1.4)
272
+ unicode-emoji (~> 4.0, >= 4.0.4)
273
+ unicode-emoji (4.2.0)
274
+ uri (1.0.3)
275
+ useragent (0.16.11)
276
+ websocket-driver (0.8.0)
277
+ base64
278
+ websocket-extensions (>= 0.1.0)
279
+ websocket-extensions (0.1.5)
280
+ zeitwerk (2.7.3)
281
+
282
+ PLATFORMS
283
+ aarch64-linux-gnu
284
+ aarch64-linux-musl
285
+ arm-linux-gnu
286
+ arm-linux-musl
287
+ arm64-darwin
288
+ x86_64-darwin
289
+ x86_64-linux-gnu
290
+ x86_64-linux-musl
291
+
292
+ DEPENDENCIES
293
+ active_subscriber!
294
+ rails (>= 8.0)
295
+ rake (~> 13.0)
296
+ rspec (~> 3.0)
297
+ rspec-rails (~> 5.0)
298
+ rubocop (~> 1.21)
299
+ rubocop-rails (~> 2.0)
300
+ rubocop-rspec (~> 2.0)
301
+ sqlite3 (>= 1.4)
302
+
303
+ BUNDLED WITH
304
+ 2.6.2