rdkafka 0.28.0 → 0.29.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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/README.md +1 -0
  4. data/dist/{librdkafka-2.14.1.tar.gz → librdkafka-2.14.2.tar.gz} +0 -0
  5. data/docker-compose-ssl.yml +1 -1
  6. data/docker-compose.yml +1 -1
  7. data/lib/rdkafka/abstract_handle.rb +31 -2
  8. data/lib/rdkafka/admin/config_binding_result.rb +2 -2
  9. data/lib/rdkafka/admin/create_acl_handle.rb +6 -5
  10. data/lib/rdkafka/admin/create_partitions_handle.rb +4 -6
  11. data/lib/rdkafka/admin/create_topic_handle.rb +4 -6
  12. data/lib/rdkafka/admin/delete_acl_handle.rb +5 -7
  13. data/lib/rdkafka/admin/delete_groups_handle.rb +4 -6
  14. data/lib/rdkafka/admin/delete_topic_handle.rb +4 -6
  15. data/lib/rdkafka/admin/describe_acl_handle.rb +5 -7
  16. data/lib/rdkafka/admin/describe_configs_handle.rb +4 -10
  17. data/lib/rdkafka/admin/describe_configs_report.rb +1 -5
  18. data/lib/rdkafka/admin/incremental_alter_configs_handle.rb +4 -10
  19. data/lib/rdkafka/admin/incremental_alter_configs_report.rb +1 -5
  20. data/lib/rdkafka/admin/list_offsets_handle.rb +5 -10
  21. data/lib/rdkafka/admin.rb +75 -43
  22. data/lib/rdkafka/bindings.rb +9 -4
  23. data/lib/rdkafka/callbacks/base_handler.rb +62 -0
  24. data/lib/rdkafka/callbacks/create_acl_handler.rb +37 -0
  25. data/lib/rdkafka/callbacks/create_partitions_handler.rb +37 -0
  26. data/lib/rdkafka/callbacks/create_topic_handler.rb +37 -0
  27. data/lib/rdkafka/callbacks/delete_acl_handler.rb +42 -0
  28. data/lib/rdkafka/callbacks/delete_groups_handler.rb +37 -0
  29. data/lib/rdkafka/callbacks/delete_topic_handler.rb +37 -0
  30. data/lib/rdkafka/callbacks/describe_acl_handler.rb +35 -0
  31. data/lib/rdkafka/callbacks/describe_configs_handler.rb +42 -0
  32. data/lib/rdkafka/callbacks/incremental_alter_configs_handler.rb +42 -0
  33. data/lib/rdkafka/callbacks/list_offsets_handler.rb +42 -0
  34. data/lib/rdkafka/callbacks.rb +50 -244
  35. data/lib/rdkafka/config.rb +45 -33
  36. data/lib/rdkafka/consumer/headers.rb +19 -5
  37. data/lib/rdkafka/consumer/partition.rb +8 -1
  38. data/lib/rdkafka/consumer/topic_partition_list.rb +44 -22
  39. data/lib/rdkafka/consumer.rb +111 -21
  40. data/lib/rdkafka/defaults.rb +19 -0
  41. data/lib/rdkafka/helpers/metadata.rb +29 -0
  42. data/lib/rdkafka/metadata.rb +86 -19
  43. data/lib/rdkafka/native_kafka.rb +2 -4
  44. data/lib/rdkafka/producer/delivery_handle.rb +3 -3
  45. data/lib/rdkafka/producer/partitions_count_cache.rb +24 -38
  46. data/lib/rdkafka/producer.rb +56 -44
  47. data/lib/rdkafka/version.rb +3 -3
  48. data/lib/rdkafka.rb +12 -0
  49. data/package-lock.json +3 -3
  50. data/rdkafka.gemspec +1 -0
  51. metadata +14 -5
  52. data/Gemfile +0 -13
  53. data/Gemfile.lint +0 -14
  54. data/Gemfile.lint.lock +0 -123
@@ -5,6 +5,7 @@ module Rdkafka
5
5
  class Producer
6
6
  include Helpers::Time
7
7
  include Helpers::OAuth
8
+ include Helpers::Metadata
8
9
 
9
10
  # @private
10
11
  @@partitions_count_cache = PartitionsCountCache.new
@@ -94,6 +95,12 @@ module Rdkafka
94
95
  )
95
96
 
96
97
  unless result == :config_ok
98
+ # rd_kafka_topic_new has not been called yet, so librdkafka has not taken
99
+ # ownership of the config. Destroy it ourselves before raising, otherwise the
100
+ # partially built rd_kafka_topic_conf_t leaks. (On the rd_kafka_topic_new path
101
+ # librdkafka frees the conf on both success and failure, so we never destroy it
102
+ # there.)
103
+ Rdkafka::Bindings.rd_kafka_topic_conf_destroy(topic_config)
97
104
  raise Config::ConfigError.new(error_buffer.read_string)
98
105
  end
99
106
  end
@@ -322,14 +329,15 @@ module Rdkafka
322
329
  end
323
330
 
324
331
  topic_metadata ? topic_metadata[:partition_count] : Rdkafka::Bindings::RD_KAFKA_PARTITION_UA
332
+ rescue Rdkafka::RdkafkaError => e
333
+ # A missing topic is an expected, cacheable outcome (the topic may be auto-created on
334
+ # produce, or simply not exist yet). Returning RD_KAFKA_PARTITION_UA from inside the block
335
+ # caches it, so we don't re-run a blocking metadata query on every produce(partition_key:)
336
+ # to that topic. Anything else is a real error and is re-raised.
337
+ raise(e) unless e.code == :unknown_topic_or_part
338
+
339
+ Rdkafka::Bindings::RD_KAFKA_PARTITION_UA
325
340
  end
326
- rescue Rdkafka::RdkafkaError => e
327
- # If the topic does not exist, it will be created or if not allowed another error will be
328
- # raised. We here return RD_KAFKA_PARTITION_UA so this can happen without early error
329
- # happening on metadata discovery.
330
- return Rdkafka::Bindings::RD_KAFKA_PARTITION_UA if e.code == :unknown_topic_or_part
331
-
332
- raise(e)
333
341
  end
334
342
 
335
343
  # Produces a message to a Kafka topic. The message is added to rdkafka's queue, call {DeliveryHandle#wait wait} on the returned delivery handle to make sure it is delivered.
@@ -410,8 +418,7 @@ module Rdkafka
410
418
  # based on the key when present.
411
419
  partition ||= Rdkafka::Bindings::RD_KAFKA_PARTITION_UA
412
420
 
413
- # If timestamp is nil use 0 and let Kafka set one. If an integer or time
414
- # use it.
421
+ # If timestamp is nil use 0 and let Kafka set one. If an integer or time use it.
415
422
  raw_timestamp = if timestamp.nil?
416
423
  0
417
424
  elsif timestamp.is_a?(Integer)
@@ -431,51 +438,55 @@ module Rdkafka
431
438
  delivery_handle[:offset] = Rdkafka::Bindings::RD_KAFKA_PARTITION_UA
432
439
  DeliveryHandle.register(delivery_handle)
433
440
 
434
- args = [
435
- :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_RKT, :pointer, topic_ref,
436
- :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_MSGFLAGS, :int, Rdkafka::Bindings::RD_KAFKA_MSG_F_COPY,
437
- :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_VALUE, :buffer_in, payload, :size_t, payload_size,
438
- :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_KEY, :buffer_in, key, :size_t, key_size,
439
- :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_PARTITION, :int32, partition,
440
- :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_TIMESTAMP, :int64, raw_timestamp,
441
- :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_OPAQUE, :pointer, delivery_handle
442
- ]
443
-
444
- headers&.each do |key0, value0|
445
- key = key0.to_s
446
- if value0.is_a?(Array)
447
- # Handle array of values per KIP-82
448
- value0.each do |value|
449
- value = value.to_s
441
+ begin
442
+ args = [
443
+ :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_RKT, :pointer, topic_ref,
444
+ :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_MSGFLAGS, :int, Rdkafka::Bindings::RD_KAFKA_MSG_F_COPY,
445
+ :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_VALUE, :buffer_in, payload, :size_t, payload_size,
446
+ :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_KEY, :buffer_in, key, :size_t, key_size,
447
+ :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_PARTITION, :int32, partition,
448
+ :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_TIMESTAMP, :int64, raw_timestamp,
449
+ :int, Rdkafka::Bindings::RD_KAFKA_VTYPE_OPAQUE, :pointer, delivery_handle
450
+ ]
451
+
452
+ headers&.each do |key0, value0|
453
+ key = key0.to_s
454
+ if value0.is_a?(Array)
455
+ # Handle array of values per KIP-82
456
+ value0.each do |value|
457
+ value = value.to_s
458
+ args << :int << Rdkafka::Bindings::RD_KAFKA_VTYPE_HEADER
459
+ args << :string << key
460
+ args << :pointer << value
461
+ args << :size_t << value.bytesize
462
+ end
463
+ else
464
+ # Handle single value
465
+ value = value0.to_s
450
466
  args << :int << Rdkafka::Bindings::RD_KAFKA_VTYPE_HEADER
