callback_skipper 0.3.1 → 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/.rvmrc +1 -1
- data/README.md +13 -0
- data/Rakefile +3 -0
- data/callback_skipper.gemspec +5 -1
- data/lib/callback_skipper.rb +15 -0
- data/lib/callback_skipper/version.rb +1 -1
- data/spec/lib/callback_skipper_spec.rb +69 -0
- data/spec/setup_database.rb +9 -0
- data/spec/spec_helper.rb +16 -0
- metadata +106 -65
data/.rvmrc
CHANGED
data/README.md
CHANGED
@@ -24,6 +24,19 @@ foo = Foo.new
|
|
24
24
|
foo.skip_callback :save, :after, :do_something_expensive
|
25
25
|
foo.save!
|
26
26
|
```
|
27
|
+
### Error handling
|
28
|
+
If the code attempts to skip an undefined callback, a **CallbackSkipper::CallbackMethodNotDefined** will be raised:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
# class Foo is defined above
|
32
|
+
foo = Foo.new
|
33
|
+
begin
|
34
|
+
foo.skip_callback :save ,:after, :method_that_is_not_defined
|
35
|
+
rescue CallbackSkipper::CallbackMethodNotDefined
|
36
|
+
puts "You should not skip callback methods that are not defined"
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
27
40
|
### Example: FactoryGirl Usage
|
28
41
|
|
29
42
|
https://github.com/thoughtbot/factory_girl
|
data/Rakefile
CHANGED
data/callback_skipper.gemspec
CHANGED
@@ -20,5 +20,9 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
# specify any dependencies here
|
22
22
|
s.add_runtime_dependency 'activerecord', ['>= 3.0']
|
23
|
-
s.add_development_dependency
|
23
|
+
s.add_development_dependency 'rake', ['0.9.2.2']
|
24
|
+
s.add_development_dependency('sqlite3', ['>= 1.3.5'])
|
25
|
+
s.add_development_dependency('rspec', ['>= 2.11.0'])
|
26
|
+
s.add_development_dependency('pry', ['>= 0'])
|
27
|
+
|
24
28
|
end
|
data/lib/callback_skipper.rb
CHANGED
@@ -2,10 +2,25 @@ require "callback_skipper/version"
|
|
2
2
|
|
3
3
|
module CallbackSkipper
|
4
4
|
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
class CallbackNotDefinedError < StandardError; end
|
7
|
+
|
8
|
+
# skip a specific callback for the given instance
|
9
|
+
# @raises CallbackNotDefinedError if no callback is found matching the requested callback
|
5
10
|
def skip_callback(*args)
|
11
|
+
raise CallbackNotDefinedError.new("Callback not defined matching: #{self.class.name} #{args}") unless callback_defined?(*args)
|
6
12
|
instance = self
|
7
13
|
args << {:if => lambda { self == instance }}
|
8
14
|
self.class.skip_callback *args
|
9
15
|
end
|
16
|
+
|
17
|
+
private
|
18
|
+
# asserts that the callback exists in the callback chain
|
19
|
+
# @param args [Array] array of options matching the set_callback signiture. first param is either the method name or the callback type (before/after/around)
|
20
|
+
def callback_defined?(name, *args)
|
21
|
+
callback_method_name = args[0].in?([:before, :after, :around]) ? args[1] : args[0]
|
22
|
+
self.send("_#{name}_callbacks").collect(&:filter).include?(callback_method_name)
|
23
|
+
end
|
10
24
|
end
|
25
|
+
|
11
26
|
ActiveRecord::Base.send :include, CallbackSkipper
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
|
3
|
+
describe CallbackSkipper do
|
4
|
+
describe "For an instance of ActiveRecord model with callbacks" do
|
5
|
+
|
6
|
+
class User < ActiveRecord::Base
|
7
|
+
around_create :do_around_create
|
8
|
+
after_save :do_after_save
|
9
|
+
before_validation :do_before_validation
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def do_around_create
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
def do_after_save
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
def do_before_validation
|
22
|
+
true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
before do
|
27
|
+
@user = User.new
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "when its saved while skipping all callbacks" do
|
31
|
+
before do
|
32
|
+
@user.skip_callback :save, :after, :do_after_save
|
33
|
+
@user.skip_callback :create, :around, :do_around_create
|
34
|
+
@user.skip_callback :validation, :before, :do_before_validation
|
35
|
+
end
|
36
|
+
it "should skip all validations" do
|
37
|
+
@user.should_receive(:do_after_save).never
|
38
|
+
@user.should_receive(:do_around_create).never
|
39
|
+
@user.should_receive(:do_before_validation).never
|
40
|
+
@user.save!
|
41
|
+
end
|
42
|
+
describe "when a new instance of user is assigned to the same variable that skipped callbacks before" do
|
43
|
+
before do
|
44
|
+
@user = User.new
|
45
|
+
end
|
46
|
+
it "should not skip validations upon saving" do
|
47
|
+
@user.should_receive(:do_after_save).once
|
48
|
+
@user.should_receive(:do_around_create).once
|
49
|
+
@user.should_receive(:do_before_validation).once
|
50
|
+
@user.save!
|
51
|
+
end
|
52
|
+
end
|
53
|
+
describe "when a new instance of user is initialized" do
|
54
|
+
before do
|
55
|
+
@another_user = User.new
|
56
|
+
end
|
57
|
+
it "should not skip validations upon saving" do
|
58
|
+
@another_user.should_receive(:do_after_save).once
|
59
|
+
@another_user.should_receive(:do_around_create).once
|
60
|
+
@another_user.should_receive(:do_before_validation).once
|
61
|
+
@another_user.save!
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
it "should through an error when attempting to skip an undefined callback" do
|
66
|
+
lambda { @user.skip_callback :save, :after, :method_that_doesnt_exist }.should raise_error CallbackSkipper::CallbackNotDefinedError
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
ActiveRecord::Base.establish_connection :adapter => "sqlite3", :database => ":memory:"
|
3
|
+
ActiveRecord::Schema.define(:version => 1) do
|
4
|
+
create_table :users, :force => true do |t|
|
5
|
+
t.column :name, :string
|
6
|
+
t.column :email, :string
|
7
|
+
t.column :password, :string
|
8
|
+
end
|
9
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'bundler/setup'
|
6
|
+
require 'rspec'
|
7
|
+
require 'active_record'
|
8
|
+
require 'pry'
|
9
|
+
|
10
|
+
require 'callback_skipper'
|
11
|
+
require 'setup_database'
|
12
|
+
|
13
|
+
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.mock_with :rspec
|
16
|
+
end
|
metadata
CHANGED
@@ -1,64 +1,103 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: callback_skipper
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 3
|
9
|
-
- 1
|
10
|
-
version: 0.3.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Ryan Sonnek
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
21
|
-
version_requirements: &id001 !ruby/object:Gem::Requirement
|
22
|
-
none: false
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
hash: 7
|
27
|
-
segments:
|
28
|
-
- 3
|
29
|
-
- 0
|
30
|
-
version: "3.0"
|
31
|
-
requirement: *id001
|
32
|
-
prerelease: false
|
12
|
+
date: 2012-08-29 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
33
15
|
name: activerecord
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.0'
|
34
22
|
type: :runtime
|
35
|
-
|
36
|
-
version_requirements:
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
37
33
|
none: false
|
38
|
-
requirements:
|
39
|
-
- -
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
hash: 11
|
42
|
-
segments:
|
43
|
-
- 0
|
44
|
-
- 9
|
45
|
-
- 2
|
46
|
-
- 2
|
34
|
+
requirements:
|
35
|
+
- - '='
|
36
|
+
- !ruby/object:Gem::Version
|
47
37
|
version: 0.9.2.2
|
48
|
-
|
38
|
+
type: :development
|
49
39
|
prerelease: false
|
50
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - '='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.9.2.2
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: sqlite3
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.3.5
|
51
54
|
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.3.5
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.11.0
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.11.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: pry
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
52
94
|
description: programatically skip ActiveRecord callbacks
|
53
|
-
email:
|
95
|
+
email:
|
54
96
|
- ryan@codecrate.com
|
55
97
|
executables: []
|
56
|
-
|
57
98
|
extensions: []
|
58
|
-
|
59
99
|
extra_rdoc_files: []
|
60
|
-
|
61
|
-
files:
|
100
|
+
files:
|
62
101
|
- .gitignore
|
63
102
|
- .rvmrc
|
64
103
|
- CONTRIBUTORS.txt
|
@@ -69,38 +108,40 @@ files:
|
|
69
108
|
- callback_skipper.gemspec
|
70
109
|
- lib/callback_skipper.rb
|
71
110
|
- lib/callback_skipper/version.rb
|
72
|
-
|
111
|
+
- spec/lib/callback_skipper_spec.rb
|
112
|
+
- spec/setup_database.rb
|
113
|
+
- spec/spec_helper.rb
|
114
|
+
homepage: ''
|
73
115
|
licenses: []
|
74
|
-
|
75
116
|
post_install_message:
|
76
117
|
rdoc_options: []
|
77
|
-
|
78
|
-
require_paths:
|
118
|
+
require_paths:
|
79
119
|
- lib
|
80
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
120
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
121
|
none: false
|
82
|
-
requirements:
|
83
|
-
- -
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
|
86
|
-
segments:
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
segments:
|
87
127
|
- 0
|
88
|
-
|
89
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
+
hash: 2424141270523251175
|
129
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
130
|
none: false
|
91
|
-
requirements:
|
92
|
-
- -
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
|
95
|
-
segments:
|
131
|
+
requirements:
|
132
|
+
- - ! '>='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
segments:
|
96
136
|
- 0
|
97
|
-
|
137
|
+
hash: 2424141270523251175
|
98
138
|
requirements: []
|
99
|
-
|
100
139
|
rubyforge_project: callback_skipper
|
101
|
-
rubygems_version: 1.8.
|
140
|
+
rubygems_version: 1.8.24
|
102
141
|
signing_key:
|
103
142
|
specification_version: 3
|
104
143
|
summary: Skip ActiveRecord callbacks
|
105
|
-
test_files:
|
106
|
-
|
144
|
+
test_files:
|
145
|
+
- spec/lib/callback_skipper_spec.rb
|
146
|
+
- spec/setup_database.rb
|
147
|
+
- spec/spec_helper.rb
|