celluloid 0.17.2 → 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 (174) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES.md +340 -75
  3. data/CONDUCT.md +13 -0
  4. data/CONTRIBUTING.md +39 -0
  5. data/LICENSE.txt +1 -1
  6. data/README.md +54 -150
  7. data/REFACTOR.md +1 -0
  8. data/architecture.md +120 -0
  9. data/examples/basic_usage.rb +1 -1
  10. data/examples/configurations.rb +78 -0
  11. data/examples/futures.rb +1 -1
  12. data/examples/ring.rb +5 -4
  13. data/examples/simple_pmap.rb +1 -1
  14. data/examples/stack.rb +2 -2
  15. data/examples/supervisors_and_registry.rb +82 -0
  16. data/examples/timers.rb +2 -2
  17. data/lib/celluloid.rb +78 -65
  18. data/lib/celluloid/actor.rb +27 -17
  19. data/lib/celluloid/actor/system.rb +13 -29
  20. data/lib/celluloid/autostart.rb +6 -1
  21. data/lib/celluloid/call/async.rb +2 -0
  22. data/lib/celluloid/call/sync.rb +10 -3
  23. data/lib/celluloid/calls.rb +13 -13
  24. data/lib/celluloid/cell.rb +5 -9
  25. data/lib/celluloid/condition.rb +3 -3
  26. data/lib/celluloid/core_ext.rb +0 -2
  27. data/lib/celluloid/debug.rb +3 -0
  28. data/lib/celluloid/exceptions.rb +2 -2
  29. data/lib/celluloid/future.rb +8 -10
  30. data/lib/celluloid/group.rb +16 -6
  31. data/lib/celluloid/group/pool.rb +1 -3
  32. data/lib/celluloid/group/spawner.rb +2 -6
  33. data/lib/celluloid/internals/call_chain.rb +15 -0
  34. data/lib/celluloid/internals/cpu_counter.rb +62 -0
  35. data/lib/celluloid/internals/handlers.rb +42 -0
  36. data/lib/celluloid/internals/links.rb +38 -0
  37. data/lib/celluloid/internals/logger.rb +104 -0
  38. data/lib/celluloid/internals/method.rb +34 -0
  39. data/lib/celluloid/internals/properties.rb +32 -0
  40. data/lib/celluloid/internals/receivers.rb +64 -0
  41. data/lib/celluloid/internals/registry.rb +102 -0
  42. data/lib/celluloid/internals/responses.rb +46 -0
  43. data/lib/celluloid/internals/signals.rb +24 -0
  44. data/lib/celluloid/internals/stack.rb +74 -0
  45. data/lib/celluloid/internals/stack/dump.rb +12 -0
  46. data/lib/celluloid/internals/stack/states.rb +72 -0
  47. data/lib/celluloid/internals/stack/summary.rb +12 -0
  48. data/lib/celluloid/internals/task_set.rb +51 -0
  49. data/lib/celluloid/internals/thread_handle.rb +52 -0
  50. data/lib/celluloid/internals/uuid.rb +40 -0
  51. data/lib/celluloid/logging/incident.rb +21 -0
  52. data/lib/celluloid/logging/incident_logger.rb +147 -0
  53. data/lib/celluloid/logging/incident_reporter.rb +49 -0
  54. data/lib/celluloid/logging/log_event.rb +20 -0
  55. data/lib/celluloid/logging/ring_buffer.rb +64 -0
  56. data/lib/celluloid/mailbox.rb +22 -9
  57. data/lib/celluloid/mailbox/evented.rb +13 -7
  58. data/lib/celluloid/notifications.rb +95 -0
  59. data/lib/celluloid/pool.rb +6 -0
  60. data/lib/celluloid/probe.rb +81 -0
  61. data/lib/celluloid/proxy/abstract.rb +38 -7
  62. data/lib/celluloid/proxy/actor.rb +0 -5
  63. data/lib/celluloid/proxy/async.rb +2 -18
  64. data/lib/celluloid/proxy/block.rb +2 -1
  65. data/lib/celluloid/proxy/cell.rb +1 -7
  66. data/lib/celluloid/proxy/future.rb +3 -21
  67. data/lib/celluloid/proxy/sync.rb +2 -20
  68. data/lib/celluloid/rspec.rb +22 -34
  69. data/lib/celluloid/supervision.rb +17 -0
  70. data/lib/celluloid/supervision/configuration.rb +169 -0
  71. data/lib/celluloid/supervision/configuration/injections.rb +8 -0
  72. data/lib/celluloid/supervision/configuration/instance.rb +113 -0
  73. data/lib/celluloid/supervision/constants.rb +123 -0
  74. data/lib/celluloid/supervision/container.rb +144 -0
  75. data/lib/celluloid/supervision/container/behavior.rb +89 -0
  76. data/lib/celluloid/supervision/container/behavior/pool.rb +71 -0
  77. data/lib/celluloid/supervision/container/behavior/tree.rb +23 -0
  78. data/lib/celluloid/supervision/container/injections.rb +8 -0
  79. data/lib/celluloid/supervision/container/instance.rb +116 -0
  80. data/lib/celluloid/supervision/container/pool.rb +210 -0
  81. data/lib/celluloid/supervision/service.rb +27 -0
  82. data/lib/celluloid/supervision/supervise.rb +34 -0
  83. data/lib/celluloid/supervision/validation.rb +40 -0
  84. data/lib/celluloid/supervision/version.rb +5 -0
  85. data/lib/celluloid/system_events.rb +10 -3
  86. data/lib/celluloid/task.rb +25 -12
  87. data/lib/celluloid/task/fibered.rb +6 -2
  88. data/lib/celluloid/task/threaded.rb +3 -3
  89. data/lib/celluloid/test.rb +5 -2
  90. data/lib/celluloid/thread.rb +0 -2
  91. data/lib/celluloid/version.rb +1 -1
  92. data/spec/celluloid/block_spec.rb +29 -32
  93. data/spec/celluloid/calls_spec.rb +5 -15
  94. data/spec/celluloid/future_spec.rb +7 -1
  95. data/spec/celluloid/internals/cpu_counter_spec.rb +129 -0
  96. data/spec/celluloid/internals/links_spec.rb +43 -0
  97. data/spec/celluloid/internals/properties_spec.rb +40 -0
  98. data/spec/celluloid/internals/registry_spec.rb +62 -0
  99. data/spec/celluloid/internals/stack/dump_spec.rb +4 -0
  100. data/spec/celluloid/internals/stack/summary_spec.rb +4 -0
  101. data/spec/celluloid/internals/thread_handle_spec.rb +60 -0
  102. data/spec/celluloid/internals/uuid_spec.rb +9 -0
  103. data/spec/celluloid/logging/ring_buffer_spec.rb +36 -0
  104. data/spec/celluloid/mailbox/evented_spec.rb +21 -19
  105. data/spec/celluloid/misc/leak_spec.rb +3 -4
  106. data/spec/celluloid/notifications_spec.rb +140 -0
  107. data/spec/celluloid/probe_spec.rb +102 -0
  108. data/spec/celluloid/proxy_spec.rb +33 -0
  109. data/spec/celluloid/supervision/behavior_spec.rb +74 -0
  110. data/spec/celluloid/supervision/configuration_spec.rb +181 -0
  111. data/spec/celluloid/supervision/container_spec.rb +72 -0
  112. data/spec/celluloid/supervision/instance_spec.rb +13 -0
  113. data/spec/celluloid/supervision/root_spec.rb +28 -0
  114. data/spec/celluloid/supervision/supervisor_spec.rb +93 -0
  115. data/spec/celluloid/task/fibered_spec.rb +1 -3
  116. data/spec/celluloid/task/threaded_spec.rb +1 -3
  117. data/spec/shared/actor_examples.rb +65 -29
  118. data/spec/shared/group_examples.rb +2 -2
  119. data/spec/shared/mailbox_examples.rb +1 -1
  120. data/spec/shared/stack_examples.rb +87 -0
  121. data/spec/shared/task_examples.rb +2 -3
  122. data/spec/spec_helper.rb +2 -4
  123. data/spec/support/configure_rspec.rb +3 -4
  124. data/spec/support/coverage.rb +2 -4
  125. data/spec/support/crash_checking.rb +2 -2
  126. data/spec/support/examples/actor_class.rb +3 -8
  127. data/spec/support/examples/call_class.rb +2 -2
  128. data/spec/support/examples/container_class.rb +35 -0
  129. data/spec/support/examples/evented_mailbox_class.rb +1 -2
  130. data/spec/support/examples/stack_classes.rb +58 -0
  131. data/spec/support/examples/stack_methods.rb +23 -0
  132. data/spec/support/examples/subordinate_class.rb +19 -0
  133. data/spec/support/logging.rb +3 -34
  134. data/spec/support/loose_threads.rb +3 -24
  135. data/spec/support/reset_class_variables.rb +5 -1
  136. data/spec/support/stubbing.rb +1 -1
  137. metadata +93 -291
  138. data/culture/CONDUCT.md +0 -28
  139. data/culture/Gemfile +0 -9
  140. data/culture/LICENSE.txt +0 -22
  141. data/culture/README.md +0 -22
  142. data/culture/Rakefile +0 -5
  143. data/culture/SYNC.md +0 -70
  144. data/culture/celluloid-culture.gemspec +0 -18
  145. data/culture/gems/README.md +0 -39
  146. data/culture/gems/dependencies.yml +0 -85
  147. data/culture/gems/loader.rb +0 -101
  148. data/culture/rubocop/README.md +0 -38
  149. data/culture/rubocop/lint.yml +0 -8
  150. data/culture/rubocop/metrics.yml +0 -15
  151. data/culture/rubocop/perf.yml +0 -0
  152. data/culture/rubocop/rubocop.yml +0 -5
  153. data/culture/rubocop/style.yml +0 -57
  154. data/culture/spec/gems_spec.rb +0 -2
  155. data/culture/spec/spec_helper.rb +0 -0
  156. data/culture/spec/sync_spec.rb +0 -2
  157. data/culture/sync.rb +0 -56
  158. data/culture/tasks/rspec.rake +0 -5
  159. data/culture/tasks/rubocop.rake +0 -2
  160. data/lib/celluloid/actor/manager.rb +0 -7
  161. data/lib/celluloid/backported.rb +0 -2
  162. data/lib/celluloid/current.rb +0 -2
  163. data/lib/celluloid/deprecate.rb +0 -21
  164. data/lib/celluloid/fiber.rb +0 -32
  165. data/lib/celluloid/managed.rb +0 -3
  166. data/lib/celluloid/notices.rb +0 -15
  167. data/spec/celluloid/actor/manager_spec.rb +0 -0
  168. data/spec/deprecate/actor_system_spec.rb +0 -72
  169. data/spec/deprecate/block_spec.rb +0 -52
  170. data/spec/deprecate/calls_spec.rb +0 -39
  171. data/spec/deprecate/evented_mailbox_spec.rb +0 -34
  172. data/spec/deprecate/future_spec.rb +0 -32
  173. data/spec/deprecate/internal_pool_spec.rb +0 -4
  174. data/spec/support/env.rb +0 -21
