celluloid-essentials 0.20.0.pre12
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.
- checksums.yaml +7 -0
- data/.env-ci +4 -0
- data/.env-dev +4 -0
- data/.gitignore +10 -0
- data/.gitmodules +3 -0
- data/.rspec +5 -0
- data/.rubocop.yml +2 -0
- data/.travis.yml +29 -0
- data/CHANGES.md +0 -0
- data/Gemfile +29 -0
- data/LICENSE.txt +22 -0
- data/README.md +3 -0
- data/Rakefile +9 -0
- data/celluloid-essentials.gemspec +24 -0
- data/lib/celluloid/essentials.rb +33 -0
- data/lib/celluloid/internals/call_chain.rb +15 -0
- data/lib/celluloid/internals/cpu_counter.rb +36 -0
- data/lib/celluloid/internals/handlers.rb +42 -0
- data/lib/celluloid/internals/links.rb +38 -0
- data/lib/celluloid/internals/logger.rb +98 -0
- data/lib/celluloid/internals/method.rb +33 -0
- data/lib/celluloid/internals/properties.rb +28 -0
- data/lib/celluloid/internals/receivers.rb +64 -0
- data/lib/celluloid/internals/registry.rb +104 -0
- data/lib/celluloid/internals/responses.rb +45 -0
- data/lib/celluloid/internals/signals.rb +24 -0
- data/lib/celluloid/internals/stack.rb +76 -0
- data/lib/celluloid/internals/stack/dump.rb +14 -0
- data/lib/celluloid/internals/stack/states.rb +74 -0
- data/lib/celluloid/internals/stack/summary.rb +14 -0
- data/lib/celluloid/internals/task_set.rb +51 -0
- data/lib/celluloid/internals/thread_handle.rb +52 -0
- data/lib/celluloid/internals/uuid.rb +40 -0
- data/lib/celluloid/logging/incident.rb +21 -0
- data/lib/celluloid/logging/incident_logger.rb +128 -0
- data/lib/celluloid/logging/incident_reporter.rb +48 -0
- data/lib/celluloid/logging/log_event.rb +20 -0
- data/lib/celluloid/logging/ring_buffer.rb +65 -0
- data/lib/celluloid/notifications.rb +95 -0
- data/lib/celluloid/probe.rb +75 -0
- data/tasks/benchmarks.rake +16 -0
- data/tasks/rspec.rake +7 -0
- data/tasks/rubocop.rake +4 -0
- metadata +117 -0
@@ -0,0 +1,95 @@
|
|
1
|
+
module Celluloid
|
2
|
+
module Notifications
|
3
|
+
def self.notifier
|
4
|
+
Actor[:notifications_fanout] or 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,75 @@
|
|
1
|
+
require 'celluloid'
|
2
|
+
|
3
|
+
$CELLULOID_MONITORING = true
|
4
|
+
|
5
|
+
module Celluloid
|
6
|
+
class Probe
|
7
|
+
include Celluloid
|
8
|
+
include Celluloid::Notifications
|
9
|
+
|
10
|
+
NOTIFICATIONS_TOPIC_BASE = 'celluloid.events.%s'
|
11
|
+
EVENTS_BUFFER = Queue.new
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def run
|
15
|
+
# spawn the actor if not found
|
16
|
+
supervise_as(:probe_actor) unless Actor[:probe_actor] && Actor[:probe_actor].alive?
|
17
|
+
end
|
18
|
+
|
19
|
+
def run_without_supervision
|
20
|
+
Actor[:probe_actor] = Celluloid::Probe.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def actor_created(actor)
|
24
|
+
trigger_event(:actor_created, actor)
|
25
|
+
end
|
26
|
+
|
27
|
+
def actor_named(actor)
|
28
|
+
trigger_event(:actor_named, actor)
|
29
|
+
end
|
30
|
+
|
31
|
+
def actor_died(actor)
|
32
|
+
trigger_event(:actor_died, actor)
|
33
|
+
end
|
34
|
+
|
35
|
+
def actors_linked(a, b)
|
36
|
+
a = find_actor(a)
|
37
|
+
b = find_actor(b)
|
38
|
+
trigger_event(:actors_linked, a, b)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def trigger_event(name, *args)
|
44
|
+
return unless $CELLULOID_MONITORING
|
45
|
+
|
46
|
+
EVENTS_BUFFER << [name, args]
|
47
|
+
probe_actor = Actor[:probe_actor]
|
48
|
+
probe_actor.async.process_queue if probe_actor
|
49
|
+
end
|
50
|
+
|
51
|
+
def find_actor(obj)
|
52
|
+
if obj.__send__(:class) == Actor
|
53
|
+
obj
|
54
|
+
elsif owner = obj.instance_variable_get(OWNER_IVAR)
|
55
|
+
owner
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def initialize
|
61
|
+
async.process_queue
|
62
|
+
end
|
63
|
+
|
64
|
+
def process_queue
|
65
|
+
until EVENTS_BUFFER.empty?
|
66
|
+
event = EVENTS_BUFFER.pop
|
67
|
+
dispatch_event(*event)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def dispatch_event(cmd, args)
|
72
|
+
publish(NOTIFICATIONS_TOPIC_BASE % cmd, args)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
|
3
|
+
desc "Run Celluloid benchmarks"
|
4
|
+
task :benchmark do
|
5
|
+
begin
|
6
|
+
Timeout.timeout(120) do
|
7
|
+
glob = File.expand_path("../../benchmarks/*.rb", __FILE__)
|
8
|
+
Dir[glob].each { |benchmark| load benchmark }
|
9
|
+
end
|
10
|
+
rescue Exception, Timeout::Error => ex
|
11
|
+
puts "ERROR: Couldn't complete benchmark: #{ex.class}: #{ex}"
|
12
|
+
puts " #{ex.backtrace.join("\n ")}"
|
13
|
+
|
14
|
+
exit 1 unless ENV['CI'] # Hax for running benchmarks on Travis
|
15
|
+
end
|
16
|
+
end
|
data/tasks/rspec.rake
ADDED
data/tasks/rubocop.rake
ADDED
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: celluloid-essentials
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.20.0.pre12
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tony Arcieri
|
8
|
+
- digitalextremist //
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-04-28 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: celluloid-gems
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
description: Notifications, Internals, Logging, Probe, and essential Celluloid pieces
|
43
|
+
demanding Supervision
|
44
|
+
email:
|
45
|
+
- tony.arcieri@gmail.com
|
46
|
+
- code@extremist.digital
|
47
|
+
executables: []
|
48
|
+
extensions: []
|
49
|
+
extra_rdoc_files: []
|
50
|
+
files:
|
51
|
+
- ".env-ci"
|
52
|
+
- ".env-dev"
|
53
|
+
- ".gitignore"
|
54
|
+
- ".gitmodules"
|
55
|
+
- ".rspec"
|
56
|
+
- ".rubocop.yml"
|
57
|
+
- ".travis.yml"
|
58
|
+
- CHANGES.md
|
59
|
+
- Gemfile
|
60
|
+
- LICENSE.txt
|
61
|
+
- README.md
|
62
|
+
- Rakefile
|
63
|
+
- celluloid-essentials.gemspec
|
64
|
+
- lib/celluloid/essentials.rb
|
65
|
+
- lib/celluloid/internals/call_chain.rb
|
66
|
+
- lib/celluloid/internals/cpu_counter.rb
|
67
|
+
- lib/celluloid/internals/handlers.rb
|
68
|
+
- lib/celluloid/internals/links.rb
|
69
|
+
- lib/celluloid/internals/logger.rb
|
70
|
+
- lib/celluloid/internals/method.rb
|
71
|
+
- lib/celluloid/internals/properties.rb
|
72
|
+
- lib/celluloid/internals/receivers.rb
|
73
|
+
- lib/celluloid/internals/registry.rb
|
74
|
+
- lib/celluloid/internals/responses.rb
|
75
|
+
- lib/celluloid/internals/signals.rb
|
76
|
+
- lib/celluloid/internals/stack.rb
|
77
|
+
- lib/celluloid/internals/stack/dump.rb
|
78
|
+
- lib/celluloid/internals/stack/states.rb
|
79
|
+
- lib/celluloid/internals/stack/summary.rb
|
80
|
+
- lib/celluloid/internals/task_set.rb
|
81
|
+
- lib/celluloid/internals/thread_handle.rb
|
82
|
+
- lib/celluloid/internals/uuid.rb
|
83
|
+
- lib/celluloid/logging/incident.rb
|
84
|
+
- lib/celluloid/logging/incident_logger.rb
|
85
|
+
- lib/celluloid/logging/incident_reporter.rb
|
86
|
+
- lib/celluloid/logging/log_event.rb
|
87
|
+
- lib/celluloid/logging/ring_buffer.rb
|
88
|
+
- lib/celluloid/notifications.rb
|
89
|
+
- lib/celluloid/probe.rb
|
90
|
+
- tasks/benchmarks.rake
|
91
|
+
- tasks/rspec.rake
|
92
|
+
- tasks/rubocop.rake
|
93
|
+
homepage: https://github.com/celluloid/celluloid-essentials
|
94
|
+
licenses:
|
95
|
+
- MIT
|
96
|
+
metadata: {}
|
97
|
+
post_install_message:
|
98
|
+
rdoc_options: []
|
99
|
+
require_paths:
|
100
|
+
- lib
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: 1.9.2
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.3.6
|
111
|
+
requirements: []
|
112
|
+
rubyforge_project:
|
113
|
+
rubygems_version: 2.2.2
|
114
|
+
signing_key:
|
115
|
+
specification_version: 4
|
116
|
+
summary: Internally used tools, and superstructural dependencies of Celluloid
|
117
|
+
test_files: []
|