karafka-core 2.4.4 → 2.4.11

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f9820107de0ecbacfbff7ba53211ada520bb264a541b2dcc8140ecf4d787dd1f
4
- data.tar.gz: 00ee44ea31f10ae37bb9498eb272d2372bc2c73efa5426eedda04c9c1293de47
3
+ metadata.gz: 4734e30a8ecdbf8bb12ea390afbc496b29c52a60c2f69dd149f126569ef2737a
4
+ data.tar.gz: 27447bac9ec8a2559b6262e9643712f2e48ee45529dc2c3adf56e8591f3d0a94
5
5
  SHA512:
6
- metadata.gz: dca480b446a176d9256dddbbd7da8c43d288bab44b1a14b409b5be40adc77394537f12483cb819e116e552af1a5c0d264fe3da4360332d3201ae6ce75c9eee4d
7
- data.tar.gz: f438cdc9f76f607ca6279df2371284d70715d59fadbc1e9e7e5872c8b5697acca836288cbe1fc0be4ddd450ecf8d42c8f2e4c9efbdbd1d6fa5419ef74155526b
6
+ metadata.gz: '040916155d0c32b9735cb654f96f61539c9a6a99aecb6991e29c7a985dcb93ea1aca0ecb0fbd04ec9f619623e54490c9e94f91d1d3c97cd4b99f2f8f857749f9'
7
+ data.tar.gz: 82f9912864a04bf1ae852cdb1c5ec3287462fca20f67655fbc3649ea8d6b630c7aa45aed9ae36e6d1c07525ab8d0485326b619641172e95832eedaf86539eeee
checksums.yaml.gz.sig CHANGED
Binary file
@@ -0,0 +1,3 @@
1
+ /.github @mensfeld
2
+ /.github/workflows/ @mensfeld
3
+ /.github/actions/ @mensfeld
@@ -1,50 +1,43 @@
1
1
  ---
2
2
  name: Bug Report
3
- about: Report an issue with Karafka you've discovered.
3
+ about: Report an issue within the Karafka ecosystem you've discovered.
4
4
  ---
5
5
 
6
- *Be clear, concise and precise in your description of the problem.
7
- Open an issue with a descriptive title and a summary in grammatically correct,
8
- complete sentences.*
6
+ To make this process smoother for everyone involved, please read the following information before filling out the template.
9
7
 
10
- *Use the template below when reporting bugs. Please, make sure that
11
- you're running the latest stable Karafka and that the problem you're reporting
12
- hasn't been reported (and potentially fixed) already.*
8
+ Scope of the OSS Support
9
+ ===========
13
10
 
14
- *Before filing the ticket you should replace all text above the horizontal
15
- rule with your own words.*
11
+ We do not provide OSS support for outdated versions of Karafka and its components.
16
12
 
17
- --------
13
+ Please ensure that you are using a version that is still actively supported. We cannot assist with any no longer maintained versions unless you support us with our Pro offering (https://karafka.io/docs/Pro-Support/).
18
14
 
19
- ## Expected behavior
15
+ We acknowledge that understanding the specifics of your application and its configuration can be essential for resolving certain issues. However, due to the extensive time and resources such analysis can require, this may fall beyond our Open Source Support scope.
20
16
 
21
- Describe here how you expected Karafka to behave in this particular situation.
17
+ If Karafka or its components are critical to your infrastructure, we encourage you to consider our Pro Offering.
22
18
 
23
- ## Actual behavior
19
+ By backing us up, you can gain direct assistance and ensure your use case receives the dedicated attention it deserves.
24
20
 
25
- Describe here what actually happened.
26
21
 
27
- ## Steps to reproduce the problem
22
+ Important Links to Read
23
+ ===========
28
24
 
29
- This is extremely important! Providing us with a reliable way to reproduce
30
- a problem will expedite its solution.
25
+ Please take a moment to review the following resources before submitting your report:
31
26
 
32
- ## Your setup details
27
+ - Issue Reporting Guide: https://karafka.io/docs/Support/#issue-reporting-guide
28
+ - Support Policy: https://karafka.io/docs/Support/
29
+ - Versions, Lifecycle, and EOL: https://karafka.io/docs/Versions-Lifecycle-and-EOL/
33
30
 
34
- Please provide kafka version and the output of `karafka info` or `bundle exec karafka info` if using Bundler.
35
31
 
36
- Here's an example:
32
+ Bug Report Details
33
+ ===========
37
34
 
38
- ```
39
- $ [bundle exec] karafka info
40
- Karafka version: 1.3.0
41
- Ruby version: 2.6.3
42
- Ruby-kafka version: 0.7.9
43
- Application client id: karafka-local
44
- Backend: inline
45
- Batch fetching: true
46
- Batch consuming: true
47
- Boot file: /app/karafka/karafka.rb
48
- Environment: development
49
- Kafka seed brokers: ["kafka://kafka:9092"]
50
- ```
35
+ Please provide all the details per our Issue Reporting Guide: https://karafka.io/docs/Support/#issue-reporting-guide
36
+
37
+ Failing to provide the required details may result in the issue being closed. Please include all necessary information to help us understand and resolve your issue effectively.
38
+
39
+
40
+ Additional Context
41
+ ===========
42
+
43
+ Add any other context about the problem here.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: Feature Request
3
- about: Suggest new Karafka features or improvements to existing features.
3
+ about: Suggest new Karafka Core features or improvements to existing features.
4
4
  ---
5
5
 
6
6
  ## Is your feature request related to a problem? Please describe.
@@ -6,40 +6,49 @@ concurrency:
6
6
 
7
7
  on:
8
8
  pull_request:
9
+ branches: [ main, master ]
9
10
  push:
11
+ branches: [ main, master ]
10
12
  schedule:
11
- - cron: '0 1 * * *'
13
+ - cron: '0 1 * * *'
14
+
15
+ permissions:
16
+ contents: read
12
17
 
13
18
  jobs:
14
19
  specs:
20
+ timeout-minutes: 15
15
21
  runs-on: ubuntu-latest
16
22
  needs: diffend
17
23
  strategy:
18
24
  fail-fast: false
19
25
  matrix:
20
26
  ruby:
21
- - '3.4.0-preview1'
27
+ - '3.4'
22
28
  - '3.3'
23
29
  - '3.2'
24
30
  - '3.1'
25
- - '3.0'
26
31
  include:
27
- - ruby: '3.3'
32
+ - ruby: '3.4'
28
33
  coverage: 'true'
29
34
  steps:
30
- - uses: actions/checkout@v4
35
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
36
+ with:
37
+ fetch-depth: 0
38
+
31
39
  - name: Install package dependencies
32
40
  run: "[ -e $APT_DEPS ] || sudo apt-get install -y --no-install-recommends $APT_DEPS"
41
+
33
42
  - name: Set up Ruby
34
- uses: ruby/setup-ruby@v1
43
+ uses: ruby/setup-ruby@1a615958ad9d422dd932dc1d5823942ee002799f # v1.227.0
35
44
  with:
36
45
  ruby-version: ${{matrix.ruby}}
37
46
  bundler: 'latest'
47
+
38
48
  - name: Install latest bundler
39
49
  run: |
40
50
  gem install bundler --no-document
41
51
  gem update --system --no-document
42
-
43
52
  bundle config set without 'tools benchmarks docs'
44
53
 
45
54
  - name: Bundle install
@@ -53,17 +62,18 @@ jobs:
53
62
  run: bundle exec rspec
54
63
 
55
64
  diffend:
65
+ timeout-minutes: 5
56
66
  runs-on: ubuntu-latest
57
67
  strategy:
58
68
  fail-fast: false
59
69
  steps:
60
- - uses: actions/checkout@v4
70
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
61
71
  with:
62
72
  fetch-depth: 0
63
73
  - name: Set up Ruby
64
- uses: ruby/setup-ruby@v1
74
+ uses: ruby/setup-ruby@1a615958ad9d422dd932dc1d5823942ee002799f # v1.227.0
65
75
  with:
66
- ruby-version: 3.3
76
+ ruby-version: 3.4
67
77
  - name: Install latest bundler
68
78
  run: gem install bundler --no-document
69
79
  - name: Install Diffend plugin
@@ -72,12 +82,25 @@ jobs:
72
82
  run: bundle secure
73
83
 
74
84
  coditsu:
85
+ timeout-minutes: 5
75
86
  runs-on: ubuntu-latest
76
87
  strategy:
77
88
  fail-fast: false
78
89
  steps:
79
- - uses: actions/checkout@v4
90
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
80
91
  with:
81
92
  fetch-depth: 0
93
+ - name: Download Coditsu script
94
+ run: |
95
+ curl -sSL https://api.coditsu.io/run/ci -o coditsu_script.sh
96
+ chmod +x coditsu_script.sh
97
+ - name: Verify Coditsu script checksum
98
+ run: |
99
+ EXPECTED_SHA256="0aecc5aa010f53fca264548a41467a2b0a1208d750ce1da3e98a217304cacbbc"
100
+ ACTUAL_SHA256=$(sha256sum coditsu_script.sh | awk '{ print $1 }')
101
+ if [ "$ACTUAL_SHA256" != "$EXPECTED_SHA256" ]; then
102
+ echo "::error::Checksum verification failed. Expected $EXPECTED_SHA256 but got $ACTUAL_SHA256."
103
+ exit 1
104
+ fi
82
105
  - name: Run Coditsu
83
- run: \curl -sSL https://api.coditsu.io/run/ci | bash
106
+ run: ./coditsu_script.sh
@@ -0,0 +1,16 @@
1
+ name: Verify Action Pins
2
+ on:
3
+ pull_request:
4
+ paths:
5
+ - '.github/workflows/**'
6
+ jobs:
7
+ verify:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
11
+ - name: Check SHA pins
12
+ run: |
13
+ if grep -E -r "uses: .*/.*@(v[0-9]+|main|master)($|[[:space:]]|$)" --include="*.yml" --include="*.yaml" .github/workflows/ | grep -v "#"; then
14
+ echo "::error::Actions should use SHA pins, not tags or branch names"
15
+ exit 1
16
+ fi
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.3.4
1
+ 3.4.2
data/CHANGELOG.md CHANGED
@@ -1,4 +1,29 @@
1
- # Karafka core changelog
1
+ # Karafka Core Changelog
2
+
3
+ ## 2.4.11 (2025-03-20)
4
+ - [Enhancement] Rename internal node `#name` method to `#node_name` so we can use `#name` as the attribute name.
5
+
6
+ ## 2.4.10 (2025-03-14)
7
+ - [Fix] Relax lock on `karafka-rdkafka`
8
+
9
+ ## 2.4.9 (2025-03-03)
10
+ - [Enhancement] Remove `RspecLocator` dependency on `activesupport`.
11
+
12
+ ## 2.4.8 (2024-12-26)
13
+ - [Maintenance] Declare `logger` as a dependency.
14
+
15
+ ## 2.4.7 (2024-11-26)
16
+ - [Fix] Make sure that `karafka-core` works with older versions of `karafka-rdkafka` that do not support macos fork mitigation.
17
+
18
+ ## 2.4.6 (2024-11-26)
19
+ - [Enhancement] Mitigate macos forking issues when librdkafka is not loaded to memory.
20
+ - [Change] Allow `karafka-rdkafka` `0.18.0`.
21
+
22
+ ## 2.4.5 (2024-11-19)
23
+ - **[Breaking]** Drop Ruby `3.0` support according to the EOL schedule.
24
+ - [Enhancement] Support listeners inspection via `#listeners`.
25
+ - [Fix] Restore `#available_events` notifications bus method.
26
+ - [Change] Set minimum `karafka-rdkafka` on `0.17.6` to support new features.
2
27
 
3
28
  ## 2.4.4 (2024-07-20)
4
29
  - [Change] Set minimum `karafka-rdkafka` on `0.16.0` to support new features and allow for `0.17.0`.
data/Gemfile CHANGED
@@ -8,7 +8,6 @@ gemspec
8
8
 
9
9
  group :test do
10
10
  gem 'byebug'
11
- gem 'factory_bot'
12
11
  gem 'rspec'
13
12
  gem 'simplecov'
14
13
  end
data/Gemfile.lock CHANGED
@@ -1,76 +1,72 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- karafka-core (2.4.4)
5
- karafka-rdkafka (>= 0.15.0, < 0.18.0)
4
+ karafka-core (2.4.11)
5
+ karafka-rdkafka (>= 0.17.6, < 0.20.0)
6
+ logger (>= 1.6.0)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
10
- activesupport (7.1.3.4)
11
- base64
12
- bigdecimal
13
- concurrent-ruby (~> 1.0, >= 1.0.2)
14
- connection_pool (>= 2.2.5)
15
- drb
16
- i18n (>= 1.6, < 2)
17
- minitest (>= 5.1)
18
- mutex_m
19
- tzinfo (~> 2.0)
20
- base64 (0.2.0)
21
- bigdecimal (3.1.8)
22
11
  byebug (11.1.3)
23
- concurrent-ruby (1.3.3)
24
- connection_pool (2.4.1)
25
- diff-lcs (1.5.1)
26
- docile (1.4.0)
27
- drb (2.2.1)
28
- factory_bot (6.4.6)
29
- activesupport (>= 5.0.0)
30
- ffi (1.17.0)
31
- ffi (1.17.0-x86_64-linux-gnu)
32
- i18n (1.14.5)
33
- concurrent-ruby (~> 1.0)
34
- karafka-rdkafka (0.16.0)
12
+ diff-lcs (1.6.0)
13
+ docile (1.4.1)
14
+ ffi (1.17.1)
15
+ ffi (1.17.1-aarch64-linux-gnu)
16
+ ffi (1.17.1-aarch64-linux-musl)
17
+ ffi (1.17.1-arm-linux-gnu)
18
+ ffi (1.17.1-arm-linux-musl)
19
+ ffi (1.17.1-arm64-darwin)
20
+ ffi (1.17.1-x86-linux-gnu)
21
+ ffi (1.17.1-x86-linux-musl)
22
+ ffi (1.17.1-x86_64-darwin)
23
+ ffi (1.17.1-x86_64-linux-gnu)
24
+ ffi (1.17.1-x86_64-linux-musl)
25
+ karafka-rdkafka (0.19.0)
35
26
  ffi (~> 1.15)
36
27
  mini_portile2 (~> 2.6)
37
28
  rake (> 12)
38
- mini_portile2 (2.8.7)
39
- minitest (5.24.0)
40
- mutex_m (0.2.0)
29
+ logger (1.6.6)
30
+ mini_portile2 (2.8.8)
41
31
  rake (13.2.1)
42
32
  rspec (3.13.0)
43
33
  rspec-core (~> 3.13.0)
44
34
  rspec-expectations (~> 3.13.0)
45
35
  rspec-mocks (~> 3.13.0)
46
- rspec-core (3.13.0)
36
+ rspec-core (3.13.3)
47
37
  rspec-support (~> 3.13.0)
48
- rspec-expectations (3.13.1)
38
+ rspec-expectations (3.13.3)
49
39
  diff-lcs (>= 1.2.0, < 2.0)
50
40
  rspec-support (~> 3.13.0)
51
- rspec-mocks (3.13.1)
41
+ rspec-mocks (3.13.2)
52
42
  diff-lcs (>= 1.2.0, < 2.0)
53
43
  rspec-support (~> 3.13.0)
54
- rspec-support (3.13.1)
44
+ rspec-support (3.13.2)
55
45
  simplecov (0.22.0)
56
46
  docile (~> 1.1)
57
47
  simplecov-html (~> 0.11)
58
48
  simplecov_json_formatter (~> 0.1)
59
- simplecov-html (0.12.3)
49
+ simplecov-html (0.13.1)
60
50
  simplecov_json_formatter (0.1.4)
61
- tzinfo (2.0.6)
62
- concurrent-ruby (~> 1.0)
63
51
 
64
52
  PLATFORMS
53
+ aarch64-linux-gnu
54
+ aarch64-linux-musl
55
+ arm-linux-gnu
56
+ arm-linux-musl
57
+ arm64-darwin
65
58
  ruby
66
- x86_64-linux
59
+ x86-linux-gnu
60
+ x86-linux-musl
61
+ x86_64-darwin
62
+ x86_64-linux-gnu
63
+ x86_64-linux-musl
67
64
 
68
65
  DEPENDENCIES
69
66
  byebug
70
- factory_bot
71
67
  karafka-core!
72
68
  rspec
73
69
  simplecov
74
70
 
75
71
  BUNDLED WITH
76
- 2.5.14
72
+ 2.6.2
data/certs/cert.pem ADDED
@@ -0,0 +1,26 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MRAwDgYDVQQDDAdjb250
3
+ YWN0MRcwFQYKCZImiZPyLGQBGRYHa2FyYWZrYTESMBAGCgmSJomT8ixkARkWAmlv
4
+ MB4XDTI0MDgyMzEwMTkyMFoXDTQ5MDgxNzEwMTkyMFowPzEQMA4GA1UEAwwHY29u
5
+ dGFjdDEXMBUGCgmSJomT8ixkARkWB2thcmFma2ExEjAQBgoJkiaJk/IsZAEZFgJp
6
+ bzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjLhLjQqUlNayxkXnO+
7
+ PsmCDs/KFIzhrsYMfLZRZNaWmzV3ujljMOdDjd4snM2X06C41iVdQPWjpe3j8vVe
8
+ ZXEWR/twSbOP6Eeg8WVH2wCOo0x5i7yhVn4UBLH4JpfEMCbemVcWQ9ry9OMg4WpH
9
+ Uu4dRwxFV7hzCz3p0QfNLRI4miAxnGWcnlD98IJRjBAksTuR1Llj0vbOrDGsL9ZT
10
+ JeXP2gdRLd8SqzAFJEWrbeTBCBU7gfSh3oMg5SVDLjaqf7Kz5wC/8bDZydzanOxB
11
+ T6CDXPsCnllmvTNx2ei2T5rGYJOzJeNTmJLLK6hJWUlAvaQSvCwZRvFJ0tVGLEoS
12
+ flqSr6uGyyl1eMUsNmsH4BqPEYcAV6P2PKTv2vUR8AP0raDvZ3xL1TKvfRb8xRpo
13
+ vPopCGlY5XBWEc6QERHfVLTIVsjnls2/Ujj4h8/TSfqqYnaHKefIMLbuD/tquMjD
14
+ iWQsW2qStBV0T+U7FijKxVfrfqZP7GxQmDAc9o1iiyAa3QIDAQABo3cwdTAJBgNV
15
+ HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU3O4dTXmvE7YpAkszGzR9DdL9
16
+ sbEwHQYDVR0RBBYwFIESY29udGFjdEBrYXJhZmthLmlvMB0GA1UdEgQWMBSBEmNv
17
+ bnRhY3RAa2FyYWZrYS5pbzANBgkqhkiG9w0BAQsFAAOCAYEAVKTfoLXn7mqdSxIR
18
+ eqxcR6Huudg1jes81s1+X0uiRTR3hxxKZ3Y82cPsee9zYWyBrN8TA4KA0WILTru7
19
+ Ygxvzha0SRPsSiaKLmgOJ+61ebI4+bOORzIJLpD6GxCxu1r7MI4+0r1u1xe0EWi8
20
+ agkVo1k4Vi8cKMLm6Gl9b3wG9zQBw6fcgKwmpjKiNnOLP+OytzUANrIUJjoq6oal
21
+ TC+f/Uc0TLaRqUaW/bejxzDWWHoM3SU6aoLPuerglzp9zZVzihXwx3jPLUVKDFpF
22
+ Rl2lcBDxlpYGueGo0/oNzGJAAy6js8jhtHC9+19PD53vk7wHtFTZ/0ugDQYnwQ+x
23
+ oml2fAAuVWpTBCgOVFe6XCQpMKopzoxQ1PjKztW2KYxgJdIBX87SnL3aWuBQmhRd
24
+ i9zWxov0mr44TWegTVeypcWGd/0nxu1+QHVNHJrpqlPBRvwQsUm7fwmRInGpcaB8
25
+ ap8wNYvryYzrzvzUxIVFBVM5PacgkFqRmolCa8I7tdKQN+R1
26
+ -----END CERTIFICATE-----
@@ -4,8 +4,12 @@ en:
4
4
  missing: needs to be present
5
5
  id_format: needs to be a String
6
6
  nested.id2_format: needs to be a String
7
+ id_format: needs to be a String
8
+ test_format: needs to be 5
9
+ details.id_format: needs to be a String
7
10
 
8
11
  config:
9
12
  missing: needs to be present
10
13
  id_format: needs to be a String
11
14
  test_format: needs to be nil
15
+ name_format: needs to be name
data/karafka-core.gemspec CHANGED
@@ -16,15 +16,16 @@ Gem::Specification.new do |spec|
16
16
  spec.description = 'A toolset of small support modules used throughout the Karafka ecosystem'
17
17
  spec.licenses = %w[MIT]
18
18
 
19
- spec.add_dependency 'karafka-rdkafka', '>= 0.15.0', '< 0.18.0'
19
+ spec.add_dependency 'karafka-rdkafka', '>= 0.17.6', '< 0.20.0'
20
+ spec.add_dependency 'logger', '>= 1.6.0'
20
21
 
21
- spec.required_ruby_version = '>= 3.0.0'
22
+ spec.required_ruby_version = '>= 3.1.0'
22
23
 
23
24
  if $PROGRAM_NAME.end_with?('gem')
24
25
  spec.signing_key = File.expand_path('~/.ssh/gem-private_key.pem')
25
26
  end
26
27
 
27
- spec.cert_chain = %w[certs/cert_chain.pem]
28
+ spec.cert_chain = %w[certs/cert.pem]
28
29
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec)/}) }
29
30
  spec.require_paths = %w[lib]
30
31
 
@@ -4,7 +4,7 @@ module Karafka
4
4
  module Core
5
5
  module Configurable
6
6
  # Single end config value representation
7
- Leaf = Struct.new(:name, :default, :constructor, :compiled, :lazy) do
7
+ Leaf = Struct.new(:node_name, :default, :constructor, :compiled, :lazy) do
8
8
  # @return [Boolean] true if already compiled
9
9
  def compiled?
10
10
  compiled
@@ -10,15 +10,15 @@ module Karafka
10
10
  # we only compile/initialize the values prior to user running the `#configure` API. This API
11
11
  # needs to run prior to using the result stuff even if there is nothing to configure
12
12
  class Node
13
- attr_reader :name, :nestings
13
+ attr_reader :node_name, :nestings
14
14
 
15
15
  # We need to be able to redefine children for deep copy
16
16
  attr_accessor :children
17
17
 
18
- # @param name [Symbol] node name
18
+ # @param node_name [Symbol] node name
19
19
  # @param nestings [Proc] block for nested settings
20
- def initialize(name, nestings = ->(_) {})
21
- @name = name
20
+ def initialize(node_name, nestings = ->(_) {})
21
+ @node_name = node_name
22
22
  @children = []
23
23
  @nestings = nestings
24
24
  @compiled = false
