celluloid 0.17.3 → 0.18.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.
Files changed (171) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES.md +300 -73
  3. data/CONDUCT.md +13 -0
  4. data/CONTRIBUTING.md +39 -0
  5. data/README.md +54 -150
  6. data/REFACTOR.md +1 -0
  7. data/architecture.md +120 -0
  8. data/examples/basic_usage.rb +1 -1
  9. data/examples/configurations.rb +78 -0
  10. data/examples/futures.rb +1 -1
  11. data/examples/ring.rb +5 -4
  12. data/examples/simple_pmap.rb +1 -1
  13. data/examples/stack.rb +2 -2
  14. data/examples/supervisors_and_registry.rb +82 -0
  15. data/examples/timers.rb +2 -2
  16. data/lib/celluloid.rb +74 -64
  17. data/lib/celluloid/actor.rb +27 -17
  18. data/lib/celluloid/actor/system.rb +13 -29
  19. data/lib/celluloid/autostart.rb +6 -1
  20. data/lib/celluloid/call/async.rb +2 -0
  21. data/lib/celluloid/call/sync.rb +10 -3
  22. data/lib/celluloid/calls.rb +13 -12
  23. data/lib/celluloid/cell.rb +5 -9
  24. data/lib/celluloid/condition.rb +3 -3
  25. data/lib/celluloid/core_ext.rb +0 -2
  26. data/lib/celluloid/debug.rb +3 -0
  27. data/lib/celluloid/exceptions.rb +2 -2
  28. data/lib/celluloid/future.rb +8 -10
  29. data/lib/celluloid/group.rb +16 -6
  30. data/lib/celluloid/group/pool.rb +1 -3
  31. data/lib/celluloid/group/spawner.rb +2 -6
  32. data/lib/celluloid/internals/call_chain.rb +15 -0
  33. data/lib/celluloid/internals/cpu_counter.rb +62 -0
  34. data/lib/celluloid/internals/handlers.rb +42 -0
  35. data/lib/celluloid/internals/links.rb +38 -0
  36. data/lib/celluloid/internals/logger.rb +104 -0
  37. data/lib/celluloid/internals/method.rb +34 -0
  38. data/lib/celluloid/internals/properties.rb +32 -0
  39. data/lib/celluloid/internals/receivers.rb +64 -0
  40. data/lib/celluloid/internals/registry.rb +102 -0
  41. data/lib/celluloid/internals/responses.rb +46 -0
  42. data/lib/celluloid/internals/signals.rb +24 -0
  43. data/lib/celluloid/internals/stack.rb +74 -0
  44. data/lib/celluloid/internals/stack/dump.rb +12 -0
  45. data/lib/celluloid/internals/stack/states.rb +72 -0
  46. data/lib/celluloid/internals/stack/summary.rb +12 -0
  47. data/lib/celluloid/internals/task_set.rb +51 -0
  48. data/lib/celluloid/internals/thread_handle.rb +52 -0
  49. data/lib/celluloid/internals/uuid.rb +40 -0
  50. data/lib/celluloid/logging/incident.rb +21 -0
  51. data/lib/celluloid/logging/incident_logger.rb +147 -0
  52. data/lib/celluloid/logging/incident_reporter.rb +49 -0
  53. data/lib/celluloid/logging/log_event.rb +20 -0
  54. data/lib/celluloid/logging/ring_buffer.rb +64 -0
  55. data/lib/celluloid/mailbox.rb +22 -9
  56. data/lib/celluloid/mailbox/evented.rb +13 -5
  57. data/lib/celluloid/notifications.rb +95 -0
  58. data/lib/celluloid/pool.rb +6 -0
  59. data/lib/celluloid/probe.rb +81 -0
  60. data/lib/celluloid/proxy/abstract.rb +9 -9
  61. data/lib/celluloid/proxy/async.rb +1 -1
  62. data/lib/celluloid/proxy/block.rb +2 -2
  63. data/lib/celluloid/proxy/cell.rb +1 -1
  64. data/lib/celluloid/proxy/future.rb +2 -4
  65. data/lib/celluloid/proxy/sync.rb +1 -3
  66. data/lib/celluloid/rspec.rb +22 -33
  67. data/lib/celluloid/supervision.rb +17 -0
  68. data/lib/celluloid/supervision/configuration.rb +169 -0
  69. data/lib/celluloid/supervision/configuration/injections.rb +8 -0
  70. data/lib/celluloid/supervision/configuration/instance.rb +113 -0
  71. data/lib/celluloid/supervision/constants.rb +123 -0
  72. data/lib/celluloid/supervision/container.rb +144 -0
  73. data/lib/celluloid/supervision/container/behavior.rb +89 -0
  74. data/lib/celluloid/supervision/container/behavior/pool.rb +71 -0
  75. data/lib/celluloid/supervision/container/behavior/tree.rb +23 -0
  76. data/lib/celluloid/supervision/container/injections.rb +8 -0
  77. data/lib/celluloid/supervision/container/instance.rb +116 -0
  78. data/lib/celluloid/supervision/container/pool.rb +210 -0
  79. data/lib/celluloid/supervision/service.rb +27 -0
  80. data/lib/celluloid/supervision/supervise.rb +34 -0
  81. data/lib/celluloid/supervision/validation.rb +40 -0
  82. data/lib/celluloid/supervision/version.rb +5 -0
  83. data/lib/celluloid/system_events.rb +11 -6
  84. data/lib/celluloid/task.rb +25 -12
  85. data/lib/celluloid/task/fibered.rb +6 -2
  86. data/lib/celluloid/task/threaded.rb +3 -3
  87. data/lib/celluloid/test.rb +5 -2
  88. data/lib/celluloid/thread.rb +0 -2
  89. data/lib/celluloid/version.rb +1 -1
  90. data/spec/celluloid/block_spec.rb +29 -32
  91. data/spec/celluloid/calls_spec.rb +5 -15
  92. data/spec/celluloid/future_spec.rb +7 -1
  93. data/spec/celluloid/internals/cpu_counter_spec.rb +129 -0
  94. data/spec/celluloid/internals/links_spec.rb +43 -0
  95. data/spec/celluloid/internals/properties_spec.rb +40 -0
  96. data/spec/celluloid/internals/registry_spec.rb +62 -0
  97. data/spec/celluloid/internals/stack/dump_spec.rb +4 -0
  98. data/spec/celluloid/internals/stack/summary_spec.rb +4 -0
  99. data/spec/celluloid/internals/thread_handle_spec.rb +60 -0
  100. data/spec/celluloid/internals/uuid_spec.rb +9 -0
  101. data/spec/celluloid/logging/ring_buffer_spec.rb +36 -0
  102. data/spec/celluloid/mailbox/evented_spec.rb +11 -22
  103. data/spec/celluloid/misc/leak_spec.rb +3 -4
  104. data/spec/celluloid/notifications_spec.rb +140 -0
  105. data/spec/celluloid/probe_spec.rb +102 -0
  106. data/spec/celluloid/proxy_spec.rb +30 -30
  107. data/spec/celluloid/supervision/behavior_spec.rb +74 -0
  108. data/spec/celluloid/supervision/configuration_spec.rb +181 -0
  109. data/spec/celluloid/supervision/container_spec.rb +72 -0
  110. data/spec/celluloid/supervision/instance_spec.rb +13 -0
  111. data/spec/celluloid/supervision/root_spec.rb +28 -0
  112. data/spec/celluloid/supervision/supervisor_spec.rb +93 -0
  113. data/spec/celluloid/task/fibered_spec.rb +1 -3
  114. data/spec/celluloid/task/threaded_spec.rb +1 -3
  115. data/spec/shared/actor_examples.rb +58 -33
  116. data/spec/shared/group_examples.rb +2 -2
  117. data/spec/shared/mailbox_examples.rb +1 -1
  118. data/spec/shared/stack_examples.rb +87 -0
  119. data/spec/shared/task_examples.rb +2 -3
  120. data/spec/spec_helper.rb +2 -4
  121. data/spec/support/configure_rspec.rb +2 -3
  122. data/spec/support/coverage.rb +2 -4
  123. data/spec/support/crash_checking.rb +2 -2
  124. data/spec/support/examples/actor_class.rb +3 -8
  125. data/spec/support/examples/call_class.rb +2 -2
  126. data/spec/support/examples/container_class.rb +35 -0
  127. data/spec/support/examples/evented_mailbox_class.rb +1 -2
  128. data/spec/support/examples/stack_classes.rb +58 -0
  129. data/spec/support/examples/stack_methods.rb +23 -0
  130. data/spec/support/examples/subordinate_class.rb +19 -0
  131. data/spec/support/logging.rb +3 -34
  132. data/spec/support/loose_threads.rb +3 -16
  133. data/spec/support/reset_class_variables.rb +5 -1
  134. data/spec/support/stubbing.rb +1 -1
  135. metadata +91 -290
  136. data/culture/CONDUCT.md +0 -28
  137. data/culture/Gemfile +0 -9
  138. data/culture/LICENSE.txt +0 -22
  139. data/culture/README.md +0 -22
  140. data/culture/Rakefile +0 -5
  141. data/culture/SYNC.md +0 -70
  142. data/culture/celluloid-culture.gemspec +0 -18
  143. data/culture/gems/README.md +0 -39
  144. data/culture/gems/dependencies.yml +0 -85
  145. data/culture/gems/loader.rb +0 -101
  146. data/culture/rubocop/README.md +0 -38
  147. data/culture/rubocop/lint.yml +0 -8
  148. data/culture/rubocop/metrics.yml +0 -15
  149. data/culture/rubocop/perf.yml +0 -0
  150. data/culture/rubocop/rubocop.yml +0 -5
  151. data/culture/rubocop/style.yml +0 -57
  152. data/culture/spec/gems_spec.rb +0 -2
  153. data/culture/spec/spec_helper.rb +0 -0
  154. data/culture/spec/sync_spec.rb +0 -2
  155. data/culture/sync.rb +0 -56
  156. data/culture/tasks/rspec.rake +0 -5
  157. data/culture/tasks/rubocop.rake +0 -2
  158. data/lib/celluloid/actor/manager.rb +0 -7
  159. data/lib/celluloid/backported.rb +0 -2
  160. data/lib/celluloid/current.rb +0 -2
  161. data/lib/celluloid/deprecate.rb +0 -21
  162. data/lib/celluloid/fiber.rb +0 -32
  163. data/lib/celluloid/managed.rb +0 -3
  164. data/lib/celluloid/notices.rb +0 -15
  165. data/spec/deprecate/actor_system_spec.rb +0 -72
  166. data/spec/deprecate/block_spec.rb +0 -52
  167. data/spec/deprecate/calls_spec.rb +0 -39
  168. data/spec/deprecate/evented_mailbox_spec.rb +0 -34
  169. data/spec/deprecate/future_spec.rb +0 -32
  170. data/spec/deprecate/internal_pool_spec.rb +0 -4
  171. data/spec/support/env.rb +0 -21
