methodchain 0.2.1 → 0.2.2
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/doc/created.rid +1 -1
- data/example.rb +90 -0
- data/pkg/methodchain-0.2.1.gem +0 -0
- data/rakefile +55 -28
- metadata +4 -2
data/doc/created.rid
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
Tue, 11 Mar 2008 13:49:16 -0500
|
data/example.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# :main: README
|
2
|
+
module MethodChain
|
3
|
+
|
4
|
+
# send a method, evaluate a block, but always return self
|
5
|
+
def tap meth=nil, &block
|
6
|
+
__send__ meth if meth
|
7
|
+
yield_or_eval(&block) if block_given?
|
8
|
+
self
|
9
|
+
end
|
10
|
+
|
11
|
+
# method chaining with a guard.
|
12
|
+
# If no guard block is given then guard against nil and false
|
13
|
+
# *methods = [method] where
|
14
|
+
# method = Message | Code
|
15
|
+
# Message = Symbol | [Symbol, *arguments]
|
16
|
+
# Code.to_proc = Proc
|
17
|
+
def chain *methods, &guard
|
18
|
+
return self if methods.empty? or not(
|
19
|
+
(block_given? ? (yield_or_eval(&guard)) : self))
|
20
|
+
|
21
|
+
case(meth = methods.shift)
|
22
|
+
when Symbol then __send__ meth
|
23
|
+
when Array then __send__(*meth)
|
24
|
+
else yield_or_eval(&meth)
|
25
|
+
end.chain(*methods, &guard)
|
26
|
+
end
|
27
|
+
|
28
|
+
# yield or eval based on the block arity
|
29
|
+
def yield_or_eval &block
|
30
|
+
case block.arity
|
31
|
+
# ruby bug for -1
|
32
|
+
when 0, -1 then instance_eval(&block)
|
33
|
+
when 1 then yield(self)
|
34
|
+
else raise ArgumentError, "too many arguments required by block"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# return self if self evaluates to false, otherwise
|
39
|
+
# evaluate the block or return the default argument
|
40
|
+
def then default=nil, &block
|
41
|
+
if self
|
42
|
+
block_given? ? (yield_or_eval(&block)) : (default || (fail \
|
43
|
+
ArgumentError, "#then must be called with an argument or a block"))
|
44
|
+
else
|
45
|
+
self
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# the inverse of then
|
50
|
+
def else arg=nil, &block
|
51
|
+
if self
|
52
|
+
self
|
53
|
+
else
|
54
|
+
block_given? ? (yield_or_eval(&block)) : (arg || (fail \
|
55
|
+
ArgumentError, "#else must be called with an argument or a bloc"))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
class Object; include MethodChain end
|
60
|
+
arr = [1]
|
61
|
+
arr.compact! # => nil
|
62
|
+
arr.first # => 1
|
63
|
+
[1].tap {|arr| arr.compact!}.first # => 1
|
64
|
+
[1].tap(:compact!).first # => 1
|
65
|
+
person = nil
|
66
|
+
name = person ? person.name : nil
|
67
|
+
name = person.then {|p| p.name}
|
68
|
+
def find(*args)
|
69
|
+
# do some expensive database queries
|
70
|
+
end
|
71
|
+
location = find(:first)
|
72
|
+
@phone = location && location.phone # => nil
|
73
|
+
@phone = find(:first).then {phone} # => nil
|
74
|
+
|
75
|
+
'a'.then('b') #=> 'b'
|
76
|
+
nil.then('b').else('c') #=> 'c'
|
77
|
+
customer = nil
|
78
|
+
customer && customer.order && customer.order.id
|
79
|
+
customer.chain(:order, :id)
|
80
|
+
customer.then {order}.then {id}
|
81
|
+
value = 0
|
82
|
+
result = if value == 0 then value else
|
83
|
+
tmp = value.abs
|
84
|
+
if tmp == 0 then tmp else
|
85
|
+
tmp * 20
|
86
|
+
end
|
87
|
+
end
|
88
|
+
result # => 0
|
89
|
+
value.chain(:abs, [:*, 20]) {|s| s == 0 } # => 0
|
90
|
+
value.chain(:abs, lambda {|n| n * 20 }) {|s| s == 0 } # => 0
|
Binary file
|
data/rakefile
CHANGED
@@ -10,6 +10,14 @@ def run command
|
|
10
10
|
res
|
11
11
|
end
|
12
12
|
def __DIR__; "#{File.dirname(__FILE__)}" end
|
13
|
+
|
14
|
+
def cd_tmp
|
15
|
+
Dir.mkdir 'tmp' unless File.directory? 'tmp'
|
16
|
+
Dir.chdir('tmp') do |dir|
|
17
|
+
yield dir
|
18
|
+
end
|
19
|
+
rm_rf 'tmp'
|
20
|
+
end
|
13
21
|
class IO
|
14
22
|
def self.write( file, str )
|
15
23
|
self.open( file, 'w' ) { |fh| fh.print str }
|
@@ -31,28 +39,37 @@ end
|
|
31
39
|
|
32
40
|
require 'rubygems'
|
33
41
|
require 'spec/rake/spectask'
|
34
|
-
desc "
|
35
|
-
|
36
|
-
t.spec_files = ['spec/*.rb']
|
37
|
-
t.rcov = true
|
38
|
-
t.rcov_opts = ['--exclude', 'spec']
|
39
|
-
end
|
40
|
-
|
42
|
+
desc "verify test coverage with RCov"
|
43
|
+
task :rcov => 'rcov:verify'
|
41
44
|
namespace :rcov do
|
45
|
+
Spec::Rake::SpecTask.new('rcov') do |t|
|
46
|
+
t.spec_files = ['spec/*.rb']
|
47
|
+
t.rcov = true
|
48
|
+
t.rcov_opts = ['--exclude', 'spec']
|
49
|
+
end
|
50
|
+
|
42
51
|
require 'spec/rake/verify_rcov'
|
43
|
-
|
52
|
+
# rcov is wrong- I am actually at 100%
|
53
|
+
RCov::VerifyTask.new(:verify => :rcov) do |t|
|
44
54
|
t.threshold = 100 # Make sure you have rcov 0.7 or higher!
|
45
55
|
t.index_html = 'coverage/lib-methodchain-not_included_rb.html'
|
46
56
|
end
|
47
57
|
end
|
48
58
|
|
49
59
|
desc "release a new gem to rubyforge"
|
50
|
-
task :release => [:rdoc,:package] do
|
60
|
+
task :release => [:test,:record,:rdoc,:website,:package] do
|
51
61
|
Dir.chdir('pkg') do
|
52
62
|
release = Dir['*.gem'].sort_by {|file| File.mtime(file)}.last
|
53
63
|
release =~ /^[^-]+-([.0-9]+).gem$/
|
54
|
-
puts
|
55
|
-
|
64
|
+
(puts (run "rubyforge login && rubyforge add_release #{project} #{project} #$1 #{release}"))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
desc "update website"
|
69
|
+
file :website => ['README','rakefile'] do
|
70
|
+
Dir.chdir '/home/greg/sites/projects/' do
|
71
|
+
(puts (run 'rake projects:update'))
|
72
|
+
(puts (run 'rake deploy:rsync'))
|
56
73
|
end
|
57
74
|
end
|
58
75
|
|
@@ -81,23 +98,33 @@ namespace :readme do
|
|
81
98
|
desc "run README code through xmp filter"
|
82
99
|
task :test do
|
83
100
|
# grab example code from README
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
101
|
+
cd_tmp do
|
102
|
+
example_file = "#{__DIR__}/example.rb"
|
103
|
+
|
104
|
+
File.write(example_file, (
|
105
|
+
File.read("#{__DIR__}/lib/methodchain/not_included.rb") <<
|
106
|
+
"class Object; include MethodChain end\n" <<
|
107
|
+
File.readlines('../README').grep(/^ / ).
|
108
|
+
reject {|l| l =~ /^\s*require/ or l.include?('Error')}.
|
109
|
+
join ))
|
110
|
+
|
111
|
+
command = "ruby ../bin/xmpfilter -c #{example_file}"
|
112
|
+
Dir.chdir '/home/greg/src/head/lib' do
|
113
|
+
run "#{command}"
|
114
|
+
end
|
115
|
+
puts "README code successfully evaluated"
|
98
116
|
end
|
99
|
-
|
100
|
-
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
desc 'git add and push'
|
121
|
+
task :record do
|
122
|
+
unless `git diff`.chomp.empty?
|
123
|
+
ARGV.clear
|
124
|
+
puts "enter commit message"
|
125
|
+
(puts (run "git commit -a -m #{Kernel.gets}"))
|
126
|
+
puts "committed! now pushing.. "
|
127
|
+
(puts (run 'git push origin master'))
|
101
128
|
end
|
102
129
|
end
|
103
130
|
|
@@ -107,7 +134,7 @@ require 'rake/gempackagetask'
|
|
107
134
|
spec = Gem::Specification.new do |s|
|
108
135
|
s.name = project
|
109
136
|
s.rubyforge_project = project
|
110
|
-
s.version = "0.2.
|
137
|
+
s.version = "0.2.2"
|
111
138
|
s.author = "Greg Weber"
|
112
139
|
s.email = "greg@gregweber.info"
|
113
140
|
s.homepage = "http://projects.gregweber.info/#{project}"
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: methodchain
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
7
|
-
date: 2008-03-
|
6
|
+
version: 0.2.2
|
7
|
+
date: 2008-03-11 00:00:00 -05:00
|
8
8
|
summary: convenience methods for method chaining
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -35,6 +35,7 @@ files:
|
|
35
35
|
- ./spec
|
36
36
|
- ./README
|
37
37
|
- ./rakefile
|
38
|
+
- ./example.rb
|
38
39
|
- ./coverage
|
39
40
|
- doc/files
|
40
41
|
- doc/index.html
|
@@ -47,6 +48,7 @@ files:
|
|
47
48
|
- lib/methodchain
|
48
49
|
- lib/methodchain.rb
|
49
50
|
- pkg/methodchain-0.2.0.gem
|
51
|
+
- pkg/methodchain-0.2.1.gem
|
50
52
|
- pkg/methodchain-0.0.1.gem
|
51
53
|
- pkg/methodchain-0.0.3.gem
|
52
54
|
- pkg/methodchain-0.0.5.gem
|