@@ -0,0 +1,95 @@
1
+ module Celluloid
2
+ module Notifications
3
+ def self.notifier
4
+ Actor[:notifications_fanout] || raise(DeadActorError, "notifications fanout actor not running")
5
+ end
6
+
7
+ def publish(pattern, *args)
8
+ Celluloid::Notifications.notifier.publish(pattern, *args)
9
+ rescue DeadActorError
10
+ # Bad shutdown logic. Oh well....
11
+ # TODO: needs a tests
12
+ end
13
+
14
+ module_function :publish
15
+
16
+ def subscribe(pattern, method)
17
+ Celluloid::Notifications.notifier.subscribe(Actor.current, pattern, method)
18
+ end
19
+
20
+ def unsubscribe(*args)
21
+ Celluloid::Notifications.notifier.unsubscribe(*args)
22
+ end
23
+
24
+ class Fanout
25
+ include Celluloid
26
+ trap_exit :prune
27
+
28
+ def initialize
29
+ @subscribers = []
30
+ @listeners_for = {}
31
+ end
32
+
33
+ def subscribe(actor, pattern, method)
34
+ subscriber = Subscriber.new(actor, pattern, method).tap do |s|
35
+ @subscribers << s
36
+ end
37
+ link actor
38
+ @listeners_for.clear
39
+ subscriber
40
+ end
41
+
42
+ def unsubscribe(subscriber)
43
+ @subscribers.reject! { |s| s.matches?(subscriber) }
44
+ @listeners_for.clear
45
+ end
46
+
47
+ def publish(pattern, *args)
48
+ listeners_for(pattern).each { |s| s.publish(pattern, *args) }
49
+ end
50
+
51
+ def listeners_for(pattern)
52
+ @listeners_for[pattern] ||= @subscribers.select { |s| s.subscribed_to?(pattern) }
53
+ end
54
+
55
+ def listening?(pattern)
56
+ listeners_for(pattern).any?
57
+ end
58
+
59
+ def prune(actor, _reason = nil)
60
+ @subscribers.reject! { |s| s.actor == actor }
61
+ @listeners_for.clear
62
+ end
63
+ end
64
+
65
+ class Subscriber
66
+ attr_accessor :actor, :pattern, :method
67
+
68
+ def initialize(actor, pattern, method)
69
+ @actor = actor
70
+ @pattern = pattern
71
+ @method = method
72
+ end
73
+
74
+ def publish(pattern, *args)
75
+ actor.async method, pattern, *args
76
+ rescue DeadActorError
77
+ # TODO: needs a tests
78
+ # Bad shutdown logic. Oh well....
79
+ end
80
+
81
+ def subscribed_to?(pattern)
82
+ !pattern || @pattern === pattern.to_s || @pattern === pattern
83
+ end
84
+
85
+ def matches?(subscriber_or_pattern)
86
+ self === subscriber_or_pattern ||
87
+ @pattern && @pattern === subscriber_or_pattern
88
+ end
89
+ end
90
+ end
91
+
92
+ def self.publish(*args)
93
+ Notifications.publish(*args)
94
+ end
95
+ end
@@ -0,0 +1,6 @@
1
+ require "celluloid" unless defined? Celluloid
2
+
3
+ require "celluloid/supervision"
4
+
5
+ require "celluloid/supervision/container/pool"
6
+ require "celluloid/supervision/container/behavior/pool"
@@ -0,0 +1,81 @@
1
+ require "celluloid"
2
+
3
+ # !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
4
+ # rubocop:disable Style/GlobalVars
5
+ $CELLULOID_MONITORING = true
6
+ # rubocop:enable Style/GlobalVars
7
+
8
+ module Celluloid
9
+ class Probe
10
+ include Celluloid
11
+ include Celluloid::Notifications
12
+
13
+ NOTIFICATIONS_TOPIC_BASE = "celluloid.events.%s".freeze
14
+ EVENTS_BUFFER = Queue.new
15
+
16
+ class << self
17
+ def run
18
+ # spawn the actor if not found
19
+ supervise_as(:probe_actor) unless Actor[:probe_actor] && Actor[:probe_actor].alive?
20
+ end
21
+
22
+ def run_without_supervision
23
+ Actor[:probe_actor] = Celluloid::Probe.new
24
+ end
25
+
26
+ def actor_created(actor)
27
+ trigger_event(:actor_created, actor)
28
+ end
29
+
30
+ def actor_named(actor)
31
+ trigger_event(:actor_named, actor)
32
+ end
33
+
34
+ def actor_died(actor)
35
+ trigger_event(:actor_died, actor)
36
+ end
37
+
38
+ def actors_linked(a, b)
39
+ a = find_actor(a)
40
+ b = find_actor(b)
41
+ trigger_event(:actors_linked, a, b)
42
+ end
43
+
44
+ private
45
+
46
+ def trigger_event(name, *args)
47
+ # !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
48
+ # rubocop:disable Style/GlobalVars
49
+ return unless $CELLULOID_MONITORING
50
+ # rubocop:enable Style/GlobalVars
51
+
52
+ EVENTS_BUFFER << [name, args]
53
+ probe_actor = Actor[:probe_actor]
54
+ probe_actor.async.process_queue if probe_actor
55
+ end
56
+
57
+ def find_actor(obj)
58
+ if obj.__send__(:class) == Actor
59
+ obj
60
+ elsif owner = obj.instance_variable_get(OWNER_IVAR)
61
+ owner
62
+ end
63
+ end
64
+ end
65
+
66
+ def initialize
67
+ async.process_queue
68
+ end
69
+
70
+ def process_queue
71
+ until EVENTS_BUFFER.empty?
72
+ event = EVENTS_BUFFER.pop
73
+ dispatch_event(*event)
74
+ end
75
+ end
76
+
77
+ def dispatch_event(cmd, args)
78
+ publish(NOTIFICATIONS_TOPIC_BASE % cmd, args)
79
+ end
80
+ end
81
+ end
@@ -1,12 +1,14 @@
1
- # Base class of Celluloid proxies
2
- class Celluloid::Proxy::Abstract < BasicObject
3
- # Used for reflecting on proxy objects themselves
4
- def __class__
5
- ::Celluloid::Proxy::Abstract
1
+ module Celluloid::Proxy
2
+ # Looks up the actual class of instance, even if instance is a proxy.
3
+ def self.class_of(instance)
4
+ (class << instance; self; end).superclass
6
5
  end
