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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 77ec2b6b5c9768d1968ead2a2d567e796a91747036be8d6c407137a36997c781
4
- data.tar.gz: 4f97fd5b867ca07942c082c3e37a65e4a0bb452c6e7c4d59fd409561ccb9ea23
3
+ metadata.gz: eae67c45dcc6b8946ca569bbf90a1e9811b5c974a98ebdf27b1030aac9dfe948
4
+ data.tar.gz: 6fd89515d0fd50f6324a37f605343a2f63e347ce20400e6e166536c922125405
5
5
  SHA512:
6
- metadata.gz: b806c0dbe05a8c57a1d3b1c0cd0fbe7937d015f5822d37c3f5feafd083d922a5f528b871564aaa8259866d8f0bd6ca4b90af63351788b8521f4baadf57346201
7
- data.tar.gz: fcc63467dcf27dc0021304dd36821de214c30f9eff44efca1f3f2cd6a9b5a59cbe6f43693547f28e86bc4b0f7dfa949f8d912ee25c914bd1ff35328ba9aed617
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` is
104
- registered. A subscriber anywhere else registers only once Rails has loaded its class,
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
- ## Requiring every event to run inline
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 calls the event start check once the subscriber
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.after_initialize do
116
- EventEngine::Subscribers.check_inline!(EventEngine::Subscribers.routes)
117
- end
131
+ config.event_engine_subscribers.inline_packs = [:console]
118
132
  ```
119
133
 
120
- The app then refuses to start when an event has no rule, when a rule names a processor
121
- nothing registered, or when any event is routed to `background`. The last error names
122
- every such event. A host that does not call it can route events to `background` as
123
- before.
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
@@ -1,5 +1,5 @@
1
1
  module EventEngine
2
2
  module Subscribers
3
- VERSION = "0.3.0"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: event_engine-subscribers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - tylercschneider