omnes 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -2
- data/Gemfile.lock +0 -6
- data/README.md +110 -19
- data/lib/omnes/bus.rb +43 -13
- data/lib/omnes/configurable.rb +108 -0
- data/lib/omnes/errors.rb +38 -0
- data/lib/omnes/event.rb +2 -2
- data/lib/omnes/publication.rb +5 -14
- data/lib/omnes/publication_context.rb +41 -0
- data/lib/omnes/subscriber/adapter/active_job.rb +10 -6
- data/lib/omnes/subscriber/adapter/method.rb +2 -2
- data/lib/omnes/subscriber/adapter/sidekiq.rb +22 -8
- data/lib/omnes/subscriber/adapter.rb +6 -0
- data/lib/omnes/subscriber/state.rb +11 -5
- data/lib/omnes/subscriber.rb +14 -12
- data/lib/omnes/subscription.rb +25 -4
- data/lib/omnes/version.rb +1 -1
- data/lib/omnes.rb +4 -36
- data/omnes.gemspec +0 -2
- metadata +8 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa683052724423d76ee0b417e84e2d0ed954c47b50382eead7e8e85942eea8c0
|
4
|
+
data.tar.gz: e0690f6d8852c9ab3ff1d4e2fb7c6e68f82aca657fe6b684a503f14a085e0efc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41a41801b5b133640bca4c98f004163382fe6747848595a70fa1404c9638cca304cb8e95c0f7b6b81ebcebe15df1df32a4c28274b252d38d8d66fac572d988dd
|
7
|
+
data.tar.gz: 76a23f76d4a007cfadcf59140168934f2653804f65c7cbdad21a70e3dcd71177438b4eb2174da4b421d07fe694d793da271a5e40c2e61a2d5b77bd915e8869ce
|
data/CHANGELOG.md
CHANGED
@@ -4,8 +4,15 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
-
## [
|
7
|
+
## [0.2.0] - 2022-04-15
|
8
|
+
|
9
|
+
### Added
|
10
|
+
- Be able to fetch subscriptions by id from the bus [#1](https://github.com/nebulab/omnes/pull/1).
|
11
|
+
- Use ad-hoc configuration system (and make Omnes zero-deps) [#2](https://github.com/nebulab/omnes/pull/2).
|
12
|
+
- Bind a publication context to subscriptions [#3](https://github.com/nebulab/omnes/pull/3).
|
8
13
|
|
9
14
|
## [0.1.0] - 2022-03-23
|
10
15
|
|
11
|
-
[Unreleased]: https://github.com/nebulab/omnes/compare/v0.
|
16
|
+
[Unreleased]: https://github.com/nebulab/omnes/compare/v0.2.0...HEAD
|
17
|
+
[0.2.0]: https://github.com/nebulab/omnes/compare/v0.1.0...v0.2.0
|
18
|
+
[0.1.0]: https://github.com/nebulab/omnes/releases/tag/v0.1.0
|
data/Gemfile.lock
CHANGED
@@ -2,7 +2,6 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
omnes (0.1.0)
|
5
|
-
dry-configurable (~> 0.14)
|
6
5
|
|
7
6
|
GEM
|
8
7
|
remote: https://rubygems.org/
|
@@ -19,11 +18,6 @@ GEM
|
|
19
18
|
concurrent-ruby (1.1.9)
|
20
19
|
connection_pool (2.2.5)
|
21
20
|
diff-lcs (1.5.0)
|
22
|
-
dry-configurable (0.14.0)
|
23
|
-
concurrent-ruby (~> 1.0)
|
24
|
-
dry-core (~> 0.6)
|
25
|
-
dry-core (0.7.1)
|
26
|
-
concurrent-ruby (~> 1.0)
|
27
21
|
globalid (1.0.0)
|
28
22
|
activesupport (>= 5.0)
|
29
23
|
i18n (1.10.0)
|
data/README.md
CHANGED
@@ -37,7 +37,7 @@ The following examples will use the direct `Omnes::Bus` instance. The only
|
|
37
37
|
difference for the mixing use case is that the methods are directly called in
|
38
38
|
the including instance.
|
39
39
|
|
40
|
-
|
40
|
+
## Registering events
|
41
41
|
|
42
42
|
Before being able to work with a given event, its name (which must be a
|
43
43
|
`Symbol`) must be registered:
|
@@ -46,9 +46,9 @@ Before being able to work with a given event, its name (which must be a
|
|
46
46
|
bus.register(:order_created)
|
47
47
|
```
|
48
48
|
|
49
|
-
|
49
|
+
## Publishing events
|
50
50
|
|
51
|
-
An event can be anything responding to a method `:
|
51
|
+
An event can be anything responding to a method `:omnes_event_name`, which must match with a
|
52
52
|
registered name.
|
53
53
|
|
54
54
|
Typically, there're two main ways to generate events.
|
@@ -73,8 +73,7 @@ features, such as event persistence, can't be reliably built on top of them.
|
|
73
73
|
|
74
74
|
You can also publish an instance of a class including
|
75
75
|
[`Omnes::Event`](lib/omnes/event.rb). The only fancy thing it provides is an
|
76
|
-
OOTB event name generated based on the class name.
|
77
|
-
anything responding to `#omnes_event_name`.
|
76
|
+
OOTB event name generated based on the class name.
|
78
77
|
|
79
78
|
```ruby
|
80
79
|
class OrderCreatedEvent
|
@@ -105,7 +104,7 @@ Omnes.config.event.name_builder = event_name_as_class
|
|
105
104
|
Instance-backed events provide a well-defined structure, and other features,
|
106
105
|
like event persistence, can be added on top of them.
|
107
106
|
|
108
|
-
|
107
|
+
## Subscribing to events
|
109
108
|
|
110
109
|
You can subscribe to a specific event to run some code whenever it's published.
|
111
110
|
The event is yielded to the subscription block:
|
@@ -150,7 +149,7 @@ bus.subscribe(:order_created, OrderCreationEmailSubscription.new)
|
|
150
149
|
However, see [Event subscribers](#event-subscribers) section bellow for a more powerful way
|
151
150
|
to define standalone event handlers.
|
152
151
|
|
153
|
-
|
152
|
+
### Global subscriptions
|
154
153
|
|
155
154
|
You can also create a subscription that will run for all events:
|
156
155
|
|
@@ -170,7 +169,7 @@ end
|
|
170
169
|
bus.subscribe_to_all(LogEventsSubscription.new)
|
171
170
|
```
|
172
171
|
|
173
|
-
|
172
|
+
### Custom matcher subscriptions
|
174
173
|
|
175
174
|
Custom event matchers can be defined. A matcher is something responding to
|
176
175
|
`#call` and taking the event as an argument. It must return `true` or `false`
|
@@ -184,6 +183,22 @@ bus.subscribe_with_matcher(ORDER_EVENTS_MATCHER) do |event|
|
|
184
183
|
end
|
185
184
|
```
|
186
185
|
|
186
|
+
### Referencing subscriptions
|
187
|
+
|
188
|
+
For all subscription methods we've seen, an `Omnes::Subscription` instance is
|
189
|
+
returned. Holding that reference can be useful for [debugging](#debugging) and
|
190
|
+
[testing](#testing) purposes.
|
191
|
+
|
192
|
+
Often though, you won't have the reference at hand when you need it.
|
193
|
+
Thankfully, you can provide a subscription identifier on subscription time and
|
194
|
+
use it later to fetch the subscription instance from the bus. A subscription
|
195
|
+
identifier needs to be a `Symbol`:
|
196
|
+
|
197
|
+
```ruby
|
198
|
+
bus.subscribe(:order_created, OrderCreationEmailSubscription.new, id: :order_created_email)
|
199
|
+
subscription = bus.subscription(:send_confirmation_email)
|
200
|
+
```
|
201
|
+
|
187
202
|
## Event subscribers
|
188
203
|
|
189
204
|
Events subscribers offer a way to define event subscriptions from a custom
|
@@ -207,7 +222,11 @@ class OrderCreationEmailSubscriber
|
|
207
222
|
service.send(number: event.number, email: event.user_email)
|
208
223
|
end
|
209
224
|
end
|
225
|
+
```
|
210
226
|
|
227
|
+
You add the subscriptions by calling the `#subscribe_to` method on an instance:
|
228
|
+
|
229
|
+
```ruby
|
211
230
|
OrderCreationEmailSubscriber.new.subscribe_to(bus)
|
212
231
|
```
|
213
232
|
|
@@ -246,6 +265,21 @@ class OrderSubscriber
|
|
246
265
|
end
|
247
266
|
```
|
248
267
|
|
268
|
+
Likewise, you can provide [identifiers to reference
|
269
|
+
subscriptions](#referencing-subscriptions):
|
270
|
+
|
271
|
+
```ruby
|
272
|
+
handle :order_created, with: :send_confirmation_email, id: :order_creation_email_subscriber
|
273
|
+
```
|
274
|
+
|
275
|
+
As you can subscribe multiple instances of a subscriber to the same bus, you
|
276
|
+
might need to create a different identifier for each of them. For those cases,
|
277
|
+
you can pass a lambda taking the subscriber instance:
|
278
|
+
|
279
|
+
```ruby
|
280
|
+
handle :order_created, with: :send_confirmation_email, id: ->(subscriber) { :"#{subscriber.id}_order_creation_email_subscriber" }
|
281
|
+
```
|
282
|
+
|
249
283
|
### Autodiscovering event handlers
|
250
284
|
|
251
285
|
You can let the event handlers to be automatically discovered.You need to
|
@@ -292,6 +326,12 @@ class OrderCreationEmailSubscriber
|
|
292
326
|
end
|
293
327
|
```
|
294
328
|
|
329
|
+
The strategy can also be globally set:
|
330
|
+
|
331
|
+
```ruby
|
332
|
+
Omnes.config.subscriber.autodiscover_strategy = AUTODISCOVER_STRATEGY
|
333
|
+
```
|
334
|
+
|
295
335
|
### Adapters
|
296
336
|
|
297
337
|
Subscribers are not limited to use a method as event handler. They can interact
|
@@ -389,7 +429,8 @@ Omnes.config.subscriber.adapter.active_job.serializer = :serialized_payload.to_p
|
|
389
429
|
#### Custom adapters
|
390
430
|
|
391
431
|
Custom adapters can be built. They need to implement a method `#call` taking
|
392
|
-
the instance of `Omnes::Subscriber
|
432
|
+
the instance of `Omnes::Subscriber`, the event and, optionally, the publication
|
433
|
+
context (see [debugging subscriptions](#subscription)).
|
393
434
|
|
394
435
|
Here's a custom adapter executing a subscriber method in a different
|
395
436
|
thread (we add an extra argument for the method name, and we partially apply it
|
@@ -402,7 +443,6 @@ end
|
|
402
443
|
|
403
444
|
class OrderCreationEmailSubscriber
|
404
445
|
include Omnes::Subscriber
|
405
|
-
include Sidekiq::Job
|
406
446
|
|
407
447
|
handle :order_created, with: THREAD_ADAPTER.curry[:order_created]
|
408
448
|
|
@@ -413,8 +453,8 @@ end
|
|
413
453
|
```
|
414
454
|
|
415
455
|
Alternatively, adapters can be curried and only take the instance as an
|
416
|
-
argument, returning a
|
417
|
-
|
456
|
+
argument, returning a callable taking the event. For instance, we could also
|
457
|
+
have defined the thread adapter like this:
|
418
458
|
|
419
459
|
```ruby
|
420
460
|
class ThreadAdapter
|
@@ -440,10 +480,8 @@ handle :order_created, with: ThreadAdapter.new(:order_created)
|
|
440
480
|
|
441
481
|
### Unsubscribing
|
442
482
|
|
443
|
-
|
444
|
-
[
|
445
|
-
`Omnes::Subscriber`). It can be used to unsubscribe it in case you need to
|
446
|
-
debug some behavior.
|
483
|
+
You can unsubscribe a given subscription by passing its
|
484
|
+
[reference](#referencing-subscriptions) to `Omnes::Bus#unsubscribe`:
|
447
485
|
|
448
486
|
```ruby
|
449
487
|
subscription = bus.subscribe(:order_created, OrderCreationEmailSubscription.new)
|
@@ -478,10 +516,10 @@ When you publish an event, you get back an
|
|
478
516
|
attributes that allow observing what happened:
|
479
517
|
|
480
518
|
- `#event` contains the event instance that has been published.
|
481
|
-
- `#caller_location` refers to the publication caller.
|
482
|
-
- `#time` is the time stamp for the publication.
|
483
519
|
- `#executions` contains an array of
|
484
520
|
`Omnes::Execution`(lib/omnes/execution.rb). Read more below.
|
521
|
+
- `#context` is an instance of
|
522
|
+
[`Omnes::PublicationContext`](lib/omnes/publication_context.rb).
|
485
523
|
|
486
524
|
`Omnes::Execution` represents a subscription individual execution. It contains
|
487
525
|
the following attributes:
|
@@ -491,6 +529,40 @@ the following attributes:
|
|
491
529
|
- `#benchmark` of the operation.
|
492
530
|
- `#time` is the time where the execution started.
|
493
531
|
|
532
|
+
`Omnes::PublicationContext` represents the shared context for all triggered
|
533
|
+
executions. See [Subscription][#subscription] for details.
|
534
|
+
|
535
|
+
### Subscription
|
536
|
+
|
537
|
+
If your subscription block or callable object takes a second argument, it'll
|
538
|
+
contain an instance of an
|
539
|
+
[`Omnes::PublicationContext`](lib/omnes/publication_context.rb). It allows you
|
540
|
+
to inspect what triggered a given execution from within that execution code. It
|
541
|
+
contains:
|
542
|
+
|
543
|
+
- `#caller_location` refers to the publication caller.
|
544
|
+
- `#time` is the time stamp for the publication.
|
545
|
+
|
546
|
+
```ruby
|
547
|
+
class OrderCreationEmailSubscriber
|
548
|
+
include Omnes::Subscriber
|
549
|
+
|
550
|
+
handle :order_created, with: :send_confirmation_email
|
551
|
+
|
552
|
+
def send_confirmation_email(event, publication_context)
|
553
|
+
# debugging
|
554
|
+
abort(publication_context.caller_location.inspect)
|
555
|
+
|
556
|
+
OrderCreationEmail.send(number: event.number, email: event.user_email)
|
557
|
+
end
|
558
|
+
end
|
559
|
+
```
|
560
|
+
|
561
|
+
In case you're developing your own async adapter, you can call `#serialized` on
|
562
|
+
an instance of `Omnes::PublicationContext` to get a serialized version of it.
|
563
|
+
It'll return a `Hash` with `"caller_location"` and `"time"` keys, and the
|
564
|
+
respective `String` representations as values.
|
565
|
+
|
494
566
|
## Testing
|
495
567
|
|
496
568
|
Ideally, you wouldn't need big setups to test your event-driven behavior. You
|
@@ -521,11 +593,30 @@ end
|
|
521
593
|
bus.publish(:order_deleted, number: order.number) # `deletion_subscription` will run
|
522
594
|
```
|
523
595
|
|
524
|
-
Remember that
|
596
|
+
Remember that you can get previous [subscription
|
597
|
+
references](#referencing-subscriptions) thanks to
|
598
|
+
subscription identifiers.
|
525
599
|
|
526
600
|
There's also a specialized `Omnes::Bus#performing_nothing` method that runs no
|
527
601
|
subscriptions for the duration of the block.
|
528
602
|
|
603
|
+
## Configuration
|
604
|
+
|
605
|
+
We've seen the relevant configurable settings in the corresponding sections.
|
606
|
+
You can also access the configuration in the habitual block syntax:
|
607
|
+
|
608
|
+
```ruby
|
609
|
+
Omnes.configure do |config|
|
610
|
+
config.subscriber.adapter.sidekiq.serializer = :serialized_payload.to_proc
|
611
|
+
end
|
612
|
+
```
|
613
|
+
|
614
|
+
Finally, nested settings can also be set directly from the affected class. E.g.:
|
615
|
+
|
616
|
+
```ruby
|
617
|
+
Omnes::Subscriber::Adapter::Sidekiq.config.serializer = :serialized_payload.to_proc
|
618
|
+
```
|
619
|
+
|
529
620
|
## Recipes
|
530
621
|
|
531
622
|
### Rails
|
data/lib/omnes/bus.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "omnes/publication"
|
4
|
+
require "omnes/publication_context"
|
4
5
|
require "omnes/registry"
|
5
6
|
require "omnes/subscription"
|
6
7
|
require "omnes/unstructured_event"
|
@@ -22,8 +23,8 @@ module Omnes
|
|
22
23
|
# bus.register(:foo)
|
23
24
|
# ```
|
24
25
|
#
|
25
|
-
# An event can be anything responding to a method `:
|
26
|
-
# say, must match with a registered name.
|
26
|
+
# An event can be anything responding to a method `:omes_event_name` which,
|
27
|
+
# needless to say, must match with a registered name.
|
27
28
|
#
|
28
29
|
# Typically, there're two main ways to generate events.
|
29
30
|
#
|
@@ -104,6 +105,21 @@ module Omnes
|
|
104
105
|
#
|
105
106
|
# bus.subscribe_with_matcher(matcher, MySubscription.new)
|
106
107
|
# ```
|
108
|
+
#
|
109
|
+
# For all previous subscription methods, a subscription object is returned.
|
110
|
+
# You can supply a subscription id to it to be able to fetch it from the bus
|
111
|
+
# later on:
|
112
|
+
#
|
113
|
+
# ```
|
114
|
+
# subscription = bus.subscribe(:foo, MySubscription.new, id: :foo_sub)
|
115
|
+
# bus.subscription(:foo_sub) == subscription #=> true
|
116
|
+
# ```
|
117
|
+
#
|
118
|
+
# A subscription can be referenced when you want to unsubscribe:
|
119
|
+
#
|
120
|
+
# ```
|
121
|
+
# bus.unsubscribe(subscription)
|
122
|
+
# ```
|
107
123
|
class Bus
|
108
124
|
# @api private
|
109
125
|
def self.EventType(value, **payload)
|
@@ -168,13 +184,13 @@ module Omnes
|
|
168
184
|
publication_time = Time.now.utc
|
169
185
|
event = self.class.EventType(event, **payload)
|
170
186
|
registry.check_event_name(event.omnes_event_name)
|
171
|
-
|
187
|
+
publication_context = PublicationContext.new(caller_location: caller_location, time: publication_time)
|
188
|
+
executions = execute_subscriptions_for_event(event, publication_context)
|
172
189
|
|
173
190
|
Publication.new(
|
174
191
|
event: event,
|
175
192
|
executions: executions,
|
176
|
-
|
177
|
-
time: publication_time
|
193
|
+
context: publication_context
|
178
194
|
)
|
179
195
|
end
|
180
196
|
|
@@ -182,37 +198,42 @@ module Omnes
|
|
182
198
|
#
|
183
199
|
# @param event_name [Symbol] Name of the event
|
184
200
|
# @param callable [#call] Subscription callback taking the event
|
201
|
+
# @param id [Symbol] Unique identifier for the subscription
|
185
202
|
# @yield [event] Subscription callback if callable is not given
|
186
203
|
#
|
187
204
|
# @return [Omnes::Subscription]
|
188
205
|
#
|
189
206
|
# @raise [Omnes::UnknownEventError] When event name has not been registered
|
190
|
-
def subscribe(event_name, callable = nil, &block)
|
207
|
+
def subscribe(event_name, callable = nil, id: Subscription.random_id, &block)
|
191
208
|
registry.check_event_name(event_name)
|
192
209
|
|
193
|
-
subscribe_with_matcher(Subscription::SINGLE_EVENT_MATCHER.curry[event_name], callable, &block)
|
210
|
+
subscribe_with_matcher(Subscription::SINGLE_EVENT_MATCHER.curry[event_name], callable, id: id, &block)
|
194
211
|
end
|
195
212
|
|
196
213
|
# Adds a subscription for all events
|
197
214
|
#
|
198
215
|
# @param callable [#call] Subscription callback taking the event
|
216
|
+
# @param id [Symbol] Unique identifier for the subscription
|
199
217
|
# @yield [event] Subscription callback if callable is not given
|
200
218
|
#
|
201
219
|
# @return [Omnes::Subscription]
|
202
|
-
def subscribe_to_all(callable = nil, &block)
|
203
|
-
subscribe_with_matcher(Subscription::ALL_EVENTS_MATCHER, callable, &block)
|
220
|
+
def subscribe_to_all(callable = nil, id: Subscription.random_id, &block)
|
221
|
+
subscribe_with_matcher(Subscription::ALL_EVENTS_MATCHER, callable, id: id, &block)
|
204
222
|
end
|
205
223
|
|
206
224
|
# Adds a subscription with given matcher
|
207
225
|
#
|
208
226
|
# @param matcher [#call] Callable taking the event and returning a boolean
|
209
227
|
# @param callable [#call] Subscription callback taking the event
|
228
|
+
# @param id [Symbol] Unique identifier for the subscription
|
210
229
|
# @yield [event] Subscription callback if callable is not given
|
211
230
|
#
|
212
231
|
# @return [Omnes::Subscription]
|
213
|
-
def subscribe_with_matcher(matcher, callable = nil, &block)
|
232
|
+
def subscribe_with_matcher(matcher, callable = nil, id: Subscription.random_id, &block)
|
233
|
+
raise DuplicateSubscriptionIdError.new(id: id, bus: self) if subscription(id)
|
234
|
+
|
214
235
|
callback = callable || block
|
215
|
-
Subscription.new(matcher: matcher, callback: callback).tap do |subscription|
|
236
|
+
Subscription.new(matcher: matcher, callback: callback, id: id).tap do |subscription|
|
216
237
|
@subscriptions << subscription
|
217
238
|
end
|
218
239
|
end
|
@@ -257,11 +278,20 @@ module Omnes
|
|
257
278
|
performing_only(&block)
|
258
279
|
end
|
259
280
|
|
281
|
+
# Fetch a subscription by its identifier
|
282
|
+
#
|
283
|
+
# @param id [Symbol] Subscription identifier
|
284
|
+
#
|
285
|
+
# @return [Omnes::Subscription]
|
286
|
+
def subscription(id)
|
287
|
+
subscriptions.find { |subscription| subscription.id == id }
|
288
|
+
end
|
289
|
+
|
260
290
|
private
|
261
291
|
|
262
|
-
def execute_subscriptions_for_event(event)
|
292
|
+
def execute_subscriptions_for_event(event, publication_context)
|
263
293
|
subscriptions_for_event(event).map do |subscription|
|
264
|
-
subscription.(event)
|
294
|
+
subscription.(event, publication_context)
|
265
295
|
end
|
266
296
|
end
|
267
297
|
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Omnes
|
4
|
+
# Ad-hoc configurable behavior for Omnes
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
#
|
8
|
+
# ```
|
9
|
+
# Omnes.configure do |config|
|
10
|
+
# config.event.name_builder = MY_NAME_BUILDER
|
11
|
+
# end
|
12
|
+
# ```
|
13
|
+
#
|
14
|
+
# or
|
15
|
+
#
|
16
|
+
# ```
|
17
|
+
# Omnes::Event.config.name_builder = MY_NAME_BUILDER
|
18
|
+
# ```
|
19
|
+
module Configurable
|
20
|
+
# Class where readers and writers are defined
|
21
|
+
class Config
|
22
|
+
# @api private
|
23
|
+
attr_reader :settings
|
24
|
+
|
25
|
+
# @api private
|
26
|
+
def initialize
|
27
|
+
@_mutex = Mutex.new
|
28
|
+
@settings = {}
|
29
|
+
end
|
30
|
+
|
31
|
+
# @api private
|
32
|
+
def add_setting(name, default)
|
33
|
+
@_mutex.synchronize do
|
34
|
+
@settings[name] = default
|
35
|
+
define_setting_reader(name)
|
36
|
+
define_setting_writter(name)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# @api private
|
41
|
+
def add_nesting(constant, name = default_nesting_name(constant))
|
42
|
+
@_mutex.synchronize do
|
43
|
+
define_nesting_reader(constant, name)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def define_setting_reader(name)
|
50
|
+
define_singleton_method(name) { @settings[name] }
|
51
|
+
end
|
52
|
+
|
53
|
+
def define_setting_writter(name)
|
54
|
+
define_singleton_method(:"#{name}=") do |value|
|
55
|
+
@_mutex.synchronize do
|
56
|
+
@settings[name] = value
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def define_nesting_reader(constant, name)
|
62
|
+
define_singleton_method(name) { constant.config }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# @api private
|
67
|
+
def self.extended(klass)
|
68
|
+
klass.instance_variable_set(:@config, Config.new)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Returns the configuration class
|
72
|
+
#
|
73
|
+
# Use this class to access readers and writers for the defined settings or
|
74
|
+
# nested configurations
|
75
|
+
#
|
76
|
+
# @return [Configurable::Config]
|
77
|
+
def config
|
78
|
+
@config
|
79
|
+
end
|
80
|
+
|
81
|
+
# Yields the configuration class
|
82
|
+
#
|
83
|
+
# @see #config
|
84
|
+
def configure
|
85
|
+
yield @config
|
86
|
+
end
|
87
|
+
|
88
|
+
# @api private
|
89
|
+
def setting(name, default:)
|
90
|
+
config.add_setting(name, default)
|
91
|
+
end
|
92
|
+
|
93
|
+
# @api private
|
94
|
+
def nest_config(constant, name: default_nesting_name(constant))
|
95
|
+
config.add_nesting(constant, name)
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def default_nesting_name(constant)
|
101
|
+
constant.name
|
102
|
+
.split("::")
|
103
|
+
.last
|
104
|
+
.gsub(/([[:alpha:]])([[:upper:]])/, '\1_\2')
|
105
|
+
.downcase
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/lib/omnes/errors.rb
CHANGED
@@ -98,4 +98,42 @@ module Omnes
|
|
98
98
|
MSG
|
99
99
|
end
|
100
100
|
end
|
101
|
+
|
102
|
+
# Raised when given subscription id is already in use
|
103
|
+
class DuplicateSubscriptionIdError < Error
|
104
|
+
attr_reader :id, :bus
|
105
|
+
|
106
|
+
def initialize(id:, bus:)
|
107
|
+
@id = id
|
108
|
+
@bus = bus
|
109
|
+
super(default_message)
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def default_message
|
115
|
+
<<~MSG
|
116
|
+
#{id} has already been used as a subscription identifier
|
117
|
+
MSG
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Raised when trying to set an invalid subscription identifier
|
122
|
+
class InvalidSubscriptionNameError < Error
|
123
|
+
attr_reader :id
|
124
|
+
|
125
|
+
def initialize(id:)
|
126
|
+
@id = id
|
127
|
+
super(default_message)
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
def default_message
|
133
|
+
<<~MSG
|
134
|
+
#{id.inspect} is not a valid subscription identifier. Only symbols are
|
135
|
+
#allowed.
|
136
|
+
MSG
|
137
|
+
end
|
138
|
+
end
|
101
139
|
end
|
data/lib/omnes/event.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "omnes/configurable"
|
4
4
|
|
5
5
|
module Omnes
|
6
6
|
# Event mixin for custom classes
|
@@ -27,7 +27,7 @@ module Omnes
|
|
27
27
|
# bus.publish(MyEvent.new(1))
|
28
28
|
# ```
|
29
29
|
module Event
|
30
|
-
extend
|
30
|
+
extend Configurable
|
31
31
|
|
32
32
|
# Generates the event name for an event instance
|
33
33
|
#
|
data/lib/omnes/publication.rb
CHANGED
@@ -19,25 +19,16 @@ module Omnes
|
|
19
19
|
# @return [Array<Omnes::Execution>]
|
20
20
|
attr_reader :executions
|
21
21
|
|
22
|
-
#
|
22
|
+
# Publication context, shared by all triggered executions
|
23
23
|
#
|
24
|
-
#
|
25
|
-
|
26
|
-
#
|
27
|
-
# @return [Thread::Backtrace::Location]
|
28
|
-
attr_reader :caller_location
|
29
|
-
|
30
|
-
# Time of the event publication
|
31
|
-
#
|
32
|
-
# @return [Time]
|
33
|
-
attr_reader :time
|
24
|
+
# @return [Omnes::PublicationContext]
|
25
|
+
attr_reader :context
|
34
26
|
|
35
27
|
# @api private
|
36
|
-
def initialize(event:, executions:,
|
28
|
+
def initialize(event:, executions:, context:)
|
37
29
|
@event = event
|
38
30
|
@executions = executions
|
39
|
-
@
|
40
|
-
@time = time
|
31
|
+
@context = context
|
41
32
|
end
|
42
33
|
end
|
43
34
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Omnes
|
4
|
+
# Context for an event publication
|
5
|
+
#
|
6
|
+
# An instance of this class is shared between all the executions that are
|
7
|
+
# triggered by the publication of a given event. It's provided to the
|
8
|
+
# subscriptions as their second argument when they take it.
|
9
|
+
#
|
10
|
+
# This class is useful mainly for debugging and logging purposes.
|
11
|
+
class PublicationContext
|
12
|
+
# Location for the event publisher
|
13
|
+
#
|
14
|
+
# It's set by {Omnes::Bus#publish}, and it points to the caller of that
|
15
|
+
# method.
|
16
|
+
#
|
17
|
+
# @return [Thread::Backtrace::Location]
|
18
|
+
attr_reader :caller_location
|
19
|
+
|
20
|
+
# Time of the event publication
|
21
|
+
#
|
22
|
+
# @return [Time]
|
23
|
+
attr_reader :time
|
24
|
+
|
25
|
+
# @api private
|
26
|
+
def initialize(caller_location:, time:)
|
27
|
+
@caller_location = caller_location
|
28
|
+
@time = time
|
29
|
+
end
|
30
|
+
|
31
|
+
# Serialized version of a publication context
|
32
|
+
#
|
33
|
+
# @return Hash<String, String>
|
34
|
+
def serialized
|
35
|
+
{
|
36
|
+
"caller_location" => caller_location.to_s,
|
37
|
+
"time" => time.to_s
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "omnes/configurable"
|
4
4
|
|
5
5
|
module Omnes
|
6
6
|
module Subscriber
|
@@ -42,7 +42,7 @@ module Omnes
|
|
42
42
|
# Omnes.config.subscriber.adapter.active_job.serializer = :serialized_payload.to_proc
|
43
43
|
# ```
|
44
44
|
module ActiveJob
|
45
|
-
extend
|
45
|
+
extend Configurable
|
46
46
|
|
47
47
|
setting :serializer, default: :payload.to_proc
|
48
48
|
|
@@ -52,8 +52,8 @@ module Omnes
|
|
52
52
|
end
|
53
53
|
|
54
54
|
# @api private
|
55
|
-
def self.call(instance, event)
|
56
|
-
self.[].(instance, event)
|
55
|
+
def self.call(instance, event, publication_context)
|
56
|
+
self.[].(instance, event, publication_context)
|
57
57
|
end
|
58
58
|
|
59
59
|
# @api private
|
@@ -64,8 +64,12 @@ module Omnes
|
|
64
64
|
@serializer = serializer
|
65
65
|
end
|
66
66
|
|
67
|
-
def call(instance, event)
|
68
|
-
|
67
|
+
def call(instance, event, publication_context)
|
68
|
+
if Subscription.takes_publication_context?(instance.method(:perform))
|
69
|
+
instance.class.perform_later(serializer.(event), publication_context.serialized)
|
70
|
+
else
|
71
|
+
instance.class.perform_later(serializer.(event))
|
72
|
+
end
|
69
73
|
end
|
70
74
|
end
|
71
75
|
end
|
@@ -7,7 +7,7 @@ module Omnes
|
|
7
7
|
module Adapter
|
8
8
|
# Builds a callback from a method of the instance
|
9
9
|
#
|
10
|
-
# You can use instance of this class as the adapter:
|
10
|
+
# You can use an instance of this class as the adapter:
|
11
11
|
#
|
12
12
|
# ```ruby
|
13
13
|
# handle :foo, with: Adapter::Method.new(:foo)
|
@@ -29,7 +29,7 @@ module Omnes
|
|
29
29
|
def call(instance)
|
30
30
|
check_method(instance)
|
31
31
|
|
32
|
-
|
32
|
+
instance.method(name)
|
33
33
|
end
|
34
34
|
|
35
35
|
private
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "omnes/configurable"
|
4
4
|
|
5
5
|
module Omnes
|
6
6
|
module Subscriber
|
@@ -49,7 +49,7 @@ module Omnes
|
|
49
49
|
# @example
|
50
50
|
# handle :my_event, with: Adapter::Sidekiq.in(60)
|
51
51
|
module Sidekiq
|
52
|
-
extend
|
52
|
+
extend Configurable
|
53
53
|
|
54
54
|
setting :serializer, default: :payload.to_proc
|
55
55
|
|
@@ -59,8 +59,8 @@ module Omnes
|
|
59
59
|
end
|
60
60
|
|
61
61
|
# @api private
|
62
|
-
def self.call(instance, event)
|
63
|
-
self.[].(instance, event)
|
62
|
+
def self.call(instance, event, publication_context)
|
63
|
+
self.[].(instance, event, publication_context)
|
64
64
|
end
|
65
65
|
|
66
66
|
# @param seconds [Integer]
|
@@ -76,15 +76,29 @@ module Omnes
|
|
76
76
|
@serializer = serializer
|
77
77
|
end
|
78
78
|
|
79
|
-
def call(instance, event)
|
80
|
-
instance
|
79
|
+
def call(instance, event, publication_context)
|
80
|
+
if takes_publication_context?(instance)
|
81
|
+
instance.class.perform_async(serializer.(event), publication_context.serialized)
|
82
|
+
else
|
83
|
+
instance.class.perform_async(serializer.(event))
|
84
|
+
end
|
81
85
|
end
|
82
86
|
|
83
87
|
def in(seconds)
|
84
|
-
lambda do |instance, event|
|
85
|
-
|
88
|
+
lambda do |instance, event, publication_context|
|
89
|
+
if takes_publication_context?(instance)
|
90
|
+
instance.class.perform_in(seconds, serializer.(event), publication_context.serialized)
|
91
|
+
else
|
92
|
+
instance.class.perform_in(seconds, serializer.(event))
|
93
|
+
end
|
86
94
|
end
|
87
95
|
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def takes_publication_context?(instance)
|
100
|
+
Subscription.takes_publication_context?(instance.method(:perform))
|
101
|
+
end
|
88
102
|
end
|
89
103
|
end
|
90
104
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "omnes/configurable"
|
3
4
|
require "omnes/subscriber/adapter/active_job"
|
4
5
|
require "omnes/subscriber/adapter/method"
|
5
6
|
require "omnes/subscriber/adapter/sidekiq"
|
@@ -14,6 +15,11 @@ module Omnes
|
|
14
15
|
# Alternatively, they can be curried and only take the instance as an
|
15
16
|
# argument, returning a one-argument callable taking the event.
|
16
17
|
module Adapter
|
18
|
+
extend Configurable
|
19
|
+
|
20
|
+
nest_config Sidekiq
|
21
|
+
nest_config ActiveJob
|
22
|
+
|
17
23
|
# @api private
|
18
24
|
# TODO: Simplify when when we can take callables and Proc in a polymorphic
|
19
25
|
# way: https://bugs.ruby-lang.org/issues/18644
|
@@ -10,6 +10,11 @@ module Omnes
|
|
10
10
|
class State
|
11
11
|
attr_reader :subscription_definitions, :calling_cache, :autodiscover_strategy
|
12
12
|
|
13
|
+
# @api private
|
14
|
+
def self.IdType(value)
|
15
|
+
value.respond_to?(:call) ? value : ->(_instance) { value }
|
16
|
+
end
|
17
|
+
|
13
18
|
def initialize(autodiscover_strategy:, subscription_definitions: [], calling_cache: [])
|
14
19
|
@subscription_definitions = subscription_definitions
|
15
20
|
@calling_cache = calling_cache
|
@@ -21,7 +26,7 @@ module Omnes
|
|
21
26
|
|
22
27
|
autodiscover_subscription_definitions(bus, instance) unless autodiscover_strategy.nil?
|
23
28
|
|
24
|
-
definitions = subscription_definitions.map { |defn| defn.(bus) }
|
29
|
+
definitions = subscription_definitions.map { |defn| defn.(bus, instance) }
|
25
30
|
|
26
31
|
subscribe_definitions(definitions, bus, instance).tap do
|
27
32
|
mark_as_called(bus, instance)
|
@@ -50,18 +55,19 @@ module Omnes
|
|
50
55
|
add_subscription_definition do |_bus|
|
51
56
|
[
|
52
57
|
Subscription::SINGLE_EVENT_MATCHER.curry[event_name],
|
53
|
-
Adapter.Type(Adapter::Method.new(method_name))
|
58
|
+
Adapter.Type(Adapter::Method.new(method_name)),
|
59
|
+
Subscription.random_id
|
54
60
|
]
|
55
61
|
end
|
56
62
|
end
|
57
63
|
end
|
58
64
|
|
59
65
|
def subscribe_definitions(definitions, bus, instance)
|
60
|
-
matcher_with_callbacks = definitions.map do |(matcher, adapter)|
|
61
|
-
[matcher, adapter.curry[instance]]
|
66
|
+
matcher_with_callbacks = definitions.map do |(matcher, adapter, id)|
|
67
|
+
[matcher, adapter.curry[instance], id]
|
62
68
|
end
|
63
69
|
|
64
|
-
matcher_with_callbacks.map { |matcher, callback| bus.subscribe_with_matcher(matcher, callback) }
|
70
|
+
matcher_with_callbacks.map { |matcher, callback, id| bus.subscribe_with_matcher(matcher, callback, id: id) }
|
65
71
|
end
|
66
72
|
end
|
67
73
|
end
|
data/lib/omnes/subscriber.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "dry/configurable"
|
4
3
|
require "omnes/subscriber/adapter"
|
5
4
|
require "omnes/subscriber/state"
|
6
5
|
require "omnes/subscription"
|
@@ -122,14 +121,14 @@ module Omnes
|
|
122
121
|
# bus. However, you can subscribe distinct instances to the same bus or the
|
123
122
|
# same instance to different buses.
|
124
123
|
module Subscriber
|
125
|
-
extend
|
124
|
+
extend Configurable
|
126
125
|
|
127
126
|
# @api private
|
128
127
|
ON_PREFIX_STRATEGY = ->(event_name) { :"on_#{event_name}" }
|
129
128
|
|
130
129
|
setting :autodiscover, default: false
|
131
|
-
|
132
130
|
setting :autodiscover_strategy, default: ON_PREFIX_STRATEGY
|
131
|
+
nest_config Adapter
|
133
132
|
|
134
133
|
# Includes with options
|
135
134
|
#
|
@@ -193,11 +192,12 @@ module Omnes
|
|
193
192
|
#
|
194
193
|
# @param event_name [Symbol]
|
195
194
|
# @param with [Symbol, #call] Public method in the class or an adapter
|
196
|
-
|
195
|
+
# @param id [Symbol] Unique identifier for the subscription
|
196
|
+
def handle(event_name, with:, id: Subscription.random_id)
|
197
197
|
@_mutex.synchronize do
|
198
|
-
@_state.add_subscription_definition do |bus|
|
198
|
+
@_state.add_subscription_definition do |bus, instance|
|
199
199
|
bus.registry.check_event_name(event_name)
|
200
|
-
[Subscription::SINGLE_EVENT_MATCHER.curry[event_name], Adapter.Type(with)]
|
200
|
+
[Subscription::SINGLE_EVENT_MATCHER.curry[event_name], Adapter.Type(with), State.IdType(id).(instance)]
|
201
201
|
end
|
202
202
|
end
|
203
203
|
end
|
@@ -205,10 +205,11 @@ module Omnes
|
|
205
205
|
# Handles all events
|
206
206
|
#
|
207
207
|
# @param with [Symbol, #call] Public method in the class or an adapter
|
208
|
-
|
208
|
+
# @param id [Symbol] Unique identifier for the subscription
|
209
|
+
def handle_all(with:, id: Subscription.random_id)
|
209
210
|
@_mutex.synchronize do
|
210
|
-
@_state.add_subscription_definition do |_bus|
|
211
|
-
[Subscription::ALL_EVENTS_MATCHER, Adapter.Type(with)]
|
211
|
+
@_state.add_subscription_definition do |_bus, instance|
|
212
|
+
[Subscription::ALL_EVENTS_MATCHER, Adapter.Type(with), State.IdType(id).(instance)]
|
212
213
|
end
|
213
214
|
end
|
214
215
|
end
|
@@ -217,10 +218,11 @@ module Omnes
|
|
217
218
|
#
|
218
219
|
# @param matcher [#call]
|
219
220
|
# @param with [Symbol, #call] Public method in the class or an adapter
|
220
|
-
|
221
|
+
# @param id [Symbol] Unique identifier for the subscription
|
222
|
+
def handle_with_matcher(matcher, with:, id: Subscription.random_id)
|
221
223
|
@_mutex.synchronize do
|
222
|
-
@_state.add_subscription_definition do |_bus|
|
223
|
-
[matcher, Adapter.Type(with)]
|
224
|
+
@_state.add_subscription_definition do |_bus, instance|
|
225
|
+
[matcher, Adapter.Type(with), State.IdType(id).(instance)]
|
224
226
|
end
|
225
227
|
end
|
226
228
|
end
|
data/lib/omnes/subscription.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require "benchmark"
|
4
4
|
require "omnes/execution"
|
5
|
+
require "securerandom"
|
5
6
|
|
6
7
|
module Omnes
|
7
8
|
# Subscription to an event
|
@@ -24,19 +25,39 @@ module Omnes
|
|
24
25
|
ALL_EVENTS_MATCHER = ->(_candidate) { true }
|
25
26
|
|
26
27
|
# @api private
|
27
|
-
|
28
|
+
def self.random_id
|
29
|
+
SecureRandom.uuid.to_sym
|
30
|
+
end
|
31
|
+
|
32
|
+
# @api private
|
33
|
+
def self.takes_publication_context?(callable)
|
34
|
+
callable.parameters.count == 2
|
35
|
+
end
|
28
36
|
|
29
37
|
# @api private
|
30
|
-
|
38
|
+
attr_reader :matcher, :callback, :id
|
39
|
+
|
40
|
+
# @api private
|
41
|
+
def initialize(matcher:, callback:, id:)
|
42
|
+
raise Omnes::InvalidSubscriptionNameError.new(id: id) unless id.is_a?(Symbol)
|
43
|
+
|
31
44
|
@matcher = matcher
|
32
45
|
@callback = callback
|
46
|
+
@id = id
|
33
47
|
end
|
34
48
|
|
35
49
|
# @api private
|
36
|
-
def call(event)
|
50
|
+
def call(event, publication_context)
|
37
51
|
result = nil
|
38
52
|
benchmark = Benchmark.measure do
|
39
|
-
|
53
|
+
# work around Ruby not being able to tell remaining arity for a curried
|
54
|
+
# function (or uncurrying), because we want to be able to create subscriber
|
55
|
+
# adapters partially applying the subscriber instance
|
56
|
+
result = begin
|
57
|
+
@callback.(event, publication_context)
|
58
|
+
rescue ArgumentError
|
59
|
+
@callback.(event)
|
60
|
+
end
|
40
61
|
end
|
41
62
|
|
42
63
|
Execution.new(subscription: self, result: result, benchmark: benchmark)
|
data/lib/omnes/version.rb
CHANGED
data/lib/omnes.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "omnes/bus"
|
4
|
+
require "omnes/configurable"
|
4
5
|
require "omnes/event"
|
5
6
|
require "omnes/subscriber"
|
6
7
|
require "omnes/version"
|
@@ -33,43 +34,10 @@ require "omnes/version"
|
|
33
34
|
# Refer to {Omnes::Subscriber} for how to provide event handlers through methods
|
34
35
|
# defined in a class.
|
35
36
|
module Omnes
|
36
|
-
|
37
|
-
#
|
38
|
-
# TODO: Make automation for it
|
39
|
-
#
|
40
|
-
# @return [Omnes::Config]
|
41
|
-
def self.config
|
42
|
-
Config
|
43
|
-
end
|
44
|
-
|
45
|
-
# Wrapper for the configuration of Omnes components
|
46
|
-
module Config
|
47
|
-
# {Omnes::Subscriber} configuration
|
48
|
-
#
|
49
|
-
# @return [Dry::Configurable::Config]
|
50
|
-
def self.subscriber
|
51
|
-
Omnes::Subscriber.config.tap do |klass|
|
52
|
-
klass.define_singleton_method(:adapter) do
|
53
|
-
Module.new do
|
54
|
-
def self.sidekiq
|
55
|
-
Omnes::Subscriber::Adapter::Sidekiq.config
|
56
|
-
end
|
37
|
+
extend Configurable
|
57
38
|
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# {Omnes::Event} configuration
|
67
|
-
#
|
68
|
-
# @return [Dry::Configurable::Config]
|
69
|
-
def self.event
|
70
|
-
Omnes::Event.config
|
71
|
-
end
|
72
|
-
end
|
39
|
+
nest_config Subscriber
|
40
|
+
nest_config Event
|
73
41
|
|
74
42
|
# @api private
|
75
43
|
def self.included(klass)
|
data/omnes.gemspec
CHANGED
@@ -36,8 +36,6 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
37
37
|
spec.require_paths = ["lib"]
|
38
38
|
|
39
|
-
spec.add_dependency "dry-configurable", "~> 0.14"
|
40
|
-
|
41
39
|
spec.add_development_dependency "activejob", "~> 7.0"
|
42
40
|
spec.add_development_dependency "redcarpet", "~> 3.5"
|
43
41
|
spec.add_development_dependency "sidekiq", "~> 6.4"
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omnes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc Busqué
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: dry-configurable
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0.14'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0.14'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: activejob
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,10 +95,12 @@ files:
|
|
109
95
|
- bin/setup
|
110
96
|
- lib/omnes.rb
|
111
97
|
- lib/omnes/bus.rb
|
98
|
+
- lib/omnes/configurable.rb
|
112
99
|
- lib/omnes/errors.rb
|
113
100
|
- lib/omnes/event.rb
|
114
101
|
- lib/omnes/execution.rb
|
115
102
|
- lib/omnes/publication.rb
|
103
|
+
- lib/omnes/publication_context.rb
|
116
104
|
- lib/omnes/registry.rb
|
117
105
|
- lib/omnes/subscriber.rb
|
118
106
|
- lib/omnes/subscriber/adapter.rb
|
@@ -135,7 +123,7 @@ metadata:
|
|
135
123
|
source_code_uri: https://github.com/nebulab/omnes
|
136
124
|
changelog_uri: https://github.com/nebulab/omnes/CHANGELOG.md
|
137
125
|
rubygems_mfa_required: 'true'
|
138
|
-
post_install_message:
|
126
|
+
post_install_message:
|
139
127
|
rdoc_options: []
|
140
128
|
require_paths:
|
141
129
|
- lib
|
@@ -150,8 +138,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
150
138
|
- !ruby/object:Gem::Version
|
151
139
|
version: '0'
|
152
140
|
requirements: []
|
153
|
-
rubygems_version: 3.2
|
154
|
-
signing_key:
|
141
|
+
rubygems_version: 3.1.2
|
142
|
+
signing_key:
|
155
143
|
specification_version: 4
|
156
144
|
summary: Pub/Sub for ruby
|
157
145
|
test_files: []
|