rails-observers 0.1.0

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.
Files changed (40) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +11 -0
  3. data/LICENSE +22 -0
  4. data/README.md +102 -0
  5. data/Rakefile +34 -0
  6. data/lib/generators/active_record/observer/observer_generator.rb +17 -0
  7. data/lib/generators/active_record/observer/templates/observer.rb +4 -0
  8. data/lib/generators/rails/observer/USAGE +12 -0
  9. data/lib/generators/rails/observer/observer_generator.rb +7 -0
  10. data/lib/generators/test_unit/observer/observer_generator.rb +15 -0
  11. data/lib/generators/test_unit/observer/templates/unit_test.rb +9 -0
  12. data/lib/rails-observers.rb +30 -0
  13. data/lib/rails/observers/action_controller/caching.rb +12 -0
  14. data/lib/rails/observers/action_controller/caching/sweeping.rb +113 -0
  15. data/lib/rails/observers/active_model/active_model.rb +4 -0
  16. data/lib/rails/observers/active_model/observer_array.rb +152 -0
  17. data/lib/rails/observers/active_model/observing.rb +374 -0
  18. data/lib/rails/observers/activerecord/active_record.rb +5 -0
  19. data/lib/rails/observers/activerecord/base.rb +8 -0
  20. data/lib/rails/observers/activerecord/observer.rb +125 -0
  21. data/lib/rails/observers/version.rb +5 -0
  22. data/rails-observers.gemspec +26 -0
  23. data/test/configuration_test.rb +37 -0
  24. data/test/console_test.rb +38 -0
  25. data/test/fixtures/developers.yml +4 -0
  26. data/test/fixtures/minimalistics.yml +2 -0
  27. data/test/fixtures/topics.yml +41 -0
  28. data/test/generators/generators_test_helper.rb +16 -0
  29. data/test/generators/namespaced_generators_test.rb +34 -0
  30. data/test/generators/observer_generator_test.rb +33 -0
  31. data/test/helper.rb +74 -0
  32. data/test/isolation/abstract_unit.rb +108 -0
  33. data/test/lifecycle_test.rb +249 -0
  34. data/test/models/observers.rb +27 -0
  35. data/test/observer_array_test.rb +222 -0
  36. data/test/observing_test.rb +183 -0
  37. data/test/rake_test.rb +40 -0
  38. data/test/sweeper_test.rb +83 -0
  39. data/test/transaction_callbacks_test.rb +278 -0
  40. metadata +216 -0
