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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ab0c93bff9df65a8fcf5bf39a6196ac9f4be51bf823dfc7eeabebe0d2ec21e8
4
- data.tar.gz: ec0de69288f9ea75794b5027d4eb1df90810c399310fcc43dfac873ae6accee0
3
+ metadata.gz: e2d0c58f136cc23164aa0cf64ded4ff642c86d8f82842fedaf459a0205024b17
4
+ data.tar.gz: 4ab7392ec00ad1fcb13ad891051c807c40c496037bcd6e730c9692f9c6acfdbb
5
5
  SHA512:
6
- metadata.gz: d09f8cd88c509452aa3d9627f3326a7fb2ba3120a938fa8b32b397f64908bb668f52d5750527f96d70ee140071c220693e7f916908dfac09a2e0b1521e624aa1
7
- data.tar.gz: 4ac4a3bddaf49ae0e000fd44402e3c9cca88e3078dab7a7e9b02046d6cf4246c8a9ece9c8dcc8b5d5795c5fe531991478383d6db2739cbe3dc7ef3aa03069149
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 Observable
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:, event:)
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:, event:)
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 'observables'
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
- Observables[key].observe(object:, action:)
30
+ Keys[key].observe(object:, action:)
18
31
  end
19
32
  alias :<< :push
20
33
 
21
34
  def count
22
- Observables[key].observers.count
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
- Observables[key].observe(object: self, action:)
41
+ Keys[key].observe(object: self, action:)
30
42
  end
31
43
 
32
- def trigger(key = self, action: nil, event: nil)
33
- Observables.fetch(key).trigger(action:, event:)
44
+ def trigger(key: self, action: nil, event: nil)
45
+ Keys[key].trigger(action:, event:)
34
46
  end
35
47
 
36
- def take(key = self, action: nil, event: nil)
37
- Observables.fetch(key).take(action:, event:)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Observers
4
- VERSION = '0.5.3'
4
+ VERSION = '0.7.0'
5
5
  end
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.5.3
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/models/observable.rb
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: 3.7.2
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