6
+ end
7
7
 
8
+ # Base class of Celluloid proxies
9
+ class Celluloid::Proxy::Abstract < BasicObject
8
10
  # Needed for storing proxies in data structures
9
- needed = [:object_id, :__id__, :hash, :private_methods] - instance_methods
11
+ needed = %i[object_id __id__ hash eql? private_methods] - instance_methods
10
12
  if needed.any?
11
13
  include ::Kernel.dup.module_eval {
12
14
  undef_method(*(instance_methods - needed))
@@ -14,6 +16,35 @@ class Celluloid::Proxy::Abstract < BasicObject
14
16
  }
15
17
  # rubinius bug? These methods disappear when we include hacked kernel
16
18
  define_method :==, ::BasicObject.instance_method(:==) unless instance_methods.include?(:==)
17
- alias_method(:equal?, :==) unless instance_methods.include?(:equal?)
19
+ alias equal? == unless instance_methods.include?(:equal?)
20
+ end
21
+
22
+ def __class__
23
+ @class ||= ::Celluloid::Proxy.class_of(self)
24
+ end
25
+ end
26
+
27
+ class Celluloid::Proxy::AbstractCall < Celluloid::Proxy::Abstract
28
+ attr_reader :mailbox
29
+
30
+ def initialize(mailbox, klass)
31
+ @mailbox = mailbox
32
+ @klass = klass
33
+ end
34
+
35
+ def eql?(other)
36
+ __class__.eql?(::Celluloid::Proxy.class_of(other)) && @mailbox.eql?(other.mailbox)
37
+ end
38
+
39
+ def hash
40
+ @mailbox.hash
41
+ end
42
+
43
+ def __klass__
44
+ @klass
45
+ end
46
+
47
+ def inspect
48
+ "#<#{__class__}(#{@klass})>"
18
49
  end
