observers 0.0.2 → 0.2.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: e16b25754307c5e5ae72dfbe6e2774637306a381c0fb4acb81495732aa21f9ac
4
- data.tar.gz: 9b376d1470e2c9b30b7888dd1409fd7ef3e5340fdb97ea53d93ed037d68c67b8
3
+ metadata.gz: b1c16092762a682c96f1cc007988ec2406d3b2dd6ce91c1b793b2fbf4f95d628
4
+ data.tar.gz: 18045745a7cc775e61dd9afc1f46a80074565be6986a37ead5b30d49105a6e77
5
5
  SHA512:
6
- metadata.gz: eab730189e35a58279c2069fbd41b9763c6a3c8862777982a3e4d4bccd5cf704a7e5371277ac50415d70ecc18a8bda674224073f0f3dc27406d972496f46c405
7
- data.tar.gz: d498b6b4590c74e6695fee0922f017bf0af086ac85db299933f4e90a2b3c53c13bba00fcca861e6dbb8d67229980f1f66925b01b05ff558eb0fd052892ae3c5c
6
+ metadata.gz: 8c3eb3b00120bfcd498345c0f1ef44322212eacaa6856d794fb9e74044b7a26fa4a6502067cec87aaeff241b4835f5f5e0c048a80d59fe61e3dda277b84c03af
7
+ data.tar.gz: 843137754e96d5187b23f36fa72e2aa423cba6b9e0af82a99d3b84ef046bc7c2feb76fd3acfe0b3607ea55a6ef250d23ee0f90a211266bd551d5b2045211156f
@@ -4,13 +4,18 @@ module Observers
4
4
  class Observer
5
5
  attr_reader :order
6
6
 
7
- def initialize(observer:, order:)
7
+ def initialize(observer:, action:, order:)
8
8
  @observer = observer
9
+ @action = action
9
10
  @order = order
10
11
  end
11
12
 
12
13
  def trigger(action:, event:)
13
- event ? @observer.send(action, event) : @observer.send(action)
14
+ action = @action if @action
15
+ event ? @observer.send(action, **{ event: event }) : @observer.send(action)
16
+ rescue ArgumentError
17
+ type = @observer.instance_of?(Class) ? @observer : @observer.class
18
+ raise ArgumentError, "#{event.class} sent to #{type}##{action} but it has no 'event:' keyword argument"
14
19
  end
15
20
  end
16
21
  end
data/lib/observables.rb CHANGED
@@ -24,10 +24,39 @@ module Observers
24
24
  observable.add_observer(observer:)
25
25
  end
26
26
 
27
- def trigger(key:, action:, event:)
27
+ def trigger(actionable:, key:)
28
+ action, event = parse_actionable(actionable:)
29
+
28
30
  observables[key].observers.each do |observer|
29
31
  observer.trigger(action:, event:)
30
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
36
+
37
+ def take(actionable:, key:)
38
+ action, event = parse_actionable(actionable:)
39
+
40
+ observables[key].observers.each do |observer|
41
+ result = observer.trigger(action:, event:)
42
+ return result unless result.nil?
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
57
+ end
58
+
59
+ [action, event]
31
60
  end
32
61
  end
33
62
  end
data/lib/observers.rb CHANGED
@@ -8,27 +8,19 @@ module Observers
8
8
  Observables.upsert(key:)
9
9
  end
10
10
 
11
- def observe(key, order: 0)
12
- observer = Observer.new(observer: self, order:)
11
+ # TODO: Unit test order.
12
+ def observe(key, action = nil, order: Observables.observables.count)
13
+ observer = Observer.new(observer: self, action:, order:)
13
14
  Observables.observe(key:, observer:)
14
15
  end
15
16
 
16
- def trigger(*args)
17
- key = self
18
- action = nil
19
-
20
- case args.count
21
- when 1
22
- action = args.first
23
- when 2
24
- key, action = args
25
- end
26
-
27
- if action.respond_to?(:action)
28
- event = action
29
- action = event.action
30
- end
17
+ def trigger(actionable, key = nil)
18
+ Observables.trigger(actionable:, key: key || self)
19
+ end
31
20
 
32
- Observables.trigger(key:, action:, event: nil)
21
+ # Returns the first observer with a non-nil return value.
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)
33
25
  end
34
26
  end
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Observers
4
- VERSION = '0.0.2'
4
+ VERSION = '0.2.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.0.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi