untied-publisher 0.0.4 → 0.0.5

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.
data/CHANGELOG.mkd CHANGED
@@ -1,3 +1,8 @@
1
+ # 0.0.4
2
+
3
+ - Don't relying on ActiveSupport for serializing Untied::Event
4
+ - Fixes #1
5
+
1
6
  # 0.0.3
2
7
 
3
8
  - ``abort_on_exception`` configuration
@@ -58,9 +58,11 @@ module Untied
58
58
  # _notify_untied__publisher_observer_for_after_create is created on User's
59
59
  # model. This method is called when the after_create callback is fired.
60
60
  def define_callbacks
61
+ logger.debug "Untied::Publisher: defining callbacks"
61
62
  observed.each do |(klass, callbacks, options)|
62
63
  ActiveRecord::Callbacks::CALLBACKS.each do |callback|
63
64
  next unless callbacks.include?(callback)
65
+ logger.debug "Untied::Publisher: seting up callback #{callback} for #{klass}"
64
66
  setup_observer(klass, callback, options)
65
67
  end
66
68
  end
@@ -68,6 +70,10 @@ module Untied
68
70
 
69
71
  protected
70
72
 
73
+ def logger
74
+ Publisher.config.logger
75
+ end
76
+
71
77
  def setup_observer(klass, callback, options={})
72
78
  observer = Untied::Publisher::Observer
73
79
  observer_name = observer.name.underscore.gsub('/', '__')
@@ -1,7 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
- require 'representable/json'
4
-
5
3
  module Untied
6
4
  class Event
7
5
  attr_accessor :name, :payload, :origin
@@ -20,14 +18,4 @@ module Untied
20
18
  @origin = @config.delete(:origin)
21
19
  end
22
20
  end
23
-
24
- module EventRepresenter
25
- include Representable::JSON
26
-
27
- self.representation_wrap = true
28
-
29
- property :name
30
- property :payload
31
- property :origin
32
- end
33
21
  end
@@ -0,0 +1,15 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ require 'representable/json'
4
+
5
+ module Untied
6
+ module EventRepresenter
7
+ include Representable::JSON
8
+
9
+ self.representation_wrap = true
10
+
11
+ property :name
12
+ property :payload
13
+ property :origin
14
+ end
15
+ end
@@ -4,6 +4,8 @@ require 'amqp'
4
4
  module Untied
5
5
  module Publisher
6
6
  class Producer
7
+ # Encapsulates both the Channel and Exchange (AMQP).
8
+
7
9
  def initialize(opts={})
