observers 0.0.1 → 0.1.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: 68ed3549e7a8375ac16107eb8ed0ef8af09f795e63ad661eb1c527cb7aa5b524
4
- data.tar.gz: 3a512366ee467b661186e97d25deeb0e9b8afbdcca7e31ebd63f54b7d0b2b9a7
3
+ metadata.gz: 82c40c0a93bc5ffefe86c3c27685e18fd699a7188c8ffc10899386974e48ac3c
4
+ data.tar.gz: 70992908f64214fc993e2bad241c7bb81cccbf6b07d4a895e79a8bf173299b05
5
5
  SHA512:
6
- metadata.gz: 351eff64a0e434b7e4add326cf1cbc98bf133500746ebff43feb74106d819c2f8c49047f9c5547700fd75a0296b8d22329193850b347ec9702867b027714077e
7
- data.tar.gz: 7ad91d958cb08eb9cf21b092f02267065b8df90e7e69ebc976cb285142a310bd3a9b99b85ae6f9ad47d0f72f6c82a735268668a73d13621a4973b9d21f77bab7
6
+ metadata.gz: d75da6da3eb93b6e8e3e8fdd9e343560d96bfec7828fe38822945d0927edddd72e80a93e15bb8421629aa2f0d64e6f0012dd242de27204ecf9bc8783ece184b3
7
+ data.tar.gz: 58df26a6e12b767cbd9ffc46f3eda991a04ab85791c714e61fabd92b98e6e4ec64d537d17f57358cf2974516dbf15375f9320eba4dd87a6fa3fc97c5197fa7da
@@ -10,7 +10,10 @@ module Observers
10
10
  end
11
11
 
12
12
  def trigger(action:, event:)
13
- event ? @observer.send(action, event) : @observer.send(action)
13
+ event ? @observer.send(action, **{ event: event }) : @observer.send(action)
14
+ rescue ArgumentError
15
+ type = @observer.instance_of?(Class) ? @observer : @observer.class
16
+ raise ArgumentError, "#{event.class} sent to #{type}##{action} but it has no 'event:' keyword argument"
14
17
  end
15
18
  end
16
19
  end
data/lib/observables.rb CHANGED
@@ -24,10 +24,46 @@ module Observers
24
24
  observable.add_observer(observer:)
25
25
  end
26
26
 
27
- def trigger(key:, action:, event: nil)
27
+ def trigger(*args, key:)
28
+ key, action, event = parse_args(*args, key:)
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(*args, key:)
38
+ key, action, event = parse_args(*args, key:)
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_args(*args, key:)
51
+ action = nil
52
+ event = nil
53
+
54
+ case args.count
55
+ when 1
56
+ action = args.first
57
+ when 2
58
+ key, action = args
59
+ end
60
+
61
+ if action.respond_to?(:action)
62
+ event = action
63
+ action = event.action
64
+ end
65
+
66
+ [key, action, event]
31
67
  end
32
68
  end
33
69
  end
data/lib/observers.rb CHANGED
@@ -8,28 +8,19 @@ module Observers
8
8
  Observables.upsert(key:)
9
9
  end
10
10
 
11
- def observe(key, order: 0)
11
+ # TODO: Test order.
12
+ def observe(key, order: Observables.observables.count)
12
13
  observer = Observer.new(observer: self, order:)
13
14
  Observables.observe(key:, observer:)
14
15
  end
15
16
 
16
17
  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
- event = nil
28
- if action.is_a?(Event)
29
- event = action
30
- action = arg.action
31
- end
18
+ Observables.trigger(*args, key: self)
19
+ end
32
20
 
33
- Observables.trigger(key:, action:, event:)
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(*args)
24
+ Observables.take(*args, key: self)
34
25
  end
35
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.1'
4
+ VERSION = '0.1.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.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi