event_engine-subscribers 0.1.1 → 0.3.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: d2a695d8809af3af1b9145dd9866e96aa710304f3ccdba661ec5ed46e059577e
4
- data.tar.gz: 4625cf214a4b49c8814afd693b099f5d46bfe94421ceec5d346ce362acb87e33
3
+ metadata.gz: 77ec2b6b5c9768d1968ead2a2d567e796a91747036be8d6c407137a36997c781
4
+ data.tar.gz: 4f97fd5b867ca07942c082c3e37a65e4a0bb452c6e7c4d59fd409561ccb9ea23
5
5
  SHA512:
6
- metadata.gz: '08d6aeee53d7aa109bf72227d0cc5dd9698f57307389c052ff6113eb1859018ec4e852c5c9b2ef95d6ace4f057663c4e31e1596d106d3debd72162ccef0d4efd'
7
- data.tar.gz: f0469ee662fd07bd01598b44125d1123f5a1bb2b972442c3b246ca28a1d8bb0d7a8a6b6c6dbf81c00db9f0575bdaf2598988af025c47e6dc55c2b09e96c20c53
6
+ metadata.gz: b806c0dbe05a8c57a1d3b1c0cd0fbe7937d015f5822d37c3f5feafd083d922a5f528b871564aaa8259866d8f0bd6ca4b90af63351788b8521f4baadf57346201
7
+ data.tar.gz: fcc63467dcf27dc0021304dd36821de214c30f9eff44efca1f3f2cd6a9b5a59cbe6f43693547f28e86bc4b0f7dfa949f8d912ee25c914bd1ff35328ba9aed617
data/README.md CHANGED
@@ -92,9 +92,35 @@ EventEngine::UnregisteredProcessorError: the rule for event :lead_created
92
92
  under that name
93
93
  ```
94
94
 
95
- If subscribers do not run for an event that *is* routed here, check that the
96
- subscriber class is in `app/subscribers`. A subscriber anywhere else registers only
97
- once Rails has loaded its class.
95
+ If an event is routed to `inline` or `background` and no subscriber is registered for
96
+ it, the app refuses to start and names each such event:
97
+
98
+ ```
99
+ EventEngine::Subscribers::UnsubscribedEventsError: These events are routed to
100
+ subscribers but have none: hay_baled
101
+ ```
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`.
106
+
107
+ ## Requiring every event to run inline
108
+
109
+ 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:
112
+
113
+ ```ruby
114
+ # config/application.rb
115
+ config.after_initialize do
116
+ EventEngine::Subscribers.check_inline!(EventEngine::Subscribers.routes)
117
+ end
118
+ ```
119
+
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.
98
124
 
99
125
  ## A working example app
100
126
 
@@ -0,0 +1,9 @@
1
+ module EventEngine
2
+ module Subscribers
3
+ class BackgroundEventsError < StandardError
4
+ def initialize(event_names)
5
+ super("These events are routed to run in the background, where a refusal cannot undo the change: #{event_names.join(", ")}")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -14,6 +14,10 @@ module EventEngine
14
14
  end
15
15
  end
16
16
 
17
+ initializer "event_engine.subscribers.check_every_routed_event_has_a_subscriber" do
18
+ config.after_initialize { Subscribers.check!(Subscribers.routes) }
19
+ end
20
+
17
21
  initializer "event_engine.subscribers.forget_unloaded_subscribers" do |app|
18
22
  app.reloader.before_class_unload { Registry.clear! }
19
23
  end
@@ -23,6 +23,13 @@ module EventEngine
23
23
  registrations[event_name&.to_sym] || []
24
24
  end
25
25
 
26
+ def self.unsubscribed(routes)
27
+ routes.select { |event_name, process_type| routed_to_subscribers?(process_type) && subscribers_for(event_name).empty? }.keys
28
+ end
29
+
30
+ def self.routed_to_subscribers?(process_type) = Processor::HANDLED_PROCESS_TYPES.include?(process_type&.to_sym)
31
+ private_class_method :routed_to_subscribers?
32
+
26
33
  # Removes all registrations. Intended for test isolation.
27
34
  #
28
35
  # @return [void]
@@ -0,0 +1,9 @@
1
+ module EventEngine
2
+ module Subscribers
3
+ class UnsubscribedEventsError < StandardError
4
+ def initialize(event_names)
5
+ super("These events are routed to subscribers but have none: #{event_names.join(", ")}")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  module EventEngine
2
2
  module Subscribers
3
- VERSION = "0.1.1"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -3,8 +3,34 @@ require "event_engine/subscribers/engine"
3
3
  require "event_engine/subscribers/registry"
4
4
  require "event_engine/subscribers/base"
5
5
  require "event_engine/subscribers/processor"
6
+ require "event_engine/subscribers/unsubscribed_events_error"
7
+ require "event_engine/subscribers/background_events_error"
6
8
 
7
9
  module EventEngine
8
10
  module Subscribers
11
+ def self.routes
12
+ EventEngine.schema_registry.events.to_h { |event_name| [ event_name, process_type_of(event_name) ] }
13
+ end
14
+
15
+ def self.process_type_of(event_name)
16
+ domain = EventEngine.schema_registry.latest_for(event_name).domain
17
+ EventEngine.processing_rules.for(event_name: event_name, pack: domain)
18
+ end
19
+ private_class_method :process_type_of
20
+
21
+ def self.check!(routes)
22
+ unsubscribed = Registry.unsubscribed(routes)
23
+ raise UnsubscribedEventsError, unsubscribed if unsubscribed.any?
24
+
25
+ true
26
+ end
27
+
28
+ def self.check_inline!(routes)
29
+ EventEngine.validate_rules!
30
+ background = routes.reject { |_event_name, process_type| process_type == :inline }.keys
31
+ raise BackgroundEventsError, background if background.any?
32
+
33
+ true
34
+ end
9
35
  end
10
36
  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.1.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - tylercschneider
@@ -81,10 +81,12 @@ files:
81
81
  - app/jobs/event_engine/subscribers/dispatch_subscribers_job.rb
82
82
  - app/views/layouts/event_engine/subscribers/application.html.erb
83
83
  - lib/event_engine/subscribers.rb
84
+ - lib/event_engine/subscribers/background_events_error.rb
84
85
  - lib/event_engine/subscribers/base.rb
85
86
  - lib/event_engine/subscribers/engine.rb
86
87
  - lib/event_engine/subscribers/processor.rb
87
88
  - lib/event_engine/subscribers/registry.rb
89
+ - lib/event_engine/subscribers/unsubscribed_events_error.rb
88
90
  - lib/event_engine/subscribers/version.rb
89
91
  - lib/tasks/event_engine/subscribers_tasks.rake
90
92
  - the_local/agents/event_engine-subscribers-develop.md