observers 0.2.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/lib/models/observer.rb +4 -1
- data/lib/observables.rb +16 -30
- data/lib/observers.rb +15 -9
- data/lib/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3803ec73448522b725c60b2929a3f3fe2fee1e87f102b5a75f8fadbebc2beec9
|
|
4
|
+
data.tar.gz: 9d4e91f3e4026c4fc813b338e8baf2b45164c46681e404e10b5a53c539302a60
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 64bec520fd5246a61892e71ec40609b1e5cdaf00ef4e1cf9c28c5f1e0c27e9a6e561f3d6db2e3b89bb596d8c4d867deb4aac8c18cba97a80085e5d7149f458be
|
|
7
|
+
data.tar.gz: bb87af0e748a370272c760b80236694228596a0d9e702d2636f8854122f72636b5607f28cec56b9bef483f449a79dd0e5d8c67b659586b6742d881a97f044445
|
data/lib/models/observer.rb
CHANGED
|
@@ -12,9 +12,12 @@ module Observers
|
|
|
12
12
|
|
|
13
13
|
def trigger(action:, event:)
|
|
14
14
|
action = @action if @action
|
|
15
|
-
event ? @observer.send(action, **{ event:
|
|
15
|
+
event ? @observer.send(action, **{ event: }) : @observer.send(action)
|
|
16
16
|
rescue ArgumentError
|
|
17
17
|
type = @observer.instance_of?(Class) ? @observer : @observer.class
|
|
18
|
+
|
|
19
|
+
raise ArgumentError, "#{type}##{action} has an 'event:' keyword argument but no event was sent" if event.nil?
|
|
20
|
+
|
|
18
21
|
raise ArgumentError, "#{event.class} sent to #{type}##{action} but it has no 'event:' keyword argument"
|
|
19
22
|
end
|
|
20
23
|
end
|
data/lib/observables.rb
CHANGED
|
@@ -4,59 +4,45 @@ require_relative 'models/observable'
|
|
|
4
4
|
|
|
5
5
|
module Observers
|
|
6
6
|
class Observables
|
|
7
|
+
class MissingObservableError < StandardError; end
|
|
8
|
+
|
|
7
9
|
class << self
|
|
8
10
|
def observables
|
|
9
11
|
@observables ||= {}
|
|
10
12
|
@observables
|
|
11
13
|
end
|
|
12
|
-
|
|
13
|
-
def reset
|
|
14
|
-
@observables = {}
|
|
15
|
-
end
|
|
14
|
+
alias all observables
|
|
16
15
|
|
|
17
16
|
def upsert(key:)
|
|
18
17
|
observables[key] = Observable.new(key:) if observables[key].nil?
|
|
19
18
|
observables[key]
|
|
20
19
|
end
|
|
21
20
|
|
|
21
|
+
def reset
|
|
22
|
+
@observables = {}
|
|
23
|
+
end
|
|
24
|
+
|
|
22
25
|
def observe(key:, observer:)
|
|
23
26
|
observable = observables[key] || upsert(key:)
|
|
24
27
|
observable.add_observer(observer:)
|
|
25
28
|
end
|
|
26
29
|
|
|
27
|
-
|
|
28
|
-
|
|
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?
|
|
29
34
|
|
|
30
|
-
observables[key]
|
|
31
|
-
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
nil # The trigger method is boring and uneventful, it fires events and if it doesn't complain then all is okay.
|
|
35
|
-
end
|
|
35
|
+
observable = observables[key]
|
|
36
|
+
raise MissingObservableError, "Observable key '#{key}' not found" if observable.nil?
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
action, event = parse_actionable(actionable:)
|
|
38
|
+
last_result = nil
|
|
39
39
|
|
|
40
40
|
observables[key].observers.each do |observer|
|
|
41
41
|
result = observer.trigger(action:, event:)
|
|
42
|
-
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
nil # This is a bad day for the take method, one of the worst.
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
private
|
|
49
|
-
|
|
50
|
-
def parse_actionable(actionable:)
|
|
51
|
-
action = actionable
|
|
52
|
-
event = nil
|
|
53
|
-
|
|
54
|
-
if actionable.class.ancestors.any? { |ancestor| ancestor.to_s == 'Low::Event' }
|
|
55
|
-
event = actionable
|
|
56
|
-
action = event.action
|
|
42
|
+
last_result = result unless result.nil?
|
|
57
43
|
end
|
|
58
44
|
|
|
59
|
-
|
|
45
|
+
last_result
|
|
60
46
|
end
|
|
61
47
|
end
|
|
62
48
|
end
|
data/lib/observers.rb
CHANGED
|
@@ -4,23 +4,29 @@ require_relative 'observables'
|
|
|
4
4
|
require_relative 'models/observer'
|
|
5
5
|
|
|
6
6
|
module Observers
|
|
7
|
+
def self.included(klass)
|
|
8
|
+
klass.extend Observers
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def observables
|
|
12
|
+
Observables.observables
|
|
13
|
+
end
|
|
14
|
+
|
|
7
15
|
def observable(key = self)
|
|
8
16
|
Observables.upsert(key:)
|
|
9
17
|
end
|
|
10
18
|
|
|
11
19
|
# TODO: Unit test order.
|
|
12
|
-
def observe(key,
|
|
13
|
-
observer = Observer.new(observer: self, action
|
|
20
|
+
def observe(key, overridden_action: nil, order: Observables.observables.count)
|
|
21
|
+
observer = Observer.new(observer: self, action: overridden_action, order:)
|
|
14
22
|
Observables.observe(key:, observer:)
|
|
15
23
|
end
|
|
16
24
|
|
|
17
|
-
|
|
18
|
-
|
|
25
|
+
# Returns the last observer with a non-nil return value.
|
|
26
|
+
def trigger(key = self, action: nil, event: nil)
|
|
27
|
+
# TODO: Parsing logic can be simplified/removed now that action and event args are separated.
|
|
28
|
+
Observables.trigger(key:, action:, event:)
|
|
19
29
|
end
|
|
20
30
|
|
|
21
|
-
#
|
|
22
|
-
# One day it may use ractors and be concurrent, if we can freeze the args.
|
|
23
|
-
def take(actionable, key = nil)
|
|
24
|
-
Observables.take(actionable:, key: key || self)
|
|
25
|
-
end
|
|
31
|
+
# TODO: Provide a "pipe/port/take" method that uses ractors to be concurrent... if supplied with immutable Data?
|
|
26
32
|
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: observers
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- maedi
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
-
dependencies:
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: low_dependency
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0'
|
|
12
26
|
description: Observe events for objects of any kind
|
|
13
27
|
email:
|
|
14
28
|
- maediprichard@gmail.com
|