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
@@ -0,0 +1,33 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
module Message
|
4
|
+
module Name
|
5
|
+
PATTERN = %r{(?:\A|[a-z0-9])[A-Z]}
|
6
|
+
|
7
|
+
def self.get value
|
8
|
+
case value
|
9
|
+
when Symbol
|
10
|
+
value
|
11
|
+
|
12
|
+
when ::Module, Class
|
13
|
+
get value.name
|
14
|
+
|
15
|
+
when String
|
16
|
+
*, inner_namespace = value.split '::'
|
17
|
+
|
18
|
+
inner_namespace.gsub! PATTERN do |str|
|
19
|
+
str.downcase!
|
20
|
+
str.insert 1, '_' if str.length == 2
|
21
|
+
str
|
22
|
+
end
|
23
|
+
|
24
|
+
inner_namespace.to_sym
|
25
|
+
|
26
|
+
else
|
27
|
+
get value.class
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
class Publisher
|
4
|
+
include Writer::Dependency
|
5
|
+
|
6
|
+
attr_reader :addresses
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@addresses = Set.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.build *addresses
|
13
|
+
instance = new
|
14
|
+
|
15
|
+
addresses.each do |address|
|
16
|
+
instance.register address
|
17
|
+
end
|
18
|
+
|
19
|
+
instance.writer = Writer.new
|
20
|
+
|
21
|
+
instance
|
22
|
+
end
|
23
|
+
|
24
|
+
def register address
|
25
|
+
addresses << address
|
26
|
+
end
|
27
|
+
|
28
|
+
def unregister address
|
29
|
+
addresses.delete address
|
30
|
+
end
|
31
|
+
|
32
|
+
def publish message, wait: nil
|
33
|
+
addresses.each do |address|
|
34
|
+
writer.write message, address, wait: wait
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
class Publisher
|
4
|
+
class Substitute
|
5
|
+
def initialize
|
6
|
+
@registered_addresses = Set.new
|
7
|
+
@unregistered_addresses = Set.new
|
8
|
+
@records = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def register address
|
12
|
+
@registered_addresses << address
|
13
|
+
end
|
14
|
+
|
15
|
+
def unregister address
|
16
|
+
@unregistered_addresses << address
|
17
|
+
end
|
18
|
+
|
19
|
+
def publish message, wait: nil
|
20
|
+
wait = true if wait.nil?
|
21
|
+
|
22
|
+
record = Record.new message, wait
|
23
|
+
|
24
|
+
@records << record
|
25
|
+
end
|
26
|
+
|
27
|
+
Record = Struct.new :message, :wait
|
28
|
+
|
29
|
+
module Assertions
|
30
|
+
def registered? address=nil
|
31
|
+
if address.nil?
|
32
|
+
@registered_addresses.any?
|
33
|
+
else
|
34
|
+
@registered_addresses.include? address
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def unregistered? address=nil
|
39
|
+
if address.nil?
|
40
|
+
@unregistered_addresses.any?
|
41
|
+
else
|
42
|
+
@unregistered_addresses.include? address
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def published? message=nil, wait: nil
|
47
|
+
@records.each do |record|
|
48
|
+
next unless message.nil? or record.message == message
|
49
|
+
next unless wait.nil? or record.wait == wait
|
50
|
+
|
51
|
+
return true
|
52
|
+
end
|
53
|
+
|
54
|
+
false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
singleton_class.send :alias_method, :build, :new # subst-attr compat
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
module Queue
|
4
|
+
def self.get max_size: nil
|
5
|
+
max_size ||= Defaults.maximum_size
|
6
|
+
|
7
|
+
SizedQueue.new max_size
|
8
|
+
end
|
9
|
+
|
10
|
+
module Defaults
|
11
|
+
def self.maximum_size
|
12
|
+
size = ENV['ACTOR_MAXIMUM_QUEUE_SIZE']
|
13
|
+
|
14
|
+
return size.to_i if size
|
15
|
+
|
16
|
+
1_000
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
module Queue
|
4
|
+
class Substitute
|
5
|
+
def initialize
|
6
|
+
@enqueued_records = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.build
|
10
|
+
instance = new
|
11
|
+
instance
|
12
|
+
end
|
13
|
+
|
14
|
+
def deq non_block=nil
|
15
|
+
if non_block
|
16
|
+
raise ThreadError
|
17
|
+
else
|
18
|
+
raise WouldBlockError
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def empty?
|
23
|
+
true
|
24
|
+
end
|
25
|
+
|
26
|
+
def enq message, non_block=nil
|
27
|
+
non_block = false if non_block.nil?
|
28
|
+
|
29
|
+
record = Record.new message, non_block
|
30
|
+
@enqueued_records << record
|
31
|
+
record
|
32
|
+
end
|
33
|
+
|
34
|
+
WouldBlockError = Class.new StandardError
|
35
|
+
|
36
|
+
Record = Struct.new :message, :non_block
|
37
|
+
|
38
|
+
module Assertions
|
39
|
+
def enqueued? message=nil, wait: nil
|
40
|
+
@enqueued_records.any? do |record|
|
41
|
+
next unless message.nil? or record.message == message
|
42
|
+
next unless wait.nil? or record.non_block == !wait
|
43
|
+
|
44
|
+
true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
singleton_class.send :alias_method, :build, :new # subst-attr compat
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
class Reader
|
4
|
+
attr_reader :queue
|
5
|
+
|
6
|
+
def initialize queue
|
7
|
+
@queue = queue
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.build address
|
11
|
+
queue = address.queue
|
12
|
+
|
13
|
+
new queue
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.call address, wait: nil
|
17
|
+
instance = build address
|
18
|
+
|
19
|
+
instance.read wait: wait
|
20
|
+
end
|
21
|
+
|
22
|
+
def read wait: nil
|
23
|
+
non_block = wait == false
|
24
|
+
|
25
|
+
queue.deq non_block
|
26
|
+
|
27
|
+
rescue ThreadError
|
28
|
+
return nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
class Reader
|
4
|
+
module Assertions
|
5
|
+
def address? address
|
6
|
+
queue? address.queue
|
7
|
+
end
|
8
|
+
|
9
|
+
def next_message? message
|
10
|
+
begin
|
11
|
+
next_message = @queue.deq true
|
12
|
+
rescue ThreadError
|
13
|
+
return false
|
14
|
+
end
|
15
|
+
|
16
|
+
next_message == message
|
17
|
+
end
|
18
|
+
|
19
|
+
def queue? queue
|
20
|
+
@queue == queue
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
class Reader
|
4
|
+
class Substitute < Reader
|
5
|
+
attr_writer :next_message
|
6
|
+
|
7
|
+
def self.build
|
8
|
+
queue = Queue::Substitute.new
|
9
|
+
|
10
|
+
instance = new queue
|
11
|
+
instance.extend Controls
|
12
|
+
instance
|
13
|
+
end
|
14
|
+
|
15
|
+
def read wait: nil
|
16
|
+
if @next_message.nil?
|
17
|
+
super
|
18
|
+
else
|
19
|
+
@next_message
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module Controls
|
24
|
+
def add message
|
25
|
+
@next_message = message
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
class Writer
|
4
|
+
def write message, address, wait: nil
|
5
|
+
non_block = wait == false
|
6
|
+
|
7
|
+
queue = address.queue
|
8
|
+
|
9
|
+
if message.instance_of? ::Module
|
10
|
+
message = message.message_name
|
11
|
+
end
|
12
|
+
|
13
|
+
begin
|
14
|
+
queue.enq message, non_block
|
15
|
+
rescue ThreadError
|
16
|
+
raise WouldBlockError
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
WouldBlockError = Class.new StandardError
|
21
|
+
|
22
|
+
def self.call *arguments
|
23
|
+
instance = new
|
24
|
+
instance.write *arguments
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
class Writer
|
4
|
+
class Substitute
|
5
|
+
def initialize
|
6
|
+
@records = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def write message, address, wait: nil
|
10
|
+
wait = true if wait.nil?
|
11
|
+
|
12
|
+
record = Record.new message, address, wait
|
13
|
+
|
14
|
+
@records << record
|
15
|
+
end
|
16
|
+
|
17
|
+
Record = Struct.new :message, :address, :wait do
|
18
|
+
def message? pattern
|
19
|
+
return true if message == pattern
|
20
|
+
|
21
|
+
if pattern.is_a? Symbol and message.is_a? Message
|
22
|
+
message.message_name == pattern
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module Assertions
|
28
|
+
def written? message=nil, address: nil, wait: nil
|
29
|
+
@records.each do |record|
|
30
|
+
next unless message.nil? or record.message? message
|
31
|
+
next unless address.nil? or record.address == address
|
32
|
+
next unless wait.nil? or record.wait == wait
|
33
|
+
|
34
|
+
return true
|
35
|
+
end
|
36
|
+
|
37
|
+
false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
singleton_class.send :alias_method, :build, :new # subst-attr compat
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Actor
|
2
|
+
module Module
|
3
|
+
module Dependencies
|
4
|
+
def self.included receiver
|
5
|
+
receiver.class_exec do
|
6
|
+
include Messaging::Address::Dependency
|
7
|
+
include Messaging::Reader::Dependency
|
8
|
+
include Messaging::Writer::Dependency
|
9
|
+
|
10
|
+
prepend Configure
|
11
|
+
|
12
|
+
IncludeAssertions.(Assertions, self)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def configure
|
17
|
+
end
|
18
|
+
|
19
|
+
module Configure
|
20
|
+
def configure
|
21
|
+
self.address = Messaging::Address.build
|
22
|
+
self.reader = Messaging::Reader.build address
|
23
|
+
self.writer = Messaging::Writer.new
|
24
|
+
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|