promiscuous 0.22 → 0.23

Sign up to get free protection for your applications and to get access to all the features.
data/lib/promiscuous.rb CHANGED
@@ -1,18 +1,12 @@
1
1
  require 'active_support/core_ext'
2
- require 'promiscuous/config'
3
- require 'promiscuous/amqp'
4
- require 'promiscuous/loader'
5
- require 'promiscuous/railtie' if defined?(Rails)
6
2
 
7
3
  module Promiscuous
8
- autoload :Common, 'promiscuous/common'
9
- autoload :Publisher, 'promiscuous/publisher'
10
- autoload :Subscriber, 'promiscuous/subscriber'
11
- autoload :Observer, 'promiscuous/observer'
12
- autoload :Worker, 'promiscuous/worker'
13
- autoload :Ephemeral, 'promiscuous/ephemeral'
14
- autoload :CLI, 'promiscuous/cli'
15
- autoload :Error, 'promiscuous/error'
4
+ require 'promiscuous/autoload'
5
+ require 'promiscuous/railtie' if defined?(Rails)
6
+
7
+ extend Promiscuous::Autoload
8
+ autoload :Common, :Publisher, :Subscriber, :Observer, :Worker, :Ephemeral,
9
+ :CLI, :Error, :Loader, :AMQP, :Config
16
10
 
17
11
  class << self
18
12
  def configure(&block)
@@ -1,7 +1,6 @@
1
1
  module Promiscuous::AMQP
2
- autoload :Bunny, 'promiscuous/amqp/bunny'
3
- autoload :RubyAMQP, 'promiscuous/amqp/rubyamqp'
4
- autoload :Null, 'promiscuous/amqp/null'
2
+ extend Promiscuous::Autoload
3
+ autoload :Bunny, :RubyAMQP, :Null
5
4
 
6
5
  EXCHANGE = 'promiscuous'.freeze
7
6
 
@@ -1,35 +1,31 @@
1
- module Promiscuous
2
- module AMQP
3
- module Bunny
4
- mattr_accessor :connection
1
+ module Promiscuous::AMQP:: Bunny
2
+ mattr_accessor :connection
5
3
 
6
- def self.connect
7
- require 'bunny'
8
- self.connection = ::Bunny.new(Promiscuous::Config.server_uri)
9
- self.connection.start
10
- end
4
+ def self.connect
5
+ require 'bunny'
6
+ self.connection = ::Bunny.new(Promiscuous::Config.server_uri)
7
+ self.connection.start
8
+ end
11
9
 
12
- def self.disconnect
13
- self.connection.stop
14
- end
10
+ def self.disconnect
11
+ self.connection.stop
12
+ end
15
13
 
16
- def self.connected?
17
- !!self.connection.try(:connected?)
18
- end
14
+ def self.connected?
15
+ !!self.connection.try(:connected?)
16
+ end
19
17
 
20
- def self.publish(options={})
21
- Promiscuous.info "[publish] (#{options[:exchange_name]}) #{options[:key]} -> #{options[:payload]}"
22
- exchange(options[:exchange_name]).
23
- publish(options[:payload], :key => options[:key], :persistent => true)
24
- end
18
+ def self.publish(options={})
19
+ Promiscuous.info "[publish] (#{options[:exchange_name]}) #{options[:key]} -> #{options[:payload]}"
20
+ exchange(options[:exchange_name]).
21
+ publish(options[:payload], :key => options[:key], :persistent => true)
22
+ end
25
23
 
26
- def self.open_queue(options={}, &block)
27
- raise "Cannot open queue with bunny"
28
- end
24
+ def self.open_queue(options={}, &block)
25
+ raise "Cannot open queue with bunny"
26
+ end
29
27
 
30
- def self.exchange(name)
31
- connection.exchange(name, :type => :topic, :durable => true)
32
- end
33
- end
28
+ def self.exchange(name)
29
+ connection.exchange(name, :type => :topic, :durable => true)
34
30
  end
35
31
  end
@@ -1,20 +1,16 @@
1
- module Promiscuous
2
- module AMQP
3
- module Null
4
- def self.connect
5
- end
1
+ module Promiscuous::AMQP::Null
2
+ def self.connect
3
+ end
6
4
 
