karafka-core 2.5.8 → 2.5.10

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +40 -27
  3. data/.github/workflows/push.yml +2 -2
  4. data/.github/workflows/verify-action-pins.yml +1 -1
  5. data/.gitignore +0 -1
  6. data/.rubocop.yml +37 -0
  7. data/.ruby-version +1 -1
  8. data/.yard-lint.yml +173 -72
  9. data/CHANGELOG.md +8 -0
  10. data/Gemfile +5 -6
  11. data/Gemfile.lint +13 -0
  12. data/Gemfile.lint.lock +103 -0
  13. data/Gemfile.lock +12 -23
  14. data/Rakefile +14 -2
  15. data/karafka-core.gemspec +21 -21
  16. data/lib/karafka/core/configurable/node.rb +39 -39
  17. data/lib/karafka/core/configurable.rb +4 -4
  18. data/lib/karafka/core/contractable/contract.rb +2 -2
  19. data/lib/karafka/core/contractable/result.rb +10 -10
  20. data/lib/karafka/core/helpers/minitest_locator.rb +101 -0
  21. data/lib/karafka/core/helpers/rspec_locator.rb +9 -9
  22. data/lib/karafka/core/helpers/time.rb +1 -1
  23. data/lib/karafka/core/monitoring/monitor.rb +1 -1
  24. data/lib/karafka/core/monitoring/notifications.rb +2 -2
  25. data/lib/karafka/core/monitoring/statistics_decorator.rb +69 -62
  26. data/lib/karafka/core/version.rb +1 -1
  27. data/lib/karafka/core.rb +1 -1
  28. data/lib/karafka-core.rb +22 -22
  29. data/package-lock.json +331 -0
  30. data/package.json +9 -0
  31. data/renovate.json +28 -6
  32. data/test/lib/karafka/core/configurable/leaf_test.rb +3 -0
  33. data/test/lib/karafka/core/configurable/node_test.rb +3 -0
  34. data/test/lib/karafka/core/configurable_test.rb +504 -0
  35. data/test/lib/karafka/core/contractable/contract_test.rb +241 -0
  36. data/test/lib/karafka/core/contractable/result_test.rb +106 -0
  37. data/test/lib/karafka/core/contractable/rule_test.rb +5 -0
  38. data/test/lib/karafka/core/contractable_test.rb +3 -0
  39. data/test/lib/karafka/core/helpers/time_test.rb +29 -0
  40. data/test/lib/karafka/core/instrumentation/callbacks_manager_test.rb +81 -0
  41. data/test/lib/karafka/core/instrumentation_test.rb +35 -0
  42. data/test/lib/karafka/core/monitoring/event_test.rb +25 -0
  43. data/test/lib/karafka/core/monitoring/monitor_test.rb +237 -0
  44. data/test/lib/karafka/core/monitoring/notifications_test.rb +275 -0
  45. data/test/lib/karafka/core/monitoring/statistics_decorator_test.rb +284 -0
  46. data/test/lib/karafka/core/monitoring_test.rb +3 -0
  47. data/test/lib/karafka/core/patches/rdkafka/bindings_test.rb +25 -0
  48. data/test/lib/karafka/core/taggable/tags_test.rb +66 -0
  49. data/test/lib/karafka/core/taggable_test.rb +36 -0
  50. data/test/lib/karafka/core/version_test.rb +5 -0
  51. data/test/lib/karafka/core_test.rb +13 -0
  52. data/test/lib/karafka-core_test.rb +3 -0
  53. data/test/support/class_builder.rb +24 -0
  54. data/test/support/describe_current_helper.rb +41 -0
  55. data/test/test_helper.rb +55 -0
  56. metadata +32 -4
  57. data/.coditsu/ci.yml +0 -3
  58. data/.rspec +0 -1
@@ -23,13 +23,22 @@ module Karafka
23
23
 
24
24
  private_constant :EMPTY_HASH
25
25
 
