promiscuous 0.7.1 → 0.7.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.
@@ -0,0 +1,44 @@
1
+ module Promiscuous::Common::Options
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ class_attribute :options, :options_mappings,
6
+ :instance_reader => false,
7
+ :instance_writer => false
8
+ self.options = self.options_mappings = {}
9
+ end
10
+
11
+ module ClassMethods
12
+ def inherited(subclass)
13
+ super
14
+ subclass.options = self.options.dup
15
+ end
16
+
17
+ def use_option(attr, options={})
18
+ instance_reader = options.fetch(:instance_reader, true)
19
+ attr_alias = options.fetch(:as, attr)
20
+
21
+ self.options_mappings[attr] = attr_alias
22
+
23
+ base = self.ancestors[self.ancestors.index(Promiscuous::Common::Options) - 1]
24
+
25
+ # We need to let all the modules overload these methods, which is
26
+ # why we are injecting at the base level.
27
+ base.singleton_class.class_eval do
28
+ define_method("#{attr_alias}") { self.options[attr] }
29
+ define_method("#{attr_alias}=") { |value| self.options[attr] = value }
30
+ end
31
+
32
+ if instance_reader
33
+ define_method("#{attr_alias}") { self.class.__send__("#{attr_alias}") }
34
+ end
35
+ end
36
+
37
+ def load_options(options)
38
+ options.each do |attr, value|
39
+ attr_alias = self.options_mappings[attr]
40
+ self.__send__("#{attr_alias}=", value) if attr_alias
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,7 @@
1
+ module Promiscuous::Common
2
+ autoload :Options, 'promiscuous/common/options'
3
+
4
+ def self.lint(*args)
5
+ Lint.lint(*args)
6
+ end
7
+ end
@@ -1,14 +1,6 @@
1
- require 'promiscuous/publisher/base'
2
- require 'promiscuous/publisher/class_bind'
3
- require 'promiscuous/publisher/attributes'
4
- require 'promiscuous/publisher/amqp'
5
- require 'promiscuous/publisher/envelope'
6
- require 'promiscuous/publisher/model'
7
-
8
1
  class Promiscuous::Publisher::ActiveRecord < Promiscuous::Publisher::Base
9
- include Promiscuous::Publisher::ClassBind
2
+ include Promiscuous::Publisher::Class
10
3
  include Promiscuous::Publisher::Attributes
11
4
  include Promiscuous::Publisher::AMQP
12
- include Promiscuous::Publisher::Envelope
13
5
  include Promiscuous::Publisher::Model
14
6
  end
@@ -1,5 +1,3 @@
1
- require 'promiscuous/publisher/envelope'
2
-
3
1
  module Promiscuous::Publisher::AMQP
4
2
  extend ActiveSupport::Concern
5
3
  include Promiscuous::Publisher::Envelope
@@ -23,13 +23,8 @@ module Promiscuous::Publisher::Attributes
23
23
  included { use_option :attributes }
24
24
 
25
25
  module ClassMethods
26
- def publish(options)
27
- if self.options[:attributes] and options[:attributes]
28
- options = options.dup
29
- options[:attributes] = (self.options[:attributes] + options[:attributes]).uniq
30
- end
31
-
32
- super(options)
26
+ def attributes=(value)
27
+ super(superclass.attributes.to_a + value)
33
28
  end
34
29
  end
35
30
  end
@@ -1,7 +1,8 @@
1
1
  class Promiscuous::Publisher::Base
2
+ include Promiscuous::Common::Options
3
+
4
+ cattr_accessor :published
2
5
  attr_accessor :options
3
- class_attribute :options, :published
4
- self.options = {}
5
6
 
6
7
  def initialize(options)
7
8
  self.options = options
@@ -12,13 +13,7 @@ class Promiscuous::Publisher::Base
12
13
  end
13
14
 
14
15
  def self.publish(options)
15
- self.options = self.options.merge(options)
16
+ load_options(options)
16
17
  self.published = true
17
18
  end
18
-
19
- def self.use_option(attr)
20
- define_method(attr) do
21
- self.class.options[attr]
22
- end
23
- end
24
19
  end