7
- def self.disconnect
8
- end
5
+ def self.disconnect
6
+ end
9
7
 
10
- def self.connected?
11
- end
8
+ def self.connected?
9
+ end
12
10
 
13
- def self.publish(options={})
14
- end
11
+ def self.publish(options={})
12
+ end
15
13
 
16
- def self.open_queue(options={}, &block)
17
- end
18
- end
14
+ def self.open_queue(options={}, &block)
19
15
  end
20
16
  end
@@ -0,0 +1,89 @@
1
+ module Promiscuous::AMQP::RubyAMQP
2
+ mattr_accessor :channel
3
+
4
+ def self.connect
5
+ require 'amqp'
6
+
7
+ amqp_options = if Promiscuous::Config.server_uri
8
+ uri = URI.parse(Promiscuous::Config.server_uri)
9
+ raise "Please use amqp://user:password@host:port/vhost" if uri.scheme != 'amqp'
10
+
11
+ {
12
+ :host => uri.host,
13
+ :port => uri.port,
14
+ :scheme => uri.scheme,
15
+ :user => uri.user,
16
+ :pass => uri.password,
17
+ :vhost => uri.path.empty? ? "/" : uri.path,
18
+ }
19
+ end
20
+
21
+ connection = ::AMQP.connect(amqp_options)
22
+ self.channel = ::AMQP::Channel.new(connection, :auto_recovery => true, :prefetch => 100)
23
+
24
+ connection.on_tcp_connection_loss do |conn|
25
+ unless conn.reconnecting?
26
+ Promiscuous.warn "[connection] Lost connection. Reconnecting..."
27
+ conn.periodically_reconnect(2)
28
+
29
+ exception = Promiscuous::Error::Connection.new 'Lost connection'
30
+ Promiscuous::Worker.stop # TODO XXX This doesn't belong here. hooks ?
31
+ Promiscuous::Config.error_notifier.try(:call, exception)
32
+ end
33
+ end
34
+
35
+ connection.on_recovery do |conn|
36
+ Promiscuous.warn "[connection] Reconnected"
37
+ Promiscuous::Worker.resume # TODO XXX This doesn't belong here. hooks ?
38
+ end
39
+
40
+ connection.on_error do |conn, conn_close|
41
+ # No need to handle CONNECTION_FORCED since on_tcp_connection_loss takes
42
+ # care of it.
43
+ Promiscuous.warn "[connection] #{conn_close.reply_text}"
44
+ end
45
+ end
46
+
47
+ def self.disconnect
48
+ if self.channel && self.channel.connection.connected?
49
+ self.channel.connection.close
50
+ self.channel.close
51
+ end
52
+ self.channel = nil
53
+ end
54
+
55
+ # Always disconnect when shutting down to avoid reconnection
56
+ EM.add_shutdown_hook { Promiscuous::AMQP::RubyAMQP.disconnect }
57
+
58
+ def self.connected?
59
+ !!self.channel.try(:connection).try(:connected?)
60
+ end
61
+
62
+ def self.open_queue(options={}, &block)
63
+ queue_name = options[:queue_name]
64
+ bindings = options[:bindings]
65
+
66
+ queue = self.channel.queue(queue_name, Promiscuous::Config.queue_options)
67
+ bindings.each do |binding|
68
+ queue.bind(exchange(options[:exchange_name]), :routing_key => binding)
69
+ Promiscuous.info "[bind] #{queue_name} -> #{binding}"
70
+ end
71
+ block.call(queue) if block
72
+ end
73
+
74
+ def self.publish(options={})
75
+ info_msg = "(#{options[:exchange_name]}) #{options[:key]} -> #{options[:payload]}"
76
+
77
+ unless channel.connection.connected?
78
+ raise Promiscuous::Error::Connection.new 'Not connected'
79
+ end
80
+
81
+ Promiscuous.info "[publish] #{info_msg}"
82
+ exchange(options[:exchange_name]).
83
+ publish(options[:payload], :routing_key => options[:key], :persistent => true)
84
+ end
85
+
86
+ def self.exchange(name)
87
+ channel.topic(name, :durable => true)
88
+ end
89
+ end
@@ -0,0 +1,7 @@
1
+ module Promiscuous::Autoload
2
+ include ActiveSupport::Autoload
3
+
4
+ def autoload(*args)
5
+ args.each { |mod| super mod }
6
+ end
7
+ end
@@ -1,5 +1,3 @@
1
- require 'promiscuous'
2
-
3
1
  class Promiscuous::CLI
