hooked 0.3.1 → 0.3.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.
- data/README.md +1 -1
- data/lib/hooked.rb +37 -2
- data/lib/hooked/version.rb +1 -1
- data/spec/graph_spec.rb +5 -1
- data/spec/hooked_spec.rb +21 -8
- metadata +15 -7
data/README.md
CHANGED
@@ -77,7 +77,7 @@ Dependencies
|
|
77
77
|
* stdlib's [TSort](http://rubydoc.info/stdlib/tsort/1.9.2/frames)
|
78
78
|
* [RSpec](http://relishapp.com/rspec) for development
|
79
79
|
|
80
|
-
Specs pass on MRI 1.9.2,
|
80
|
+
Specs pass on MRI 1.9.2, Rubinius 1.2.3, JRuby 1.6.1 and MRI 1.8.7.
|
81
81
|
|
82
82
|
To do & Ideas
|
83
83
|
-------------
|
data/lib/hooked.rb
CHANGED
@@ -18,7 +18,7 @@ module Hooked
|
|
18
18
|
return if hooked[pointcut]
|
19
19
|
|
20
20
|
hooked[pointcut] = Hooked::Hook.new method(pointcut)
|
21
|
-
|
21
|
+
(class << self; self; end).class_eval do
|
22
22
|
undef_method pointcut
|
23
23
|
define_method pointcut do |*args, &block|
|
24
24
|
hooked[pointcut].call *args, &block
|
@@ -30,10 +30,45 @@ module Hooked
|
|
30
30
|
return unless hooked && hooked[pointcut]
|
31
31
|
|
32
32
|
p = hooked[pointcut].pointcut
|
33
|
-
|
33
|
+
(class << self; self; end).class_eval do
|
34
34
|
remove_method pointcut
|
35
35
|
define_method pointcut, &p
|
36
36
|
end
|
37
37
|
hooked.delete pointcut
|
38
38
|
end
|
39
|
+
|
40
|
+
def self.included(klass)
|
41
|
+
klass.instance_variable_set :@instance_hooked, {}
|
42
|
+
klass.extend ClassMethods
|
43
|
+
|
44
|
+
class << klass
|
45
|
+
alias_method :new_without_hooked, :new
|
46
|
+
alias_method :new, :new_with_hooked
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
module ClassMethods
|
51
|
+
attr_reader :instance_hooked
|
52
|
+
|
53
|
+
[:before, :after, :around].each do |type|
|
54
|
+
define_method :"instance_#{type}" do |pointcut, *args, &block|
|
55
|
+
instance_hooked[pointcut] ||= []
|
56
|
+
instance_hooked[pointcut] << {
|
57
|
+
:type => type,
|
58
|
+
:args => args,
|
59
|
+
:block => block
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def new_with_hooked(*args, &block)
|
65
|
+
obj = new_without_hooked *args, &block
|
66
|
+
instance_hooked.each do |pointcut, aspects|
|
67
|
+
aspects.each do |aspect|
|
68
|
+
obj.send aspect[:type], pointcut, *aspect[:args], &aspect[:block]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
obj
|
72
|
+
end
|
73
|
+
end
|
39
74
|
end
|
data/lib/hooked/version.rb
CHANGED
data/spec/graph_spec.rb
CHANGED
@@ -43,7 +43,11 @@ describe Hooked::Graph do
|
|
43
43
|
aspects.each {|a| graph << a }
|
44
44
|
graph.sort
|
45
45
|
|
46
|
-
graph.output
|
46
|
+
g = graph.output
|
47
|
+
g.index(aspects[0]).should > g.index(aspects[2])
|
48
|
+
g.index(aspects[1]).should > g.index(aspects[0])
|
49
|
+
g.index(aspects[2]).should < g.index(aspects[3])
|
50
|
+
g.index(aspects[3]).should < g.index(aspects[1])
|
47
51
|
end
|
48
52
|
|
49
53
|
it "detects circular dependencies" do
|
data/spec/hooked_spec.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Hooked do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
before do
|
5
|
+
@klass = Class.new do
|
6
|
+
include Hooked
|
7
|
+
def foo; end
|
8
|
+
end
|
7
9
|
end
|
8
10
|
|
9
11
|
[:before, :after, :around].each do |type|
|
10
12
|
describe "##{type}" do
|
11
13
|
it "hooks the method" do
|
12
|
-
obj = klass.new
|
14
|
+
obj = @klass.new
|
13
15
|
obj.stub :hooked => {:foo => double("hooked", :add_aspect => nil)}
|
14
16
|
|
15
17
|
obj.should_receive(:hook!).with(:foo)
|
@@ -17,7 +19,7 @@ describe Hooked do
|
|
17
19
|
end
|
18
20
|
|
19
21
|
it "adds an aspect to the hook" do
|
20
|
-
obj = klass.new
|
22
|
+
obj = @klass.new
|
21
23
|
advice, deps = stub("advice"), stub("deps")
|
22
24
|
|
23
25
|
obj.hook! :foo
|
@@ -30,7 +32,7 @@ describe Hooked do
|
|
30
32
|
|
31
33
|
describe "#hook!" do
|
32
34
|
it "replaces the original method with a hook" do
|
33
|
-
obj = klass.new
|
35
|
+
obj = @klass.new
|
34
36
|
args, result = ["bar", 123], stub("result")
|
35
37
|
|
36
38
|
obj.hook! :foo
|
@@ -39,7 +41,7 @@ describe Hooked do
|
|
39
41
|
end
|
40
42
|
|
41
43
|
it "doesn't hook a method twice" do
|
42
|
-
obj = klass.new
|
44
|
+
obj = @klass.new
|
43
45
|
obj.hook! :foo
|
44
46
|
|
45
47
|
Hooked::Hook.should_not_receive :new
|
@@ -49,7 +51,7 @@ describe Hooked do
|
|
49
51
|
|
50
52
|
describe "#unhook!" do
|
51
53
|
it "brings the original back in place" do
|
52
|
-
obj = klass.new
|
54
|
+
obj = @klass.new
|
53
55
|
|
54
56
|
obj.hook! :foo
|
55
57
|
hook = obj.hooked[:foo]
|
@@ -61,4 +63,15 @@ describe Hooked do
|
|
61
63
|
obj.hooked[:foo].should be_nil
|
62
64
|
end
|
63
65
|
end
|
66
|
+
|
67
|
+
[:before, :after, :around].each do |type|
|
68
|
+
describe ".instance_#{type}" do
|
69
|
+
it "hooks this pointcut on each new object of the class" do
|
70
|
+
@klass.send :"instance_#{type}", :foo, stub("advice")
|
71
|
+
|
72
|
+
obj = @klass.new
|
73
|
+
obj.hooked[:foo].graph.changed?.should be_true
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
64
77
|
end
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hooked
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 2
|
10
|
+
version: 0.3.2
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Lars Gierth
|
@@ -10,19 +15,22 @@ autorequire:
|
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2011-
|
18
|
+
date: 2011-05-16 00:00:00 +02:00
|
14
19
|
default_executable:
|
15
20
|
dependencies:
|
16
21
|
- !ruby/object:Gem::Dependency
|
22
|
+
prerelease: false
|
23
|
+
type: :development
|
17
24
|
name: rspec
|
18
25
|
requirement: &id001 !ruby/object:Gem::Requirement
|
19
26
|
none: false
|
20
27
|
requirements:
|
21
28
|
- - ">="
|
22
29
|
- !ruby/object:Gem::Version
|
30
|
+
hash: 3
|
31
|
+
segments:
|
32
|
+
- 0
|
23
33
|
version: "0"
|
24
|
-
type: :development
|
25
|
-
prerelease: false
|
26
34
|
version_requirements: *id001
|
27
35
|
description: Hooked lets you transparently aspectify your methods and blocks.
|
28
36
|
email:
|
@@ -64,7 +72,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
64
72
|
requirements:
|
65
73
|
- - ">="
|
66
74
|
- !ruby/object:Gem::Version
|
67
|
-
hash:
|
75
|
+
hash: 3
|
68
76
|
segments:
|
69
77
|
- 0
|
70
78
|
version: "0"
|
@@ -73,14 +81,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
73
81
|
requirements:
|
74
82
|
- - ">="
|
75
83
|
- !ruby/object:Gem::Version
|
76
|
-
hash:
|
84
|
+
hash: 3
|
77
85
|
segments:
|
78
86
|
- 0
|
79
87
|
version: "0"
|
80
88
|
requirements: []
|
81
89
|
|
82
90
|
rubyforge_project:
|
83
|
-
rubygems_version: 1.
|
91
|
+
rubygems_version: 1.5.2
|
84
92
|
signing_key:
|
85
93
|
specification_version: 3
|
86
94
|
summary: Aspect Orientation Made Simple
|