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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d3079af102cc83c6d2056ab0e196587fa34ac989fe1893f605f5b2da59bce26b
4
- data.tar.gz: d6acee445add7be158414e4f425d7c2342af06774f2ab490d4c26d7f84fa8429
3
+ metadata.gz: 7a683d87de52e3b964c325db4cc4cb732203c594eac263aadaf513a59a0dab76
4
+ data.tar.gz: 50b6e45f3357de2e06b5d599c7c2614804af8db850522717f34f6524064c4f53
5
5
  SHA512:
6
- metadata.gz: b805045427a1c5a5d51815d8025bcb57b4e3567efa958c761e2c55cdc64521ac0b15fcf93f2f75dfe701c26d2c9576c63d88f9dba47884ff337cd946d64531e7
7
- data.tar.gz: 86e3e1ff475776e187ce0dab7d447c1ff137bb9c63b6b5c991dfbdaf3e512c8a0fa286c4e119887d100cf1c8c91964a64a63192f26a4b9a381cd2e849e6bcb38
6
+ metadata.gz: a5e2e9afdb9f313a8bcaddbd8c0b309e01aa52d495458e3cb63efc3182b1c7876b87ccd227bb0fa55fb0866d31514b22fe715a58d276e610e14165d51010188e
7
+ data.tar.gz: ab2d9cc3aa952df58c7a7b5bfe9fa2f4f1c6eb1aa74469c8e82145324f0f45c5759126770a30d7a1252a20cccbb5dcef6d8e586eeb9d47fc48ed71c01ef9d3e8
@@ -9,9 +9,23 @@ module Observers
9
9
  @observers = []
10
10
  end
11
11
 
12
- def add_observer(observer:)
13
- @observers << observer
14
- @observers.sort_by(&:order)
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
@@ -2,22 +2,22 @@
2
2
 
3
3
  module Observers
4
4
  class Observer
5
- attr_reader :order
5
+ attr_reader :object, :action
6
6
 
7
- def initialize(observer:, action:, order:)
8
- @observer = observer
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 ? @observer.send(action, **{ event: }) : @observer.send(action)
14
+ event ? @object.send(action, **{ event: }) : @object.send(action)
16
15
  rescue ArgumentError
17
- type = @observer.instance_of?(Class) ? @observer : @observer.class
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
- alias all observables
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
- def self.included(klass)
8
- klass.extend Observers
7
+ class << self
8
+ def included(klass)
9
+ klass.extend Observers
10
+ end
9
11
  end
10
12
 
11
- def observables
12
- Observables.observables
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
- def observable(key = self)
16
- Observables.upsert(key:)
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
- # TODO: Unit test order.
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
- # TODO: Parsing logic can be simplified/removed now that action and event args are separated.
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Observers
4
- VERSION = '0.3.2'
4
+ VERSION = '0.4.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: observers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi