observers 0.1.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: 82c40c0a93bc5ffefe86c3c27685e18fd699a7188c8ffc10899386974e48ac3c
4
- data.tar.gz: 70992908f64214fc993e2bad241c7bb81cccbf6b07d4a895e79a8bf173299b05
3
+ metadata.gz: 701e08478d6d96ff9be87ea056510e4dcf4995bc779c726d263dc9ba7d5803be
4
+ data.tar.gz: 1d9a10983efabeb4d7ac66c7d6df2f4d4204b947b85836369fdc93e9d91ffc57
5
5
  SHA512:
6
- metadata.gz: d75da6da3eb93b6e8e3e8fdd9e343560d96bfec7828fe38822945d0927edddd72e80a93e15bb8421629aa2f0d64e6f0012dd242de27204ecf9bc8783ece184b3
7
- data.tar.gz: 58df26a6e12b767cbd9ffc46f3eda991a04ab85791c714e61fabd92b98e6e4ec64d537d17f57358cf2974516dbf15375f9320eba4dd87a6fa3fc97c5197fa7da
6
+ metadata.gz: 2b1a653fa0e7cc33a70d121620c67141061618dc270cd6793b713b04822fe2ed32f0934c30b30079f190d8c3acfeb7aa90df086a4fe66fd3c09fc1e12adaa231
7
+ data.tar.gz: bcb0708e1be9ec611a28b887a3d18b3cba0798a05d4b8c9c3a502694aa3770e9a06f6cc1767d83aaa085900de6bb58d46e557edfc0dc9b80bd7ad68a7ac731af
@@ -4,12 +4,14 @@ module Observers
4
4
  class Observer
5
5
  attr_reader :order
6
6
 
7
- def initialize(observer:, order:)
7
+ def initialize(observer:, action:, order:)
8
8
  @observer = observer
9
+ @action = action
9
10
  @order = order
10
11
  end
11
12
 
12
13
  def trigger(action:, event:)
14
+ action = @action if @action
13
15
  event ? @observer.send(action, **{ event: event }) : @observer.send(action)
14
16
  rescue ArgumentError
15
17
  type = @observer.instance_of?(Class) ? @observer : @observer.class
data/lib/observables.rb CHANGED
@@ -4,66 +4,58 @@ 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(*args, key:)
28
- key, action, event = parse_args(*args, key:)
30
+ # @return: The last result of the trigger.
31
+ def trigger(actionable:, key:)
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(*args, key:)
38
- key, action, event = parse_args(*args, key:)
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
49
48
 
50
- def parse_args(*args, key:)
51
- action = nil
49
+ def parse_actionable(actionable:)
50
+ action = actionable
52
51
  event = nil
53
52
 
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
53
+ if actionable.class.ancestors.any? { |ancestor| ancestor.to_s == 'Low::Event' }
54
+ event = actionable
63
55
  action = event.action
64
56
  end
65
57
 
66
- [key, action, event]
58
+ [action, event]
67
59
  end
68
60
  end
69
61
  end
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
- # TODO: Test order.
12
- def observe(key, order: Observables.observables.count)
13
- observer = Observer.new(observer: self, order:)
19
+ # TODO: Unit test 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(*args)
18
- Observables.trigger(*args, 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(*args)
24
- Observables.take(*args, 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.1.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.1.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