announcer 0.5.1 → 0.5.2

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 (28) hide show
  1. checksums.yaml +4 -4
  2. data/lib/announcer.rb +32 -0
  3. data/lib/{ribbon/event_bus → announcer}/config.rb +2 -2
  4. data/lib/{ribbon/event_bus → announcer}/errors.rb +2 -2
  5. data/lib/{ribbon/event_bus → announcer}/event.rb +3 -3
  6. data/lib/announcer/instance.rb +158 -0
  7. data/lib/announcer/mixins.rb +7 -0
  8. data/lib/{ribbon/event_bus → announcer}/mixins/has_config.rb +2 -2
  9. data/lib/{ribbon/event_bus → announcer}/mixins/has_instance.rb +4 -4
  10. data/lib/{ribbon/event_bus → announcer}/mixins/serializable.rb +4 -4
  11. data/lib/announcer/plugins.rb +6 -0
  12. data/lib/{ribbon/event_bus → announcer}/plugins/logging_plugin.rb +2 -2
  13. data/lib/{ribbon/event_bus → announcer}/plugins/plugin.rb +4 -4
  14. data/lib/{ribbon/event_bus → announcer}/publishers.rb +7 -7
  15. data/lib/{ribbon/event_bus → announcer}/publishers/async_resque_publisher.rb +2 -2
  16. data/lib/{ribbon/event_bus → announcer}/publishers/proc_publisher.rb +2 -2
  17. data/lib/{ribbon/event_bus → announcer}/publishers/publisher.rb +1 -1
  18. data/lib/{ribbon/event_bus → announcer}/publishers/remote_resque_publisher.rb +2 -2
  19. data/lib/{ribbon/event_bus → announcer}/publishers/resque_publisher.rb +2 -2
  20. data/lib/{ribbon/event_bus → announcer}/publishers/subscriptions_publisher.rb +2 -2
  21. data/lib/{ribbon/event_bus → announcer}/subscription.rb +6 -6
  22. data/lib/announcer/version.rb +3 -0
  23. metadata +32 -32
  24. data/lib/ribbon/event_bus.rb +0 -37
  25. data/lib/ribbon/event_bus/instance.rb +0 -160
  26. data/lib/ribbon/event_bus/mixins.rb +0 -7
  27. data/lib/ribbon/event_bus/plugins.rb +0 -6
  28. data/lib/ribbon/event_bus/version.rb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a2d800fef3f0cf19df0be391d3378a400c7922e6
4
- data.tar.gz: 36868f33a3a5d88093a549c754cadbdc2885aa18
3
+ metadata.gz: 160662261dd1515502a39b4982427d83c117bdfa
4
+ data.tar.gz: b11ad4e2af0c3f63b8144955c29a0217e0ef591a
5
5
  SHA512:
6
- metadata.gz: da50d2ac315e4a86fa8c56aae8468e0f2b47d3201cd0126dfee6c8ba6c3192ad59d225c5eff72e55241a3a02a7f5dd71c44a1db6293d2b72bfdfb9c61ed3b6a2
7
- data.tar.gz: bab8224c83d5d0a1a3e847de999c5ef46c5309fbec6f3f7c23abd9cd2e7412b8244ae2181f9e84d9e6341ba96d1c4464fde314ca3acc0371c093b1960a4949fb
6
+ metadata.gz: 41ae357d6fb3fa45a62e8727ecce3f11605026298380cf1e4f79608fd2dcb277642e441aee7db9e8e130305be90e9755abea7bdf51c5e8602cccebb5a40ae092
7
+ data.tar.gz: b952e2c98ea8df540cfacbee0c2a79d3bbb6d4f5e5367850368a8763a93b17538339607b45a65b713a92f5a58090041eb1df38ef56f7be731e6c59e3362ee145
@@ -0,0 +1,32 @@
1
+ module Announcer
2
+ autoload(:Instance, 'announcer/instance')
3
+ autoload(:Config, 'announcer/config')
4
+ autoload(:Publishers, 'announcer/publishers')
5
+ autoload(:Plugins, 'announcer/plugins')
6
+ autoload(:Event, 'announcer/event')
7
+ autoload(:Subscription, 'announcer/subscription')
8
+ autoload(:Mixins, 'announcer/mixins')
9
+ autoload(:Errors, 'announcer/errors')
10
+
11
+ module_function
12
+
13
+ def method_missing(meth, *args, &block)
14
+ instance.send(meth, *args, &block)
15
+ end
16
+
17
+ def instance(name=:primary)
18
+ _registered_instances[name.to_sym] || Instance.new(name)
19
+ end
20
+
21
+ def _registered_instances
22
+ @__registered_instances ||= {}
23
+ end
24
+
25
+ def _register_instance(instance)
26
+ if _registered_instances.key?(instance.name)
27
+ raise Errors::DuplicateInstanceNameError, instance.name
28
+ else
29
+ _registered_instances[instance.name] = instance
30
+ end
31
+ end
32
+ end
@@ -1,6 +1,6 @@
1
1
  require 'yaml'