8
10
  @opts = {
9
11
  :service_name => Publisher.config.service_name,
@@ -26,21 +28,26 @@ module Untied
26
28
  if AMQP.channel || @opts[:channel]
27
29
  Publisher.config.logger.info "Using defined AMQP.channel"
28
30
  @channel = AMQP.channel || @opts[:channel]
29
- @exchange = @channel.topic("untied", :auto_delete => true)
30
31
  end
31
32
  end
32
33
 
34
+ # Publish the given event.
35
+ # event: object which is going to be serialized and sent through the
36
+ # wire. It should respond to #to_json.
33
37
  def publish(event)
34
38
  safe_publish(event)
35
39
  end
36
40
 
37
41
  protected
38
42
 
43
+ # Publishes if message delivering is enabled. Otherwise just warns.
39
44
  def safe_publish(e)
40
45
  if @opts[:deliver_messages]
41
- @exchange.publish(e.to_json, :routing_key => @routing_key) do
42
- Publisher.config.logger.info \
43
- "Publishing event #{e.inspect} with routing key #{@routing_key}"
46
+ on_exchange do |exchange|
47
+ exchange.publish(e.to_json, :routing_key => @routing_key) do
48
+ Publisher.config.logger.info \
49
+ "Publishing event #{e.inspect} with routing key #{@routing_key}"
50
+ end
44
51
  end
45
52
  else
46
53
  Publisher.config.logger.info \
@@ -49,6 +56,12 @@ module Untied
49
56
  end
50
57
  end
51
58
 
59
+ # Creates a new exchange and yields it to the block passed when it's ready
60
+ def on_exchange(&block)
61
+ return unless @channel
62
+ @channel.topic('untied', :auto_delete => true, &block)
63
+ end
64
+
52
65
  def check_em_reactor
53
66
  if !defined?(EventMachine) || !EM.reactor_running?
54
67
  raise "In order to use the producer you must be running inside an " + \
@@ -8,7 +8,14 @@ module Untied
8
8
  config.active_record.observers ||= []
9
9
  ActiveRecord::Base.observers << Untied::Publisher::Observer
10
10
  config.active_record.observers << Untied::Publisher::Observer
11
- Untied::Publisher::Observer.instance
11
+ unless File.basename($0) == 'rake'
12
+ Publisher.config.logger.debug "Untied::Publisher: initializing observer"
13
+ Untied::Publisher::Observer.instance
14
+ end
15
+ end
16
+
17
+ config.to_prepare do
18
+ Untied::Publisher.config.doorkeeper.new.define_callbacks
12
19
  end
13
20
  end
14
21
  end
@@ -1,5 +1,5 @@
1
1
  module Untied
2
2
  module Publisher
3
- VERSION = "0.0.4"
3
+ VERSION = "0.0.5"
4
4
  end
5
5
  end
@@ -9,13 +9,27 @@ module Untied
9
9
  def self.start
10
10
  Thread.abort_on_exception = false
11
11
 
12
- AMQP::Utilities::EventLoopHelper.run do
12
+ self.run do
13
13
  AMQP.start
14
14
  end
15
15
  end
16
+
17
+ def self.run(&block)
18
+ @block = block
19
+ if defined?(PhusionPassenger)
20
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
21
+ EM.stop if forked && EM.reactor_running?
22
+ Thread.new { EM.run { @block.call } }
23
+ end
24
+ else
25
+ AMQP::Utilities::EventLoopHelper.run { @block.call }
26
+ end
27
+ end
16
28
  end
17
29
  end
18
30
 
31
+
32
+ require 'untied-publisher/event_representer'
19
33
  require 'untied-publisher/event'
20
34
  require 'untied-publisher/config'
21
35
  require 'untied-publisher/doorkeeper'
@@ -31,13 +31,15 @@ module Untied
31
31
  end
32
32
 
33
33
  context "#publish" do
34
+ let(:event) do
35
+ Event.new(:name => "create", :payload => { :foo => 'bar' }, :origin => :core)
36
+ end
37
+
34
38
  it "should call Channel#publish" do
35
39
  mock_reactor_and_amqp do |channel|
36
- e = Event.new(:name => "create",
37
- :payload => { :foo => 'bar' }, :origin => :core)
38
- channel.topic.should_receive(:publish)
39
40
  producer = Producer.new(:channel => channel, :deliver_messages => true)
40
- producer.publish(e)
41
+ producer.should_receive(:safe_publish).with(event)
42
+ producer.publish(event)
41
43
  end
42
44
  end
43
45
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: untied-publisher
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 4
10
- version: 0.0.4
9
+ - 5
10
+ version: 0.0.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Guilherme Cavalcanti
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-11-06 00:00:00 Z
18
+ date: 2012-11-20 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  version_requirements: &id001 !ruby/object:Gem::Requirement
@@ -165,6 +165,7 @@ files:
165
165
  - lib/untied-publisher/config.rb
166
166
  - lib/untied-publisher/doorkeeper.rb
167
167
  - lib/untied-publisher/event.rb
168
+ - lib/untied-publisher/event_representer.rb
168
169
  - lib/untied-publisher/observer.rb
169
170
  - lib/untied-publisher/producer.rb
170
171
  - lib/untied-publisher/railtie.rb