4
2
  def replicate(config_options={}, &block)
5
3
  require 'eventmachine'
@@ -1,6 +1,4 @@
1
1
  module Promiscuous::Common
2
- autoload :Options, 'promiscuous/common/options'
3
- autoload :Lint, 'promiscuous/common/lint'
4
- autoload :ClassHelpers, 'promiscuous/common/class_helpers'
5
- autoload :Worker, 'promiscuous/common/worker'
2
+ extend Promiscuous::Autoload
3
+ autoload :Options, :Lint, :ClassHelpers, :Worker
6
4
  end
@@ -1,3 +1,4 @@
1
1
  module Promiscuous::Common::Lint
2
- autoload :Base, 'promiscuous/common/lint/base'
2
+ extend Promiscuous::Autoload
3
+ autoload :Base
3
4
  end
@@ -13,9 +13,11 @@ module Promiscuous::Common::Lint::Base
13
13
  end
14
14
 
15
15
  module ClassMethods
16
- def use_option(attr)
17
- define_method(attr) do
18
- self.options[attr]
16
+ def use_option(*attrs)
17
+ attrs.each do |attr|
18
+ define_method(attr) do
19
+ self.options[attr]
20
+ end
19
21
  end
20
22
  end
21
23
  end
@@ -1,28 +1,26 @@
1
- module Promiscuous
2
- module Config
3
- mattr_accessor :app, :logger, :error_notifier, :backend, :server_uri, :queue_options
1
+ module Promiscuous::Config
2
+ mattr_accessor :app, :logger, :error_notifier, :backend, :server_uri, :queue_options
4
3
 
5
- def self.backend=(value)
6
- @@backend = "Promiscuous::AMQP::#{value.to_s.camelize.gsub(/amqp/, 'AMQP')}".constantize unless value.nil?
7
- end
4
+ def self.backend=(value)
5
+ @@backend = "Promiscuous::AMQP::#{value.to_s.camelize.gsub(/amqp/, 'AMQP')}".constantize unless value.nil?
6
+ end
8
7
 
9
- def self.configure(&block)
10
- class_variables.each { |var| class_variable_set(var, nil) }
8
+ def self.configure(&block)
9
+ class_variables.each { |var| class_variable_set(var, nil) }
11
10
 
12
- block.call(self)
11
+ block.call(self)
13
12
 
14
- self.backend ||= defined?(EventMachine) && EventMachine.reactor_running? ? :rubyamqp : :bunny
15
- self.logger ||= defined?(Rails) ? Rails.logger : Logger.new(STDERR).tap { |l| l.level = Logger::WARN }
16
- self.queue_options ||= {:durable => true, :arguments => {'x-ha-policy' => 'all'}}
13
+ self.backend ||= defined?(EventMachine) && EventMachine.reactor_running? ? :rubyamqp : :bunny
14
+ self.logger ||= defined?(Rails) ? Rails.logger : Logger.new(STDERR).tap { |l| l.level = Logger::WARN }
15
+ self.queue_options ||= {:durable => true, :arguments => {'x-ha-policy' => 'all'}}
17
16
 
18
- Promiscuous::AMQP.connect
19
- end
17
+ Promiscuous::AMQP.connect
18
+ end
20
19
 
21
- # TODO backward compatibility. to be removed.
22
- def self.error_handler=(value)
23
- ActiveSupport::Deprecation.behavior = :stderr
24
- ActiveSupport::Deprecation.warn "'error_handler' is deprecated, please use 'error_notifier'", caller
25
- self.error_notifier = value
26
- end
20
+ # TODO backward compatibility. to be removed.
21
+ def self.error_handler=(value)
22
+ ActiveSupport::Deprecation.behavior = :stderr
23
+ ActiveSupport::Deprecation.warn "'error_handler' is deprecated, please use 'error_notifier'", caller
24
+ self.error_notifier = value
27
25
  end
