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
@@ -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,11 @@
1
+ module Actor
2
+ module Messaging
3
+ class Publisher
4
+ module Assertions
5
+ def registered? address
6
+ @addresses.include? address
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module Actor
2
+ module Messaging
3
+ class Publisher
4
+ module Dependency
5
+ attr_writer :publisher
6
+
7
+ def publisher
8
+ @publisher ||= Substitute.build
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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,13 @@
1
+ module Actor
2
+ module Messaging
3
+ class Reader
4
+ module Dependency
5
+ attr_writer :reader
6
+
7
+ def reader
8
+ @reader ||= Substitute.build
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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,13 @@
1
+ module Actor
2
+ module Messaging
3
+ class Writer
4
+ module Dependency
5
+ attr_writer :writer
6
+
7
+ def writer
8
+ @writer ||= Substitute.build
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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