promiscuous 0.22 → 0.23

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/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