redef 0.4.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/README +45 -0
- data/gemspec.rb +38 -0
- data/gen_readme.rb +35 -0
- data/install.rb +214 -0
- data/lib/redef.rb +41 -0
- data/samples/a.rb +23 -0
- metadata +69 -0
data/README
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
NAME
|
|
2
|
+
redef.rb
|
|
3
|
+
|
|
4
|
+
DESCRIPTION
|
|
5
|
+
a sane way to redefine methods in ruby
|
|
6
|
+
|
|
7
|
+
INSTALL
|
|
8
|
+
gem install redef
|
|
9
|
+
|
|
10
|
+
SAMPLES
|
|
11
|
+
|
|
12
|
+
<========< samples/a.rb >========>
|
|
13
|
+
|
|
14
|
+
~ > cat samples/a.rb
|
|
15
|
+
|
|
16
|
+
# redef is a super simple way to robustly override methods - providing the
|
|
17
|
+
# POLS method of referring to the previous method as (wait for it) super.
|
|
18
|
+
# it's really that simple
|
|
19
|
+
#
|
|
20
|
+
require 'redef'
|
|
21
|
+
|
|
22
|
+
class C
|
|
23
|
+
def foo() 30 end
|
|
24
|
+
|
|
25
|
+
p C.new.foo #=> 30
|
|
26
|
+
|
|
27
|
+
redef do
|
|
28
|
+
def foo() super + 2 end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
p C.new.foo #=> 32
|
|
32
|
+
|
|
33
|
+
redef do
|
|
34
|
+
def foo() super + 10 end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
p C.new.foo #=> 42
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
~ > ruby samples/a.rb
|
|
41
|
+
|
|
42
|
+
30
|
|
43
|
+
32
|
|
44
|
+
42
|
|
45
|
+
|
data/gemspec.rb
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#! /usr/bin/env gem build
|
|
2
|
+
|
|
3
|
+
lib, version = File::basename(File::dirname(File::expand_path(__FILE__))).split %r/-/, 2
|
|
4
|
+
|
|
5
|
+
require 'rubygems'
|
|
6
|
+
|
|
7
|
+
Gem::Specification::new do |spec|
|
|
8
|
+
$VERBOSE = nil
|
|
9
|
+
|
|
10
|
+
shiteless = lambda do |list|
|
|
11
|
+
list.delete_if do |file|
|
|
12
|
+
file =~ %r/\.svn/ or
|
|
13
|
+
file =~ %r/\.tmp/
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
spec.name = lib
|
|
18
|
+
spec.version = version
|
|
19
|
+
spec.platform = Gem::Platform::RUBY
|
|
20
|
+
spec.summary = lib
|
|
21
|
+
|
|
22
|
+
spec.files = shiteless[Dir::glob("**/**")]
|
|
23
|
+
spec.executables = shiteless[Dir::glob("bin/*")].map{|exe| File::basename exe}
|
|
24
|
+
|
|
25
|
+
spec.require_path = "lib"
|
|
26
|
+
|
|
27
|
+
spec.has_rdoc = File::exist? "doc"
|
|
28
|
+
spec.test_suite_file = "test/#{ lib }.rb" if File::directory? "test"
|
|
29
|
+
#spec.add_dependency 'lib', '>= version'
|
|
30
|
+
spec.add_dependency 'fattr'
|
|
31
|
+
|
|
32
|
+
spec.extensions << "extconf.rb" if File::exists? "extconf.rb"
|
|
33
|
+
|
|
34
|
+
spec.rubyforge_project = 'codeforpeople'
|
|
35
|
+
spec.author = "Ara T. Howard"
|
|
36
|
+
spec.email = "ara.t.howard@gmail.com"
|
|
37
|
+
spec.homepage = "http://codeforpeople.com/lib/ruby/#{ lib }/"
|
|
38
|
+
end
|
data/gen_readme.rb
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#! /usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'pathname'
|
|
4
|
+
|
|
5
|
+
$VERBOSE=nil
|
|
6
|
+
|
|
7
|
+
def indent s, n = 2
|
|
8
|
+
ws = ' ' * n
|
|
9
|
+
s.gsub %r/^/, ws
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
template = IO::read 'README.tmpl'
|
|
13
|
+
|
|
14
|
+
samples = ''
|
|
15
|
+
prompt = '~ > '
|
|
16
|
+
|
|
17
|
+
Dir['sample*/*'].sort.each do |sample|
|
|
18
|
+
samples << "\n" << " <========< #{ sample } >========>" << "\n\n"
|
|
19
|
+
|
|
20
|
+
cmd = "cat #{ sample }"
|
|
21
|
+
samples << indent(prompt + cmd, 2) << "\n\n"
|
|
22
|
+
samples << indent(`#{ cmd }`, 4) << "\n"
|
|
23
|
+
|
|
24
|
+
cmd = "ruby #{ sample }"
|
|
25
|
+
samples << indent(prompt + cmd, 2) << "\n\n"
|
|
26
|
+
|
|
27
|
+
cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -Ilib #{ sample })'"
|
|
28
|
+
#cmd = "ruby -Ilib #{ sample }"
|
|
29
|
+
samples << indent(`#{ cmd } 2>&1`, 4) << "\n"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
#samples.gsub! %r/^/, ' '
|
|
33
|
+
|
|
34
|
+
readme = template.gsub %r/^\s*@samples\s*$/, samples
|
|
35
|
+
print readme
|
data/install.rb
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require 'rbconfig'
|
|
3
|
+
require 'find'
|
|
4
|
+
require 'ftools'
|
|
5
|
+
require 'tempfile'
|
|
6
|
+
include Config
|
|
7
|
+
|
|
8
|
+
LIBDIR = "lib"
|
|
9
|
+
LIBDIR_MODE = 0644
|
|
10
|
+
|
|
11
|
+
BINDIR = "bin"
|
|
12
|
+
BINDIR_MODE = 0755
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
$srcdir = CONFIG["srcdir"]
|
|
16
|
+
$version = CONFIG["MAJOR"]+"."+CONFIG["MINOR"]
|
|
17
|
+
$libdir = File.join(CONFIG["libdir"], "ruby", $version)
|
|
18
|
+
$archdir = File.join($libdir, CONFIG["arch"])
|
|
19
|
+
$site_libdir = $:.find {|x| x =~ /site_ruby$/}
|
|
20
|
+
$bindir = CONFIG["bindir"] || CONFIG['BINDIR']
|
|
21
|
+
$ruby_install_name = CONFIG['ruby_install_name'] || CONFIG['RUBY_INSTALL_NAME'] || 'ruby'
|
|
22
|
+
$ruby_ext = CONFIG['EXEEXT'] || ''
|
|
23
|
+
$ruby = File.join($bindir, ($ruby_install_name + $ruby_ext))
|
|
24
|
+
|
|
25
|
+
if !$site_libdir
|
|
26
|
+
$site_libdir = File.join($libdir, "site_ruby")
|
|
27
|
+
elsif $site_libdir !~ %r/#{Regexp.quote($version)}/
|
|
28
|
+
$site_libdir = File.join($site_libdir, $version)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def install_rb(srcdir=nil, destdir=nil, mode=nil, bin=nil)
|
|
32
|
+
#{{{
|
|
33
|
+
path = []
|
|
34
|
+
dir = []
|
|
35
|
+
Find.find(srcdir) do |f|
|
|
36
|
+
next unless FileTest.file?(f)
|
|
37
|
+
next if (f = f[srcdir.length+1..-1]) == nil
|
|
38
|
+
next if (/CVS$/ =~ File.dirname(f))
|
|
39
|
+
next if (/\.svn/ =~ File.dirname(f))
|
|
40
|
+
next if f =~ %r/\.lnk/
|
|
41
|
+
next if f =~ %r/\.svn/
|
|
42
|
+
next if f =~ %r/\.swp/
|
|
43
|
+
next if f =~ %r/\.svn/
|
|
44
|
+
path.push f
|
|
45
|
+
dir |= [File.dirname(f)]
|
|
46
|
+
end
|
|
47
|
+
for f in dir
|
|
48
|
+
next if f == "."
|
|
49
|
+
next if f == "CVS"
|
|
50
|
+
File::makedirs(File.join(destdir, f))
|
|
51
|
+
end
|
|
52
|
+
for f in path
|
|
53
|
+
next if (/\~$/ =~ f)
|
|
54
|
+
next if (/^\./ =~ File.basename(f))
|
|
55
|
+
unless bin
|
|
56
|
+
File::install(File.join(srcdir, f), File.join(destdir, f), mode, true)
|
|
57
|
+
else
|
|
58
|
+
from = File.join(srcdir, f)
|
|
59
|
+
to = File.join(destdir, f)
|
|
60
|
+
shebangify(from) do |sf|
|
|
61
|
+
$deferr.print from, " -> ", File::catname(from, to), "\n"
|
|
62
|
+
$deferr.printf "chmod %04o %s\n", mode, to
|
|
63
|
+
File::install(sf, to, mode, false)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
#}}}
|
|
68
|
+
end
|
|
69
|
+
def shebangify f
|
|
70
|
+
#{{{
|
|
71
|
+
open(f) do |fd|
|
|
72
|
+
buf = fd.read 42
|
|
73
|
+
if buf =~ %r/^\s*#\s*!.*ruby/o
|
|
74
|
+
ftmp = Tempfile::new("#{ $$ }_#{ File::basename(f) }")
|
|
75
|
+
begin
|
|
76
|
+
fd.rewind
|
|
77
|
+
ftmp.puts "#!#{ $ruby }"
|
|
78
|
+
while((buf = fd.read(8192)))
|
|
79
|
+
ftmp.write buf
|
|
80
|
+
end
|
|
81
|
+
ftmp.close
|
|
82
|
+
yield ftmp.path
|
|
83
|
+
ensure
|
|
84
|
+
ftmp.close!
|
|
85
|
+
end
|
|
86
|
+
else
|
|
87
|
+
yield f
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
#}}}
|
|
91
|
+
end
|
|
92
|
+
def ARGV.switch
|
|
93
|
+
#{{{
|
|
94
|
+
return nil if self.empty?
|
|
95
|
+
arg = self.shift
|
|
96
|
+
return nil if arg == '--'
|
|
97
|
+
if arg =~ /^-(.)(.*)/
|
|
98
|
+
return arg if $1 == '-'
|
|
99
|
+
raise 'unknown switch "-"' if $2.index('-')
|
|
100
|
+
self.unshift "-#{$2}" if $2.size > 0
|
|
101
|
+
"-#{$1}"
|
|
102
|
+
else
|
|
103
|
+
self.unshift arg
|
|
104
|
+
nil
|
|
105
|
+
end
|
|
106
|
+
#}}}
|
|
107
|
+
end
|
|
108
|
+
def ARGV.req_arg
|
|
109
|
+
#{{{
|
|
110
|
+
self.shift || raise('missing argument')
|
|
111
|
+
#}}}
|
|
112
|
+
end
|
|
113
|
+
def linkify d, linked = []
|
|
114
|
+
#--{{{
|
|
115
|
+
if test ?d, d
|
|
116
|
+
versioned = Dir[ File::join(d, "*-[0-9].[0-9].[0-9].rb") ]
|
|
117
|
+
versioned.each do |v|
|
|
118
|
+
src, dst = v, v.gsub(%r/\-[\d\.]+\.rb$/, '.rb')
|
|
119
|
+
lnk = nil
|
|
120
|
+
begin
|
|
121
|
+
if test ?l, dst
|
|
122
|
+
lnk = "#{ dst }.lnk"
|
|
123
|
+
puts "#{ dst } -> #{ lnk }"
|
|
124
|
+
File::rename dst, lnk
|
|
125
|
+
end
|
|
126
|
+
unless test ?e, dst
|
|
127
|
+
puts "#{ src } -> #{ dst }"
|
|
128
|
+
File::copy src, dst
|
|
129
|
+
linked << dst
|
|
130
|
+
end
|
|
131
|
+
ensure
|
|
132
|
+
if lnk
|
|
133
|
+
at_exit do
|
|
134
|
+
puts "#{ lnk } -> #{ dst }"
|
|
135
|
+
File::rename lnk, dst
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
linked
|
|
142
|
+
#--}}}
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
#
|
|
147
|
+
# main program
|
|
148
|
+
#
|
|
149
|
+
|
|
150
|
+
libdir = $site_libdir
|
|
151
|
+
bindir = $bindir
|
|
152
|
+
no_linkify = false
|
|
153
|
+
linked = nil
|
|
154
|
+
help = false
|
|
155
|
+
|
|
156
|
+
usage = <<-usage
|
|
157
|
+
#{ File::basename $0 }
|
|
158
|
+
-d, --destdir <destdir>
|
|
159
|
+
-l, --libdir <libdir>
|
|
160
|
+
-b, --bindir <bindir>
|
|
161
|
+
-r, --ruby <ruby>
|
|
162
|
+
-n, --no_linkify
|
|
163
|
+
-s, --sudo
|
|
164
|
+
-h, --help
|
|
165
|
+
usage
|
|
166
|
+
|
|
167
|
+
begin
|
|
168
|
+
while switch = ARGV.switch
|
|
169
|
+
case switch
|
|
170
|
+
when '-d', '--destdir'
|
|
171
|
+
libdir = ARGV.req_arg
|
|
172
|
+
when '-l', '--libdir'
|
|
173
|
+
libdir = ARGV.req_arg
|
|
174
|
+
when '-b', '--bindir'
|
|
175
|
+
bindir = ARGV.req_arg
|
|
176
|
+
when '-r', '--ruby'
|
|
177
|
+
$ruby = ARGV.req_arg
|
|
178
|
+
when '-n', '--no_linkify'
|
|
179
|
+
no_linkify = true
|
|
180
|
+
when '-s', '--sudo'
|
|
181
|
+
sudo = 'sudo'
|
|
182
|
+
when '-h', '--help'
|
|
183
|
+
help = true
|
|
184
|
+
else
|
|
185
|
+
raise "unknown switch #{switch.dump}"
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
rescue
|
|
189
|
+
STDERR.puts $!.to_s
|
|
190
|
+
STDERR.puts usage
|
|
191
|
+
exit 1
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
if help
|
|
195
|
+
STDOUT.puts usage
|
|
196
|
+
exit
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
system "#{ sudo } #{ $ruby } pre-install.rb" if test(?s, 'pre-install.rb')
|
|
200
|
+
|
|
201
|
+
unless no_linkify
|
|
202
|
+
linked = linkify('lib') + linkify('bin')
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
system "#{ $ruby } extconf.rb && make && #{ sudo } make install" if test(?s, 'extconf.rb')
|
|
206
|
+
|
|
207
|
+
install_rb(LIBDIR, libdir, LIBDIR_MODE)
|
|
208
|
+
install_rb(BINDIR, bindir, BINDIR_MODE, bin=true)
|
|
209
|
+
|
|
210
|
+
if linked
|
|
211
|
+
linked.each{|path| File::rm_f path}
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
system "#{ sudo } #{ $ruby } post-install.rb" if test(?s, 'post-install.rb')
|
data/lib/redef.rb
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Redef
|
|
2
|
+
Redef::VERSION = '0.4.2'
|
|
3
|
+
def Redef.version() Redef::VERSION end
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
class Class
|
|
7
|
+
private
|
|
8
|
+
def redefined
|
|
9
|
+
singleton_class =
|
|
10
|
+
class << self
|
|
11
|
+
self
|
|
12
|
+
end
|
|
13
|
+
hash = Hash.new
|
|
14
|
+
singleton_class.module_eval{ define_method(:redefined){ hash } }
|
|
15
|
+
redefined
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def redefining &block
|
|
19
|
+
include( redefined[:Module] ||= Module.new )
|
|
20
|
+
|
|
21
|
+
m = Module.new(&block)
|
|
22
|
+
|
|
23
|
+
methods = m.instance_methods(false) & instance_methods(false)
|
|
24
|
+
|
|
25
|
+
methods.each do |method|
|
|
26
|
+
redefined[method] = instance_method method
|
|
27
|
+
|
|
28
|
+
redefined[:Module].module_eval <<-redefintion
|
|
29
|
+
def #{ method }(*a, &b)
|
|
30
|
+
self.class.redefined['#{ method }'].bind(self).call(*a, &b)
|
|
31
|
+
end
|
|
32
|
+
redefintion
|
|
33
|
+
|
|
34
|
+
remove_method method
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
include m
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
alias_method 'redef', 'redefining'
|
|
41
|
+
end
|
data/samples/a.rb
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# redef is a super simple way to robustly override methods - providing the
|
|
2
|
+
# POLS method of referring to the previous method as (wait for it) super.
|
|
3
|
+
# it's really that simple
|
|
4
|
+
#
|
|
5
|
+
require 'redef'
|
|
6
|
+
|
|
7
|
+
class C
|
|
8
|
+
def foo() 30 end
|
|
9
|
+
|
|
10
|
+
p C.new.foo #=> 30
|
|
11
|
+
|
|
12
|
+
redef do
|
|
13
|
+
def foo() super + 2 end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
p C.new.foo #=> 32
|
|
17
|
+
|
|
18
|
+
redef do
|
|
19
|
+
def foo() super + 10 end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
p C.new.foo #=> 42
|
|
23
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: redef
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.4.2
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Ara T. Howard
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
|
|
12
|
+
date: 2008-11-14 00:00:00 -07:00
|
|
13
|
+
default_executable:
|
|
14
|
+
dependencies:
|
|
15
|
+
- !ruby/object:Gem::Dependency
|
|
16
|
+
name: fattr
|
|
17
|
+
type: :runtime
|
|
18
|
+
version_requirement:
|
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
20
|
+
requirements:
|
|
21
|
+
- - ">="
|
|
22
|
+
- !ruby/object:Gem::Version
|
|
23
|
+
version: "0"
|
|
24
|
+
version:
|
|
25
|
+
description:
|
|
26
|
+
email: ara.t.howard@gmail.com
|
|
27
|
+
executables: []
|
|
28
|
+
|
|
29
|
+
extensions: []
|
|
30
|
+
|
|
31
|
+
extra_rdoc_files: []
|
|
32
|
+
|
|
33
|
+
files:
|
|
34
|
+
- gemspec.rb
|
|
35
|
+
- gen_readme.rb
|
|
36
|
+
- install.rb
|
|
37
|
+
- lib
|
|
38
|
+
- lib/redef.rb
|
|
39
|
+
- README
|
|
40
|
+
- samples
|
|
41
|
+
- samples/a.rb
|
|
42
|
+
has_rdoc: false
|
|
43
|
+
homepage: http://codeforpeople.com/lib/ruby/redef/
|
|
44
|
+
post_install_message:
|
|
45
|
+
rdoc_options: []
|
|
46
|
+
|
|
47
|
+
require_paths:
|
|
48
|
+
- lib
|
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: "0"
|
|
54
|
+
version:
|
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
56
|
+
requirements:
|
|
57
|
+
- - ">="
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: "0"
|
|
60
|
+
version:
|
|
61
|
+
requirements: []
|
|
62
|
+
|
|
63
|
+
rubyforge_project: codeforpeople
|
|
64
|
+
rubygems_version: 1.2.0
|
|
65
|
+
signing_key:
|
|
66
|
+
specification_version: 2
|
|
67
|
+
summary: redef
|
|
68
|
+
test_files: []
|
|
69
|
+
|