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.
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