shared_broker 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 113868a35ebcb87b89d4ce8b0ba3079276ffdb8a07a519ec5ee5cbb28d605f24
4
+ data.tar.gz: 5d7cbddbf655269f55bc9b752172de08d52bbcf8d3864ef1164c9458731ae66b
5
+ SHA512:
6
+ metadata.gz: dd263b0bf50aec4e4ac83e85de4c8fadf8a59bc8ddbcdc4195862bc791aeb2770c866f15cfecec5633313b457897923cc56c2ab990299f95f1fbff03465b9022
7
+ data.tar.gz: 7693f227da2d82c5389074f4e8375ed011ffe2cd77c7e4517480ec38308500c15ccab679a2a326af31ac3ca08f77cc084b7031ebb3d0e291e18745c9335e97ab
data/README.md ADDED
@@ -0,0 +1,102 @@
1
+ # SharedBroker
2
+
3
+ `SharedBroker` is a high-performance Ruby library designed to simplify event-based communication (asynchronous messaging) and telemetry (observability) in Rails microservice architectures.
4
+
5
+ The library implements the **Adapter Pattern** to decouple your application from physical queue providers (like RabbitMQ), allowing easy broker swapping and clean synchronous testing with an in-memory adapter.
6
+
7
+ ---
8
+
9
+ ## Key Features
10
+
11
+ - **Pluggable Messaging**: Adapter pattern to decouple Rails from physical messaging queues.
12
+ - **RabbitMQ Adapter**: Robust, persistent connection wrapper using the `bunny` gem.
13
+ - **InMemory Adapter**: Synchronous local queue simulation for fast TDD testing (no inline external I/O stubs required).
14
+ - **Integrated OpenTelemetry**: Centralized SDK configuration with auto-instrumentation for all supported libraries (ActiveRecord, Bunny, Faraday, Rails, PG, etc.).
15
+
16
+ ---
17
+
18
+ ## Installation
19
+
20
+ Add this line to your application's `Gemfile`:
21
+
22
+ ```ruby
23
+ gem "shared_broker", path: "gems/shared_broker" # for local gem
24
+ # or when published:
25
+ # gem "shared_broker"
26
+ ```
27
+
28
+ And execute:
29
+
30
+ ```bash
31
+ bundle install
32
+ ```
33
+
34
+ ---
35
+
36
+ ## Configuration
37
+
38
+ Create an initializer in your Rails application (`config/initializers/shared_broker.rb`):
39
+
40
+ ```ruby
41
+ require "shared_broker"
42
+
43
+ # 1. Configure the Adapter based on Environment
44
+ if Rails.env.test?
45
+ # In-memory adapter prevents external queue dependency during unit tests
46
+ BROKER_ADAPTER = SharedBroker::Adapters::InMemory.new
47
+ else
48
+ # Connects to real RabbitMQ broker
49
+ amqp_url = ENV.fetch("RABBITMQ_URL") { "amqp://guest:guest@localhost:5672" }
50
+ BROKER_ADAPTER = SharedBroker::Adapters::RabbitMQ.new(amqp_url: amqp_url)
51
+ end
52
+
53
+ # 2. Instantiate the Client by Injecting the Adapter
54
+ SPOT_BROKER = SharedBroker::Client.new(adapter: BROKER_ADAPTER)
55
+
56
+ # 3. Initialize Telemetry (OpenTelemetry)
57
+ SharedBroker::Telemetry.configure(service_name: "my_microservice")
58
+ ```
59
+
60
+ ---
61
+
62
+ ## Usage
63
+
64
+ ### Publishing Events
65
+ Send simple events by passing the topic name and a structured payload (must be a `Hash`):
66
+
67
+ ```ruby
68
+ event_data = {
69
+ id: 1,
70
+ name: "Eiffel Tower",
71
+ latitude: 48.8584,
72
+ longitude: 2.2945
73
+ }
74
+
75
+ SPOT_BROKER.publish("spot.created", event_data)
76
+ ```
77
+
78
+ ### Subscribing to Events (Consumer)
79
+ To start a persistent event subscriber daemon, register a queue associated with the topic:
80
+
81
+ ```ruby
82
+ SPOT_BROKER.subscribe("spot.created", "my_consumption_queue") do |payload|
83
+ puts "Event successfully consumed! ID: #{payload[:id]}"
84
+ # execute your business logic here...
85
+ end
86
+ ```
87
+
88
+ ---
89
+
90
+ ## Running Gem Tests
91
+
92
+ To run the unit test suite using **Minitest**:
93
+
94
+ ```bash
95
+ bundle exec rake test
96
+ ```
97
+
98
+ ---
99
+
100
+ ## License
101
+
102
+ This Gem is available under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << "test"
8
+ t.test_files = FileList["test/**/*_test.rb"]
9
+ t.warning = false
10
+ end
11
+
12
+ task default: :test
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SharedBroker
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "shared_broker/version"
4
+ require_relative "shared_broker/telemetry"
5
+ require_relative "shared_broker/adapters/base"
6
+ require_relative "shared_broker/adapters/in_memory"
7
+ require_relative "shared_broker/adapters/rabbit_mq"
8
+
9
+ module SharedBroker
10
+ class Client
11
+ def initialize(adapter:)
12
+ unless adapter.respond_to?(:publish) && adapter.respond_to?(:subscribe)
13
+ raise ArgumentError, "Expected adapter to respond to :publish and :subscribe, got #{adapter.class} with value #{adapter.inspect}"
14
+ end
15
+
16
+ @adapter = adapter
17
+ end
18
+
19
+ def publish(topic, message)
20
+ @adapter.publish(topic, message)
21
+ end
22
+
23
+ def subscribe(topic, queue_name, &block)
24
+ @adapter.subscribe(topic, queue_name, &block)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,4 @@
1
+ module SharedBroker
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shared_broker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Gemini Antigravity
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2026-06-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bunny
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.22'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.22'
27
+ - !ruby/object:Gem::Dependency
28
+ name: opentelemetry-api
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: opentelemetry-sdk
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: opentelemetry-exporter-otlp
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.25'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.25'
69
+ - !ruby/object:Gem::Dependency
70
+ name: opentelemetry-instrumentation-all
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.25'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.25'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '5.20'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '5.20'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '13.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '13.0'
111
+ description: Shared library for asynchronous messaging, distributed tracing, and customizable
112
+ adapters.
113
+ email:
114
+ - antigravity@google.com
115
+ executables: []
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - README.md
120
+ - Rakefile
121
+ - lib/shared_broker.rb
122
+ - lib/shared_broker/version.rb
123
+ - sig/shared_broker.rbs
124
+ homepage: https://github.com/onkai/shared_broker
125
+ licenses:
126
+ - MIT
127
+ metadata:
128
+ source_code_uri: https://github.com/onkai/shared_broker
129
+ changelog_uri: https://github.com/onkai/shared_broker/blob/main/CHANGELOG.md
130
+ post_install_message:
131
+ rdoc_options: []
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: 3.0.0
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ requirements: []
145
+ rubygems_version: 3.5.22
146
+ signing_key:
147
+ specification_version: 4
148
+ summary: Pluggable message broker abstraction with RabbitMQ and OpenTelemetry support.
149
+ test_files: []