event_engine-subscribers 0.3.0 → 0.5.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 +28 -13
- data/lib/event_engine/subscribers/engine.rb +19 -0
- data/lib/event_engine/subscribers/version.rb +1 -1
- data/lib/event_engine/subscribers.rb +9 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: eae67c45dcc6b8946ca569bbf90a1e9811b5c974a98ebdf27b1030aac9dfe948
|
|
4
|
+
data.tar.gz: 6fd89515d0fd50f6324a37f605343a2f63e347ce20400e6e166536c922125405
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4f0ac3aa8052389ef2b57646d586e07492346e9f1eb3a9abf4dcd5275687e4bebd11b4e023a5df14469971c32e6c74b32ddcde1ff494ff64331171efe3b294a8
|
|
7
|
+
data.tar.gz: 5567b5513c5524d4ab3c93a3db192def68a24ad5260805b8c2c3b861009f0c46d0cbffd257e6e6c7ee4fe4bdf84db318a2841c98db48f311bbce0e12df4749d9
|
data/README.md
CHANGED
|
@@ -100,27 +100,42 @@ EventEngine::Subscribers::UnsubscribedEventsError: These events are routed to
|
|
|
100
100
|
subscribers but have none: hay_baled
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
-
The check runs once the app has started, after every class in `app/subscribers`
|
|
104
|
-
registered. A subscriber anywhere else
|
|
105
|
-
so keep subscribers in `app/subscribers
|
|
103
|
+
The check runs once the app has started, after every class in `app/subscribers` and in
|
|
104
|
+
the folders named in `subscriber_folders` is registered. A subscriber anywhere else
|
|
105
|
+
registers only once Rails has loaded its class, so keep subscribers in `app/subscribers`
|
|
106
|
+
or in a folder you name there.
|
|
106
107
|
|
|
107
|
-
##
|
|
108
|
+
## Keeping subscribers in other folders
|
|
109
|
+
|
|
110
|
+
A host that keeps subscribers outside `app/subscribers` names those folders, relative to
|
|
111
|
+
the app's root:
|
|
112
|
+
|
|
113
|
+
```ruby
|
|
114
|
+
# config/application.rb
|
|
115
|
+
config.event_engine_subscribers.subscriber_folders = ["hubs/*/app/subscribers"]
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Each entry is a folder or a pattern that matches several folders. The gem adds every
|
|
119
|
+
folder it matches to the app's eager load paths, then loads and registers its subscribers
|
|
120
|
+
when the app starts and again after each code reload, the same as `app/subscribers`. A
|
|
121
|
+
folder or pattern that matches nothing is skipped. It names no folders by default, so
|
|
122
|
+
only `app/subscribers` is loaded.
|
|
123
|
+
|
|
124
|
+
## Requiring a pack's events to run inline
|
|
108
125
|
|
|
109
126
|
A subscriber that refuses a change can only undo it when it runs inline, during the
|
|
110
|
-
emit. A host that depends on that
|
|
111
|
-
processors are registered:
|
|
127
|
+
emit. A host that depends on that names the event packs whose events must run inline:
|
|
112
128
|
|
|
113
129
|
```ruby
|
|
114
130
|
# config/application.rb
|
|
115
|
-
config.
|
|
116
|
-
EventEngine::Subscribers.check_inline!(EventEngine::Subscribers.routes)
|
|
117
|
-
end
|
|
131
|
+
config.event_engine_subscribers.inline_packs = [:console]
|
|
118
132
|
```
|
|
119
133
|
|
|
120
|
-
|
|
121
|
-
nothing registered, or when
|
|
122
|
-
|
|
123
|
-
|
|
134
|
+
When the app starts, the gem then refuses to start when an event has no rule, when a
|
|
135
|
+
rule names a processor nothing registered, or when an event in a named pack is routed to
|
|
136
|
+
`background`. The last error names every such event. Events in other packs may still
|
|
137
|
+
run in the background. With no packs named, which is the default, the gem runs no inline
|
|
138
|
+
check.
|
|
124
139
|
|
|
125
140
|
## A working example app
|
|
126
141
|
|
|
@@ -5,6 +5,15 @@ module EventEngine
|
|
|
5
5
|
class Engine < ::Rails::Engine
|
|
6
6
|
isolate_namespace EventEngine::Subscribers
|
|
7
7
|
|
|
8
|
+
config.event_engine_subscribers = ActiveSupport::OrderedOptions.new
|
|
9
|
+
config.event_engine_subscribers.inline_packs = []
|
|
10
|
+
config.event_engine_subscribers.subscriber_folders = []
|
|
11
|
+
|
|
12
|
+
initializer "event_engine.subscribers.autoload_subscriber_folders", before: :set_autoload_paths do |app|
|
|
13
|
+
folders = Subscribers.folders_matching(app.root, app.config.event_engine_subscribers.subscriber_folders)
|
|
14
|
+
app.config.eager_load_paths += folders.map(&:to_s)
|
|
15
|
+
end
|
|
16
|
+
|
|
8
17
|
initializer "event_engine.subscribers.register_processor" do
|
|
9
18
|
config.after_initialize do
|
|
10
19
|
processor = Processor.new
|
|
@@ -18,6 +27,13 @@ module EventEngine
|
|
|
18
27
|
config.after_initialize { Subscribers.check!(Subscribers.routes) }
|
|
19
28
|
end
|
|
20
29
|
|
|
30
|
+
initializer "event_engine.subscribers.check_inline_packs", after: "event_engine.subscribers.register_processor" do |app|
|
|
31
|
+
config.after_initialize do
|
|
32
|
+
packs = app.config.event_engine_subscribers.inline_packs
|
|
33
|
+
Subscribers.check_inline!(Subscribers.routes, packs: packs) if packs.any?
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
21
37
|
initializer "event_engine.subscribers.forget_unloaded_subscribers" do |app|
|
|
22
38
|
app.reloader.before_class_unload { Registry.clear! }
|
|
23
39
|
end
|
|
@@ -26,6 +42,9 @@ module EventEngine
|
|
|
26
42
|
config.to_prepare do
|
|
27
43
|
subscribers = app.root.join("app/subscribers")
|
|
28
44
|
Rails.autoloaders.main.eager_load_dir(subscribers) if subscribers.directory?
|
|
45
|
+
Subscribers.folders_matching(app.root, app.config.event_engine_subscribers.subscriber_folders).each do |folder|
|
|
46
|
+
Rails.autoloaders.main.eager_load_dir(folder)
|
|
47
|
+
end
|
|
29
48
|
end
|
|
30
49
|
end
|
|
31
50
|
end
|
|
@@ -25,12 +25,20 @@ module EventEngine
|
|
|
25
25
|
true
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
def self.check_inline!(routes)
|
|
28
|
+
def self.check_inline!(routes, packs: nil)
|
|
29
29
|
EventEngine.validate_rules!
|
|
30
30
|
background = routes.reject { |_event_name, process_type| process_type == :inline }.keys
|
|
31
|
+
background = background.select { |event_name| packs.include?(pack_of(event_name)) } if packs
|
|
31
32
|
raise BackgroundEventsError, background if background.any?
|
|
32
33
|
|
|
33
34
|
true
|
|
34
35
|
end
|
|
36
|
+
|
|
37
|
+
def self.folders_matching(root, patterns)
|
|
38
|
+
patterns.flat_map { |pattern| Dir[root.join(pattern).to_s] }.map { |folder| Pathname.new(folder) }.select(&:directory?)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.pack_of(event_name) = EventEngine.schema_registry.latest_for(event_name).domain
|
|
42
|
+
private_class_method :pack_of
|
|
35
43
|
end
|
|
36
44
|
end
|