observers 0.3.2 → 0.4.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 +17 -3
- data/lib/models/observer.rb +6 -6
- data/lib/observables.rb +8 -24
- data/lib/observers.rb +19 -15
- 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: 7a683d87de52e3b964c325db4cc4cb732203c594eac263aadaf513a59a0dab76
|
|
4
|
+
data.tar.gz: 50b6e45f3357de2e06b5d599c7c2614804af8db850522717f34f6524064c4f53
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a5e2e9afdb9f313a8bcaddbd8c0b309e01aa52d495458e3cb63efc3182b1c7876b87ccd227bb0fa55fb0866d31514b22fe715a58d276e610e14165d51010188e
|
|
7
|
+
data.tar.gz: ab2d9cc3aa952df58c7a7b5bfe9fa2f4f1c6eb1aa74469c8e82145324f0f45c5759126770a30d7a1252a20cccbb5dcef6d8e586eeb9d47fc48ed71c01ef9d3e8
|
data/lib/models/observable.rb
CHANGED
|
@@ -9,9 +9,23 @@ 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 trigger 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
|
|
15
29
|
end
|
|
16
30
|
end
|
|
17
31
|
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,33 @@ 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
|
-
def observe(key, action: nil, order: Observables.observables.count)
|
|
21
|
-
observer = Observer.new(observer: self, action:, order:)
|
|
22
|
-
Observables.observe(key:, observer:)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Returns the last observer with a non-nil return value.
|
|
27
|
+
# Returns the last observer's non-nil return value.
|
|
26
28
|
def trigger(key = self, action: nil, event: nil)
|
|
27
|
-
|
|
28
|
-
Observables.trigger(key:, action:, event:)
|
|
29
|
+
Observables.fetch(key).trigger(action:, event:)
|
|
29
30
|
end
|
|
30
31
|
|
|
31
32
|
# TODO: Provide a "pipe/port/take" method that uses ractors to be concurrent... if supplied with immutable Data?
|
|
32
33
|
end
|
|
34
|
+
|
|
35
|
+
# For quick debugging, not official API.
|
|
36
|
+
OOO = Observers::Observables.observables
|
data/lib/version.rb
CHANGED