2
2
 
3
- module Ribbon::EventBus
3
+ module Announcer
4
4
  class Config
5
5
  # Putting this here instead of in Errors because I may move this into a
6
6
  # separate gem.
@@ -129,4 +129,4 @@ module Ribbon::EventBus
129
129
  @_nested ||= Hash.new { |hash, key| hash[key] = UndefinedValue.new }
130
130
  end
131
131
  end # Config
132
- end # Ribbon::EventBus
132
+ end # Announcer
@@ -1,4 +1,4 @@
1
- module Ribbon::EventBus
1
+ module Announcer
2
2
  module Errors
3
3
  class Error < StandardError; end
4
4
  class DuplicateInstanceNameError < Error; end
@@ -52,4 +52,4 @@ module Ribbon::EventBus
52
52
  ###
53
53
  class SerializableError < Error; end
54
54
  end
55
- end
55
+ end
@@ -1,4 +1,4 @@
1
- module Ribbon::EventBus
1
+ module Announcer
2
2
  class Event
3
3
  include Mixins::HasInstance
4
4
  include Mixins::HasConfig
@@ -63,7 +63,7 @@ module Ribbon::EventBus
63
63
 
64
64
  ###
65
65
  # Sanitize the event params.
66
- # Prevents passing values that could cause errors later in the EventBus.
66
+ # Prevents passing values that could cause errors later in Announcer.
67
67
  ###
68
68
  def _sanitize_params(params)
69
69
  Hash[params.map { |key, value| [key.to_sym, _sanitize_value(key, value)] }].freeze
@@ -90,4 +90,4 @@ module Ribbon::EventBus
90
90
  end
91
91
  end
92
92
  end # Event
