observers 0.3.2 → 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/lib/models/observable.rb +30 -3
- data/lib/models/observer.rb +6 -6
- data/lib/observables.rb +8 -24
- data/lib/observers.rb +21 -14
- data/lib/version.rb +1 -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: eb285238975fddf6f112154a0c2dba9ce47569011afd28b613c6a9ecce4f6611
|
|
4
|
+
data.tar.gz: cd5998f3e1632de38775a2f840ac4215c2bb872bf9436213d99b0b73574a3dd1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 76195d403e724f44bec4bb2b77922efaa608be434ea5462084dd0e88b1d917535f622c66935392bc53cea35b1d05114f024e4ef5498babca6eedca68c1d92517
|
|
7
|
+
data.tar.gz: 5bf9e779194597ea33148459bc92cbef3406070feadfe3d81b94ea95077eca9f697da3b1e7cd8e1f7e648306dc0b28934f68b95fea54031dadaf33092ecfdabc
|
data/lib/models/observable.rb
CHANGED
|
@@ -9,9 +9,36 @@ module Observers
|
|
|
9
9
|
@observers = []
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def
|
|
13
|
-
@observers <<
|
|
14
|
-
|
|
12
|
+
def observe(object:, action:)
|
|
13
|
+
@observers << Observer.new(object:, action:)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @returns: The result of the last observer with a non-nil value.
|
|
17
|
+
def trigger(action:, event:)
|
|
18
|
+
action = event.action if event && action.nil?
|
|
19
|
+
action = :handle if action.nil?
|
|
20
|
+
|
|
21
|
+
last_result = nil
|
|
22
|
+
|
|
23
|
+
@observers.each do |observer|
|
|
24
|
+
result = observer.trigger(action:, event:)
|
|
25
|
+
last_result = result unless result.nil?
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
last_result
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @returns: The result of the first observer with a non-nil value.
|
|
32
|
+
def take(action:, event:)
|
|
33
|
+
action = event.action if event && action.nil?
|
|
34
|
+
action = :handle if action.nil?
|
|
35
|
+
|
|
36
|
+
@observers.each do |observer|
|
|
37
|
+
result = observer.trigger(action:, event:)
|
|
38
|
+
return result unless result.nil?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
nil # This is a bad day for the take method, one of the worst.
|
|
15
42
|
end
|
|
16
43
|
end
|
|
17
44
|
end
|
data/lib/models/observer.rb
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
module Observers
|
|
4
4
|
class Observer
|
|
5
|
-
attr_reader :
|
|
5
|
+
attr_reader :object, :action
|
|
6
6
|
|
|
7
|
-
def initialize(
|
|
8
|
-
@
|
|
7
|
+
def initialize(object:, action:)
|
|
8
|
+
@object = object
|
|
9
9
|
@action = action
|
|
10
|
-
@order = order
|
|
11
10
|
end
|
|
12
11
|
|
|
13
12
|
def trigger(action:, event:)
|
|
14
13
|
action = @action if @action
|
|
15
|
-
event ? @
|
|
14
|
+
event ? @object.send(action, **{ event: }) : @object.send(action)
|
|
16
15
|
rescue ArgumentError
|
|
17
|
-
type = @
|
|
16
|
+
type = @object.instance_of?(Class) ? @object : @object.class
|
|
18
17
|
|
|
19
18
|
raise ArgumentError, "#{type}##{action} has an 'event:' keyword argument but no event was sent" if event.nil?
|
|
20
19
|
|
|
20
|
+
# TODO: An error here will bubble up to the observer that triggered this observer, overwriting this error with its error.
|
|
21
21
|
raise ArgumentError, "#{event.class} sent to #{type}##{action} but it has no 'event:' keyword argument"
|
|
22
22
|
end
|
|
23
23
|
end
|
data/lib/observables.rb
CHANGED
|
@@ -11,7 +11,14 @@ module Observers
|
|
|
11
11
|
@observables ||= {}
|
|
12
12
|
@observables
|
|
13
13
|
end
|
|
14
|
-
|
|
14
|
+
|
|
15
|
+
def fetch(key)
|
|
16
|
+
observables[key] || raise(MissingObservableError, "Observable key '#{key}' not found")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def [](key)
|
|
20
|
+
observables[key] || upsert(key:)
|
|
21
|
+
end
|
|
15
22
|
|
|
16
23
|
def upsert(key:)
|
|
17
24
|
observables[key] = Observable.new(key:) if observables[key].nil?
|
|
@@ -21,29 +28,6 @@ module Observers
|
|
|
21
28
|
def reset
|
|
22
29
|
@observables = {}
|
|
23
30
|
end
|
|
24
|
-
|
|
25
|
-
def observe(key:, observer:)
|
|
26
|
-
observable = observables[key] || upsert(key:)
|
|
27
|
-
observable.add_observer(observer:)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# @return: The result of the last trigger with a non-nil value.
|
|
31
|
-
def trigger(key:, action:, event:)
|
|
32
|
-
action = event.action if event && action.nil?
|
|
33
|
-
action = :handle if action.nil?
|
|
34
|
-
|
|
35
|
-
observable = observables[key]
|
|
36
|
-
raise MissingObservableError, "Observable key '#{key}' not found" if observable.nil?
|
|
37
|
-
|
|
38
|
-
last_result = nil
|
|
39
|
-
|
|
40
|
-
observables[key].observers.each do |observer|
|
|
41
|
-
result = observer.trigger(action:, event:)
|
|
42
|
-
last_result = result unless result.nil?
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
last_result
|
|
46
|
-
end
|
|
47
31
|
end
|
|
48
32
|
end
|
|
49
33
|
end
|
data/lib/observers.rb
CHANGED
|
@@ -4,29 +4,36 @@ require_relative 'observables'
|
|
|
4
4
|
require_relative 'models/observer'
|
|
5
5
|
|
|
6
6
|
module Observers
|
|
7
|
-
|
|
8
|
-
klass
|
|
7
|
+
class << self
|
|
8
|
+
def included(klass)
|
|
9
|
+
klass.extend Observers
|
|
10
|
+
end
|
|
9
11
|
end
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
+
# Add an observer on the observable side.
|
|
14
|
+
def observers(key: self)
|
|
15
|
+
Struct.new(:key) do
|
|
16
|
+
def <<(object, action: nil)
|
|
17
|
+
Observables[key].observe(object:, action:)
|
|
18
|
+
end
|
|
19
|
+
end.new(key)
|
|
13
20
|
end
|
|
14
21
|
|
|
15
|
-
|
|
16
|
-
|
|
22
|
+
# Add an observer on the observer side.
|
|
23
|
+
def observe(key, action: nil)
|
|
24
|
+
Observables[key].observe(object: self, action:)
|
|
17
25
|
end
|
|
18
26
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
observer = Observer.new(observer: self, action:, order:)
|
|
22
|
-
Observables.observe(key:, observer:)
|
|
27
|
+
def trigger(key = self, action: nil, event: nil)
|
|
28
|
+
Observables.fetch(key).trigger(action:, event:)
|
|
23
29
|
end
|
|
24
30
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
# TODO: Parsing logic can be simplified/removed now that action and event args are separated.
|
|
28
|
-
Observables.trigger(key:, action:, event:)
|
|
31
|
+
def take(key = self, action: nil, event: nil)
|
|
32
|
+
Observables.fetch(key).take(action:, event:)
|
|
29
33
|
end
|
|
30
34
|
|
|
31
35
|
# TODO: Provide a "pipe/port/take" method that uses ractors to be concurrent... if supplied with immutable Data?
|
|
32
36
|
end
|
|
37
|
+
|
|
38
|
+
# For quick debugging, not official API.
|
|
39
|
+
OOO = Observers::Observables.observables
|
data/lib/version.rb
CHANGED