@@ -27,16 +27,16 @@ module Karafka
27
27
 
28
28
  # Allows for a single leaf or nested node definition
29
29
  #
30
- # @param name [Symbol] setting or nested node name
30
+ # @param node_name [Symbol] setting or nested node name
31
31
  # @param default [Object] default value
32
32
  # @param constructor [#call, nil] callable or nil
33
33
  # @param lazy [Boolean] is this a lazy leaf
34
34
  # @param block [Proc] block for nested settings
35
- def setting(name, default: nil, constructor: nil, lazy: false, &block)
35
+ def setting(node_name, default: nil, constructor: nil, lazy: false, &block)
36
36
  @children << if block
37
- Node.new(name, block)
37
+ Node.new(node_name, block)
38
38
  else
39
- Leaf.new(name, default, constructor, false, lazy)
39
+ Leaf.new(node_name, default, constructor, false, lazy)
40
40
  end
41
41
 
42
42
  compile
@@ -47,7 +47,7 @@ module Karafka
47
47
  # Compile settings, allow for overrides via yielding
48
48
  # @return [Node] returns self after configuration
49
49
  def configure
50
- compile if !@compiled || name == :root
50
+ compile if !@compiled || node_name == :root
51
51
  yield(self) if block_given?
52
52
  self
53
53
  end