26
- def initialize
26
+ # @param excluded_keys [Array<String>] list of key names to skip entirely during
27
+ # decoration. Excluded keys are not recursed into and not decorated with delta/freeze
28
+ # duration suffixes. This is useful for skipping large subtrees of the librdkafka
29
+ # statistics that are not consumed by the application (e.g. broker toppars, window
30
+ # stats like int_latency, outbuf_latency, throttle, batchsize, batchcnt, req).
31
+ def initialize(excluded_keys: [])
27
32
  @previous = EMPTY_HASH
28
33
  # Operate on ms precision only
29
34
  @previous_at = monotonic_now.round
30
- @current_at = @previous_at
31
35
  # Cache for memoized suffix keys to avoid repeated string allocations
32
36
  @suffix_keys_cache = {}
37
+ # Frozen hash for O(1) key exclusion lookup, nil when empty to avoid per-key
38
+ # lookups in the hot loop when no exclusions are configured
39
+ @excluded_keys = unless excluded_keys.empty?
40
+ excluded_keys.each_with_object({}) { |k, h| h[k] = true }.freeze
41
+ end
33
42
  end
34
43
 
35
44
  # @param emited_stats [Hash] original emited statistics
@@ -38,86 +47,84 @@ module Karafka
38
47
  # any API to get raw data, users can just assume that the result of this decoration is
39
48
  # the proper raw stats that they can use
40
49
  def call(emited_stats)
41
- @current_at = monotonic_now.round
42
-
43
- @change_d = @current_at - @previous_at
50
+ current_at = monotonic_now.round
51
+ change_d = current_at - @previous_at
44
52
 
45
53
  diff(
46
54
  @previous,
47
- emited_stats
55
+ emited_stats,
56
+ [],
57
+ 0,
58
+ change_d
48
59
  )
49
60
 
50
61
  @previous = emited_stats
51
- @previous_at = @current_at
62
+ @previous_at = current_at
52
63
 
53
64
  emited_stats.freeze
54
65
  end
55
66
 
56
67
  private
57
68
 
58
- # Calculates the diff of the provided values and modifies in place the emited statistics
69
+ # Calculates the diff of the provided values, appends delta and freeze duration keys,
70
+ # and modifies in place the emited statistics.
71
+ #
72
+ # Uses `each_pair` with a per-call pending-writes buffer instead of `current.keys.each`
73
+ # to avoid allocating a new Array for every Hash node in the statistics tree. At scale
74
+ # (thousands of partitions), this reduces allocations from tens of thousands to one per call.
75
+ #
76
+ # The append and suffix_keys_for logic is inlined to reduce method call overhead
77
+ # (from ~915k method calls to ~39k at 6400 partitions).
59
78
  #
60
- # @param previous [Object] previous value from the given scope in which
61
- # we are
79
+ # @param previous [Object] previous value from the given scope in which we are
62
80
  # @param current [Object] current scope from emitted statistics
63
- # @return [Object] the diff if the values were numerics or the current scope
64
- def diff(previous, current)
65
- if current.is_a?(Hash)
66
- filled_previous = previous || EMPTY_HASH
67
-
68
- # @note We cannot use #each_key as we modify the content of the current scope
69
- # in place (in case it's a hash)
70
- current.keys.each do |key|
71
- append(
72
- filled_previous,
73
- current,
74
- key,
75
- diff(filled_previous[key], current[key])
76
- )
81
+ # @param pw [Array] pending writes buffer shared across recursive calls
82
+ # @param pw_start [Integer] starting offset in the buffer for this hash level
83
+ # @param change_d [Integer] time delta in ms since last stats emission
84
+ def diff(previous, current, pw, pw_start, change_d)
85
+ return unless current.is_a?(Hash)
86
+
87
+ filled_previous = previous || EMPTY_HASH
88
+ cache = @suffix_keys_cache
89
+ excluded = @excluded_keys
90
+ pw_size = pw_start
91
+
92
+ current.each_pair do |key, value|
93
+ next if excluded&.key?(key)
94
+
95
+ if value.is_a?(Hash)
96
+ diff(filled_previous[key], value, pw, pw_size, change_d)
97
+ next
77
98
  end
78
- end
79
99
 
80
- # Diff can be computed only for numerics
81
- return current unless current.is_a?(Numeric)
82
- # If there was no previous value, delta is always zero
83
- return 0 unless previous
84
- # Should never happen but just in case, a type changed in between stats
85
- return current unless previous.is_a?(Numeric)
100
+ next unless value.is_a?(Numeric)
86
101
 