93
- end # Ribbon::EventBus
93
+ end # Announcer
@@ -0,0 +1,158 @@
1
+ require 'plugins'
2
+
3
+ module Announcer
4
+ DEFAULT_CONFIG_PATH = File.expand_path('../../../config/defaults.yml', __FILE__).freeze
5
+
6
+ ##############################################################################
7
+ # Instance
8
+ #
9
+ # Represents an instance of the Announcer. Allows multiple Instances to be
10
+ # created with separate configuration, subscriptions, etc. Primarily intended
11
+ # to help testing, but there are practical use-cases as well.
12
+ ##############################################################################
13
+ class Instance
14
+ include Mixins::Serializable
15
+ include ::Plugins::ComponentMixin
16
+
17
+ serialize_with :name
18
+
19
+ plugin_loader do |plugin|
20
+ _translate_object_to_plugin(plugin)
21
+ end
22
+
23
+ attr_reader :name
24
+ attr_reader :publishers
25
+
26
+ def initialize(name=nil)
27
+ if name
28
+ @name = name.to_sym
29
+ Announcer._register_instance(self) if @name
30
+ end
31
+
32
+ _load_default_config
33
+ end
34
+
35
+ def self.load_from_serialized(name)
36
+ if name
37
+ Announcer.instance(name)
38
+ else
39
+ raise Errors::InstanceError, "Can't deserialize an unnamed Instance"
40
+ end
41
+ end
42
+
43
+ def config(&block)
44
+ (@__config ||= Config.new).tap { |config|
45
+ if block_given?
46
+ config.define(&block)
47
+ _process_config
48
+ end
49
+ }
50
+ end
51
+
52
+ def plugin(*args)
53
+ config { plugin(*args) }
54
+ end
55
+
56
+ def publish(*args)
57
+ raise Errors::NoPublishersDefinedError unless publishers && !publishers.empty?
58
+ _args_to_event(*args).publish
59
+ end
60
+
61
+ def subscribe_to(event_name, params={}, &block)
62
+ Subscription.new(event_name, params.merge(instance: self), &block)
63
+ end
64
+
65
+ def subscriptions_to(event_or_name)
66
+ event_name = event_or_name.is_a?(Event) ? event_or_name.name : event_or_name.to_sym
67
+ _registered_subscriptions_to(event_name).dup
68
+ end
69
+
70
+ def find_subscription(identifier)
71
+ _subscriptions_by_identifiers[identifier]
72
+ end
73
+
74
+ def find_publisher(publisher)
75
+ klass = Publishers.load(publisher)
76
+ publishers && publishers.find { |pub| pub.is_a?(klass) }
77
+ end
78
+
79
+ def has_publisher?(publisher)
80
+ !!find_publisher(publisher)
81
+ end
82
+
83
+ def _register_subscription(subscription)
84
+ if _subscriptions_by_identifiers[subscription.identifier]
85
+ # This is not expected to occur
86
+ raise Errors::SubscriptionError, "duplicate identifier: #{subscription.identifier.inspect}"
87
+ else
88
+ _subscriptions_by_identifiers[subscription.identifier] = subscription
89
+ end
90
+
91
+ _registered_subscriptions_to(subscription.event_name)
92
+ .push(subscription)
93
+ .sort! { |x, y| x.priority <=> y.priority }
94
+ end
95
+
96
+ private
97
+ def _translate_object_to_plugin(object)
98
+ case object
99
+ when String, Symbol
100
+ _translate_string_to_plugin(object.to_s)
101
+ end
102
+ end
103
+
104
+ def _translate_string_to_plugin(string)
105
+ begin
106
+ Plugins.const_get(
107
+ string.split('_').map(&:capitalize).join + 'Plugin'
108
+ )
109
+ rescue
110
+ nil # Let the Plugins gem handle this.
111
+ end
112
+ end
113
+
114
+ def _registered_subscriptions_to(event_name)
115
+ (@__registered_subscriptions ||= {})[event_name] ||= []
116
+ end
117
+
118
+ def _subscriptions_by_identifiers
119
+ @__registered_subscriptions_by_identifier ||= {}
120
+ end
121
+
122
+ def _load_default_config
123
+ config.merge_config_file!(DEFAULT_CONFIG_PATH)
124
+ end
125
+
126
+ # Attempt to convert *args to an event object.
127
+ def _args_to_event(name_or_event, params={})
128
+ raise ArgumentError, 'event parameters must be a hash' unless params.is_a?(Hash)
129
+
130
+ case name_or_event
131
+ when Event
132
+ name_or_event.tap { |e| e.instance_variable_set(:@instance, self) }
133
+ else
134
+ Event.new(name_or_event, params.merge(instance: self))
135
+ end
136
+ end # _args_to_event
137
+
138
+ def _process_config
139
+ @publishers = _load_publishers.dup.freeze
140
+ _update_plugins
141
+ end
142
+
143
+ def _load_publishers
144
+ Publishers.load_for_instance(self)
145
+ end
146
+
147
+ def _update_plugins
148
+ plugins.clear
149
+
150
+ if config.plugin?
151
+ config.plugin.each { |plugin|
152
+ plugin = [plugin] unless plugin.is_a?(Array)
153
+ plugins.add(*plugin)
154
+ }
155
+ end
156
+ end
157
+ end # Instance
158
+ end # Announcer
@@ -0,0 +1,7 @@
1
+ module Announcer
2
+ module Mixins
3
+ autoload(:HasInstance, 'announcer/mixins/has_instance')
4
+ autoload(:HasConfig, 'announcer/mixins/has_config')
5
+ autoload(:Serializable, 'announcer/mixins/serializable')
6
+ end
7
+ end
@@ -1,4 +1,4 @@
1
- module Ribbon::EventBus
1
+ module Announcer
2
2
  module Mixins
