observers 0.2.0 → 0.3.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/observables.rb +13 -14
- data/lib/observers.rb +17 -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: 701e08478d6d96ff9be87ea056510e4dcf4995bc779c726d263dc9ba7d5803be
|
|
4
|
+
data.tar.gz: 1d9a10983efabeb4d7ac66c7d6df2f4d4204b947b85836369fdc93e9d91ffc57
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2b1a653fa0e7cc33a70d121620c67141061618dc270cd6793b713b04822fe2ed32f0934c30b30079f190d8c3acfeb7aa90df086a4fe66fd3c09fc1e12adaa231
|
|
7
|
+
data.tar.gz: bcb0708e1be9ec611a28b887a3d18b3cba0798a05d4b8c9c3a502694aa3770e9a06f6cc1767d83aaa085900de6bb58d46e557edfc0dc9b80bd7ad68a7ac731af
|
data/lib/observables.rb
CHANGED
|
@@ -4,45 +4,44 @@ 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
|
|
|
30
|
+
# @return: The last result of the trigger.
|
|
27
31
|
def trigger(actionable:, key:)
|
|
28
32
|
action, event = parse_actionable(actionable:)
|
|
29
33
|
|
|
30
|
-
observables[key]
|
|
31
|
-
|
|
32
|
-
end
|
|
34
|
+
observable = observables[key]
|
|
35
|
+
raise MissingObservableError, "Observable key '#{key}' not found" if observable.nil?
|
|
33
36
|
|
|
34
|
-
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def take(actionable:, key:)
|
|
38
|
-
action, event = parse_actionable(actionable:)
|
|
37
|
+
last_result = nil
|
|
39
38
|
|
|
40
39
|
observables[key].observers.each do |observer|
|
|
41
40
|
result = observer.trigger(action:, event:)
|
|
42
|
-
|
|
41
|
+
last_result = result unless result.nil?
|
|
43
42
|
end
|
|
44
43
|
|
|
45
|
-
|
|
44
|
+
last_result
|
|
46
45
|
end
|
|
47
46
|
|
|
48
47
|
private
|
data/lib/observers.rb
CHANGED
|
@@ -4,23 +4,31 @@ 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
|
-
|
|
19
|
-
|
|
25
|
+
# Returns the last observer with a non-nil return value.
|
|
26
|
+
def trigger(key = self, action: nil, event: nil)
|
|
27
|
+
raise ArgumentError, 'Action or event required' if action.nil? && event.nil?
|
|
20
28
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def take(actionable, key = nil)
|
|
24
|
-
Observables.take(actionable:, key: key || self)
|
|
29
|
+
# TODO: Parsing logic can be simplified/removed now that action and event args are separated.
|
|
30
|
+
Observables.trigger(actionable: action || event, key:)
|
|
25
31
|
end
|
|
32
|
+
|
|
33
|
+
# TODO: Provide a "pipe/port/take" method that uses ractors to be concurrent... if supplied with immutable Data?
|
|
26
34
|
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.0
|
|
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
|