method_hooks 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ca8e032aad27caac92b5ae5f3cfead907279c04
4
- data.tar.gz: 13f3a3c3ae45be7f97aabbe436f365367d017518
3
+ metadata.gz: f7e454d3f08fdcc2ee62ede53b2b570decdc8e93
4
+ data.tar.gz: cb9bf2fc3b04f9b10c65df6b2a3cde887cdf392d
5
5
  SHA512:
6
- metadata.gz: 2798593f00ac3f6c0ae226c318b0dd4e7e6c497e1b7f462d4b08ec3faf04a724bc30c2f18ced994a43e31c33f59ea441cbae8192dffb3ec66bbe809fdca264d6
7
- data.tar.gz: 3563544ebcbc7b928c2cd5389f0e4f4da011fc34cd3738f3172bc5f7eac0238adcc2dd89457afc839ab81f21b4891cbb56df3b5df209371e903f57fc14c92dc1
6
+ metadata.gz: 18014051b5fc06b6cbd3e2181b32f46c2902a26b30da7c7309135dc235c20185b39a73650a2517f551ca9aecc7a52c88d37d10cceb438e05ac23a790c8b3505c
7
+ data.tar.gz: ed644fb295f63dbe1d819c686dd68d6d74d0d6d5e77eb7ccfa5a06a042d9543328ecd25a43193c7fe85a5b71960a4357ba5c4d6c4a07686c2888ae22f9d569fc
@@ -1,3 +1,3 @@
1
1
  module MethodHooks
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
data/lib/method_hooks.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require "method_hooks/version"
2
+ require "active_support/core_ext/class/subclasses"
3
+ require "active_support/core_ext/object/deep_dup"
2
4
 
3
5
  module MethodHooks
4
6
  @new_method = true
@@ -9,6 +11,15 @@ module MethodHooks
9
11
 
10
12
  private
11
13
 
14
+ def inherited(child_class)
15
+ child_class.instance_variable_set(:@new_method, true)
16
+ child_class.instance_variable_set(:@before_callbacks, before_callbacks.deep_dup)
17
+ child_class.instance_variable_set(:@around_callbacks, around_callbacks.deep_dup)
18
+ child_class.instance_variable_set(:@after_callbacks, after_callbacks.deep_dup)
19
+
20
+ super
21
+ end
22
+
12
23
  def method_added(method_name)
13
24
  super
14
25
  return if @new_method == false || [:initialize, :call_before_callbacks, :call_around_callbacks, :call_after_callbacks].include?(method_name)
@@ -45,18 +56,30 @@ module MethodHooks
45
56
  method_names.each do |method_name|
46
57
  before_callbacks[method_name] << block
47
58
  end
59
+
60
+ subclasses.each do |subclass|
61
+ descendant.before(method_names, &block)
62
+ end
48
63
  end
49
64
 
50
65
  def around(*method_names, &block)
51
66
  method_names.each do |method_name|
52
67
  around_callbacks[method_name] << block
53
68
  end
69
+
70
+ subclasses.each do |subclass|
71
+ descendant.around(method_names, &block)
72
+ end
54
73
  end
55
74
 
56
75
  def after(*method_names, &block)
57
76
  method_names.each do |method_name|
58
77
  after_callbacks[method_name] << block
59
78
  end
79
+
80
+ subclasses.each do |subclass|
81
+ subclass.after(method_names, &block)
82
+ end
60
83
  end
61
84
 
62
85
  module InstanceMethods
data/method_hooks.gemspec CHANGED
@@ -21,4 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.7"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
23
  spec.add_development_dependency "rspec", "~> 3.2.0"
24
+
25
+ spec.add_dependency "activesupport", "~> 4.1"
24
26
  end
@@ -103,4 +103,81 @@ describe MethodHooks do
103
103
  expect(Base._methods).to include(:some_method)
104
104
  end
105
105
 
106
+ describe 'inheritance' do
107
+ before do
108
+ Object.send(:remove_const, :Child) if Object.const_defined?(:Child)
109
+ Object.send(:remove_const, :Grandchild) if Object.const_defined?(:Grandchild)
110
+ end
111
+
112
+ it 'should pass parent hooks to the child' do
113
+ Base.instance_eval do
114
+ before(:save) { @events << 'before' }
115
+
116
+ around(:save) do |method|
117
+ @events << 'before_around'
118
+ method.call
119
+ @events << 'after_around'
120
+ end
121
+
122
+ after(:save) { @events << 'after' }
123
+ end
124
+
125
+ class Child < Base; end
126
+
127
+ child = Child.new
128
+ child.save
129
+
130
+ expect(child.events).to eq(['before', 'before_around', 'save', 'after_around', 'after'])
131
+ end
132
+
133
+ it 'should not mutate the parent callbacks when a callback is added to a child' do
134
+ Base.instance_eval do
135
+ before(:save) { @events << 'parent before' }
136
+ end
137
+
138
+ class Child < Base; end
139
+
140
+ Child.instance_eval do
141
+ before(:save) { @events << 'child before' }
142
+ end
143
+
144
+ child = Child.new
145
+ child.save
146
+ parent = Base.new
147
+ parent.save
148
+
149
+ expect(child.events).to eq(['parent before', 'child before', 'save'])
150
+ expect(parent.events).to eq(['parent before', 'save'])
151
+ end
152
+
153
+ it 'should add callbacks to all descendents of a class, recursively' do
154
+ Base.instance_eval do
155
+ before(:save) { @events << 'parent before' }
156
+ end
157
+
158
+ class Child < Base; end
159
+
160
+ Child.instance_eval do
161
+ before(:save) { @events << 'child before' }
162
+ end
163
+
164
+ class Grandchild < Child; end
165
+
166
+ Grandchild.instance_eval do
167
+ before(:save) { @events << 'grandchild before' }
168
+ end
169
+
170
+ parent = Base.new
171
+ parent.save
172
+ child = Child.new
173
+ child.save
174
+ grandchild = Grandchild.new
175
+ grandchild.save
176
+
177
+
178
+ expect(parent.events).to eq(['parent before', 'save'])
179
+ expect(child.events).to eq(['parent before', 'child before', 'save'])
180
+ expect(grandchild.events).to eq(['parent before', 'child before', 'grandchild before', 'save'])
181
+ end
182
+ end
106
183
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: method_hooks
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Frank Bonetti
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-13 00:00:00.000000000 Z
11
+ date: 2015-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: 3.2.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '4.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '4.1'
55
69
  description: Rails-style method hooks for plain old Ruby objects
56
70
  email:
57
71
  - frank.r.bonetti@gmail.com