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/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