87
- current - previous
88
- end
102
+ prev_value = filled_previous[key]
89
103
 
90
- # Appends the result of the diff to a given key as long as the result is numeric
91
- #
92
- # @param previous [Hash] previous scope
93
- # @param current [Hash] current scope
94
- # @param key [Symbol] key based on which we were diffing
95
- # @param result [Object] diff result
96
- def append(previous, current, key, result)
97
- return unless result.is_a?(Numeric)
98
- return if current.frozen?
99
-
100
- freeze_duration_key, delta_key = suffix_keys_for(key)
101
-
102
- if result.zero?
103
- current[freeze_duration_key] = previous[freeze_duration_key] || 0
104
- current[freeze_duration_key] += @change_d
105
- else
106
- current[freeze_duration_key] = 0
107
- end
104
+ if prev_value.nil?
105
+ result = 0
106
+ elsif prev_value.is_a?(Numeric)
107
+ result = value - prev_value
108
+ else
109
+ next
110
+ end
108
111
 
109
- current[delta_key] = result
110
- end
112
+ # Inlined suffix_keys_for for reduced method call overhead
113
+ pair = cache[key] || (cache[key] = ["#{key}_fd".freeze, "#{key}_d".freeze].freeze)
111
114
 
112
- # Returns memoized suffix keys for a given key to avoid repeated string allocations
113
- #
114
- # @param key [Object] the original key
115
- # @return [Array<String>] frozen freeze_duration_key and delta_key
116
- def suffix_keys_for(key)
117
- @suffix_keys_cache[key] ||= [
118
- "#{key}_fd".freeze,
119
- "#{key}_d".freeze
120
- ].freeze
115
+ pw[pw_size] = pair[0]
116
+ pw[pw_size + 1] = (result == 0) ? (filled_previous[pair[0]] || 0) + change_d : 0
117
+ pw[pw_size + 2] = pair[1]
118
+ pw[pw_size + 3] = result
119
+ pw_size += 4
120
+ end
121
+
122
+ # Apply collected writes for this hash level
123
+ i = pw_start
124
+ while i < pw_size
125
+ current[pw[i]] = pw[i + 1]
126
+ i += 2
127
+ end
121
128
  end
122
129
  end
123
130
  end
@@ -4,6 +4,6 @@ module Karafka
4
4
  module Core
5
5
  # Current Karafka::Core version
6
6
  # We follow the versioning schema of given Karafka version
7
- VERSION = '2.5.8'
7
+ VERSION = "2.5.10"
8
8
  end
9
9
  end
data/lib/karafka/core.rb CHANGED
@@ -6,7 +6,7 @@ module Karafka
6
6
  class << self
7
7
  # @return [String] root path of this gem
8
8
  def gem_root
9
- Pathname.new(File.expand_path('../..', __dir__))
9
+ Pathname.new(File.expand_path("../..", __dir__))
10
10
  end
11
11
  end
12
12
  end