3
3
  module HasConfig
4
4
  def self.included(base)
@@ -42,4 +42,4 @@ module Ribbon::EventBus
42
42
  end
43
43
  end
44
44
  end
45
- end
45
+ end
@@ -1,8 +1,8 @@
1
- module Ribbon
2
- module EventBus::Mixins
1
+ module Announcer
2
+ module Mixins
3
3
  module HasInstance
4
4
  def instance
5
- (defined?(@instance) && @instance) || EventBus.instance
5
+ (defined?(@instance) && @instance) || Announcer.instance
6
6
  end
7
7
 
8
8
  def plugins
@@ -10,4 +10,4 @@ module Ribbon
10
10
  end
11
11
  end
12
12
  end
13
- end
13
+ end
@@ -1,6 +1,6 @@
1
1
  require 'base64'
2
2
 
3
- module Ribbon::EventBus
3
+ module Announcer
4
4
  module Mixins
5
5
  module Serializable
6
6
  MAGIC = :SRLZ
@@ -79,11 +79,11 @@ module Ribbon::EventBus
79
79
  ###
80
80
 
81
81
  def _serializable_encode_class(klass)
82
- klass.name.to_s.sub('Ribbon::EventBus::', '').to_sym
82
+ klass.name.to_s.sub('Announcer::', '').to_sym
83
83
  end
84
84
 
85
85
  def _serializable_decode_class(encoded_klass)
86
- Ribbon::EventBus.const_get(encoded_klass.to_s)
86
+ Announcer.const_get(encoded_klass.to_s)
87
87
  end
88
88
 
89
89
  ###
@@ -180,4 +180,4 @@ module Ribbon::EventBus
180
180
  end
181
181
  end
182
182
  end
183
- end
183
+ end
@@ -0,0 +1,6 @@
1
+ module Announcer
2
+ module Plugins
3
+ autoload(:Plugin, 'announcer/plugins/plugin')
4
+ autoload(:LoggingPlugin, 'announcer/plugins/logging_plugin')
5
+ end
6
+ end
@@ -1,6 +1,6 @@
1
1
  require 'logger'
2
2
 
3
- module Ribbon::EventBus
3
+ module Announcer
4
4
  module Plugins
5
5
  class LoggingPlugin < Plugin
6
6
  config_key :logging
@@ -65,4 +65,4 @@ module Ribbon::EventBus
65
65
  end
66
66
  end
67
67
  end
68
- end
68
+ end
@@ -1,8 +1,8 @@
1
- require 'ribbon/plugins'
1
+ require 'plugins'
2
2
 
3
- module Ribbon::EventBus
3
+ module Announcer
4
4
  module Plugins
5
- class Plugin < Ribbon::Plugins::Plugin
5
+ class Plugin < ::Plugins::Plugin
6
6
  include Mixins::HasInstance
7
7
  include Mixins::HasConfig
8
8
 
@@ -19,4 +19,4 @@ module Ribbon::EventBus
19
19
  end
20
20
  end
21
21
  end
22
- end
22
+ end
@@ -1,17 +1,17 @@
1
- module Ribbon::EventBus
1
+ module Announcer
2
2
  module Publishers