@@ -0,0 +1,27 @@
1
+ module Celluloid
2
+ module Supervision
3
+ module Service
4
+ class Root < Container
5
+ class << self
6
+ def define
7
+ super({
8
+ supervise: Celluloid.actor_system.root_configuration,
9
+ as: :root_supervisor,
10
+ accessors: [:root],
11
+ branch: :root,
12
+ type: self
13
+ })
14
+ end
15
+
16
+ def deploy(instances)
17
+ super(supervise: instances, branch: :root, as: :root, type: self)
18
+ end
19
+ end
20
+ def provider
21
+ Celluloid.root_services
22
+ end
23
+ end
24
+ class Public < Container; end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,34 @@
1
+ # collect together all instances of the `supervise` method
2
+ module Celluloid
3
+ class << self
4
+ def supervise(config = {}, &block)
5
+ supervisor = Supervision.router(config)
6
+ supervisor.supervise(config, &block)
7
+ end
8
+ end
9
+ module ClassMethods
10
+ def supervise(config = {}, &block)
11
+ Celluloid.supervise(config.merge(type: self), &block)
12
+ end
13
+ end
14
+ module Supervision
15
+ class << self
16
+ def router(_config = {})
17
+ # TODO: Actually route.
18
+ Celluloid.services # for now, hardcode .services
19
+ end
20
+ end
21
+ class Container
22
+ class << self
23
+ def supervise(config, &block)
24
+ blocks << lambda do |container|
25
+ container.add(config, &block)
26
+ end
27
+ end
28
+ end
29
+ def supervise(config, &block)
30
+ add(Configuration.options(config, block: block))
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,40 @@
1
+ module Celluloid
2
+ module Supervision
3
+ class Configuration
4
+ class << self
5
+ def valid?(configuration, fails = false)
6
+ parameters(:mandatory).each do |k|
7
+ unless configuration.key? k
8
+ if fails
9
+ raise Error::Incomplete, "Missing `:#{k}` in supervision configuration."
10
+ else
11
+ return false
12
+ end
13
+ end
14
+ end
15
+ arity.each do |klass, args|
16
+ next if configuration[args].is_a? Proc
17
+ __a = configuration[args] && configuration[args].count || 0
18
+ __arity = configuration[klass].allocate.method(:initialize).arity
19
+ unless (__arity < 0 && __a >= __arity.abs - 1) || __a == __arity.abs
20
+ if fails
21
+ raise ArgumentError, "#{__a} vs. #{__arity}"
22
+ else
23
+ return false
24
+ end
25
+ end
26
+ end
27
+ true
28
+ end
29
+
30
+ def options(config = {}, options = {})
31
+ configuration = config.merge(options)
32
+ return configuration if configuration.is_a? Configuration
33
+ configuration[:configuration] = Container::Behavior.configure(configuration)
34
+ valid?(configuration, true)
35
+ configuration
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,5 @@
1
+ module Celluloid
2
+ module Supervision
3
+ VERSION = "0.20.6".freeze
4
+ end
5
+ end
@@ -5,7 +5,10 @@ module Celluloid
5
5
  if handler = SystemEvent.handle(event.class)