28
26
  end
@@ -1,5 +1,4 @@
1
1
  module Promiscuous::Error
2
- autoload :Connection, 'promiscuous/error/connection'
3
- autoload :Publisher, 'promiscuous/error/publisher'
4
- autoload :Subscriber, 'promiscuous/error/subscriber'
2
+ extend Promiscuous::Autoload
3
+ autoload :Connection, :Publisher, :Subscriber
5
4
  end
@@ -1,25 +1,23 @@
1
- module Promiscuous
2
- module Loader
3
- def self.load_descriptors(descriptors=[:publishers, :subscribers])
4
- [descriptors].flatten.each do |descriptor|
5
- dir, file_matcher = case descriptor
6
- when :publishers then %w(publishers **_publisher.rb)
7
- when :subscribers then %w(subscribers **_subscriber.rb)
8
- end
9
-
10
- Dir[Rails.root.join('app', dir, file_matcher)].map do |file|
11
- File.basename(file, ".rb").camelize.constantize
1
+ module Promiscuous::Loader
2
+ def self.load_descriptors(descriptors=[:publishers, :subscribers])
3
+ [descriptors].flatten.each do |descriptor|
4
+ dir, file_matcher = case descriptor
5
+ when :publishers then %w(publishers **_publisher.rb)
6
+ when :subscribers then %w(subscribers **_subscriber.rb)
12
7
  end
8
+
9
+ Dir[Rails.root.join('app', dir, file_matcher)].map do |file|
10
+ File.basename(file, ".rb").camelize.constantize
13
11
  end
14
12
  end
13
+ end
15
14
 
16
- def self.unload_descriptors(descriptors=[:publishers, :subscribers])
17
- [descriptors].flatten.each do |descriptor|
18
- dir, file_matcher = case descriptor
19
- when :publishers then # TODO Cleanup publishers
20
- when :subscribers then Promiscuous::Subscriber::AMQP.subscribers.clear
21
- end
22
- end
15
+ def self.unload_descriptors(descriptors=[:publishers, :subscribers])
16
+ [descriptors].flatten.each do |descriptor|
17
+ dir, file_matcher = case descriptor
18
+ when :publishers then # TODO Cleanup publishers
19
+ when :subscribers then Promiscuous::Subscriber::AMQP.subscribers.clear
20
+ end
23
21
  end
24
22
  end
25
23
  end
@@ -1,18 +1,7 @@
1
1
  module Promiscuous::Publisher
2
- autoload :ActiveRecord, 'promiscuous/publisher/active_record'
3
- autoload :AMQP, 'promiscuous/publisher/amqp'
4
- autoload :Attributes, 'promiscuous/publisher/attributes'
5
- autoload :Base, 'promiscuous/publisher/base'
6
- autoload :Class, 'promiscuous/publisher/class'
7
- autoload :Envelope, 'promiscuous/publisher/envelope'
8
- autoload :Lint, 'promiscuous/publisher/lint'
9
- autoload :Mock, 'promiscuous/publisher/mock'
10
- autoload :Model, 'promiscuous/publisher/model'
11
- autoload :Mongoid, 'promiscuous/publisher/mongoid'
12
- autoload :Polymorphic, 'promiscuous/publisher/polymorphic'
13
- autoload :Worker, 'promiscuous/publisher/worker'
14
- autoload :Error, 'promiscuous/publisher/error'
15
- autoload :Ephemeral, 'promiscuous/publisher/ephemeral'
2
+ extend Promiscuous::Autoload
3
+ autoload :ActiveRecord, :AMQP, :Attributes, :Base, :Class, :Envelope, :Lint,
4
+ :Mock, :Model, :Mongoid, :Polymorphic, :Worker, :Error, :Ephemeral
16
5
 
17
6
  def self.lint(*args)
18
7
  Lint.lint(*args)
