no_peeping_toms 1.0.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.
- data/README +40 -0
- data/Rakefile +21 -0
- data/VERSION +1 -0
- data/init.rb +1 -0
- data/install.rb +1 -0
- data/lib/no_peeping_toms.rb +32 -0
- data/no_peeping_toms.gemspec +55 -0
- data/spec/db/database.yml +3 -0
- data/spec/db/schema.rb +5 -0
- data/spec/no_peeping_toms_spec.rb +118 -0
- data/spec/spec_helper.rb +8 -0
- data/tasks/no_peeping_toms_tasks.rake +4 -0
- data/uninstall.rb +1 -0
- metadata +80 -0
data/README
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
no_peeping_toms
|
2
|
+
=============
|
3
|
+
|
4
|
+
This plugin disables observers in your specs, so that model specs can run in complete isolation.
|
5
|
+
|
6
|
+
You can choose to run some code with observers turned on. This is useful when spec'ing an observer. For example, if you write the following observer:
|
7
|
+
|
8
|
+
class PersonObserver < ActiveRecord::Observer
|
9
|
+
def before_update(person)
|
10
|
+
old_person = Person.find person.id
|
11
|
+
if old_person.name != person.name
|
12
|
+
NameChange.create! :person => person, :old_name => old_person.name, :new_name => person.name
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
You can spec the Person class in complete isolation.
|
18
|
+
|
19
|
+
describe Person, " when changing a name" do
|
20
|
+
before(:each) do
|
21
|
+
@person = Person.create! :name => "Pat Maddox"
|
22
|
+
end
|
23
|
+
|
24
|
+
# By default, don't run any observers
|
25
|
+
it "should not register a name change" do
|
26
|
+
lambda { @person.update_attribute :name, "Don Juan Demarco" }.should_not change(NameChange, :count)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Run only a portion of code with certain observers turned on
|
30
|
+
it "should register a name change with the person observer turned on" do
|
31
|
+
Person.with_observers(:person_observer) do
|
32
|
+
lambda { @person.update_attribute :name, "Don Juan Demarco" }.should change(NameChange, :count).by(1)
|
33
|
+
end
|
34
|
+
|
35
|
+
lambda { @person.update_attribute :name, "Man Without a Name" }.should_not change(NameChange, :count)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
Copyright (c) 2007 Pat Maddox, released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require 'jeweler'
|
3
|
+
rescue LoadError
|
4
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
5
|
+
exit 1
|
6
|
+
end
|
7
|
+
require 'rake/testtask'
|
8
|
+
require 'rake/rdoctask'
|
9
|
+
require 'rcov/rcovtask'
|
10
|
+
require "load_multi_rails_rake_tasks"
|
11
|
+
|
12
|
+
Jeweler::Tasks.new do |s|
|
13
|
+
s.name = "no_peeping_toms"
|
14
|
+
s.summary = "Disables observers during testing, allowing you to write model tests that are completely decoupled from the observer."
|
15
|
+
s.description = s.summary
|
16
|
+
s.email = "pat.maddox@gmail.com"
|
17
|
+
s.homepage = "http://github.com/pat-maddox"
|
18
|
+
s.authors = ["Pat Maddox", "Brandon Keepers"]
|
19
|
+
s.add_dependency "activerecord", ['>= 1.1']
|
20
|
+
s.test_files = Dir['spec/**/*']
|
21
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'no_peeping_toms' if "test" == RAILS_ENV
|
data/install.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Install hook code here
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module NoPeepingToms
|
2
|
+
def self.included(base)
|
3
|
+
base.send :include, NoPeepingToms::InstanceMethods
|
4
|
+
base.extend NoPeepingToms::ClassMethods
|
5
|
+
base.alias_method_chain :update, :neighborhood_watch
|
6
|
+
base.cattr_accessor :allow_peeping_toms, :peeping_toms
|
7
|
+
base.allow_peeping_toms = false
|
8
|
+
base.peeping_toms = [] # toms that are allowed to peep
|
9
|
+
end
|
10
|
+
|
11
|
+
module InstanceMethods
|
12
|
+
def update_with_neighborhood_watch(*args)
|
13
|
+
puts "calling tom's #update: #{*args.inspect} -- #{self.class.allow_peeping_toms}"
|
14
|
+
if self.class.allow_peeping_toms || self.class.peeping_toms.include?(self)
|
15
|
+
update_without_neighborhood_watch(*args)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module ClassMethods
|
21
|
+
def with_observers(*observer_syms)
|
22
|
+
self.peeping_toms = Array(observer_syms).map do |o|
|
23
|
+
o.respond_to?(:instance) ? o.instance : o.to_s.classify.constantize.instance
|
24
|
+
end
|
25
|
+
yield
|
26
|
+
ensure
|
27
|
+
self.peeping_toms.clear
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
ActiveRecord::Observer.send :include, NoPeepingToms
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{no_peeping_toms}
|
5
|
+
s.version = "1.0.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Pat Maddox", "Brandon Keepers"]
|
9
|
+
s.date = %q{2009-08-17}
|
10
|
+
s.description = %q{Disables observers during testing, allowing you to write model tests that are completely decoupled from the observer.}
|
11
|
+
s.email = %q{pat.maddox@gmail.com}
|
12
|
+
s.extra_rdoc_files = [
|
13
|
+
"README"
|
14
|
+
]
|
15
|
+
s.files = [
|
16
|
+
"README",
|
17
|
+
"Rakefile",
|
18
|
+
"VERSION",
|
19
|
+
"init.rb",
|
20
|
+
"install.rb",
|
21
|
+
"lib/no_peeping_toms.rb",
|
22
|
+
"no_peeping_toms.gemspec",
|
23
|
+
"spec/db/database.yml",
|
24
|
+
"spec/db/schema.rb",
|
25
|
+
"spec/no_peeping_toms_spec.rb",
|
26
|
+
"spec/spec_helper.rb",
|
27
|
+
"tasks/no_peeping_toms_tasks.rake",
|
28
|
+
"uninstall.rb"
|
29
|
+
]
|
30
|
+
s.homepage = %q{http://github.com/pat-maddox}
|
31
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
32
|
+
s.require_paths = ["lib"]
|
33
|
+
s.rubygems_version = %q{1.3.3}
|
34
|
+
s.summary = %q{Disables observers during testing, allowing you to write model tests that are completely decoupled from the observer.}
|
35
|
+
s.test_files = [
|
36
|
+
"spec/db",
|
37
|
+
"spec/db/database.yml",
|
38
|
+
"spec/db/schema.rb",
|
39
|
+
"spec/no_peeping_toms_spec.rb",
|
40
|
+
"spec/spec_helper.rb"
|
41
|
+
]
|
42
|
+
|
43
|
+
if s.respond_to? :specification_version then
|
44
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
45
|
+
s.specification_version = 3
|
46
|
+
|
47
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
48
|
+
s.add_runtime_dependency(%q<activerecord>, [">= 1.1"])
|
49
|
+
else
|
50
|
+
s.add_dependency(%q<activerecord>, [">= 1.1"])
|
51
|
+
end
|
52
|
+
else
|
53
|
+
s.add_dependency(%q<activerecord>, [">= 1.1"])
|
54
|
+
end
|
55
|
+
end
|
data/spec/db/schema.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
module NoPeepingTomsSpec
|
4
|
+
class Person < ActiveRecord::Base; end
|
5
|
+
|
6
|
+
class PersonObserver < ActiveRecord::Observer
|
7
|
+
def before_update(person)
|
8
|
+
$observer_called_names.push person.name
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class AnotherObserver < ActiveRecord::Observer
|
13
|
+
observe Person
|
14
|
+
def before_update(person)
|
15
|
+
$calls_to_another_observer += 1
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe Person, " when changing a name" do
|
20
|
+
before(:each) do
|
21
|
+
$observer_called_names = []
|
22
|
+
$calls_to_another_observer = 0
|
23
|
+
@person = Person.create! :name => "Pat Maddox"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should not register a name change" do
|
27
|
+
@person.update_attribute :name, "Name change"
|
28
|
+
$observer_called_names.pop.should be_blank
|
29
|
+
$calls_to_another_observer.should == 0
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should register a name change with the person observer turned on by name" do
|
33
|
+
ActiveRecord::Observer.with_observers("NoPeepingTomsSpec::PersonObserver") do
|
34
|
+
@person.update_attribute :name, "Name change"
|
35
|
+
$observer_called_names.pop.should == "Name change"
|
36
|
+
end
|
37
|
+
|
38
|
+
@person.update_attribute :name, "Man Without a Name"
|
39
|
+
$observer_called_names.pop.should be_blank
|
40
|
+
|
41
|
+
$calls_to_another_observer.should == 0
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should register a name change with the person observer turned on by class reference" do
|
45
|
+
ActiveRecord::Observer.with_observers(NoPeepingTomsSpec::PersonObserver) do
|
46
|
+
@person.update_attribute :name, "Name change"
|
47
|
+
$observer_called_names.pop.should == "Name change"
|
48
|
+
end
|
49
|
+
|
50
|
+
@person.update_attribute :name, "Man Without a Name"
|
51
|
+
$observer_called_names.pop.should be_blank
|
52
|
+
|
53
|
+
$calls_to_another_observer.should == 0
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should register a name change with an anonymous observer" do
|
57
|
+
observer = Class.new(ActiveRecord::Observer) do
|
58
|
+
observe NoPeepingTomsSpec::Person
|
59
|
+
def before_update(person)
|
60
|
+
$observer_called_names.push person.name
|
61
|
+
end
|
62
|
+
end
|
63
|
+
ActiveRecord::Observer.with_observers(observer) do
|
64
|
+
@person.update_attribute :name, "Name change"
|
65
|
+
$observer_called_names.pop.should == "Name change"
|
66
|
+
end
|
67
|
+
|
68
|
+
@person.update_attribute :name, "Man Without a Name"
|
69
|
+
$observer_called_names.pop.should be_blank
|
70
|
+
|
71
|
+
$calls_to_another_observer.should == 0
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
it "should handle multiple observers" do
|
76
|
+
ActiveRecord::Observer.with_observers("NoPeepingTomsSpec::PersonObserver", "NoPeepingTomsSpec::AnotherObserver") do
|
77
|
+
@person.update_attribute :name, "Name change"
|
78
|
+
$observer_called_names.pop.should == "Name change"
|
79
|
+
end
|
80
|
+
|
81
|
+
@person.update_attribute :name, "Man Without a Name"
|
82
|
+
$observer_called_names.pop.should be_blank
|
83
|
+
|
84
|
+
$calls_to_another_observer.should == 1
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should handle multiple anonymous observers" do
|
88
|
+
observer1 = Class.new(ActiveRecord::Observer) do
|
89
|
+
observe NoPeepingTomsSpec::Person
|
90
|
+
def before_update(person) ; $observer_called_names.push "#{person.name} 1" ; end
|
91
|
+
end
|
92
|
+
observer2 = Class.new(ActiveRecord::Observer) do
|
93
|
+
observe NoPeepingTomsSpec::Person
|
94
|
+
def before_update(person) ; $observer_called_names.push "#{person.name} 2" ; end
|
95
|
+
end
|
96
|
+
|
97
|
+
ActiveRecord::Observer.with_observers(observer1, observer2) do
|
98
|
+
@person.update_attribute :name, "Name change"
|
99
|
+
$observer_called_names.pop.should == "Name change 2"
|
100
|
+
$observer_called_names.pop.should == "Name change 1"
|
101
|
+
end
|
102
|
+
|
103
|
+
@person.update_attribute :name, "Man Without a Name"
|
104
|
+
$observer_called_names.pop.should be_blank
|
105
|
+
|
106
|
+
$calls_to_another_observer.should == 0
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should ensure peeping toms are reset after raised exception" do
|
110
|
+
lambda {
|
111
|
+
ActiveRecord::Observer.with_observers(NoPeepingTomsSpec::PersonObserver) do
|
112
|
+
raise ArgumentError, "Michael, I've made a huge mistake"
|
113
|
+
end
|
114
|
+
}.should raise_error(ArgumentError)
|
115
|
+
ActiveRecord::Observer.peeping_toms.should == []
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../../spec/spec_helper'
|
2
|
+
|
3
|
+
plugin_spec_dir = File.dirname(__FILE__)
|
4
|
+
ActiveRecord::Base.logger = Logger.new(plugin_spec_dir + "/debug.log")
|
5
|
+
|
6
|
+
databases = YAML::load(IO.read(plugin_spec_dir + "/db/database.yml"))
|
7
|
+
ActiveRecord::Base.establish_connection(databases[ENV["DB"] || "sqlite3"])
|
8
|
+
load(File.join(plugin_spec_dir, "db", "schema.rb"))
|
data/uninstall.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Uninstall hook code here
|
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: no_peeping_toms
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Pat Maddox
|
8
|
+
- Brandon Keepers
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2009-08-17 00:00:00 -04:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: activerecord
|
18
|
+
type: :runtime
|
19
|
+
version_requirement:
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: "1.1"
|
25
|
+
version:
|
26
|
+
description: Disables observers during testing, allowing you to write model tests that are completely decoupled from the observer.
|
27
|
+
email: pat.maddox@gmail.com
|
28
|
+
executables: []
|
29
|
+
|
30
|
+
extensions: []
|
31
|
+
|
32
|
+
extra_rdoc_files:
|
33
|
+
- README
|
34
|
+
files:
|
35
|
+
- README
|
36
|
+
- Rakefile
|
37
|
+
- VERSION
|
38
|
+
- init.rb
|
39
|
+
- install.rb
|
40
|
+
- lib/no_peeping_toms.rb
|
41
|
+
- no_peeping_toms.gemspec
|
42
|
+
- spec/db/database.yml
|
43
|
+
- spec/db/schema.rb
|
44
|
+
- spec/no_peeping_toms_spec.rb
|
45
|
+
- spec/spec_helper.rb
|
46
|
+
- tasks/no_peeping_toms_tasks.rake
|
47
|
+
- uninstall.rb
|
48
|
+
has_rdoc: true
|
49
|
+
homepage: http://github.com/pat-maddox
|
50
|
+
licenses: []
|
51
|
+
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options:
|
54
|
+
- --charset=UTF-8
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: "0"
|
62
|
+
version:
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: "0"
|
68
|
+
version:
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 1.3.3
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: Disables observers during testing, allowing you to write model tests that are completely decoupled from the observer.
|
76
|
+
test_files:
|
77
|
+
- spec/db/database.yml
|
78
|
+
- spec/db/schema.rb
|
79
|
+
- spec/no_peeping_toms_spec.rb
|
80
|
+
- spec/spec_helper.rb
|