@@ -0,0 +1,35 @@
1
+ module Promiscuous::Publisher::Class
2
+ extend ActiveSupport::Concern
3
+
4
+ included { use_option :class, :as => :klass }
5
+
6
+ module ClassMethods
7
+ def setup_binding
8
+ publisher_class = self
9
+ klass.class_eval do
10
+ class_attribute :promiscuous_publisher
11
+ self.promiscuous_publisher = publisher_class
12
+ end if klass
13
+ end
14
+
15
+ def inherited(subclass)
16
+ super
17
+ subclass.setup_binding unless options[:class]
18
+ end
19
+
20
+ def klass=(value)
21
+ super
22
+ setup_binding
23
+ end
24
+
25
+ def klass
26
+ if super
27
+ "::#{super}".constantize
28
+ elsif name
29
+ class_name = "::#{name.split('::').last}"
30
+ class_name = $1 if class_name =~ /^(.+)Publisher$/
31
+ class_name.constantize
32
+ end
33
+ end
34
+ end
35
+ end
@@ -10,5 +10,5 @@ module Promiscuous::Publisher::Lint::AMQP
10
10
  end
11
11
  end
12
12
 
13
- included { use_option(:to) }
13
+ included { use_option :to }
14
14
  end
@@ -5,10 +5,8 @@ module Promiscuous::Publisher::Lint::Attributes
5
5
  super
6
6
 
7
7
  instance = klass.new
8
- publisher.options[:attributes].each do |attr|
8
+ publisher.attributes.each do |attr|
9
9
  instance.respond_to?(attr) or instance.__send__(attr)
10
10
  end
11
11
  end
12
-
13
- included { use_option(:klass) }
14
12
  end
@@ -9,6 +9,6 @@ module Promiscuous::Publisher::Lint::ClassBind
9
9
  end
10
10
  end
11
11
 
12
- included { use_option(:klass) }
12
+ included { use_option :klass }
13
13
  end
14
14
 
@@ -15,7 +15,7 @@ module Promiscuous::Publisher::Lint::Polymorphic
15
15
  end
16
16
 
17
17
  included do
18
- use_option(:klass)
19
- use_option(:skip_polymorphic)
18
+ use_option :klass
19
+ use_option :skip_polymorphic
20
20
  end
21
21
  end
@@ -1,5 +1,3 @@
1
- require 'promiscuous/publisher/envelope'
2
-
3
1
  module Promiscuous::Publisher::Model
4
2
  extend ActiveSupport::Concern
5
3
  include Promiscuous::Publisher::Envelope
@@ -27,13 +25,15 @@ module Promiscuous::Publisher::Model
27
25
  end
28
26
 
29
27
  def hook_callbacks
30
- unless respond_to?(:promiscuous_publish_update)
31
- klass.class_eval do
32
- [:create, :update, :destroy].each do |operation|
33
- __send__("after_#{operation}", "promiscuous_publish_#{operation}".to_sym)
34
- define_method "promiscuous_publish_#{operation}" do
35
- self.class.promiscuous_publisher.new(:instance => self, :operation => operation).amqp_publish
36
- end
28
+ klass.class_eval do
29
+ cattr_accessor :publisher_operation_hooked
30
+ return if self.publisher_operation_hooked
31
+ self.publisher_operation_hooked = true
32
+
33
+ [:create, :update, :destroy].each do |operation|
34
+ __send__("after_#{operation}", "promiscuous_publish_#{operation}".to_sym)
35
+ define_method "promiscuous_publish_#{operation}" do
36
+ self.class.promiscuous_publisher.new(:instance => self, :operation => operation).amqp_publish
37
37
  end
38
38
  end
39
39
  end
@@ -1,25 +1,17 @@
1
- require 'promiscuous/publisher/base'
2
- require 'promiscuous/publisher/class_bind'
3
- require 'promiscuous/publisher/attributes'
4
- require 'promiscuous/publisher/polymorphic'
5
- require 'promiscuous/publisher/amqp'
6
- require 'promiscuous/publisher/envelope'
7
-
8
1
  class Promiscuous::Publisher::Mongoid < Promiscuous::Publisher::Base
