observers 0.9.0 → 1.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 +4 -4
- data/lib/models/observer.rb +6 -9
- data/lib/models/observer_error.rb +40 -0
- data/lib/observers.rb +7 -2
- data/lib/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c38971f478fd313e247a319a800bcc05ff9ebc7988c2667998f158d2fcc3ed9c
|
|
4
|
+
data.tar.gz: 3de19946713ee620c28a81b8ed4660c54d6f626a1f3fdec5b961d72864b4d228
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4b874d0023082d05272169f7043664f366c956af07aac5c001fb851f38aaa8ffddb95015a42a1433f040d28f7afd5663f96db060c7d6d303e2a2bbf70cbf9125
|
|
7
|
+
data.tar.gz: 2736567734f313b0bc7308b9a6e92231f2628f2d97015b061fefb6075cce94f8ef0461dcdd0007dae2dcddeaceb2bb810f4676ed29f5eb9b8eb1c371710998fc
|
data/lib/models/observer.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'observer_error'
|
|
4
|
+
|
|
3
5
|
module Observers
|
|
4
6
|
class Observer
|
|
5
7
|
attr_reader :object, :action
|
|
@@ -20,15 +22,10 @@ module Observers
|
|
|
20
22
|
else
|
|
21
23
|
@object.send(action)
|
|
22
24
|
end
|
|
23
|
-
rescue
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
raise ArgumentError, "#{type}##{action} has an 'event:' keyword argument but no event arg was sent" if event.nil?
|
|
28
|
-
|
|
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"
|
|
31
|
-
raise ArgumentError, "#{event.class} sent to #{type}#{method_type}#{action} -> #{e.message}"
|
|
25
|
+
rescue StandardError => e
|
|
26
|
+
# Events trigger events, so this error bubbles up to become the error for the next rescue:
|
|
27
|
+
# "RequestEvent -> Rain::Router#route_request -> StatusEvent -> Error404Node.render -> unknown keyword: :props"
|
|
28
|
+
raise ObserverError.new(e.message, object:, event:, action:, previous_error: e)
|
|
32
29
|
end
|
|
33
30
|
end
|
|
34
31
|
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Observers
|
|
4
|
+
# Map the events and actions along the way when showing an exception.
|
|
5
|
+
# Any exceptions in this class itself will fail silently as they will error out into itself.
|
|
6
|
+
class ObserverError < StandardError
|
|
7
|
+
def initialize(message, object:, event:, action:, previous_error:)
|
|
8
|
+
super(message)
|
|
9
|
+
|
|
10
|
+
@event = event
|
|
11
|
+
@object = object
|
|
12
|
+
@action = action
|
|
13
|
+
@previous_error = previous_error
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def link
|
|
17
|
+
class_type = @object.instance_of?(Class) ? @object : @object.class
|
|
18
|
+
method_type = @object.instance_of?(Class) ? '.' : '#'
|
|
19
|
+
"#{@event.class} -> #{class_type}#{method_type}#{@action}"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def to_s
|
|
23
|
+
chain = [link]
|
|
24
|
+
first_error = first_error(@previous_error, chain:)
|
|
25
|
+
error_location = first_error.backtrace.first
|
|
26
|
+
|
|
27
|
+
"#{chain.join(' -> ')} -> #{first_error.message}\n#{error_location}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def first_error(error, chain:)
|
|
33
|
+
chain << error.link if error.respond_to?(:link)
|
|
34
|
+
|
|
35
|
+
return error unless error.respond_to?(:previous_error)
|
|
36
|
+
|
|
37
|
+
first_error(error.previous_error, chain:)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
data/lib/observers.rb
CHANGED
|
@@ -37,8 +37,13 @@ module Observers
|
|
|
37
37
|
end.new(key)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
# Observe a key with "observe key, action: :action", or keys and their actions with "observe key => :action".
|
|
41
|
+
# Ruby passes "key => :action" as keyword arguments when the key isn't a symbol, so they arrive in key_actions.
|
|
42
|
+
def observe(key = nil, action: nil, **key_actions)
|
|
43
|
+
key_actions = key.is_a?(Hash) ? key : { key => action } unless key.nil?
|
|
44
|
+
raise ArgumentError, 'Missing key to observe' if key_actions.empty?
|
|
45
|
+
|
|
46
|
+
key_actions.each { |each_key, each_action| Keys[each_key].observe(object: self, action: each_action) }
|
|
42
47
|
end
|
|
43
48
|
|
|
44
49
|
def trigger(key: self, action: nil, event: nil)
|
data/lib/version.rb
CHANGED
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:
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- maedi
|
|
@@ -19,6 +19,7 @@ files:
|
|
|
19
19
|
- lib/keys.rb
|
|
20
20
|
- lib/models/key.rb
|
|
21
21
|
- lib/models/observer.rb
|
|
22
|
+
- lib/models/observer_error.rb
|
|
22
23
|
- lib/observers.rb
|
|
23
24
|
- lib/version.rb
|
|
24
25
|
homepage: https://github.com/raindeer-rb/observers
|