451
467
  args << :string << key
452
468
  args << :pointer << value
453
469
  args << :size_t << value.bytesize
454
470
  end
455
- else
456
- # Handle single value
457
- value = value0.to_s
458
- args << :int << Rdkafka::Bindings::RD_KAFKA_VTYPE_HEADER
459
- args << :string << key
460
- args << :pointer << value
461
- args << :size_t << value.bytesize
462
471
  end
463
- end
464
472
 
465
- args << :int << Rdkafka::Bindings::RD_KAFKA_VTYPE_END
473
+ args << :int << Rdkafka::Bindings::RD_KAFKA_VTYPE_END
466
474
 
467
- # Produce the message
468
- response = @native_kafka.with_inner do |inner|
469
- Rdkafka::Bindings.rd_kafka_producev(
470
- inner,
471
- *args
472
- )
473
- end
475
+ # Produce the message
476
+ response = @native_kafka.with_inner do |inner|
477
+ Rdkafka::Bindings.rd_kafka_producev(
478
+ inner,
479
+ *args
480
+ )
481
+ end
474
482
 
475
- # Raise error if the produce call was not successful
476
- if response != Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
483
+ # Raise error if the produce call was not successful
484
+ if response != Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
485
+ raise RdkafkaError.new(response)
486
+ end
487
+ rescue Exception
477
488
  DeliveryHandle.remove(delivery_handle.to_ptr.address)
478
- raise RdkafkaError.new(response)
489
+ raise
479
490
  end
480
491
 
481
492
  delivery_handle
@@ -517,5 +528,6 @@ module Rdkafka
517
528
  def closed_producer_check(method)
518
529
  raise Rdkafka::ClosedProducerError.new(method) if closed?
519
530
  end
531
+ alias_method :closed_check, :closed_producer_check
520
532
  end
521
533
  end
@@ -2,9 +2,9 @@
2
2
 
3
3
  module Rdkafka
4
4
  # Current rdkafka-ruby gem version
5
- VERSION = "0.28.0"
5
+ VERSION = "0.29.0"
6
6
  # Target librdkafka version to be used
7
- LIBRDKAFKA_VERSION = "2.14.1"
7
+ LIBRDKAFKA_VERSION = "2.14.2"
8
8
  # SHA256 hash of the librdkafka source tarball for verification
9
- LIBRDKAFKA_SOURCE_SHA256 = "bb246e754dee3560e9b42bf4e844dc05de4b146a3cae937e36301ffacdc456e7"
9
+ LIBRDKAFKA_SOURCE_SHA256 = "d7eec9c31c817fa44402f679c252dfbf97e4c338a849a25c3579a31fd127beb8"
10
10
  end
data/lib/rdkafka.rb CHANGED
@@ -8,6 +8,7 @@ require "json"
8
8
  require "rdkafka/version"
9
9
  require "rdkafka/helpers/time"
10
10
  require "rdkafka/helpers/oauth"
11
+ require "rdkafka/helpers/metadata"
11
12
  require "rdkafka/defaults"
12
13
  require "rdkafka/abstract_handle"
13
14
  require "rdkafka/admin"
@@ -36,6 +37,17 @@ require "rdkafka/admin/config_binding_result"
36
37
  require "rdkafka/admin/config_resource_binding_result"
37
38
  require "rdkafka/bindings"
38
39
  require "rdkafka/callbacks"
