lazy_observers 0.0.2 → 0.0.3
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/Gemfile.lock +1 -1
- data/Readme.md +4 -6
- data/gemfiles/rails-2.3.gemfile.lock +1 -1
- data/gemfiles/rails-3.0.gemfile.lock +1 -1
- data/gemfiles/rails-3.2.gemfile.lock +1 -1
- data/lib/lazy_observers.rb +38 -23
- data/lib/lazy_observers/version.rb +1 -1
- data/spec/app/non_lazy_movie_observer.rb +19 -0
- data/spec/lazy_observers_spec.rb +7 -0
- metadata +5 -4
data/Gemfile.lock
CHANGED
data/Readme.md
CHANGED
@@ -2,8 +2,6 @@ Make Activerecord Observers not load observed models -> faster/safer environment
|
|
2
2
|
- faster tests + console
|
3
3
|
- able to boot environment without/with empty/with old database
|
4
4
|
|
5
|
-
Works on rails 2.3 + 3.0 (not yet 3.2)
|
6
|
-
|
7
5
|
Install
|
8
6
|
=======
|
9
7
|
|
@@ -39,10 +37,10 @@ Loads all classes registered via observers, to make sure you did not misspell</b
|
|
39
37
|
|
40
38
|
LazyObservers.check_classes
|
41
39
|
|
42
|
-
|
43
|
-
|
44
|
-
-
|
45
|
-
-
|
40
|
+
TIPS
|
41
|
+
====
|
42
|
+
- do not use observe and lazy_observe in the same observer (and if you have to, use observe after lay_observe)
|
43
|
+
- do not use Model classes with class-methods of the observer e.g. class FooObserver; Foo.something{}; def after_update; end; end
|
46
44
|
|
47
45
|
Author
|
48
46
|
======
|
data/lib/lazy_observers.rb
CHANGED
@@ -7,21 +7,24 @@ module LazyObservers
|
|
7
7
|
class_name = klass.name
|
8
8
|
loaded << [klass, class_name]
|
9
9
|
observers.each do |observer, observed|
|
10
|
-
connect!(observer, klass) if observed.include?(class_name)
|
10
|
+
connect!(observer.instance, klass) if observed.include?(class_name)
|
11
11
|
end
|
12
|
-
(
|
12
|
+
(on_load_callbacks[class_name]||[]).each{|block| block.call(klass) }
|
13
13
|
end
|
14
14
|
|
15
|
-
def self.
|
16
|
-
observers[observer] = classes
|
15
|
+
def self.register_observer_instance(observer, classes)
|
17
16
|
loaded.each do |klass, name|
|
18
17
|
connect!(observer, klass) if classes.include?(name)
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
21
|
+
def self.register_observer_class(observer, classes)
|
22
|
+
observers[observer] = classes
|
23
|
+
end
|
24
|
+
|
22
25
|
def self.on_load(class_name, &block)
|
23
|
-
|
24
|
-
|
26
|
+
on_load_callbacks[class_name] ||= []
|
27
|
+
on_load_callbacks[class_name] << block
|
25
28
|
end
|
26
29
|
|
27
30
|
# to check you did not specify a class that does not exist
|
@@ -35,7 +38,7 @@ module LazyObservers
|
|
35
38
|
|
36
39
|
private
|
37
40
|
|
38
|
-
def self.
|
41
|
+
def self.on_load_callbacks
|
39
42
|
@on_loads ||= {}
|
40
43
|
end
|
41
44
|
|
@@ -48,21 +51,12 @@ module LazyObservers
|
|
48
51
|
end
|
49
52
|
|
50
53
|
def self.connect!(observer, klass)
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
ActiveRecord::Base.send(:subclasses).each{|klass| LazyObservers.register_observed(klass) }
|
56
|
-
|
57
|
-
ActiveRecord::Observer.class_eval do
|
58
|
-
def self.lazy_observe(*classes)
|
59
|
-
raise "pass class names, not classes or symbols!" unless classes.all?{|klass| klass.is_a?(String) }
|
60
|
-
define_method(:observed_classes) { Set.new }
|
61
|
-
LazyObservers.register_observer self, classes
|
54
|
+
@connected ||= {}
|
55
|
+
return if @connected[[observer, klass]]
|
56
|
+
@connected[[observer, klass]] = true
|
57
|
+
observer.observed_class_inherited(klass)
|
62
58
|
end
|
63
|
-
end
|
64
59
|
|
65
|
-
module LazyObservers
|
66
60
|
module InheritedNotifier
|
67
61
|
def inherited(subclass)
|
68
62
|
LazyObservers.register_observed subclass
|
@@ -72,9 +66,9 @@ module LazyObservers
|
|
72
66
|
|
73
67
|
module InheritedDebugger
|
74
68
|
def inherited(subclass)
|
75
|
-
|
76
|
-
|
77
|
-
puts "##{
|
69
|
+
$lazy_observers_inherited_counter ||= 0
|
70
|
+
$lazy_observers_inherited_counter += 1
|
71
|
+
puts "##{$lazy_observers_inherited_counter} #{subclass}"
|
78
72
|
puts caller
|
79
73
|
puts "-" * 72
|
80
74
|
super
|
@@ -82,4 +76,25 @@ module LazyObservers
|
|
82
76
|
end
|
83
77
|
end
|
84
78
|
|
79
|
+
descendants = (ActiveRecord::VERSION::MAJOR > 2 ? :descendants : :subclasses)
|
80
|
+
ActiveRecord::Base.send(descendants).each{|klass| LazyObservers.register_observed(klass) }
|
81
|
+
|
82
|
+
ActiveRecord::Observer.class_eval do
|
83
|
+
def self.lazy_observe(*classes)
|
84
|
+
raise "pass class names, not classes or symbols!" unless classes.all?{|klass| klass.is_a?(String) }
|
85
|
+
define_method(:observed_classes) { Set.new } # prevent default of PostObserver -> Post
|
86
|
+
LazyObservers.register_observer_class self, classes
|
87
|
+
define_method(:lazy_observed_classes) { Set.new(classes) }
|
88
|
+
end
|
89
|
+
|
90
|
+
# since AR uses respond_to? on the observer we need our observer to be fully defined before registering
|
91
|
+
alias_method :initialize_without_lazy, :initialize
|
92
|
+
def initialize
|
93
|
+
initialize_without_lazy
|
94
|
+
if defined?(lazy_observed_classes)
|
95
|
+
LazyObservers.register_observer_instance(self, lazy_observed_classes)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
85
100
|
ActiveRecord::Base.send(:extend, LazyObservers::InheritedNotifier)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class NonLazyMovieObserver < ActiveRecord::Observer
|
2
|
+
observe Movie
|
3
|
+
|
4
|
+
def called
|
5
|
+
@called ||= []
|
6
|
+
end
|
7
|
+
|
8
|
+
def after_update(*args)
|
9
|
+
@called << [:after_update, args]
|
10
|
+
end
|
11
|
+
|
12
|
+
def after_save(*args)
|
13
|
+
@called << [:after_update, args]
|
14
|
+
end
|
15
|
+
|
16
|
+
def after_create(*args)
|
17
|
+
@called << [:after_create, args]
|
18
|
+
end
|
19
|
+
end
|
data/spec/lazy_observers_spec.rb
CHANGED
@@ -2,6 +2,7 @@ require "spec_helper"
|
|
2
2
|
require File.expand_path("../app/user_observer", __FILE__)
|
3
3
|
require File.expand_path("../app/post_observer", __FILE__)
|
4
4
|
require File.expand_path("../app/product_observer", __FILE__)
|
5
|
+
require File.expand_path("../app/non_lazy_movie_observer", __FILE__)
|
5
6
|
|
6
7
|
describe LazyObservers do
|
7
8
|
it "has a VERSION" do
|
@@ -61,6 +62,12 @@ describe LazyObservers do
|
|
61
62
|
}.to raise_error(/not classes or symbols/i)
|
62
63
|
end
|
63
64
|
|
65
|
+
it "does not break normal observers" do
|
66
|
+
NonLazyMovieObserver.instance.called.clear # in case other specs ran first
|
67
|
+
movie = Movie.create!
|
68
|
+
NonLazyMovieObserver.instance.called.should == [[:after_create, [movie]], [:after_update, [movie]]]
|
69
|
+
end
|
70
|
+
|
64
71
|
it "calls callback when matching class is loaded" do
|
65
72
|
loaded = []
|
66
73
|
LazyObservers.on_load("Group") do |klass|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lazy_observers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -52,6 +52,7 @@ files:
|
|
52
52
|
- spec/app/inherited_movie.rb
|
53
53
|
- spec/app/movie.rb
|
54
54
|
- spec/app/movie_observer.rb
|
55
|
+
- spec/app/non_lazy_movie_observer.rb
|
55
56
|
- spec/app/post.rb
|
56
57
|
- spec/app/post_observer.rb
|
57
58
|
- spec/app/product_observer.rb
|
@@ -76,7 +77,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
76
77
|
version: '0'
|
77
78
|
segments:
|
78
79
|
- 0
|
79
|
-
hash:
|
80
|
+
hash: 3011854085487653016
|
80
81
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
82
|
none: false
|
82
83
|
requirements:
|
@@ -85,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
86
|
version: '0'
|
86
87
|
segments:
|
87
88
|
- 0
|
88
|
-
hash:
|
89
|
+
hash: 3011854085487653016
|
89
90
|
requirements: []
|
90
91
|
rubyforge_project:
|
91
92
|
rubygems_version: 1.8.24
|