low_event 0.4.0 → 0.6.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: cf4bf7bbf94dbe27393a82dc61c8660b24bc62f55564e4448ed4c696b5809141
4
- data.tar.gz: ac1225567c974ff857aad213e0f700330176d7fd2ee90f6336cc3aa739ba2790
3
+ metadata.gz: 7ce2e06fbf3ed01693a0ea9d8debd51bb06728cede50512fc2900aceea3cd34e
4
+ data.tar.gz: 1ec225183c4d31f9b8fccacff0aefc10ae47f83bbefced301d21e4af5d81ed7b
5
5
  SHA512:
6
- metadata.gz: 0add64213a67957924c8af4259633fe3f0aa53b4f5d6ba69939292e2fd3d94f2dddb3d29e71b170ea053e57b07a0c3a208762ff9206a19fa9a664bfafa431b31
7
- data.tar.gz: fb618e3d9cfab04ea382537631c1abffafbc153a24acd5c6124bf3ed1495572497a8432b68018bfa68f9ee93c966746196dc7adc6b5b2835afb3d1a9001765d9
6
+ metadata.gz: 5a35fa062bb378c0485cec1ab5713cbadfd93374628630342458d0570008ca43bf9638d1913312257c35a8204e6a8e4ee4964ada8cbbe4717435719e36487b42
7
+ data.tar.gz: 2135cae6a7b1d6fb4709f328aeec00e5d6d6da7b667707eda3e8af8b2fac968d2dc182c382ea9c3a48675a4062d9dc2276361604b9cfc3b0f8e62d57f5f069cf
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'low_type'
4
+
5
+ module Low
6
+ module Events
7
+ # An event that happens on event tree branching and isn't added to the event tree/sequence.
8
+ class HiddenEvent
9
+ include LowType
10
+
11
+ attr_reader :key, :action, :created_at
12
+
13
+ def initialize(key:, action: nil)
14
+ @key = key
15
+ @action = action
16
+ @created_at = Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
17
+ end
18
+
19
+ def trigger
20
+ event_tree = branch
21
+ key = Observers::Keys[@key]
22
+ key.trigger(event: self) { restore_level(event_tree:) }
23
+ end
24
+
25
+ class << self
26
+ def trigger(**kwargs)
27
+ new(**kwargs).trigger
28
+ end
29
+
30
+ def inherited(child)
31
+ child.include LowType
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'event'
3
+ require_relative '../interfaces/event'
4
4
 
5
5
  module Low
6
6
  module Events
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'protocol/http'
4
- require_relative 'event'
4
+ require_relative '../interfaces/event'
5
5
 
6
6
  module Low
7
7
  module Events
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'event'
3
+ require_relative '../interfaces/event'
4
4
 
5
5
  module Low
6
6
  module Events
@@ -0,0 +1,15 @@
1
+ module Low
2
+ module Events
3
+ module Definable
4
+ def define(key = self)
5
+ yield observers(key)
6
+ end
7
+
8
+ class << self
9
+ def included(klass)
10
+ klass.extend Definable
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'low_type'
3
4
  require 'observers'
5
+ require_relative 'definable'
4
6
  require_relative '../support/value_object'
5
7
 
6
8
  module Low
@@ -11,18 +13,19 @@ module Low
11
13
  # The result of the previous event is made available to the next event. [UNRELEASED]
12
14
  #
13
15
  # Integrations:
14
- # - Observers for observer pattern via an event-centric API
16
+ # - Observers for observer pattern which we wrap in an event-centric API
15
17
  # - EventPool for a tree of events and their child events
16
18
  # - LowState for state machines to trigger multiple actions [UNLRELEASED]
17
19
  class Event
18
20
  include LowType
21
+ include Observers
22
+ include Events::Definable
19
23
  include Support::ValueObject
20
24
 
21
25
  attr_reader :key, :action, :created_at
22
26
  attr_accessor :children
23
27
 
24
- ROOT_FIBER = Fiber.current
25
-
28
+ # The subclass will provide the key, usually "self.class".
26
29
  def initialize(key:, action: nil, children: [])
27
30
  @key = key
28
31
  @action = action
@@ -32,42 +35,34 @@ module Low
32
35
 
33
36
  def trigger
34
37
  event_tree = branch
35
- key = Observers::Keys[@key] || raise(Observers::Keys::MissingKeyError)
38
+ key = Observers::Keys[@key]
36
39
  key.trigger(event: self) { restore_level(event_tree:) }
37
40
  end
38
41
 
39
42
  def take
40
43
  event_tree = branch
41
- key = Observers::Keys[@key] || raise(Observers::Keys::MissingKeyError)
44
+ key = Observers::Keys[@key]
42
45
  key.take(event: self) { restore_level(event_tree:) }
43
46
  end
44
47
 
48
+ class << self
49
+ def trigger(**kwargs) = new(**kwargs).trigger
50
+ def take(**kwargs) = new(**kwargs).take
51
+
52
+ def inherited(child)
53
+ child.include LowType
54
+ end
55
+ end
56
+
45
57
  private
46
58
 
47
59
  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
60
+ event_tree = Providers['low.event.pool'].current_event_tree(event: self)
52
61
  event_tree.branch(event: self)
53
62
  end
54
63
 
55
64
  def restore_level(event_tree:)
56
65
  event_tree.current_event = self if event_tree.respond_to?(:current_event)
57
66
  end
58
-
59
- class << self
60
- def trigger(**kwargs)
61
- new(**kwargs).trigger
62
- end
63
-
64
- def take(**kwargs)
65
- new(**kwargs).take
66
- end
67
-
68
- def inherited(child)
69
- child.include LowType
70
- end
71
- end
72
67
  end
73
68
  end
data/lib/low_event.rb CHANGED
@@ -1,18 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'low_dependency'
4
- require 'low_type'
5
- require 'observers'
3
+ require 'providers'
6
4
 
7
- require_relative 'events/event'
8
5
  require_relative 'events/render_event'
9
6
  require_relative 'events/request_event'
10
7
  require_relative 'events/response_event'
11
8
  require_relative 'events/status_event'
12
9
  require_relative 'factories/response_factory' # TODO: Find out who's using this and require it there.
10
+ require_relative 'interfaces/event'
13
11
  require_relative 'pool/event_pool'
14
12
 
15
- LowDependency.provide('low.event.pool') do
13
+ Providers.define('low.event.pool') do
16
14
  Low::Events::EventPool.new
17
15
  end
18
16
 
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../events/hidden_event'
4
+
5
+ module Low
6
+ module Events
7
+ class BranchEvent < HiddenEvent
8
+ attr_reader :event_tree, :event
9
+
10
+ def initialize(event_tree:, event:)
11
+ super(key: BranchEvent, action: :branch)
12
+
13
+ @event_tree = event_tree
14
+ @event = event
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,29 +1,49 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'observers'
4
+
5
+ require_relative '../events/request_event'
3
6
  require_relative 'event_tree'
4
7
  require_relative '../support/pool_hash'
5
8
 
6
9
  module Low
7
10
  module Events
8
11
  class EventPool
9
- BUFFER_SIZE = 100.freeze
12
+ include Observers
13
+
14
+ BUFFER_SIZE = 100
10
15
 
11
16
  def initialize
12
17
  @pool = Support::PoolHash.new(BUFFER_SIZE)
18
+ @request_counts = Support::PoolHash.new(BUFFER_SIZE)
13
19
  end
14
20
 
15
- def current_event_tree
16
- @pool[stream_id] || @pool.add(stream_id, EventTree.new)
21
+ def current_event_tree(event:)
22
+ request_id = request_id(event:)
23
+
24
+ return @pool[request_id] if @pool[request_id]
25
+
26
+ event_tree = @pool.add(request_id, EventTree.new(request_id:))
27
+ trigger action: :new_event_tree, event: event_tree
28
+
29
+ event_tree
17
30
  end
18
-
31
+
19
32
  def event_trees
20
33
  @pool
21
34
  end
22
35
 
23
36
  private
24
37
 
25
- def stream_id
26
- Fiber.current
38
+ def request_id(event:)
39
+ fiber_id = Fiber.current.object_id
40
+ increment_request_counts(fiber_id:) if event.is_a?(RequestEvent)
41
+ "#{fiber_id}-#{@request_counts[fiber_id]}"
42
+ end
43
+
44
+ def increment_request_counts(fiber_id:)
45
+ @request_counts[fiber_id] ||= 0
46
+ @request_counts[fiber_id] += 1
27
47
  end
28
48
  end
29
49
  end
@@ -1,15 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'observers'
4
+ require_relative 'branch_event'
5
+
3
6
  module Low
4
7
  module Events
5
8
  class EventTree
6
- attr_reader :root_event, :sequence
9
+ include Observers
10
+
11
+ attr_reader :request_id, :root_event, :sequence
7
12
  attr_accessor :current_event
8
13
 
9
- def initialize
14
+ def initialize(request_id: nil)
15
+ @request_id = request_id
10
16
  @root_event = nil
11
17
  @current_event = nil
12
-
13
18
  @sequence = []
14
19
  end
15
20
 
@@ -22,6 +27,8 @@ module Low
22
27
  else
23
28
  @current_event.children << event
24
29
  end
30
+
31
+ trigger action: :branch, event: BranchEvent.new(event_tree: self, event:)
25
32
  end
26
33
  end
27
34
  end
@@ -11,7 +11,11 @@ module Low
11
11
 
12
12
  def add(key, value)
13
13
  # Prune the hash when a new item added.
14
- shift if size >= @max_size && !key?(key)
14
+ if size >= @max_size && !key?(key)
15
+ # TODO: Notify event pool that item was removed.
16
+ _old_key, _old_value = shift
17
+ end
18
+
15
19
  self[key] = value
16
20
  end
17
21
  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.4.0'
4
+ EVENT_VERSION = '0.6.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.4.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi
@@ -10,35 +10,35 @@ cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
- name: low_dependency
13
+ name: low_type
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
- - - ">="
16
+ - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '0'
18
+ version: '1.0'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
- - - ">="
23
+ - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: '0'
25
+ version: '1.0'
26
26
  - !ruby/object:Gem::Dependency
27
- name: low_type
27
+ name: observers
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
- - - "~>"
30
+ - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: '1.0'
32
+ version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '1.0'
39
+ version: '0'
40
40
  - !ruby/object:Gem::Dependency
41
- name: observers
41
+ name: protocol-http
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - ">="
@@ -52,7 +52,7 @@ dependencies:
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  - !ruby/object:Gem::Dependency
55
- name: protocol-http
55
+ name: providers
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - ">="
@@ -72,13 +72,16 @@ executables: []
72
72
  extensions: []
73
73
  extra_rdoc_files: []
74
74
  files:
75
- - lib/events/event.rb
75
+ - lib/events/hidden_event.rb
76
76
  - lib/events/render_event.rb
77
77
  - lib/events/request_event.rb
78
78
  - lib/events/response_event.rb
79
79
  - lib/events/status_event.rb
80
80
  - lib/factories/response_factory.rb
81
+ - lib/interfaces/definable.rb
82
+ - lib/interfaces/event.rb
81
83
  - lib/low_event.rb
84
+ - lib/pool/branch_event.rb
82
85
  - lib/pool/event_pool.rb
83
86
  - lib/pool/event_tree.rb
84
87
  - lib/support/pool_hash.rb