19
50
  end
@@ -2,11 +2,6 @@
2
2
  class Celluloid::Proxy::Actor < Celluloid::Proxy::Abstract
3
3
  attr_reader :thread, :mailbox
4
4
 
5
- # Used for reflecting on proxy objects themselves
6
- def __class__
7
- ::Celluloid::Proxy::Actor
8
- end
9
-
10
5
  def initialize(mailbox, thread)
11
6
  @mailbox = mailbox
12
7
  @thread = thread
@@ -1,21 +1,5 @@
1
1
  # A proxy which sends asynchronous calls to an actor
2
- class Celluloid::Proxy::Async < Celluloid::Proxy::Abstract
3
- attr_reader :mailbox
4
-
5
- # Used for reflecting on proxy objects themselves
6
- def __class__
7
- ::Celluloid::Proxy::Async
8
- end
9
-
10
- def initialize(mailbox, klass)
11
- @mailbox = mailbox
12
- @klass = klass
13
- end
14
-
15
- def inspect
16
- "#<Celluloid::Proxy::Async(#{@klass})>"
17
- end
18
-
2
+ class Celluloid::Proxy::Async < Celluloid::Proxy::AbstractCall
19
3
  def method_missing(meth, *args, &block)
20
4
  if @mailbox == ::Thread.current[:celluloid_mailbox]
21
5
  args.unshift meth
@@ -23,7 +7,7 @@ class Celluloid::Proxy::Async < Celluloid::Proxy::Abstract
23
7
  end
24
8
  if block_given?
25
9
  # FIXME: nicer exception
26
- fail "Cannot use blocks with async yet"
10
+ raise "Cannot use blocks with async yet"
27
11
  end
28
12
  @mailbox << ::Celluloid::Call::Async.new(meth, args, block)
29
13
  self
@@ -1,6 +1,7 @@
1
1
  class Celluloid::Proxy::Block
2
2
  attr_writer :execution
3
3
  attr_reader :call, :block
4
+
4
5
  def initialize(mailbox, call, block)
5
6
  @mailbox = mailbox
6
7
  @call = call
@@ -17,7 +18,7 @@ class Celluloid::Proxy::Block
17
18
  task.suspend(:invokeblock)
18
19
  else
19
20
  # FIXME: better exception
20
- fail "No task to suspend"
21
+ raise "No task to suspend"
21
22
  end
22
23
  end
23
24
  else
@@ -1,15 +1,9 @@
1
1
  # A proxy object returned from Celluloid::Actor.new/new_link which converts
2
2
  # the normal Ruby method protocol into an inter-actor message protocol
3
3
  class Celluloid::Proxy::Cell < Celluloid::Proxy::Sync
4
- # Used for reflecting on proxy objects themselves
5
- def __class__
6
- ::Celluloid::Proxy::Cell
7
- end
8
-
9
4
  def initialize(mailbox, actor_proxy, klass)
10
5
  super(mailbox, klass)
11
6
  @actor_proxy = actor_proxy
12
- @sync_proxy = ::Celluloid::Proxy::Sync.new(mailbox, klass)
13
7
  @async_proxy = ::Celluloid::Proxy::Async.new(mailbox, klass)
14
8
  @future_proxy = ::Celluloid::Proxy::Future.new(mailbox, klass)
15
9
  end
@@ -28,7 +22,7 @@ class Celluloid::Proxy::Cell < Celluloid::Proxy::Sync
28
22
  ::Celluloid::Internals::Method.new(self, name)
29
23
  end
30
24
 
31
- alias_method :sync, :method_missing
25
+ alias sync method_missing
32
26
 
33
27
  # Obtain an async proxy or explicitly invoke a named async method
34
28
  def async(method_name = nil, *args, &block)
@@ -1,29 +1,11 @@
1
1
  # A proxy which creates future calls to an actor
2
- class Celluloid::Proxy::Future < Celluloid::Proxy::Abstract
3
- attr_reader :mailbox
4
-
5
- # Used for reflecting on proxy objects themselves
6
- def __class__
7
- ::Celluloid::Proxy::Future
8
- end
9
-
10
- def initialize(mailbox, klass)
11
- @mailbox = mailbox
12
- @klass = klass
13
- end
14
-
15
- def inspect
16
- "#<Celluloid::Proxy::Future(#{@klass})>"
17
- end
18
-
2
+ class Celluloid::Proxy::Future < Celluloid::Proxy::AbstractCall
19
3
  def method_missing(meth, *args, &block)
20
- unless @mailbox.alive?
21
- fail ::Celluloid::DeadActorError, "attempted to call a dead actor"
22
- end
4
+ raise ::Celluloid::DeadActorError, "attempted to call a dead actor: #{meth}" unless @mailbox.alive?
23
5
 
24
6
  if block_given?
25
7
  # FIXME: nicer exception
26
- fail "Cannot use blocks with futures yet"
8
+ raise "Cannot use blocks with futures yet"
27
9
  end
28
10
 
29
11
  future = ::Celluloid::Future.new
@@ -1,29 +1,11 @@
1
1
  # A proxy which sends synchronous calls to an actor
2
- class Celluloid::Proxy::Sync < Celluloid::Proxy::Abstract
3
- attr_reader :mailbox
4
-
5
- # Used for reflecting on proxy objects themselves
6
- def __class__
7
- ::Celluloid::Proxy::Sync
8
- end
9
-
10
- def initialize(mailbox, klass)
11
- @mailbox = mailbox
12
- @klass = klass
13
- end
14
-
15
- def inspect
16
- "#<Celluloid::Proxy::Sync(#{@klass})>"
17
- end
18
-
2
+ class Celluloid::Proxy::Sync < Celluloid::Proxy::AbstractCall
19
3
  def respond_to?(meth, include_private = false)
20
4
  __class__.instance_methods.include?(meth) || method_missing(:respond_to?, meth, include_private)
21
5
  end
22
6
 
23
7
  def method_missing(meth, *args, &block)
24
- unless @mailbox.alive?
25
- fail ::Celluloid::DeadActorError, "attempted to call a dead actor"
26
- end
8
+ raise ::Celluloid::DeadActorError, "attempted to call a dead actor: #{meth}" unless @mailbox.alive?
27
9
 
28
10
  if @mailbox == ::Thread.current[:celluloid_mailbox]
29
11
  args.unshift meth
@@ -1,41 +1,26 @@
1
- require "dotenv"
2
- require "nenv"
3
-
4
1
  require "celluloid/test"
5
2
 
6
- # To help produce better bug reports in Rubinius
7
- if RUBY_ENGINE == "rbx"
8
- # $DEBUG = true # would be nice if this didn't fail ... :(
9
- require "rspec/matchers"
10
- require "rspec/matchers/built_in/be"
11
- end
12
-
13
- require "rspec/retry"
14
-
15
3
  module Specs
16
-
17
- CHECK_LOOSE_THREADS = !Nenv.ci? unless defined? CHECK_LOOSE_THREADS
4
+ CHECK_LOOSE_THREADS = false
18
5
  ALLOW_RETRIES = 3 unless defined? ALLOW_RETRIES
19
- ALLOW_SLOW_MAILBOXES = false unless defined? ALLOW_SLOW_MAILBOXES
20
6
 
21
- INCLUDE_SUPPORT = [
22
- "env",
23
- "logging",
24
- "sleep_and_wait",
25
- "reset_class_variables",
26
- "crash_checking",
27
- "loose_threads",
28
- "stubbing",
29
- "coverage",
30
- "includer",
31
- "configure_rspec"
32
- ]
7
+ INCLUDE_SUPPORT = %w[
8
+ logging
9
+ sleep_and_wait
10
+ reset_class_variables
11
+ crash_checking
12
+ loose_threads
13
+ stubbing
14
+ coverage
15
+ includer
16
+ configure_rspec
17
+ ].freeze
33
18
 
34
19
  INCLUDE_PATHS = [
35
20
  "./spec/support/*.rb",
36
21
  "./spec/support/examples/*.rb",
37
22
  "./spec/shared/*.rb"
38
- ]
23
+ ].freeze
39
24
 
40
25
  MAX_EXECUTION = 13
41
26
  MAX_ATTEMPTS = 20
@@ -49,24 +34,27 @@ module Specs
49
34
  "rspec-retry",
50
35
  "rubysl-thread",
51
36
  "rubysl-timeout"
52
- ]
37
+ ].freeze
53
38
  end
54
39
 
40
+ # !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
41
+ # rubocop:disable Style/GlobalVars
55
42
  $CELLULOID_DEBUG = true
56
43
 
57
44
  # Require but disable, so it has to be explicitly enabled in tests
58
45
  require "celluloid/probe"
59
46
  $CELLULOID_MONITORING = false
47
+ # rubocop:enable Style/GlobalVars
60
48
 
61
49
  Celluloid.shutdown_timeout = 1
62
50
 
63
51
  # Load shared examples and test support code for other gems to use.
64
52
 
65
- Specs::INCLUDE_SUPPORT.each { |f|
66
- require "#{File.expand_path('../../../spec/support', __FILE__)}/#{f}.rb"
67
- }
53
+ Specs::INCLUDE_SUPPORT.each do |f|
54
+ require "#{File.expand_path('../../spec/support', __dir__)}/#{f}.rb"
55
+ end
68
56
 
69
57
  Specs.reset_probe(nil)
70
58
 
71
- Dir["#{File.expand_path('../../../spec/support/examples', __FILE__)}/*.rb"].map { |f| require f }
72
- Dir["#{File.expand_path('../../../spec/shared', __FILE__)}/*.rb"].map { |f| require f }
59
+ Dir["#{File.expand_path('../../spec/support/examples', __dir__)}/*.rb"].map { |f| require f }
60
+ Dir["#{File.expand_path('../../spec/shared', __dir__)}/*.rb"].map { |f| require f }