ntl-actor 0.4.0.pre3 → 0.4.0.pre4
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/actor.rb +3 -5
- data/lib/actor/actor.rb +102 -0
- data/lib/actor/build.rb +19 -0
- data/lib/actor/handle_macro.rb +37 -0
- data/lib/actor/observers.rb +45 -0
- data/lib/actor/supervisor.rb +8 -9
- metadata +5 -7
- data/lib/actor/module.rb +0 -87
- data/lib/actor/module/build.rb +0 -21
- data/lib/actor/module/handle_macro.rb +0 -39
- data/lib/actor/module/observers.rb +0 -47
- data/lib/actor/module/start.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43216310eef877e2e2c50d3715f828a3d31c1cde
|
4
|
+
data.tar.gz: 83a9a5a6617bb54e4d8c265d8169abdeea323764
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 226255ae3858f8c2b0998c021af03a90a0bd2ff2b022abd3de775778e6f855c36f656921ab871e9742cc9248276bac112e266307f2cce5c4dc971a2b903ec031
|
7
|
+
data.tar.gz: 4e46b6c26b47d5b6ea1c98a5d5fa2486fa82463b235b3258217f1e623328c5183c1984b026e194a0649774ede0021452c91ccba28502831a56adf28a90802d60
|
data/lib/actor.rb
CHANGED
@@ -19,11 +19,9 @@ require 'actor/messaging/write/substitute'
|
|
19
19
|
|
20
20
|
require 'actor/messages'
|
21
21
|
|
22
|
-
require 'actor/
|
23
|
-
require 'actor/
|
24
|
-
require 'actor/
|
25
|
-
require 'actor/module/start'
|
26
|
-
require 'actor/module'
|
22
|
+
require 'actor/build'
|
23
|
+
require 'actor/handle_macro'
|
24
|
+
require 'actor/observers'
|
27
25
|
|
28
26
|
require 'actor/start'
|
29
27
|
|
data/lib/actor/actor.rb
CHANGED
@@ -8,4 +8,106 @@ module Actor
|
|
8
8
|
def self.included cls
|
9
9
|
cls.include Module unless cls == Object
|
10
10
|
end
|
11
|
+
|
12
|
+
module Module
|
13
|
+
def self.included cls
|
14
|
+
cls.class_exec do
|
15
|
+
extend Build
|
16
|
+
extend HandleMacro
|
17
|
+
extend Start
|
18
|
+
|
19
|
+
include Observers
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_writer :address
|
24
|
+
attr_writer :reader
|
25
|
+
attr_writer :writer
|
26
|
+
|
27
|
+
def configure
|
28
|
+
end
|
29
|
+
|
30
|
+
def continuations
|
31
|
+
@continuations ||= []
|
32
|
+
end
|
33
|
+
|
34
|
+
def handle message
|
35
|
+
method = handle? message
|
36
|
+
|
37
|
+
return if method.nil?
|
38
|
+
|
39
|
+
if method.arity == 0
|
40
|
+
return_value = method.()
|
41
|
+
else
|
42
|
+
return_value = method.(message)
|
43
|
+
end
|
44
|
+
|
45
|
+
notify_observers message
|
46
|
+
|
47
|
+
return_value
|
48
|
+
end
|
49
|
+
|
50
|
+
def handle_stop
|
51
|
+
raise StopIteration
|
52
|
+
end
|
53
|
+
|
54
|
+
def handle? message
|
55
|
+
method_name = HandleMacro::MethodName.get message
|
56
|
+
|
57
|
+
if respond_to? method_name
|
58
|
+
method method_name
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def next
|
63
|
+
if continuations.empty?
|
64
|
+
message = reader.(wait: true)
|
65
|
+
else
|
66
|
+
message = reader.(wait: false)
|
67
|
+
message ||= continuations.shift
|
68
|
+
end
|
69
|
+
|
70
|
+
continuation_message = handle message
|
71
|
+
|
72
|
+
if handle? continuation_message
|
73
|
+
continuations << continuation_message
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def run_loop
|
78
|
+
loop do
|
79
|
+
self.next
|
80
|
+
Thread.pass
|
81
|
+
end
|
82
|
+
end
|
83
|
+
alias_method :start, :run_loop
|
84
|
+
|
85
|
+
def address
|
86
|
+
@address ||= Address::None
|
87
|
+
end
|
88
|
+
|
89
|
+
def reader
|
90
|
+
@reader ||= Messaging::Read::Substitute.new
|
91
|
+
end
|
92
|
+
|
93
|
+
def writer
|
94
|
+
@writer ||= Messaging::Write::Substitute.new
|
95
|
+
end
|
96
|
+
|
97
|
+
module Start
|
98
|
+
def start *positional_arguments, address: nil, supervisor_address: nil, include: nil, **keyword_arguments, &block
|
99
|
+
address ||= Address.build
|
100
|
+
|
101
|
+
instance = build address, *positional_arguments, **keyword_arguments, &block
|
102
|
+
|
103
|
+
thread = Actor::Start.(
|
104
|
+
instance,
|
105
|
+
address,
|
106
|
+
supervisor_address: supervisor_address
|
107
|
+
)
|
108
|
+
|
109
|
+
Destructure.(address, include, { :thread => thread, :actor => instance })
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
11
113
|
end
|
data/lib/actor/build.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module Actor
|
2
|
+
module Build
|
3
|
+
def build address, *positional_arguments, **keyword_arguments, &block
|
4
|
+
if keyword_arguments.empty?
|
5
|
+
instance = new *positional_arguments, &block
|
6
|
+
else
|
7
|
+
instance = new *positional_arguments, **keyword_arguments, &block
|
8
|
+
end
|
9
|
+
|
10
|
+
instance.address = address
|
11
|
+
instance.reader = Messaging::Read.build address
|
12
|
+
instance.writer = Messaging::Write.new
|
13
|
+
|
14
|
+
instance.configure
|
15
|
+
|
16
|
+
instance
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Actor
|
2
|
+
module HandleMacro
|
3
|
+
def handle_macro pattern, &action
|
4
|
+
method_name = MethodName.get pattern
|
5
|
+
|
6
|
+
define_method method_name, &action
|
7
|
+
end
|
8
|
+
alias_method :handle, :handle_macro
|
9
|
+
|
10
|
+
module MethodName
|
11
|
+
PATTERN = %r{(?:\A|[a-z0-9])[A-Z]}
|
12
|
+
|
13
|
+
def self.get message_pattern
|
14
|
+
case message_pattern
|
15
|
+
when Class, String then
|
16
|
+
message_name = message_pattern.to_s
|
17
|
+
|
18
|
+
*, message_name = message_name.split '::'
|
19
|
+
|
20
|
+
message_name.gsub! PATTERN do |str|
|
21
|
+
str.downcase!
|
22
|
+
str.insert 1, '_' if str.length == 2
|
23
|
+
str
|
24
|
+
end
|
25
|
+
|
26
|
+
get message_name.to_sym
|
27
|
+
|
28
|
+
when Symbol then
|
29
|
+
:"handle_#{message_pattern}"
|
30
|
+
|
31
|
+
else
|
32
|
+
get message_pattern.class
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Actor
|
2
|
+
module Observers
|
3
|
+
def observe message_pattern, &callback
|
4
|
+
handler_method = HandleMacro::MethodName.get message_pattern
|
5
|
+
|
6
|
+
observer_id = callback.object_id
|
7
|
+
|
8
|
+
record = Observer.new observer_id, handler_method, callback
|
9
|
+
|
10
|
+
add_observer record
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_observer record
|
14
|
+
observers = observer_registry[record.handler_method]
|
15
|
+
|
16
|
+
observers[record.observer_id] = record
|
17
|
+
end
|
18
|
+
|
19
|
+
def notify_observers message
|
20
|
+
handler_method = HandleMacro::MethodName.get message
|
21
|
+
|
22
|
+
observers = observer_registry[handler_method]
|
23
|
+
|
24
|
+
observers.each_value.map do |record|
|
25
|
+
callback = record.callback
|
26
|
+
|
27
|
+
callback.(message)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def remove_observer record
|
32
|
+
observers = observer_registry[record.handler_method]
|
33
|
+
|
34
|
+
observers.delete record.observer_id
|
35
|
+
end
|
36
|
+
|
37
|
+
def observer_registry
|
38
|
+
@observer_registry ||= Hash.new do |hash, handler_method|
|
39
|
+
hash[handler_method] = {}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
Observer = Struct.new :observer_id, :handler_method, :callback
|
44
|
+
end
|
45
|
+
end
|
data/lib/actor/supervisor.rb
CHANGED
@@ -12,18 +12,17 @@ module Actor
|
|
12
12
|
@assembly = assembly
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
class << self
|
16
|
+
attr_accessor :address
|
17
17
|
|
18
|
-
|
19
|
-
|
18
|
+
def run &assembly
|
19
|
+
self.address = Address.build
|
20
20
|
|
21
|
-
|
22
|
-
@address ||= Address::None
|
23
|
-
end
|
21
|
+
instance = build address, &assembly
|
24
22
|
|
25
|
-
|
26
|
-
|
23
|
+
thread = Start.(instance, address)
|
24
|
+
thread.join
|
25
|
+
end
|
27
26
|
end
|
28
27
|
|
29
28
|
handle :start do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ntl-actor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.0.
|
4
|
+
version: 0.4.0.pre4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Ladd
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Implementation of actor pattern for ruby designed for simplicity and
|
14
14
|
frugality
|
@@ -20,6 +20,7 @@ files:
|
|
20
20
|
- lib/actor.rb
|
21
21
|
- lib/actor/actor.rb
|
22
22
|
- lib/actor/address.rb
|
23
|
+
- lib/actor/build.rb
|
23
24
|
- lib/actor/controls.rb
|
24
25
|
- lib/actor/controls/actor.rb
|
25
26
|
- lib/actor/controls/address.rb
|
@@ -31,17 +32,14 @@ files:
|
|
31
32
|
- lib/actor/destructure.rb
|
32
33
|
- lib/actor/duration.rb
|
33
34
|
- lib/actor/future.rb
|
35
|
+
- lib/actor/handle_macro.rb
|
34
36
|
- lib/actor/messages.rb
|
35
37
|
- lib/actor/messaging/message.rb
|
36
38
|
- lib/actor/messaging/read.rb
|
37
39
|
- lib/actor/messaging/read/substitute.rb
|
38
40
|
- lib/actor/messaging/write.rb
|
39
41
|
- lib/actor/messaging/write/substitute.rb
|
40
|
-
- lib/actor/
|
41
|
-
- lib/actor/module/build.rb
|
42
|
-
- lib/actor/module/handle_macro.rb
|
43
|
-
- lib/actor/module/observers.rb
|
44
|
-
- lib/actor/module/start.rb
|
42
|
+
- lib/actor/observers.rb
|
45
43
|
- lib/actor/router.rb
|
46
44
|
- lib/actor/start.rb
|
47
45
|
- lib/actor/stream.rb
|
data/lib/actor/module.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
module Actor
|
2
|
-
module Module
|
3
|
-
def self.included cls
|
4
|
-
cls.class_exec do
|
5
|
-
extend Build
|
6
|
-
extend HandleMacro
|
7
|
-
extend Start
|
8
|
-
|
9
|
-
include Observers
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
attr_writer :address
|
14
|
-
attr_writer :reader
|
15
|
-
attr_writer :writer
|
16
|
-
|
17
|
-
def configure
|
18
|
-
end
|
19
|
-
|
20
|
-
def continuations
|
21
|
-
@continuations ||= []
|
22
|
-
end
|
23
|
-
|
24
|
-
def handle message
|
25
|
-
method = handle? message
|
26
|
-
|
27
|
-
return if method.nil?
|
28
|
-
|
29
|
-
if method.arity == 0
|
30
|
-
return_value = method.()
|
31
|
-
else
|
32
|
-
return_value = method.(message)
|
33
|
-
end
|
34
|
-
|
35
|
-
notify_observers message
|
36
|
-
|
37
|
-
return_value
|
38
|
-
end
|
39
|
-
|
40
|
-
def handle_stop
|
41
|
-
raise StopIteration
|
42
|
-
end
|
43
|
-
|
44
|
-
def handle? message
|
45
|
-
method_name = HandleMacro::MethodName.get message
|
46
|
-
|
47
|
-
if respond_to? method_name
|
48
|
-
method method_name
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def next
|
53
|
-
if continuations.empty?
|
54
|
-
message = reader.(wait: true)
|
55
|
-
else
|
56
|
-
message = reader.(wait: false)
|
57
|
-
message ||= continuations.shift
|
58
|
-
end
|
59
|
-
|
60
|
-
continuation_message = handle message
|
61
|
-
|
62
|
-
if handle? continuation_message
|
63
|
-
continuations << continuation_message
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def run_loop
|
68
|
-
loop do
|
69
|
-
self.next
|
70
|
-
Thread.pass
|
71
|
-
end
|
72
|
-
end
|
73
|
-
alias_method :start, :run_loop
|
74
|
-
|
75
|
-
def address
|
76
|
-
@address ||= Address::None
|
77
|
-
end
|
78
|
-
|
79
|
-
def reader
|
80
|
-
@reader ||= Messaging::Read::Substitute.new
|
81
|
-
end
|
82
|
-
|
83
|
-
def writer
|
84
|
-
@writer ||= Messaging::Write::Substitute.new
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
data/lib/actor/module/build.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Actor
|
2
|
-
module Module
|
3
|
-
module Build
|
4
|
-
def build address, *positional_arguments, **keyword_arguments, &block
|
5
|
-
if keyword_arguments.empty?
|
6
|
-
instance = new *positional_arguments, &block
|
7
|
-
else
|
8
|
-
instance = new *positional_arguments, **keyword_arguments, &block
|
9
|
-
end
|
10
|
-
|
11
|
-
instance.address = address
|
12
|
-
instance.reader = Messaging::Read.build address
|
13
|
-
instance.writer = Messaging::Write.new
|
14
|
-
|
15
|
-
instance.configure
|
16
|
-
|
17
|
-
instance
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
module Actor
|
2
|
-
module Module
|
3
|
-
module HandleMacro
|
4
|
-
def handle_macro pattern, &action
|
5
|
-
method_name = MethodName.get pattern
|
6
|
-
|
7
|
-
define_method method_name, &action
|
8
|
-
end
|
9
|
-
alias_method :handle, :handle_macro
|
10
|
-
|
11
|
-
module MethodName
|
12
|
-
PATTERN = %r{(?:\A|[a-z0-9])[A-Z]}
|
13
|
-
|
14
|
-
def self.get message_pattern
|
15
|
-
case message_pattern
|
16
|
-
when Class, String then
|
17
|
-
message_name = message_pattern.to_s
|
18
|
-
|
19
|
-
*, message_name = message_name.split '::'
|
20
|
-
|
21
|
-
message_name.gsub! PATTERN do |str|
|
22
|
-
str.downcase!
|
23
|
-
str.insert 1, '_' if str.length == 2
|
24
|
-
str
|
25
|
-
end
|
26
|
-
|
27
|
-
get message_name.to_sym
|
28
|
-
|
29
|
-
when Symbol then
|
30
|
-
:"handle_#{message_pattern}"
|
31
|
-
|
32
|
-
else
|
33
|
-
get message_pattern.class
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module Actor
|
2
|
-
module Module
|
3
|
-
module Observers
|
4
|
-
def observe message_pattern, &callback
|
5
|
-
handler_method = HandleMacro::MethodName.get message_pattern
|
6
|
-
|
7
|
-
observer_id = callback.object_id
|
8
|
-
|
9
|
-
record = Observer.new observer_id, handler_method, callback
|
10
|
-
|
11
|
-
add_observer record
|
12
|
-
end
|
13
|
-
|
14
|
-
def add_observer record
|
15
|
-
observers = observer_registry[record.handler_method]
|
16
|
-
|
17
|
-
observers[record.observer_id] = record
|
18
|
-
end
|
19
|
-
|
20
|
-
def notify_observers message
|
21
|
-
handler_method = HandleMacro::MethodName.get message
|
22
|
-
|
23
|
-
observers = observer_registry[handler_method]
|
24
|
-
|
25
|
-
observers.each_value.map do |record|
|
26
|
-
callback = record.callback
|
27
|
-
|
28
|
-
callback.(message)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def remove_observer record
|
33
|
-
observers = observer_registry[record.handler_method]
|
34
|
-
|
35
|
-
observers.delete record.observer_id
|
36
|
-
end
|
37
|
-
|
38
|
-
def observer_registry
|
39
|
-
@observer_registry ||= Hash.new do |hash, handler_method|
|
40
|
-
hash[handler_method] = {}
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
Observer = Struct.new :observer_id, :handler_method, :callback
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
data/lib/actor/module/start.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
module Actor
|
2
|
-
module Module
|
3
|
-
module Start
|
4
|
-
def start *positional_arguments, address: nil, supervisor_address: nil, include: nil, **keyword_arguments, &block
|
5
|
-
address ||= Address.build
|
6
|
-
|
7
|
-
instance = build address, *positional_arguments, **keyword_arguments, &block
|
8
|
-
|
9
|
-
thread = Actor::Start.(
|
10
|
-
instance,
|
11
|
-
address,
|
12
|
-
supervisor_address: supervisor_address
|
13
|
-
)
|
14
|
-
|
15
|
-
Destructure.(address, include, { :thread => thread, :actor => instance })
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|