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 +4 -4
- data/lib/events/event.rb +52 -10
- data/lib/events/render_event.rb +3 -2
- data/lib/events/request_event.rb +1 -1
- data/lib/events/status_event.rb +2 -2
- data/lib/low_event.rb +7 -1
- data/lib/pool/event_pool.rb +30 -0
- data/lib/pool/event_tree.rb +28 -0
- data/lib/support/pool_hash.rb +19 -0
- data/lib/support/value_object.rb +11 -0
- data/lib/version.rb +1 -1
- metadata +20 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cf4bf7bbf94dbe27393a82dc61c8660b24bc62f55564e4448ed4c696b5809141
|
|
4
|
+
data.tar.gz: ac1225567c974ff857aad213e0f700330176d7fd2ee90f6336cc3aa739ba2790
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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)
|
data/lib/events/render_event.rb
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
module Low
|
|
4
4
|
module Events
|
|
5
|
-
RenderEvent = Data.define(:action, :
|
|
6
|
-
|
|
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
|
data/lib/events/request_event.rb
CHANGED
data/lib/events/status_event.rb
CHANGED
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
|
data/lib/version.rb
CHANGED
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.
|
|
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:
|
|
106
|
+
rubygems_version: 4.0.6
|
|
89
107
|
specification_version: 4
|
|
90
108
|
summary: Observable events
|
|
91
109
|
test_files: []
|