@@ -0,0 +1,83 @@
1
+ require 'minitest/autorun'
2
+ require 'action_controller'
3
+ require 'active_record'
4
+ require 'rails/observers/activerecord/active_record'
5
+ require 'rails/observers/action_controller/caching'
6
+
7
+ SharedTestRoutes = ActionDispatch::Routing::RouteSet.new
8
+
9
+ class AppSweeper < ActionController::Caching::Sweeper; end
10
+
11
+ class SweeperTestController < ActionController::Base
12
+ include SharedTestRoutes.url_helpers
13
+
14
+ cache_sweeper :app_sweeper
15
+
16
+ def show
17
+ render text: 'hello world'
18
+ end
19
+
20
+ def error
21
+ raise StandardError.new
22
+ end
23
+ end
24
+
25
+ class SweeperTest < ActionController::TestCase
26
+ def setup
27
+ @routes = SharedTestRoutes
28
+
29
+ @routes.draw do
30
+ get ':controller(/:action)'
31
+ end
32
+
33
+ super
34
+ end
35
+
36
+ def test_sweeper_should_not_ignore_no_method_error
37
+ sweeper = ActionController::Caching::Sweeper.send(:new)
38
+ assert_raise NoMethodError do
39
+ sweeper.send_not_defined
40
+ end
41
+ end
42
+
43
+ def test_sweeper_should_not_block_rendering
44
+ response = test_process(SweeperTestController)
45
+ assert_equal 'hello world', response.body
46
+ end
47
+
48
+ def test_sweeper_should_clean_up_if_exception_is_raised
49
+ assert_raise StandardError do
50
+ test_process(SweeperTestController, 'error')
51
+ end
52
+ assert_nil AppSweeper.instance.controller
53
+ end
54
+
55
+ def test_before_method_of_sweeper_should_always_return_true
56
+ sweeper = ActionController::Caching::Sweeper.send(:new)
57
+ assert sweeper.before(SweeperTestController.new)
58
+ end
59
+
60
+ def test_after_method_of_sweeper_should_always_return_nil
61
+ sweeper = ActionController::Caching::Sweeper.send(:new)
62
+ assert_nil sweeper.after(SweeperTestController.new)
63
+ end
64
+
65
+ def test_sweeper_should_not_ignore_unknown_method_calls
66
+ sweeper = ActionController::Caching::Sweeper.send(:new)
67
+ assert_raise NameError do
68
+ sweeper.instance_eval do
69
+ some_method_that_doesnt_exist
70
+ end
71
+ end
72
+ end
73
+
74
+ private
75
+
76
+ def test_process(controller, action = "show")
77
+ @controller = controller.is_a?(Class) ? controller.new : controller
78
+ @request = ActionController::TestRequest.new
79
+ @response = ActionController::TestResponse.new
80
+
81
+ process(action)
82
+ end
83
+ end
@@ -0,0 +1,278 @@
1
+ require "helper"
2
+
3
+ class TransactionCallbacksTest < ActiveRecord::TestCase
4
+ self.use_transactional_fixtures = false
5
+ fixtures :topics
6
+
7
+ class TopicWithCallbacks < ActiveRecord::Base
8
+ self.table_name = :topics
9
+
10
+ after_commit{|record| record.send(:do_after_commit, nil)}
11
+ after_commit(:on => :create){|record| record.send(:do_after_commit, :create)}
12
+ after_commit(:on => :update){|record| record.send(:do_after_commit, :update)}
13
+ after_commit(:on => :destroy){|record| record.send(:do_after_commit, :destroy)}
14
+ after_rollback{|record| record.send(:do_after_rollback, nil)}
15
+ after_rollback(:on => :create){|record| record.send(:do_after_rollback, :create)}
16
+ after_rollback(:on => :update){|record| record.send(:do_after_rollback, :update)}
17
+ after_rollback(:on => :destroy){|record| record.send(:do_after_rollback, :destroy)}
18
+
19
+ def history
20
+ @history ||= []
21
+ end
22
+
23
+ def after_commit_block(on = nil, &block)
24
+ @after_commit ||= {}
25
+ @after_commit[on] ||= []
26
+ @after_commit[on] << block
27
+ end
28
+
29
+ def after_rollback_block(on = nil, &block)
30
+ @after_rollback ||= {}
31
+ @after_rollback[on] ||= []
32
+ @after_rollback[on] << block
33
+ end
34
+
35
+ def do_after_commit(on)
36
+ blocks = @after_commit[on] if defined?(@after_commit)
37
+ blocks.each{|b| b.call(self)} if blocks
38
+ end
39
+
40
+ def do_after_rollback(on)
41
+ blocks = @after_rollback[on] if defined?(@after_rollback)
42
+ blocks.each{|b| b.call(self)} if blocks
43
+ end
44
+ end
45
+
46
+ def setup
47
+ @first, @second = TopicWithCallbacks.find(1, 3).sort_by { |t| t.id }
48
+ end
49
+
50
+ def test_call_after_commit_after_transaction_commits
51
+ @first.after_commit_block{|r| r.history << :after_commit}
52
+ @first.after_rollback_block{|r| r.history << :after_rollback}
53
+
54
+ @first.save!
55
+ assert_equal [:after_commit], @first.history
56
+ end
57
+
58
+ def test_only_call_after_commit_on_update_after_transaction_commits_for_existing_record
59
+ @first.after_commit_block(:create){|r| r.history << :commit_on_create}
60
+ @first.after_commit_block(:update){|r| r.history << :commit_on_update}
61
+ @first.after_commit_block(:destroy){|r| r.history << :commit_on_destroy}
62
+ @first.after_rollback_block(:create){|r| r.history << :rollback_on_create}
63
+ @first.after_rollback_block(:update){|r| r.history << :rollback_on_update}
64
+ @first.after_rollback_block(:destroy){|r| r.history << :rollback_on_destroy}
65
+
66
+ @first.save!
67
+ assert_equal [:commit_on_update], @first.history
68
+ end
69
+
70
+ def test_only_call_after_commit_on_destroy_after_transaction_commits_for_destroyed_record
71
+ @first.after_commit_block(:create){|r| r.history << :commit_on_create}
72
+ @first.after_commit_block(:update){|r| r.history << :commit_on_update}
73
+ @first.after_commit_block(:destroy){|r| r.history << :commit_on_destroy}
74
+ @first.after_rollback_block(:create){|r| r.history << :rollback_on_create}
75
+ @first.after_rollback_block(:update){|r| r.history << :rollback_on_update}
76
+ @first.after_rollback_block(:destroy){|r| r.history << :rollback_on_destroy}
77
+
78
+ @first.destroy
79
+ assert_equal [:commit_on_destroy], @first.history
80
+ end
81
+
82
+ def test_only_call_after_commit_on_create_after_transaction_commits_for_new_record
83
+ @new_record = TopicWithCallbacks.new(:title => "New topic", :written_on => Date.today)
84
+ @new_record.after_commit_block(:create){|r| r.history << :commit_on_create}
85
+ @new_record.after_commit_block(:update){|r| r.history << :commit_on_update}
86
+ @new_record.after_commit_block(:destroy){|r| r.history << :commit_on_destroy}
87
+ @new_record.after_rollback_block(:create){|r| r.history << :rollback_on_create}
88
+ @new_record.after_rollback_block(:update){|r| r.history << :rollback_on_update}
89
+ @new_record.after_rollback_block(:destroy){|r| r.history << :rollback_on_destroy}
90
+
91
+ @new_record.save!
92
+ assert_equal [:commit_on_create], @new_record.history
93
+ end
94
+
95
+ def test_call_after_rollback_after_transaction_rollsback
96
+ @first.after_commit_block{|r| r.history << :after_commit}
97
+ @first.after_rollback_block{|r| r.history << :after_rollback}
98
+
99
+ Topic.transaction do
100
+ @first.save!
101
+ raise ActiveRecord::Rollback
102
+ end
103
+
104
+ assert_equal [:after_rollback], @first.history
105
+ end
106
+
107
+ def test_only_call_after_rollback_on_update_after_transaction_rollsback_for_existing_record
108
+ @first.after_commit_block(:create){|r| r.history << :commit_on_create}
109
+ @first.after_commit_block(:update){|r| r.history << :commit_on_update}
110
+ @first.after_commit_block(:destroy){|r| r.history << :commit_on_destroy}
111
+ @first.after_rollback_block(:create){|r| r.history << :rollback_on_create}
112
+ @first.after_rollback_block(:update){|r| r.history << :rollback_on_update}
113
+ @first.after_rollback_block(:destroy){|r| r.history << :rollback_on_destroy}
114
+
115
+ Topic.transaction do
116
+ @first.save!
117
+ raise ActiveRecord::Rollback
118
+ end
119
+
120
+ assert_equal [:rollback_on_update], @first.history
121
+ end
122
+
123
+ def test_only_call_after_rollback_on_destroy_after_transaction_rollsback_for_destroyed_record
124
+ @first.after_commit_block(:create){|r| r.history << :commit_on_create}
125
+ @first.after_commit_block(:update){|r| r.history << :commit_on_update}
126
+ @first.after_commit_block(:destroy){|r| r.history << :commit_on_update}
127
+ @first.after_rollback_block(:create){|r| r.history << :rollback_on_create}
128
+ @first.after_rollback_block(:update){|r| r.history << :rollback_on_update}
129
+ @first.after_rollback_block(:destroy){|r| r.history << :rollback_on_destroy}
130
+
131
+ Topic.transaction do
132
+ @first.destroy
133
+ raise ActiveRecord::Rollback
134
+ end
135
+
136
+ assert_equal [:rollback_on_destroy], @first.history
137
+ end
138
+
139
+ def test_only_call_after_rollback_on_create_after_transaction_rollsback_for_new_record
140
+ @new_record = TopicWithCallbacks.new(:title => "New topic", :written_on => Date.today)
141
+ @new_record.after_commit_block(:create){|r| r.history << :commit_on_create}
142
+ @new_record.after_commit_block(:update){|r| r.history << :commit_on_update}
143
+ @new_record.after_commit_block(:destroy){|r| r.history << :commit_on_destroy}
144
+ @new_record.after_rollback_block(:create){|r| r.history << :rollback_on_create}
145
+ @new_record.after_rollback_block(:update){|r| r.history << :rollback_on_update}
146
+ @new_record.after_rollback_block(:destroy){|r| r.history << :rollback_on_destroy}
147
+
148
+ Topic.transaction do
149
+ @new_record.save!
150
+ raise ActiveRecord::Rollback
151
+ end
152
+
153
+ assert_equal [:rollback_on_create], @new_record.history
154
+ end
155
+
156
+ def test_call_after_rollback_when_commit_fails
157
+ @first.connection.class.send(:alias_method, :real_method_commit_db_transaction, :commit_db_transaction)
158
+ begin
159
+ @first.connection.class.class_eval do
160
+ def commit_db_transaction; raise "boom!"; end
161
+ end
162
+
163
+ @first.after_commit_block{|r| r.history << :after_commit}
164
+ @first.after_rollback_block{|r| r.history << :after_rollback}
165
+
166
+ assert !@first.save rescue nil
167
+ assert_equal [:after_rollback], @first.history
168
+ ensure
169
+ @first.connection.class.send(:remove_method, :commit_db_transaction)
170
+ @first.connection.class.send(:alias_method, :commit_db_transaction, :real_method_commit_db_transaction)
171
+ end
172
+ end
173
+
174
+ def test_only_call_after_rollback_on_records_rolled_back_to_a_savepoint
175
+ def @first.rollbacks(i=0); @rollbacks ||= 0; @rollbacks += i if i; end
176
+ def @first.commits(i=0); @commits ||= 0; @commits += i if i; end
177
+ @first.after_rollback_block{|r| r.rollbacks(1)}
178
+ @first.after_commit_block{|r| r.commits(1)}
179
+
180
+ def @second.rollbacks(i=0); @rollbacks ||= 0; @rollbacks += i if i; end
181
+ def @second.commits(i=0); @commits ||= 0; @commits += i if i; end
182
+ @second.after_rollback_block{|r| r.rollbacks(1)}
183
+ @second.after_commit_block{|r| r.commits(1)}
184
+
185
+ Topic.transaction do
186
+ @first.save!
187
+ Topic.transaction(:requires_new => true) do
188
+ @second.save!
189
+ raise ActiveRecord::Rollback
190
+ end
191
+ end
192
+
193
+ assert_equal 1, @first.commits
194
+ assert_equal 0, @first.rollbacks
195
+ assert_equal 0, @second.commits
196
+ assert_equal 1, @second.rollbacks
197
+ end
198
+
199
+ def test_only_call_after_rollback_on_records_rolled_back_to_a_savepoint_when_release_savepoint_fails
200
+ def @first.rollbacks(i=0); @rollbacks ||= 0; @rollbacks += i if i; end
201
+ def @first.commits(i=0); @commits ||= 0; @commits += i if i; end
202
+
203
+ @first.after_rollback_block{|r| r.rollbacks(1)}
204
+ @first.after_commit_block{|r| r.commits(1)}
205
+
206
+ Topic.transaction do
207
+ @first.save
208
+ Topic.transaction(:requires_new => true) do
209
+ @first.save!
210
+ raise ActiveRecord::Rollback
211
+ end
212
+ Topic.transaction(:requires_new => true) do
213
+ @first.save!
214
+ raise ActiveRecord::Rollback
215
+ end
216
+ end
217
+
218
+ assert_equal 1, @first.commits
219
+ assert_equal 2, @first.rollbacks
220
+ end
221
+
222
+ def test_after_transaction_callbacks_should_prevent_callbacks_from_being_called
223
+ def @first.last_after_transaction_error=(e); @last_transaction_error = e; end
224
+ def @first.last_after_transaction_error; @last_transaction_error; end
225
+ @first.after_commit_block{|r| r.last_after_transaction_error = :commit; raise "fail!";}
226
+ @first.after_rollback_block{|r| r.last_after_transaction_error = :rollback; raise "fail!";}
227
+ @second.after_commit_block{|r| r.history << :after_commit}
228
+ @second.after_rollback_block{|r| r.history << :after_rollback}
229
+
230
+ Topic.transaction do
231
+ @first.save!
232
+ @second.save!
233
+ end
234
+ assert_equal :commit, @first.last_after_transaction_error
235
+ assert_equal [:after_commit], @second.history
236
+
237
+ @second.history.clear
238
+ Topic.transaction do
239
+ @first.save!
240
+ @second.save!
241
+ raise ActiveRecord::Rollback
242
+ end
243
+ assert_equal :rollback, @first.last_after_transaction_error
244
+ assert_equal [:after_rollback], @second.history
245
+ end
246
+ end
247
+
248
+
249
+ class SaveFromAfterCommitBlockTest < ActiveRecord::TestCase
250
+ self.use_transactional_fixtures = false
251
+
252
+ class TopicWithSaveInCallback < ActiveRecord::Base
253
+ self.table_name = :topics
254
+ after_commit :cache_topic, :on => :create
255
+ after_commit :call_update, :on => :update
256
+ attr_accessor :cached, :record_updated
257
+
258
+ def call_update
259
+ self.record_updated = true
260
+ end
261
+
262
+ def cache_topic
263
+ unless cached
264
+ self.cached = true
265
+ self.save
266
+ else
267
+ self.cached = false
268
+ end
269
+ end
270
+ end
271
+
272
+ def test_after_commit_in_save
273
+ topic = TopicWithSaveInCallback.new()
274
+ topic.save
275
+ assert_equal true, topic.cached
276
+ assert_equal true, topic.record_updated
277
+ end
278
+ end
metadata ADDED
@@ -0,0 +1,216 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails-observers
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Rafael Mendonça França
9
+ - Steve Klabnik
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-11-28 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: railties
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: 4.0.0.beta
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ version: 4.0.0.beta
31
+ - !ruby/object:Gem::Dependency
32
+ name: minitest
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '3'
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '3'
47
+ - !ruby/object:Gem::Dependency
48
+ name: activerecord
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 4.0.0.beta
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 4.0.0.beta
63
+ - !ruby/object:Gem::Dependency
64
+ name: activemodel
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: 4.0.0.beta
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 4.0.0.beta
79
+ - !ruby/object:Gem::Dependency
80
+ name: actionmailer
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ~>
85
+ - !ruby/object:Gem::Version
86
+ version: 4.0.0.beta
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: 4.0.0.beta
95
+ - !ruby/object:Gem::Dependency
96
+ name: actionpack
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ~>
101
+ - !ruby/object:Gem::Version
102
+ version: 4.0.0.beta
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 4.0.0.beta
111
+ - !ruby/object:Gem::Dependency
112
+ name: sqlite3
113
+ requirement: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ~>
117
+ - !ruby/object:Gem::Version
118
+ version: '1.3'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ~>
125
+ - !ruby/object:Gem::Version
126
+ version: '1.3'
127
+ description: Rails observer (removed from core in Rails 4.0)
128
+ email:
129
+ - rafaelmfranca@gmail.com
130
+ - steve@steveklabnik.com
131
+ executables: []
132
+ extensions: []
133
+ extra_rdoc_files: []
134
+ files:
135
+ - .gitignore
136
+ - Gemfile
137
+ - LICENSE
138
+ - README.md
139
+ - Rakefile
140
+ - lib/generators/active_record/observer/observer_generator.rb
141
+ - lib/generators/active_record/observer/templates/observer.rb
142
+ - lib/generators/rails/observer/USAGE
143
+ - lib/generators/rails/observer/observer_generator.rb
144
+ - lib/generators/test_unit/observer/observer_generator.rb
145
+ - lib/generators/test_unit/observer/templates/unit_test.rb
146
+ - lib/rails-observers.rb
147
+ - lib/rails/observers/action_controller/caching.rb
148
+ - lib/rails/observers/action_controller/caching/sweeping.rb
149
+ - lib/rails/observers/active_model/active_model.rb
150
+ - lib/rails/observers/active_model/observer_array.rb
151
+ - lib/rails/observers/active_model/observing.rb
152
+ - lib/rails/observers/activerecord/active_record.rb
153
+ - lib/rails/observers/activerecord/base.rb
154
+ - lib/rails/observers/activerecord/observer.rb
155
+ - lib/rails/observers/version.rb
156
+ - rails-observers.gemspec
157
+ - test/configuration_test.rb
158
+ - test/console_test.rb
159
+ - test/fixtures/developers.yml
160
+ - test/fixtures/minimalistics.yml
161
+ - test/fixtures/topics.yml
162
+ - test/generators/generators_test_helper.rb
163
+ - test/generators/namespaced_generators_test.rb
164
+ - test/generators/observer_generator_test.rb
165
+ - test/helper.rb
166
+ - test/isolation/abstract_unit.rb
167
+ - test/lifecycle_test.rb
168
+ - test/models/observers.rb
169
+ - test/observer_array_test.rb
170
+ - test/observing_test.rb
171
+ - test/rake_test.rb
172
+ - test/sweeper_test.rb
173
+ - test/transaction_callbacks_test.rb
174
+ homepage: https://github.com/rails/rails-observers
175
+ licenses: []
176
+ post_install_message:
177
+ rdoc_options: []
178
+ require_paths:
179
+ - lib
180
+ required_ruby_version: !ruby/object:Gem::Requirement
181
+ none: false
182
+ requirements:
183
+ - - ! '>='
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ required_rubygems_version: !ruby/object:Gem::Requirement
187
+ none: false
188
+ requirements:
189
+ - - ! '>='
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ requirements: []
193
+ rubyforge_project:
194
+ rubygems_version: 1.8.23
195
+ signing_key:
196
+ specification_version: 3
197
+ summary: ActiveModel::Observer, ActiveRecord::Observer and ActionController::Caching::Sweeper
198
+ extracted from Rails.
199
+ test_files:
200
+ - test/configuration_test.rb
201
+ - test/console_test.rb
202
+ - test/fixtures/developers.yml
203
+ - test/fixtures/minimalistics.yml
204
+ - test/fixtures/topics.yml
205
+ - test/generators/generators_test_helper.rb
206
+ - test/generators/namespaced_generators_test.rb
207
+ - test/generators/observer_generator_test.rb
208
+ - test/helper.rb
209
+ - test/isolation/abstract_unit.rb
210
+ - test/lifecycle_test.rb
211
+ - test/models/observers.rb
212
+ - test/observer_array_test.rb
213
+ - test/observing_test.rb
214
+ - test/rake_test.rb
215
+ - test/sweeper_test.rb
216
+ - test/transaction_callbacks_test.rb