ThiagoLelis-backgroundjob 1.0.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +9 -9
- data/README +144 -142
- data/Rakefile +22 -22
- data/bin/bj +679 -679
- data/init.rb +33 -33
- data/install.rb +95 -95
- data/lib/arrayfields.rb +435 -435
- data/lib/attributes.rb +118 -118
- data/lib/bj.rb +87 -87
- data/lib/bj/api.rb +161 -161
- data/lib/bj/attributes.rb +120 -120
- data/lib/bj/bj.rb +72 -72
- data/lib/bj/errors.rb +4 -4
- data/lib/bj/joblist.rb +112 -112
- data/lib/bj/logger.rb +50 -50
- data/lib/bj/runner.rb +357 -357
- data/lib/bj/stdext.rb +86 -86
- data/lib/bj/table.rb +404 -404
- data/lib/bj/util.rb +115 -115
- data/lib/fattr.rb +153 -153
- data/lib/main.rb +60 -60
- data/lib/main/base.rb +515 -515
- data/lib/main/cast.rb +100 -100
- data/lib/main/factories.rb +20 -20
- data/lib/main/getoptlong.rb +470 -470
- data/lib/main/logger.rb +51 -51
- data/lib/main/mode.rb +42 -42
- data/lib/main/parameter.rb +685 -685
- data/lib/main/softspoken.rb +12 -12
- data/lib/main/stdext.rb +38 -38
- data/lib/main/usage.rb +211 -211
- data/lib/main/util.rb +91 -91
- data/lib/orderedautohash.rb +25 -25
- data/lib/orderedhash.rb +189 -189
- data/lib/systemu.rb +299 -299
- data/script/bj +55 -55
- data/tasks/bj_tasks.rake +4 -4
- data/test/bj_test.rb +8 -8
- data/uninstall.rb +1 -1
- metadata +2 -7
- data/background.gemspec +0 -18
data/lib/bj/util.rb
CHANGED
@@ -1,115 +1,115 @@
|
|
1
|
-
class Bj
|
2
|
-
module Util
|
3
|
-
module ModuleMethods
|
4
|
-
def constant_get const, &block
|
5
|
-
begin
|
6
|
-
ancestors = const.split(%r/::/)
|
7
|
-
parent = Object
|
8
|
-
while((child = ancestors.shift))
|
9
|
-
klass = parent.const_get child
|
10
|
-
parent = klass
|
11
|
-
end
|
12
|
-
klass
|
13
|
-
rescue
|
14
|
-
block ? block.call : raise
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def const_or_env const, &block
|
19
|
-
constant_get(const){ ENV[const] || block.call }
|
20
|
-
end
|
21
|
-
|
22
|
-
def spawn cmd, options = {}
|
23
|
-
options.to_options!
|
24
|
-
logger = options.has_key?(:logger) ? options[:logger] : Bj.logger
|
25
|
-
logger.info{ "cmd <#{ cmd }>" } if logger
|
26
|
-
status = systemu cmd, 1=>(stdout=""), 2=>(stderr="")
|
27
|
-
logger.info{ "status <#{ status.exitstatus }>" } if logger
|
28
|
-
status.exitstatus.zero? or raise "#{ cmd.inspect } failed with #{ $?.inspect }"
|
29
|
-
[ stdout, stderr ]
|
30
|
-
end
|
31
|
-
|
32
|
-
def start *a
|
33
|
-
q = Queue.new
|
34
|
-
thread = Thread.new do
|
35
|
-
Thread.current.abort_on_exception = true
|
36
|
-
systemu(*a){|pid| q << pid}
|
37
|
-
end
|
38
|
-
pid = q.pop
|
39
|
-
thread.singleton_class{ define_method(:pid){ pid } }
|
40
|
-
thread
|
41
|
-
end
|
42
|
-
|
43
|
-
def alive pid
|
44
|
-
return false unless pid
|
45
|
-
pid = Integer pid.to_s
|
46
|
-
Process::kill 0, pid
|
47
|
-
true
|
48
|
-
rescue Errno::ESRCH, Errno::EPERM
|
49
|
-
false
|
50
|
-
end
|
51
|
-
alias_method "alive?", "alive"
|
52
|
-
|
53
|
-
def which_ruby
|
54
|
-
c = ::Config::CONFIG
|
55
|
-
ruby = File::join(c['bindir'], c['ruby_install_name']) << c['EXEEXT']
|
56
|
-
raise "ruby @ #{ ruby } not executable!?" unless test(?e, ruby)
|
57
|
-
ruby
|
58
|
-
end
|
59
|
-
|
60
|
-
def which_rake
|
61
|
-
tmp = Tempfile.new Process.pid
|
62
|
-
tmp.write "task(:foobar){ puts 42 }"
|
63
|
-
tmp.close
|
64
|
-
bat = spawn("rake.bat -f #{ tmp.path.inspect } foobar", :logger => false) rescue false
|
65
|
-
bat ? "rake.bat" : "rake"
|
66
|
-
ensure
|
67
|
-
tmp.close! rescue nil
|
68
|
-
end
|
69
|
-
|
70
|
-
def ipc_signals_supported
|
71
|
-
@ipc_signals_supported ||=
|
72
|
-
IO.popen 'ruby', 'r+' do |ruby|
|
73
|
-
pid = ruby.pid
|
74
|
-
begin
|
75
|
-
Process.kill 'TERM', pid
|
76
|
-
true
|
77
|
-
rescue Exception
|
78
|
-
false
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
alias_method "ipc_signals_supported?", "ipc_signals_supported"
|
83
|
-
|
84
|
-
def find_script basename
|
85
|
-
path = ENV["PATH"] || ENV["path"] || Bj.default_path
|
86
|
-
raise "no env PATH" unless path
|
87
|
-
path = path.split File::PATH_SEPARATOR
|
88
|
-
path.unshift File.join(Bj.rails_root, "script")
|
89
|
-
path.each do |directory|
|
90
|
-
script = File.join directory, basename
|
91
|
-
return File.expand_path(script) if(test(?s, script) and test(?r, script))
|
92
|
-
end
|
93
|
-
raise "no #{ basename } found in #{ path.inspect }"
|
94
|
-
end
|
95
|
-
|
96
|
-
def valid_rails_root root = ".", expected = %w[ config script app ]
|
97
|
-
directories = expected.flatten.compact.map{|dir| dir.to_s}
|
98
|
-
directories.all?{|dir| test(?d, File.join(root, dir))}
|
99
|
-
end
|
100
|
-
alias_method "valid_rails_root?", "valid_rails_root"
|
101
|
-
|
102
|
-
def emsg e
|
103
|
-
m = e.message rescue ""
|
104
|
-
c = e.class rescue Exception
|
105
|
-
b = e.backtrace.join("\n") rescue ""
|
106
|
-
"#{ m }(#{ c })\n#{ b }"
|
107
|
-
end
|
108
|
-
|
109
|
-
def now
|
110
|
-
Bj.config["utc"] ? Time.now.utc : Time.now
|
111
|
-
end
|
112
|
-
end
|
113
|
-
send :extend, ModuleMethods
|
114
|
-
end
|
115
|
-
end
|
1
|
+
class Bj
|
2
|
+
module Util
|
3
|
+
module ModuleMethods
|
4
|
+
def constant_get const, &block
|
5
|
+
begin
|
6
|
+
ancestors = const.split(%r/::/)
|
7
|
+
parent = Object
|
8
|
+
while((child = ancestors.shift))
|
9
|
+
klass = parent.const_get child
|
10
|
+
parent = klass
|
11
|
+
end
|
12
|
+
klass
|
13
|
+
rescue
|
14
|
+
block ? block.call : raise
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def const_or_env const, &block
|
19
|
+
constant_get(const){ ENV[const] || block.call }
|
20
|
+
end
|
21
|
+
|
22
|
+
def spawn cmd, options = {}
|
23
|
+
options.to_options!
|
24
|
+
logger = options.has_key?(:logger) ? options[:logger] : Bj.logger
|
25
|
+
logger.info{ "cmd <#{ cmd }>" } if logger
|
26
|
+
status = systemu cmd, 1=>(stdout=""), 2=>(stderr="")
|
27
|
+
logger.info{ "status <#{ status.exitstatus }>" } if logger
|
28
|
+
status.exitstatus.zero? or raise "#{ cmd.inspect } failed with #{ $?.inspect }"
|
29
|
+
[ stdout, stderr ]
|
30
|
+
end
|
31
|
+
|
32
|
+
def start *a
|
33
|
+
q = Queue.new
|
34
|
+
thread = Thread.new do
|
35
|
+
Thread.current.abort_on_exception = true
|
36
|
+
systemu(*a){|pid| q << pid}
|
37
|
+
end
|
38
|
+
pid = q.pop
|
39
|
+
thread.singleton_class{ define_method(:pid){ pid } }
|
40
|
+
thread
|
41
|
+
end
|
42
|
+
|
43
|
+
def alive pid
|
44
|
+
return false unless pid
|
45
|
+
pid = Integer pid.to_s
|
46
|
+
Process::kill 0, pid
|
47
|
+
true
|
48
|
+
rescue Errno::ESRCH, Errno::EPERM
|
49
|
+
false
|
50
|
+
end
|
51
|
+
alias_method "alive?", "alive"
|
52
|
+
|
53
|
+
def which_ruby
|
54
|
+
c = ::Config::CONFIG
|
55
|
+
ruby = File::join(c['bindir'], c['ruby_install_name']) << c['EXEEXT']
|
56
|
+
raise "ruby @ #{ ruby } not executable!?" unless test(?e, ruby)
|
57
|
+
ruby
|
58
|
+
end
|
59
|
+
|
60
|
+
def which_rake
|
61
|
+
tmp = Tempfile.new Process.pid
|
62
|
+
tmp.write "task(:foobar){ puts 42 }"
|
63
|
+
tmp.close
|
64
|
+
bat = spawn("rake.bat -f #{ tmp.path.inspect } foobar", :logger => false) rescue false
|
65
|
+
bat ? "rake.bat" : "rake"
|
66
|
+
ensure
|
67
|
+
tmp.close! rescue nil
|
68
|
+
end
|
69
|
+
|
70
|
+
def ipc_signals_supported
|
71
|
+
@ipc_signals_supported ||=
|
72
|
+
IO.popen 'ruby', 'r+' do |ruby|
|
73
|
+
pid = ruby.pid
|
74
|
+
begin
|
75
|
+
Process.kill 'TERM', pid
|
76
|
+
true
|
77
|
+
rescue Exception
|
78
|
+
false
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
alias_method "ipc_signals_supported?", "ipc_signals_supported"
|
83
|
+
|
84
|
+
def find_script basename
|
85
|
+
path = ENV["PATH"] || ENV["path"] || Bj.default_path
|
86
|
+
raise "no env PATH" unless path
|
87
|
+
path = path.split File::PATH_SEPARATOR
|
88
|
+
path.unshift File.join(Bj.rails_root, "script")
|
89
|
+
path.each do |directory|
|
90
|
+
script = File.join directory, basename
|
91
|
+
return File.expand_path(script) if(test(?s, script) and test(?r, script))
|
92
|
+
end
|
93
|
+
raise "no #{ basename } found in #{ path.inspect }"
|
94
|
+
end
|
95
|
+
|
96
|
+
def valid_rails_root root = ".", expected = %w[ config script app ]
|
97
|
+
directories = expected.flatten.compact.map{|dir| dir.to_s}
|
98
|
+
directories.all?{|dir| test(?d, File.join(root, dir))}
|
99
|
+
end
|
100
|
+
alias_method "valid_rails_root?", "valid_rails_root"
|
101
|
+
|
102
|
+
def emsg e
|
103
|
+
m = e.message rescue ""
|
104
|
+
c = e.class rescue Exception
|
105
|
+
b = e.backtrace.join("\n") rescue ""
|
106
|
+
"#{ m }(#{ c })\n#{ b }"
|
107
|
+
end
|
108
|
+
|
109
|
+
def now
|
110
|
+
Bj.config["utc"] ? Time.now.utc : Time.now
|
111
|
+
end
|
112
|
+
end
|
113
|
+
send :extend, ModuleMethods
|
114
|
+
end
|
115
|
+
end
|
data/lib/fattr.rb
CHANGED
@@ -1,153 +1,153 @@
|
|
1
|
-
module Fattr
|
2
|
-
Fattr::VERSION = '1.0.3' unless Fattr.const_defined?(:VERSION)
|
3
|
-
def self.version() Fattr::VERSION end
|
4
|
-
|
5
|
-
class List < ::Array
|
6
|
-
def << element
|
7
|
-
super
|
8
|
-
self
|
9
|
-
ensure
|
10
|
-
uniq!
|
11
|
-
index!
|
12
|
-
end
|
13
|
-
|
14
|
-
def index!
|
15
|
-
@index ||= Hash.new
|
16
|
-
each{|element| @index[element] = true}
|
17
|
-
end
|
18
|
-
|
19
|
-
def include? element
|
20
|
-
@index ||= Hash.new
|
21
|
-
@index[element] ? true : false
|
22
|
-
end
|
23
|
-
|
24
|
-
def initializers
|
25
|
-
@initializers ||= Hash.new
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def fattrs *a, &b
|
30
|
-
unless a.empty?
|
31
|
-
returned = Hash.new
|
32
|
-
|
33
|
-
hashes, names = a.partition{|x| Hash === x}
|
34
|
-
names_and_defaults = {}
|
35
|
-
hashes.each{|h| names_and_defaults.update h}
|
36
|
-
names.flatten.compact.each{|name| names_and_defaults.update name => nil}
|
37
|
-
|
38
|
-
initializers = __fattrs__.initializers
|
39
|
-
|
40
|
-
names_and_defaults.each do |name, default|
|
41
|
-
raise NameError, "bad instance variable name '@#{ name }'" if "@#{ name }" =~ %r/[!?=]$/o
|
42
|
-
name = name.to_s
|
43
|
-
|
44
|
-
initialize = b || lambda { default }
|
45
|
-
initializer = lambda do |this|
|
46
|
-
Object.instance_method('instance_eval').bind(this).call &initialize
|
47
|
-
end
|
48
|
-
initializer_id = initializer.object_id
|
49
|
-
__fattrs__.initializers[name] = initializer
|
50
|
-
|
51
|
-
compile = lambda do |code|
|
52
|
-
begin
|
53
|
-
module_eval code
|
54
|
-
rescue SyntaxError
|
55
|
-
raise SyntaxError, "\n#{ code }\n"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
# setter, block invocation caches block
|
60
|
-
code = <<-code
|
61
|
-
def #{ name }=(*value, &block)
|
62
|
-
value.unshift block if block
|
63
|
-
@#{ name } = value.first
|
64
|
-
end
|
65
|
-
code
|
66
|
-
compile[code]
|
67
|
-
|
68
|
-
# getter, providing a value or block causes it to acts as setter
|
69
|
-
code = <<-code
|
70
|
-
def #{ name }(*value, &block)
|
71
|
-
value.unshift block if block
|
72
|
-
return self.send('#{ name }=', value.first) unless value.empty?
|
73
|
-
#{ name }! unless defined? @#{ name }
|
74
|
-
@#{ name }
|
75
|
-
end
|
76
|
-
code
|
77
|
-
compile[code]
|
78
|
-
|
79
|
-
# bang method re-calls any initializer given at declaration time
|
80
|
-
code = <<-code
|
81
|
-
def #{ name }!
|
82
|
-
initializer = ObjectSpace._id2ref #{ initializer_id }
|
83
|
-
self.#{ name } = initializer.call(self)
|
84
|
-
@#{ name }
|
85
|
-
end
|
86
|
-
code
|
87
|
-
compile[code]
|
88
|
-
|
89
|
-
# query simply defers to getter - cast to bool
|
90
|
-
code = <<-code
|
91
|
-
def #{ name }?
|
92
|
-
self.#{ name }
|
93
|
-
end
|
94
|
-
code
|
95
|
-
compile[code]
|
96
|
-
|
97
|
-
fattrs << name
|
98
|
-
returned[name] = initializer
|
99
|
-
end
|
100
|
-
|
101
|
-
returned
|
102
|
-
else
|
103
|
-
begin
|
104
|
-
__fattr_list__
|
105
|
-
rescue NameError
|
106
|
-
singleton_class =
|
107
|
-
class << self
|
108
|
-
self
|
109
|
-
end
|
110
|
-
klass = self
|
111
|
-
singleton_class.module_eval do
|
112
|
-
fattr_list = List.new
|
113
|
-
define_method('fattr_list'){ klass == self ? fattr_list : raise(NameError) }
|
114
|
-
alias_method '__fattr_list__', 'fattr_list'
|
115
|
-
end
|
116
|
-
__fattr_list__
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
%w( __fattrs__ __fattr__ fattr ).each{|dst| alias_method dst, 'fattrs'}
|
122
|
-
end
|
123
|
-
|
124
|
-
class Module
|
125
|
-
include Fattr
|
126
|
-
|
127
|
-
def Fattrs(*a, &b)
|
128
|
-
class << self
|
129
|
-
self
|
130
|
-
end.module_eval do
|
131
|
-
fattrs(*a, &b)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
def Fattr(*a, &b)
|
136
|
-
class << self
|
137
|
-
self
|
138
|
-
end.module_eval do
|
139
|
-
fattr(*a, &b)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
class Object
|
145
|
-
def fattrs *a, &b
|
146
|
-
sc =
|
147
|
-
class << self
|
148
|
-
self
|
149
|
-
end
|
150
|
-
sc.fattrs *a, &b
|
151
|
-
end
|
152
|
-
%w( __fattrs__ __fattr__ fattr ).each{|dst| alias_method dst, 'fattrs'}
|
153
|
-
end
|
1
|
+
module Fattr
|
2
|
+
Fattr::VERSION = '1.0.3' unless Fattr.const_defined?(:VERSION)
|
3
|
+
def self.version() Fattr::VERSION end
|
4
|
+
|
5
|
+
class List < ::Array
|
6
|
+
def << element
|
7
|
+
super
|
8
|
+
self
|
9
|
+
ensure
|
10
|
+
uniq!
|
11
|
+
index!
|
12
|
+
end
|
13
|
+
|
14
|
+
def index!
|
15
|
+
@index ||= Hash.new
|
16
|
+
each{|element| @index[element] = true}
|
17
|
+
end
|
18
|
+
|
19
|
+
def include? element
|
20
|
+
@index ||= Hash.new
|
21
|
+
@index[element] ? true : false
|
22
|
+
end
|
23
|
+
|
24
|
+
def initializers
|
25
|
+
@initializers ||= Hash.new
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def fattrs *a, &b
|
30
|
+
unless a.empty?
|
31
|
+
returned = Hash.new
|
32
|
+
|
33
|
+
hashes, names = a.partition{|x| Hash === x}
|
34
|
+
names_and_defaults = {}
|
35
|
+
hashes.each{|h| names_and_defaults.update h}
|
36
|
+
names.flatten.compact.each{|name| names_and_defaults.update name => nil}
|
37
|
+
|
38
|
+
initializers = __fattrs__.initializers
|
39
|
+
|
40
|
+
names_and_defaults.each do |name, default|
|
41
|
+
raise NameError, "bad instance variable name '@#{ name }'" if "@#{ name }" =~ %r/[!?=]$/o
|
42
|
+
name = name.to_s
|
43
|
+
|
44
|
+
initialize = b || lambda { default }
|
45
|
+
initializer = lambda do |this|
|
46
|
+
Object.instance_method('instance_eval').bind(this).call &initialize
|
47
|
+
end
|
48
|
+
initializer_id = initializer.object_id
|
49
|
+
__fattrs__.initializers[name] = initializer
|
50
|
+
|
51
|
+
compile = lambda do |code|
|
52
|
+
begin
|
53
|
+
module_eval code
|
54
|
+
rescue SyntaxError
|
55
|
+
raise SyntaxError, "\n#{ code }\n"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# setter, block invocation caches block
|
60
|
+
code = <<-code
|
61
|
+
def #{ name }=(*value, &block)
|
62
|
+
value.unshift block if block
|
63
|
+
@#{ name } = value.first
|
64
|
+
end
|
65
|
+
code
|
66
|
+
compile[code]
|
67
|
+
|
68
|
+
# getter, providing a value or block causes it to acts as setter
|
69
|
+
code = <<-code
|
70
|
+
def #{ name }(*value, &block)
|
71
|
+
value.unshift block if block
|
72
|
+
return self.send('#{ name }=', value.first) unless value.empty?
|
73
|
+
#{ name }! unless defined? @#{ name }
|
74
|
+
@#{ name }
|
75
|
+
end
|
76
|
+
code
|
77
|
+
compile[code]
|
78
|
+
|
79
|
+
# bang method re-calls any initializer given at declaration time
|
80
|
+
code = <<-code
|
81
|
+
def #{ name }!
|
82
|
+
initializer = ObjectSpace._id2ref #{ initializer_id }
|
83
|
+
self.#{ name } = initializer.call(self)
|
84
|
+
@#{ name }
|
85
|
+
end
|
86
|
+
code
|
87
|
+
compile[code]
|
88
|
+
|
89
|
+
# query simply defers to getter - cast to bool
|
90
|
+
code = <<-code
|
91
|
+
def #{ name }?
|
92
|
+
self.#{ name }
|
93
|
+
end
|
94
|
+
code
|
95
|
+
compile[code]
|
96
|
+
|
97
|
+
fattrs << name
|
98
|
+
returned[name] = initializer
|
99
|
+
end
|
100
|
+
|
101
|
+
returned
|
102
|
+
else
|
103
|
+
begin
|
104
|
+
__fattr_list__
|
105
|
+
rescue NameError
|
106
|
+
singleton_class =
|
107
|
+
class << self
|
108
|
+
self
|
109
|
+
end
|
110
|
+
klass = self
|
111
|
+
singleton_class.module_eval do
|
112
|
+
fattr_list = List.new
|
113
|
+
define_method('fattr_list'){ klass == self ? fattr_list : raise(NameError) }
|
114
|
+
alias_method '__fattr_list__', 'fattr_list'
|
115
|
+
end
|
116
|
+
__fattr_list__
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
%w( __fattrs__ __fattr__ fattr ).each{|dst| alias_method dst, 'fattrs'}
|
122
|
+
end
|
123
|
+
|
124
|
+
class Module
|
125
|
+
include Fattr
|
126
|
+
|
127
|
+
def Fattrs(*a, &b)
|
128
|
+
class << self
|
129
|
+
self
|
130
|
+
end.module_eval do
|
131
|
+
fattrs(*a, &b)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def Fattr(*a, &b)
|
136
|
+
class << self
|
137
|
+
self
|
138
|
+
end.module_eval do
|
139
|
+
fattr(*a, &b)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
class Object
|
145
|
+
def fattrs *a, &b
|
146
|
+
sc =
|
147
|
+
class << self
|
148
|
+
self
|
149
|
+
end
|
150
|
+
sc.fattrs *a, &b
|
151
|
+
end
|
152
|
+
%w( __fattrs__ __fattr__ fattr ).each{|dst| alias_method dst, 'fattrs'}
|
153
|
+
end
|