6
6
  send(handler, event)
7
7
  else
8
+ # !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
9
+ # rubocop:disable Style/GlobalVars
8
10
  Internals::Logger.debug "Discarded message (unhandled): #{message}" if $CELLULOID_DEBUG
11
+ # rubocop:enable Style/GlobalVars
9
12
  end
10
13
  end
11
14
  end
@@ -18,7 +21,7 @@ module Celluloid
18
21
  end
19
22
 
20
23
  def handler(&block)
21
- fail ArgumentError, "SystemEvent handlers must be defined with a block." unless block
24
+ raise ArgumentError, "SystemEvent handlers must be defined with a block." unless block
22
25
  method = begin
23
26
  handler = name
24
27
  .split("::").last
@@ -38,7 +41,7 @@ module Celluloid
38
41
  def initialize(actor, type)
39
42
  @actor = actor
40
43
  @type = type.to_sym
41
- fail ArgumentError, "type must be link or unlink" unless [:link, :unlink].include?(@type)
44
+ raise ArgumentError, "type must be link or unlink" unless %i[link unlink].include?(@type)
42
45
  end
43
46
  end
44
47
  end
@@ -87,7 +90,11 @@ module Celluloid
87
90
 
88
91
  handler do |event|
89
92
  @name = event.name
93
+
94
+ # !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
95
+ # rubocop:disable Style/GlobalVars
90
96
  Celluloid::Probe.actor_named(self) if $CELLULOID_MONITORING
