pubsub_on_rails 1.0.0 → 1.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 +4 -4
- data/README.md +86 -11
- data/lib/pub_sub/event_emission.rb +11 -7
- data/lib/pub_sub/event_with_type.rb +5 -1
- data/lib/pub_sub/version.rb +1 -1
- data/pubsub_on_rails-1.0.0.gem +0 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 665f27ae9c49ccdd0f1b87c8f5b788a558ebee2a22848f3ab04e272528df7e17
|
4
|
+
data.tar.gz: c7107b6d788c1ac9a0069b104b6e4db211a692ef4a6345c613a62fcbcd306859
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a0f58bbe6dd2ff109934781c580c3ac5b1a711db532a4f0a61f2a005b3b6fee0d4c89391cf53f6d33c0dc65972ccddb34843e551121053641781499fb7d0d7e
|
7
|
+
data.tar.gz: c1895dffa35a785cd78ff6ab62e2e5c5fb10c4937d96b81f7d44cfe63908d101eb30073054ef1dfd17829ebfa72a47f9ee8275e1df813c89ad1d40a7a29c6fb2
|
data/README.md
CHANGED
@@ -16,8 +16,50 @@ This is especially true for applications covering many side effects, integration
|
|
16
16
|
```ruby
|
17
17
|
# Gemfile
|
18
18
|
|
19
|
+
gem 'pubsub_on_rails', '~> 1.1.0'
|
20
|
+
|
21
|
+
# config/initializers/pub_sub.rb
|
22
|
+
|
23
|
+
require 'pub_sub/subscriptions_list'
|
24
|
+
|
25
|
+
Rails.configuration.to_prepare do
|
26
|
+
Rails.configuration.event_store = event_store = RailsEventStore::Client.new(
|
27
|
+
repository: RailsEventStoreActiveRecord::EventRepository.new(serializer: RubyEventStore::NULL)
|
28
|
+
)
|
29
|
+
|
30
|
+
PubSub::SubscriptionsList.config_path =
|
31
|
+
Rails.root.join('config/subscriptions.yml')
|
32
|
+
PubSub::SubscriptionsList.load!(event_store)
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
## Migrating from 0.0.7 to 1.0.0
|
37
|
+
|
38
|
+
1. Update gem to version `1.0.0`
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
# Gemfile
|
42
|
+
|
19
43
|
gem 'pubsub_on_rails', '~> 1.0.0'
|
44
|
+
```
|
45
|
+
|
46
|
+
2. Run Rails Event Store migrations
|
47
|
+
|
48
|
+
**MySQL**
|
49
|
+
```
|
50
|
+
bin/rails generate rails_event_store_active_record:migration
|
51
|
+
bin/rails db:migrate
|
52
|
+
```
|
20
53
|
|
54
|
+
**PostgreSQL**
|
55
|
+
```
|
56
|
+
bin/rails generate rails_event_store_active_record:migration --data-type=jsonb
|
57
|
+
bin/rails db:migrate
|
58
|
+
```
|
59
|
+
|
60
|
+
3. Update initializer to use Rails Event Store Client
|
61
|
+
|
62
|
+
```ruby
|
21
63
|
# config/initializers/pub_sub.rb
|
22
64
|
|
23
65
|
require 'pub_sub/subscriptions_list'
|
@@ -33,6 +75,31 @@ Rails.configuration.to_prepare do
|
|
33
75
|
end
|
34
76
|
```
|
35
77
|
|
78
|
+
4. Override `EventWorker` or override `EventHandlerBuilder` if needed
|
79
|
+
|
80
|
+
For example when you want to have different workers for different events:
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
# config/initializers/pub_sub.rb
|
84
|
+
|
85
|
+
PubSub::EventHandlerBuilder.class_eval do
|
86
|
+
def call(event)
|
87
|
+
if async?
|
88
|
+
if class_name.to_s.include?('MyType')
|
89
|
+
SingleThreadEventWorker.perform_in(2.seconds, class_name.to_s, event.event_id)
|
90
|
+
else
|
91
|
+
EventWorker.perform_in(2.seconds, class_name.to_s, event.event_id)
|
92
|
+
end
|
93
|
+
else
|
94
|
+
class_name.new(event).call!
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
```
|
99
|
+
|
100
|
+
5. Add event objects for Rails Event Store streams. Check [Event](README.md#Event) section.
|
101
|
+
6. Update test cases to use new matchers. Check [Testing](README.md#Testing) section.
|
102
|
+
|
36
103
|
## Entities
|
37
104
|
|
38
105
|
There are five entities that are core to PubSub on Rails: domains, events, event publishers, event handlers and subscriptions.
|
@@ -69,13 +136,17 @@ Event example:
|
|
69
136
|
```ruby
|
70
137
|
# app/events/ordering/order_created_event.rb
|
71
138
|
|
72
|
-
module
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
139
|
+
module PubSub
|
140
|
+
module Ordering
|
141
|
+
class OrderCreatedEvent < PubSub::EventWithType
|
142
|
+
schema do
|
143
|
+
attribute :order_id, Types::Strict::Integer
|
144
|
+
attribute :customer_id, Types::Strict::Integer
|
145
|
+
attribute :line_items, Types::Strict::Array
|
146
|
+
attribute :total_amount, Types::Strict::Float
|
147
|
+
attribute :comment, Types::Strict::String.optional
|
148
|
+
end
|
149
|
+
end
|
79
150
|
end
|
80
151
|
end
|
81
152
|
```
|
@@ -351,15 +422,19 @@ logging:
|
|
351
422
|
|
352
423
|
## Payload verification
|
353
424
|
|
354
|
-
Every time event is emitted, its payload is supplied to corresponding event class and is verified.
|
425
|
+
Every time event is emitted, its payload is supplied to corresponding `Dry::Struct` event class and is verified.
|
355
426
|
This ensures that whenever we emit event we can be sure its payload is matching specification.
|
356
427
|
|
357
428
|
Example:
|
358
429
|
|
359
430
|
```ruby
|
360
|
-
module
|
361
|
-
|
362
|
-
|
431
|
+
module PubSub
|
432
|
+
module Accounts
|
433
|
+
class PersonCreatedEvent < PubSub::EventWithType
|
434
|
+
schema do
|
435
|
+
attribute :person_id, Types::Strict::Integer
|
436
|
+
end
|
437
|
+
end
|
363
438
|
end
|
364
439
|
end
|
365
440
|
```
|
@@ -48,22 +48,18 @@ module PubSub
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
def dry_struct_event_class
|
52
|
-
@dry_struct_event_class ||= event_class.name.remove('PubSub').constantize
|
53
|
-
end
|
54
|
-
|
55
51
|
# rubocop:disable Metrics/MethodLength
|
56
52
|
def full_payload
|
57
|
-
|
53
|
+
attribute_names.each_with_object({}) do |attribute_name, result|
|
58
54
|
result[attribute_name] = PayloadAttribute.new(
|
59
55
|
attribute_name, explicit_payload, context
|
60
56
|
).get
|
61
57
|
rescue PayloadAttribute::CannotEvaluate => e
|
62
|
-
next if
|
58
|
+
next if schema.key(attribute_name).default?
|
63
59
|
|
64
60
|
raise(
|
65
61
|
EventPayloadArgumentMissing,
|
66
|
-
"Event [#{
|
62
|
+
"Event [#{event_class.name}] expects [#{attribute_name}] " \
|
67
63
|
"payload attribute to be either exposed as [#{e.message}] method in emitting object " \
|
68
64
|
'or provided as argument'
|
69
65
|
)
|
@@ -71,6 +67,14 @@ module PubSub
|
|
71
67
|
end
|
72
68
|
# rubocop:enable Metrics/MethodLength
|
73
69
|
|
70
|
+
def attribute_names
|
71
|
+
(abstract_event_class || event_class.instance_variable_get(:@schema_validator)).attribute_names
|
72
|
+
end
|
73
|
+
|
74
|
+
def schema
|
75
|
+
(abstract_event_class || event_class.instance_variable_get(:@schema_validator)).schema
|
76
|
+
end
|
77
|
+
|
74
78
|
def event_store
|
75
79
|
Rails.configuration.event_store
|
76
80
|
end
|
@@ -4,7 +4,7 @@ module PubSub
|
|
4
4
|
super(
|
5
5
|
event_id:,
|
6
6
|
metadata:,
|
7
|
-
data: self.class.
|
7
|
+
data: self.class.instance_variable_get(:@schema_validator).new(
|
8
8
|
data.deep_symbolize_keys
|
9
9
|
).attributes
|
10
10
|
)
|
@@ -13,5 +13,9 @@ module PubSub
|
|
13
13
|
def stream_names
|
14
14
|
[]
|
15
15
|
end
|
16
|
+
|
17
|
+
def self.schema(&block)
|
18
|
+
instance_variable_set(:@schema_validator, Class.new(Dry::Struct, &block))
|
19
|
+
end
|
16
20
|
end
|
17
21
|
end
|
data/lib/pub_sub/version.rb
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pubsub_on_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stevo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-struct
|
@@ -96,6 +96,7 @@ files:
|
|
96
96
|
- lib/pub_sub/version.rb
|
97
97
|
- lib/pubsub_on_rails.rb
|
98
98
|
- pubsub_on_rails-0.0.7.gem
|
99
|
+
- pubsub_on_rails-1.0.0.gem
|
99
100
|
- pubsub_on_rails.gemspec
|
100
101
|
homepage: https://github.com/Selleo/pubsub_on_rails
|
101
102
|
licenses:
|