observers 0.2.0 → 0.3.1

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: b1c16092762a682c96f1cc007988ec2406d3b2dd6ce91c1b793b2fbf4f95d628
4
- data.tar.gz: 18045745a7cc775e61dd9afc1f46a80074565be6986a37ead5b30d49105a6e77
3
+ metadata.gz: 3803ec73448522b725c60b2929a3f3fe2fee1e87f102b5a75f8fadbebc2beec9
4
+ data.tar.gz: 9d4e91f3e4026c4fc813b338e8baf2b45164c46681e404e10b5a53c539302a60
5
5
  SHA512:
6
- metadata.gz: 8c3eb3b00120bfcd498345c0f1ef44322212eacaa6856d794fb9e74044b7a26fa4a6502067cec87aaeff241b4835f5f5e0c048a80d59fe61e3dda277b84c03af
7
- data.tar.gz: 843137754e96d5187b23f36fa72e2aa423cba6b9e0af82a99d3b84ef046bc7c2feb76fd3acfe0b3607ea55a6ef250d23ee0f90a211266bd551d5b2045211156f
6
+ metadata.gz: 64bec520fd5246a61892e71ec40609b1e5cdaf00ef4e1cf9c28c5f1e0c27e9a6e561f3d6db2e3b89bb596d8c4d867deb4aac8c18cba97a80085e5d7149f458be
7
+ data.tar.gz: bb87af0e748a370272c760b80236694228596a0d9e702d2636f8854122f72636b5607f28cec56b9bef483f449a79dd0e5d8c67b659586b6742d881a97f044445
@@ -12,9 +12,12 @@ module Observers
12
12
 
13
13
  def trigger(action:, event:)
14
14
  action = @action if @action
15
- event ? @observer.send(action, **{ event: event }) : @observer.send(action)
15
+ event ? @observer.send(action, **{ event: }) : @observer.send(action)
16
16
  rescue ArgumentError
17
17
  type = @observer.instance_of?(Class) ? @observer : @observer.class
18
+
19
+ raise ArgumentError, "#{type}##{action} has an 'event:' keyword argument but no event was sent" if event.nil?
20
+
18
21
  raise ArgumentError, "#{event.class} sent to #{type}##{action} but it has no 'event:' keyword argument"
19
22
  end
20
23
  end
data/lib/observables.rb CHANGED
@@ -4,59 +4,45 @@ require_relative 'models/observable'
4
4
 
5
5
  module Observers
6
6
  class Observables
7
+ class MissingObservableError < StandardError; end
8
+
7
9
  class << self
8
10
  def observables
9
11
  @observables ||= {}
10
12
  @observables
11
13
  end
12
-
13
- def reset
14
- @observables = {}
15
- end
14
+ alias all observables
16
15
 
17
16
  def upsert(key:)
18
17
  observables[key] = Observable.new(key:) if observables[key].nil?
19
18
  observables[key]
20
19
  end
21
20
 
21
+ def reset
22
+ @observables = {}
23
+ end
24
+
22
25
  def observe(key:, observer:)
23
26
  observable = observables[key] || upsert(key:)
24
27
  observable.add_observer(observer:)
25
28
  end
26
29
 
27
- def trigger(actionable:, key:)
28
- action, event = parse_actionable(actionable:)
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?
29
34
 
30
- observables[key].observers.each do |observer|
31
- observer.trigger(action:, event:)
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
35
+ observable = observables[key]
36
+ raise MissingObservableError, "Observable key '#{key}' not found" if observable.nil?
36
37
 
37
- def take(actionable:, key:)
38
- action, event = parse_actionable(actionable:)
38
+ last_result = nil
39
39
 
40
40
  observables[key].observers.each do |observer|
41
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
42
+ last_result = result unless result.nil?
57
43
  end
58
44
 
59
- [action, event]
45
+ last_result
60
46
  end
61
47
  end
62
48
  end
data/lib/observers.rb CHANGED
@@ -4,23 +4,29 @@ require_relative 'observables'
4
4
  require_relative 'models/observer'
5
5
 
6
6
  module Observers
7
+ def self.included(klass)
8
+ klass.extend Observers
9
+ end
10
+
11
+ def observables
12
+ Observables.observables
13
+ end
14
+
7
15
  def observable(key = self)
8
16
  Observables.upsert(key:)
9
17
  end
10
18
 
11
19
  # TODO: Unit test order.
12
- def observe(key, action = nil, order: Observables.observables.count)
13
- observer = Observer.new(observer: self, action:, order:)
20
+ def observe(key, overridden_action: nil, order: Observables.observables.count)
21
+ observer = Observer.new(observer: self, action: overridden_action, order:)
14
22
  Observables.observe(key:, observer:)
15
23
  end
16
24
 
17
- def trigger(actionable, key = nil)
18
- Observables.trigger(actionable:, key: key || self)
25
+ # Returns the last observer with a non-nil return value.
26
+ 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:)
19
29
  end
20
30
 
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)
25
- end
31
+ # TODO: Provide a "pipe/port/take" method that uses ractors to be concurrent... if supplied with immutable Data?
26
32
  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.2.0'
4
+ VERSION = '0.3.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: observers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi
8
8
  bindir: exe
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
- dependencies: []
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: low_dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
12
26
  description: Observe events for objects of any kind
13
27
  email:
14
28
  - maediprichard@gmail.com