observers 0.5.3 → 0.7.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/keys.rb +22 -0
- data/lib/models/{observable.rb → key.rb} +19 -4
- data/lib/observers.rb +22 -13
- data/lib/version.rb +1 -1
- metadata +5 -19
- data/lib/observables.rb +0 -34
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e2d0c58f136cc23164aa0cf64ded4ff642c86d8f82842fedaf459a0205024b17
|
|
4
|
+
data.tar.gz: 4ab7392ec00ad1fcb13ad891051c807c40c496037bcd6e730c9692f9c6acfdbb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fb4a46da4a46c8036f5f8acdebff74817138eb3566db27e929054d4b6d4670715324cb31cead6371bcd45b6f1ea11b927aadb8508dc5707bd417a8c6d7631e2b
|
|
7
|
+
data.tar.gz: e30650c3284a90f0a94c6fbf80ab0aa549e8676b2f93531d4d99da16944f4e0fa70922a220c224b41ccf8e839dfa01b2162a08c936a56c12350e1b6445a9c232
|
data/lib/keys.rb
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'models/key'
|
|
4
|
+
|
|
5
|
+
module Observers
|
|
6
|
+
class Keys
|
|
7
|
+
class << self
|
|
8
|
+
def [](key)
|
|
9
|
+
keys[key] ||= Key.new(key:)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def keys
|
|
13
|
+
@keys ||= {}
|
|
14
|
+
@keys
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def reset
|
|
18
|
+
@keys = {}
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Observers
|
|
4
|
-
class
|
|
4
|
+
class Key
|
|
5
5
|
attr_reader :observers
|
|
6
6
|
|
|
7
|
-
def initialize
|
|
7
|
+
def initialize(key:)
|
|
8
|
+
@key = key
|
|
8
9
|
@observers = []
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def observe(object:, action:)
|
|
13
|
+
# TODO: We can observe objects directly, no need to wrap in an observer... no need to let the object's observer override the action?
|
|
14
|
+
# A future reason I can think of for keeping observer wrapper is to track whether the object has implemented certain actions/methods.
|
|
12
15
|
@observers << Observer.new(object:, action:)
|
|
13
16
|
end
|
|
14
17
|
|
|
15
18
|
# @returns: The result of the last observer with a non-nil value.
|
|
16
|
-
def trigger(action
|
|
19
|
+
def trigger(action: nil, event: nil)
|
|
20
|
+
key_callback
|
|
21
|
+
|
|
17
22
|
action = event.action if event && action.nil?
|
|
18
23
|
action = :handle if action.nil?
|
|
19
24
|
|
|
@@ -22,22 +27,32 @@ module Observers
|
|
|
22
27
|
@observers.each do |observer|
|
|
23
28
|
result = observer.trigger(action:, event:)
|
|
24
29
|
last_result = result unless result.nil?
|
|
30
|
+
yield if block_given?
|
|
25
31
|
end
|
|
26
32
|
|
|
27
33
|
last_result
|
|
28
34
|
end
|
|
29
35
|
|
|
30
36
|
# @returns: The result of the first observer with a non-nil value.
|
|
31
|
-
def take(action
|
|
37
|
+
def take(action: nil, event: nil)
|
|
38
|
+
key_callback
|
|
39
|
+
|
|
32
40
|
action = event.action if event && action.nil?
|
|
33
41
|
action = :handle if action.nil?
|
|
34
42
|
|
|
35
43
|
@observers.each do |observer|
|
|
36
44
|
result = observer.trigger(action:, event:)
|
|
45
|
+
yield if block_given?
|
|
37
46
|
return result unless result.nil?
|
|
38
47
|
end
|
|
39
48
|
|
|
40
49
|
nil # This is a bad day for the take method, one of the worst.
|
|
41
50
|
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def key_callback
|
|
55
|
+
Observers.config.key_callback.call(@key) if Observers.config.key_callback && @observers.empty?
|
|
56
|
+
end
|
|
42
57
|
end
|
|
43
58
|
end
|
data/lib/observers.rb
CHANGED
|
@@ -1,44 +1,53 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative '
|
|
3
|
+
require_relative 'keys'
|
|
4
4
|
require_relative 'models/observer'
|
|
5
5
|
|
|
6
6
|
module Observers
|
|
7
|
+
Config = Struct.new(:key_callback)
|
|
8
|
+
|
|
7
9
|
class << self
|
|
10
|
+
def [](key)
|
|
11
|
+
Keys[key].observers
|
|
12
|
+
end
|
|
13
|
+
|
|
8
14
|
def included(klass)
|
|
9
15
|
klass.extend Observers
|
|
10
16
|
end
|
|
17
|
+
|
|
18
|
+
def config
|
|
19
|
+
@config ||= Config.new(key_callback: nil)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def configure
|
|
23
|
+
yield(config)
|
|
24
|
+
end
|
|
11
25
|
end
|
|
12
26
|
|
|
13
|
-
# Add an observer on the observable side.
|
|
14
27
|
def observers(key = self)
|
|
15
28
|
Struct.new(:key) do
|
|
16
29
|
def push(object, action: nil)
|
|
17
|
-
|
|
30
|
+
Keys[key].observe(object:, action:)
|
|
18
31
|
end
|
|
19
32
|
alias :<< :push
|
|
20
33
|
|
|
21
34
|
def count
|
|
22
|
-
|
|
35
|
+
Keys[key].observers.count
|
|
23
36
|
end
|
|
24
37
|
end.new(key)
|
|
25
38
|
end
|
|
26
39
|
|
|
27
|
-
# Add an observer on the observer side.
|
|
28
40
|
def observe(key, action: nil)
|
|
29
|
-
|
|
41
|
+
Keys[key].observe(object: self, action:)
|
|
30
42
|
end
|
|
31
43
|
|
|
32
|
-
def trigger(key
|
|
33
|
-
|
|
44
|
+
def trigger(key: self, action: nil, event: nil)
|
|
45
|
+
Keys[key].trigger(action:, event:)
|
|
34
46
|
end
|
|
35
47
|
|
|
36
|
-
def take(key
|
|
37
|
-
|
|
48
|
+
def take(key: self, action: nil, event: nil)
|
|
49
|
+
Keys[key].take(action:, event:)
|
|
38
50
|
end
|
|
39
51
|
|
|
40
52
|
# TODO: Provide a "pipe/port/take" method that uses ractors to be concurrent... if supplied with immutable Data?
|
|
41
53
|
end
|
|
42
|
-
|
|
43
|
-
# For quick debugging, not official API.
|
|
44
|
-
OOO = Observers::Observables.observables unless defined?(OOO)
|
data/lib/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,28 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: observers
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.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:
|
|
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'
|
|
11
|
+
dependencies: []
|
|
26
12
|
description: Observe events for objects of any kind
|
|
27
13
|
email:
|
|
28
14
|
- maediprichard@gmail.com
|
|
@@ -30,9 +16,9 @@ executables: []
|
|
|
30
16
|
extensions: []
|
|
31
17
|
extra_rdoc_files: []
|
|
32
18
|
files:
|
|
33
|
-
- lib/
|
|
19
|
+
- lib/keys.rb
|
|
20
|
+
- lib/models/key.rb
|
|
34
21
|
- lib/models/observer.rb
|
|
35
|
-
- lib/observables.rb
|
|
36
22
|
- lib/observers.rb
|
|
37
23
|
- lib/version.rb
|
|
38
24
|
homepage: https://github.com/maedi/observers
|
|
@@ -54,7 +40,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
54
40
|
- !ruby/object:Gem::Version
|
|
55
41
|
version: '0'
|
|
56
42
|
requirements: []
|
|
57
|
-
rubygems_version:
|
|
43
|
+
rubygems_version: 4.0.6
|
|
58
44
|
specification_version: 4
|
|
59
45
|
summary: Observe objects of any kind
|
|
60
46
|
test_files: []
|
data/lib/observables.rb
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative 'models/observable'
|
|
4
|
-
|
|
5
|
-
module Observers
|
|
6
|
-
class Observables
|
|
7
|
-
class MissingKeyError < StandardError; end
|
|
8
|
-
|
|
9
|
-
class << self
|
|
10
|
-
def observables
|
|
11
|
-
@observables ||= {}
|
|
12
|
-
@observables
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def fetch(key)
|
|
16
|
-
# TODO: Log instead per configuration, much better to fail silently sometimes!
|
|
17
|
-
observables[key] || raise(MissingKeyError, "Observable key '#{key}' not found")
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def [](key)
|
|
21
|
-
observables[key] || upsert(key:)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def upsert(key:)
|
|
25
|
-
observables[key] = Observable.new if observables[key].nil?
|
|
26
|
-
observables[key]
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def reset
|
|
30
|
-
@observables = {}
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|