@@ -57,14 +57,14 @@ module Karafka
57
57
  config = {}
58
58
 
59
59
  @children.each do |value|
60
- config[value.name] = if value.is_a?(Leaf)
61
- result = public_send(value.name)
62
- # We need to check if value is not a result node for cases where
63
- # we merge additional config
64
- result.is_a?(Node) ? result.to_h : result
65
- else
66
- value.to_h
67
- end
60
+ config[value.node_name] = if value.is_a?(Leaf)
61
+ result = public_send(value.node_name)
62
+ # We need to check if value is not a result node for cases
63
+ # where we merge additional config
64
+ result.is_a?(Node) ? result.to_h : result
65
+ else
66
+ value.to_h
67
+ end
68
68
  end
69
69
 
70
70
  config.freeze
@@ -74,7 +74,7 @@ module Karafka
74
74
  # and non-side-effect usage on an instance/inherited.
75
75
  # @return [Node] duplicated node
76
76
  def deep_dup
77
- dupped = Node.new(name, nestings)
77
+ dupped = Node.new(node_name, nestings)
78
78
 
79
79
  dupped.children += children.map do |value|
80
80
  if value.is_a?(Leaf)
@@ -96,12 +96,12 @@ module Karafka
96
96
  @children.each do |value|
97
97
  # Do not redefine something that was already set during compilation
98
98
  # This will allow us to reconfigure things and skip override with defaults
