ntl-actor 0.2.1 → 0.3.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/actor.rb +3 -0
- data/lib/actor/actor.rb +5 -7
- data/lib/actor/controls.rb +1 -0
- data/lib/actor/controls/actor.rb +62 -0
- data/lib/actor/controls/message.rb +9 -0
- data/lib/actor/messaging/address.rb +1 -1
- data/lib/actor/messaging/reader.rb +1 -1
- data/lib/actor/messaging/reader/substitute.rb +1 -1
- data/lib/actor/messaging/writer.rb +3 -3
- data/lib/actor/messaging/writer/substitute.rb +1 -1
- data/lib/actor/supervisor.rb +77 -0
- data/lib/actor/test_fixtures/sample_actor_status.rb +5 -5
- data/lib/actor/time_unit.rb +7 -0
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a248085a59139b5a654ffd3c4d88a125c409847
|
4
|
+
data.tar.gz: 0a95b14dc7bee4ce4ffb259c4058baedf2a59be1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21bed49350bde9295a5d5380b2d80a6c4a5d4ef2c8241e3b5ef4795d1c24c866116be5695339cd639bb44a7ef850aa6d1dc9fc26b67d0f955865d44f005d14fb
|
7
|
+
data.tar.gz: 9fc7de957667da0179a58e37ff7aaa4d72991839cbbaec75b01ea0b34f52ab42187fde4cdc678b920e8b5b55209d54db61e259c3a7735252dac19292604a682e
|
data/lib/actor.rb
CHANGED
data/lib/actor/actor.rb
CHANGED
@@ -41,8 +41,9 @@ module Actor
|
|
41
41
|
Statistics::Copy.(status, actor_statistics)
|
42
42
|
|
43
43
|
status.state = actor_state
|
44
|
+
status.actor_class = self.class.name
|
44
45
|
|
45
|
-
Messaging::Writer.
|
46
|
+
Messaging::Writer.(status, message.reply_address)
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
@@ -52,7 +53,7 @@ module Actor
|
|
52
53
|
|
53
54
|
def run_loop
|
54
55
|
loop do
|
55
|
-
while message = reader.
|
56
|
+
while message = reader.(wait: actor_state == State::Paused)
|
56
57
|
handle message
|
57
58
|
|
58
59
|
if message.is_a? Message
|
@@ -90,7 +91,7 @@ module Actor
|
|
90
91
|
|
91
92
|
module Spawn
|
92
93
|
def spawn *positional_arguments, include: nil, **keyword_arguments, &block
|
93
|
-
address = Messaging::Address.
|
94
|
+
address = Messaging::Address.build
|
94
95
|
|
95
96
|
method = if respond_to? :build then :build else :new end
|
96
97
|
|
@@ -123,10 +124,7 @@ module Actor
|
|
123
124
|
&block
|
124
125
|
)
|
125
126
|
|
126
|
-
Messaging::Writer.
|
127
|
-
Message::Resume.new,
|
128
|
-
address
|
129
|
-
)
|
127
|
+
Messaging::Writer.(Message::Resume.new, address)
|
130
128
|
|
131
129
|
destructure instance, address, thread, include: include
|
132
130
|
end
|
data/lib/actor/controls.rb
CHANGED
data/lib/actor/controls/actor.rb
CHANGED
@@ -7,6 +7,68 @@ module Actor
|
|
7
7
|
|
8
8
|
class Example
|
9
9
|
include ::Actor
|
10
|
+
|
11
|
+
def action
|
12
|
+
@acted = true
|
13
|
+
end
|
14
|
+
|
15
|
+
def action_executed?
|
16
|
+
@acted == true
|
17
|
+
end
|
18
|
+
|
19
|
+
def handle message
|
20
|
+
handled_messages << message
|
21
|
+
end
|
22
|
+
|
23
|
+
def handled_messages
|
24
|
+
@handled_messages ||= []
|
25
|
+
end
|
26
|
+
|
27
|
+
module Assertions
|
28
|
+
def handled_message? expected_message
|
29
|
+
expected_message ||= Message.example
|
30
|
+
|
31
|
+
@handled_messages.include? expected_message
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class CrashesImmediately < Example
|
37
|
+
def action
|
38
|
+
super
|
39
|
+
raise Error, "Induced error"
|
40
|
+
end
|
41
|
+
|
42
|
+
Error = Class.new StandardError
|
43
|
+
end
|
44
|
+
|
45
|
+
class StopsImmediately < Example
|
46
|
+
def action
|
47
|
+
super
|
48
|
+
raise StopIteration
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class ConstructorArguments < StopsImmediately
|
53
|
+
attr_reader :req, :opt, :keyreq, :key, :block
|
54
|
+
|
55
|
+
def initialize req, opt=nil, keyreq:, key: nil, &block
|
56
|
+
@req, @opt, @keyreq, @key, @block = req, opt, keyreq, key, block
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class FactoryMethod < ConstructorArguments
|
61
|
+
def self.build req
|
62
|
+
new req, keyreq: 'keyreq-value'
|
63
|
+
end
|
64
|
+
|
65
|
+
def argument_passed_in? value
|
66
|
+
req == value
|
67
|
+
end
|
68
|
+
|
69
|
+
def constructed_by_factory_method?
|
70
|
+
keyreq == 'keyreq-value'
|
71
|
+
end
|
10
72
|
end
|
11
73
|
end
|
12
74
|
end
|
@@ -13,12 +13,12 @@ module Actor
|
|
13
13
|
new queue
|
14
14
|
end
|
15
15
|
|
16
|
-
def self.
|
16
|
+
def self.call message, address
|
17
17
|
instance = build address
|
18
|
-
instance.
|
18
|
+
instance.(message)
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
21
|
+
def call message
|
22
22
|
queue.write message
|
23
23
|
end
|
24
24
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module Actor
|
2
|
+
class Supervisor
|
3
|
+
attr_reader :actors
|
4
|
+
attr_writer :exception_notifier
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@actors = Set.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def add address, thread
|
11
|
+
actor = Actor.new address, thread
|
12
|
+
|
13
|
+
actors << actor
|
14
|
+
|
15
|
+
actor
|
16
|
+
end
|
17
|
+
|
18
|
+
def remove address
|
19
|
+
actors.delete_if do |actor|
|
20
|
+
actor.address == address
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def broadcast message
|
25
|
+
addresses = actors.map &:address
|
26
|
+
|
27
|
+
addresses.each do |address|
|
28
|
+
Messaging::Writer.(message, address)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def pause
|
33
|
+
broadcast Message::Pause.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def resume
|
37
|
+
broadcast Message::Resume.new
|
38
|
+
end
|
39
|
+
|
40
|
+
def stop
|
41
|
+
broadcast Message::Stop.new
|
42
|
+
end
|
43
|
+
|
44
|
+
def start &supplementary_action
|
45
|
+
loop do
|
46
|
+
supplementary_action.() if supplementary_action
|
47
|
+
|
48
|
+
actors.delete_if do |actor|
|
49
|
+
thread = actor.thread
|
50
|
+
thread.join TimeUnit.millisecond
|
51
|
+
end
|
52
|
+
|
53
|
+
break if actors.empty?
|
54
|
+
|
55
|
+
Thread.pass
|
56
|
+
end
|
57
|
+
|
58
|
+
rescue => error
|
59
|
+
exception_notifier.(error)
|
60
|
+
raise error
|
61
|
+
end
|
62
|
+
|
63
|
+
def exception_notifier
|
64
|
+
@exception_notifier ||= proc { }
|
65
|
+
end
|
66
|
+
|
67
|
+
Actor = Struct.new :address, :thread
|
68
|
+
|
69
|
+
module Assertions
|
70
|
+
def actor? actor_address
|
71
|
+
actors.any? do |actor|
|
72
|
+
actor.address == actor_address
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -14,7 +14,7 @@ module Actor
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def self.call prose, address:, test:
|
17
|
-
reply_address = Messaging::Address.
|
17
|
+
reply_address = Messaging::Address.build
|
18
18
|
reader = Messaging::Reader.build reply_address
|
19
19
|
|
20
20
|
writer = Messaging::Writer.build address
|
@@ -24,13 +24,13 @@ module Actor
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def call test_prose, &block
|
27
|
-
writer.
|
27
|
+
writer.(record_status_message)
|
28
28
|
|
29
|
-
status_0 = reader.
|
29
|
+
status_0 = reader.(wait: true)
|
30
30
|
|
31
|
-
writer.
|
31
|
+
writer.(record_status_message)
|
32
32
|
|
33
|
-
status_1 = reader.
|
33
|
+
status_1 = reader.(wait: true)
|
34
34
|
|
35
35
|
test test_prose do
|
36
36
|
block.(status_1, status_0)
|
metadata
CHANGED
@@ -1,17 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ntl-actor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Ladd
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2016-08-31 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description: Implementation of actor pattern for ruby designed for simplicity and
|
14
|
-
frugality
|
13
|
+
description: Implementation of actor pattern for ruby designed for simplicity and frugality
|
15
14
|
email: nathanladd+github@gmail.com
|
16
15
|
executables: []
|
17
16
|
extensions: []
|
@@ -21,6 +20,7 @@ files:
|
|
21
20
|
- lib/actor/actor.rb
|
22
21
|
- lib/actor/controls.rb
|
23
22
|
- lib/actor/controls/actor.rb
|
23
|
+
- lib/actor/controls/message.rb
|
24
24
|
- lib/actor/controls/statistics.rb
|
25
25
|
- lib/actor/controls/statistics/elapsed_time.rb
|
26
26
|
- lib/actor/controls/statistics/elapsed_time/average.rb
|
@@ -42,14 +42,16 @@ files:
|
|
42
42
|
- lib/actor/statistics.rb
|
43
43
|
- lib/actor/statistics/copy.rb
|
44
44
|
- lib/actor/statistics/timer.rb
|
45
|
+
- lib/actor/supervisor.rb
|
45
46
|
- lib/actor/test_fixtures.rb
|
46
47
|
- lib/actor/test_fixtures/parallel_iteration.rb
|
47
48
|
- lib/actor/test_fixtures/sample_actor_status.rb
|
49
|
+
- lib/actor/time_unit.rb
|
48
50
|
homepage: https://github.com/ntl/actor
|
49
51
|
licenses:
|
50
52
|
- MIT
|
51
53
|
metadata: {}
|
52
|
-
post_install_message:
|
54
|
+
post_install_message:
|
53
55
|
rdoc_options: []
|
54
56
|
require_paths:
|
55
57
|
- lib
|
@@ -64,9 +66,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
64
66
|
- !ruby/object:Gem::Version
|
65
67
|
version: '0'
|
66
68
|
requirements: []
|
67
|
-
rubyforge_project:
|
68
|
-
rubygems_version: 2.6.
|
69
|
-
signing_key:
|
69
|
+
rubyforge_project:
|
70
|
+
rubygems_version: 2.6.4
|
71
|
+
signing_key:
|
70
72
|
specification_version: 4
|
71
73
|
summary: Implementation of actor pattern for ruby
|
72
74
|
test_files: []
|