9
- include Promiscuous::Publisher::ClassBind
2
+ autoload :Embedded, 'promiscuous/publisher/mongoid/embedded'
3
+
4
+ include Promiscuous::Publisher::Class
10
5
  include Promiscuous::Publisher::Attributes
11
6
  include Promiscuous::Publisher::Polymorphic
12
7
  include Promiscuous::Publisher::AMQP
13
- include Promiscuous::Publisher::Envelope
14
8
 
15
9
  def self.publish(options)
16
10
  super
17
11
 
18
12
  if klass.embedded?
19
- require 'promiscuous/publisher/mongoid/embedded'
20
13
  include Promiscuous::Publisher::Mongoid::Embedded
21
14
  else
22
- require 'promiscuous/publisher/model'
23
15
  include Promiscuous::Publisher::Model
24
16
  end
25
17
  end
@@ -1,5 +1,3 @@
1
- require 'promiscuous/publisher/envelope'
2
-
3
1
  module Promiscuous::Publisher::Polymorphic
4
2
  extend ActiveSupport::Concern
5
3
  include Promiscuous::Publisher::Envelope
@@ -7,16 +5,4 @@ module Promiscuous::Publisher::Polymorphic
7
5
  def payload
8
6
  super.merge(:type => instance.class.to_s)
9
7
  end
10
-
11
- module ClassMethods
12
- def publish(options)
13
- super
14
- self.descendants.each { |subclass| inherited(subclass) }
15
- end
16
-
17
- def inherited(subclass)
18
- super
19
- subclass.publish(options.merge(:inherited => true)) if published
20
- end
21
- end
22
8
  end
@@ -1,8 +1,15 @@
1
1
  module Promiscuous::Publisher
2
2
  autoload :ActiveRecord, 'promiscuous/publisher/active_record'
3
- autoload :Mongoid, 'promiscuous/publisher/mongoid'
4
- autoload :Mock, 'promiscuous/publisher/mock'
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'
5
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'
6
13
 
7
14
  def self.lint(*args)
8
15
  Lint.lint(*args)
@@ -1,12 +1,5 @@
1
- require 'promiscuous/subscriber/base'
2
- require 'promiscuous/subscriber/custom_class'
3
- require 'promiscuous/subscriber/attributes'
4
- require 'promiscuous/subscriber/amqp'
5
- require 'promiscuous/subscriber/model'
6
- require 'promiscuous/subscriber/upsert'
7
-
8
1
  class Promiscuous::Subscriber::ActiveRecord < Promiscuous::Subscriber::Base
9
- include Promiscuous::Subscriber::CustomClass
2
+ include Promiscuous::Subscriber::Class
10
3
  include Promiscuous::Subscriber::Attributes
11
4
  include Promiscuous::Subscriber::AMQP
12
5
  include Promiscuous::Subscriber::Model
@@ -1,5 +1,3 @@
1
- require 'promiscuous/subscriber/envelope'
2
-
3
1
  module Promiscuous::Subscriber::AMQP
4
2
  extend ActiveSupport::Concern
5
3
 
@@ -1,8 +1,7 @@
1
1
  class Promiscuous::Subscriber::Base
2
- attr_accessor :options
3
- class_attribute :options, :options_mappings, :instance_reader => false, :instance_writer => false
2
+ include Promiscuous::Common::Options
4
3
 
5
- self.options = self.options_mappings = {}
4
+ attr_accessor :options
6
5
 
7
6
  def initialize(options)
8
7
  self.options = options
@@ -21,26 +20,6 @@ class Promiscuous::Subscriber::Base
21
20
  end
22
21
 
23
22
  def self.subscribe(options)
