pgmq-ruby 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CLAUDE.md ADDED
@@ -0,0 +1,310 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ PGMQ-Ruby is a **low-level Ruby client** for PGMQ (PostgreSQL Message Queue), analogous to how rdkafka-ruby relates to Kafka. It provides direct 1:1 wrappers for PGMQ SQL functions as a thin transport layer.
8
+
9
+ This is **NOT** a full job processing framework. Framework features (instrumentation, job processing, Rails ActiveJob, retry strategies, monitoring integrations) belong in the planned `pgmq-framework` gem.
10
+
11
+ **Key Design Principles:**
12
+ - Thin wrapper around PGMQ SQL functions (low-level primitives only)
13
+ - Thread-safe connection pooling (transport layer)
14
+ - PostgreSQL transaction support (database primitive, not framework abstraction)
15
+ - Framework-agnostic (works with Rails, Sinatra, plain Ruby)
16
+ - Minimal dependencies (only `pg` and `connection_pool`)
17
+ - No instrumentation/observability layer (framework concern)
18
+
19
+ ## Development Commands
20
+
21
+ ### Testing
22
+
23
+ ```bash
24
+ # Start PostgreSQL with PGMQ extension (required for tests)
25
+ docker compose up -d
26
+
27
+ # Run all tests
28
+ bundle exec rspec
29
+
30
+ # Run specific test file
31
+ bundle exec rspec spec/unit/client_spec.rb
32
+
33
+ # Run integration tests only
34
+ bundle exec rspec spec/integration
35
+
36
+ # Run single test by line number
37
+ bundle exec rspec spec/unit/client_spec.rb:42
38
+ ```
39
+
40
+ **Important:** PostgreSQL runs on port **5433** locally (see docker-compose.yml) to avoid conflicts with system PostgreSQL. Tests use this port automatically.
41
+
42
+ ### Code Quality
43
+
44
+ ```bash
45
+ # Run tests
46
+ bundle exec rspec
47
+ ```
48
+
49
+
50
+ ### Interactive Development
51
+
52
+ ```bash
53
+ # Start IRB console with PGMQ loaded
54
+ bundle exec bin/console
55
+
56
+ # Console automatically connects to test database at localhost:5433
57
+ ```
58
+
59
+ ## Architecture
60
+
61
+ ### Core Components
62
+
63
+ 1. **PGMQ::Client** (`lib/pgmq/client.rb`)
64
+ - Main interface for all PGMQ operations (modular architecture, ~130 lines)
65
+ - Delegates connection management to PGMQ::Connection
66
+ - Validates queue names (48 char max, PostgreSQL identifier rules)
67
+ - Composed of 8 functional modules for separation of concerns:
68
+ - **Transaction** (`lib/pgmq/transaction.rb`) - PostgreSQL transaction support
69
+ - **QueueManagement** (`lib/pgmq/client/queue_management.rb`) - Queue lifecycle (create, drop, list)
70
+ - **Producer** (`lib/pgmq/client/producer.rb`) - Message sending operations
71
+ - **Consumer** (`lib/pgmq/client/consumer.rb`) - Single-queue reading operations
72
+ - **MultiQueue** (`lib/pgmq/client/multi_queue.rb`) - Multi-queue operations (UNION ALL)
73
+ - **MessageLifecycle** (`lib/pgmq/client/message_lifecycle.rb`) - Message state transitions (pop, delete, archive, set_vt)
74
+ - **Maintenance** (`lib/pgmq/client/maintenance.rb`) - Queue maintenance (purge, notifications)
75
+ - **Metrics** (`lib/pgmq/client/metrics.rb`) - Monitoring and metrics
76
+ - Benefits: Each module can be tested independently, easier maintenance, clear separation of concerns
77
+ - Pattern inspired by Waterdrop's modular client architecture
78
+
79
+ 2. **PGMQ::Connection** (`lib/pgmq/connection.rb`)
80
+ - Thread-safe connection pooling using `connection_pool` gem
81
+ - Supports multiple connection strategies:
82
+ - Connection strings: `postgres://user:pass@host/db`
83
+ - Hash parameters: `{ host:, port:, dbname:, user:, password: }`
84
+ - Callables (for Rails): `-> { ActiveRecord::Base.connection.raw_connection }`
85
+ - Auto-reconnect on connection failures (configurable)
86
+ - Connection health checks before use
87
+ - Note: Connection parameters are required - users should manage ENV variables themselves using `ENV.fetch`
88
+
89
+ 3. **PGMQ::Transaction** (`lib/pgmq/transaction.rb`)
90
+ - Low-level PostgreSQL transaction support (database primitive)
91
+ - Wraps PostgreSQL's native transactions (NOT a framework abstraction)
92
+ - Analogous to rdkafka-ruby providing Kafka transaction support
93
+ - Mixin providing `client.transaction do |txn|` support
94
+ - Enables atomic operations across multiple queues
95
+ - Rolls back automatically on errors
96
+
97
+ 4. **Models**
98
+ - **PGMQ::Message** - Represents queue messages with `msg_id`, `message` (raw JSONB), `read_ct`, `enqueued_at`, `vt`, `queue_name` (for multi-queue ops)
99
+ - **PGMQ::Metrics** - Queue metrics (length, age, total messages)
100
+ - **PGMQ::QueueMetadata** - Queue information (name, creation time)
101
+
102
+ ### Connection Pooling Details
103
+
104
+ - Default pool size: 5 connections
105
+ - Default timeout: 5 seconds
106
+ - Fiber-aware (works with Ruby 3.0+ Fiber Scheduler)
107
+ - Auto-reconnect enabled by default (can be disabled)
108
+ - Connection health verified before each use (if auto-reconnect enabled)
109
+
110
+ ### Error Hierarchy
111
+
112
+ ```
113
+ PGMQ::Errors::BaseError (StandardError)
114
+ ├── PGMQ::Errors::ConnectionError
115
+ ├── PGMQ::Errors::QueueNotFoundError
116
+ ├── PGMQ::Errors::MessageNotFoundError
117
+ ├── PGMQ::Errors::SerializationError
118
+ ├── PGMQ::Errors::ConfigurationError
119
+ └── PGMQ::Errors::InvalidQueueNameError
120
+ ```
121
+
122
+ ### Queue Name Validation
123
+
124
+ - Maximum 48 characters (PGMQ limitation for table prefixes)
125
+ - Must start with letter or underscore
126
+ - Only letters, digits, underscores allowed
127
+ - Case-sensitive
128
+ - Validated in `Client#validate_queue_name!`
129
+
130
+ ### Modular Architecture Pattern
131
+
132
+ The Client class follows Waterdrop's modular architecture pattern for better maintainability:
133
+
134
+ **Structure:**
135
+ - Small core `Client` class (~130 lines) that includes functional modules
136
+ - Each module focuses on a single domain area (queue management, producer, consumer, etc.)
137
+ - Modules access parent class helpers (`validate_queue_name!`, `with_connection`)
138
+ - Complete backward compatibility - no API changes
139
+
140
+ **Benefits:**
141
+ - **Testability**: Each module can be tested independently
142
+ - **Maintainability**: Smaller files, clearer boundaries (largest file ~210 lines)
143
+ - **Discoverability**: Logical grouping makes finding methods easier
144
+ - **Extensibility**: New modules can be added without bloating the core class
145
+
146
+ **Module Organization:**
147
+ 1. Transaction support (existing mixin)
148
+ 2. Queue lifecycle operations (create, drop, list)
149
+ 3. Message production (sending)
150
+ 4. Single-queue consumption (reading)
151
+ 5. Multi-queue operations (efficient polling across queues)
152
+ 6. Message lifecycle (pop, delete, archive, visibility timeout)
153
+ 7. Maintenance operations (purge, detach archive)
154
+ 8. Metrics and monitoring
155
+
156
+ All modules are automatically loaded via Zeitwerk.
157
+
158
+ ## Common Patterns
159
+
160
+ ### Client Initialization
161
+
162
+ ```ruby
163
+ # Connection string (preferred)
164
+ client = PGMQ::Client.new('postgres://localhost:5433/pgmq_test')
165
+
166
+ # Connection hash
167
+ client = PGMQ::Client.new(
168
+ host: 'localhost',
169
+ port: 5433,
170
+ dbname: 'pgmq_test',
171
+ user: 'postgres',
172
+ password: 'postgres'
173
+ )
174
+
175
+ # Connection hash using ENV variables (user manages ENV themselves)
176
+ client = PGMQ::Client.new(
177
+ host: ENV.fetch('PG_HOST', 'localhost'),
178
+ port: ENV.fetch('PG_PORT', 5432).to_i,
179
+ dbname: ENV.fetch('PG_DATABASE', 'pgmq'),
180
+ user: ENV.fetch('PG_USER', 'postgres'),
181
+ password: ENV.fetch('PG_PASSWORD', 'postgres')
182
+ )
183
+
184
+ # Rails integration (reuses Rails connection pool)
185
+ client = PGMQ::Client.new(-> { ActiveRecord::Base.connection.raw_connection })
186
+
187
+ # Custom pool configuration
188
+ client = PGMQ::Client.new(
189
+ 'postgres://localhost/db',
190
+ pool_size: 10,
191
+ pool_timeout: 10,
192
+ auto_reconnect: false
193
+ )
194
+ ```
195
+
196
+ ### Transaction Pattern
197
+
198
+ ```ruby
199
+ # Atomic operations across queues
200
+ client.transaction do |txn|
201
+ msg = txn.read('pending', vt: 30)
202
+ if msg
203
+ txn.produce('processed', msg.payload)
204
+ txn.delete('pending', msg.msg_id)
205
+ end
206
+ end
207
+ ```
208
+
209
+ ### Long Polling Pattern
210
+
211
+ ```ruby
212
+ # Efficient message consumption
213
+ loop do
214
+ msg = client.read_with_poll('orders',
215
+ vt: 30,
216
+ max_poll_seconds: 5,
217
+ poll_interval_ms: 100
218
+ )
219
+ break unless msg
220
+
221
+ process(msg)
222
+ client.delete('orders', msg.msg_id)
223
+ end
224
+ ```
225
+
226
+ ## Testing Guidelines
227
+
228
+ ### Test Structure
229
+
230
+ - **Unit tests** (`spec/unit/`) - Test classes in isolation, mock database
231
+ - **Integration tests** (`spec/integration/`) - Test full workflow with real PostgreSQL
232
+
233
+ ### Test Helpers
234
+
235
+ Located in `spec/support/database_helpers.rb`:
236
+ - Database cleanup between tests
237
+ - Connection helpers
238
+ - Common test utilities
239
+
240
+ ### Coverage Requirements
241
+
242
+ - Minimum overall coverage: 80%
243
+ - Minimum per-file coverage: 70%
244
+ - SimpleCov configured in `spec/spec_helper.rb`
245
+
246
+ ### Writing Tests
247
+
248
+ - Use descriptive test names
249
+ - Follow AAA pattern (Arrange, Act, Assert)
250
+ - Mock external dependencies in unit tests
251
+ - Use real database for integration tests
252
+ - Clean up queues in `after` blocks
253
+
254
+ ## Code Style
255
+
256
+ - Ruby 3.2+ syntax
257
+ - Frozen string literals (`# frozen_string_literal: true`)
258
+ - Max line length: 120 characters (except specs/gemspec)
259
+ - YARD documentation for public methods
260
+ - Single quotes for strings (unless interpolation needed)
261
+
262
+ ## CI/CD
263
+
264
+ GitHub Actions workflows in `.github/workflows/`:
265
+ - **ci.yml** - Runs RSpec on all Ruby versions (3.2, 3.3, 3.4, 3.5)
266
+ - **push.yml** - Additional checks on push
267
+
268
+ ## Dependencies
269
+
270
+ **Runtime:**
271
+ - `pg` (~> 1.5) - PostgreSQL adapter
272
+ - `connection_pool` (~> 2.4) - Thread-safe connection pooling
273
+
274
+ **Development:**
275
+ - `rspec` - Testing framework
276
+ - `simplecov` - Code coverage
277
+ - `pry` / `pry-byebug` - Debugging tools
278
+
279
+
280
+ ## Version Information
281
+
282
+ - Minimum Ruby: 3.2.0
283
+ - Supported PostgreSQL: 14-18 with PGMQ extension
284
+ - License: LGPL-3.0
285
+
286
+ ## Important Files
287
+
288
+ ### Core Library Structure
289
+ - `lib/pgmq/client.rb` - Main public API (~130 lines, includes all modules)
290
+ - `lib/pgmq/client/` - Client functional modules directory:
291
+ - `queue_management.rb` - Queue lifecycle operations (~100 lines)
292
+ - `producer.rb` - Message sending (~70 lines)
293
+ - `consumer.rb` - Single-queue reading (~140 lines)
294
+ - `multi_queue.rb` - Multi-queue operations (~200 lines)
295
+ - `message_lifecycle.rb` - Message state transitions (~210 lines)
296
+ - `maintenance.rb` - Queue maintenance (~30 lines)
297
+ - `metrics.rb` - Monitoring (~40 lines)
298
+ - `lib/pgmq/connection.rb` - Connection pooling and management
299
+ - `lib/pgmq/transaction.rb` - Transaction support
300
+ - `lib/pgmq/message.rb` - Message model (Data class)
301
+ - `lib/pgmq/metrics.rb` - Metrics model
302
+ - `lib/pgmq/queue_metadata.rb` - Queue metadata model
303
+
304
+ ### Documentation & Testing
305
+ - `spec/spec_helper.rb` - RSpec configuration + SimpleCov setup
306
+ - `spec/integration/` - Integration tests with real PostgreSQL
307
+ - `spec/unit/` - Unit tests for individual components
308
+ - `DEVELOPMENT.md` - Comprehensive development documentation
309
+ - `README.md` - User-facing documentation with all API examples
310
+ - `CLAUDE.md` - AI assistant guidance (this file)
data/Gemfile CHANGED
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source 'https://rubygems.org'
3
+ source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
6
 
