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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.env-ci +4 -0
  3. data/.env-dev +4 -0
  4. data/.gitignore +10 -0
  5. data/.gitmodules +3 -0
  6. data/.rspec +5 -0
  7. data/.rubocop.yml +2 -0
  8. data/.travis.yml +29 -0
  9. data/CHANGES.md +0 -0
  10. data/Gemfile +29 -0
  11. data/LICENSE.txt +22 -0
  12. data/README.md +3 -0
  13. data/Rakefile +9 -0
  14. data/celluloid-essentials.gemspec +24 -0
  15. data/lib/celluloid/essentials.rb +33 -0
  16. data/lib/celluloid/internals/call_chain.rb +15 -0
  17. data/lib/celluloid/internals/cpu_counter.rb +36 -0
  18. data/lib/celluloid/internals/handlers.rb +42 -0
  19. data/lib/celluloid/internals/links.rb +38 -0
  20. data/lib/celluloid/internals/logger.rb +98 -0
  21. data/lib/celluloid/internals/method.rb +33 -0
  22. data/lib/celluloid/internals/properties.rb +28 -0
  23. data/lib/celluloid/internals/receivers.rb +64 -0
  24. data/lib/celluloid/internals/registry.rb +104 -0
  25. data/lib/celluloid/internals/responses.rb +45 -0
  26. data/lib/celluloid/internals/signals.rb +24 -0
  27. data/lib/celluloid/internals/stack.rb +76 -0
  28. data/lib/celluloid/internals/stack/dump.rb +14 -0
  29. data/lib/celluloid/internals/stack/states.rb +74 -0
  30. data/lib/celluloid/internals/stack/summary.rb +14 -0
  31. data/lib/celluloid/internals/task_set.rb +51 -0
  32. data/lib/celluloid/internals/thread_handle.rb +52 -0
  33. data/lib/celluloid/internals/uuid.rb +40 -0
  34. data/lib/celluloid/logging/incident.rb +21 -0
  35. data/lib/celluloid/logging/incident_logger.rb +128 -0
  36. data/lib/celluloid/logging/incident_reporter.rb +48 -0
  37. data/lib/celluloid/logging/log_event.rb +20 -0
  38. data/lib/celluloid/logging/ring_buffer.rb +65 -0
  39. data/lib/celluloid/notifications.rb +95 -0
  40. data/lib/celluloid/probe.rb +75 -0
  41. data/tasks/benchmarks.rake +16 -0
  42. data/tasks/rspec.rake +7 -0
  43. data/tasks/rubocop.rake +4 -0
  44. 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
@@ -0,0 +1,7 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ RSpec::Core::RakeTask.new
4
+
5
+ RSpec::Core::RakeTask.new(:rcov) do |task|
6
+ task.rcov = true
7
+ end
@@ -0,0 +1,4 @@
1
+ unless ENV['CI']
2
+ require 'rubocop/rake_task'
3
+ RuboCop::RakeTask.new
4
+ end
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: []