after_do 0.1.0
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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +67 -0
- data/Rakefile +1 -0
- data/after_do.gemspec +25 -0
- data/lib/after_do.rb +62 -0
- data/lib/after_do/version.rb +3 -0
- data/samples/dog.rb +21 -0
- data/spec/after_do_spec.rb +143 -0
- data/spec/spec_helper.rb +8 -0
- metadata +131 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0ef93b03d163368d4323b3b457a104fbcbf8dde4
|
4
|
+
data.tar.gz: c3efe779604f230849918900543f1a4a2d68d6f7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 384930d2ac61d25b48cd269db52679d8d0860ef0bfa5c13621c55ba26af30bb83b12aeb5f2ad0f58065d9c1d71dada4d5a784d876c09374e3ed6c17de75f8ec1
|
7
|
+
data.tar.gz: 2bf8dd100317b5a6ec541ddd514288eae869b4b0930d3fe6a28ef08bda302837e8c84e32f1722fd1021edec6c100de846a46cd4a53213d128e900a7fdf2c90ee
|
data/.gitignore
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
after_do
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.0.0-p195
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Tobias Pfeiffer
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# AfterDo [](https://travis-ci.org/PragTob/after_do)[](https://codeclimate.com/github/PragTob/after_do)
|
2
|
+
|
3
|
+
AfterDo is simple gem, that allows you to execute a specified block after specified method of a class are called. If the class extends `AfterDo` you can simply do this by `MyClass.after :some_method do puts 'whatever you want?' end`
|
4
|
+
|
5
|
+
This shall not be done to to alter behavior or something but rather to fight cross-cutting concerns such as logging. E.g. with logging you litter all your code wit logging statements - that concern is spread over many files. With AfterDo you could put all the logging in one file.
|
6
|
+
|
7
|
+
AfterDo has no external runtime dependencies and the code is just a bit more than 60 lines (blank lines included).
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
gem 'after_do'
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install after_do
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
With AfterDo you can do simple things like putting something out everything a method is called as in this example:
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
class Dog
|
29
|
+
def bark
|
30
|
+
puts 'Woooof'
|
31
|
+
end
|
32
|
+
|
33
|
+
def eat
|
34
|
+
puts 'yummie!'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
Dog.extend AfterDo
|
39
|
+
Dog.after :bark do puts 'I just heard a dog bark!' end
|
40
|
+
|
41
|
+
dog = Dog.new
|
42
|
+
dog2 = Dog.new
|
43
|
+
|
44
|
+
dog.bark
|
45
|
+
dog.eat
|
46
|
+
dog2.bark
|
47
|
+
|
48
|
+
# Output is:
|
49
|
+
# Woooof
|
50
|
+
# I just heard a dog bark!
|
51
|
+
# yummie!
|
52
|
+
# Woooof
|
53
|
+
# I just heard a dog bark!
|
54
|
+
|
55
|
+
```
|
56
|
+
|
57
|
+
## Is there a before method?
|
58
|
+
|
59
|
+
No not yet, I didn't have a use case for it yet. If you have one please let me know, it is relatively easy to add.
|
60
|
+
|
61
|
+
## Contributing
|
62
|
+
|
63
|
+
1. Fork it
|
64
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
65
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
66
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
67
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/after_do.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'after_do/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "after_do"
|
8
|
+
spec.version = AfterDo::VERSION
|
9
|
+
spec.authors = ["Tobias Pfeiffer"]
|
10
|
+
spec.email = ["pragtob@gmail.com"]
|
11
|
+
spec.description = %q{after_do is a gem that let's you execute a block of your choice after a specific method was called on a class.}
|
12
|
+
spec.summary = %q{after_do allows you to do simple after hooks on methods}
|
13
|
+
spec.homepage = "https://github.com/PragTob/after_do"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
21
|
+
spec.add_development_dependency "rake"
|
22
|
+
spec.add_development_dependency "rspec"
|
23
|
+
spec.add_development_dependency "simplecov"
|
24
|
+
spec.add_development_dependency "coveralls"
|
25
|
+
end
|
data/lib/after_do.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
module AfterDo
|
2
|
+
ALIAS_PREFIX = '__after_do_orig_'
|
3
|
+
|
4
|
+
def _after_do_callbacks
|
5
|
+
@_after_do_callbacks
|
6
|
+
end
|
7
|
+
|
8
|
+
def after(*methods, &block)
|
9
|
+
@_after_do_callbacks ||= Hash.new([])
|
10
|
+
methods.flatten! #in case someone used an Array
|
11
|
+
if methods.empty?
|
12
|
+
raise ArgumentError, 'after takes at least one method name!'
|
13
|
+
end
|
14
|
+
methods.each do |method|
|
15
|
+
if _after_do_method_already_renamed?(method)
|
16
|
+
_after_do_make_after_do_version_of_method(method)
|
17
|
+
end
|
18
|
+
@_after_do_callbacks[method] << block
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def remove_all_callbacks
|
23
|
+
if @_after_do_callbacks
|
24
|
+
@_after_do_callbacks.keys.each do |key| @_after_do_callbacks[key] = [] end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def _after_do_make_after_do_version_of_method(method)
|
30
|
+
@_after_do_callbacks[method] = []
|
31
|
+
alias_name = _after_do_aliased_name method
|
32
|
+
_after_do_rename_old_method(method, alias_name)
|
33
|
+
_after_do_redefine_method_with_callback(method, alias_name)
|
34
|
+
end
|
35
|
+
|
36
|
+
def _after_do_aliased_name(symbol)
|
37
|
+
(ALIAS_PREFIX + symbol.to_s).to_sym
|
38
|
+
end
|
39
|
+
|
40
|
+
def _after_do_rename_old_method(old_name, new_name)
|
41
|
+
class_eval do
|
42
|
+
alias_method new_name, old_name
|
43
|
+
private new_name
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def _after_do_redefine_method_with_callback(method, alias_name)
|
48
|
+
class_eval do
|
49
|
+
define_method method do |*args|
|
50
|
+
return_value = send(alias_name, *args)
|
51
|
+
self.class._after_do_callbacks[method].each do |block|
|
52
|
+
block.call *args, self
|
53
|
+
end
|
54
|
+
return_value
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def _after_do_method_already_renamed?(method)
|
60
|
+
!private_method_defined? _after_do_aliased_name(method)
|
61
|
+
end
|
62
|
+
end
|
data/samples/dog.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.expand_path('../../lib/after_do', __FILE__)
|
2
|
+
|
3
|
+
class Dog
|
4
|
+
def bark
|
5
|
+
puts 'Woooof'
|
6
|
+
end
|
7
|
+
|
8
|
+
def eat
|
9
|
+
puts 'yummie!'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Dog.extend AfterDo
|
14
|
+
Dog.after :bark do puts 'I just heard a dog bark!' end
|
15
|
+
|
16
|
+
dog = Dog.new
|
17
|
+
dog2 = Dog.new
|
18
|
+
|
19
|
+
dog.bark
|
20
|
+
dog.eat
|
21
|
+
dog2.bark
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AfterDo do
|
4
|
+
let(:dummy_instance) {@dummy_class.new}
|
5
|
+
let(:mockie) {double}
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
redefine_dummy_class
|
9
|
+
end
|
10
|
+
|
11
|
+
def redefine_dummy_class
|
12
|
+
@dummy_class = Class.new do
|
13
|
+
extend AfterDo
|
14
|
+
def zero
|
15
|
+
0
|
16
|
+
end
|
17
|
+
|
18
|
+
def one(param)
|
19
|
+
param
|
20
|
+
end
|
21
|
+
|
22
|
+
def two(param1, param2)
|
23
|
+
param2
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
it 'responds to after' do
|
30
|
+
@dummy_class.should respond_to :after
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'calls a method on the injected mockie' do
|
34
|
+
mockie.should_receive :call_method
|
35
|
+
@dummy_class.after :zero do mockie.call_method end
|
36
|
+
dummy_instance.zero
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'does not change the return value' do
|
40
|
+
before = dummy_instance.zero
|
41
|
+
@dummy_class.after :zero do 42 end
|
42
|
+
after = dummy_instance.zero
|
43
|
+
after.should eq before
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'marks the copied method as private' do
|
47
|
+
@dummy_class.after :zero do end
|
48
|
+
copied_method_name = (AfterDo::ALIAS_PREFIX + 'zero').to_sym
|
49
|
+
dummy_instance.respond_to?(copied_method_name).should be_false
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'can add multiple call backs' do
|
53
|
+
mockie.should_receive :call_method
|
54
|
+
mock2 = double
|
55
|
+
mock2.should_receive :call_another_method
|
56
|
+
mock3 = double
|
57
|
+
mock3.should_receive :bla
|
58
|
+
@dummy_class.after :zero do mockie.call_method end
|
59
|
+
@dummy_class.after :zero do mock2.call_another_method end
|
60
|
+
@dummy_class.after :zero do mock3.bla end
|
61
|
+
dummy_instance.zero
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'can remove all callbacks' do
|
65
|
+
mockie.should_not_receive :call_method
|
66
|
+
@dummy_class.after :zero do mockie.call_method end
|
67
|
+
@dummy_class.remove_all_callbacks
|
68
|
+
dummy_instance.zero
|
69
|
+
end
|
70
|
+
|
71
|
+
describe 'with parameters' do
|
72
|
+
|
73
|
+
before :each do
|
74
|
+
mockie.should_receive :call_method
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'can handle methods with a parameter' do
|
78
|
+
@dummy_class.after :one do mockie.call_method end
|
79
|
+
dummy_instance.one 5
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'can handle methods with 2 parameters' do
|
83
|
+
@dummy_class.after :two do mockie.call_method end
|
84
|
+
dummy_instance.two 5, 8
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'with parameters for the given block' do
|
89
|
+
it 'can handle one block parameter' do
|
90
|
+
mockie.should_receive(:call_method).with(5)
|
91
|
+
@dummy_class.after :one do |i| mockie.call_method i end
|
92
|
+
dummy_instance.one 5
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'can handle two block parameters' do
|
96
|
+
mockie.should_receive(:call_method).with(5, 8)
|
97
|
+
@dummy_class.after :two do |i, j| mockie.call_method i, j end
|
98
|
+
dummy_instance.two 5, 8
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe 'multiple methods' do
|
103
|
+
def call_all_3_methods
|
104
|
+
dummy_instance.zero
|
105
|
+
dummy_instance.one 4
|
106
|
+
dummy_instance.two 4, 5
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'can take multiple method names as arguments' do
|
110
|
+
mockie.should_receive(:call_method).exactly(3).times
|
111
|
+
@dummy_class.after :zero, :one, :two do mockie.call_method end
|
112
|
+
call_all_3_methods
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'can get the methods as an Array' do
|
116
|
+
mockie.should_receive(:call_method).exactly(3).times
|
117
|
+
@dummy_class.after [:zero, :one, :two] do mockie.call_method end
|
118
|
+
call_all_3_methods
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'raises an error when no method is specified' do
|
122
|
+
expect do
|
123
|
+
@dummy_class.after do mockie.call_method end
|
124
|
+
end.to raise_error ArgumentError
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe 'it can get a hold of self, if needbe' do
|
129
|
+
it 'works for a method without arguments' do
|
130
|
+
mockie.should_receive(:call_method).with(dummy_instance)
|
131
|
+
@dummy_class.after :zero do |object| mockie.call_method(object) end
|
132
|
+
dummy_instance.zero
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'works for a method with 2 arguments' do
|
136
|
+
mockie.should_receive(:call_method).with(1, 2, dummy_instance)
|
137
|
+
@dummy_class.after :two do |first, second, object|
|
138
|
+
mockie.call_method(first, second, object)
|
139
|
+
end
|
140
|
+
dummy_instance.two 1, 2
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: after_do
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tobias Pfeiffer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-07-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: coveralls
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: after_do is a gem that let's you execute a block of your choice after
|
84
|
+
a specific method was called on a class.
|
85
|
+
email:
|
86
|
+
- pragtob@gmail.com
|
87
|
+
executables: []
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- .gitignore
|
92
|
+
- .ruby-gemset
|
93
|
+
- .ruby-version
|
94
|
+
- .travis.yml
|
95
|
+
- Gemfile
|
96
|
+
- LICENSE.txt
|
97
|
+
- README.md
|
98
|
+
- Rakefile
|
99
|
+
- after_do.gemspec
|
100
|
+
- lib/after_do.rb
|
101
|
+
- lib/after_do/version.rb
|
102
|
+
- samples/dog.rb
|
103
|
+
- spec/after_do_spec.rb
|
104
|
+
- spec/spec_helper.rb
|
105
|
+
homepage: https://github.com/PragTob/after_do
|
106
|
+
licenses:
|
107
|
+
- MIT
|
108
|
+
metadata: {}
|
109
|
+
post_install_message:
|
110
|
+
rdoc_options: []
|
111
|
+
require_paths:
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - '>='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
requirements: []
|
124
|
+
rubyforge_project:
|
125
|
+
rubygems_version: 2.0.3
|
126
|
+
signing_key:
|
127
|
+
specification_version: 4
|
128
|
+
summary: after_do allows you to do simple after hooks on methods
|
129
|
+
test_files:
|
130
|
+
- spec/after_do_spec.rb
|
131
|
+
- spec/spec_helper.rb
|