promiscuous 0.6.6 → 0.7
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/README.md +1 -1
- data/lib/promiscuous/loader.rb +11 -6
- data/lib/promiscuous/publisher.rb +5 -0
- data/lib/promiscuous/publisher/attributes.rb +12 -5
- data/lib/promiscuous/publisher/base.rb +4 -2
- data/lib/promiscuous/publisher/class_bind.rb +16 -4
- data/lib/promiscuous/publisher/lint.rb +29 -0
- data/lib/promiscuous/publisher/lint/amqp.rb +14 -0
- data/lib/promiscuous/publisher/lint/attributes.rb +14 -0
- data/lib/promiscuous/publisher/lint/base.rb +22 -0
- data/lib/promiscuous/publisher/lint/class_bind.rb +14 -0
- data/lib/promiscuous/publisher/lint/model.rb +3 -0
- data/lib/promiscuous/publisher/lint/polymorphic.rb +21 -0
- data/lib/promiscuous/publisher/model.rb +14 -7
- data/lib/promiscuous/publisher/mongoid.rb +2 -4
- data/lib/promiscuous/publisher/mongoid/embedded.rb +11 -15
- data/lib/promiscuous/publisher/polymorphic.rb +12 -0
- data/lib/promiscuous/railtie.rb +4 -1
- data/lib/promiscuous/version.rb +1 -1
- metadata +10 -5
- data/lib/promiscuous/subscriber/generic.rb +0 -14
- data/lib/promiscuous/subscriber/mongoid/root.rb +0 -6
data/README.md
CHANGED
|
@@ -29,7 +29,7 @@ Promiscuous::AMQP.configure(:app => 'crowdtap',
|
|
|
29
29
|
# publisher
|
|
30
30
|
class ModelPublisher < Promiscuous::Publisher::Mongoid
|
|
31
31
|
publish :to => 'crowdtap/model',
|
|
32
|
-
:class => Model,
|
|
32
|
+
:class => :Model,
|
|
33
33
|
:attributes => [:field_1, :field_2, :field_3]
|
|
34
34
|
end
|
|
35
35
|
```
|
data/lib/promiscuous/loader.rb
CHANGED
|
@@ -3,12 +3,8 @@ module Promiscuous
|
|
|
3
3
|
def self.load_descriptors(descriptors=[:publishers, :subscribers])
|
|
4
4
|
[descriptors].flatten.each do |descriptor|
|
|
5
5
|
dir, file_matcher = case descriptor
|
|
6
|
-
when :publishers
|
|
7
|
-
|
|
8
|
-
%w(publishers **_publisher.rb)
|
|
9
|
-
when :subscribers
|
|
10
|
-
Promiscuous::Subscriber.subscribers.clear
|
|
11
|
-
%w(subscribers **_subscriber.rb)
|
|
6
|
+
when :publishers then %w(publishers **_publisher.rb)
|
|
7
|
+
when :subscribers then %w(subscribers **_subscriber.rb)
|
|
12
8
|
end
|
|
13
9
|
|
|
14
10
|
Dir[Rails.root.join('app', dir, file_matcher)].map do |file|
|
|
@@ -16,5 +12,14 @@ module Promiscuous
|
|
|
16
12
|
end
|
|
17
13
|
end
|
|
18
14
|
end
|
|
15
|
+
|
|
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.subscribers.clear
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
19
24
|
end
|
|
20
25
|
end
|
|
@@ -2,4 +2,9 @@ module Promiscuous::Publisher
|
|
|
2
2
|
autoload :ActiveRecord, 'promiscuous/publisher/active_record'
|
|
3
3
|
autoload :Mongoid, 'promiscuous/publisher/mongoid'
|
|
4
4
|
autoload :Mock, 'promiscuous/publisher/mock'
|
|
5
|
+
autoload :Lint, 'promiscuous/publisher/lint'
|
|
6
|
+
|
|
7
|
+
def self.lint(*args)
|
|
8
|
+
Lint.lint(*args)
|
|
9
|
+
end
|
|
5
10
|
end
|
|
@@ -4,11 +4,7 @@ module Promiscuous::Publisher::Attributes
|
|
|
4
4
|
def payload
|
|
5
5
|
return nil unless include_attributes?
|
|
6
6
|
|
|
7
|
-
Hash[attributes.map
|
|
8
|
-
optional = field.to_s[-1] == '?'
|
|
9
|
-
field = field.to_s[0...-1].to_sym if optional
|
|
10
|
-
[field, payload_for(field)] if !optional || instance.respond_to?(field)
|
|
11
|
-
end]
|
|
7
|
+
Hash[attributes.map { |field| [field, payload_for(field)] }]
|
|
12
8
|
end
|
|
13
9
|
|
|
14
10
|
def payload_for(field)
|
|
@@ -25,4 +21,15 @@ module Promiscuous::Publisher::Attributes
|
|
|
25
21
|
end
|
|
26
22
|
|
|
27
23
|
included { use_option :attributes }
|
|
24
|
+
|
|
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)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
28
35
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
class Promiscuous::Publisher::Base
|
|
2
2
|
attr_accessor :options
|
|
3
|
-
class_attribute :options
|
|
3
|
+
class_attribute :options, :published
|
|
4
|
+
self.options = {}
|
|
4
5
|
|
|
5
6
|
def initialize(options)
|
|
6
7
|
self.options = options
|
|
@@ -11,7 +12,8 @@ class Promiscuous::Publisher::Base
|
|
|
11
12
|
end
|
|
12
13
|
|
|
13
14
|
def self.publish(options)
|
|
14
|
-
self.options = options
|
|
15
|
+
self.options = self.options.merge(options)
|
|
16
|
+
self.published = true
|
|
15
17
|
end
|
|
16
18
|
|
|
17
19
|
def self.use_option(attr)
|
|
@@ -5,10 +5,22 @@ module Promiscuous::Publisher::ClassBind
|
|
|
5
5
|
def publish(options)
|
|
6
6
|
super
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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].to_s.constantize
|
|
20
|
+
else
|
|
21
|
+
class_name = "::#{name.split('::').last}"
|
|
22
|
+
class_name = $1 if class_name =~ /^(.+)Publisher$/
|
|
23
|
+
class_name.constantize
|
|
12
24
|
end
|
|
13
25
|
end
|
|
14
26
|
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Promiscuous::Publisher::Lint
|
|
2
|
+
autoload :Base, 'promiscuous/publisher/lint/base'
|
|
3
|
+
autoload :ClassBind, 'promiscuous/publisher/lint/class_bind'
|
|
4
|
+
autoload :Attributes, 'promiscuous/publisher/lint/attributes'
|
|
5
|
+
autoload :Polymorphic, 'promiscuous/publisher/lint/polymorphic'
|
|
6
|
+
autoload :AMQP, 'promiscuous/publisher/lint/amqp'
|
|
7
|
+
|
|
8
|
+
def self.get_publisher(klass)
|
|
9
|
+
unless klass.respond_to?(:promiscuous_publisher)
|
|
10
|
+
raise "#{klass} has no publisher"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
klass.promiscuous_publisher
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.lint(classes)
|
|
17
|
+
classes.each do |klass, to|
|
|
18
|
+
pub = get_publisher(klass)
|
|
19
|
+
|
|
20
|
+
lint = Class.new(Base)
|
|
21
|
+
lint.__send__(:include, ClassBind) if pub.include?(Promiscuous::Publisher::ClassBind)
|
|
22
|
+
lint.__send__(:include, Attributes) if pub.include?(Promiscuous::Publisher::Attributes)
|
|
23
|
+
lint.__send__(:include, Polymorphic) if pub.include?(Promiscuous::Publisher::Polymorphic)
|
|
24
|
+
lint.__send__(:include, AMQP) if pub.include?(Promiscuous::Publisher::AMQP)
|
|
25
|
+
lint.new(:klass => klass, :publisher => pub, :to => to).lint
|
|
26
|
+
end
|
|
27
|
+
true
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Promiscuous::Publisher::Lint::AMQP
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
def lint
|
|
5
|
+
super
|
|
6
|
+
|
|
7
|
+
pub_to = publisher_instance.to
|
|
8
|
+
if pub_to != to
|
|
9
|
+
raise "#{publisher} publishes #{klass} to #{pub_to} instead of #{to}"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
included { use_option(:to) }
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Promiscuous::Publisher::Lint::Attributes
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
def lint
|
|
5
|
+
super
|
|
6
|
+
|
|
7
|
+
instance = klass.new
|
|
8
|
+
publisher.options[:attributes].each do |attr|
|
|
9
|
+
instance.respond_to?(attr) or instance.__send__(attr)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
included { use_option(:klass) }
|
|
14
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class Promiscuous::Publisher::Lint::Base
|
|
2
|
+
attr_accessor :options
|
|
3
|
+
|
|
4
|
+
def initialize(options)
|
|
5
|
+
self.options = options
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def publisher_instance
|
|
9
|
+
@publisher_instance ||= publisher.new({})
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def lint
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.use_option(attr)
|
|
16
|
+
define_method(attr) do
|
|
17
|
+
self.options[attr]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
use_option(:publisher)
|
|
22
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Promiscuous::Publisher::Lint::Polymorphic
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
def lint
|
|
5
|
+
super
|
|
6
|
+
|
|
7
|
+
unless skip_polymorphic
|
|
8
|
+
klass.descendants.each do |subclass|
|
|
9
|
+
pub = Promiscuous::Publisher::Lint.get_publisher(subclass)
|
|
10
|
+
self.class.new(options.merge(:klass => subclass,
|
|
11
|
+
:publisher => pub,
|
|
12
|
+
:skip_polymorphic => true)).lint
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
included do
|
|
18
|
+
use_option(:klass)
|
|
19
|
+
use_option(:skip_polymorphic)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -16,20 +16,27 @@ module Promiscuous::Publisher::Model
|
|
|
16
16
|
operation != :destroy
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
+
included do
|
|
20
|
+
hook_callbacks if published
|
|
21
|
+
end
|
|
22
|
+
|
|
19
23
|
module ClassMethods
|
|
20
24
|
def publish(options)
|
|
21
25
|
super
|
|
26
|
+
hook_callbacks
|
|
27
|
+
end
|
|
22
28
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
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
|
|
29
37
|
end
|
|
30
38
|
end
|
|
31
39
|
end
|
|
32
40
|
end
|
|
33
41
|
end
|
|
34
42
|
end
|
|
35
|
-
|
|
@@ -13,16 +13,14 @@ class Promiscuous::Publisher::Mongoid < Promiscuous::Publisher::Base
|
|
|
13
13
|
include Promiscuous::Publisher::Envelope
|
|
14
14
|
|
|
15
15
|
def self.publish(options)
|
|
16
|
-
|
|
16
|
+
super
|
|
17
17
|
|
|
18
|
-
if
|
|
18
|
+
if klass.embedded?
|
|
19
19
|
require 'promiscuous/publisher/mongoid/embedded'
|
|
20
20
|
include Promiscuous::Publisher::Mongoid::Embedded
|
|
21
21
|
else
|
|
22
22
|
require 'promiscuous/publisher/model'
|
|
23
23
|
include Promiscuous::Publisher::Model
|
|
24
24
|
end
|
|
25
|
-
|
|
26
|
-
self.publish(options.merge(:mongoid_loaded => true))
|
|
27
25
|
end
|
|
28
26
|
end
|
|
@@ -5,23 +5,19 @@ module Promiscuous::Publisher::Mongoid::Embedded
|
|
|
5
5
|
super.merge(:id => instance.id)
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
_parent.save
|
|
16
|
-
_parent.reload # mongoid is not that smart, so we need to reload here.
|
|
17
|
-
_parent.promiscuous_publish_update
|
|
18
|
-
end
|
|
8
|
+
included do
|
|
9
|
+
klass.class_eval do
|
|
10
|
+
callback = proc do
|
|
11
|
+
if _parent.respond_to?(:promiscuous_publish_update)
|
|
12
|
+
_parent.save
|
|
13
|
+
_parent.reload # mongoid is not that smart, so we need to reload here.
|
|
14
|
+
_parent.promiscuous_publish_update
|
|
19
15
|
end
|
|
20
|
-
|
|
21
|
-
after_create callback
|
|
22
|
-
after_update callback
|
|
23
|
-
after_destroy callback
|
|
24
16
|
end
|
|
17
|
+
|
|
18
|
+
after_create callback
|
|
19
|
+
after_update callback
|
|
20
|
+
after_destroy callback
|
|
25
21
|
end
|
|
26
22
|
end
|
|
27
23
|
end
|
|
@@ -7,4 +7,16 @@ module Promiscuous::Publisher::Polymorphic
|
|
|
7
7
|
def payload
|
|
8
8
|
super.merge(:type => instance.class.to_s)
|
|
9
9
|
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
|
|
10
22
|
end
|
data/lib/promiscuous/railtie.rb
CHANGED
|
@@ -6,7 +6,10 @@ module Promiscuous
|
|
|
6
6
|
config.after_initialize do
|
|
7
7
|
Promiscuous::Loader.load_descriptors(:publishers)
|
|
8
8
|
ActionDispatch::Reloader.to_prepare do
|
|
9
|
-
Promiscuous::Loader.load_descriptors
|
|
9
|
+
Promiscuous::Loader.load_descriptors
|
|
10
|
+
end
|
|
11
|
+
ActionDispatch::Reloader.to_cleanup do
|
|
12
|
+
Promiscuous::Loader.unload_descriptors
|
|
10
13
|
end
|
|
11
14
|
end
|
|
12
15
|
end
|
data/lib/promiscuous/version.rb
CHANGED
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.
|
|
4
|
+
version: '0.7'
|
|
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-
|
|
13
|
+
date: 2012-08-19 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: mongoid
|
|
@@ -118,8 +118,15 @@ extra_rdoc_files: []
|
|
|
118
118
|
files:
|
|
119
119
|
- lib/promiscuous/version.rb
|
|
120
120
|
- lib/promiscuous/publisher/class_bind.rb
|
|
121
|
+
- lib/promiscuous/publisher/lint.rb
|
|
121
122
|
- lib/promiscuous/publisher/attributes.rb
|
|
122
123
|
- lib/promiscuous/publisher/mongoid.rb
|
|
124
|
+
- lib/promiscuous/publisher/lint/class_bind.rb
|
|
125
|
+
- lib/promiscuous/publisher/lint/attributes.rb
|
|
126
|
+
- lib/promiscuous/publisher/lint/model.rb
|
|
127
|
+
- lib/promiscuous/publisher/lint/amqp.rb
|
|
128
|
+
- lib/promiscuous/publisher/lint/base.rb
|
|
129
|
+
- lib/promiscuous/publisher/lint/polymorphic.rb
|
|
123
130
|
- lib/promiscuous/publisher/mongoid/embedded.rb
|
|
124
131
|
- lib/promiscuous/publisher/active_record.rb
|
|
125
132
|
- lib/promiscuous/publisher/model.rb
|
|
@@ -135,8 +142,6 @@ files:
|
|
|
135
142
|
- lib/promiscuous/subscriber/attributes.rb
|
|
136
143
|
- lib/promiscuous/subscriber/mongoid.rb
|
|
137
144
|
- lib/promiscuous/subscriber/error.rb
|
|
138
|
-
- lib/promiscuous/subscriber/generic.rb
|
|
139
|
-
- lib/promiscuous/subscriber/mongoid/root.rb
|
|
140
145
|
- lib/promiscuous/subscriber/mongoid/embedded.rb
|
|
141
146
|
- lib/promiscuous/subscriber/active_record.rb
|
|
142
147
|
- lib/promiscuous/subscriber/upsert.rb
|
|
@@ -175,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
175
180
|
version: '0'
|
|
176
181
|
requirements: []
|
|
177
182
|
rubyforge_project:
|
|
178
|
-
rubygems_version: 1.8.
|
|
183
|
+
rubygems_version: 1.8.24
|
|
179
184
|
signing_key:
|
|
180
185
|
specification_version: 3
|
|
181
186
|
summary: Model replication over RabbitMQ
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
require 'promiscuous/subscriber/custom_class'
|
|
2
|
-
require 'promiscuous/subscriber/base'
|
|
3
|
-
require 'promiscuous/subscriber/attributes'
|
|
4
|
-
require 'promiscuous/subscriber/polymorphic'
|
|
5
|
-
require 'promiscuous/subscriber/amqp'
|
|
6
|
-
require 'promiscuous/subscriber/envelope'
|
|
7
|
-
|
|
8
|
-
class Promiscuous::Subscriber::Generic < Promiscuous::Subscriber::Base
|
|
9
|
-
include Promiscuous::Subscriber::CustomClass
|
|
10
|
-
include Promiscuous::Subscriber::Attributes
|
|
11
|
-
include Promiscuous::Subscriber::Polymorphic
|
|
12
|
-
include Promiscuous::Subscriber::AMQP
|
|
13
|
-
include Promiscuous::Subscriber::Envelope
|
|
14
|
-
end
|