40
+ require "rdkafka/callbacks/base_handler"
41
+ require "rdkafka/callbacks/create_topic_handler"
42
+ require "rdkafka/callbacks/delete_topic_handler"
43
+ require "rdkafka/callbacks/create_partitions_handler"
44
+ require "rdkafka/callbacks/delete_groups_handler"
45
+ require "rdkafka/callbacks/create_acl_handler"
46
+ require "rdkafka/callbacks/delete_acl_handler"
47
+ require "rdkafka/callbacks/describe_acl_handler"
48
+ require "rdkafka/callbacks/describe_configs_handler"
49
+ require "rdkafka/callbacks/incremental_alter_configs_handler"
50
+ require "rdkafka/callbacks/list_offsets_handler"
39
51
  require "rdkafka/config"
40
52
  require "rdkafka/consumer"
41
53
  require "rdkafka/consumer/headers"
data/package-lock.json CHANGED
@@ -286,9 +286,9 @@
286
286
  }
287
287
  },
288
288
  "node_modules/smol-toml": {
289
- "version": "1.6.1",
290
- "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz",
291
- "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==",
289
+ "version": "1.7.0",
290
+ "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz",
291
+ "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==",
292
292
  "dev": true,
293
293
  "license": "BSD-3-Clause",
294
294
  "engines": {
data/rdkafka.gemspec CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |gem|
19
19
  next true if file.start_with?(".")
20
20
  next true if file.start_with?("spec/")
21
21
  next true if file.start_with?("ext/README.md")
22
+ next true if file.start_with?("Gemfile")
22
23
 
23
24
  false
24
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdkafka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.28.0
4
+ version: 0.29.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thijs Cadier
@@ -89,14 +89,11 @@ extensions:
89
89
  extra_rdoc_files: []
90
90
  files:
91
91
  - CHANGELOG.md
92
- - Gemfile
93
- - Gemfile.lint
94
- - Gemfile.lint.lock
95
92
  - MIT-LICENSE
96
93
  - README.md
97
94
  - Rakefile
98
95
  - bin/verify_kafka_warnings
99
- - dist/librdkafka-2.14.1.tar.gz
96
+ - dist/librdkafka-2.14.2.tar.gz
100
97
  - dist/patches/rdkafka_global_init.patch
101
98
  - docker-compose-ssl.yml
102
99
  - docker-compose.yml
@@ -129,6 +126,17 @@ files:
129
126
  - lib/rdkafka/admin/list_offsets_report.rb
130
127
  - lib/rdkafka/bindings.rb
131
128
  - lib/rdkafka/callbacks.rb
129
+ - lib/rdkafka/callbacks/base_handler.rb
130
+ - lib/rdkafka/callbacks/create_acl_handler.rb
131
+ - lib/rdkafka/callbacks/create_partitions_handler.rb
132
+ - lib/rdkafka/callbacks/create_topic_handler.rb
133
+ - lib/rdkafka/callbacks/delete_acl_handler.rb
134
+ - lib/rdkafka/callbacks/delete_groups_handler.rb
135
+ - lib/rdkafka/callbacks/delete_topic_handler.rb
136
+ - lib/rdkafka/callbacks/describe_acl_handler.rb
137
+ - lib/rdkafka/callbacks/describe_configs_handler.rb
138
+ - lib/rdkafka/callbacks/incremental_alter_configs_handler.rb
139
+ - lib/rdkafka/callbacks/list_offsets_handler.rb
132
140
  - lib/rdkafka/config.rb
133
141
  - lib/rdkafka/consumer.rb
134
142
  - lib/rdkafka/consumer/headers.rb
@@ -137,6 +145,7 @@ files:
137
145
  - lib/rdkafka/consumer/topic_partition_list.rb
138
146
  - lib/rdkafka/defaults.rb
139
147
  - lib/rdkafka/error.rb
148
+ - lib/rdkafka/helpers/metadata.rb
140
149
  - lib/rdkafka/helpers/oauth.rb
141
150
  - lib/rdkafka/helpers/time.rb
142
151
  - lib/rdkafka/metadata.rb
data/Gemfile DELETED
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- gemspec
6
-
7
- group :development do
8
- gem "ostruct"
9
- gem "pry"
10
- gem "rspec"
11
- gem "simplecov"
12
- gem "warning"
13
- end
data/Gemfile.lint DELETED
@@ -1,14 +0,0 @@
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-thread_safety"
data/Gemfile.lint.lock DELETED
@@ -1,123 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- ast (2.4.3)
5
- json (2.18.0)
6
- language_server-protocol (3.17.0.5)
7
- lint_roller (1.1.0)
8
- parallel (1.27.0)
9
- parser (3.3.10.1)
10
- ast (~> 2.4.1)
11
- racc
12
- prism (1.8.0)
13
- racc (1.8.1)
14
- rainbow (3.1.1)
15
- regexp_parser (2.11.3)
16
- rubocop (1.82.1)
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.48.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
- rubocop-thread_safety (0.7.3)
48
- lint_roller (~> 1.1)
49
- rubocop (~> 1.72, >= 1.72.1)
50
- rubocop-ast (>= 1.44.0, < 2.0)
51
- ruby-progressbar (1.13.0)
52
- standard (1.53.0)
53
- language_server-protocol (~> 3.17.0.2)
54
- lint_roller (~> 1.0)
55
- rubocop (~> 1.82.0)
56
- standard-custom (~> 1.0.0)
57
- standard-performance (~> 1.8)
58
- standard-custom (1.0.2)
59
- lint_roller (~> 1.0)
60
- rubocop (~> 1.50)
61
- standard-performance (1.9.0)
62
- lint_roller (~> 1.1)
63
- rubocop-performance (~> 1.26.0)
64
- standard-rspec (0.3.1)
65
- lint_roller (>= 1.0)
66
- rubocop-capybara (~> 2.22)
67
- rubocop-factory_bot (~> 2.27)
68
- rubocop-rspec (~> 3.5)
69
- rubocop-rspec_rails (~> 2.31)
70
- unicode-display_width (3.2.0)
71
- unicode-emoji (~> 4.1)
72
- unicode-emoji (4.2.0)
73
- yard (0.9.38)
74
- yard-lint (1.4.0)
75
- yard (~> 0.9)
76
- zeitwerk (~> 2.6)
77
- zeitwerk (2.7.4)
78
-
79
- PLATFORMS
80
- ruby
81
- x86_64-linux
82
-
83
- DEPENDENCIES
84
- rubocop-performance
85
- rubocop-rspec
86
- rubocop-thread_safety
87
- standard
88
- standard-performance
89
- standard-rspec
90
- yard-lint
91
-
92
- CHECKSUMS
93
- ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
94
- json (2.18.0) sha256=b10506aee4183f5cf49e0efc48073d7b75843ce3782c68dbeb763351c08fd505
95
- language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
96
- lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
97
- parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130
98
- parser (3.3.10.1) sha256=06f6a725d2cd91e5e7f2b7c32ba143631e1f7c8ae2fb918fc4cebec187e6a688
99
- prism (1.8.0) sha256=84453a16ef5530ea62c5f03ec16b52a459575ad4e7b9c2b360fd8ce2c39c1254
100
- racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
101
- rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
102
- regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4
103
- rubocop (1.82.1) sha256=09f1a6a654a960eda767aebea33e47603080f8e9c9a3f019bf9b94c9cab5e273
104
- rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd
105
- rubocop-capybara (2.22.1) sha256=ced88caef23efea53f46e098ff352f8fc1068c649606ca75cb74650970f51c0c
106
- rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb
107
- rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
108
- rubocop-rspec (3.9.0) sha256=8fa70a3619408237d789aeecfb9beef40576acc855173e60939d63332fdb55e2
109
- rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100
110
- rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
111
- ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
112
- standard (1.53.0) sha256=f3c9493385db7079d0abce6f7582f553122156997b81258cd361d3480eeacf9c
113
- standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
114
- standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
115
- standard-rspec (0.3.1) sha256=67bc957281cacf24f0d88235ca1bf28a8995265b1a60eb519cd0451858b56a22
116
- unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
117
- unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
118
- yard (0.9.38) sha256=721fb82afb10532aa49860655f6cc2eaa7130889df291b052e1e6b268283010f
119
- yard-lint (1.4.0) sha256=7dd88fbb08fd77cb840bea899d58812817b36d92291b5693dd0eeb3af9f91f0f
120
- zeitwerk (2.7.4) sha256=2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b
121
-
122
- BUNDLED WITH
123
- 4.0.3