eventish 0.1.0 → 0.3.1
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 +17 -17
- data/lib/eventish/active_record/callback.rb +107 -0
- data/lib/eventish/adapters/active_support.rb +15 -7
- data/lib/eventish/event_api.rb +1 -2
- data/lib/eventish/version.rb +1 -1
- data/lib/eventish.rb +6 -12
- metadata +3 -3
- data/lib/eventish/callback.rb +0 -48
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f5572d1bca258f0f1c9bd4e09e3743f99bf3045c82013c9742e1b06cfb3c590
|
4
|
+
data.tar.gz: abe5bdf2cbe1998404c21686ee97758681be8e038c0af03c67b7be1cbed2c8c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 885eb9228852f4d143a52ca2db3b622eead0bb9c57bc47fecb8ce29ce9694488973151a1bcaf07df2783192aa362dd3626c200ca36a39afc721a6f5c22cc6222
|
7
|
+
data.tar.gz: e86ca0a3133a144c709a3a1cc76b2ba777d5995a8068ba202b6570bc4c31ab14e73fea390e3898825276bbc97651dfcdecb978af2266880f47219e810fc00d03
|
data/README.md
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
# Eventish
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/eventish)
|
4
|
+
[](https://github.com/blocknotes/eventish/actions/workflows/main.yml)
|
5
|
+
|
3
6
|
Yet another opinionated events library which proposes a simple API to handle... events 🎉
|
4
7
|
|
5
8
|
The main features:
|
6
|
-
-
|
7
|
-
- with
|
8
|
-
- with
|
9
|
-
- with
|
9
|
+
- _composable_: just require the components that you need;
|
10
|
+
- with _adapters_: support ActiveSupport::Notifications for pub/sub events;
|
11
|
+
- with _async events_: support ActiveJob for background execution;
|
12
|
+
- with _callbacks_ wrapper: support ActiveRecord.
|
10
13
|
|
11
14
|
## Install
|
12
15
|
|
@@ -31,7 +34,7 @@ end
|
|
31
34
|
Rails.configuration.after_initialize do
|
32
35
|
Eventish::SimpleEvent.subscribe_all # NOTE: events will be available after this point
|
33
36
|
|
34
|
-
Eventish.
|
37
|
+
Eventish.publish('app_loaded') # just a test event
|
35
38
|
end
|
36
39
|
```
|
37
40
|
|
@@ -86,8 +89,7 @@ module Main
|
|
86
89
|
|
87
90
|
class << self
|
88
91
|
def event_name
|
89
|
-
# this is optional, if not set the
|
90
|
-
# in this sample it would be "test" - TestEvent => underscore => remove _event suffix
|
92
|
+
# this is optional, if not set the class name to string will be used
|
91
93
|
'some_event'
|
92
94
|
end
|
93
95
|
end
|
@@ -95,7 +97,7 @@ module Main
|
|
95
97
|
end
|
96
98
|
```
|
97
99
|
|
98
|
-
Publish the event: `Eventish.
|
100
|
+
Publish the event: `Eventish.publish('some_event')`
|
99
101
|
|
100
102
|
### Async events
|
101
103
|
|
@@ -124,24 +126,22 @@ end
|
|
124
126
|
|
125
127
|
### Callbacks
|
126
128
|
|
127
|
-
|
128
|
-
This is just a glue component to have callbacks with a nice syntax.
|
129
|
+
Only for ActiveRecord, callbacks wrapper are available with the postfix `_event` (ex. `after_commit_event SomeEvent`).
|
129
130
|
|
130
131
|
```rb
|
131
132
|
# initializer setup
|
132
|
-
require 'eventish/callback'
|
133
|
+
require 'eventish/active_record/callback'
|
133
134
|
```
|
134
135
|
|
135
|
-
Sample model usage:
|
136
|
-
|
137
136
|
```rb
|
138
|
-
class
|
139
|
-
|
140
|
-
|
137
|
+
class SomeModel < ActiveRecord::Base
|
138
|
+
extend ::Eventish::ActiveRecord::Callback
|
139
|
+
|
140
|
+
before_validation_event SomeBeforeValidationEvent
|
141
141
|
end
|
142
142
|
```
|
143
143
|
|
144
|
-
|
144
|
+
The related callback will be setup by the wrapper and the specified event class will be invoked accordingly.
|
145
145
|
|
146
146
|
## Do you like it? Star it!
|
147
147
|
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Eventish
|
4
|
+
module ActiveRecord
|
5
|
+
module Callback
|
6
|
+
# Init events
|
7
|
+
def after_initialize_event
|
8
|
+
before_validation -> { ::Eventish.publish(event, self) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def after_find_event
|
12
|
+
before_validation -> { ::Eventish.publish(event, self) }
|
13
|
+
end
|
14
|
+
|
15
|
+
# Validation events
|
16
|
+
def before_validation_event(event)
|
17
|
+
before_validation -> { ::Eventish.publish(event, self) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def after_validation_event(event)
|
21
|
+
after_validation -> { ::Eventish.publish(event, self) }
|
22
|
+
end
|
23
|
+
|
24
|
+
# Create events
|
25
|
+
def before_create_event(event)
|
26
|
+
before_create -> { ::Eventish.publish(event, self) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def around_create_event(event)
|
30
|
+
around_create -> { ::Eventish.publish(event, self) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def after_create_event(event)
|
34
|
+
after_create -> { ::Eventish.publish(event, self) }
|
35
|
+
end
|
36
|
+
|
37
|
+
# Update events
|
38
|
+
def before_update_event(event)
|
39
|
+
before_update -> { ::Eventish.publish(event, self) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def around_update_event(event)
|
43
|
+
around_update -> { ::Eventish.publish(event, self) }
|
44
|
+
end
|
45
|
+
|
46
|
+
def after_update_event(event)
|
47
|
+
after_update -> { ::Eventish.publish(event, self) }
|
48
|
+
end
|
49
|
+
|
50
|
+
# Save events
|
51
|
+
def before_save_event(event)
|
52
|
+
before_save -> { ::Eventish.publish(event, self) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def around_save_event(event)
|
56
|
+
around_save -> { ::Eventish.publish(event, self) }
|
57
|
+
end
|
58
|
+
|
59
|
+
def after_save_event(event)
|
60
|
+
after_save -> { ::Eventish.publish(event, self) }
|
61
|
+
end
|
62
|
+
|
63
|
+
# Destroy events
|
64
|
+
def before_destroy_event(event)
|
65
|
+
before_destroy -> { ::Eventish.publish(event, self) }
|
66
|
+
end
|
67
|
+
|
68
|
+
def around_destroy_event(event)
|
69
|
+
around_destroy -> { ::Eventish.publish(event, self) }
|
70
|
+
end
|
71
|
+
|
72
|
+
def after_destroy_event(event)
|
73
|
+
after_destroy -> { ::Eventish.publish(event, self) }
|
74
|
+
end
|
75
|
+
|
76
|
+
# Commit events
|
77
|
+
def after_commit_event(event)
|
78
|
+
after_commit -> { ::Eventish.publish(event, self) }
|
79
|
+
end
|
80
|
+
|
81
|
+
def after_save_commit_event(event)
|
82
|
+
after_save_commit -> { ::Eventish.publish(event, self) }
|
83
|
+
end
|
84
|
+
|
85
|
+
def after_create_commit_event(event)
|
86
|
+
after_create_commit -> { ::Eventish.publish(event, self) }
|
87
|
+
end
|
88
|
+
|
89
|
+
def after_update_commit_event(event)
|
90
|
+
after_update_commit -> { ::Eventish.publish(event, self) }
|
91
|
+
end
|
92
|
+
|
93
|
+
def after_destroy_commit_event(event)
|
94
|
+
after_destroy_commit -> { ::Eventish.publish(event, self) }
|
95
|
+
end
|
96
|
+
|
97
|
+
def after_rollback_event(event)
|
98
|
+
after_rollback -> { ::Eventish.publish(event, self) }
|
99
|
+
end
|
100
|
+
|
101
|
+
# Touch events
|
102
|
+
def after_touch_event(event)
|
103
|
+
after_touch -> { ::Eventish.publish(event, self) }
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -4,19 +4,27 @@ module Eventish
|
|
4
4
|
class Adapters
|
5
5
|
class ActiveSupport
|
6
6
|
class << self
|
7
|
-
def publish(
|
8
|
-
|
7
|
+
def publish(event, target = nil, block: nil)
|
8
|
+
raise ArgumentError, 'Missing event to publish' if event.nil?
|
9
|
+
|
10
|
+
options = { block: block }
|
11
|
+
::ActiveSupport::Notifications.instrument(event.to_s, target: target, options: options)
|
9
12
|
end
|
10
13
|
|
11
|
-
def subscribe(
|
12
|
-
|
14
|
+
def subscribe(event, handler)
|
15
|
+
raise ArgumentError, 'Missing event to subscribe' if event.nil?
|
16
|
+
raise ArgumentError, 'Missing handler for subscription' if handler.nil?
|
17
|
+
|
18
|
+
::ActiveSupport::Notifications.subscribe(event.to_s) do |name, start, finish, id, payload|
|
13
19
|
args = { event: name, id: id, start: start, finish: finish }
|
14
|
-
handler.trigger(payload[:target], args, &payload
|
20
|
+
handler.trigger(payload[:target], args, &payload.dig(:options, :block))
|
15
21
|
end
|
16
22
|
end
|
17
23
|
|
18
|
-
def unsubscribe(
|
19
|
-
|
24
|
+
def unsubscribe(event)
|
25
|
+
raise ArgumentError, 'Missing event to unsubscribe' if event.nil?
|
26
|
+
|
27
|
+
::ActiveSupport::Notifications.unsubscribe(event.to_s)
|
20
28
|
end
|
21
29
|
end
|
22
30
|
end
|
data/lib/eventish/event_api.rb
CHANGED
data/lib/eventish/version.rb
CHANGED
data/lib/eventish.rb
CHANGED
@@ -6,7 +6,7 @@ require_relative 'eventish/simple_event'
|
|
6
6
|
module Eventish
|
7
7
|
OPTIONS = %i[adapter].freeze
|
8
8
|
|
9
|
-
|
9
|
+
AdapterError = Class.new(StandardError)
|
10
10
|
|
11
11
|
module_function
|
12
12
|
|
@@ -18,21 +18,15 @@ module Eventish
|
|
18
18
|
@options ||= Struct.new(*OPTIONS).new # rubocop:disable Naming/MemoizedInstanceVariableName
|
19
19
|
end
|
20
20
|
|
21
|
+
def publish(event_name, target = nil, block: nil)
|
22
|
+
config.adapter&.publish(event_name, target, block: block)
|
23
|
+
end
|
24
|
+
|
21
25
|
def setup
|
22
26
|
@options ||= Struct.new(*OPTIONS).new
|
23
27
|
yield(@options) if block_given?
|
24
|
-
raise
|
28
|
+
raise AdapterError, 'Please specify an event adapter' unless @options.adapter
|
25
29
|
|
26
30
|
@options
|
27
31
|
end
|
28
|
-
|
29
|
-
def underscore(camel_cased_word)
|
30
|
-
return camel_cased_word.to_s unless /[A-Z-]|::/.match?(camel_cased_word)
|
31
|
-
|
32
|
-
word = camel_cased_word.to_s.gsub(/\A.*::/, '')
|
33
|
-
word.gsub!(/([A-Z]+)(?=[A-Z][a-z])|([a-z\d])(?=[A-Z])/) { ($1 || $2) << "_" }
|
34
|
-
word.tr!("-", "_")
|
35
|
-
word.downcase!
|
36
|
-
word
|
37
|
-
end
|
38
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eventish
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mattia Roccoberton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-19 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A simple and composable event library
|
14
14
|
email: mat@blocknot.es
|
@@ -20,8 +20,8 @@ files:
|
|
20
20
|
- README.md
|
21
21
|
- lib/eventish.rb
|
22
22
|
- lib/eventish/active_job_event.rb
|
23
|
+
- lib/eventish/active_record/callback.rb
|
23
24
|
- lib/eventish/adapters/active_support.rb
|
24
|
-
- lib/eventish/callback.rb
|
25
25
|
- lib/eventish/event_api.rb
|
26
26
|
- lib/eventish/simple_event.rb
|
27
27
|
- lib/eventish/version.rb
|
data/lib/eventish/callback.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Eventish
|
4
|
-
class Callback
|
5
|
-
class << self
|
6
|
-
def callback_event(target, &block)
|
7
|
-
event = "#{Eventish.underscore(target.class.to_s)}_#{__callee__}"
|
8
|
-
Eventish.adapter.publish(event, target, &block)
|
9
|
-
end
|
10
|
-
|
11
|
-
def callback_commit_event(target, &block)
|
12
|
-
event = "#{Eventish.underscore(target.class.to_s)}_after_commit"
|
13
|
-
Eventish.adapter.publish(event, target, &block)
|
14
|
-
end
|
15
|
-
|
16
|
-
alias_method :after_initialize, :callback_event
|
17
|
-
alias_method :after_find, :callback_event
|
18
|
-
|
19
|
-
alias_method :before_validation, :callback_event
|
20
|
-
alias_method :after_validation, :callback_event
|
21
|
-
|
22
|
-
alias_method :before_create, :callback_event
|
23
|
-
alias_method :around_create, :callback_event
|
24
|
-
alias_method :after_create, :callback_event
|
25
|
-
|
26
|
-
alias_method :before_update, :callback_event
|
27
|
-
alias_method :around_update, :callback_event
|
28
|
-
alias_method :after_update, :callback_event
|
29
|
-
|
30
|
-
alias_method :before_save, :callback_event
|
31
|
-
alias_method :around_save, :callback_event
|
32
|
-
alias_method :after_save, :callback_event
|
33
|
-
|
34
|
-
alias_method :before_destroy, :callback_event
|
35
|
-
alias_method :around_destroy, :callback_event
|
36
|
-
alias_method :after_destroy, :callback_event
|
37
|
-
|
38
|
-
alias_method :after_commit, :callback_commit_event
|
39
|
-
alias_method :after_save_commit, :callback_commit_event # => after_commit
|
40
|
-
alias_method :after_create_commit, :callback_commit_event # => after_commit
|
41
|
-
alias_method :after_update_commit, :callback_commit_event # => after_commit
|
42
|
-
alias_method :after_destroy_commit, :callback_commit_event # => after_commit
|
43
|
-
alias_method :after_rollback, :callback_event
|
44
|
-
|
45
|
-
alias_method :after_touch, :callback_event
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|