data/lib/karafka-core.rb CHANGED
@@ -1,27 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'logger'
4
- require 'yaml'
5
- require 'rdkafka'
6
- require 'karafka/core'
7
- require 'karafka/core/version'
8
- require 'karafka/core/helpers/time'
9
- require 'karafka/core/monitoring'
10
- require 'karafka/core/monitoring/event'
11
- require 'karafka/core/monitoring/monitor'
12
- require 'karafka/core/monitoring/notifications'
13
- require 'karafka/core/monitoring/statistics_decorator'
14
- require 'karafka/core/configurable'
15
- require 'karafka/core/configurable/leaf'
16
- require 'karafka/core/configurable/node'
17
- require 'karafka/core/contractable/contract'
18
- require 'karafka/core/contractable/result'
19
- require 'karafka/core/contractable/rule'
20
- require 'karafka/core/instrumentation'
21
- require 'karafka/core/instrumentation/callbacks_manager'
22
- require 'karafka/core/taggable'
23
- require 'karafka/core/taggable/tags'
24
- require 'karafka/core/patches/rdkafka/bindings'
3
+ require "logger"
4
+ require "yaml"
5
+ require "rdkafka"
6
+ require "karafka/core"
7
+ require "karafka/core/version"
8
+ require "karafka/core/helpers/time"
9
+ require "karafka/core/monitoring"
10
+ require "karafka/core/monitoring/event"
11
+ require "karafka/core/monitoring/monitor"
12
+ require "karafka/core/monitoring/notifications"
13
+ require "karafka/core/monitoring/statistics_decorator"
14
+ require "karafka/core/configurable"
15
+ require "karafka/core/configurable/leaf"
16
+ require "karafka/core/configurable/node"
17
+ require "karafka/core/contractable/contract"
18
+ require "karafka/core/contractable/result"
19
+ require "karafka/core/contractable/rule"
20
+ require "karafka/core/instrumentation"
21
+ require "karafka/core/instrumentation/callbacks_manager"
22
+ require "karafka/core/taggable"
23
+ require "karafka/core/taggable/tags"
24
+ require "karafka/core/patches/rdkafka/bindings"
25
25
 
26
26
  # Karafka framework main namespace
27
27
  module Karafka