@@ -1,9 +1,6 @@
1
1
  module Promiscuous::Publisher::Lint
2
- autoload :Base, 'promiscuous/publisher/lint/base'
3
- autoload :Class, 'promiscuous/publisher/lint/class'
4
- autoload :Attributes, 'promiscuous/publisher/lint/attributes'
5
- autoload :Polymorphic, 'promiscuous/publisher/lint/polymorphic'
6
- autoload :AMQP, 'promiscuous/publisher/lint/amqp'
2
+ extend Promiscuous::Autoload
3
+ autoload :Base, :Class, :Attributes, :Polymorphic, :AMQP
7
4
 
8
5
  def self.get_publisher(klass)
9
6
  unless klass.respond_to?(:promiscuous_publisher)
@@ -13,8 +10,17 @@ module Promiscuous::Publisher::Lint
13
10
  klass.promiscuous_publisher
14
11
  end
15
12
 
16
- def self.lint(classes)
17
- classes.each do |klass, to|
13
+ def self.lint(class_bindings={})
14
+ if class_bindings.empty?
15
+ class_bindings = Promiscuous::Publisher::Mongoid::Defer.klasses.values.reduce({}) do |res, klass|
16
+ res[klass] = klass.promiscuous_publisher.to
17
+ res
18
+ end
19
+
20
+ raise "No publishers found" if class_bindings.empty?
21
+ end
22
+
23
+ class_bindings.each do |klass, to|
18
24
  pub = get_publisher(klass)
19
25
 
20
26
  lint = ::Class.new(Base)
@@ -5,9 +5,11 @@ module Promiscuous::Publisher::Lint::Class
5
5
  super
6
6
 
7
7
  if publisher.klass != klass
8
- raise "Define a publisher for #{klass}"
8
+ msg = "Please define a publisher for #{klass}"
9
+ msg = "#{msg} because #{parent} is published and you need to cover subclasses" if parent
10
+ raise msg
9
11
  end
10
12
  end
11
13
 
12
- included { use_option :klass }
14
+ included { use_option :klass, :parent }
13
15
  end
@@ -9,6 +9,7 @@ module Promiscuous::Publisher::Lint::Polymorphic
9
9
  pub = Promiscuous::Publisher::Lint.get_publisher(subclass)
10
10
  self.class.new(options.merge(:klass => subclass,
11
11
  :publisher => pub,
12
+ :parent => klass,
12
13
  :skip_polymorphic => true)).lint
13
14
  end
14
15
  end
@@ -1,8 +1,6 @@
1
1
  class Promiscuous::Publisher::Mongoid < Promiscuous::Publisher::Base
2
- autoload :Embedded, 'promiscuous/publisher/mongoid/embedded'
3
- autoload :DeferEmbedded, 'promiscuous/publisher/mongoid/defer_embedded'
4
- autoload :Defer, 'promiscuous/publisher/mongoid/defer'
5
- autoload :EmbeddedMany, 'promiscuous/publisher/mongoid/embedded_many'
2
+ extend Promiscuous::Autoload
3
+ autoload :Embedded, :DeferEmbedded, :Defer, :EmbeddedMany
6
4
 
7
5
  include Promiscuous::Publisher::Class
8
6
  include Promiscuous::Publisher::Attributes
@@ -1,14 +1,12 @@
1
- module Promiscuous
2
- class Railtie < Rails::Railtie
3
- initializer 'load promiscuous' do
4
- config.after_initialize do
5
- Promiscuous::Loader.load_descriptors(:publishers)
6
- ActionDispatch::Reloader.to_prepare do
7
- Promiscuous::Loader.load_descriptors
8
- end
9
- ActionDispatch::Reloader.to_cleanup do
10
- Promiscuous::Loader.unload_descriptors
11
- end
1
+ class Promiscuous::Railtie < Rails::Railtie
2
+ initializer 'load promiscuous' do
3
+ config.after_initialize do
4
+ Promiscuous::Loader.load_descriptors(:publishers)
5
+ ActionDispatch::Reloader.to_prepare do
6
+ Promiscuous::Loader.load_descriptors
7
+ end
8
+ ActionDispatch::Reloader.to_cleanup do
9
+ Promiscuous::Loader.unload_descriptors
12
10
  end
13
11
  end
14
12
  end
@@ -1,18 +1,7 @@
1
1
  module Promiscuous::Subscriber
2
- autoload :ActiveRecord, 'promiscuous/subscriber/active_record'
3
- autoload :AMQP, 'promiscuous/subscriber/amqp'
4
- autoload :Attributes, 'promiscuous/subscriber/attributes'
5
- autoload :Base, 'promiscuous/subscriber/base'
6
- autoload :Class, 'promiscuous/subscriber/class'
7
- autoload :Envelope, 'promiscuous/subscriber/envelope'
8
- autoload :Error, 'promiscuous/subscriber/error'
9
- autoload :Lint, 'promiscuous/subscriber/lint'
10
- autoload :Model, 'promiscuous/subscriber/model'
11
- autoload :Mongoid, 'promiscuous/subscriber/mongoid'
12
- autoload :Polymorphic, 'promiscuous/subscriber/polymorphic'
13
- autoload :Upsert, 'promiscuous/subscriber/upsert'
14
- autoload :Observer, 'promiscuous/subscriber/observer'
15
- autoload :Worker, 'promiscuous/subscriber/worker'
2
+ extend Promiscuous::Autoload
3
+ autoload :ActiveRecord, :AMQP, :Attributes, :Base, :Class, :Envelope, :Error,
4
+ :Lint, :Model, :Mongoid, :Polymorphic, :Upsert, :Observer, :Worker
16
5
 
17
6
  def self.lint(*args)
18
7
  Lint.lint(*args)
@@ -1,13 +1,19 @@
1
1
  module Promiscuous::Subscriber::Lint
2
- autoload :Base, 'promiscuous/subscriber/lint/base'
3
- autoload :Class, 'promiscuous/subscriber/lint/class'
4
- autoload :Attributes, 'promiscuous/subscriber/lint/attributes'
5
- autoload :Polymorphic, 'promiscuous/subscriber/lint/polymorphic'
6
- autoload :AMQP, 'promiscuous/subscriber/lint/amqp'
2
+ extend Promiscuous::Autoload
3
+ autoload :Base, :Class, :Attributes, :Polymorphic, :AMQP
7
4
 
8
- def self.lint(binding_classes)
5
+ def self.lint(binding_classes={})
9
6
  Base.reload_publishers
10
7
 
8
+ if binding_classes.empty?
9
+ binding_classes = Promiscuous::Subscriber::AMQP.subscribers.reduce({}) do |res, e|
10
+ from, sub = e
11
+ res[from] = sub.klass unless from =~ /^__promiscuous__/
12
+ res
13
+ end
14
+ raise "No subscribers found" if binding_classes.empty?
15
+ end
16
+
11
17
  binding_classes.each do |from, klass|
12
18
  sub = Promiscuous::Subscriber::AMQP.subscribers[from]
13
19
  raise "#{from} has no subscriber" if sub.nil?
@@ -1,6 +1,6 @@
1
1
  class Promiscuous::Subscriber::Mongoid < Promiscuous::Subscriber::Base
2
- autoload :Embedded, 'promiscuous/subscriber/mongoid/embedded'
3
- autoload :Versioning, 'promiscuous/subscriber/mongoid/versioning'
2
+ extend Promiscuous::Autoload
3
+ autoload :Embedded, :Versioning
4
4
 
5
5
  include Promiscuous::Subscriber::Class
6
6
  include Promiscuous::Subscriber::Attributes
@@ -1,3 +1,3 @@
1
1
  module Promiscuous
2
- VERSION = '0.22'
2
+ VERSION = '0.23'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: promiscuous
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.22'
4
+ version: '0.23'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -117,25 +117,24 @@ executables:
117
117
  extensions: []
118
118
  extra_rdoc_files: []
119
119
  files:
120
- - lib/promiscuous/amqp/null.rb
121
120
  - lib/promiscuous/amqp/bunny.rb