24
- options.each do |attr, value|
25
- attr_alias = self.options_mappings[attr]
26
- self.__send__("#{attr_alias}=", value) if attr_alias
27
- end
28
- end
29
-
30
- def self.inherited(subclass)
31
- super
32
- subclass.options = self.options.dup
33
- end
34
-
35
- def self.use_option(attr, options={})
36
- attr_alias = options[:as].nil? ? attr : options[:as]
37
- self.options_mappings[attr] = attr_alias
38
-
39
- # We need to let all the modules overload these methods, which is
40
- # why we are injecting at the base level.
41
- Promiscuous::Subscriber::Base.singleton_class.class_eval do
42
- define_method("#{attr_alias}") { self.options[attr] }
43
- define_method("#{attr_alias}=") { |value| self.options[attr] = value }
44
- end
23
+ load_options(options)
45
24
  end
46
25
  end
@@ -1,12 +1,6 @@
1
- require 'promiscuous/subscriber/envelope'
2
-
3
- module Promiscuous::Subscriber::CustomClass
1
+ module Promiscuous::Subscriber::Class
4
2
  extend ActiveSupport::Concern
5
3
 
6
- def klass
7
- self.class.klass
8
- end
9
-
10
4
  def instance
11
5
  @instance ||= fetch
12
6
  end
@@ -17,7 +11,7 @@ module Promiscuous::Subscriber::CustomClass
17
11
  def klass
18
12
  if super
19
13
  "::#{super}".constantize
20
- else
14
+ elsif name
21
15
  class_name = "::#{name.split('::').last}"
22
16
  class_name = $1 if class_name =~ /^(.+)Subscriber$/
23
17
  class_name.constantize
@@ -1,5 +1,3 @@
1
- require 'promiscuous/subscriber/envelope'
2
-
3
1
  module Promiscuous::Subscriber::Model
4
2
  extend ActiveSupport::Concern
5
3
  include Promiscuous::Subscriber::Envelope
@@ -1,16 +1,10 @@
1
- require 'promiscuous/subscriber/base'
2
- require 'promiscuous/subscriber/custom_class'
3
- require 'promiscuous/subscriber/attributes'
4
- require 'promiscuous/subscriber/polymorphic'
5
- require 'promiscuous/subscriber/amqp'
6
- require 'promiscuous/subscriber/envelope'
7
-
8
1
  class Promiscuous::Subscriber::Mongoid < Promiscuous::Subscriber::Base
9
- include Promiscuous::Subscriber::CustomClass
2
+ autoload :Embedded, 'promiscuous/subscriber/mongoid/embedded'
3
+
4
+ include Promiscuous::Subscriber::Class
10
5
  include Promiscuous::Subscriber::Attributes
11
6
  include Promiscuous::Subscriber::Polymorphic
12
7
  include Promiscuous::Subscriber::AMQP
13
- include Promiscuous::Subscriber::Envelope
14
8
 
15
9
  def self.missing_record_exception
16
10
  Mongoid::Errors::DocumentNotFound
@@ -20,13 +14,9 @@ class Promiscuous::Subscriber::Mongoid < Promiscuous::Subscriber::Base
20
14
  super
21
15
 
22
16
  if klass.embedded?
23
- require 'promiscuous/subscriber/mongoid/embedded'
24
17
  include Promiscuous::Subscriber::Mongoid::Embedded
25
18
  else
26
- require 'promiscuous/subscriber/model'
27
19
  include Promiscuous::Subscriber::Model
28
-
29
- require 'promiscuous/subscriber/upsert'
30
20
  include Promiscuous::Subscriber::Upsert
31
21
  end
32
22
  end
@@ -1,5 +1,3 @@
1
- require 'promiscuous/subscriber/envelope'
2
-
3
1
  module Promiscuous::Subscriber::Polymorphic
4
2
  extend ActiveSupport::Concern
5
3
  include Promiscuous::Subscriber::Envelope
@@ -1,7 +1,15 @@
1
1
  module Promiscuous::Subscriber
2
2
  autoload :ActiveRecord, 'promiscuous/subscriber/active_record'
3
- autoload :Mongoid, 'promiscuous/subscriber/mongoid'
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'
4
8
  autoload :Error, 'promiscuous/subscriber/error'
9
+ autoload :Model, 'promiscuous/subscriber/model'
10
+ autoload :Mongoid, 'promiscuous/subscriber/mongoid'
11
+ autoload :Polymorphic, 'promiscuous/subscriber/polymorphic'
12
+ autoload :Upsert, 'promiscuous/subscriber/upsert'
5
13
 