data/package-lock.json ADDED
@@ -0,0 +1,331 @@
1
+ {
2
+ "name": "karafka-core",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "karafka-core",
9
+ "version": "1.0.0",
10
+ "devDependencies": {
11
+ "lostconf": "0.4.0"
12
+ }
13
+ },
14
+ "node_modules/@nodelib/fs.scandir": {
15
+ "version": "2.1.5",
16
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
17
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
18
+ "dev": true,
19
+ "license": "MIT",
20
+ "dependencies": {
21
+ "@nodelib/fs.stat": "2.0.5",
22
+ "run-parallel": "^1.1.9"
23
+ },
24
+ "engines": {
25
+ "node": ">= 8"
26
+ }
27
+ },
28
+ "node_modules/@nodelib/fs.stat": {
29
+ "version": "2.0.5",
30
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
31
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
32
+ "dev": true,
33
+ "license": "MIT",
34
+ "engines": {
35
+ "node": ">= 8"
36
+ }
37
+ },
38
+ "node_modules/@nodelib/fs.walk": {
39
+ "version": "1.2.8",
40
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
41
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
42
+ "dev": true,
43
+ "license": "MIT",
44
+ "dependencies": {
45
+ "@nodelib/fs.scandir": "2.1.5",
46
+ "fastq": "^1.6.0"
47
+ },
48
+ "engines": {
49
+ "node": ">= 8"
50
+ }
51
+ },
52
+ "node_modules/braces": {
53
+ "version": "3.0.3",
54
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
55
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
56
+ "dev": true,
57
+ "license": "MIT",
58
+ "dependencies": {
59
+ "fill-range": "^7.1.1"
60
+ },
61
+ "engines": {
62
+ "node": ">=8"
63
+ }
64
+ },
65
+ "node_modules/chalk": {
66
+ "version": "5.6.2",
67
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
68
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
69
+ "dev": true,
70
+ "license": "MIT",
71
+ "engines": {
72
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
73
+ },
74
+ "funding": {
75
+ "url": "https://github.com/chalk/chalk?sponsor=1"
76
+ }
77
+ },
78
+ "node_modules/commander": {
79
+ "version": "12.1.0",
80
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
81
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
82
+ "dev": true,
83
+ "license": "MIT",
84
+ "engines": {
85
+ "node": ">=18"
86
+ }
87
+ },
88
+ "node_modules/fast-glob": {
89
+ "version": "3.3.3",
90
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
91
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
92
+ "dev": true,
93
+ "license": "MIT",
94
+ "dependencies": {
95
+ "@nodelib/fs.stat": "^2.0.2",
96
+ "@nodelib/fs.walk": "^1.2.3",
97
+ "glob-parent": "^5.1.2",
98
+ "merge2": "^1.3.0",
99
+ "micromatch": "^4.0.8"
100
+ },
101
+ "engines": {
102
+ "node": ">=8.6.0"
103
+ }
104
+ },
105
+ "node_modules/fastq": {
106
+ "version": "1.20.1",
107
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
108
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
109
+ "dev": true,
110
+ "license": "ISC",
111
+ "dependencies": {
112
+ "reusify": "^1.0.4"
113
+ }
114
+ },
115
+ "node_modules/fill-range": {
116
+ "version": "7.1.1",
117
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
118
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
119
+ "dev": true,
120
+ "license": "MIT",
121
+ "dependencies": {
122
+ "to-regex-range": "^5.0.1"
123
+ },
124
+ "engines": {
125
+ "node": ">=8"
126
+ }
127
+ },
128
+ "node_modules/glob-parent": {
129
+ "version": "5.1.2",
130
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
131
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
132
+ "dev": true,
133
+ "license": "ISC",
134
+ "dependencies": {
135
+ "is-glob": "^4.0.1"
136
+ },
137
+ "engines": {
138
+ "node": ">= 6"
139
+ }
140
+ },
141
+ "node_modules/is-extglob": {
142
+ "version": "2.1.1",
143
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
144
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
145
+ "dev": true,
146
+ "license": "MIT",
147
+ "engines": {
148
+ "node": ">=0.10.0"
149
+ }
150
+ },
151
+ "node_modules/is-glob": {
152
+ "version": "4.0.3",
153
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
154
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
155
+ "dev": true,
156
+ "license": "MIT",
157
+ "dependencies": {
158
+ "is-extglob": "^2.1.1"
159
+ },
160
+ "engines": {
161
+ "node": ">=0.10.0"
162
+ }
163
+ },
164
+ "node_modules/is-number": {
165
+ "version": "7.0.0",
166
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
167
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
168
+ "dev": true,
169
+ "license": "MIT",
170
+ "engines": {
171
+ "node": ">=0.12.0"
172
+ }
173
+ },
174
+ "node_modules/lostconf": {
175
+ "version": "0.4.0",
176
+ "resolved": "https://registry.npmjs.org/lostconf/-/lostconf-0.4.0.tgz",
177
+ "integrity": "sha512-VNbUnirRU7uESqMHslIRHTcuyx/rr4OZK+L7EQXtYUe5PorBgqBYvPu+6xOr0CoUy4n34NNUKO6BBH6TgwwGTA==",
178
+ "dev": true,
179
+ "license": "MIT",
180
+ "dependencies": {
181
+ "chalk": "^5.3.0",
182
+ "commander": "^12.1.0",
183
+ "fast-glob": "^3.3.2",
184
+ "micromatch": "^4.0.8",
185
+ "smol-toml": "^1.3.0",
186
+ "yaml": "^2.5.0"
187
+ },
188
+ "bin": {
189
+ "lostconf": "dist/cli.js"
190
+ },
191
+ "engines": {
192
+ "node": ">=18.0.0"
193
+ }
194
+ },
195
+ "node_modules/merge2": {
196
+ "version": "1.4.1",
197
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
198
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
199
+ "dev": true,
200
+ "license": "MIT",
201
+ "engines": {
202
+ "node": ">= 8"
203
+ }
204
+ },
205
+ "node_modules/micromatch": {
206
+ "version": "4.0.8",
207
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
208
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
209
+ "dev": true,
210
+ "license": "MIT",
211
+ "dependencies": {
212
+ "braces": "^3.0.3",
213
+ "picomatch": "^2.3.1"
214
+ },
215
+ "engines": {
216
+ "node": ">=8.6"
217
+ }
218
+ },
219
+ "node_modules/picomatch": {
220
+ "version": "2.3.1",
221
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
222
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
223
+ "dev": true,
224
+ "license": "MIT",
225
+ "engines": {
226
+ "node": ">=8.6"
227
+ },
228
+ "funding": {
229
+ "url": "https://github.com/sponsors/jonschlinkert"
230
+ }
231
+ },
232
+ "node_modules/queue-microtask": {
233
+ "version": "1.2.3",
234
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
235
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
236
+ "dev": true,
237
+ "funding": [
238
+ {
239
+ "type": "github",
240
+ "url": "https://github.com/sponsors/feross"
241
+ },
242
+ {
243
+ "type": "patreon",
244
+ "url": "https://www.patreon.com/feross"
245
+ },
246
+ {
247
+ "type": "consulting",
248
+ "url": "https://feross.org/support"
249
+ }
250
+ ],
251
+ "license": "MIT"
252
+ },
253
+ "node_modules/reusify": {
254
+ "version": "1.1.0",
255
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
256
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
257
+ "dev": true,
258
+ "license": "MIT",
259
+ "engines": {
260
+ "iojs": ">=1.0.0",
261
+ "node": ">=0.10.0"
262
+ }
263
+ },
264
+ "node_modules/run-parallel": {
265
+ "version": "1.2.0",
266
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
267
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
268
+ "dev": true,
269
+ "funding": [
270
+ {
271
+ "type": "github",
272
+ "url": "https://github.com/sponsors/feross"
273
+ },
274
+ {
275
+ "type": "patreon",
276
+ "url": "https://www.patreon.com/feross"
277
+ },
278
+ {
279
+ "type": "consulting",
280
+ "url": "https://feross.org/support"
281
+ }
282
+ ],
283
+ "license": "MIT",
284
+ "dependencies": {
285
+ "queue-microtask": "^1.2.2"
286
+ }
287
+ },
288
+ "node_modules/smol-toml": {
289
+ "version": "1.6.0",
290
+ "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz",
291
+ "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==",
292
+ "dev": true,
293
+ "license": "BSD-3-Clause",
294
+ "engines": {
295
+ "node": ">= 18"
296
+ },
297
+ "funding": {
298
+ "url": "https://github.com/sponsors/cyyynthia"
299
+ }
300
+ },
301
+ "node_modules/to-regex-range": {
302
+ "version": "5.0.1",
303
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
304
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
305
+ "dev": true,
306
+ "license": "MIT",
307
+ "dependencies": {
308
+ "is-number": "^7.0.0"
309
+ },
310
+ "engines": {
311
+ "node": ">=8.0"
312
+ }
313
+ },
314
+ "node_modules/yaml": {
315
+ "version": "2.8.2",
316
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
317
+ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
318
+ "dev": true,
319
+ "license": "ISC",
320
+ "bin": {
321
+ "yaml": "bin.mjs"
322
+ },
323
+ "engines": {
324
+ "node": ">= 14.6"
325
+ },
326
+ "funding": {
327
+ "url": "https://github.com/sponsors/eemeli"
328
+ }
329
+ }
330
+ }
331
+ }
data/package.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "karafka-core",
3
+ "version": "1.0.0",
4
+ "description": "CI dependencies for karafka-core",
5
+ "private": true,
6
+ "devDependencies": {
7
+ "lostconf": "0.4.0"
8
+ }
9
+ }
data/renovate.json CHANGED
@@ -3,16 +3,38 @@
3
3
  "extends": [
4
4
  "config:recommended"
5
5
  ],
