observers 0.2.0 → 0.3.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: b1c16092762a682c96f1cc007988ec2406d3b2dd6ce91c1b793b2fbf4f95d628
4
- data.tar.gz: 18045745a7cc775e61dd9afc1f46a80074565be6986a37ead5b30d49105a6e77
3
+ metadata.gz: 701e08478d6d96ff9be87ea056510e4dcf4995bc779c726d263dc9ba7d5803be
4
+ data.tar.gz: 1d9a10983efabeb4d7ac66c7d6df2f4d4204b947b85836369fdc93e9d91ffc57
5
5
  SHA512:
6
- metadata.gz: 8c3eb3b00120bfcd498345c0f1ef44322212eacaa6856d794fb9e74044b7a26fa4a6502067cec87aaeff241b4835f5f5e0c048a80d59fe61e3dda277b84c03af
7
- data.tar.gz: 843137754e96d5187b23f36fa72e2aa423cba6b9e0af82a99d3b84ef046bc7c2feb76fd3acfe0b3607ea55a6ef250d23ee0f90a211266bd551d5b2045211156f
6
+ metadata.gz: 2b1a653fa0e7cc33a70d121620c67141061618dc270cd6793b713b04822fe2ed32f0934c30b30079f190d8c3acfeb7aa90df086a4fe66fd3c09fc1e12adaa231
7
+ data.tar.gz: bcb0708e1be9ec611a28b887a3d18b3cba0798a05d4b8c9c3a502694aa3770e9a06f6cc1767d83aaa085900de6bb58d46e557edfc0dc9b80bd7ad68a7ac731af
data/lib/observables.rb CHANGED
@@ -4,45 +4,44 @@ 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
 
30
+ # @return: The last result of the trigger.
27
31
  def trigger(actionable:, key:)
28
32
  action, event = parse_actionable(actionable:)
29
33
 
30
- observables[key].observers.each do |observer|
31
- observer.trigger(action:, event:)
32
- end
34
+ observable = observables[key]
35
+ raise MissingObservableError, "Observable key '#{key}' not found" if observable.nil?
33
36
 
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:)
37
+ last_result = nil
39
38
 
40
39
  observables[key].observers.each do |observer|
41
40
  result = observer.trigger(action:, event:)
42
- return result unless result.nil?
41
+ last_result = result unless result.nil?
43
42
  end
44
43
 
45
- nil # This is a bad day for the take method, one of the worst.
44
+ last_result
46
45
  end
47
46
 
48
47
  private
data/lib/observers.rb CHANGED
@@ -4,23 +4,31 @@ 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)
19
- end
25
+ # Returns the last observer with a non-nil return value.
26
+ def trigger(key = self, action: nil, event: nil)
27
+ raise ArgumentError, 'Action or event required' if action.nil? && event.nil?
20
28
 
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)
29
+ # TODO: Parsing logic can be simplified/removed now that action and event args are separated.
30
+ Observables.trigger(actionable: action || event, key:)
25
31
  end
32
+
33
+ # TODO: Provide a "pipe/port/take" method that uses ractors to be concurrent... if supplied with immutable Data?
26
34
  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.0'
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.0
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