7
7
  group :development, :test do
8
- gem 'rake'
9
- gem 'rspec'
10
- gem 'yard-lint'
8
+ gem "rake"
9
+ gem "rspec"
10
+ gem "async", "~> 2.6" # Fiber Scheduler for concurrent I/O testing
11
11
  end
12
12
 
13
13
  group :test do
14
- gem 'simplecov', require: false
14
+ gem "simplecov", require: false
15
15
  end
data/Gemfile.lint ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Documentation linting
6
+ gem "yard-lint"
7
+
8
+ # Code style (StandardRB via RuboCop)
9
+ gem "standard"
10
+ gem "standard-performance"
11
+ gem "rubocop-performance"
12
+ gem "rubocop-rspec"
13
+ gem "standard-rspec"
14
+ gem "rubocop-capybara"
15
+ gem "rubocop-factory_bot"
16
+ gem "rubocop-rspec_rails"
data/Gemfile.lint.lock ADDED
@@ -0,0 +1,120 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ ast (2.4.3)
5
+ json (2.18.1)
6
+ language_server-protocol (3.17.0.5)
7
+ lint_roller (1.1.0)
8
+ parallel (1.27.0)
9
+ parser (3.3.10.2)
10
+ ast (~> 2.4.1)
11
+ racc
12
+ prism (1.9.0)
13
+ racc (1.8.1)
14
+ rainbow (3.1.1)
15
+ regexp_parser (2.11.3)
16
+ rubocop (1.84.2)
17
+ json (~> 2.3)
18
+ language_server-protocol (~> 3.17.0.2)
19
+ lint_roller (~> 1.1.0)
20
+ parallel (~> 1.10)
21
+ parser (>= 3.3.0.2)
22
+ rainbow (>= 2.2.2, < 4.0)
23
+ regexp_parser (>= 2.9.3, < 3.0)
24
+ rubocop-ast (>= 1.49.0, < 2.0)
25
+ ruby-progressbar (~> 1.7)
26
+ unicode-display_width (>= 2.4.0, < 4.0)
27
+ rubocop-ast (1.49.0)
28
+ parser (>= 3.3.7.2)
29
+ prism (~> 1.7)
30
+ rubocop-capybara (2.22.1)
31
+ lint_roller (~> 1.1)
32
+ rubocop (~> 1.72, >= 1.72.1)
33
+ rubocop-factory_bot (2.28.0)
34
+ lint_roller (~> 1.1)
35
+ rubocop (~> 1.72, >= 1.72.1)
36
+ rubocop-performance (1.26.1)
37
+ lint_roller (~> 1.1)
38
+ rubocop (>= 1.75.0, < 2.0)
39
+ rubocop-ast (>= 1.47.1, < 2.0)
40
+ rubocop-rspec (3.9.0)
41
+ lint_roller (~> 1.1)
42
+ rubocop (~> 1.81)
43
+ rubocop-rspec_rails (2.32.0)
44
+ lint_roller (~> 1.1)
45
+ rubocop (~> 1.72, >= 1.72.1)
46
+ rubocop-rspec (~> 3.5)
47
+ ruby-progressbar (1.13.0)
48
+ standard (1.54.0)
49
+ language_server-protocol (~> 3.17.0.2)
50
+ lint_roller (~> 1.0)
51
+ rubocop (~> 1.84.0)
52
+ standard-custom (~> 1.0.0)
53
+ standard-performance (~> 1.8)
54
+ standard-custom (1.0.2)
55
+ lint_roller (~> 1.0)
56
+ rubocop (~> 1.50)
57
+ standard-performance (1.9.0)
58
+ lint_roller (~> 1.1)
59
+ rubocop-performance (~> 1.26.0)
60
+ standard-rspec (0.4.0)
61
+ lint_roller (>= 1.0)
62
+ rubocop-capybara (~> 2.22)
63
+ rubocop-factory_bot (~> 2.27)
64
+ rubocop-rspec (~> 3.9)
65
+ rubocop-rspec_rails (~> 2.31)
66
+ unicode-display_width (3.2.0)
67
+ unicode-emoji (~> 4.1)
68
+ unicode-emoji (4.2.0)
69
+ yard (0.9.38)
70
+ yard-lint (1.4.0)
71
+ yard (~> 0.9)
72
+ zeitwerk (~> 2.6)
73
+ zeitwerk (2.7.4)
74
+
75
+ PLATFORMS
76
+ ruby
77
+ x86_64-linux
78
+
79
+ DEPENDENCIES
80
+ rubocop-capybara
81
+ rubocop-factory_bot
82
+ rubocop-performance
83
+ rubocop-rspec
84
+ rubocop-rspec_rails
85
+ standard
86
+ standard-performance
87
+ standard-rspec
88
+ yard-lint
89
+
90
+ CHECKSUMS
91
+ ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
92
+ json (2.18.1) sha256=fe112755501b8d0466b5ada6cf50c8c3f41e897fa128ac5d263ec09eedc9f986
93
+ language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
94
+ lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
95
+ parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130
96
+ parser (3.3.10.2) sha256=6f60c84aa4bdcedb6d1a2434b738fe8a8136807b6adc8f7f53b97da9bc4e9357
97
+ prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
98
+ racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
99
+ rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
100
+ regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4
101
+ rubocop (1.84.2) sha256=5692cea54168f3dc8cb79a6fe95c5424b7ea893c707ad7a4307b0585e88dbf5f
102
+ rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd
103
+ rubocop-capybara (2.22.1) sha256=ced88caef23efea53f46e098ff352f8fc1068c649606ca75cb74650970f51c0c
104
+ rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb
105
+ rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
106
+ rubocop-rspec (3.9.0) sha256=8fa70a3619408237d789aeecfb9beef40576acc855173e60939d63332fdb55e2
107
+ rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100
108
+ ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
109
+ standard (1.54.0) sha256=7a4b08f83d9893083c8f03bc486f0feeb6a84d48233b40829c03ef4767ea0100
110
+ standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
111
+ standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
112
+ standard-rspec (0.4.0) sha256=0fdf64c887cd6404f1c3a1435b14ba6fde2e9e80c0f4dafe4b04a67f673db262
113
+ unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
114
+ unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
115
+ yard (0.9.38) sha256=721fb82afb10532aa49860655f6cc2eaa7130889df291b052e1e6b268283010f
116
+ yard-lint (1.4.0) sha256=7dd88fbb08fd77cb840bea899d58812817b36d92291b5693dd0eeb3af9f91f0f
117
+ zeitwerk (2.7.4) sha256=2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b
118
+
119
+ BUNDLED WITH
120
+ 4.0.3
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pgmq-ruby (0.3.0)
4
+ pgmq-ruby (0.5.0)
5
5
  connection_pool (~> 2.4)
6
6
  pg (~> 1.5)
7
7
  zeitwerk (~> 2.6)
@@ -9,9 +9,26 @@ PATH
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
+ async (2.36.0)
13
+ console (~> 1.29)
14
+ fiber-annotation
15
+ io-event (~> 1.11)
16
+ metrics (~> 0.12)
17
+ traces (~> 0.18)
12
18
  connection_pool (2.5.4)
19
+ console (1.34.3)
20
+ fiber-annotation
21
+ fiber-local (~> 1.1)
22
+ json
13
23
  diff-lcs (1.6.2)
14
24
  docile (1.4.1)
25
+ fiber-annotation (0.2.0)
26
+ fiber-local (1.1.0)
27
+ fiber-storage
28
+ fiber-storage (1.0.1)
29
+ io-event (1.14.2)
30
+ json (2.18.1)
31
+ metrics (0.15.0)
15
32
  pg (1.6.2)
16
33
  pg (1.6.2-aarch64-linux)
17
34
  pg (1.6.2-aarch64-linux-musl)
@@ -39,10 +56,7 @@ GEM
39
56
  simplecov_json_formatter (~> 0.1)
40
57
  simplecov-html (0.13.2)
41
58
  simplecov_json_formatter (0.1.4)
42
- yard (0.9.37)
43
- yard-lint (1.2.3)
44
- yard (~> 0.9)
45
- zeitwerk (~> 2.6)
59
+ traces (0.18.2)
46
60
  zeitwerk (2.7.3)
47
61
 
48
62
  PLATFORMS
@@ -55,11 +69,11 @@ PLATFORMS
55
69
  x86_64-linux-musl
56
70
 
57
71
  DEPENDENCIES
72
+ async (~> 2.6)
58
73
  pgmq-ruby!
59
74
  rake
60
75
  rspec
61
76
  simplecov
62
- yard-lint
63
77
 
64
78
  BUNDLED WITH
65
79
  2.7.2