ntl-actor 0.6.2 → 1.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/lib/actor.rb +45 -19
  3. data/lib/actor/actor.rb +12 -132
  4. data/lib/actor/build.rb +36 -0
  5. data/lib/actor/controls.rb +7 -7
  6. data/lib/actor/messages.rb +20 -4
  7. data/lib/actor/messaging/address.rb +26 -0
  8. data/lib/actor/messaging/address/controls.rb +11 -0
  9. data/lib/actor/messaging/address/dependency.rb +13 -0
  10. data/lib/actor/messaging/address/none.rb +33 -0
  11. data/lib/actor/messaging/message.rb +39 -1
  12. data/lib/actor/messaging/message/name.rb +33 -0
  13. data/lib/actor/messaging/publisher.rb +39 -0
  14. data/lib/actor/messaging/publisher/assertions.rb +11 -0
  15. data/lib/actor/messaging/publisher/dependency.rb +13 -0
  16. data/lib/actor/messaging/publisher/substitute.rb +62 -0
  17. data/lib/actor/messaging/queue.rb +21 -0
  18. data/lib/actor/messaging/queue/substitute.rb +53 -0
  19. data/lib/actor/messaging/reader.rb +32 -0
  20. data/lib/actor/messaging/reader/assertions.rb +25 -0
  21. data/lib/actor/messaging/reader/dependency.rb +13 -0
  22. data/lib/actor/messaging/reader/substitute.rb +31 -0
  23. data/lib/actor/messaging/writer.rb +28 -0
  24. data/lib/actor/messaging/writer/dependency.rb +13 -0
  25. data/lib/actor/messaging/writer/substitute.rb +45 -0
  26. data/lib/actor/module/dependencies.rb +30 -0
  27. data/lib/actor/module/dependencies/assertions.rb +23 -0
  28. data/lib/actor/module/handler.rb +31 -0
  29. data/lib/actor/module/handler/macro.rb +13 -0
  30. data/lib/actor/module/handler/method_name.rb +13 -0
  31. data/lib/actor/module/include_assertions.rb +18 -0
  32. data/lib/actor/module/run_loop.rb +19 -0
  33. data/lib/actor/module/start.rb +27 -0
  34. data/lib/actor/module/suspend_resume.rb +36 -0
  35. data/lib/actor/module/suspend_resume/assertions.rb +26 -0
  36. data/lib/actor/module/suspend_resume/configure.rb +13 -0
  37. data/lib/actor/module/suspend_resume/controls.rb +17 -0
  38. data/lib/actor/module/suspend_resume/handle.rb +17 -0
  39. data/lib/actor/module/suspend_resume/initialize.rb +13 -0
  40. data/lib/actor/start.rb +34 -34
  41. data/lib/actor/supervisor.rb +60 -71
  42. data/lib/actor/supervisor/address/get.rb +15 -0
  43. data/lib/actor/supervisor/address/put.rb +13 -0
  44. data/lib/actor/supervisor/address/registry.rb +7 -0
  45. data/lib/actor/supervisor/assertions.rb +20 -0
  46. metadata +42 -28
  47. data/lib/actor/address.rb +0 -18
  48. data/lib/actor/controls/actor.rb +0 -89
  49. data/lib/actor/controls/address.rb +0 -48
  50. data/lib/actor/controls/error.rb +0 -11
  51. data/lib/actor/controls/message.rb +0 -39
  52. data/lib/actor/controls/message/attribute.rb +0 -17
  53. data/lib/actor/controls/thread.rb +0 -9
  54. data/lib/actor/controls/uuid.rb +0 -15
  55. data/lib/actor/destructure.rb +0 -23
  56. data/lib/actor/duration.rb +0 -7
  57. data/lib/actor/future.rb +0 -38
  58. data/lib/actor/handle_macro.rb +0 -37
  59. data/lib/actor/messaging/read.rb +0 -54
  60. data/lib/actor/messaging/read/substitute.rb +0 -33
  61. data/lib/actor/messaging/write.rb +0 -26
  62. data/lib/actor/messaging/write/substitute.rb +0 -39
  63. data/lib/actor/observers.rb +0 -45
  64. data/lib/actor/router.rb +0 -94
  65. data/lib/actor/stream.rb +0 -36
  66. data/lib/actor/substitutes/kernel.rb +0 -23
  67. data/lib/actor/substitutes/thread.rb +0 -39
  68. data/lib/actor/substitutes/thread_group.rb +0 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 43278fd8ce2df41947048d174acb3aaeb444f71d
4
- data.tar.gz: b39cb321c8e6b8eb2dbb1dfe3a3db47a807fed91
3
+ metadata.gz: 9362612be3698e03771c7fb5098807275df662eb
4
+ data.tar.gz: e3052225551eb88b84ac6ed57d3699c588c0c37d
5
5
  SHA512:
6
- metadata.gz: b0353f54da12ba8b91f6f26c36e85111c0c67dcd884b9d6de16d504dd987b0c5b80579942d6ade2cc3005237a0a59c2476f78d3ddac930092af9b85ebd3a7ae8
7
- data.tar.gz: cfbc11890208f7d8128b133ff89cd3440025e69afd4707c1757010539003bb6d6ba4b4e0c47de90ad7a3d6ea74f2c70d1fce5d4cff97e2b2d5106c939dac04a5
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/substitutes/kernel'
6
- require 'actor/substitutes/thread_group'
7
- require 'actor/substitutes/thread'
4
+ require 'actor/messaging/queue'
5
+ require 'actor/messaging/queue/substitute'
6
+ require 'actor/messaging/queue/substitute'
8
7
 
9
- require 'actor/destructure'
10
- require 'actor/duration'
11
- require 'actor/stream'
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/read'
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/messages'
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/handle_macro'
23
- require 'actor/observers'
21
+ require 'actor/messaging/writer'
22
+ require 'actor/messaging/writer/dependency'
23
+ require 'actor/messaging/writer/substitute'
24
24
 
25
- require 'actor/start'
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/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
- cls.include Module unless cls == Object
10
- end
11
-
12
- module Module
13
- def self.included cls
14
- cls.class_exec do
15
- extend HandleMacro
16
- extend Start
17
-
18
- include Observers
19
-
20
- prepend Configure
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
@@ -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
@@ -1,7 +1,7 @@
1
- require 'actor/controls/address'
2
- require 'actor/controls/error'
3
- require 'actor/controls/message'
4
- require 'actor/controls/actor'
5
- require 'actor/controls/message/attribute'
6
- require 'actor/controls/uuid'
7
- require 'actor/controls/thread'
1
+ module Actor
2
+ module Controls
3
+ def next_message= message
4
+ reader.add message
5
+ end
6
+ end
7
+ end
@@ -1,10 +1,14 @@
1
1
  module Actor
2
2
  module Messages
3
- class Start
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
- ActorStarted = Struct.new :actor_address do
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
- class Stop
16
- include Messaging::Message
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,11 @@
1
+ module Actor
2
+ module Messaging
3
+ class Address
4
+ module Controls
5
+ def write message
6
+ queue.enq message
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module Actor
2
+ module Messaging
3
+ class Address
4
+ module Dependency
5
+ attr_writer :address
6
+
7
+ def address
8
+ @address ||= Address::None.instance
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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 = Module.new
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