observers 0.8.0 → 0.9.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: '03108108c365bb1857d0ff575823ba87a1c530e0c83014534e8f6d696ea0a3dd'
4
- data.tar.gz: be85d6ddfe681c52ea79b3f09dc1538c1da6c494fbf8667cc2a98237f3e1c12e
3
+ metadata.gz: fbb9116b5b3a86d777d4aca13b5c4c04214340596e1df83adebada4dd871bc43
4
+ data.tar.gz: 560fbbb9480ac2968036b8024e9362c12ea68994c77a587abc2432505ceeda7f
5
5
  SHA512:
6
- metadata.gz: d3845675c5749e181bea80f4082ab86df3072258867847562a214e872f02bc668688dc41e02e95e5ab91c3c2bd5649986cc850c108141b06f8c40054fd97b010
7
- data.tar.gz: 94ca9aaedd1c66bc410115e4bd9426a38dd497eaa8563d68488a4fb4b917d9e7150f31e64735fdffd058bb669570bcf81bb9c91e70904882cc902933b2fafb89
6
+ metadata.gz: 403fe656fda85237d897b4e82b84e9b770f352807ac5ef05a37f4c1d58784af7f43e5f22d6ab5999bdebeea831350757125f184870de45ad78330efc6fe07ace
7
+ data.tar.gz: '06680f408eaf15377c441fd995a7a3b05b3a41bcf6b8e3e3aa87dd06a6e65227f43a50b01c03193845d26d306e368b2ecfaec814af0cb8f4ba9a34386641af83'
data/lib/models/key.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Observers
4
+ class NoObserversError < StandardError; end
5
+
4
6
  class Key
5
7
  attr_reader :observers
6
8
 
@@ -10,21 +12,19 @@ module Observers
10
12
  end
11
13
 
12
14
  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?
15
+ # TODO: We can observe objects directly, no need to wrap in an observer, unless need to let the object's observer override the action?
14
16
  # A future reason I can think of for keeping observer wrapper is to track whether the object has implemented certain actions/methods.
15
17
  @observers << Observer.new(object:, action:)
16
18
  end
17
19
 
18
20
  # @returns: The result of the last observer with a non-nil value.
19
21
  def trigger(action: nil, event: nil)
20
- empty_observers_callback
21
-
22
- action = event.action if event && action.nil?
23
- action = :handle if action.nil?
22
+ # TODO: Breaks some tests... should it? Yes. Should it be disabled when testing? Yes.
23
+ # raise NoObserversError, "No observers configured for #{@key}" if @observers.empty?
24
24
 
25
25
  last_result = nil
26
26
 
27
- @observers.each do |observer|
27
+ per_observer_per_action(action:, event:) do |observer, action|
28
28
  result = observer.trigger(action:, event:)
29
29
  last_result = result unless result.nil?
30
30
  yield if block_given?
@@ -33,26 +33,41 @@ module Observers
33
33
  last_result
34
34
  end
35
35
 
36
- # @returns: The result of the first observer with a non-nil value.
36
+ # @returns: The result of the first observer and the first action with a non-nil value.
37
37
  def take(action: nil, event: nil)
38
- empty_observers_callback
39
-
40
- action = event.action if event && action.nil?
41
- action = :handle if action.nil?
38
+ # TODO: Breaks some tests... should it? Yes. Should it be disabled when testing? Yes.
39
+ # raise NoObserversError, "No observers configured for #{@key}" if @observers.empty?
42
40
 
43
- @observers.each do |observer|
41
+ per_observer_per_action(action:, event:) do |observer, action|
44
42
  result = observer.trigger(action:, event:)
45
43
  yield if block_given?
46
44
  return result unless result.nil?
47
45
  end
48
46
 
49
- nil # This is a bad day for the take method, one of the worst.
47
+ # None of the observers returned a non-nil value.
48
+ nil
50
49
  end
51
50
 
52
51
  private
53
52
 
54
- def empty_observers_callback
55
- Observers.config.empty_observers_callback.call(@key) if Observers.config.empty_observers_callback && @observers.empty?
53
+ def per_observer_per_action(action:, event:)
54
+ action ||= event&.action
55
+
56
+ if action
57
+ @observers.each do |observer|
58
+ yield observer, action
59
+ end
60
+ elsif event&.actions
61
+ @observers.each do |observer|
62
+ event.actions.each do |action|
63
+ yield observer, action
64
+ end
65
+ end
66
+ else
67
+ @observers.each do |observer|
68
+ yield observer, :handle
69
+ end
70
+ end
56
71
  end
57
72
  end
58
73
  end
@@ -12,6 +12,8 @@ module Observers
12
12
  def trigger(action:, event:)
13
13
  action = @action if @action
14
14
 
15
+ return unless @object.respond_to?(action)
16
+
15
17
  # Assumption that if method has params then that param is "event:".
16
18
  if event && @object.method(action).parameters.count > 0
17
19
  @object.send(action, **{ event: })
@@ -24,8 +26,8 @@ module Observers
24
26
 
25
27
  raise ArgumentError, "#{type}##{action} has an 'event:' keyword argument but no event arg was sent" if event.nil?
26
28
 
27
- # Events trigger events, so the error bubbles up to becomes the error message for the next rescue's error message:
28
- # "RequestEvent sent to Rain::Router#handle -> StatusEvent sent to Error404Node.render -> unknown keyword: :props"
29
+ # Events trigger events, so the error bubbles up to become the error message for the next rescue's error message:
30
+ # "RequestEvent sent to Rain::Router#route_request -> StatusEvent sent to Error404Node.render -> unknown keyword: :props"
29
31
  raise ArgumentError, "#{event.class} sent to #{type}#{method_type}#{action} -> #{e.message}"
30
32
  end
31
33
  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.8.0'
4
+ VERSION = '0.9.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.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi
@@ -40,7 +40,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  requirements: []
43
- rubygems_version: 4.0.10
43
+ rubygems_version: 4.0.6
44
44
  specification_version: 4
45
45
  summary: Observe objects of any kind
46
46
  test_files: []