active_model_listener 0.2.4 → 0.2.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 +2 -1
- data/README.md +11 -22
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/active_model_listener.gemspec +2 -2
- data/lib/active_model_listener/active_model_listener.rb +2 -1
- data/spec/active_model_listener_spec.rb +58 -11
- metadata +3 -2
data/CHANGELOG
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
2010-05-14
|
2
|
-
- fixed annoying 'activerecord' deprecation warning
|
2
|
+
- fixed annoying 'activerecord' deprecation warning (thanks to Todd Persen)
|
3
|
+
- ActiveModelListener.listeners << now takes a string to play well with Rails in development mode (Peter Jaros)
|
3
4
|
|
4
5
|
2009-10-26
|
5
6
|
- you no longer have to define all 3 callback methods in callback classes
|
data/README.md
CHANGED
@@ -4,13 +4,6 @@ Simple, global ActiveRecord event observers, using a middleware architecture, th
|
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
|
-
The gem is hosted at gemcutter. You can either add gemcutter as a source, or you can make gemcutter your default source (recommended):
|
8
|
-
|
9
|
-
gem install gemcutter
|
10
|
-
gem tumble
|
11
|
-
|
12
|
-
Then, install it like any other gem:
|
13
|
-
|
14
7
|
gem install active_model_listener
|
15
8
|
|
16
9
|
## Usage
|
@@ -28,32 +21,28 @@ Add the listeners to the ActiveModelListener in an initializer:
|
|
28
21
|
# config/initializers/active_model_listener.rb
|
29
22
|
ActiveModelListener.listeners << ActivityFeedListener
|
30
23
|
|
31
|
-
|
24
|
+
NOTE: you can also use a string or symbol version of the class. The following are all equivalent:
|
25
|
+
|
26
|
+
ActiveModelListener.listeners << ActivityFeedListener
|
27
|
+
ActiveModelListener.listeners << "ActivityFeedListener"
|
28
|
+
ActiveModelListener.listeners << "activity_feed_listener"
|
29
|
+
ActiveModelListener.listeners << :activity_feed_listener
|
30
|
+
|
31
|
+
Then, create a listener class that defines methods for after_create, after_update and/or after_destroy:
|
32
32
|
|
33
33
|
class ActivityFeedListener
|
34
34
|
class << self
|
35
35
|
def after_create(record)
|
36
|
-
|
37
|
-
publish_activity_feed_items record, description
|
36
|
+
# do stuff
|
38
37
|
end
|
39
38
|
|
40
39
|
def after_update(record)
|
41
|
-
|
42
|
-
publish_activity_feed_items record, description
|
40
|
+
# do stuff
|
43
41
|
end
|
44
42
|
|
45
43
|
def after_destroy(record)
|
46
|
-
|
47
|
-
publish_activity_feed_items record, description
|
48
|
-
end
|
49
|
-
|
50
|
-
def publish_activity_feed_items(record, description)
|
51
|
-
record.activity_feed_item_subscribers.each do |subscriber|
|
52
|
-
ActivityFeedItem.create :user => subscriber, :description => description
|
53
|
-
end
|
44
|
+
# do stuff
|
54
45
|
end
|
55
|
-
|
56
|
-
private :publish_activity_feed_items
|
57
46
|
end
|
58
47
|
end
|
59
48
|
|
data/Rakefile
CHANGED
@@ -8,7 +8,7 @@ begin
|
|
8
8
|
gem.summary = %Q{Simple, global ActiveRecord event observers, using a middleware architecture, that can easily be turned on and off. Designed for audit trails, activity feeds and other app-level event handlers}
|
9
9
|
gem.email = "jeff@zilkey.com"
|
10
10
|
gem.homepage = "http://github.com/zilkey/active_model_listener"
|
11
|
-
gem.authors = ["Jeff Dean"]
|
11
|
+
gem.authors = ["Jeff Dean", "Peter Jaros"]
|
12
12
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
13
13
|
end
|
14
14
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.5
|
@@ -5,10 +5,10 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{active_model_listener}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Jeff Dean"]
|
11
|
+
s.authors = ["Jeff Dean", "Peter Jaros"]
|
12
12
|
s.date = %q{2010-05-14}
|
13
13
|
s.email = %q{jeff@zilkey.com}
|
14
14
|
s.extra_rdoc_files = [
|
@@ -13,7 +13,8 @@ class ActiveModelListener
|
|
13
13
|
method_name = "after_#{action}"
|
14
14
|
self.listeners.each do |listener|
|
15
15
|
without_listeners do
|
16
|
-
|
16
|
+
listener_object = listener.to_s.classify.constantize
|
17
|
+
listener_object.send method_name, object if listener_object.respond_to?(method_name)
|
17
18
|
end
|
18
19
|
end
|
19
20
|
end
|
@@ -4,8 +4,10 @@ class GenericListener
|
|
4
4
|
def self.after_create(object)
|
5
5
|
object.class.create
|
6
6
|
end
|
7
|
+
|
7
8
|
def self.after_update(object)
|
8
9
|
end
|
10
|
+
|
9
11
|
def self.after_destroy(object)
|
10
12
|
end
|
11
13
|
end
|
@@ -19,9 +21,6 @@ end
|
|
19
21
|
class BarListener < GenericListener
|
20
22
|
end
|
21
23
|
|
22
|
-
class BazListener < GenericListener
|
23
|
-
end
|
24
|
-
|
25
24
|
describe ActiveModelListener do
|
26
25
|
before do
|
27
26
|
build_model :articles do
|
@@ -32,11 +31,14 @@ describe ActiveModelListener do
|
|
32
31
|
end
|
33
32
|
|
34
33
|
ActiveModelListener.listeners.clear
|
35
|
-
ActiveModelListener.listeners << FooListener
|
36
|
-
ActiveModelListener.listeners << BarListener
|
37
34
|
end
|
38
35
|
|
39
36
|
describe "with_listeners" do
|
37
|
+
before do
|
38
|
+
ActiveModelListener.listeners << FooListener
|
39
|
+
ActiveModelListener.listeners << BarListener
|
40
|
+
end
|
41
|
+
|
40
42
|
it "only fires those listeners that are present" do
|
41
43
|
FooListener.should_receive(:after_create)
|
42
44
|
BarListener.should_not_receive(:after_create)
|
@@ -58,6 +60,11 @@ describe ActiveModelListener do
|
|
58
60
|
end
|
59
61
|
|
60
62
|
describe "without_listeners" do
|
63
|
+
before do
|
64
|
+
ActiveModelListener.listeners << FooListener
|
65
|
+
ActiveModelListener.listeners << BarListener
|
66
|
+
end
|
67
|
+
|
61
68
|
it "fires no listeners" do
|
62
69
|
FooListener.should_not_receive(:after_create)
|
63
70
|
BarListener.should_not_receive(:after_create)
|
@@ -69,6 +76,11 @@ describe ActiveModelListener do
|
|
69
76
|
end
|
70
77
|
|
71
78
|
describe "callback methods" do
|
79
|
+
before do
|
80
|
+
ActiveModelListener.listeners << FooListener
|
81
|
+
ActiveModelListener.listeners << BarListener
|
82
|
+
end
|
83
|
+
|
72
84
|
it "should turn off other listeners" do
|
73
85
|
FooListener.should_receive(:after_create).once
|
74
86
|
Article.create! :title => "foo"
|
@@ -81,7 +93,12 @@ describe ActiveModelListener do
|
|
81
93
|
end
|
82
94
|
|
83
95
|
describe "after create" do
|
84
|
-
|
96
|
+
before do
|
97
|
+
ActiveModelListener.listeners << FooListener
|
98
|
+
ActiveModelListener.listeners << BarListener
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should fire all wired up events" do
|
85
102
|
FooListener.should_receive(:after_create)
|
86
103
|
BarListener.should_receive(:after_create)
|
87
104
|
Article.create! :title => "foo"
|
@@ -89,7 +106,12 @@ describe ActiveModelListener do
|
|
89
106
|
end
|
90
107
|
|
91
108
|
describe "after update" do
|
92
|
-
|
109
|
+
before do
|
110
|
+
ActiveModelListener.listeners << FooListener
|
111
|
+
ActiveModelListener.listeners << BarListener
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should fire all wired up events" do
|
93
115
|
article = Article.create
|
94
116
|
FooListener.should_receive(:after_update).with(article)
|
95
117
|
BarListener.should_receive(:after_update).with(article)
|
@@ -98,7 +120,12 @@ describe ActiveModelListener do
|
|
98
120
|
end
|
99
121
|
|
100
122
|
describe "after destroy" do
|
101
|
-
|
123
|
+
before do
|
124
|
+
ActiveModelListener.listeners << FooListener
|
125
|
+
ActiveModelListener.listeners << BarListener
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should fire all wired up events" do
|
102
129
|
article = Article.create
|
103
130
|
FooListener.should_receive(:after_destroy).with(article)
|
104
131
|
BarListener.should_receive(:after_destroy).with(article)
|
@@ -108,11 +135,10 @@ describe ActiveModelListener do
|
|
108
135
|
|
109
136
|
describe "a listener with missing methods" do
|
110
137
|
before do
|
111
|
-
ActiveModelListener.listeners.clear
|
112
138
|
ActiveModelListener.listeners << SimpleListener
|
113
139
|
end
|
114
|
-
|
115
|
-
it "should not fire
|
140
|
+
|
141
|
+
it "should not fire the missing methods" do
|
116
142
|
article = Article.create
|
117
143
|
proc do
|
118
144
|
article.destroy
|
@@ -120,4 +146,25 @@ describe ActiveModelListener do
|
|
120
146
|
end
|
121
147
|
end
|
122
148
|
|
149
|
+
describe "a listener with missing methods" do
|
150
|
+
before do
|
151
|
+
ActiveModelListener.listeners << SimpleListener
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should not fire the missing methods" do
|
155
|
+
article = Article.create
|
156
|
+
proc do
|
157
|
+
article.destroy
|
158
|
+
end.should_not raise_error
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
["FooListener", :foo_listener, "foo_listener"].each do |name|
|
163
|
+
it "work when specifying with a format like #{name}" do
|
164
|
+
ActiveModelListener.listeners << name
|
165
|
+
FooListener.should_receive(:after_create)
|
166
|
+
Article.create
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
123
170
|
end
|