low_event 0.3.0 → 0.4.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: f2c66b94c35dc2723cd5d9a619044ed9484eeb100111c58d4cfcdab85564935b
4
- data.tar.gz: b0a7e10cc9c4a00f1430da97fa31f912594fb055a9c47f9013ee19a315de42eb
3
+ metadata.gz: cf4bf7bbf94dbe27393a82dc61c8660b24bc62f55564e4448ed4c696b5809141
4
+ data.tar.gz: ac1225567c974ff857aad213e0f700330176d7fd2ee90f6336cc3aa739ba2790
5
5
  SHA512:
6
- metadata.gz: 6072b61cd206ce639447138129c471043afaa110df08d927feadcdaac02ca80266dc44c54e5affd5a87a14ab94200577e81ee9d753b2bae42a6a0eb482041421
7
- data.tar.gz: daed9d381a46b084eb6a09787089d5be89103a714c2e62767fd3046c2a3fd7e1341b304debf44807144b1e1ebf968f2261d5ac3ccf253c6a0fb81679ecee055d
6
+ metadata.gz: 0add64213a67957924c8af4259633fe3f0aa53b4f5d6ba69939292e2fd3d94f2dddb3d29e71b170ea053e57b07a0c3a208762ff9206a19fa9a664bfafa431b31
7
+ data.tar.gz: fb618e3d9cfab04ea382537631c1abffafbc153a24acd5c6124bf3ed1495572497a8432b68018bfa68f9ee93c966746196dc7adc6b5b2835afb3d1a9001765d9
data/lib/events/event.rb CHANGED
@@ -1,26 +1,68 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'observers'
4
+ require_relative '../support/value_object'
5
+
3
6
  module Low
7
+ # An event represents what is currently happening in your application.
8
+ #
9
+ # Events are mutable in most cases (except for RenderEvent). They are action-driven, representing inputs and outputs
10
+ # that are currently happening in a linear pipeline-like flow. They are present-tense and one-to-many with one return value.
11
+ # The result of the previous event is made available to the next event. [UNRELEASED]
12
+ #
13
+ # Integrations:
14
+ # - Observers for observer pattern via an event-centric API
15
+ # - EventPool for a tree of events and their child events
16
+ # - LowState for state machines to trigger multiple actions [UNLRELEASED]
4
17
  class Event
5
18
  include LowType
19
+ include Support::ValueObject
20
+
21
+ attr_reader :key, :action, :created_at
22
+ attr_accessor :children
6
23
 
7
- attr_reader :action
24
+ ROOT_FIBER = Fiber.current
8
25
 
9
- def initialize(action: nil)
26
+ def initialize(key:, action: nil, children: [])
27
+ @key = key
10
28
  @action = action
29
+ @children = children
30
+ @created_at = Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
31
+ end
32
+
33
+ def trigger
34
+ event_tree = branch
35
+ key = Observers::Keys[@key] || raise(Observers::Keys::MissingKeyError)
36
+ key.trigger(event: self) { restore_level(event_tree:) }
11
37
  end
12
38
 
13
- # Consider LowEvent a value object.
14
- def ==(other) = other.class == self.class
15
- def eql?(other) = self == other
16
- def hash = [self.class].hash
39
+ def take
40
+ event_tree = branch
41
+ key = Observers::Keys[@key] || raise(Observers::Keys::MissingKeyError)
42
+ key.take(event: self) { restore_level(event_tree:) }
43
+ end
44
+
45
+ private
46
+
47
+ def branch
48
+ # Don't create a singular ever-growing stream tree.
49
+ return nil if ROOT_FIBER == Fiber.current
50
+
51
+ event_tree = Low::Providers['low.event.pool'].current_event_tree
52
+ event_tree.branch(event: self)
53
+ end
54
+
55
+ def restore_level(event_tree:)
56
+ event_tree.current_event = self if event_tree.respond_to?(:current_event)
57
+ end
17
58
 
18
- # Integrate with Observers, providing a self-contained API via an event's class.
19
59
  class << self
20
60
  def trigger(**kwargs)
21
- observable = Observers::Observables[self] || raise(Observers::Observables::MissingKeyError)
22
- event = new(**kwargs)
23
- observable.trigger action: event.action, event:
61
+ new(**kwargs).trigger
62
+ end
63
+
64
+ def take(**kwargs)
65
+ new(**kwargs).take
24
66
  end
25
67
 
26
68
  def inherited(child)
@@ -2,8 +2,9 @@
2
2
 
3
3
  module Low
4
4
  module Events
