hold_please 0.0.2
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.
- checksums.yaml +7 -0
- data/lib/hold_please.rb +18 -0
- data/lib/hold_please/active_record/base.rb +25 -0
- data/lib/hold_please/version.rb +3 -0
- data/test/gems/fake_gem.rb +21 -0
- data/test/lib/hold_please/active_record/base_test.rb +45 -0
- data/test/test_helper.rb +8 -0
- metadata +110 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b5c783fb7f16f18631542bec22a9747fb092cbd1
|
4
|
+
data.tar.gz: 3a88a312513d340b9ec476046f56e073ac7267cb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b8f6b1929f7698e788d4cd78eef701bfeb82d22b05a448b2d5a623fac09223630a63d3a483d6d80a701f640ca475c247625645bab2ae2f2c4ee3c43f513bd264
|
7
|
+
data.tar.gz: 789163c93e597689e98ac849ba7a4182ab1f071a0ca21dc4fb64da18d7bdfd5d95f84a4a06c68d528c56c92c196ea3f1a0bebc7cd2b61efc7f26ce68b683c3cb
|
data/lib/hold_please.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "hold_please/version"
|
2
|
+
require "hold_please/active_record/base"
|
3
|
+
|
4
|
+
module HoldPlease
|
5
|
+
|
6
|
+
class NoCallbacks < StandardError
|
7
|
+
|
8
|
+
def to_s
|
9
|
+
"You really shouldn't use ActiveRecord callbacks"
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.caller_is_probably_within_a_gem?(caller)
|
15
|
+
/\/gems\//.match(caller[0])
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "active_record"
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
class Base
|
5
|
+
|
6
|
+
class << self
|
7
|
+
ActiveRecord::Callbacks::CALLBACKS.each do |callback|
|
8
|
+
alias_method "hold_please_#{callback}", callback
|
9
|
+
|
10
|
+
define_method callback do |*args|
|
11
|
+
type, event = callback.to_s.split("_")
|
12
|
+
|
13
|
+
if HoldPlease.caller_is_probably_within_a_gem?(caller)
|
14
|
+
send "hold_please_#{callback}", *args
|
15
|
+
else
|
16
|
+
set_callback(event.to_sym, type.to_sym) do
|
17
|
+
raise HoldPlease::NoCallbacks
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class FakeGem < ActiveRecord::Base
|
2
|
+
|
3
|
+
self.table_name = "fake_gem"
|
4
|
+
|
5
|
+
before_save do
|
6
|
+
"Bad stuff"
|
7
|
+
end
|
8
|
+
|
9
|
+
before_validation :do_bad_stuff, if: :callbacks_are_evil?
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def do_bad_stuff
|
14
|
+
"Bad stuff"
|
15
|
+
end
|
16
|
+
|
17
|
+
def callbacks_are_evil?
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.expand_path("../../../../test_helper", __FILE__)
|
2
|
+
require File.expand_path("../../../../gems/fake_gem", __FILE__)
|
3
|
+
|
4
|
+
describe ActiveRecord::Base do
|
5
|
+
|
6
|
+
before do
|
7
|
+
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
|
8
|
+
end
|
9
|
+
|
10
|
+
it "raises an exception if a callback is defined" do
|
11
|
+
ActiveRecord::Base.connection.create_table(:foobar)
|
12
|
+
|
13
|
+
ActiveRecord::Callbacks::CALLBACKS.each do |callback|
|
14
|
+
model = Class.new(ActiveRecord::Base) do
|
15
|
+
self.table_name = "foobar"
|
16
|
+
|
17
|
+
self.send(callback) { "Bad things" }
|
18
|
+
end
|
19
|
+
|
20
|
+
type, event = callback.to_s.split("_")
|
21
|
+
|
22
|
+
exception = lambda {
|
23
|
+
model.new.run_callbacks(event)
|
24
|
+
}.must_raise HoldPlease::NoCallbacks
|
25
|
+
exception.message.must_equal "You really shouldn't use ActiveRecord callbacks"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it "does not raise an exception if a callback is used from a gem" do
|
30
|
+
ActiveRecord::Base.connection.create_table(:fake_gem)
|
31
|
+
|
32
|
+
lambda {
|
33
|
+
FakeGem.new.run_callbacks(:save)
|
34
|
+
}.must_be_silent
|
35
|
+
end
|
36
|
+
|
37
|
+
it "passes through arguments to the original callback definition method" do
|
38
|
+
ActiveRecord::Base.connection.create_table(:fake_gem)
|
39
|
+
|
40
|
+
fake_gem = FakeGem.new
|
41
|
+
fake_gem.expects(:callbacks_are_evil?)
|
42
|
+
fake_gem.run_callbacks(:validation)
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hold_please
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brandon Weiss
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activerecord
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.5'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sqlite3
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: mocha
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Raises an exception if an ActiveRecord callback is used. Won't interfere
|
70
|
+
with usage from within other gems.
|
71
|
+
email:
|
72
|
+
- brandon@anti-pattern.com
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- lib/hold_please.rb
|
78
|
+
- lib/hold_please/active_record/base.rb
|
79
|
+
- lib/hold_please/version.rb
|
80
|
+
- test/gems/fake_gem.rb
|
81
|
+
- test/lib/hold_please/active_record/base_test.rb
|
82
|
+
- test/test_helper.rb
|
83
|
+
homepage: https://github.com/brandonweiss/hold_please
|
84
|
+
licenses:
|
85
|
+
- MIT
|
86
|
+
metadata: {}
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 2.2.0
|
104
|
+
signing_key:
|
105
|
+
specification_version: 4
|
106
|
+
summary: Disable ActiveRecord callbacks
|
107
|
+
test_files:
|
108
|
+
- test/gems/fake_gem.rb
|
109
|
+
- test/lib/hold_please/active_record/base_test.rb
|
110
|
+
- test/test_helper.rb
|