99
- skippable = respond_to?(value.name) || (value.is_a?(Leaf) && value.compiled?)
99
+ skippable = respond_to?(value.node_name) || (value.is_a?(Leaf) && value.compiled?)
100
100
  lazy_leaf = value.is_a?(Leaf) && value.lazy?
101
101
 
102
102
  # Do not create accessor for leafs that are lazy as they will get a custom method
103
103
  # created instead
104
- singleton_class.attr_accessor(value.name) unless lazy_leaf
104
+ singleton_class.attr_accessor(value.node_name) unless lazy_leaf
105
105
 
106
106
  next if skippable
107
107
 
@@ -123,7 +123,7 @@ module Karafka
123
123
  if lazy_leaf && !initialized
124
124
  build_dynamic_accessor(value)
125
125
  else
126
- public_send("#{value.name}=", initialized)
126
+ public_send("#{value.node_name}=", initialized)
127
127
  end
128
128
  end
129
129
 
@@ -139,16 +139,16 @@ module Karafka
139
139
  #
140
140
  # @param value [Leaf]
141
141
  def build_dynamic_accessor(value)
142
- singleton_class.attr_writer(value.name)
142
+ singleton_class.attr_writer(value.node_name)
143
143
 
144
- define_singleton_method(value.name) do
145
- existing = instance_variable_get("@#{value.name}")
144
+ define_singleton_method(value.node_name) do
145
+ existing = instance_variable_get("@#{value.node_name}")
146
146
 
147
147
  return existing if existing
148
148
 
149
149
  built = call_constructor(value)
150
150
 
151
- instance_variable_set("@#{value.name}", built)
151
+ instance_variable_set("@#{value.node_name}", built)
152
152
  end
153
153
  end
154
154
 
@@ -24,9 +24,7 @@ module Karafka
24
24
  # @param rspec [Module] RSpec main module
25
25
  def extended(rspec)
26
26
  super
27
-
28
27
  this = self
29
-
30
28
  # Allows "auto subject" definitions for the `#describe` method, as it will figure
31
29
  # out the proper class that we want to describe
32
30
  # @param block [Proc] block with specs
@@ -47,9 +45,9 @@ module Karafka
47
45
  .delete_if(&:empty?)
48
46
  .itself[1..]
49
47
  .join('/')
50
- .camelize
48
+ .then { |path| custom_camelize(path) }
51
49
  .then { |string| transform_inflections(string) }
52
- .constantize
50
+ .then { |class_name| custom_constantize(class_name) }
53
51
  end
54
52
 
55
53
  private
@@ -58,11 +56,48 @@ module Karafka
58
56
  # @return [String] string after inflections
59
57
  def transform_inflections(string)
60
58
  string = string.dup
61
-
62
59
  @inflections.each { |from, to| string.gsub!(from, to) }
63
-
64
60
  string
65
61
  end
62
+
63
+ # Custom implementation of camelize without ActiveSupport
64
+ # @param string [String] underscored string to convert to CamelCase
65
+ # @return [String] camel-case string
66
+ def custom_camelize(string)
67
+ # First, replace slashes with :: for proper namespacing
68
+ string = string.gsub('/', '::')
69
+
70
+ # Then camelize each segment
71
+ string.gsub(/(?:^|_|::)([a-z])/) do |match|
72
+ # If it's a namespace separator, keep it and uppercase the following letter
73
+ if match.include?('::')
74
+ "::#{match[-1].upcase}"
75
+ else
76
+ match[-1].upcase
77
+ end
78
+ end
79
+ end
80
+
81
+ # Custom implementation of constantize without ActiveSupport
82
+ # @param string [String] string representing a constant name
83
+ # @return [Class, Module] the constant
84
+ def custom_constantize(string)
85
+ names = string.split('::')
86
+ constant = Object
87
+ regexp = /^[A-Z][a-zA-Z0-9_]*$/
88
+
89
+ names.each do |name|
90
+ # Make sure we're dealing with a valid constant name
91
+ raise NameError, "#{name} is not a valid constant name!" unless name.match?(regexp)
92
+
93
+ # Get the constant from its parent
94
+ constant = constant.const_get(name)
95
+ end
96
+
97
+ constant
98
+ rescue NameError => e
99
+ raise NameError, "Uninitialized constant #{string}: #{e.message}"
100
+ end
66
101
  end
67
102
  end
68
103
  end
@@ -41,6 +41,18 @@ module Karafka
41
41
  def subscribe(*args, &block)
42
42
  @notifications_bus.subscribe(*args, &block)
43
43
  end
44
+
45
+ # @return [Hash<String, Array>] hash where keys are events and values are arrays with
46
+ # listeners subscribed to particular events. Since different events may have different
47
+ # listeners, this is returned that way.
48
+ #
49
+ # @note Please do not modify this hash. It should be used only for debugging.
50
+ #
51
+ # @example If you need to get only classes of listeners, you can run following code:
52
+ # monitor.listeners.map(&:class)
53
+ def listeners
54
+ @notifications_bus.listeners
55
+ end
44
56
  end
45
57
  end
46
58
  end
@@ -11,7 +11,7 @@ module Karafka
11
11
  class Notifications
12
12
  include Core::Helpers::Time
13
13
 
14
- attr_reader :name
14
+ attr_reader :name, :listeners
15
15
 