97
+ # rubocop:enable Style/GlobalVars
91
98
  end
92
99
 
93
100
  def initialize(name)
@@ -97,7 +104,7 @@ module Celluloid
97
104
 
98
105
  # Request for an actor to terminate
99
106
  class TerminationRequest < SystemEvent
100
- handler do |event|
107
+ handler do |_event|
101
108
  terminate
102
109
  end
103
110
  end
@@ -110,9 +117,7 @@ module Celluloid
110
117
  end
111
118
  attr_reader :task, :value
112
119
 
113
- handler do |event|
114
- event.call
115
- end
120
+ handler(&:call)
116
121
 
117
122
  def call
118
123
  @task.resume(@value)
@@ -3,7 +3,7 @@ module Celluloid
3
3
  class Task
4
4
  # Obtain the current task
5
5
  def self.current
6
- Thread.current[:celluloid_task] || fail(NotTaskError, "not within a task context")
6
+ Thread.current[:celluloid_task] || raise(NotTaskError, "not within a task context")
7
7
  end
8
8
 
9
9
  # Suspend the running task, deferring to the scheduler
@@ -27,7 +27,7 @@ module Celluloid
27
27
  actor = Thread.current[:celluloid_actor]
28
28
  @chain_id = Internals::CallChain.current_id
29
29
 
