eventish 0.2.0 → 0.3.2
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 +22 -3
- 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 +4 -14
- 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: affdd6406fe05bcc51fa60a0bdd1e894c47412e8d8c347e2f8e4e8ed0d846757
|
4
|
+
data.tar.gz: 754e24d0338cb7eb4c6eb299371d2880b0b867a85fadb0b604ea3511a8e9ee32
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23e2bd4268d4c28a3691327e499552815fbe05d6ada3e17a887e812ec2666d4f65c8c78ac878d7ef0426403cd61760134a06f7c0d9a07da6c8e73fe440da9da0
|
7
|
+
data.tar.gz: 530d9dcd90223304e1606cbfe909ccf223d1353d1409a230807b29cf6258fa740228235975f0411484b99886ab961349a84ca73a3a432842090c7b95d69cf713
|
data/README.md
CHANGED
@@ -8,7 +8,8 @@ Yet another opinionated events library which proposes a simple API to handle...
|
|
8
8
|
The main features:
|
9
9
|
- _composable_: just require the components that you need;
|
10
10
|
- with _adapters_: support ActiveSupport::Notifications for pub/sub events;
|
11
|
-
- with _async events_: support ActiveJob for background execution
|
11
|
+
- with _async events_: support ActiveJob for background execution;
|
12
|
+
- with _callbacks_ wrapper: support ActiveRecord.
|
12
13
|
|
13
14
|
## Install
|
14
15
|
|
@@ -88,8 +89,7 @@ module Main
|
|
88
89
|
|
89
90
|
class << self
|
90
91
|
def event_name
|
91
|
-
# this is optional, if not set the
|
92
|
-
# 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
|
93
93
|
'some_event'
|
94
94
|
end
|
95
95
|
end
|
@@ -124,6 +124,25 @@ module Notifications
|
|
124
124
|
end
|
125
125
|
```
|
126
126
|
|
127
|
+
### Callbacks
|
128
|
+
|
129
|
+
Only for ActiveRecord, callbacks wrapper are available with the postfix `_event` (ex. `after_commit_event SomeEvent`).
|
130
|
+
|
131
|
+
```rb
|
132
|
+
# initializer setup
|
133
|
+
require 'eventish/active_record/callback'
|
134
|
+
```
|
135
|
+
|
136
|
+
```rb
|
137
|
+
class SomeModel < ActiveRecord::Base
|
138
|
+
extend ::Eventish::ActiveRecord::Callback
|
139
|
+
|
140
|
+
before_validation_event SomeBeforeValidationEvent
|
141
|
+
end
|
142
|
+
```
|
143
|
+
|
144
|
+
The related callback will be setup by the wrapper and the specified event class will be invoked accordingly.
|
145
|
+
|
127
146
|
## Do you like it? Star it!
|
128
147
|
|
129
148
|
If you use this component just star it. A developer is more motivated to improve a project when there is some interest.
|
@@ -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(event)
|
8
|
+
after_initialize -> { ::Eventish.publish(event, self) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def after_find_event(event)
|
12
|
+
after_find -> { ::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 ->(_object, block) { ::Eventish.publish(event, self, block: block) }
|
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 ->(_object, block) { ::Eventish.publish(event, self, block: block) }
|
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 ->(_object, block) { ::Eventish.publish(event, self, block: block) }
|
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 ->(_object, block) { ::Eventish.publish(event, self, block: block) }
|
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_create_commit_event(event)
|
82
|
+
after_create_commit -> { ::Eventish.publish(event, self) }
|
83
|
+
end
|
84
|
+
|
85
|
+
def after_update_commit_event(event)
|
86
|
+
after_update_commit -> { ::Eventish.publish(event, self) }
|
87
|
+
end
|
88
|
+
|
89
|
+
def after_save_commit_event(event)
|
90
|
+
after_save_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,25 +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,
|
22
|
-
config.adapter&.publish(event_name, target,
|
21
|
+
def publish(event_name, target = nil, block: nil)
|
22
|
+
config.adapter&.publish(event_name, target, block: block)
|
23
23
|
end
|
24
24
|
|
25
25
|
def setup
|
26
26
|
@options ||= Struct.new(*OPTIONS).new
|
27
27
|
yield(@options) if block_given?
|
28
|
-
raise
|
28
|
+
raise AdapterError, 'Please specify an event adapter' unless @options.adapter
|
29
29
|
|
30
30
|
@options
|
31
31
|
end
|
32
|
-
|
33
|
-
def underscore(camel_cased_word)
|
34
|
-
return camel_cased_word.to_s unless /[A-Z-]|::/.match?(camel_cased_word)
|
35
|
-
|
36
|
-
word = camel_cased_word.to_s.gsub(/\A.*::/, '')
|
37
|
-
word.gsub!(/([A-Z]+)(?=[A-Z][a-z])|([a-z\d])(?=[A-Z])/) { ($1 || $2) << "_" }
|
38
|
-
word.tr!("-", "_")
|
39
|
-
word.downcase!
|
40
|
-
word
|
41
|
-
end
|
42
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.2
|
4
|
+
version: 0.3.2
|
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-20 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A simple and composable event library
|
14
14
|
email: mat@blocknot.es
|
@@ -20,6 +20,7 @@ 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
25
|
- lib/eventish/event_api.rb
|
25
26
|
- lib/eventish/simple_event.rb
|