alib 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/a.rb +12 -1
- data/{alib-0.4.0.gem → alib-0.5.0.gem} +0 -0
- data/lib/{alib-0.4.0.rb → alib-0.5.0.rb} +17 -40
- data/lib/alib-0.5.0/attributes-3.2.0.rb +54 -0
- data/lib/alib-0.5.0/attributes.rb +54 -0
- data/lib/{alib-0.4.0 → alib-0.5.0}/autohash.rb +0 -0
- data/lib/alib-0.5.0/binding_of_caller.rb +70 -0
- data/lib/{alib-0.4.0 → alib-0.5.0}/bsearch.rb +0 -0
- data/lib/alib-0.5.0/classmethods.rb +39 -0
- data/lib/{alib-0.4.0 → alib-0.5.0}/configfile.rb +0 -0
- data/lib/{alib-0.4.0 → alib-0.5.0}/find2.rb +0 -0
- data/lib/{alib-0.4.0 → alib-0.5.0}/listfile.rb +0 -0
- data/lib/{alib-0.4.0 → alib-0.5.0}/logging.rb +71 -7
- data/lib/{alib-0.4.0 → alib-0.5.0}/main.rb +416 -14
- data/lib/alib-0.5.0/main.rb.bak +1029 -0
- data/lib/alib-0.5.0/open4-0.9.1.rb +379 -0
- data/lib/alib-0.5.0/open4.rb +379 -0
- data/lib/{alib-0.4.0 → alib-0.5.0}/orderedautohash.rb +0 -0
- data/lib/{alib-0.4.0 → alib-0.5.0}/orderedhash.rb +0 -0
- data/lib/alib-0.5.0/prototype-0.3.0.rb +200 -0
- data/lib/alib-0.5.0/prototype.rb +200 -0
- data/lib/alib-0.5.0/stdext.rb +174 -0
- data/lib/{alib-0.4.0 → alib-0.5.0}/util.rb +452 -51
- data/lib/alib.rb +17 -40
- metadata +45 -32
- data/b.rb +0 -1
- data/build +0 -0
- data/install +0 -143
- data/lib/alib-0.4.0/open4.rb +0 -175
File without changes
|
File without changes
|
@@ -0,0 +1,200 @@
|
|
1
|
+
|
2
|
+
begin
|
3
|
+
require 'rubygems'
|
4
|
+
rescue LoadError
|
5
|
+
nil
|
6
|
+
end
|
7
|
+
|
8
|
+
begin
|
9
|
+
require 'attributes'
|
10
|
+
rescue LoadError
|
11
|
+
warn <<-msg
|
12
|
+
attributes.rb not found!
|
13
|
+
|
14
|
+
download from
|
15
|
+
- http://rubyforge.org/projects/codeforpeople/
|
16
|
+
|
17
|
+
or
|
18
|
+
|
19
|
+
- http://codeforpeople.com/lib/ruby/
|
20
|
+
msg
|
21
|
+
raise
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# http://en.wikipedia.org/wiki/Prototype-based_programming
|
26
|
+
#
|
27
|
+
|
28
|
+
class Prototype
|
29
|
+
VERSION = '0.3.0'
|
30
|
+
|
31
|
+
module Prototypical
|
32
|
+
module ClassMethods
|
33
|
+
def __prototype_table__ # uses closure/init to avoid instance-var
|
34
|
+
__prototype_singleton_class__{
|
35
|
+
table = {}
|
36
|
+
define_method('__prototype_table__'){ table }
|
37
|
+
}
|
38
|
+
__prototype_table__ # does not recurse!
|
39
|
+
end
|
40
|
+
|
41
|
+
def __prototype_table_inject__ other
|
42
|
+
__prototype_table__.each do |ivar, value|
|
43
|
+
other.instance_variable_set ivar, value
|
44
|
+
end
|
45
|
+
__prototype_table__.clear
|
46
|
+
end
|
47
|
+
|
48
|
+
def __prototype_eval__ &b
|
49
|
+
tid = Thread.current.object_id.abs
|
50
|
+
src, dst = "method_missing", "__method_missing_#{ tid }__"
|
51
|
+
aliased = false
|
52
|
+
|
53
|
+
__prototype_singleton_class__{
|
54
|
+
unless respond_to? dst
|
55
|
+
alias_method dst, src
|
56
|
+
aliased = true
|
57
|
+
end
|
58
|
+
|
59
|
+
def method_missing m, *a, &b
|
60
|
+
__prototype_barewords_can_set_and_get_ivars_and_define_methods__ m, *a, &b
|
61
|
+
end
|
62
|
+
|
63
|
+
def __prototype_barewords_can_set_and_get_ivars_and_define_methods__ m, *a, &b
|
64
|
+
if b
|
65
|
+
define_method m, *a, &b
|
66
|
+
else
|
67
|
+
ivar = "@#{ m }"
|
68
|
+
if a.size == 0
|
69
|
+
defined?(ivar) ? instance_variable_get(ivar) : super
|
70
|
+
elsif a.size == 1
|
71
|
+
instance_variable_set ivar, a.shift
|
72
|
+
else
|
73
|
+
__method_missing__(m, *a, &b)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
}
|
78
|
+
|
79
|
+
module_eval &b
|
80
|
+
|
81
|
+
ensure
|
82
|
+
__prototype_singleton_class__{ alias_method src, dst } if aliased
|
83
|
+
end
|
84
|
+
|
85
|
+
def __prototype_singleton_class__ &b
|
86
|
+
sc =
|
87
|
+
class << self
|
88
|
+
self
|
89
|
+
end
|
90
|
+
sc.module_eval &b if b
|
91
|
+
sc
|
92
|
+
end
|
93
|
+
|
94
|
+
def __prototype_prototype__ &b
|
95
|
+
return unless b
|
96
|
+
|
97
|
+
__prototype_eval__ &b
|
98
|
+
|
99
|
+
table =
|
100
|
+
instance_variables.inject({}) do |t,ivar|
|
101
|
+
value =
|
102
|
+
instance_eval do
|
103
|
+
begin
|
104
|
+
instance_variable_get ivar
|
105
|
+
ensure
|
106
|
+
remove_instance_variable ivar
|
107
|
+
end
|
108
|
+
end
|
109
|
+
t.update ivar => value
|
110
|
+
end
|
111
|
+
|
112
|
+
__prototype_table__.update table
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
module InstanceMethods
|
117
|
+
def initialize *a, &b
|
118
|
+
__prototype_init__
|
119
|
+
super
|
120
|
+
end
|
121
|
+
|
122
|
+
def __prototype_init__ c = self.class
|
123
|
+
c.__prototype_table__.each do |ivar, value|
|
124
|
+
#defined = instance_eval "defined? #{ ivar }"
|
125
|
+
#unless defined
|
126
|
+
instance_variable_set ivar, value
|
127
|
+
#end
|
128
|
+
|
129
|
+
a = ivar[%r/\w+/]
|
130
|
+
defined = respond_to? a
|
131
|
+
unless defined
|
132
|
+
self.class.module_eval{ attribute a }
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def extend *a, &b
|
138
|
+
unless a.empty?
|
139
|
+
super
|
140
|
+
else
|
141
|
+
self.class.__prototype_prototype__ &b
|
142
|
+
__prototype_init__
|
143
|
+
self
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def clone *a, &b
|
148
|
+
obj = prototype(self.class, *a, &b)
|
149
|
+
instance_variables.each do |ivar|
|
150
|
+
value = instance_variable_get ivar
|
151
|
+
obj.instance_variable_set ivar, value
|
152
|
+
end
|
153
|
+
obj
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def self.extend_object c
|
158
|
+
c.extend ClassMethods
|
159
|
+
c.module_eval{ include InstanceMethods }
|
160
|
+
super
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
class << self
|
165
|
+
def new parent = Object, *a, &b
|
166
|
+
parent = parent.class unless Class === parent
|
167
|
+
c = Class.new parent
|
168
|
+
c.extend Prototypical
|
169
|
+
c.__prototype_table__.update parent.__prototype_table__ if
|
170
|
+
parent.respond_to? '__prototype_table__'
|
171
|
+
c.__prototype_prototype__ &b
|
172
|
+
obj = c.new *a
|
173
|
+
obj
|
174
|
+
end
|
175
|
+
|
176
|
+
alias_method "exnihilo", "new"
|
177
|
+
alias_method "ex_nihilo", "new"
|
178
|
+
|
179
|
+
def prototyping obj, *a, &b
|
180
|
+
c =
|
181
|
+
class << obj
|
182
|
+
self
|
183
|
+
end
|
184
|
+
parent = c.class
|
185
|
+
c.extend Prototypical unless Prototypical === c
|
186
|
+
c.__prototype_table__.update parent.__prototype_table__ if
|
187
|
+
parent.respond_to? '__prototype_table__'
|
188
|
+
c.__prototype_prototype__ &b
|
189
|
+
obj.__prototype_init__ c
|
190
|
+
obj
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
class Object
|
196
|
+
def Prototype(*a, &b) Prototype.new *a, &b end
|
197
|
+
def prototype(*a, &b) Prototype.new *a, &b end
|
198
|
+
def Prototyping(*a, &b) Prototype.prototyping self, *a, &b end
|
199
|
+
def prototyping(*a, &b) Prototype.prototyping self, *a, &b end
|
200
|
+
end
|
@@ -0,0 +1,200 @@
|
|
1
|
+
|
2
|
+
begin
|
3
|
+
require 'rubygems'
|
4
|
+
rescue LoadError
|
5
|
+
nil
|
6
|
+
end
|
7
|
+
|
8
|
+
begin
|
9
|
+
require 'attributes'
|
10
|
+
rescue LoadError
|
11
|
+
warn <<-msg
|
12
|
+
attributes.rb not found!
|
13
|
+
|
14
|
+
download from
|
15
|
+
- http://rubyforge.org/projects/codeforpeople/
|
16
|
+
|
17
|
+
or
|
18
|
+
|
19
|
+
- http://codeforpeople.com/lib/ruby/
|
20
|
+
msg
|
21
|
+
raise
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# http://en.wikipedia.org/wiki/Prototype-based_programming
|
26
|
+
#
|
27
|
+
|
28
|
+
class Prototype
|
29
|
+
VERSION = '0.3.0'
|
30
|
+
|
31
|
+
module Prototypical
|
32
|
+
module ClassMethods
|
33
|
+
def __prototype_table__ # uses closure/init to avoid instance-var
|
34
|
+
__prototype_singleton_class__{
|
35
|
+
table = {}
|
36
|
+
define_method('__prototype_table__'){ table }
|
37
|
+
}
|
38
|
+
__prototype_table__ # does not recurse!
|
39
|
+
end
|
40
|
+
|
41
|
+
def __prototype_table_inject__ other
|
42
|
+
__prototype_table__.each do |ivar, value|
|
43
|
+
other.instance_variable_set ivar, value
|
44
|
+
end
|
45
|
+
__prototype_table__.clear
|
46
|
+
end
|
47
|
+
|
48
|
+
def __prototype_eval__ &b
|
49
|
+
tid = Thread.current.object_id.abs
|
50
|
+
src, dst = "method_missing", "__method_missing_#{ tid }__"
|
51
|
+
aliased = false
|
52
|
+
|
53
|
+
__prototype_singleton_class__{
|
54
|
+
unless respond_to? dst
|
55
|
+
alias_method dst, src
|
56
|
+
aliased = true
|
57
|
+
end
|
58
|
+
|
59
|
+
def method_missing m, *a, &b
|
60
|
+
__prototype_barewords_can_set_and_get_ivars_and_define_methods__ m, *a, &b
|
61
|
+
end
|
62
|
+
|
63
|
+
def __prototype_barewords_can_set_and_get_ivars_and_define_methods__ m, *a, &b
|
64
|
+
if b
|
65
|
+
define_method m, *a, &b
|
66
|
+
else
|
67
|
+
ivar = "@#{ m }"
|
68
|
+
if a.size == 0
|
69
|
+
defined?(ivar) ? instance_variable_get(ivar) : super
|
70
|
+
elsif a.size == 1
|
71
|
+
instance_variable_set ivar, a.shift
|
72
|
+
else
|
73
|
+
__method_missing__(m, *a, &b)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
}
|
78
|
+
|
79
|
+
module_eval &b
|
80
|
+
|
81
|
+
ensure
|
82
|
+
__prototype_singleton_class__{ alias_method src, dst } if aliased
|
83
|
+
end
|
84
|
+
|
85
|
+
def __prototype_singleton_class__ &b
|
86
|
+
sc =
|
87
|
+
class << self
|
88
|
+
self
|
89
|
+
end
|
90
|
+
sc.module_eval &b if b
|
91
|
+
sc
|
92
|
+
end
|
93
|
+
|
94
|
+
def __prototype_prototype__ &b
|
95
|
+
return unless b
|
96
|
+
|
97
|
+
__prototype_eval__ &b
|
98
|
+
|
99
|
+
table =
|
100
|
+
instance_variables.inject({}) do |t,ivar|
|
101
|
+
value =
|
102
|
+
instance_eval do
|
103
|
+
begin
|
104
|
+
instance_variable_get ivar
|
105
|
+
ensure
|
106
|
+
remove_instance_variable ivar
|
107
|
+
end
|
108
|
+
end
|
109
|
+
t.update ivar => value
|
110
|
+
end
|
111
|
+
|
112
|
+
__prototype_table__.update table
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
module InstanceMethods
|
117
|
+
def initialize *a, &b
|
118
|
+
__prototype_init__
|
119
|
+
super
|
120
|
+
end
|
121
|
+
|
122
|
+
def __prototype_init__ c = self.class
|
123
|
+
c.__prototype_table__.each do |ivar, value|
|
124
|
+
#defined = instance_eval "defined? #{ ivar }"
|
125
|
+
#unless defined
|
126
|
+
instance_variable_set ivar, value
|
127
|
+
#end
|
128
|
+
|
129
|
+
a = ivar[%r/\w+/]
|
130
|
+
defined = respond_to? a
|
131
|
+
unless defined
|
132
|
+
self.class.module_eval{ attribute a }
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def extend *a, &b
|
138
|
+
unless a.empty?
|
139
|
+
super
|
140
|
+
else
|
141
|
+
self.class.__prototype_prototype__ &b
|
142
|
+
__prototype_init__
|
143
|
+
self
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def clone *a, &b
|
148
|
+
obj = prototype(self.class, *a, &b)
|
149
|
+
instance_variables.each do |ivar|
|
150
|
+
value = instance_variable_get ivar
|
151
|
+
obj.instance_variable_set ivar, value
|
152
|
+
end
|
153
|
+
obj
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def self.extend_object c
|
158
|
+
c.extend ClassMethods
|
159
|
+
c.module_eval{ include InstanceMethods }
|
160
|
+
super
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
class << self
|
165
|
+
def new parent = Object, *a, &b
|
166
|
+
parent = parent.class unless Class === parent
|
167
|
+
c = Class.new parent
|
168
|
+
c.extend Prototypical
|
169
|
+
c.__prototype_table__.update parent.__prototype_table__ if
|
170
|
+
parent.respond_to? '__prototype_table__'
|
171
|
+
c.__prototype_prototype__ &b
|
172
|
+
obj = c.new *a
|
173
|
+
obj
|
174
|
+
end
|
175
|
+
|
176
|
+
alias_method "exnihilo", "new"
|
177
|
+
alias_method "ex_nihilo", "new"
|
178
|
+
|
179
|
+
def prototyping obj, *a, &b
|
180
|
+
c =
|
181
|
+
class << obj
|
182
|
+
self
|
183
|
+
end
|
184
|
+
parent = c.class
|
185
|
+
c.extend Prototypical unless Prototypical === c
|
186
|
+
c.__prototype_table__.update parent.__prototype_table__ if
|
187
|
+
parent.respond_to? '__prototype_table__'
|
188
|
+
c.__prototype_prototype__ &b
|
189
|
+
obj.__prototype_init__ c
|
190
|
+
obj
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
class Object
|
196
|
+
def Prototype(*a, &b) Prototype.new *a, &b end
|
197
|
+
def prototype(*a, &b) Prototype.new *a, &b end
|
198
|
+
def Prototyping(*a, &b) Prototype.prototyping self, *a, &b end
|
199
|
+
def prototyping(*a, &b) Prototype.prototyping self, *a, &b end
|
200
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
class Object
|
2
|
+
def singleton_class obj = self, &b
|
3
|
+
#--{{{
|
4
|
+
sc =
|
5
|
+
class << obj
|
6
|
+
self
|
7
|
+
end
|
8
|
+
sc.module_eval &b
|
9
|
+
sc
|
10
|
+
#--}}}
|
11
|
+
end
|
12
|
+
def tap &b
|
13
|
+
#--{{{
|
14
|
+
b.arity == 1 ? yield(self) : instance_eval(&b)
|
15
|
+
return self
|
16
|
+
#--}}}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Numeric
|
21
|
+
def of head = nil, *tail, &b
|
22
|
+
#--{{{
|
23
|
+
if head
|
24
|
+
a = tail.empty? ? head : [head]+tail
|
25
|
+
b = lambda{ a }
|
26
|
+
end
|
27
|
+
Array.new(self).map &b
|
28
|
+
#--}}}
|
29
|
+
end
|
30
|
+
|
31
|
+
def microseconds() Float(self * (10 ** -6)) end
|
32
|
+
def milliseconds() Float(self * (10 ** -3)) end
|
33
|
+
def seconds() self end
|
34
|
+
def minutes() 60 * seconds end
|
35
|
+
def hours() 60 * minutes end
|
36
|
+
def days() 24 * hours end
|
37
|
+
def weeks() 7 * days end
|
38
|
+
def months() 30 * days end
|
39
|
+
def years() 365 * days end
|
40
|
+
def decades() 10 * years end
|
41
|
+
|
42
|
+
%w[
|
43
|
+
microseconds
|
44
|
+
milliseconds
|
45
|
+
seconds
|
46
|
+
minutes
|
47
|
+
hours
|
48
|
+
days
|
49
|
+
weeks
|
50
|
+
months
|
51
|
+
years
|
52
|
+
decades
|
53
|
+
].each{|m| alias_method m.chop, m}
|
54
|
+
end
|
55
|
+
|
56
|
+
class Hash
|
57
|
+
def getopt opt, default = nil
|
58
|
+
#--{{{
|
59
|
+
hash = self
|
60
|
+
keys = opt.respond_to?('each') ? opt : [opt]
|
61
|
+
keys.each do |key|
|
62
|
+
return hash[key] if hash.has_key? key
|
63
|
+
key = "#{ key }"
|
64
|
+
return hash[key] if hash.has_key? key
|
65
|
+
key = key.intern
|
66
|
+
return hash[key] if hash.has_key? key
|
67
|
+
end
|
68
|
+
return default
|
69
|
+
#--}}}
|
70
|
+
end
|
71
|
+
def hasopt? opt, default = nil
|
72
|
+
#--{{{
|
73
|
+
hash = self
|
74
|
+
keys = opt.respond_to?('each') ? opt : [opt]
|
75
|
+
keys.each do |key|
|
76
|
+
return key if hash.has_key? key
|
77
|
+
key = "#{ key }"
|
78
|
+
return key if hash.has_key? key
|
79
|
+
key = key.intern
|
80
|
+
return key if hash.has_key? key
|
81
|
+
end
|
82
|
+
return default
|
83
|
+
#--}}}
|
84
|
+
end
|
85
|
+
alias_method "hasopt", "hasopt?"
|
86
|
+
end
|
87
|
+
|
88
|
+
class Array
|
89
|
+
def self.step i, *a, &b
|
90
|
+
#--{{{
|
91
|
+
j, s, ignored = *a
|
92
|
+
i, j = 0, i if j.nil?
|
93
|
+
s ||= (j < i ? -1 : 1)
|
94
|
+
list = new
|
95
|
+
i.step(j,s){|k| list << k}
|
96
|
+
list.map! &b if b
|
97
|
+
list
|
98
|
+
#--}}}
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
module Enumerable
|
103
|
+
def sum n = 0
|
104
|
+
inject(n){|n,i| n += i}
|
105
|
+
end
|
106
|
+
def product n = 1
|
107
|
+
return 0 if empty?
|
108
|
+
inject(n){|n,i| n *= i}
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
class Module
|
113
|
+
def tattrs *list
|
114
|
+
#--{{{
|
115
|
+
list.flatten.compact.map do |t|
|
116
|
+
module_eval <<-code
|
117
|
+
def #{ t } *a
|
118
|
+
return(send('#{ t }', a.shift)) unless a.empty?
|
119
|
+
Thread.current['#{ t }']
|
120
|
+
end
|
121
|
+
def #{ t }= val
|
122
|
+
Thread.current['#{ t }?'] = true
|
123
|
+
Thread.current['#{ t }'] = val
|
124
|
+
end
|
125
|
+
def #{ t }?
|
126
|
+
Thread.current['#{ t }?']
|
127
|
+
end
|
128
|
+
code
|
129
|
+
t.to_s
|
130
|
+
end
|
131
|
+
#--}}}
|
132
|
+
end
|
133
|
+
alias_method "tattr", "tattrs"
|
134
|
+
end
|
135
|
+
|
136
|
+
=begin
|
137
|
+
|
138
|
+
class Thread
|
139
|
+
class << self
|
140
|
+
alias_method "__new__", "new"
|
141
|
+
def new *a, &b
|
142
|
+
child '__new__', *a, &b
|
143
|
+
end
|
144
|
+
alias_method "__start__", "start"
|
145
|
+
def start *a, &b
|
146
|
+
child '__start__', *a, &b
|
147
|
+
end
|
148
|
+
private
|
149
|
+
def child as, *a, &b
|
150
|
+
parent = Thread.current
|
151
|
+
send(as, *a) do |*a|
|
152
|
+
Thread.current.parent = parent
|
153
|
+
b.call *a
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
def parent
|
158
|
+
self['parent']
|
159
|
+
end
|
160
|
+
def parent= parent
|
161
|
+
self['parent'] = parent
|
162
|
+
end
|
163
|
+
def ancestors
|
164
|
+
return self['ancestors'] if self['ancestors']
|
165
|
+
list = [t = self]
|
166
|
+
while((t = t.parent))
|
167
|
+
list << t
|
168
|
+
end
|
169
|
+
self['ancestors'] = list
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
=end
|
174
|
+
|