hold_please 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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,3 @@
1
+ module HoldPlease
2
+ VERSION = "0.0.2"
3
+ 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
@@ -0,0 +1,8 @@
1
+ require "rubygems"
2
+ require "bundler"
3
+ Bundler.setup
4
+
5
+ require "minitest/autorun"
6
+ require "mocha/setup"
7
+
8
+ require "hold_please"
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