hook 0.0.0 → 0.0.1

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/lib/hook.rb ADDED
@@ -0,0 +1,57 @@
1
+ module Hook
2
+ def self.included(base)
3
+ base.extend ::Hook::ClassMethods
4
+ end
5
+
6
+ module ClassMethods
7
+ def hook(method)
8
+ self.instance_eval <<-HOOKS
9
+ def before_#{method}(&block)
10
+ before_hooks["#{method}"] << block
11
+ end
12
+
13
+ def after_#{method}(&block)
14
+ after_hooks["#{method}"] << block
15
+ end
16
+
17
+ def around_#{method}(&block)
18
+ around_hooks["#{method}"] << block
19
+ end
20
+ HOOKS
21
+ end
22
+
23
+ def before_hooks
24
+ @before_hooks ||= scoped_callbacks
25
+ end
26
+
27
+ def after_hooks
28
+ @after_hooks ||= scoped_callbacks
29
+ end
30
+
31
+ def around_hooks
32
+ @around_hooks ||= scoped_callbacks
33
+ end
34
+
35
+ private
36
+ def scoped_callbacks
37
+ Hash.new {|h,k| h[k] = []}
38
+ end
39
+ end
40
+
41
+ private
42
+ def with_hooks(method)
43
+ method = method.to_s
44
+
45
+ run_hooks self.class.around_hooks[method]
46
+ run_hooks self.class.before_hooks[method]
47
+ yield
48
+ run_hooks self.class.after_hooks[method]
49
+ run_hooks self.class.around_hooks[method]
50
+
51
+ nil
52
+ end
53
+
54
+ def run_hooks(hooks)
55
+ hooks.each {|hook| hook.call self}
56
+ end
57
+ end
data/readme.markdown ADDED
@@ -0,0 +1,94 @@
1
+ # Hook
2
+
3
+ A simple API for adding before, after, and around callbacks to methods.
4
+
5
+ Think of it as `ActiveSupport::Callbacks`Lite.
6
+
7
+ ## Installation
8
+
9
+ It's a gem. Install it:
10
+
11
+ $ gem install hook
12
+
13
+ Or add it to your Gemfile:
14
+
15
+ gem "hook"
16
+
17
+ ## Usage
18
+
19
+ Imagine you've created a testing framework, and it includes a `Test`
20
+ class with an `execute` method:
21
+
22
+ ```ruby
23
+ class Test
24
+ #...
25
+ def execute
26
+ #...
27
+ end
28
+ end
29
+ ```
30
+
31
+ You'll likely want to offer hooks into the execution lifecycle of your
32
+ tests. First, include `Hook` into your class, then call `hook :execute`:
33
+
34
+ ```ruby
35
+ class Test
36
+ include ::Hook
37
+ hook :execute
38
+ end
39
+ ```
40
+
41
+ Next, you'll need to wrap the body of the `execute` method with a call
42
+ to `with_hooks(:execute)`:
43
+
44
+ ```ruby
45
+ class Test
46
+ include ::Hook
47
+ hook :execute
48
+
49
+ def execute
50
+ with_hooks :execute do
51
+ #...
52
+ end
53
+ end
54
+ end
55
+ ```
56
+
57
+ Now, **anyone can hook into the lifecycle of a test**:
58
+
59
+ ```ruby
60
+ Test.before_execute do |test|
61
+ #...
62
+ end
63
+
64
+ Test.after_execute do |test|
65
+ #...
66
+ end
67
+
68
+ Test.around_execute do |test|
69
+ #...
70
+ end
71
+ ```
72
+
73
+ Notice that our blocks accepted a `test` parameter. This is an instance
74
+ of the `Test` object that `execute` was called on.
75
+
76
+ Basically, whenever anyone calls the `execute` method on a test
77
+ instance, here's what happens:
78
+
79
+ around execute hooks run
80
+ before execute hooks run
81
+ execute method runs
82
+ after execute hooks run
83
+ around execute hooks run
84
+
85
+
86
+ ##LICENSE
87
+
88
+ This software is public domain. Since I've relinquished copyright, you can do anything with it. GO WILD.
89
+
90
+ ##Contributing
91
+
92
+ Submit a pull request. Tests required. Also, by submitting a pull
93
+ request, you are relinquishing your copyright over your contribution and
94
+ submitting it to the public domain.
@@ -0,0 +1,47 @@
1
+ Hook Details
2
+ ============================================
3
+
4
+
5
+ anyone can hook into the lifecycle of a test
6
+ --------------------------------------------
7
+
8
+ You can create before hooks that execute before a test is executed:
9
+
10
+ before = false
11
+
12
+ Test.before_execute do |test|
13
+ before = true
14
+ end
15
+
16
+ Test.new.execute
17
+
18
+ before.should be(true)
19
+
20
+ You can create after hooks that execute after a test is execute:
21
+
22
+ after = false
23
+
24
+ Test.after_execute do |test|
25
+ after = true
26
+ end
27
+
28
+ Test.new.execute
29
+
30
+ after.should be(true)
31
+
32
+ And lastly, you can create around hooks that execute before _and_ after
33
+ a test executes:
34
+
35
+ around = nil
36
+
37
+ Test.around_execute do |test|
38
+ if around.nil?
39
+ around = "before"
40
+ else
41
+ around = "after"
42
+ end
43
+ end
44
+
45
+ Test.new.execute
46
+
47
+ around.should == "after"
@@ -0,0 +1,3 @@
1
+ $LOAD_PATH.unshift './lib'
2
+
3
+ require 'hook'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hook
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 0
10
- version: 0.0.0
9
+ - 1
10
+ version: 0.0.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matt Parker
@@ -15,10 +15,41 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-04 00:00:00 Z
19
- dependencies: []
20
-
21
- description: A system for creating view hooks.
18
+ date: 2012-01-29 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: specdown
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: -726738688
29
+ segments:
30
+ - 0
31
+ - 4
32
+ - 0
33
+ - beta
34
+ - 1
35
+ version: 0.4.0.beta.1
36
+ type: :development
37
+ version_requirements: *id001
38
+ - !ruby/object:Gem::Dependency
39
+ name: rspec
40
+ prerelease: false
41
+ requirement: &id002 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ hash: 3
47
+ segments:
48
+ - 0
49
+ version: "0"
50
+ type: :development
51
+ version_requirements: *id002
52
+ description:
22
53
  email: moonmaster9000@gmail.com
23
54
  executables: []
24
55
 
@@ -26,8 +57,11 @@ extensions: []
26
57
 
27
58
  extra_rdoc_files: []
28
59
 
29
- files: []
30
-
60
+ files:
61
+ - lib/hook.rb
62
+ - readme.markdown
63
+ - specdown/readme.specdown
64
+ - specdown/support/env.rb
31
65
  homepage: http://github.com/moonmaster9000/hook
32
66
  licenses: []
33
67
 
@@ -60,6 +94,7 @@ rubyforge_project:
60
94
  rubygems_version: 1.8.10
61
95
  signing_key:
62
96
  specification_version: 3
63
- summary: Add view hooks to your engines.
64
- test_files: []
65
-
97
+ summary: A simple, lightweight system for adding lifecycle callbacks to your objects.
98
+ test_files:
99
+ - specdown/readme.specdown
100
+ - specdown/support/env.rb