alib 0.4.0 → 0.5.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.
- 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
data/a.rb
CHANGED
File without changes
|
@@ -3,9 +3,7 @@
|
|
3
3
|
#
|
4
4
|
module ALib
|
5
5
|
#--{{{
|
6
|
-
VERSION = '0.
|
7
|
-
|
8
|
-
def self.version() VERSION end
|
6
|
+
VERSION = '0.5.0'
|
9
7
|
|
10
8
|
require 'pathname'
|
11
9
|
require 'socket'
|
@@ -21,14 +19,19 @@ module ALib
|
|
21
19
|
require 'fcntl'
|
22
20
|
require 'uri'
|
23
21
|
require 'net/http'
|
22
|
+
require 'thread'
|
24
23
|
|
25
|
-
|
26
|
-
|
24
|
+
class ::Object
|
25
|
+
Alib = ALib
|
26
|
+
def alib() ALib end
|
27
|
+
end
|
27
28
|
|
28
29
|
LIBDIR = 'alib-%s/' % VERSION
|
29
30
|
|
30
|
-
|
31
|
+
require LIBDIR + 'classmethods'
|
32
|
+
require LIBDIR + 'stdext'
|
31
33
|
|
34
|
+
AUTOLOAD = {
|
32
35
|
'Util' => 'util',
|
33
36
|
|
34
37
|
'Logging' => 'logging',
|
@@ -54,51 +57,25 @@ module ALib
|
|
54
57
|
'AbstractMain' => 'main',
|
55
58
|
'SimpleMain' => 'main',
|
56
59
|
'ConfigurableMain' => 'main',
|
57
|
-
|
58
60
|
}
|
59
61
|
|
60
62
|
AUTOLOAD.each{|const, basename| autoload const.to_s, LIBDIR + basename.to_s}
|
61
63
|
|
62
|
-
|
64
|
+
SINGLETON_CLASS =
|
63
65
|
class << self
|
64
66
|
self
|
65
67
|
end
|
66
68
|
|
67
|
-
AUTOLOAD.each{ |const, m|
|
68
|
-
|
69
|
-
begin
|
70
|
-
require 'open4'
|
71
|
-
rescue LoadError
|
72
|
-
require LIBDIR + 'open4'
|
73
|
-
end
|
69
|
+
AUTOLOAD.each{ |const, m| SINGLETON_CLASS.module_eval{define_method(m){ALib.send 'const_get', const}} unless Alib.respond_to? m}
|
74
70
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
require LIBDIR +
|
80
|
-
|
81
|
-
end
|
82
|
-
def simple_main &b
|
83
|
-
#--{{{
|
84
|
-
b ? Class::new(ALib::SimpleMain, &b) : ALib::SimpleMain
|
85
|
-
#--}}}
|
86
|
-
end
|
87
|
-
alias_method 'main', 'simple_main'
|
88
|
-
alias_method 'smain', 'simple_main'
|
89
|
-
def configurable_main &b
|
90
|
-
#--{{{
|
91
|
-
b ? Class::new(ALib::ConfigurableMain, &b) : ALib::ConfigurableMain
|
92
|
-
#--}}}
|
71
|
+
%w( open4 attributes prototype binding_of_caller ).each do |lib|
|
72
|
+
begin
|
73
|
+
require lib
|
74
|
+
rescue LoadError
|
75
|
+
require LIBDIR + lib
|
76
|
+
$LOADED_FEATURES << File.basename(lib)
|
93
77
|
end
|
94
|
-
alias_method 'cmain', 'configurable_main'
|
95
|
-
#--}}}
|
96
78
|
end
|
97
79
|
#--}}}
|
98
80
|
end
|
99
81
|
|
100
|
-
Alib = ALib
|
101
|
-
|
102
|
-
class Object
|
103
|
-
def alib() Alib end
|
104
|
-
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Attributes
|
2
|
+
VERSION = '3.2.0'
|
3
|
+
|
4
|
+
def version() VERSION end
|
5
|
+
|
6
|
+
def attributes *a, &b
|
7
|
+
unless a.empty?
|
8
|
+
hashes, names = a.partition{|x| Hash === x}
|
9
|
+
|
10
|
+
names_and_defaults = {}
|
11
|
+
hashes.each{|h| names_and_defaults.update h}
|
12
|
+
names.flatten.compact.each{|name| names_and_defaults.update name => nil}
|
13
|
+
|
14
|
+
names_and_defaults.each do |name, default|
|
15
|
+
init = b || lambda { default }
|
16
|
+
ivar, getter, setter, query = "@#{ name }", "#{ name }", "#{ name }=", "#{ name }?"
|
17
|
+
|
18
|
+
define_method(setter) do |value|
|
19
|
+
instance_variable_set ivar, value
|
20
|
+
end
|
21
|
+
|
22
|
+
define_method(getter) do |*value|
|
23
|
+
unless value.empty?
|
24
|
+
send setter, value.shift
|
25
|
+
else
|
26
|
+
defined = instance_eval "defined? #{ ivar }"
|
27
|
+
send setter, instance_eval(&init) unless defined
|
28
|
+
instance_variable_get ivar
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
alias_method query, getter
|
33
|
+
|
34
|
+
(attributes << name).uniq!
|
35
|
+
attributes
|
36
|
+
end
|
37
|
+
else
|
38
|
+
@attributes ||= []
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def attribute(*a, &b) attributes *a, &b end
|
43
|
+
end
|
44
|
+
|
45
|
+
class Object
|
46
|
+
def attributes *a, &b
|
47
|
+
sc = class << self; self; end
|
48
|
+
sc.attributes *a, &b
|
49
|
+
end
|
50
|
+
|
51
|
+
def attribute(*a, &b) attributes *a, &b end
|
52
|
+
end
|
53
|
+
|
54
|
+
class Module; include Attributes; end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Attributes
|
2
|
+
VERSION = '3.2.0'
|
3
|
+
|
4
|
+
def version() VERSION end
|
5
|
+
|
6
|
+
def attributes *a, &b
|
7
|
+
unless a.empty?
|
8
|
+
hashes, names = a.partition{|x| Hash === x}
|
9
|
+
|
10
|
+
names_and_defaults = {}
|
11
|
+
hashes.each{|h| names_and_defaults.update h}
|
12
|
+
names.flatten.compact.each{|name| names_and_defaults.update name => nil}
|
13
|
+
|
14
|
+
names_and_defaults.each do |name, default|
|
15
|
+
init = b || lambda { default }
|
16
|
+
ivar, getter, setter, query = "@#{ name }", "#{ name }", "#{ name }=", "#{ name }?"
|
17
|
+
|
18
|
+
define_method(setter) do |value|
|
19
|
+
instance_variable_set ivar, value
|
20
|
+
end
|
21
|
+
|
22
|
+
define_method(getter) do |*value|
|
23
|
+
unless value.empty?
|
24
|
+
send setter, value.shift
|
25
|
+
else
|
26
|
+
defined = instance_eval "defined? #{ ivar }"
|
27
|
+
send setter, instance_eval(&init) unless defined
|
28
|
+
instance_variable_get ivar
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
alias_method query, getter
|
33
|
+
|
34
|
+
(attributes << name).uniq!
|
35
|
+
attributes
|
36
|
+
end
|
37
|
+
else
|
38
|
+
@attributes ||= []
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def attribute(*a, &b) attributes *a, &b end
|
43
|
+
end
|
44
|
+
|
45
|
+
class Object
|
46
|
+
def attributes *a, &b
|
47
|
+
sc = class << self; self; end
|
48
|
+
sc.attributes *a, &b
|
49
|
+
end
|
50
|
+
|
51
|
+
def attribute(*a, &b) attributes *a, &b end
|
52
|
+
end
|
53
|
+
|
54
|
+
class Module; include Attributes; end
|
File without changes
|
@@ -0,0 +1,70 @@
|
|
1
|
+
begin
|
2
|
+
require 'simplecc'
|
3
|
+
rescue LoadError
|
4
|
+
def Continuation.create(*args, &block)
|
5
|
+
cc = nil; result = callcc {|c| cc = c; block.call(cc) if block and args.empty?}
|
6
|
+
result ||= args
|
7
|
+
return *[cc, *result]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# This method returns the binding of the method that called your
|
12
|
+
# method. It will raise an Exception when you're not inside a method.
|
13
|
+
#
|
14
|
+
# It's used like this:
|
15
|
+
# def inc_counter
|
16
|
+
# Binding.of_caller do |binding|
|
17
|
+
# eval("counter += 1", binding)
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
# counter = 0
|
21
|
+
# 2.times { inc_counter }
|
22
|
+
# counter # => 2
|
23
|
+
#
|
24
|
+
# You will have to put the whole rest of your method into the
|
25
|
+
# block that you pass into this method. If you don't do this
|
26
|
+
# an Exception will be raised. Because of the way that this is
|
27
|
+
# implemented it has to be done this way. If you don't do it
|
28
|
+
# like this it will raise an Exception.
|
29
|
+
def Binding.of_caller(&block)
|
30
|
+
old_critical = Thread.critical
|
31
|
+
Thread.critical = true
|
32
|
+
count = 0
|
33
|
+
cc, result, error, extra_data = Continuation.create(nil, nil)
|
34
|
+
error.call if error
|
35
|
+
|
36
|
+
tracer = lambda do |*args|
|
37
|
+
type, context, extra_data = args[0], args[4], args
|
38
|
+
if type == "return"
|
39
|
+
count += 1
|
40
|
+
# First this method and then calling one will return --
|
41
|
+
# the trace event of the second event gets the context
|
42
|
+
# of the method which called the method that called this
|
43
|
+
# method.
|
44
|
+
if count == 2
|
45
|
+
# It would be nice if we could restore the trace_func
|
46
|
+
# that was set before we swapped in our own one, but
|
47
|
+
# this is impossible without overloading set_trace_func
|
48
|
+
# in current Ruby.
|
49
|
+
set_trace_func(nil)
|
50
|
+
cc.call(eval("binding", context), nil, extra_data)
|
51
|
+
end
|
52
|
+
elsif type != "line"
|
53
|
+
set_trace_func(nil)
|
54
|
+
error_msg = "Binding.of_caller used in non-method context or " +
|
55
|
+
"trailing statements of method using it aren't in the block."
|
56
|
+
cc.call(nil, lambda { raise(ArgumentError, error_msg) }, nil)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
unless result
|
61
|
+
set_trace_func(tracer)
|
62
|
+
return nil
|
63
|
+
else
|
64
|
+
Thread.critical = old_critical
|
65
|
+
case block.arity
|
66
|
+
when 1 then yield(result)
|
67
|
+
else yield(result, extra_data)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
File without changes
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Alib
|
2
|
+
class << self
|
3
|
+
#--{{{
|
4
|
+
def version() VERSION end
|
5
|
+
def load basename
|
6
|
+
#--{{{
|
7
|
+
require LIBDIR + basename.to_s
|
8
|
+
#--}}}
|
9
|
+
end
|
10
|
+
def simple_main &b
|
11
|
+
#--{{{
|
12
|
+
#c = b ? (Class::new(ALib::SimpleMain, &b); : ALib::SimpleMain
|
13
|
+
c = Class::new ALib::SimpleMain
|
14
|
+
c.module_eval &b if b
|
15
|
+
c
|
16
|
+
#--}}}
|
17
|
+
end
|
18
|
+
alias_method 'smain', 'simple_main'
|
19
|
+
def configurable_main &b
|
20
|
+
#--{{{
|
21
|
+
c = Class::new ALib::ConfigurableMain
|
22
|
+
c.module_eval &b if b
|
23
|
+
c
|
24
|
+
#--}}}
|
25
|
+
end
|
26
|
+
alias_method 'cmain', 'configurable_main'
|
27
|
+
def script c = ALib::SimpleMain, &b
|
28
|
+
#--{{{
|
29
|
+
c = Class::new c
|
30
|
+
c.class_eval{ include ALib::Util }
|
31
|
+
c.class_eval &b if b
|
32
|
+
c.run
|
33
|
+
#--}}}
|
34
|
+
end
|
35
|
+
alias_method 'program', 'script'
|
36
|
+
alias_method 'cli', 'script'
|
37
|
+
#--}}}
|
38
|
+
end
|
39
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -9,12 +9,62 @@ module ALib::Logging
|
|
9
9
|
# not all logging devices are put into sync mode, resulting in improper log
|
10
10
|
# rolling. this is a hack.
|
11
11
|
#
|
12
|
+
|
12
13
|
module LoggerExt
|
13
14
|
#--{{{
|
14
15
|
attr :logdev
|
15
16
|
def << *args
|
16
|
-
|
17
|
+
#--{{{
|
18
|
+
m, c = Thread.main, Thread.current
|
19
|
+
args.flatten.each do |msg|
|
20
|
+
if m == c
|
21
|
+
super msg
|
22
|
+
else
|
23
|
+
eol = msg[%r/\s*$/o]
|
24
|
+
msg[%r/\s*$/o] = ''
|
25
|
+
super "#{ msg } (t:#{ c.object_id })#{ eol }"
|
26
|
+
end
|
27
|
+
end
|
17
28
|
self
|
29
|
+
#--}}}
|
30
|
+
end
|
31
|
+
def ___mutex
|
32
|
+
#--{{{
|
33
|
+
unless defined?(@___mutex) and @___mutex
|
34
|
+
begin
|
35
|
+
Thread.critical = true
|
36
|
+
@___mutex = Sync::new unless defined?(@___mutex) and @___mutex
|
37
|
+
ensure
|
38
|
+
Thread.critical = false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@___mutex
|
42
|
+
#--}}}
|
43
|
+
end
|
44
|
+
def ___sync which = :EX
|
45
|
+
#--{{{
|
46
|
+
___mutex.synchronize(which){ yield }
|
47
|
+
#--}}}
|
48
|
+
end
|
49
|
+
|
50
|
+
%w[ debug info warn error fatal ].each do |meth|
|
51
|
+
module_eval <<-code
|
52
|
+
def #{ meth }(*a, &b)
|
53
|
+
m, c = Thread.main, Thread.current
|
54
|
+
___sync{
|
55
|
+
if m == c
|
56
|
+
super *a, &b
|
57
|
+
else
|
58
|
+
super{
|
59
|
+
msg = (a.empty? ? b.call : a.join).to_s
|
60
|
+
eol = msg[%r/\s*$/o]
|
61
|
+
msg[%r/\s*$/o] = ''
|
62
|
+
"\#{ msg } (t:\#{ c.object_id })\#{ eol }"
|
63
|
+
}
|
64
|
+
end
|
65
|
+
}
|
66
|
+
end
|
67
|
+
code
|
18
68
|
end
|
19
69
|
#--}}}
|
20
70
|
end # module LoggerExt
|
@@ -54,6 +104,7 @@ module ALib::Logging
|
|
54
104
|
@logger
|
55
105
|
#--}}}
|
56
106
|
end
|
107
|
+
alias_method 'logger!', 'logger'
|
57
108
|
def logger= log
|
58
109
|
#--{{{
|
59
110
|
__logger_sync do
|
@@ -64,13 +115,15 @@ module ALib::Logging
|
|
64
115
|
end
|
65
116
|
#--}}}
|
66
117
|
end
|
67
|
-
|
118
|
+
|
119
|
+
%w[ debug info warn error fatal ].each do |meth|
|
68
120
|
module_eval <<-code
|
69
121
|
def #{ meth }(*a, &b)
|
70
|
-
|
122
|
+
logger.#{ meth } *a, &b
|
71
123
|
end
|
72
124
|
code
|
73
125
|
end
|
126
|
+
|
74
127
|
def log_err e
|
75
128
|
#--{{{
|
76
129
|
if logger.debug?
|
@@ -139,14 +192,25 @@ module ALib::Logging
|
|
139
192
|
#--{{{
|
140
193
|
def append_features c
|
141
194
|
#--{{{
|
142
|
-
|
143
|
-
|
144
|
-
c.
|
195
|
+
return self if((LogMethods === c) or (LogClassMethods === c))
|
196
|
+
ret = super rescue(return(self))
|
197
|
+
c.module_eval{
|
198
|
+
extend LogClassMethods
|
199
|
+
include LogMethods
|
200
|
+
extend LogMethods
|
201
|
+
}
|
202
|
+
#c.extend LogMethods
|
203
|
+
#c.extend LogClassMethods
|
145
204
|
ret
|
146
205
|
#--}}}
|
147
206
|
end
|
148
207
|
#--}}}
|
149
208
|
end
|
150
|
-
|
209
|
+
|
210
|
+
append_features self
|
211
|
+
|
212
|
+
# include LogMethods
|
213
|
+
# extend LogMethods
|
214
|
+
# extend LogClassMethods
|
151
215
|
#--}}}
|
152
216
|
end # module Logging
|