3
3
  autoload(:Publisher,
4
- 'ribbon/event_bus/publishers/publisher')
4
+ 'announcer/publishers/publisher')
5
5
  autoload(:ProcPublisher,
6
- 'ribbon/event_bus/publishers/proc_publisher')
6
+ 'announcer/publishers/proc_publisher')
7
7
  autoload(:SubscriptionsPublisher,
8
- 'ribbon/event_bus/publishers/subscriptions_publisher')
8
+ 'announcer/publishers/subscriptions_publisher')
9
9
  autoload(:ResquePublisher,
10
- 'ribbon/event_bus/publishers/resque_publisher')
10
+ 'announcer/publishers/resque_publisher')
11
11
  autoload(:RemoteResquePublisher,
12
- 'ribbon/event_bus/publishers/remote_resque_publisher')
12
+ 'announcer/publishers/remote_resque_publisher')
13
13
  autoload(:AsyncResquePublisher,
14
- 'ribbon/event_bus/publishers/async_resque_publisher')
14
+ 'announcer/publishers/async_resque_publisher')
15
15
 
16
16
  module_function
17
17
  def load_for_instance(instance)
@@ -2,7 +2,7 @@ require 'resque'
2
2
  require 'redis'
3
3
  require 'celluloid/current'
4
4
 
5
- module Ribbon::EventBus
5
+ module Announcer
6
6
  module Publishers
7
7
  class AsyncResquePublisher < Publisher
8
8
  config_key :resque
@@ -15,7 +15,7 @@ module Ribbon::EventBus
15
15
  end
16
16
 
17
17
  def worker_id
18
- @__worker_id ||= "event_bus_resque_worker_#{object_id}".to_sym
18
+ @__worker_id ||= "announcer_resque_worker_#{object_id}".to_sym
19
19
  end
20
20
 
21
21
  ##
@@ -1,4 +1,4 @@
1
- module Ribbon::EventBus
1
+ module Announcer
2
2
  module Publishers
3
3
  class ProcPublisher < Publisher
4
4
  def initialize(instance=nil, &block)
@@ -19,4 +19,4 @@ module Ribbon::EventBus
19
19
  end
20
20
  end
21
21
  end
22
- end
22
+ end
@@ -1,4 +1,4 @@
1
- module Ribbon::EventBus
1
+ module Announcer
2
2
  module Publishers
3
3
  class Publisher
4
4
  include Mixins::HasInstance
@@ -2,7 +2,7 @@ require 'uri'
2
2
  require 'redis'
3
3
  require 'redis/namespace'
4
4
 
5
- module Ribbon::EventBus
5
+ module Announcer
6
6
  module Publishers
7
7
  class RemoteResquePublisher < Publisher
8
8
  config_key :remote_resque
@@ -78,4 +78,4 @@ module Ribbon::EventBus
78
78
  end
79
79
  end
80
80
  end
81
- end
81
+ end
@@ -1,6 +1,6 @@
1
1
  require 'resque'
2
2
 
3
- module Ribbon::EventBus
3
+ module Announcer
4
4
  module Publishers
5
5
  class ResquePublisher < Publisher
6
6
  config_key :resque
@@ -79,7 +79,7 @@ module Ribbon::EventBus
79
79
  def _disallow_multiple_per_instance
80
80
  if instance.has_publisher?(:resque)
81
81
  raise Errors::PublisherError,
82
- "cannot have multiple ResquePublishers in an EventBus instance"
82
+ "cannot have multiple ResquePublishers in an Announcer instance"
83
83
  end
84
84
  end
85
85
  end
@@ -1,8 +1,8 @@
1
- module Ribbon::EventBus::Publishers
1
+ module Announcer::Publishers
2
2
  class SubscriptionsPublisher < Publisher
3
3
  def publish(event)
4
4
  super
5
5
  event.subscriptions.each { |subscription| subscription.handle(event) }
6
6
  end
7
7
  end
8
- end
8
+ end
@@ -1,6 +1,6 @@
1
1
  require 'digest'
2
2
 
3
- module Ribbon::EventBus
3
+ module Announcer
4
4
  class Subscription
5
5
  include Mixins::HasInstance
6
6
  include Mixins::HasConfig
@@ -61,14 +61,14 @@ module Ribbon::EventBus
61
61
 
62
62
  # Will be something like:
63
63
  # "/path/to/file.rb:47:in `method_name'"
64
- non_event_bus_caller = caller.find { |c| !c.start_with?(path) }
64
+ non_announcer_caller = caller.find { |c| !c.start_with?(path) }
65
65
 
66
- unless non_event_bus_caller
66
+ unless non_announcer_caller
67
67
  # This is not expected to occur.
68
- raise Errors::SubscriptionError, "Could not find non-EventBus caller"
68
+ raise Errors::SubscriptionError, "Could not find non-Announcer caller"
69
69
  end
70
70
 
71
- non_event_bus_caller
71
+ non_announcer_caller
72
72
  end
73
73
 
74
74
  ##
@@ -162,4 +162,4 @@ module Ribbon::EventBus
162
162
  end
163
163
  end
164
164
  end # Event
165
- end # Ribbon::EventBus
165
+ end # Announcer
@@ -0,0 +1,3 @@
1
+ module Announcer
2
+ VERSION = "0.5.2"
3
+ end
metadata CHANGED
@@ -1,35 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: announcer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Honer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-05 00:00:00.000000000 Z
11
+ date: 2015-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: ribbon-plugins
14
+ name: plugins
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.2'
19
+ version: 0.3.0
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 0.2.4
22
+ version: 0.3.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '0.2'
29
+ version: 0.3.0
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 0.2.4
32
+ version: 0.3.0
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: celluloid
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -156,36 +156,36 @@ dependencies:
156
156
  - - ">="
157
157
  - !ruby/object:Gem::Version
158
158
  version: '0'
159
- description: An asynchronous event bus for Ruby.
159
+ description: A flexible event bus for Ruby.
160
160
  email:
161
- - robert@ribbonpayments.com
161
+ - robert@payout.com
162
162
  executables: []
163
163
  extensions: []
164
164
  extra_rdoc_files: []
165
165
  files:
166
166
  - config/defaults.yml
167
- - lib/ribbon/event_bus.rb
168
- - lib/ribbon/event_bus/config.rb
169
- - lib/ribbon/event_bus/errors.rb
170
- - lib/ribbon/event_bus/event.rb
171
- - lib/ribbon/event_bus/instance.rb
172
- - lib/ribbon/event_bus/mixins.rb
173
- - lib/ribbon/event_bus/mixins/has_config.rb
174
- - lib/ribbon/event_bus/mixins/has_instance.rb
175
- - lib/ribbon/event_bus/mixins/serializable.rb
176
- - lib/ribbon/event_bus/plugins.rb
177
- - lib/ribbon/event_bus/plugins/logging_plugin.rb
178
- - lib/ribbon/event_bus/plugins/plugin.rb
179
- - lib/ribbon/event_bus/publishers.rb
180
- - lib/ribbon/event_bus/publishers/async_resque_publisher.rb
181
- - lib/ribbon/event_bus/publishers/proc_publisher.rb
182
- - lib/ribbon/event_bus/publishers/publisher.rb
183
- - lib/ribbon/event_bus/publishers/remote_resque_publisher.rb
184
- - lib/ribbon/event_bus/publishers/resque_publisher.rb
185
- - lib/ribbon/event_bus/publishers/subscriptions_publisher.rb
186
- - lib/ribbon/event_bus/subscription.rb
187
- - lib/ribbon/event_bus/version.rb
188
- homepage: http://github.com/ribbon/event_bus
167
+ - lib/announcer.rb
168
+ - lib/announcer/config.rb
169
+ - lib/announcer/errors.rb
170
+ - lib/announcer/event.rb
171
+ - lib/announcer/instance.rb
172
+ - lib/announcer/mixins.rb
173
+ - lib/announcer/mixins/has_config.rb
174
+ - lib/announcer/mixins/has_instance.rb
175
+ - lib/announcer/mixins/serializable.rb
176
+ - lib/announcer/plugins.rb
177
+ - lib/announcer/plugins/logging_plugin.rb
178
+ - lib/announcer/plugins/plugin.rb
179
+ - lib/announcer/publishers.rb
180
+ - lib/announcer/publishers/async_resque_publisher.rb
181
+ - lib/announcer/publishers/proc_publisher.rb
182
+ - lib/announcer/publishers/publisher.rb
183
+ - lib/announcer/publishers/remote_resque_publisher.rb
184
+ - lib/announcer/publishers/resque_publisher.rb
185
+ - lib/announcer/publishers/subscriptions_publisher.rb
186
+ - lib/announcer/subscription.rb
187
+ - lib/announcer/version.rb
188
+ homepage: http://github.com/payout/announcer
189
189
  licenses:
190
190
  - BSD
191
191
  metadata: {}
@@ -208,5 +208,5 @@ rubyforge_project:
208
208
  rubygems_version: 2.4.3
209
209
  signing_key:
210
210
  specification_version: 4
211
- summary: An asynchronous event bus for Ruby.
211
+ summary: A flexible event bus for Ruby.
212
212
  test_files: []
@@ -1,37 +0,0 @@
1
- module Ribbon
2
- module EventBus
3
- autoload(:Instance, 'ribbon/event_bus/instance')
4
- autoload(:Config, 'ribbon/event_bus/config')
5
- autoload(:Publishers, 'ribbon/event_bus/publishers')
6
- autoload(:Plugins, 'ribbon/event_bus/plugins')
7
- autoload(:Event, 'ribbon/event_bus/event')
8
- autoload(:Subscription, 'ribbon/event_bus/subscription')
9
- autoload(:Mixins, 'ribbon/event_bus/mixins')
10
- autoload(:Errors, 'ribbon/event_bus/errors')
11
-
12
- module_function
13
-
14
- def method_missing(meth, *args, &block)
15
- instance.send(meth, *args, &block)
16
- end
17
-
18
- def instance(name=:primary)
19
- _registered_instances[name.to_sym] || Instance.new(name)
20
- end
21
-
22
- def _registered_instances
23
- @__registered_instances ||= {}
24
- end
25
-
26
- def _register_instance(instance)
27
- if _registered_instances.key?(instance.name)
28
- raise Errors::DuplicateInstanceNameError, instance.name
29
- else
30
- _registered_instances[instance.name] = instance
31
- end
32
- end
33
- end
34
- end
35
-
36
- # Create a shortcut
37
- EventBus = Ribbon::EventBus
@@ -1,160 +0,0 @@
1
- require 'ribbon/plugins'
2
-
3
- module Ribbon
4
- module EventBus
5
- DEFAULT_CONFIG_PATH = File.expand_path('../../../../config/defaults.yml', __FILE__).freeze
6
-
7
- ##############################################################################
8
- # Instance
9
- #
10
- # Represents an instance of the EventBus. Allows multiple Instances to be
11
- # created with separate configuration, subscriptions, etc. Primarily intended
12
- # to help testing, but there are practical use-cases as well.
13
- ##############################################################################
14
- class Instance
15
- include Mixins::Serializable
16
- include Ribbon::Plugins::ComponentMixin
17
-
18
- serialize_with :name
19
-
20
- plugin_loader do |plugin|
21
- _translate_object_to_plugin(plugin)
22
- end
23
-
24
- attr_reader :name
25
- attr_reader :publishers
26
-
27
- def initialize(name=nil)
28
- if name
29
- @name = name.to_sym
30
- EventBus._register_instance(self) if @name
31
- end
32
-
33
- _load_default_config
34
- end
35
-
36
- def self.load_from_serialized(name)
37
- if name
38
- EventBus.instance(name)
39
- else
40
- raise Errors::InstanceError, "Can't deserialize an unnamed Instance"
41
- end
42
- end
43
-
44
- def config(&block)
45
- (@__config ||= Config.new).tap { |config|
46
- if block_given?
47
- config.define(&block)
48
- _process_config
49
- end
50
- }
51
- end
52
-
53
- def plugin(*args)
54
- config { plugin(*args) }
55
- end
56
-
57
- def publish(*args)
58
- raise Errors::NoPublishersDefinedError unless publishers && !publishers.empty?
59
- _args_to_event(*args).publish
60
- end
61
-
62
- def subscribe_to(event_name, params={}, &block)
63
- Subscription.new(event_name, params.merge(instance: self), &block)
64
- end
65
-
66
- def subscriptions_to(event_or_name)
67
- event_name = event_or_name.is_a?(Event) ? event_or_name.name : event_or_name.to_sym
68
- _registered_subscriptions_to(event_name).dup
69
- end
70
-
71
- def find_subscription(identifier)
72
- _subscriptions_by_identifiers[identifier]
73
- end
74
-
75
- def find_publisher(publisher)
76
- klass = Publishers.load(publisher)
77
- publishers && publishers.find { |pub| pub.is_a?(klass) }
78
- end
79
-
80
- def has_publisher?(publisher)
81
- !!find_publisher(publisher)
82
- end
83
-
84
- def _register_subscription(subscription)
85
- if _subscriptions_by_identifiers[subscription.identifier]
86
- # This is not expected to occur
87
- raise Errors::SubscriptionError, "duplicate identifier: #{subscription.identifier.inspect}"
88
- else
89
- _subscriptions_by_identifiers[subscription.identifier] = subscription
90
- end
91
-
92
- _registered_subscriptions_to(subscription.event_name)
93
- .push(subscription)
94
- .sort! { |x, y| x.priority <=> y.priority }
95
- end
96
-
97
- private
98
- def _translate_object_to_plugin(object)
99
- case object
100
- when String, Symbol
101
- _translate_string_to_plugin(object.to_s)
102
- end
103
- end
104
-
105
- def _translate_string_to_plugin(string)
106
- begin
107
- Plugins.const_get(
108
- string.split('_').map(&:capitalize).join + 'Plugin'
109
- )
110
- rescue
111
- nil # Let the Plugins gem handle this.
112
- end
113
- end
114
-
115
- def _registered_subscriptions_to(event_name)
116
- (@__registered_subscriptions ||= {})[event_name] ||= []
117
- end
118
-
119
- def _subscriptions_by_identifiers
120
- @__registered_subscriptions_by_identifier ||= {}
121
- end
122
-
123
- def _load_default_config
124
- config.merge_config_file!(DEFAULT_CONFIG_PATH)
125
- end
126
-
127
- # Attempt to convert *args to an event object.
128
- def _args_to_event(name_or_event, params={})
129
- raise ArgumentError, 'event parameters must be a hash' unless params.is_a?(Hash)
130
-
131
- case name_or_event
132
- when Event
133
- name_or_event.tap { |e| e.instance_variable_set(:@instance, self) }
134
- else
135
- Event.new(name_or_event, params.merge(instance: self))
136
- end
137
- end # _args_to_event
138
-
139
- def _process_config
140
- @publishers = _load_publishers.dup.freeze
141
- _update_plugins
142
- end
143
-
144
- def _load_publishers
145
- Publishers.load_for_instance(self)
146
- end
147
-
148
- def _update_plugins
149
- plugins.clear
150
-
151
- if config.plugin?
152
- config.plugin.each { |plugin|
153
- plugin = [plugin] unless plugin.is_a?(Array)
154
- plugins.add(*plugin)
155
- }
156
- end
157
- end
158
- end # Instance
159
- end # EventBus
160
- end # Ribbon
@@ -1,7 +0,0 @@
1
- module Ribbon::EventBus
2
- module Mixins
3
- autoload(:HasInstance, 'ribbon/event_bus/mixins/has_instance')
4
- autoload(:HasConfig, 'ribbon/event_bus/mixins/has_config')
5
- autoload(:Serializable, 'ribbon/event_bus/mixins/serializable')
6
- end
7
- end
@@ -1,6 +0,0 @@
1
- module Ribbon::EventBus
2
- module Plugins
3
- autoload(:Plugin, 'ribbon/event_bus/plugins/plugin')
4
- autoload(:LoggingPlugin, 'ribbon/event_bus/plugins/logging_plugin')
5
- end
6
- end
@@ -1,5 +0,0 @@
1
- module Ribbon
2
- module EventBus
3
- VERSION = "0.5.1"
4
- end
5
- end