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 +7 -0
- data/.rspec +3 -0
- data/CHANGELOG.md +35 -0
- data/DEVELOPMENT_PLAN.md +275 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +304 -0
- data/INSTALLATION_GUIDE.md +193 -0
- data/LICENSE.txt +21 -0
- data/README.md +287 -0
- data/REQUIREMENTS.md +60 -0
- data/Rakefile +12 -0
- data/lib/active_subscriber/base.rb +138 -0
- data/lib/active_subscriber/configuration.rb +53 -0
- data/lib/active_subscriber/engine.rb +49 -0
- data/lib/active_subscriber/helpers/analytics_helper.rb +54 -0
- data/lib/active_subscriber/loader.rb +54 -0
- data/lib/active_subscriber/publisher.rb +107 -0
- data/lib/active_subscriber/registry.rb +125 -0
- data/lib/active_subscriber/subscriber_job.rb +24 -0
- data/lib/active_subscriber/version.rb +5 -0
- data/lib/active_subscriber.rb +52 -0
- data/lib/generators/active_subscriber/install_generator.rb +32 -0
- data/lib/generators/active_subscriber/subscriber_generator.rb +50 -0
- data/lib/generators/active_subscriber/templates/README +32 -0
- data/lib/generators/active_subscriber/templates/initializer.rb +21 -0
- data/lib/generators/active_subscriber/templates/subscriber.rb +41 -0
- metadata +128 -0
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
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
|
data/DEVELOPMENT_PLAN.md
ADDED
|
@@ -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
|