callbacks 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -0
- data/Manifest.txt +1 -1
- data/README.txt +3 -0
- data/Rakefile +2 -0
- data/Version.txt +1 -1
- data/lib/callbackchain.rb +6 -0
- data/lib/callbacks.rb +4 -11
- data/lib/classmethods.rb +30 -19
- data/lib/instancemethods.rb +19 -8
- data/tasks/ann.rake +0 -0
- data/tasks/bones.rake +0 -0
- data/tasks/gem.rake +6 -1
- data/tasks/manifest.rake +3 -3
- data/tasks/notes.rake +0 -0
- data/tasks/post_load.rake +0 -0
- data/tasks/rdoc.rake +0 -0
- data/tasks/rubyforge.rake +2 -2
- data/tasks/setup.rb +6 -4
- data/tasks/spec.rake +0 -0
- data/tasks/svn.rake +0 -0
- data/tasks/test.rake +0 -0
- data/test/test_callbacks.rb +32 -0
- data/test/tester_class.rb +9 -0
- metadata +6 -7
- data/bin/callbacks +0 -8
data/History.txt
CHANGED
@@ -3,3 +3,10 @@
|
|
3
3
|
* First release
|
4
4
|
* API not yet stable
|
5
5
|
* Only supports adding hooks to classes not instances. Instances are planned for 0.2
|
6
|
+
|
7
|
+
== 0.0.2 / 2008-09-28
|
8
|
+
|
9
|
+
* Second release!
|
10
|
+
* API still not stable
|
11
|
+
* Callbacks now picks up "before#{callback}" and "after_#{callback}" instance methods automatically
|
12
|
+
* Some documentation added
|
data/Manifest.txt
CHANGED
data/README.txt
CHANGED
@@ -13,6 +13,7 @@ This package makes it simple to add callbacks a.k.a. "hooks" to ruby classes
|
|
13
13
|
* It now only supports adding callbacks to classes
|
14
14
|
* Different callbacks for instances comes with version 0.2
|
15
15
|
* I haven't decided yet on the API, maybe I'll swap "callback_methods" with "hooks"
|
16
|
+
* When using add_callback_method before the method itself is defined, it won't work
|
16
17
|
|
17
18
|
== SYNOPSIS:
|
18
19
|
|
@@ -27,6 +28,8 @@ This package makes it simple to add callbacks a.k.a. "hooks" to ruby classes
|
|
27
28
|
o = Object.new
|
28
29
|
o.inspect #will print "Going to inspect Object"
|
29
30
|
|
31
|
+
For more code examples see: http://callbacks.rubyforge.com
|
32
|
+
|
30
33
|
== REQUIREMENTS:
|
31
34
|
|
32
35
|
* ruby 1.8 (might work with ruby1.9)
|
data/Rakefile
CHANGED
data/Version.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/lib/callbacks.rb
CHANGED
@@ -2,26 +2,19 @@
|
|
2
2
|
module Callbacks
|
3
3
|
require 'observer'
|
4
4
|
require 'ext/metaid.rb'
|
5
|
+
require 'callbackchain.rb'
|
5
6
|
require 'instancemethods.rb'
|
6
7
|
require 'classmethods.rb'
|
7
8
|
require 'callback.rb'
|
8
|
-
|
9
|
-
# CALLBACKS = [
|
10
|
-
# 'song_halfway',
|
11
|
-
# 'song_end',
|
12
|
-
# 'boot',
|
13
|
-
# 'shutdown',
|
14
|
-
# ]
|
15
|
-
|
16
|
-
CALLBACKS = []
|
17
9
|
|
18
10
|
#Sets all things right
|
19
11
|
def self.included(base) #:nodoc:
|
20
|
-
base.extend Observable
|
12
|
+
base.extend Observable #why?
|
21
13
|
base.extend Callbacks::ClassMethods
|
22
14
|
base.send(:include, Callbacks::InstanceMethods)
|
23
15
|
end
|
24
16
|
end
|
25
17
|
|
26
18
|
#TODO: add aliases like add_hook(), callbacks(), et cetera
|
27
|
-
#TODO: feature to add hooks/callbacks to instances instead of only classes
|
19
|
+
#TODO: feature to add hooks/callbacks to instances instead of only classes
|
20
|
+
#TODO: make all of the activesupport features/tests work
|
data/lib/classmethods.rb
CHANGED
@@ -8,13 +8,13 @@ module Callbacks
|
|
8
8
|
|
9
9
|
def callback_actions
|
10
10
|
#Use one @, else it gets stored in the module and then it will be avaiable in every class that uses callback
|
11
|
-
@callback_actions ||=
|
11
|
+
@callback_actions ||= CallbackChain.new
|
12
12
|
end
|
13
13
|
|
14
14
|
def add_callback_methods(*callbacks)
|
15
15
|
callbacks.each do |callback|
|
16
16
|
self.callback_methods << callback.to_sym
|
17
|
-
self.
|
17
|
+
self.build_callback_methods(callback)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -30,21 +30,9 @@ module Callbacks
|
|
30
30
|
self.callback_methods.delete(method.to_sym)
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
instance_eval <<-"end_eval"
|
37
|
-
|
38
|
-
def before_#{method}(*callbacks, &block)
|
39
|
-
add_callback_action :before, :#{method}, *callbacks, &block
|
40
|
-
end
|
41
|
-
|
42
|
-
def after_#{method}(*callbacks, &block)
|
43
|
-
add_callback_action :after, :#{method}, *callbacks, &block
|
44
|
-
end
|
45
|
-
|
46
|
-
end_eval
|
47
|
-
#end
|
33
|
+
def build_callback_methods(method)
|
34
|
+
build_before_callback_method(method)
|
35
|
+
build_after_callback_method(method)
|
48
36
|
|
49
37
|
class_eval <<-"end_eval"
|
50
38
|
def #{method}_with_callbacks
|
@@ -66,12 +54,35 @@ module Callbacks
|
|
66
54
|
ca[method][type] = [] if ca[method][type].nil?
|
67
55
|
|
68
56
|
if block_given?
|
69
|
-
|
57
|
+
callback = Callback.new(method, nil, &block)
|
70
58
|
else
|
71
59
|
code.each do |c|
|
72
|
-
|
60
|
+
callback = Callback.new(method, c)
|
73
61
|
end
|
74
62
|
end
|
63
|
+
ca[method][type] << callback
|
64
|
+
return callback
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
def build_before_callback_method(method)
|
69
|
+
instance_eval <<-"end_eval"
|
70
|
+
|
71
|
+
def before_#{method}(*callbacks, &block)
|
72
|
+
add_callback_action :before, :#{method}, *callbacks, &block
|
73
|
+
end
|
74
|
+
|
75
|
+
end_eval
|
76
|
+
end
|
77
|
+
|
78
|
+
def build_after_callback_method(method)
|
79
|
+
instance_eval <<-"end_eval"
|
80
|
+
|
81
|
+
def after_#{method}(*callbacks, &block)
|
82
|
+
add_callback_action :after, :#{method}, *callbacks, &block
|
83
|
+
end
|
84
|
+
|
85
|
+
end_eval
|
75
86
|
end
|
76
87
|
|
77
88
|
end
|
data/lib/instancemethods.rb
CHANGED
@@ -2,20 +2,31 @@ module Callbacks
|
|
2
2
|
module InstanceMethods
|
3
3
|
|
4
4
|
def callback_actions(show_classvars = true)
|
5
|
-
|
5
|
+
callback_actions = self.class_callback_actions
|
6
6
|
#return self.instance_callbacks if show_classvars == false
|
7
7
|
#return self.class_callback_actions + self.instance_callback_actions if show_classvars == true
|
8
8
|
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
def callback_actions_for(method, type)
|
10
|
+
def callback_actions_for(method, type)
|
11
|
+
#Do the rescue if [method] does not exist (nil), [type] will fail
|
13
12
|
begin
|
14
|
-
|
15
|
-
return self.callback_actions[method][type] ||= []
|
13
|
+
callback_actions = self.callback_actions[method][type] ||= []
|
16
14
|
rescue NoMethodError
|
17
|
-
|
15
|
+
callback_actions = []
|
18
16
|
end
|
17
|
+
|
18
|
+
#If the before/after_ method exists, and it is not already added,
|
19
|
+
# add it!
|
20
|
+
#Dit kan mooier!
|
21
|
+
if self.respond_to?("#{type}_#{method}")
|
22
|
+
if not callback_actions.include? "#{type}_#{method}".to_sym
|
23
|
+
#callback_actions << Callback.new(method, "#{type}_#{method}".to_sym)
|
24
|
+
callback = self.class.add_callback_action(type, method, "#{type}_#{method}".to_sym)
|
25
|
+
callback_actions << callback
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
return callback_actions
|
19
30
|
end
|
20
31
|
|
21
32
|
def class_callback_actions
|
@@ -35,4 +46,4 @@ module Callbacks
|
|
35
46
|
#Should I return something?
|
36
47
|
end
|
37
48
|
end
|
38
|
-
end
|
49
|
+
end
|
data/tasks/ann.rake
CHANGED
File without changes
|
data/tasks/bones.rake
CHANGED
File without changes
|
data/tasks/gem.rake
CHANGED
@@ -91,7 +91,7 @@ namespace :gem do
|
|
91
91
|
end
|
92
92
|
|
93
93
|
desc 'Install the gem'
|
94
|
-
task :install => [:clobber, :package] do
|
94
|
+
task :install => [:clobber, 'gem:package'] do
|
95
95
|
sh "#{SUDO} #{GEM} install --local pkg/#{PROJ.gem._spec.full_name}"
|
96
96
|
|
97
97
|
# use this version of the command for rubygems > 1.0.0
|
@@ -109,6 +109,11 @@ namespace :gem do
|
|
109
109
|
desc 'Reinstall the gem'
|
110
110
|
task :reinstall => [:uninstall, :install]
|
111
111
|
|
112
|
+
desc 'Cleanup the gem'
|
113
|
+
task :cleanup do
|
114
|
+
sh "#{SUDO} #{GEM} cleanup #{PROJ.gem._spec.name}"
|
115
|
+
end
|
116
|
+
|
112
117
|
end # namespace :gem
|
113
118
|
|
114
119
|
desc 'Alias to gem:package'
|
data/tasks/manifest.rake
CHANGED
@@ -15,9 +15,9 @@ namespace :manifest do
|
|
15
15
|
lines.map! do |line|
|
16
16
|
case line
|
17
17
|
when %r/^(-{3}|\+{3})/; nil
|
18
|
-
when %r/^@/;
|
19
|
-
when %r/^\+/;
|
20
|
-
when %r/^\-/;
|
18
|
+
when %r/^@/; ANSICode.blue line
|
19
|
+
when %r/^\+/; ANSICode.green line
|
20
|
+
when %r/^\-/; ANSICode.red line
|
21
21
|
else line end
|
22
22
|
end
|
23
23
|
end
|
data/tasks/notes.rake
CHANGED
File without changes
|
data/tasks/post_load.rake
CHANGED
File without changes
|
data/tasks/rdoc.rake
CHANGED
File without changes
|
data/tasks/rubyforge.rake
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# $Id$
|
2
1
|
|
3
2
|
if PROJ.rubyforge.name.valid? && HAVE_RUBYFORGE
|
4
3
|
|
@@ -7,7 +6,7 @@ require 'rake/contrib/sshpublisher'
|
|
7
6
|
|
8
7
|
namespace :gem do
|
9
8
|
desc 'Package and upload to RubyForge'
|
10
|
-
task :release => [:clobber, :package] do |t|
|
9
|
+
task :release => [:clobber, 'gem:package'] do |t|
|
11
10
|
v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
|
12
11
|
abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
|
13
12
|
pkg = "pkg/#{PROJ.gem._spec.full_name}"
|
@@ -18,6 +17,7 @@ namespace :gem do
|
|
18
17
|
end
|
19
18
|
|
20
19
|
rf = RubyForge.new
|
20
|
+
rf.configure rescue nil
|
21
21
|
puts 'Logging in'
|
22
22
|
rf.login
|
23
23
|
|
data/tasks/setup.rb
CHANGED
@@ -18,7 +18,7 @@ PROJ = OpenStruct.new(
|
|
18
18
|
:email => nil,
|
19
19
|
:url => "\000",
|
20
20
|
:version => ENV['VERSION'] || '0.0.0',
|
21
|
-
:exclude => %w(tmp$ bak$ ~$ CVS
|
21
|
+
:exclude => %w(tmp$ bak$ ~$ CVS \.svn/ \.git/ ^pkg/),
|
22
22
|
:release_name => ENV['RELEASE'],
|
23
23
|
|
24
24
|
# System Defaults
|
@@ -58,7 +58,7 @@ PROJ = OpenStruct.new(
|
|
58
58
|
|
59
59
|
# File Annotations
|
60
60
|
:notes => OpenStruct.new(
|
61
|
-
:exclude => %w(^tasks/setup
|
61
|
+
:exclude => %w(^tasks/setup\.rb$),
|
62
62
|
:extensions => %w(.txt .rb .erb) << '',
|
63
63
|
:tags => %w(FIXME OPTIMIZE TODO)
|
64
64
|
),
|
@@ -74,8 +74,8 @@ PROJ = OpenStruct.new(
|
|
74
74
|
# Rdoc
|
75
75
|
:rdoc => OpenStruct.new(
|
76
76
|
:opts => [],
|
77
|
-
:include => %w(^lib/ ^bin/ ^ext/
|
78
|
-
:exclude => %w(extconf
|
77
|
+
:include => %w(^lib/ ^bin/ ^ext/ \.txt$),
|
78
|
+
:exclude => %w(extconf\.rb$),
|
79
79
|
:main => nil,
|
80
80
|
:dir => 'doc',
|
81
81
|
:remote_dir => nil
|
@@ -159,6 +159,8 @@ GEM = WIN32 ? 'gem.bat' : 'gem'
|
|
159
159
|
end
|
160
160
|
HAVE_SVN = (Dir.entries(Dir.pwd).include?('.svn') and
|
161
161
|
system("svn --version 2>&1 > #{DEV_NULL}"))
|
162
|
+
HAVE_GIT = (Dir.entries(Dir.pwd).include?('.git') and
|
163
|
+
system("git --version 2>&1 > #{DEV_NULL}"))
|
162
164
|
|
163
165
|
# Reads a file at +path+ and spits out an array of the +paragraphs+
|
164
166
|
# specified.
|
data/tasks/spec.rake
CHANGED
File without changes
|
data/tasks/svn.rake
CHANGED
File without changes
|
data/tasks/test.rake
CHANGED
File without changes
|
data/test/test_callbacks.rb
CHANGED
@@ -153,6 +153,38 @@ class CallbacksTest < Test::Unit::TestCase
|
|
153
153
|
assert_equal ['before_exit'], $tests_run
|
154
154
|
end
|
155
155
|
|
156
|
+
# def test_should_not_raise_error_when_method_not_exist
|
157
|
+
# assert_nothing_raised do
|
158
|
+
# Tester.add_callback_methods :doesnotexist
|
159
|
+
# end
|
160
|
+
# end
|
161
|
+
|
162
|
+
# def test_no_method_callback_should_not_add_method
|
163
|
+
# Tester.add_callback_methods :nomethodcallback
|
164
|
+
# t = Tester.new
|
165
|
+
#
|
166
|
+
# assert_raise NameError do
|
167
|
+
# t.nomethodcallback
|
168
|
+
# end
|
169
|
+
# end
|
170
|
+
|
171
|
+
def test_should_use_defined_methods_in_class_as_callback
|
172
|
+
Tester.add_callback_methods :callback_with_defined_method
|
173
|
+
t = Tester.new
|
174
|
+
t.callback_with_defined_method
|
175
|
+
assert $tests_run.length > 0
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_callback_should_only_be_certain_types
|
179
|
+
assert_nothing_raised do
|
180
|
+
Callback.new(:inspect, 'print "This is a test"')
|
181
|
+
end
|
182
|
+
|
183
|
+
assert_raise RuntimeError do
|
184
|
+
Callback.new(:inspect, [])
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
156
188
|
# def test_callbacks_created_in_class_should_be_vissible_in_instance
|
157
189
|
# Tester.add_callback_methods :boot, :exit
|
158
190
|
# t = Tester.new
|
data/test/tester_class.rb
CHANGED
@@ -15,6 +15,15 @@ class Tester
|
|
15
15
|
return "testing"
|
16
16
|
end
|
17
17
|
|
18
|
+
def before_callback_with_defined_method
|
19
|
+
text = "This is before the method ran and is generated by a defined method in the class"
|
20
|
+
$tests_run << text
|
21
|
+
return text
|
22
|
+
end
|
23
|
+
|
24
|
+
def callback_with_defined_method
|
25
|
+
end
|
26
|
+
|
18
27
|
def fill_globalvar_tests_run
|
19
28
|
$tests_run << 'fill_globalvar_tests_run'
|
20
29
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: callbacks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leon Bogaert
|
@@ -9,29 +9,28 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-09-28 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description: This package makes it simple to add callbacks a.k.a. "hooks" to ruby classes
|
17
17
|
email: leon@vanutsteen.nl
|
18
|
-
executables:
|
19
|
-
|
18
|
+
executables: []
|
19
|
+
|
20
20
|
extensions: []
|
21
21
|
|
22
22
|
extra_rdoc_files:
|
23
23
|
- History.txt
|
24
24
|
- README.txt
|
25
|
-
- bin/callbacks
|
26
25
|
files:
|
27
26
|
- History.txt
|
28
27
|
- Manifest.txt
|
29
28
|
- README.txt
|
30
29
|
- Rakefile
|
31
30
|
- Version.txt
|
32
|
-
- bin/callbacks
|
33
31
|
- ext/metaid.rb
|
34
32
|
- lib/callback.rb
|
33
|
+
- lib/callbackchain.rb
|
35
34
|
- lib/callbacks.rb
|
36
35
|
- lib/classmethods.rb
|
37
36
|
- lib/instancemethods.rb
|
@@ -77,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
76
|
requirements: []
|
78
77
|
|
79
78
|
rubyforge_project: callbacks
|
80
|
-
rubygems_version: 1.
|
79
|
+
rubygems_version: 1.2.0
|
81
80
|
signing_key:
|
82
81
|
specification_version: 2
|
83
82
|
summary: This package makes it simple to add callbacks a
|