30
- fail NotActorError, "can't create tasks outside of actors" unless actor
30
+ raise NotActorError, "can't create tasks outside of actors" unless actor
31
31
  guard "can't create tasks inside of tasks" if Thread.current[:celluloid_task]
32
32
 
33
33
  create do
@@ -53,26 +53,29 @@ module Celluloid
53
53
  end
54
54
 
55
55
  def create(&_block)
56
- fail "Implement #{self.class}#create"
56
+ raise "Implement #{self.class}#create"
57
57
  end
58
58
 
59
59
  # Suspend the current task, changing the status to the given argument
60
60
  def suspend(status)
61
- fail "Cannot suspend while in exclusive mode" if exclusive?
62
- fail "Cannot suspend a task from outside of itself" unless Task.current == self
61
+ raise "Cannot suspend while in exclusive mode" if exclusive?
62
+ raise "Cannot suspend a task from outside of itself" unless Task.current == self
63
63
 
64
64
  @status = status
65
65
 
66
+ # !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
67
+ # rubocop:disable Style/GlobalVars
66
68
  if $CELLULOID_DEBUG && @dangerous_suspend
67
69
  Internals::Logger.with_backtrace(caller[2...8]) do |logger|
68
70
  logger.warn "Dangerously suspending task: type=#{@type.inspect}, meta=#{@meta.inspect}, status=#{@status.inspect}"
69
71
  end
70
72
  end
73
+ # rubocop:enable Style/GlobalVars
71
74
 
72
75
  value = signal
73
76
 
74
77
  @status = :running
75
- fail value if value.is_a?(Celluloid::Interruption)
78
+ raise value if value.is_a?(Celluloid::Interruption)
76
79
  value
77
80
  end
78
81
 
@@ -82,7 +85,9 @@ module Celluloid
82
85
  if running?
83
86
  deliver(value)
84
87
  else
88
+ # rubocop:disable Metrics/LineLength
85
89
  Internals::Logger.warn "Attempted to resume a dead task: type=#{@type.inspect}, meta=#{@meta.inspect}, status=#{@status.inspect}"
90
+ # rubocop:enable Metrics/LineLength
86
91
  end
87
92
  nil
88
93
  end
@@ -103,20 +108,24 @@ module Celluloid
103
108
 
104
109
  # Terminate this task
105
110
  def terminate
106
- fail "Cannot terminate an exclusive task" if exclusive?
111
+ raise "Cannot terminate an exclusive task" if exclusive?
107
112
 
108
113
  if running?
114
+ # !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
115
+ # rubocop:disable Style/GlobalVars
109
116
  if $CELLULOID_DEBUG
110
117
  Internals::Logger.with_backtrace(backtrace) do |logger|
111
118
  type = @dangerous_suspend ? :warn : :debug
112
119
  logger.send(type, "Terminating task: type=#{@type.inspect}, meta=#{@meta.inspect}, status=#{@status.inspect}")
113
120
  end
114
121
  end
122
+ # rubocop:enable Style/GlobalVars
123
+
115
124
  exception = TaskTerminated.new("task was terminated")
116
125
  exception.set_backtrace(caller)
117
126
  resume exception
118
127
  else
119
- fail DeadTaskError, "task is already dead"
128
+ raise DeadTaskError, "task is already dead"
120
129
  end
121
130
  end
122
131
 
@@ -125,8 +134,7 @@ module Celluloid
125
134
  @exclusive
126
135
  end
127
136
 
128
- def backtrace
129
- end
137
+ def backtrace; end
130
138
 
131
139
  # Is the current task still running?
132
140
  def running?
@@ -139,11 +147,14 @@ module Celluloid
139
147
  end
140
148
 
141
149
  def guard(message)
150
+ # !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
151
+ # rubocop:disable Style/GlobalVars
142
152
  if @guard_warnings
143
153
  Internals::Logger.warn message if $CELLULOID_DEBUG
144
154
  else
145
- fail message if $CELLULOID_DEBUG
155
+ raise message if $CELLULOID_DEBUG
146
156
  end
157
+ # rubocop:enable Style/GlobalVars
147
158
  end
148
159
 
149
160
  private
@@ -161,7 +172,9 @@ module Celluloid
161
172
 
162
173
  def thread_metadata
163
174
  method = @meta && @meta[:method_name] || "<no method>"