6
- "github-actions": {
7
- "enabled": true,
8
- "pinDigests": true
9
- },
6
+ "includePaths": [
7
+ ".ruby-version",
8
+ "Gemfile",
9
+ "Gemfile.lint",
10
+ "karafka-core.gemspec",
11
+ "package.json",
12
+ ".github/workflows/**"
13
+ ],
10
14
  "packageRules": [
15
+ {
16
+ "minimumReleaseAge": "7 days",
17
+ "matchDepNames": [
18
+ "/*/"
19
+ ]
20
+ },
11
21
  {
12
22
  "matchManagers": [
13
23
  "github-actions"
14
24
  ],
15
- "minimumReleaseAge": "7 days"
25
+ "pinDigests": true
26
+ },
27
+ {
28
+ "description": "Group ruby/setup-ruby action with ruby version updates",
29
+ "matchPackageNames": [
30
+ "ruby/setup-ruby",
31
+ "ruby"
32
+ ],
33
+ "groupName": "ruby setup"
16
34
  }
17
- ]
35
+ ],
36
+ "labels": [
37
+ "dependencies"
38
+ ],
39
+ "minimumReleaseAge": "7 days"
18
40
  }
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Tested in `configurable_spec.rb` via the use-cases.
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Tested in `configurable_spec.rb` via the use-cases.