6
14
  def self.get_subscriber_from(payload)
7
15
  sub = AMQP.subscriber_from(payload)
@@ -1,3 +1,3 @@
1
1
  module Promiscuous
2
- VERSION = '0.7.1'
2
+ VERSION = '0.7.2'
3
3
  end
data/lib/promiscuous.rb CHANGED
@@ -5,6 +5,7 @@ require 'promiscuous/loader'
5
5
  require 'promiscuous/railtie' if defined?(Rails)
6
6
 
7
7
  module Promiscuous
8
+ autoload :Common, 'promiscuous/common'
8
9
  autoload :Publisher, 'promiscuous/publisher'
9
10
  autoload :Subscriber, 'promiscuous/subscriber'
10
11
 
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.7.1
4
+ version: 0.7.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-08-19 00:00:00.000000000 Z
13
+ date: 2012-08-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: mongoid
@@ -117,13 +117,13 @@ extensions: []
117
117
  extra_rdoc_files: []
118
118
  files:
119
119
  - lib/promiscuous/version.rb
120
- - lib/promiscuous/publisher/class_bind.rb
120
+ - lib/promiscuous/common.rb
121
121
  - lib/promiscuous/publisher/lint.rb
122
122
  - lib/promiscuous/publisher/attributes.rb
123
+ - lib/promiscuous/publisher/class.rb
123
124
  - lib/promiscuous/publisher/mongoid.rb
124
125
  - lib/promiscuous/publisher/lint/class_bind.rb
125
126
  - lib/promiscuous/publisher/lint/attributes.rb
126
- - lib/promiscuous/publisher/lint/model.rb
127
127
  - lib/promiscuous/publisher/lint/amqp.rb
128
128
  - lib/promiscuous/publisher/lint/base.rb
129
129
  - lib/promiscuous/publisher/lint/polymorphic.rb
@@ -140,6 +140,7 @@ files:
140
140
  - lib/promiscuous/amqp/bunny.rb
141
141
  - lib/promiscuous/publisher.rb
142
142
  - lib/promiscuous/subscriber/attributes.rb
143
+ - lib/promiscuous/subscriber/class.rb
143
144
  - lib/promiscuous/subscriber/mongoid.rb
144
145
  - lib/promiscuous/subscriber/error.rb
145
146
  - lib/promiscuous/subscriber/mongoid/embedded.rb
@@ -148,9 +149,9 @@ files:
148
149
  - lib/promiscuous/subscriber/model.rb
149
150
  - lib/promiscuous/subscriber/envelope.rb
150
151
  - lib/promiscuous/subscriber/amqp.rb
151
- - lib/promiscuous/subscriber/custom_class.rb
152
152
  - lib/promiscuous/subscriber/base.rb
153
153
  - lib/promiscuous/subscriber/polymorphic.rb
154
+ - lib/promiscuous/common/options.rb
154
155
  - lib/promiscuous/worker.rb
155
156
  - lib/promiscuous/railtie/replicate.rake
156
157
  - lib/promiscuous/railtie.rb
@@ -1,27 +0,0 @@
1
- module Promiscuous::Publisher::ClassBind
2
- extend ActiveSupport::Concern
3
-
4
- module ClassMethods
5
- def publish(options)
6
- super
7
-
8
- unless options[:inherited] and options[:class]
9
- publisher_class = self
10
- klass.class_eval do
11
- class_attribute :promiscuous_publisher
12
- self.promiscuous_publisher = publisher_class
13
- end
14
- end
15
- end
16
-
17
- def klass
18
- if options[:class]
19
- "::#{options[:class]}".constantize
20
- else
21
- class_name = "::#{name.split('::').last}"
22
- class_name = $1 if class_name =~ /^(.+)Publisher$/
23
- class_name.constantize
24
- end
25
- end
26
- end
27
- end
@@ -1,3 +0,0 @@
1
-
2
- # 1. all the dep are covered
3
- # 2. all the attributes are covered