164
- klass = Thread.current[:celluloid_actor] && Thread.current[:celluloid_actor].behavior.subject.bare_object.class || "<no actor>"
175
+ klass = Thread.current[:celluloid_actor] &&
176
+ Thread.current[:celluloid_actor].behavior.subject.bare_object.class ||
177
+ "<no actor>"
165
178
  format("[Celluloid] %s#%s", klass, method)
166
179
  end
167
180
  end
@@ -12,8 +12,10 @@ module Celluloid
12
12
  Thread.current[:celluloid_queue] = queue
13
13
  Thread.current[:celluloid_actor_system] = actor_system
14
14
  yield
15
- # TODO: Determine why infinite thread leakage happens under jRuby, if `Fiber.yield` is used:
16
- Fiber.yield unless RUBY_PLATFORM == "java"
15
+
16
+ # Alleged workaround for a MRI memory leak
17
+ # TODO: validate/confirm this is actually necessary
18
+ Fiber.yield if RUBY_ENGINE == "ruby"
17
19
  end
18
20
  end
19
21
 
@@ -38,7 +40,9 @@ module Celluloid
38
40
  end
39
41
 
40
42
  def backtrace
43
+ # rubocop:disable Metrics/LineLength
41
44
  ["#{self.class} backtrace unavailable. Please try `Celluloid.task_class = Celluloid::Task::Threaded` if you need backtraces here."]
45
+ # rubocop:enable Metrics/LineLength
42
46
  end
43
47
  end
44
48
  end
@@ -18,7 +18,7 @@ module Celluloid
18
18
  thread = Internals::ThreadHandle.new(Thread.current[:celluloid_actor_system], :task) do
19
19
  begin
20
20
  ex = @resume_queue.pop
21
- fail ex if ex.is_a?(TaskTerminated)
21
+ raise ex if ex.is_a?(TaskTerminated)
22
22
 
23
23
  yield
24
24
  rescue ::Exception => ex
@@ -40,12 +40,12 @@ module Celluloid
40
40
  end
41
41
 
42
42
  def deliver(value)
43
- fail DeadTaskError, "cannot resume a dead task" unless @thread.alive?
43
+ raise DeadTaskError, "cannot resume a dead task" unless @thread.alive?
44
44
 
45
45
  @yield_mutex.synchronize do
46
46
  @resume_queue.push(value)
47
47
  @yield_cond.wait(@yield_mutex)
48
- fail @exception_queue.pop while @exception_queue.size > 0
48
+ raise @exception_queue.pop until @exception_queue.empty?
49
49
  end
50
50
  rescue ThreadError
51
51
  raise DeadTaskError, "cannot resume a dead task"
@@ -1,3 +1,6 @@
1
+ # !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
2
+ # rubocop:disable Style/GlobalVars
1
3
  $CELLULOID_TEST = true
2
-
3
- require "celluloid"
4
+ # rubocop:enable Style/GlobalVars
5
+ #
6
+ require "celluloid/autostart"
@@ -1,5 +1,3 @@
1
- require "celluloid/fiber"
2
-
3
1
  module Celluloid
4
2
  class Thread < ::Thread
5
3
  def celluloid?
@@ -1,3 +1,3 @@
1
1
  module Celluloid
2
- VERSION = "0.17.3"
2
+ VERSION = "0.18.0".freeze
3
3
  end
@@ -2,19 +2,20 @@ RSpec.describe "Blocks", actor_system: :global do
2
2
  class MyBlockActor
3
3
  include Celluloid
4
4
 
5
- def initialize(name)
5
+ def initialize(name, data)
6
6
  @name = name
7
+ @data = data
7
8
  end
8
9
  attr_reader :name
9
10
 
10
11
  def ask_for_something(other)
11
12
  sender_actor = current_actor
12
- $data << [:outside, @name, current_actor.name]
13
- other.do_something_and_callback do |value|
14
- $data << [:yielded, @name, current_actor.name]
15
- $data << receive_result(:self)
16
- $data << current_actor.receive_result(:current_actor)
17
- $data << sender_actor.receive_result(:sender)
13
+ @data << [:outside, @name, current_actor.name]
14
+ other.do_something_and_callback do |_value|
15
+ @data << [:yielded, @name, current_actor.name]
16
+ @data << receive_result(:self)
17
+ @data << current_actor.receive_result(:current_actor)
18
+ @data << sender_actor.receive_result(:sender)
18
19
  :pete_the_polyglot_alien