5
- RenderEvent = Data.define(:action, :render) do
6
- def initialize(action: :render, render: nil)
5
+ RenderEvent = Data.define(:action, :props) do
6
+ # TODO: Duplicate props when used in a parallelized situation (antlers: "<{ :parallelize }>")
7
+ def initialize(action: :render, props: {})
7
8
  super
8
9
  end
9
10
  end
@@ -8,7 +8,7 @@ module Low
8
8
  attr_reader :request
9
9
 
10
10
  def initialize(request:, action: :handle)
11
- super(action:)
11
+ super(key: self.class, action:)
12
12
 
13
13
  @request = request
14
14
  end
@@ -7,8 +7,8 @@ module Low
7
7
  class StatusEvent < Event
8
8
  attr_reader :status, :request
9
9
 
10
- def initialize(status:, request:)
11
- super()
10
+ def initialize(status:, request:, action: :render)
11
+ super(key: status, action:)
12
12
 
13
13
  @status = status
14
14
  @request = request
data/lib/low_event.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'low_dependency'
3
4
  require 'low_type'
4
5
  require 'observers'
5
6
 
@@ -8,6 +9,11 @@ require_relative 'events/render_event'
8
9
  require_relative 'events/request_event'
9
10
  require_relative 'events/response_event'
10
11
  require_relative 'events/status_event'
11
- require_relative 'factories/response_factory'
12
+ require_relative 'factories/response_factory' # TODO: Find out who's using this and require it there.
13
+ require_relative 'pool/event_pool'
14
+
15
+ LowDependency.provide('low.event.pool') do
16
+ Low::Events::EventPool.new
17
+ end
12
18
 
13
19
  LowEvent = Low::Event
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'event_tree'
4
+ require_relative '../support/pool_hash'
5
+
6
+ module Low
7
+ module Events
8
+ class EventPool
9
+ BUFFER_SIZE = 100.freeze
10
+
11
+ def initialize
12
+ @pool = Support::PoolHash.new(BUFFER_SIZE)
13
+ end
14
+
15
+ def current_event_tree
16
+ @pool[stream_id] || @pool.add(stream_id, EventTree.new)
17
+ end
18
+
19
+ def event_trees
20
+ @pool
21
+ end
22
+
23
+ private
24
+
25
+ def stream_id
26
+ Fiber.current
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Low
4
+ module Events
5
+ class EventTree
6
+ attr_reader :root_event, :sequence
7
+ attr_accessor :current_event
8
+
9
+ def initialize
10
+ @root_event = nil
11
+ @current_event = nil
12
+
13
+ @sequence = []
14
+ end
15
+
16
+ def branch(event:)
17
+ @sequence << event
18
+
19
+ if @root_event.nil?
20
+ @root_event = event
21
+ @current_event = event
22
+ else
23
+ @current_event.children << event
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Low
4
+ module Support
5
+ class PoolHash < Hash
6
+ def initialize(max_size)
7
+ @max_size = max_size
8
+
9
+ super()
10
+ end
11
+
12
+ def add(key, value)
13
+ # Prune the hash when a new item added.
14
+ shift if size >= @max_size && !key?(key)
15
+ self[key] = value
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Low
4
+ module Support
5
+ module ValueObject
6
+ def ==(other) = other.class == self.class
7
+ def eql?(other) = self == other
8
+ def hash = [self.class].hash
9
+ end
10
+ end
11
+ end
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Low
4
- EVENT_VERSION = '0.3.0'
4
+ EVENT_VERSION = '0.4.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: low_event
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi
@@ -9,6 +9,20 @@ bindir: exe
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
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
  - !ruby/object:Gem::Dependency
13
27
  name: low_type
14
28
  requirement: !ruby/object:Gem::Requirement
@@ -65,6 +79,10 @@ files:
65
79
  - lib/events/status_event.rb
66
80
  - lib/factories/response_factory.rb
67
81
  - lib/low_event.rb
82
+ - lib/pool/event_pool.rb
83
+ - lib/pool/event_tree.rb
84
+ - lib/support/pool_hash.rb
85
+ - lib/support/value_object.rb
68
86
  - lib/version.rb
69
87
  homepage: https://github.com/low-rb/low_event
70
88
  licenses: []
@@ -85,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
103
  - !ruby/object:Gem::Version
86
104
  version: '0'
87
105
  requirements: []
88
- rubygems_version: 3.7.2
106
+ rubygems_version: 4.0.6
89
107
  specification_version: 4
90
108
  summary: Observable events
91
109
  test_files: []