122
- - lib/promiscuous/amqp/rubyamqp.rb
121
+ - lib/promiscuous/amqp/null.rb
122
+ - lib/promiscuous/amqp/ruby_amqp.rb
123
123
  - lib/promiscuous/common/lint/base.rb
124
- - lib/promiscuous/common/lint.rb
125
124
  - lib/promiscuous/common/class_helpers.rb
126
125
  - lib/promiscuous/common/options.rb
127
126
  - lib/promiscuous/common/worker.rb
127
+ - lib/promiscuous/common/lint.rb
128
128
  - lib/promiscuous/publisher/lint/amqp.rb
129
129
  - lib/promiscuous/publisher/lint/attributes.rb
130
130
  - lib/promiscuous/publisher/lint/base.rb
131
- - lib/promiscuous/publisher/lint/class.rb
132
131
  - lib/promiscuous/publisher/lint/polymorphic.rb
132
+ - lib/promiscuous/publisher/lint/class.rb
133
133
  - lib/promiscuous/publisher/mongoid/embedded.rb
134
134
  - lib/promiscuous/publisher/mongoid/defer_embedded.rb
135
135
  - lib/promiscuous/publisher/mongoid/embedded_many.rb
136
136
  - lib/promiscuous/publisher/mongoid/defer.rb
137
137
  - lib/promiscuous/publisher/envelope.rb
138
- - lib/promiscuous/publisher/lint.rb
139
138
  - lib/promiscuous/publisher/polymorphic.rb
140
139
  - lib/promiscuous/publisher/mock.rb
141
140
  - lib/promiscuous/publisher/attributes.rb
@@ -144,9 +143,10 @@ files:
144
143
  - lib/promiscuous/publisher/base.rb
145
144
  - lib/promiscuous/publisher/class.rb
146
145
  - lib/promiscuous/publisher/ephemeral.rb
147
- - lib/promiscuous/publisher/mongoid.rb
148
146
  - lib/promiscuous/publisher/amqp.rb
149
147
  - lib/promiscuous/publisher/worker.rb
148
+ - lib/promiscuous/publisher/mongoid.rb
149
+ - lib/promiscuous/publisher/lint.rb
150
150
  - lib/promiscuous/subscriber/lint/amqp.rb
151
151
  - lib/promiscuous/subscriber/lint/base.rb
152
152
  - lib/promiscuous/subscriber/lint/class.rb
@@ -157,7 +157,6 @@ files:
157
157
  - lib/promiscuous/subscriber/mongoid/versioning.rb
158
158
  - lib/promiscuous/subscriber/active_record.rb
159
159
  - lib/promiscuous/subscriber/envelope.rb
160
- - lib/promiscuous/subscriber/lint.rb
161
160
  - lib/promiscuous/subscriber/upsert.rb
162
161
  - lib/promiscuous/subscriber/observer.rb
163
162
  - lib/promiscuous/subscriber/polymorphic.rb
@@ -166,23 +165,25 @@ files:
166
165
  - lib/promiscuous/subscriber/model.rb
167
166
  - lib/promiscuous/subscriber/base.rb
168
167
  - lib/promiscuous/subscriber/class.rb
169
- - lib/promiscuous/subscriber/mongoid.rb
170
168
  - lib/promiscuous/subscriber/worker.rb
169
+ - lib/promiscuous/subscriber/mongoid.rb
170
+ - lib/promiscuous/subscriber/lint.rb
171
171
  - lib/promiscuous/error/connection.rb
172
172
  - lib/promiscuous/error/publisher.rb
173
173
  - lib/promiscuous/error/subscriber.rb
174
- - lib/promiscuous/loader.rb
175
174
  - lib/promiscuous/observer.rb
176
- - lib/promiscuous/common.rb
177
175
  - lib/promiscuous/ephemeral.rb
176
+ - lib/promiscuous/worker.rb
177
+ - lib/promiscuous/autoload.rb
178
178
  - lib/promiscuous/subscriber.rb
179
179
  - lib/promiscuous/publisher.rb
180
- - lib/promiscuous/railtie.rb
181
- - lib/promiscuous/amqp.rb
182
180
  - lib/promiscuous/error.rb
183
- - lib/promiscuous/config.rb
181
+ - lib/promiscuous/common.rb
182
+ - lib/promiscuous/amqp.rb
183
+ - lib/promiscuous/loader.rb
184
+ - lib/promiscuous/railtie.rb
184
185
  - lib/promiscuous/cli.rb
185
- - lib/promiscuous/worker.rb
186
+ - lib/promiscuous/config.rb
186
187
  - lib/promiscuous/version.rb
187
188
  - lib/promiscuous.rb
188
189
  - bin/promiscuous
@@ -1,93 +0,0 @@
1
- module Promiscuous
2
- module AMQP
3
- module RubyAMQP
4
- mattr_accessor :channel
5
-
6
- def self.connect
7
- require 'amqp'
8
-
9
- amqp_options = if Promiscuous::Config.server_uri
10
- uri = URI.parse(Promiscuous::Config.server_uri)
11
- raise "Please use amqp://user:password@host:port/vhost" if uri.scheme != 'amqp'
12
-
13
- {
14
- :host => uri.host,
15
- :port => uri.port,
16
- :scheme => uri.scheme,
17
- :user => uri.user,
18
- :pass => uri.password,
19
- :vhost => uri.path.empty? ? "/" : uri.path,
20
- }
21
- end
22
-
23
- connection = ::AMQP.connect(amqp_options)
24
- self.channel = ::AMQP::Channel.new(connection, :auto_recovery => true, :prefetch => 100)
25
-
26
- connection.on_tcp_connection_loss do |conn|
27
- unless conn.reconnecting?
28
- Promiscuous.warn "[connection] Lost connection. Reconnecting..."
29
- conn.periodically_reconnect(2)
30
-
31
- exception = Promiscuous::Error::Connection.new 'Lost connection'
32
- Promiscuous::Worker.stop # TODO XXX This doesn't belong here. hooks ?
33
- Promiscuous::Config.error_notifier.try(:call, exception)
34
- end
35
- end
36
-
37
- connection.on_recovery do |conn|
38
- Promiscuous.warn "[connection] Reconnected"
39
- Promiscuous::Worker.resume # TODO XXX This doesn't belong here. hooks ?
40
- end
41
-
42
- connection.on_error do |conn, conn_close|
43
- # No need to handle CONNECTION_FORCED since on_tcp_connection_loss takes
44
- # care of it.
45
- Promiscuous.warn "[connection] #{conn_close.reply_text}"
46
- end
47
- end
48
-
49
- def self.disconnect
50
- if self.channel && self.channel.connection.connected?
51
- self.channel.connection.close
52
- self.channel.close
53
- end
54
- self.channel = nil
55
- end
56
-
57
- # Always disconnect when shutting down to avoid reconnection
58
- EM.add_shutdown_hook { Promiscuous::AMQP::RubyAMQP.disconnect }
59
-
60
- def self.connected?
61
- !!self.channel.try(:connection).try(:connected?)
62
- end
63
-
64
- def self.open_queue(options={}, &block)
65
- queue_name = options[:queue_name]
66
- bindings = options[:bindings]
67
-
68
- queue = self.channel.queue(queue_name, Promiscuous::Config.queue_options)
69
- bindings.each do |binding|
70
- queue.bind(exchange(options[:exchange_name]), :routing_key => binding)
71
- Promiscuous.info "[bind] #{queue_name} -> #{binding}"
72
- end
73
- block.call(queue) if block
74
- end
75
-
76
- def self.publish(options={})
77
- info_msg = "(#{options[:exchange_name]}) #{options[:key]} -> #{options[:payload]}"
78
-
79
- unless channel.connection.connected?
80
- raise Promiscuous::Error::Connection.new 'Not connected'
81
- end
82
-
83
- Promiscuous.info "[publish] #{info_msg}"
84
- exchange(options[:exchange_name]).
85
- publish(options[:payload], :routing_key => options[:key], :persistent => true)
86
- end
87
-
88
- def self.exchange(name)
89
- channel.topic(name, :durable => true)
90
- end
91
- end
92
- end
93
- end