19
20
  end
20
21
  end
@@ -34,20 +35,20 @@ RSpec.describe "Blocks", actor_system: :global do
34
35
  def defer_for_something(other, &_block)
35
36
  sender_actor = current_actor
36
37
  defer do
37
- $data << [:outside, @name, current_actor.name]
38
- other.do_something_and_callback do |value|
39
- $data << [:yielded, @name, current_actor.name]
40
- $data << receive_result(:self)
41
- $data << current_actor.receive_result(:current_actor)
42
- $data << sender_actor.receive_result(:sender)
38
+ @data << [:outside, @name, current_actor.name]
39
+ other.do_something_and_callback do |_value|
40
+ @data << [:yielded, @name, current_actor.name]
41
+ @data << receive_result(:self)
42
+ @data << current_actor.receive_result(:current_actor)
43
+ @data << sender_actor.receive_result(:sender)
43
44
  :pete_the_polyglot_alien
44
45
  end
45
46
  end
46
47
  end
47
48
 
48
49
  def do_something_and_callback
49
- $data << [:something, @name, current_actor.name]
50
- $data << yield(:foo)
50
+ @data << [:something, @name, current_actor.name]
51
+ @data << yield(:foo)
51
52
  end
52
53
 
53
54
  def receive_result(result)
@@ -56,10 +57,10 @@ RSpec.describe "Blocks", actor_system: :global do
56
57
  end
57
58
 
58
59
  it "work between actors" do
59
- $data = []
60
+ data = []
60
61
 
61
- a1 = MyBlockActor.new("one")
62
- a2 = MyBlockActor.new("two")
62
+ a1 = MyBlockActor.new("one", data)
63
+ a2 = MyBlockActor.new("two", data)
63
64
 
64
65
  a1.ask_for_something a2
65
66
 
@@ -70,33 +71,29 @@ RSpec.describe "Blocks", actor_system: :global do
70
71
  [:self, "one", "one"],
71
72
  [:current_actor, "one", "one"],
72
73
  [:sender, "one", "one"],
73
- :pete_the_polyglot_alien,
74
+ :pete_the_polyglot_alien
74
75
  ]
75
76
 
76
- expect($data).to eq(expected)
77
+ expect(data).to eq(expected)
77
78
  end
78
79
 
79
80
  execute_deferred = proc do
80
- a1 = MyBlockActor.new("one")
81
+ a1 = MyBlockActor.new("one", [])
81
82
  expect(a1.deferred_excecution(:pete_the_polyglot_alien) { |v| v })
82
- .to eq(:pete_the_polyglot_alien)
83
+ .to eq(:pete_the_polyglot_alien)
83
84
  end
84
85
 
85
- # unless RUBY_ENGINE == 'jruby'
86
86
  xit("can be deferred", &execute_deferred)
87
- # else
88
- # it("can be deferred", &execute_deferred)
89
- # end
90
87
 
91
88
  xit "can execute deferred blocks referencing current_actor" do
92
- a1 = MyBlockActor.new("one")
89
+ a1 = MyBlockActor.new("one", [])
93
90
  expect(a1.deferred_current_actor { |v| v }).to be("one")
94
91
  end
95
92
 
96
93
  xit "can execute deferred blocks with another actor" do
97
- $data = []
98
- a1 = MyBlockActor.new("one")
99
- a2 = MyBlockActor.new("two")
94
+ data = []
95
+ a1 = MyBlockActor.new("one", data)
96
+ a2 = MyBlockActor.new("two", data)
100
97
  a1.defer_for_something a2
101
98
  expected = [
102
99
  [:outside, "one", "one"],
@@ -105,9 +102,9 @@ RSpec.describe "Blocks", actor_system: :global do
105
102
  [:self, "one", "one"],
106
103
  [:current_actor, "one", "one"],
107
104
  [:sender, "one", "one"],
108
- :pete_the_polyglot_alien,
105
+ :pete_the_polyglot_alien
109
106
  ]
110
107
 
111
- expect($data).to eq(expected)
108
+ expect(data).to eq(expected)
112
109
  end
113
110
  end