16
16
  # Raised when someone wants to publish event that was not registered
17
17
  EventNotRegistered = Class.new(StandardError)
@@ -28,6 +28,11 @@ module Karafka
28
28
  @events_methods_map = {}
29
29
  end
30
30
 
31
+ # @return [Array<String>] list of available events
32
+ def available_events
33
+ @events_methods_map.keys
34
+ end
35
+
31
36
  # Registers a new event on which we can publish
32
37
  #
33
38
  # @param event_id [String] event id
@@ -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.4.4'
7
+ VERSION = '2.4.11'
8
8
  end
9
9
  end
data/lib/karafka-core.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  %w[
4
+ logger
4
5
  yaml
5
6
  rdkafka
6
7
 
@@ -48,3 +49,8 @@ rd_config = ::Rdkafka::Config
48
49
  rd_config.statistics_callback = instrumentation.statistics_callbacks
49
50
  rd_config.error_callback = instrumentation.error_callbacks
50
51
  rd_config.oauthbearer_token_refresh_callback = instrumentation.oauthbearer_token_refresh_callbacks
52
+
53
+ # This loads librdkafka components into memory prior to initializing the client.
54
+ # This mitigates macos forking issues.
55
+ # @see https://github.com/confluentinc/librdkafka/issues/4590
56
+ ::Rdkafka::Bindings.rd_kafka_global_init if ::Rdkafka::Bindings.respond_to?(:rd_kafka_global_init)
data/renovate.json CHANGED
@@ -1,6 +1,18 @@
1
1
  {
2
2
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
3
  "extends": [
4
- "config:base"
4
+ "config:recommended"
5
+ ],
6
+ "github-actions": {
7
+ "enabled": true,
8
+ "pinDigests": true
9
+ },
10
+ "packageRules": [
11
+ {
12
+ "matchManagers": [
13
+ "github-actions"
14
+ ],
15
+ "minimumReleaseAge": "7 days"
16
+ }
5
17
  ]
6
18
  }
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,41 +1,40 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: karafka-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.4
4
+ version: 2.4.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maciej Mensfeld
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain:
11
10
  - |
12
11
  -----BEGIN CERTIFICATE-----
13
12
  MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MRAwDgYDVQQDDAdjb250
14
13
  YWN0MRcwFQYKCZImiZPyLGQBGRYHa2FyYWZrYTESMBAGCgmSJomT8ixkARkWAmlv
15
- MB4XDTIzMDgyMTA3MjU1NFoXDTI0MDgyMDA3MjU1NFowPzEQMA4GA1UEAwwHY29u
14
+ MB4XDTI0MDgyMzEwMTkyMFoXDTQ5MDgxNzEwMTkyMFowPzEQMA4GA1UEAwwHY29u
16
15
  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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- kp1OFnEq4GG9sON4glRldkwzi/f/fGcZmo5fm3d+0ZdNgwIDAQABo3cwdTAJBgNV
26
- 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
- 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
- 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
- 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
- 3mXLeMuk7amjQpYoSWU/OIZMhIsARra22UN8qkkUlUj3AwTaChVKN/bPJOM2DzfU
31
- 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
- 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
- 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
- qma0whX8UG/gXFV2pYWpYOfpatvahwi+A1TwPQsuZwkkhi1OyF1At3RY+hjSXyav
35
- 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
- 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
37
36
  -----END CERTIFICATE-----
38
- date: 2024-07-20 00:00:00.000000000 Z
37
+ date: 2025-03-20 00:00:00.000000000 Z
39
38
  dependencies:
40
39
  - !ruby/object:Gem::Dependency
41
40
  name: karafka-rdkafka
@@ -43,20 +42,34 @@ dependencies:
43
42
  requirements:
44
43
  - - ">="
45
44
  - !ruby/object:Gem::Version
46
- version: 0.15.0
45
+ version: 0.17.6
47
46
  - - "<"
48
47
  - !ruby/object:Gem::Version
49
- version: 0.18.0
48
+ version: 0.20.0
50
49
  type: :runtime
51
50
  prerelease: false
52
51
  version_requirements: !ruby/object:Gem::Requirement
53
52
  requirements:
54
53
  - - ">="
55
54
  - !ruby/object:Gem::Version
56
- version: 0.15.0
55
+ version: 0.17.6
57
56
  - - "<"
58
57
  - !ruby/object:Gem::Version
59
- version: 0.18.0
58
+ version: 0.20.0
59
+ - !ruby/object:Gem::Dependency
60
+ name: logger
61
+ requirement: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: 1.6.0
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 1.6.0
60
73
  description: A toolset of small support modules used throughout the Karafka ecosystem
61
74
  email:
62
75
  - contact@karafka.io
@@ -67,10 +80,12 @@ files:
67
80
  - ".coditsu/ci.yml"
68
81
  - ".console_irbrc"
69
82
  - ".diffend.yml"
83
+ - ".github/CODEOWNERS"
70
84
  - ".github/FUNDING.yml"
71
85
  - ".github/ISSUE_TEMPLATE/bug_report.md"
72
86
  - ".github/ISSUE_TEMPLATE/feature_request.md"
73
87
  - ".github/workflows/ci.yml"
88
+ - ".github/workflows/verify-action-pins.yml"
74
89
  - ".gitignore"
75
90
  - ".rspec"
76
91
  - ".ruby-gemset"
@@ -81,7 +96,7 @@ files:
81
96
  - Gemfile.lock
82
97
  - MIT-LICENSE
83
98
  - README.md
84
- - certs/cert_chain.pem
99
+ - certs/cert.pem
85
100
  - config/locales/errors.yml
86
101
  - karafka-core.gemspec
87
102
  - lib/karafka-core.rb
@@ -119,7 +134,6 @@ metadata:
119
134
  source_code_uri: https://github.com/karafka/karafka-core
120
135
  documentation_uri: https://karafka.io/docs
121
136
  rubygems_mfa_required: 'true'
122
- post_install_message:
123
137
  rdoc_options: []
124
138
  require_paths:
125
139
  - lib
@@ -127,15 +141,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
127
141
  requirements:
128
142
  - - ">="
129
143
  - !ruby/object:Gem::Version
130
- version: 3.0.0
144
+ version: 3.1.0
131
145
  required_rubygems_version: !ruby/object:Gem::Requirement
132
146
  requirements:
133
147
  - - ">="
134
148
  - !ruby/object:Gem::Version
135
149
  version: '0'
136
150
  requirements: []
137
- rubygems_version: 3.5.9
138
- signing_key:
151
+ rubygems_version: 3.6.2
139
152
  specification_version: 4
140
153
  summary: Karafka ecosystem core modules
141
154
  test_files: []
metadata.gz.sig CHANGED
Binary file
data/certs/cert_chain.pem DELETED
@@ -1,26 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MRAwDgYDVQQDDAdjb250
3
- YWN0MRcwFQYKCZImiZPyLGQBGRYHa2FyYWZrYTESMBAGCgmSJomT8ixkARkWAmlv
4
- MB4XDTIzMDgyMTA3MjU1NFoXDTI0MDgyMDA3MjU1NFowPzEQMA4GA1UEAwwHY29u
5
- dGFjdDEXMBUGCgmSJomT8ixkARkWB2thcmFma2ExEjAQBgoJkiaJk/IsZAEZFgJp
6
- bzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAOuZpyQKEwsTG9plLat7
7
- 8bUaNuNBEnouTsNMr6X+XTgvyrAxTuocdsyP1sNCjdS1B8RiiDH1/Nt9qpvlBWon
8
- sdJ1SYhaWNVfqiYStTDnCx3PRMmHRdD4KqUWKpN6VpZ1O/Zu+9Mw0COmvXgZuuO9
9
- wMSJkXRo6dTCfMedLAIxjMeBIxtoLR2e6Jm6MR8+8WYYVWrO9kSOOt5eKQLBY7aK
10
- b/Dc40EcJKPg3Z30Pia1M9ZyRlb6SOj6SKpHRqc7vbVQxjEw6Jjal1lZ49m3YZMd
11
- ArMAs9lQZNdSw5/UX6HWWURLowg6k10RnhTUtYyzO9BFev0JFJftHnmuk8vtb+SD
12
- 5VPmjFXg2VOcw0B7FtG75Vackk8QKfgVe3nSPhVpew2CSPlbJzH80wChbr19+e3+
13
- YGr1tOiaJrL6c+PNmb0F31NXMKpj/r+n15HwlTMRxQrzFcgjBlxf2XFGnPQXHhBm
14
- kp1OFnEq4GG9sON4glRldkwzi/f/fGcZmo5fm3d+0ZdNgwIDAQABo3cwdTAJBgNV
15
- HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUPVH5+dLA80A1kJ2Uz5iGwfOa
16
- 1+swHQYDVR0RBBYwFIESY29udGFjdEBrYXJhZmthLmlvMB0GA1UdEgQWMBSBEmNv
17
- bnRhY3RAa2FyYWZrYS5pbzANBgkqhkiG9w0BAQsFAAOCAYEAnpa0jcN7JzREHMTQ
18
- bfZ+xcvlrzuROMY6A3zIZmQgbnoZZNuX4cMRrT1p1HuwXpxdpHPw7dDjYqWw3+1h
19
- 3mXLeMuk7amjQpYoSWU/OIZMhIsARra22UN8qkkUlUj3AwTaChVKN/bPJOM2DzfU
20
- kz9vUgLeYYFfQbZqeI6SsM7ltilRV4W8D9yNUQQvOxCFxtLOetJ00fC/E7zMUzbK
21
- IBwYFQYsbI6XQzgAIPW6nGSYKgRhkfpmquXSNKZRIQ4V6bFrufa+DzD0bt2ZA3ah
22
- fMmJguyb5L2Gf1zpDXzFSPMG7YQFLzwYz1zZZvOU7/UCpQsHpID/YxqDp4+Dgb+Y
23
- qma0whX8UG/gXFV2pYWpYOfpatvahwi+A1TwPQsuZwkkhi1OyF1At3RY+hjSXyav
24
- AnG1dJU+yL2BK7vaVytLTstJME5mepSZ46qqIJXMuWob/YPDmVaBF39TDSG9e34s
25
- msG3BiCqgOgHAnL23+CN3Rt8MsuRfEtoTKpJVcCfoEoNHOkc
26
- -----END CERTIFICATE-----