trigger 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.
Files changed (4) hide show
  1. data/Rakefile +45 -0
  2. data/lib/trigger.rb +66 -0
  3. data/test/ts_all.rb +117 -0
  4. metadata +56 -0
@@ -0,0 +1,45 @@
1
+ require "rake/rdoctask"
2
+ require "rake/testtask"
3
+ require "rake/gempackagetask"
4
+
5
+ require "rubygems"
6
+
7
+ task :default => [:test]
8
+
9
+ Rake::TestTask.new do |test|
10
+ test.libs << "test"
11
+ test.test_files = [ 'test/ts_all.rb' ]
12
+ test.verbose = true
13
+ end
14
+
15
+ Rake::RDocTask.new do |rdoc|
16
+ rdoc.main = 'README'
17
+ rdoc.rdoc_files.include 'README', 'lib/'
18
+ rdoc.rdoc_dir = 'doc'
19
+ rdoc.title = 'Trigger Documentation'
20
+ end
21
+
22
+ spec = Gem::Specification.new do |spec|
23
+ spec.name = "trigger"
24
+ spec.version = "0.0.1"
25
+ spec.platform = Gem::Platform::RUBY
26
+ spec.summary = "Trigger is a library for declaring and handling before and after events on method calls."
27
+ spec.files = Dir.glob("{lib,test}/**/*.rb").
28
+ delete_if { |item| item.include?("svn") } +
29
+ ["Rakefile"]
30
+ spec.test_suite_file = "test/ts_all.rb"
31
+ spec.has_rdoc = false
32
+ spec.require_path = 'lib'
33
+ spec.autorequire = "trigger"
34
+ spec.author = "Michel Martens"
35
+ spec.email = "michel@soveran.org"
36
+ spec.homepage = "http://www.soveran.com"
37
+ spec.description = "A simple library for declaring and handling before and after events on method calls."
38
+ spec.add_dependency('metaid')
39
+ end
40
+
41
+ Rake::GemPackageTask.new(spec) do |pkg|
42
+ pkg.need_zip = true
43
+ pkg.need_tar = true
44
+ pkg.gem_spec = spec
45
+ end
@@ -0,0 +1,66 @@
1
+ require 'rubygems'
2
+ require 'metaid'
3
+
4
+ # Allows the declaration of events to be triggered.
5
+ #
6
+ # Example:
7
+ #
8
+ # class User < Person
9
+ # def save
10
+ # ...
11
+ # end
12
+ # end
13
+ #
14
+ # user = User.new
15
+ # user.before(:save) { puts "Saving user..." }
16
+ # user.after(:save) { puts "User saved." }
17
+ # user.save
18
+ #
19
+ # The block yields the object itself, so it's possible to
20
+ # construct callbacks like this:
21
+ #
22
+ # user.before :save do |u|
23
+ # u.encrypt_password!
24
+ # end
25
+ #
26
+ class Object
27
+ def before sym, &block
28
+ append_triggerable sym, :before, &block
29
+ end
30
+
31
+ def after sym, &block
32
+ append_triggerable sym, :after, &block
33
+ end
34
+
35
+ private
36
+
37
+ def append_triggerable sym, moment, &block
38
+ update_triggerable_index sym, moment, &block
39
+ meta_def sym do |*attrs|
40
+ call_triggerable_methods sym, :before
41
+ result = call_triggerable_redefined_method(sym, *attrs)
42
+ call_triggerable_methods sym, :after
43
+ result
44
+ end
45
+ end
46
+
47
+ def update_triggerable_index sym, moment, &block
48
+ initialize_triggerable_index unless @triggerable_index
49
+ @triggerable_index[sym][:old] = method(sym) if @triggerable_index[sym][:old].eql?([])
50
+ @triggerable_index[sym][moment] << block
51
+ end
52
+
53
+ def call_triggerable_methods sym, moment
54
+ @triggerable_index[sym][moment].each do |block|
55
+ block.call(self)
56
+ end
57
+ end
58
+
59
+ def call_triggerable_redefined_method sym, *attrs
60
+ @triggerable_index[sym][:old].call(*attrs)
61
+ end
62
+
63
+ def initialize_triggerable_index
64
+ @triggerable_index ||= Hash.new { |hash, key| hash[key] = Hash.new { |h, k| h[k] = Array.new }}
65
+ end
66
+ end
@@ -0,0 +1,117 @@
1
+ require 'test/unit'
2
+ Dir.chdir File.dirname(__FILE__)
3
+ Dir.chdir '..'
4
+ require 'lib/trigger'
5
+
6
+ class Service
7
+ attr_accessor :status
8
+ attr_accessor :last_started
9
+ attr_accessor :working
10
+ attr_accessor :finalizer
11
+
12
+ def start
13
+ @status = 'Started'
14
+ end
15
+
16
+ def stop
17
+ @status = 'Stopped'
18
+ end
19
+
20
+ def change
21
+ @finalizer
22
+ end
23
+
24
+ def restart
25
+ start
26
+ end
27
+
28
+ def ping
29
+ end
30
+
31
+ def yielder
32
+ yield @status
33
+ end
34
+
35
+ def [] key
36
+ key
37
+ end
38
+
39
+ def method_missing method_symbol, *params
40
+ '1'
41
+ end
42
+ end
43
+
44
+
45
+ class TestTrigger < Test::Unit::TestCase
46
+ def setup
47
+ @service = Service.new
48
+ @service.before :start do |service|
49
+ service.last_started = Time.now
50
+ service.working = true
51
+ end
52
+
53
+ @service.before :stop do |service|
54
+ service.working = false
55
+ end
56
+
57
+ @service.after :ping do
58
+ 'pong'
59
+ end
60
+
61
+ @service.after :change do |service|
62
+ service.finalizer = true
63
+ end
64
+
65
+ @temp_status = ''
66
+ @service.before :yielder do |service|
67
+ @temp_status = service.status
68
+ service.status = "Hay!"
69
+ end
70
+
71
+ @service.after :yielder do |service|
72
+ service.status = @temp_status
73
+ end
74
+ end
75
+
76
+ def test_trigger_subclassed_start
77
+ @service.start
78
+ assert_equal 'Started', @service.status
79
+ end
80
+
81
+ def test_trigger_subclassed_start_triggered
82
+ @service.restart
83
+ assert_equal true, @service.working
84
+ end
85
+
86
+ def test_trigger_subclassed_stop_triggered
87
+ @service.stop
88
+ assert_equal false, @service.working
89
+ end
90
+
91
+ def test_trigger_subclassed_instance_restart_trigger
92
+ @last_started = nil
93
+ @service.on :restart do |service|
94
+ @last_started = service.last_started
95
+ end
96
+ @service.restart
97
+ assert_not_equal @last_started, @service.last_started
98
+ end
99
+
100
+ def test_trigger_subclassed_return_value
101
+ assert_equal nil, @service.ping
102
+ end
103
+
104
+ def test_trigger_changed_in_after_call_doesnt_affect_returned_value
105
+ assert_equal nil, @service.change
106
+ assert_equal true, @service.change
107
+ end
108
+
109
+ def test_trigger_should_not_interefere_with_methods_that_accept_blocks
110
+ assert_nothing_raised do
111
+ @service.yielder do |i|
112
+ puts i
113
+ puts "Hello!"
114
+ end
115
+ end
116
+ end
117
+ end
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.0
3
+ specification_version: 1
4
+ name: trigger
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.0.1
7
+ date: 2007-08-23 00:00:00 -03:00
8
+ summary: Trigger is a library for declaring and handling before and after events on method calls.
9
+ require_paths:
10
+ - lib
11
+ email: michel@soveran.org
12
+ homepage: http://www.soveran.com
13
+ rubyforge_project:
14
+ description: A simple library for declaring and handling before and after events on method calls.
15
+ autorequire: trigger
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: false
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Michel Martens
31
+ files:
32
+ - lib/trigger.rb
33
+ - test/ts_all.rb
34
+ - Rakefile
35
+ test_files:
36
+ - test/ts_all.rb
37
+ rdoc_options: []
38
+
39
+ extra_rdoc_files: []
40
+
41
+ executables: []
42
+
43
+ extensions: []
44
+
45
+ requirements: []
46
+
47
+ dependencies:
48
+ - !ruby/object:Gem::Dependency
49
+ name: metaid
50
+ version_requirement:
51
+ version_requirements: !ruby/object:Gem::Version::Requirement
52
+ requirements:
53
+ - - ">"
54
+ - !ruby/object:Gem::Version
55
+ version: 0.0.0
56
+ version: