big_spoon 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES.md CHANGED
@@ -1,4 +1,15 @@
1
1
  # CHANGELOG
2
+ ## 0.2.1
3
+ ### `hooks` now aliased as `spoon` to avoid namespace conflicts
4
+ - Fixes bugs w/Railties generators and other libraries that use
5
+ a class method named `hooks`
6
+
7
+ ## 0.2.0
8
+ ### Multiple bugs fixed and test for decent backtraces
9
+ - before and after filters no longer assume argument-less-methods
10
+ - `before` and `after` are now in method_missing so they won't
11
+ conflict with other libraries
12
+
2
13
  ## 0.1.1
3
14
  ### :if, :unless, and tested in production!
4
15
  - :if => :method and :unless => lambda { false } are now supported.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
data/big_spoon.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "big_spoon"
8
- s.version = "0.2.0"
8
+ s.version = "0.2.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Flip Sasser"]
12
- s.date = "2012-08-14"
12
+ s.date = "2012-08-20"
13
13
  s.description = "\n BigSpoon will add a hooks method to every class. Call that method with a block and add all kinds of fun hooks before and after your methods.\n "
14
14
  s.email = "flip@x451.com"
15
15
  s.extra_rdoc_files = [
data/lib/big_spoon.rb CHANGED
@@ -2,10 +2,10 @@ require 'big_spoon/hook'
2
2
 
3
3
  module BigSpoon
4
4
  module ClassMethods
5
- def hooks(options = {}, &block)
5
+ def spoon(options = {}, &block)
6
6
  @hooks ||= Hook.for(self)
7
7
  @hooks.instance_eval(&block) if block_given?
8
-
8
+
9
9
  unless respond_to?(:_big_spoon_original_method_added)
10
10
  class << self
11
11
  alias :_big_spoon_original_method_added :method_added
@@ -18,24 +18,33 @@ module BigSpoon
18
18
  end
19
19
  end
20
20
  @hooks
21
- end # `hooks` method
21
+ end # `big_spoon` method
22
22
 
23
23
  private
24
- def method_missing(method_name, *args)
24
+ def method_missing_with_big_spoon(method_name, *args, &block)
25
25
  case method_name.to_s
26
+ when 'hooks'
27
+ spoon *args, &block
26
28
  when 'after'
27
- hooks.after *args
29
+ hooks.after *args, &block
28
30
  when /^after_(.+)$/
29
- hooks.after $1, *args
31
+ hooks.after $1, *args, &block
30
32
  when 'before'
31
- hooks.before *args
33
+ hooks.before *args, &block
32
34
  when /^before_(.+)$/
33
- hooks.before $1, *args
35
+ hooks.before $1, *args, &block
34
36
  else
35
- super
37
+ method_missing_without_big_spoon(method_name, *args)
36
38
  end
37
39
  end
38
40
  end # `ClassMethods` module
39
41
  end # `BigSpoon` module
40
42
 
41
- Object.extend BigSpoon::ClassMethods
43
+ Object.class_eval do
44
+ extend BigSpoon::ClassMethods
45
+ class << self
46
+ alias :method_missing_without_big_spoon :method_missing
47
+ alias :method_missing :method_missing_with_big_spoon
48
+ end
49
+ end
50
+
@@ -15,12 +15,12 @@ module BigSpoon
15
15
 
16
16
  # Define a method to execute after another
17
17
  def after(method_to_hook, method_to_call = nil, options = {}, &block)
18
- hook(:after, method_to_hook, method_to_call, options, &block)
18
+ add(:after, method_to_hook, method_to_call, options, &block)
19
19
  end
20
20
 
21
21
  # Define a method to execute before another
22
22
  def before(method_to_hook, method_to_call = nil, options = {}, &block)
23
- hook(:before, method_to_hook, method_to_call, options, &block)
23
+ add(:before, method_to_hook, method_to_call, options, &block)
24
24
  end
25
25
 
26
26
  # def clear!
@@ -65,17 +65,39 @@ module BigSpoon
65
65
  methods[method_to_hook.to_sym] && hookable?(method_to_hook) && !hooked?(method_to_hook)
66
66
  end
67
67
 
68
- def unhook!(method_to_hook)
69
- hooked_method = hooked_method(method_to_hook)
70
- original_method = original_method(method_to_hook)
71
- line = __LINE__; alias_these_hooks = <<-hooks
72
- alias :#{method_to_hook} #{original_method}
73
- remove_method #{hooked_method}
74
- hooks
75
- klass.class_eval alias_these_hooks, __FILE__, line.succ
76
- end
68
+ # def unhook!(method_to_hook)
69
+ # hooked_method = hooked_method(method_to_hook)
70
+ # original_method = original_method(method_to_hook)
71
+ # line = __LINE__; alias_these_hooks = <<-hooks
72
+ # alias :#{method_to_hook} #{original_method}
73
+ # remove_method #{hooked_method}
74
+ # hooks
75
+ # klass.class_eval alias_these_hooks, __FILE__, line.succ
76
+ # end
77
77
 
78
78
  private
79
+ def add(before_or_after, method_to_hook, method_to_call = nil, options = {}, &block)
80
+ method_to_hook = method_to_hook.to_sym
81
+ if method_to_call.is_a? Hash
82
+ options = method_to_call
83
+ method_to_call = nil
84
+ end
85
+ if block_given?
86
+ method_to_call = block
87
+ else
88
+ method_to_call = method_to_call.to_sym
89
+ end
90
+
91
+ methods[method_to_hook] ||= {}
92
+ methods[method_to_hook][before_or_after] ||= []
93
+ method_definition = options.merge({:method => method_to_call})
94
+ methods[method_to_hook][before_or_after].push(method_definition) unless methods[method_to_hook][before_or_after].any? do |other_method_definition|
95
+ other_method_definition[:method] == method_to_call
96
+ end
97
+
98
+ hook!(method_to_hook) if should_hook?(method_to_hook)
99
+ end
100
+
79
101
  def execute(before_or_after, method_to_hook, instance)
80
102
  methods[method_to_hook] ||= {}
81
103
  methods[method_to_hook][before_or_after] ||= []
@@ -102,28 +124,6 @@ module BigSpoon
102
124
  end
103
125
  end
104
126
 
105
- def hook(before_or_after, method_to_hook, method_to_call = nil, options = {}, &block)
106
- method_to_hook = method_to_hook.to_sym
107
- if method_to_call.is_a? Hash
108
- options = method_to_call
109
- method_to_call = nil
110
- end
111
- if block_given?
112
- method_to_call = block
113
- else
114
- method_to_call = method_to_call.to_sym
115
- end
116
-
117
- methods[method_to_hook] ||= {}
118
- methods[method_to_hook][before_or_after] ||= []
119
- method_definition = options.merge({:method => method_to_call})
120
- methods[method_to_hook][before_or_after].push(method_definition) unless methods[method_to_hook][before_or_after].any? do |other_method_definition|
121
- other_method_definition[:method] == method_to_call
122
- end
123
-
124
- hook!(method_to_hook) if should_hook?(method_to_hook)
125
- end
126
-
127
127
  def hookable?(method_to_hook)
128
128
  klass.method_defined?(method_to_hook)
129
129
  end
@@ -48,10 +48,6 @@ describe BigSpoon do
48
48
  @big_spoon_test = BigSpoonTest.new
49
49
  end
50
50
 
51
- it "should monkeypatch Object" do
52
- Object.should respond_to(:hooks)
53
- end
54
-
55
51
  it "should allow me to add a hook before an object's methods BEFORE THEY EXIST" do
56
52
  @big_spoon_test.should_receive(:hook_1)
57
53
  @big_spoon_test.foo!
@@ -145,7 +141,7 @@ describe BigSpoon do
145
141
  @big_spoon_test.i_accept_many("ohai", "i'll be an array", "someday")
146
142
  end
147
143
 
148
- it "should handle an option argument" do
144
+ it "should handle an optional argument" do
149
145
  BigSpoonTest.after :i_might_accept_one, :hook_11
150
146
  @big_spoon_test.should_receive(:puts).with(nil)
151
147
  @big_spoon_test.i_might_accept_one
@@ -155,7 +151,7 @@ describe BigSpoon do
155
151
  BigSpoonTest.after :raise_sommat, :hook_12
156
152
  begin
157
153
  @big_spoon_test.raise_sommat
158
- rescue Exception => error
154
+ rescue
159
155
  $!.backtrace.first.should =~ /:\d+\:in `raise_sommat'/
160
156
  end
161
157
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: big_spoon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-14 00:00:00.000000000 Z
12
+ date: 2012-08-20 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! "\n BigSpoon will add a hooks method to every class. Call that
15
15
  method with a block and add all kinds of fun hooks before and after your methods.\n
@@ -49,7 +49,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
49
49
  version: '0'
50
50
  segments:
51
51
  - 0
52
- hash: 2835356473338463026
52
+ hash: 2773944303666380351
53
53
  required_rubygems_version: !ruby/object:Gem::Requirement
54
54
  none: false
55
55
  requirements: