method_wrapper 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ autotest/*
2
+ *.gem
3
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+ gemspec
3
+
data/Gemfile.lock ADDED
@@ -0,0 +1,27 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ method_wrapper (0.1.0)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.1.2)
10
+ rspec (2.0.1)
11
+ rspec-core (~> 2.0.1)
12
+ rspec-expectations (~> 2.0.1)
13
+ rspec-mocks (~> 2.0.1)
14
+ rspec-core (2.0.1)
15
+ rspec-expectations (2.0.1)
16
+ diff-lcs (>= 1.1.2)
17
+ rspec-mocks (2.0.1)
18
+ rspec-core (~> 2.0.1)
19
+ rspec-expectations (~> 2.0.1)
20
+
21
+ PLATFORMS
22
+ ruby
23
+
24
+ DEPENDENCIES
25
+ bundler (>= 1.0.0.rc.5)
26
+ method_wrapper!
27
+ rspec (>= 2.0.0)
data/README.rdoc ADDED
@@ -0,0 +1,74 @@
1
+ = Method Wrapper
2
+
3
+ <em>Lightweight method wrapper in Ruby.</em>
4
+
5
+ == Introduction
6
+
7
+ This gem help you to to wrap new features around (before and after) existing methods call on Any classes.
8
+
9
+ The before_ and after_ callbacks will run as soon as you call wrapped method.
10
+
11
+ == Installation
12
+
13
+ gem install method_wrapper
14
+
15
+ == Examples
16
+ require 'method_wrapper'
17
+
18
+ class Klass
19
+ include MethodWrapper
20
+ wrap_methods :method_name
21
+
22
+ def method_name
23
+ puts 'hi'
24
+ end
25
+
26
+ def before_method_name
27
+ puts "calls before method name"
28
+ end
29
+
30
+ def after_method_name
31
+ puts "calls after method name"
32
+ end
33
+ end
34
+
35
+ You can also has partial callback
36
+ require 'method_wrapper'
37
+
38
+ class Klass
39
+ include MethodWrapper
40
+ wrap_methods :method_name, :second_method_name
41
+
42
+ def method_name
43
+ puts 'hi'
44
+ end
45
+
46
+ def second_method_name
47
+ puts 'hello'
48
+ end
49
+
50
+ def before_method_name
51
+ puts "calls before method name"
52
+ end
53
+
54
+ def after_method_name
55
+ puts "calls after method name"
56
+ end
57
+
58
+ def after_second_method_name
59
+ puts "calls after second method name"
60
+ end
61
+ end
62
+
63
+ You can also open the existing classes to wrap methods
64
+ require 'method_wrapper'
65
+
66
+ class String
67
+ include MethodWrapper
68
+ wrap_methods :reverse
69
+
70
+ def before_reverse
71
+ puts "calls before string reverse"
72
+ end
73
+ end
74
+
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,4 @@
1
+ module MethodWrapper
2
+ VERSION = "0.1.0"
3
+ end
4
+
@@ -0,0 +1,52 @@
1
+ module MethodWrapper
2
+ def self.included(base)
3
+ base.instance_variable_set(:@_wrapped_methods, [])
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ private
8
+ def invoke_method(name)
9
+ send(name) if respond_to? name, true
10
+ end
11
+
12
+ module ClassMethods
13
+ def method_added(name)
14
+ return if @_disable_hook_method_added
15
+
16
+ _wrap_method!(name) if @_wrapped_methods.include? name
17
+ end
18
+
19
+ def wrap_methods(*args)
20
+ @_wrapped_methods = args
21
+
22
+ @_wrapped_methods.each do |name|
23
+ _wrap_method!(name) if instance_method_defined? name
24
+ end
25
+ end
26
+
27
+ private
28
+ def _wrap_method!(name)
29
+ @_disable_hook_method_added = true
30
+
31
+ origin_method_name = "origin_#{name}"
32
+ origin_method = instance_method(name)
33
+
34
+ alias_method origin_method_name, name
35
+
36
+ define_method(name) do |*args, &block|
37
+ invoke_method("before_#{name}")
38
+ return_result = origin_method.bind(self).call(*args, &block)
39
+ invoke_method("after_#{name}")
40
+
41
+ return_result
42
+ end
43
+
44
+ @_disable_hook_method_added = false
45
+ end
46
+
47
+ def instance_method_defined?(name)
48
+ instance_methods.include? name.to_sym
49
+ end
50
+ end
51
+ end
52
+
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
3
+ require 'method_wrapper/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "method_wrapper"
7
+ s.version = MethodWrapper::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Samnang Chhun"]
10
+ s.email = ["samnang.chhun@gmail.com"]
11
+ s.homepage = "http://github.com/samnang/method_wrapper"
12
+ s.summary = "How easy to wrap new features around (before and after) existing methods call with method_wrapper."
13
+ s.description = "This gem help you to to wrap new features around (before and after) existing methods call on Any classes. The before_ and after_ callbacks will run as soon as you call wrapped method."
14
+
15
+ s.required_rubygems_version = ">= 1.3.6"
16
+ s.rubyforge_project = "[none]"
17
+
18
+ s.add_development_dependency "bundler", ">= 1.0.0.rc.5"
19
+ s.add_development_dependency "rspec", ">= 2.0.0"
20
+
21
+ s.files = `git ls-files`.split("\n")
22
+ s.require_path = 'lib'
23
+ end
24
+
@@ -0,0 +1,83 @@
1
+ class ClassBuilder
2
+ class << self
3
+ def a_class_has_methods_and_calls_after_methods_defined
4
+ Class.new do
5
+ include MethodWrapper
6
+
7
+ def method_name
8
+ end
9
+
10
+ def second_method_name
11
+ end
12
+
13
+ wrap_methods :method_name, :second_method_name
14
+ end
15
+ end
16
+
17
+ def a_class_has_methods_and_calls_before_methods_defined
18
+ Class.new do
19
+ include MethodWrapper
20
+ wrap_methods :method_name, :second_method_name
21
+
22
+ def method_name
23
+ end
24
+
25
+ def second_method_name
26
+ end
27
+ end
28
+ end
29
+
30
+ def a_class_has_before_and_after_wrap_methods
31
+ Class.new do
32
+ include MethodWrapper
33
+ wrap_methods :method_name
34
+
35
+ def method_name
36
+ end
37
+
38
+ private
39
+ def before_method_name
40
+ @has_called_before_callback = true
41
+ end
42
+
43
+ def after_method_name
44
+ @has_called_after_callback = true
45
+ end
46
+ end
47
+ end
48
+
49
+ def a_class_has_partial_callback
50
+ Class.new do
51
+ include MethodWrapper
52
+
53
+ def method_name
54
+ end
55
+
56
+ private
57
+ def before_method_name
58
+ @has_called_before_callback = true
59
+ end
60
+
61
+ wrap_methods :method_name
62
+ end
63
+ end
64
+
65
+ def a_class_has_method_with_args_and_block
66
+ Class.new do
67
+ include MethodWrapper
68
+ wrap_methods :method_name
69
+
70
+ def method_name(param)
71
+ @param = param
72
+ yield
73
+ end
74
+
75
+ private
76
+ def after_method_name
77
+ @has_called_after_callback = true
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe MethodWrapper do
4
+ describe ".wrap_methods, stores methods that want to wrap" do
5
+ it "calls after method defined" do
6
+ klass = ClassBuilder.a_class_has_methods_and_calls_after_methods_defined
7
+
8
+ verify_wrapped_methods(klass)
9
+ end
10
+
11
+ it "calls before method defined" do
12
+ klass = ClassBuilder.a_class_has_methods_and_calls_before_methods_defined
13
+
14
+ verify_wrapped_methods(klass)
15
+ end
16
+
17
+ def verify_wrapped_methods(klass)
18
+ klass.instance_variable_get(:@_wrapped_methods).should ==
19
+ [:method_name, :second_method_name]
20
+ end
21
+ end
22
+
23
+ context "invoke the wrapped methods" do
24
+ it "should invoke _before_method_name and after_method_name" do
25
+ klass = ClassBuilder.a_class_has_before_and_after_wrap_methods
26
+ obj = klass.new
27
+
28
+ obj.method_name
29
+
30
+ obj.instance_variable_get(:@has_called_before_callback).should eql(true)
31
+ obj.instance_variable_get(:@has_called_after_callback).should eql(true)
32
+ end
33
+
34
+ it "should ignore callbacks if user hasn't defined" do
35
+ klass = ClassBuilder.a_class_has_partial_callback
36
+ obj = klass.new
37
+
38
+ obj.method_name
39
+
40
+ obj.instance_variable_get(:@has_called_before_callback).should eql(true)
41
+ end
42
+
43
+ it "should be able to invoke the method with args and block" do
44
+ klass = ClassBuilder.a_class_has_method_with_args_and_block
45
+ obj = klass.new
46
+ has_called = false
47
+
48
+ obj.method_name("value") do
49
+ has_called = true
50
+ end
51
+
52
+ obj.instance_variable_get(:@param).should eql("value")
53
+ has_called.should eql(true)
54
+ obj.instance_variable_get(:@has_called_after_callback).should eql(true)
55
+ end
56
+ end
57
+ end
58
+
@@ -0,0 +1,5 @@
1
+ require 'rspec'
2
+
3
+ require_relative 'class_builder'
4
+ require_relative '../lib/method_wrapper.rb'
5
+
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: method_wrapper
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Samnang Chhun
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-10-30 00:00:00 +07:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: bundler
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 1
30
+ - 0
31
+ - 0
32
+ - rc
33
+ - 5
34
+ version: 1.0.0.rc.5
35
+ type: :development
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ segments:
46
+ - 2
47
+ - 0
48
+ - 0
49
+ version: 2.0.0
50
+ type: :development
51
+ version_requirements: *id002
52
+ description: This gem help you to to wrap new features around (before and after) existing methods call on Any classes. The before_ and after_ callbacks will run as soon as you call wrapped method.
53
+ email:
54
+ - samnang.chhun@gmail.com
55
+ executables: []
56
+
57
+ extensions: []
58
+
59
+ extra_rdoc_files: []
60
+
61
+ files:
62
+ - .gitignore
63
+ - Gemfile
64
+ - Gemfile.lock
65
+ - README.rdoc
66
+ - Rakefile
67
+ - lib/method_wrapper.rb
68
+ - lib/method_wrapper/version.rb
69
+ - method_wrapper.gemspec
70
+ - spec/class_builder.rb
71
+ - spec/method_wrapper_spec.rb
72
+ - spec/spec_helper.rb
73
+ has_rdoc: true
74
+ homepage: http://github.com/samnang/method_wrapper
75
+ licenses: []
76
+
77
+ post_install_message:
78
+ rdoc_options: []
79
+
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ segments:
88
+ - 0
89
+ version: "0"
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ segments:
96
+ - 1
97
+ - 3
98
+ - 6
99
+ version: 1.3.6
100
+ requirements: []
101
+
102
+ rubyforge_project: "[none]"
103
+ rubygems_version: 1.3.7
104
+ signing_key:
105
+ specification_version: 3
106
+ summary: How easy to wrap new features around (before and after) existing methods call with method_wrapper.
107
+ test_files: []
108
+