ntl-actor 0.6.2 → 1.0.0.pre1
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 +45 -19
- data/lib/actor/actor.rb +12 -132
- data/lib/actor/build.rb +36 -0
- data/lib/actor/controls.rb +7 -7
- data/lib/actor/messages.rb +20 -4
- data/lib/actor/messaging/address.rb +26 -0
- data/lib/actor/messaging/address/controls.rb +11 -0
- data/lib/actor/messaging/address/dependency.rb +13 -0
- data/lib/actor/messaging/address/none.rb +33 -0
- data/lib/actor/messaging/message.rb +39 -1
- data/lib/actor/messaging/message/name.rb +33 -0
- data/lib/actor/messaging/publisher.rb +39 -0
- data/lib/actor/messaging/publisher/assertions.rb +11 -0
- data/lib/actor/messaging/publisher/dependency.rb +13 -0
- data/lib/actor/messaging/publisher/substitute.rb +62 -0
- data/lib/actor/messaging/queue.rb +21 -0
- data/lib/actor/messaging/queue/substitute.rb +53 -0
- data/lib/actor/messaging/reader.rb +32 -0
- data/lib/actor/messaging/reader/assertions.rb +25 -0
- data/lib/actor/messaging/reader/dependency.rb +13 -0
- data/lib/actor/messaging/reader/substitute.rb +31 -0
- data/lib/actor/messaging/writer.rb +28 -0
- data/lib/actor/messaging/writer/dependency.rb +13 -0
- data/lib/actor/messaging/writer/substitute.rb +45 -0
- data/lib/actor/module/dependencies.rb +30 -0
- data/lib/actor/module/dependencies/assertions.rb +23 -0
- data/lib/actor/module/handler.rb +31 -0
- data/lib/actor/module/handler/macro.rb +13 -0
- data/lib/actor/module/handler/method_name.rb +13 -0
- data/lib/actor/module/include_assertions.rb +18 -0
- data/lib/actor/module/run_loop.rb +19 -0
- data/lib/actor/module/start.rb +27 -0
- data/lib/actor/module/suspend_resume.rb +36 -0
- data/lib/actor/module/suspend_resume/assertions.rb +26 -0
- data/lib/actor/module/suspend_resume/configure.rb +13 -0
- data/lib/actor/module/suspend_resume/controls.rb +17 -0
- data/lib/actor/module/suspend_resume/handle.rb +17 -0
- data/lib/actor/module/suspend_resume/initialize.rb +13 -0
- data/lib/actor/start.rb +34 -34
- data/lib/actor/supervisor.rb +60 -71
- data/lib/actor/supervisor/address/get.rb +15 -0
- data/lib/actor/supervisor/address/put.rb +13 -0
- data/lib/actor/supervisor/address/registry.rb +7 -0
- data/lib/actor/supervisor/assertions.rb +20 -0
- metadata +42 -28
- data/lib/actor/address.rb +0 -18
- data/lib/actor/controls/actor.rb +0 -89
- data/lib/actor/controls/address.rb +0 -48
- data/lib/actor/controls/error.rb +0 -11
- data/lib/actor/controls/message.rb +0 -39
- data/lib/actor/controls/message/attribute.rb +0 -17
- data/lib/actor/controls/thread.rb +0 -9
- data/lib/actor/controls/uuid.rb +0 -15
- data/lib/actor/destructure.rb +0 -23
- data/lib/actor/duration.rb +0 -7
- data/lib/actor/future.rb +0 -38
- data/lib/actor/handle_macro.rb +0 -37
- data/lib/actor/messaging/read.rb +0 -54
- data/lib/actor/messaging/read/substitute.rb +0 -33
- data/lib/actor/messaging/write.rb +0 -26
- data/lib/actor/messaging/write/substitute.rb +0 -39
- data/lib/actor/observers.rb +0 -45
- data/lib/actor/router.rb +0 -94
- data/lib/actor/stream.rb +0 -36
- data/lib/actor/substitutes/kernel.rb +0 -23
- data/lib/actor/substitutes/thread.rb +0 -39
- data/lib/actor/substitutes/thread_group.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9362612be3698e03771c7fb5098807275df662eb
|
4
|
+
data.tar.gz: e3052225551eb88b84ac6ed57d3699c588c0c37d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: edb4844e21afd14350a9d872cf7fc4eb219b53c7250647fd121c2e7d4fde80307d273fd5e8c585641ea7ff3338b43de6c9b786bf652ed00a4022aa22ec738ae3
|
7
|
+
data.tar.gz: 128a2647b95a7f97b83c91c88d22dca296a6544a2a4b0976aa0dcf669b4ba17236df3da55a5647693fa9aa95a67be9b0c18d44ce992635534386630fc34dc8f6
|
data/lib/actor.rb
CHANGED
@@ -1,31 +1,57 @@
|
|
1
1
|
require 'securerandom'
|
2
2
|
require 'set'
|
3
|
-
require 'timeout'
|
4
3
|
|
5
|
-
require 'actor/
|
6
|
-
require 'actor/
|
7
|
-
require 'actor/
|
4
|
+
require 'actor/messaging/queue'
|
5
|
+
require 'actor/messaging/queue/substitute'
|
6
|
+
require 'actor/messaging/queue/substitute'
|
8
7
|
|
9
|
-
require 'actor/
|
10
|
-
require 'actor/
|
11
|
-
require 'actor/
|
8
|
+
require 'actor/messaging/address'
|
9
|
+
require 'actor/messaging/address/controls'
|
10
|
+
require 'actor/messaging/address/dependency'
|
11
|
+
require 'actor/messaging/address/none'
|
12
12
|
|
13
|
-
require 'actor/address'
|
14
13
|
require 'actor/messaging/message'
|
15
|
-
require 'actor/messaging/
|
16
|
-
require 'actor/messaging/read/substitute'
|
17
|
-
require 'actor/messaging/write'
|
18
|
-
require 'actor/messaging/write/substitute'
|
14
|
+
require 'actor/messaging/message/name'
|
19
15
|
|
20
|
-
require 'actor/
|
16
|
+
require 'actor/messaging/reader'
|
17
|
+
require 'actor/messaging/reader/assertions'
|
18
|
+
require 'actor/messaging/reader/dependency'
|
19
|
+
require 'actor/messaging/reader/substitute'
|
21
20
|
|
22
|
-
require 'actor/
|
23
|
-
require 'actor/
|
21
|
+
require 'actor/messaging/writer'
|
22
|
+
require 'actor/messaging/writer/dependency'
|
23
|
+
require 'actor/messaging/writer/substitute'
|
24
24
|
|
25
|
-
require 'actor/
|
25
|
+
require 'actor/messaging/publisher'
|
26
|
+
require 'actor/messaging/publisher/assertions'
|
27
|
+
require 'actor/messaging/publisher/dependency'
|
28
|
+
require 'actor/messaging/publisher/substitute'
|
26
29
|
|
27
|
-
require 'actor/
|
30
|
+
require 'actor/messages'
|
31
|
+
|
32
|
+
require 'actor/module/dependencies'
|
33
|
+
require 'actor/module/dependencies/assertions'
|
34
|
+
require 'actor/module/handler'
|
35
|
+
require 'actor/module/handler/method_name'
|
36
|
+
require 'actor/module/handler/macro'
|
37
|
+
require 'actor/module/include_assertions'
|
38
|
+
require 'actor/module/run_loop'
|
39
|
+
require 'actor/module/start'
|
40
|
+
require 'actor/module/suspend_resume'
|
41
|
+
require 'actor/module/suspend_resume/assertions'
|
42
|
+
require 'actor/module/suspend_resume/configure'
|
43
|
+
require 'actor/module/suspend_resume/controls'
|
44
|
+
require 'actor/module/suspend_resume/handle'
|
45
|
+
require 'actor/module/suspend_resume/initialize'
|
46
|
+
|
47
|
+
require 'actor/build'
|
48
|
+
require 'actor/controls'
|
49
|
+
require 'actor/start'
|
28
50
|
|
29
|
-
require 'actor/future'
|
30
|
-
require 'actor/router'
|
31
51
|
require 'actor/supervisor'
|
52
|
+
require 'actor/supervisor/address/get'
|
53
|
+
require 'actor/supervisor/address/put'
|
54
|
+
require 'actor/supervisor/address/registry'
|
55
|
+
require 'actor/supervisor/assertions'
|
56
|
+
|
57
|
+
require 'actor/actor'
|
data/lib/actor/actor.rb
CHANGED
@@ -1,137 +1,17 @@
|
|
1
1
|
module Actor
|
2
|
-
# It is possible to `include Actor' in the top-level namespace in order to
|
3
|
-
# bring this library's constants into focus (i.e. reference them without any
|
4
|
-
# leading `Actor' reference to qualify them). The test suite does this; see
|
5
|
-
# tests/test_init.rb. In that case, we take care not to attach any Actor
|
6
|
-
# behavior onto Object. This is achieved by placing the implementation of
|
7
|
-
# Actor in Actor::Module
|
8
2
|
def self.included cls
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
attr_writer :address
|
25
|
-
attr_writer :reader
|
26
|
-
attr_writer :writer
|
27
|
-
|
28
|
-
def configure
|
29
|
-
end
|
30
|
-
|
31
|
-
def continuations
|
32
|
-
@continuations ||= []
|
33
|
-
end
|
34
|
-
|
35
|
-
def handle message
|
36
|
-
method = handle? message
|
37
|
-
|
38
|
-
return if method.nil?
|
39
|
-
|
40
|
-
if method.arity == 0
|
41
|
-
return_value = method.()
|
42
|
-
else
|
43
|
-
return_value = method.(message)
|
44
|
-
end
|
45
|
-
|
46
|
-
notify_observers message
|
47
|
-
|
48
|
-
return_value
|
49
|
-
end
|
50
|
-
|
51
|
-
def handle_stop
|
52
|
-
raise StopIteration
|
53
|
-
end
|
54
|
-
|
55
|
-
def handle? message
|
56
|
-
method_name = HandleMacro::MethodName.get message
|
57
|
-
|
58
|
-
if respond_to? method_name
|
59
|
-
method method_name
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def next
|
64
|
-
if continuations.empty?
|
65
|
-
message = reader.(wait: true)
|
66
|
-
else
|
67
|
-
message = reader.(wait: false)
|
68
|
-
message ||= continuations.shift
|
69
|
-
end
|
70
|
-
|
71
|
-
continuation_message = handle message
|
72
|
-
|
73
|
-
if handle? continuation_message
|
74
|
-
continuations << continuation_message
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def run_loop
|
79
|
-
loop do
|
80
|
-
self.next
|
81
|
-
Thread.pass
|
82
|
-
end
|
83
|
-
end
|
84
|
-
alias_method :start, :run_loop
|
85
|
-
|
86
|
-
def address
|
87
|
-
@address ||= Address::None
|
88
|
-
end
|
89
|
-
|
90
|
-
def reader
|
91
|
-
@reader ||= Messaging::Read::Substitute.new
|
92
|
-
end
|
93
|
-
|
94
|
-
def writer
|
95
|
-
@writer ||= Messaging::Write::Substitute.new
|
96
|
-
end
|
97
|
-
|
98
|
-
module Configure
|
99
|
-
def configure
|
100
|
-
super
|
101
|
-
|
102
|
-
self.reader = Messaging::Read.build address
|
103
|
-
self.writer = Messaging::Write.new
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
module Start
|
108
|
-
def start *positional_arguments, address: nil, supervisor_address: nil, include: nil, **keyword_arguments, &block
|
109
|
-
address ||= Address.build
|
110
|
-
|
111
|
-
if respond_to? :build
|
112
|
-
constructor = method :build
|
113
|
-
else
|
114
|
-
constructor = method :new
|
115
|
-
end
|
116
|
-
|
117
|
-
if keyword_arguments.empty?
|
118
|
-
instance = constructor.(*positional_arguments, &block)
|
119
|
-
else
|
120
|
-
instance = constructor.(*positional_arguments, **keyword_arguments, &block)
|
121
|
-
end
|
122
|
-
|
123
|
-
instance.address = address
|
124
|
-
|
125
|
-
instance.configure
|
126
|
-
|
127
|
-
thread = Actor::Start.(
|
128
|
-
instance,
|
129
|
-
address,
|
130
|
-
supervisor_address: supervisor_address
|
131
|
-
)
|
132
|
-
|
133
|
-
Destructure.(address, include, { :thread => thread, :actor => instance })
|
134
|
-
end
|
3
|
+
# Actor can be included in the main object (TOPLEVEL_BINDING.receiver) in
|
4
|
+
# order to bring the constants contained in within the Actor namespace to
|
5
|
+
# the top level. When we do so, it is necessary to prevent the actual mixin
|
6
|
+
# from altering the main object.
|
7
|
+
return if cls.eql? Object
|
8
|
+
|
9
|
+
cls.class_exec do
|
10
|
+
extend Module::Start
|
11
|
+
include Module::Dependencies
|
12
|
+
include Module::Handler
|
13
|
+
include Module::RunLoop
|
14
|
+
include Module::SuspendResume
|
135
15
|
end
|
136
16
|
end
|
137
17
|
end
|
data/lib/actor/build.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module Actor
|
2
|
+
class Build
|
3
|
+
attr_reader :arguments
|
4
|
+
attr_reader :block
|
5
|
+
attr_reader :cls
|
6
|
+
|
7
|
+
def initialize cls, arguments, &block
|
8
|
+
@arguments = arguments
|
9
|
+
@block = block
|
10
|
+
@cls = cls
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.call cls, *arguments, &block
|
14
|
+
instance = new cls, arguments, &block
|
15
|
+
instance.()
|
16
|
+
end
|
17
|
+
|
18
|
+
def call
|
19
|
+
if cls.respond_to? :build
|
20
|
+
method = cls.method :build
|
21
|
+
else
|
22
|
+
method = cls.method :new
|
23
|
+
end
|
24
|
+
|
25
|
+
if block
|
26
|
+
actor = method.(*arguments, &block)
|
27
|
+
else
|
28
|
+
actor = method.(*arguments)
|
29
|
+
end
|
30
|
+
|
31
|
+
actor.configure
|
32
|
+
|
33
|
+
actor
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/actor/controls.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
module Actor
|
2
|
+
module Controls
|
3
|
+
def next_message= message
|
4
|
+
reader.add message
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
data/lib/actor/messages.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
module Actor
|
2
2
|
module Messages
|
3
|
-
|
3
|
+
module Start
|
4
|
+
extend Messaging::Message
|
5
|
+
end
|
6
|
+
|
7
|
+
ActorStarted = Struct.new :address do
|
4
8
|
include Messaging::Message
|
5
9
|
end
|
6
10
|
|
7
|
-
|
11
|
+
ActorStopped = Struct.new :address do
|
8
12
|
include Messaging::Message
|
9
13
|
end
|
10
14
|
|
@@ -12,8 +16,20 @@ module Actor
|
|
12
16
|
include Messaging::Message
|
13
17
|
end
|
14
18
|
|
15
|
-
|
16
|
-
|
19
|
+
module Suspend
|
20
|
+
extend Messaging::Message
|
21
|
+
end
|
22
|
+
|
23
|
+
module Resume
|
24
|
+
extend Messaging::Message
|
25
|
+
end
|
26
|
+
|
27
|
+
module Shutdown
|
28
|
+
extend Messaging::Message
|
29
|
+
end
|
30
|
+
|
31
|
+
module Stop
|
32
|
+
extend Messaging::Message
|
17
33
|
end
|
18
34
|
end
|
19
35
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
Address = Struct.new :id, :queue
|
4
|
+
|
5
|
+
class Address
|
6
|
+
def self.build max_queue_size: nil
|
7
|
+
id = SecureRandom.uuid
|
8
|
+
queue = Queue.get max_size: max_queue_size
|
9
|
+
|
10
|
+
new id, queue
|
11
|
+
end
|
12
|
+
|
13
|
+
def actors_waiting
|
14
|
+
queue.num_waiting
|
15
|
+
end
|
16
|
+
|
17
|
+
def queue_size
|
18
|
+
queue.size
|
19
|
+
end
|
20
|
+
|
21
|
+
def queue_max_size
|
22
|
+
queue.max
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
class Address
|
4
|
+
class None < Address
|
5
|
+
def self.build
|
6
|
+
id = ID.get
|
7
|
+
queue = Queue.new
|
8
|
+
|
9
|
+
new id, queue
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.instance
|
13
|
+
@instance ||= build
|
14
|
+
end
|
15
|
+
|
16
|
+
class Queue
|
17
|
+
def deq non_block=nil
|
18
|
+
sleep unless non_block == true
|
19
|
+
end
|
20
|
+
|
21
|
+
def enq msg, non_block=nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module ID
|
26
|
+
def self.get
|
27
|
+
'(none)'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,5 +1,43 @@
|
|
1
1
|
module Actor
|
2
2
|
module Messaging
|
3
|
-
Message
|
3
|
+
module Message
|
4
|
+
def self.included cls
|
5
|
+
cls.class_exec do
|
6
|
+
extend Matcher
|
7
|
+
extend MessageName
|
8
|
+
|
9
|
+
include MessageName
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.extended receiver
|
14
|
+
receiver.instance_exec do
|
15
|
+
extend Matcher
|
16
|
+
extend MessageName
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.=== object
|
21
|
+
if object.is_a? Symbol
|
22
|
+
true
|
23
|
+
else
|
24
|
+
super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module Matcher
|
29
|
+
def === other
|
30
|
+
other_message_name = Name.get other
|
31
|
+
|
32
|
+
message_name == other_message_name
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module MessageName
|
37
|
+
def message_name
|
38
|
+
Name.get name
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
4
42
|
end
|
5
43
|
end
|