rbbt-util 5.6.2 → 5.6.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7529a3f61ee17378eae98591577b9a39f9a64fd8
4
- data.tar.gz: 21485c3f12ae2823f13e7a7f098d242dac15c0c1
3
+ metadata.gz: ecea1d091627d32a02327ea8a0eee78b099f13f0
4
+ data.tar.gz: a2ebf3798cb4ee454a3050307816b5d6ad46747d
5
5
  SHA512:
6
- metadata.gz: 73f9e121eb79a0c91b92dd5474f04508771230d8451178cf348d6fb3f920d89518491106c7a051f95bd28d94bb59884aa20491b3d8dd1839786603eecb2efc41
7
- data.tar.gz: 39c04b2dff5c9fd798c2cb45cb432395d627b60f1ff2bf9483e5602035ab8e36ccd5847e75b03eec3c0cd4b61ee0a2c4c5bdb804d2776f031708babee6303289
6
+ metadata.gz: ff9269d0314aa934653a32231706cf665209e411773b4e174228623697ec01fd223a626059d87c2ed2209b9ba33779c019719b2d17b795b0e68fca4e8ea8ba15
7
+ data.tar.gz: e34f7b523daa44e076da779f3ed6d79733214770fceb5a16e8643f1e8db6aa035523c0925656adfee7b1d5f9d8713e4c026ea6905064927de2cbcddb26095d68
data/bin/rbbt CHANGED
@@ -57,11 +57,13 @@ begin
57
57
  load dir[command].find
58
58
  exit 0
59
59
  else
60
- puts "Error: Command not understood"
61
- puts
60
+ error = "Command '#{command }' not understood"
62
61
  break
63
62
  end
64
63
  end
64
+ rescue ParameterException
65
+ error = $!.message
66
+ backtrace = $!.backtrace
65
67
  ensure
66
68
  if options[:profile]
67
69
  result = RubyProf.stop
@@ -83,4 +85,18 @@ puts
83
85
  commands(prev).each do |command|
84
86
  puts " " << command
85
87
  end
88
+
89
+ if error
90
+ puts
91
+ puts Term::ANSIColor.red("Error executing '#{ [File.basename($0), prev, command].compact.flatten * " " }':")
92
+ puts
93
+ puts error
94
+ if backtrace
95
+ puts
96
+ puts Term::ANSIColor.red("Backtrace:")
97
+ puts
98
+ puts backtrace * "\n"
99
+ end
100
+ puts
101
+ end
86
102
 
@@ -12,7 +12,7 @@ module Persist
12
12
  database = CONNECTIONS[path] ||= tokyocabinet_class.new
13
13
 
14
14
  flags = (write ? tokyocabinet_class::OWRITER | tokyocabinet_class::OCREAT : tokyocabinet_class::OREADER)
15
- database.close
15
+ database.close
16
16
 
17
17
  if !database.open(path, flags)
18
18
  ecode = database.ecode
@@ -93,7 +93,7 @@ module Persist
93
93
  end
94
94
 
95
95
  def write_and_read
96
- lock_filename = Persist.persistence_path(persistence_path, {:dir => TSV.lock_dir})
96
+ lock_filename = Persist.persistence_path(persistence_path + '.write', {:dir => TSV.lock_dir})
97
97
  Misc.lock(lock_filename) do
98
98
  write if @closed or not write?
99
99
  res = begin
@@ -106,7 +106,7 @@ module Persist
106
106
  end
107
107
 
108
108
  def write_and_close
109
- lock_filename = Persist.persistence_path(persistence_path, {:dir => TSV.lock_dir})
109
+ lock_filename = Persist.persistence_path(persistence_path + '.write', {:dir => TSV.lock_dir})
110
110
  Misc.lock(lock_filename) do
111
111
  write if @closed or not write?
112
112
  res = begin
@@ -88,5 +88,54 @@ void post_semaphore(char* name){
88
88
  end
89
89
  end
90
90
  end
91
- end if continue
91
+
92
+ def self.thread_each_on_semaphore(elems, size)
93
+ mutex = Mutex.new
94
+ count = 0
95
+ cv = ConditionVariable.new
96
+ wait_mutex = Mutex.new
97
+
98
+ begin
99
+
100
+ threads = []
101
+ wait_mutex.synchronize do
102
+ threads = elems.collect do |elem|
103
+ Thread.new(elem) do |elem|
104
+
105
+ continue = false
106
+ mutex.synchronize do
107
+ while not continue do
108
+ if count < size
109
+ continue = true
110
+ count += 1
111
+ end
112
+ mutex.sleep 1 unless continue
113
+ end
114
+ end
115
+
116
+ begin
117
+ yield elem
118
+ rescue Interrupt
119
+ Log.error "Thread was aborted while processing: #{Misc.fingerprint elem}"
120
+ raise $!
121
+ ensure
122
+ mutex.synchronize do
123
+ count -= 1
124
+ cv.signal if mutex.locked?
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ threads.each do |thread|
132
+ thread.join
133
+ end
134
+ rescue Exception
135
+ Log.exception $!
136
+ Log.info "Ensuring threads are dead: #{threads.length}"
137
+ threads.each do |thread| thread.kill end
138
+ end
139
+ end
140
+ end
92
141
 
@@ -0,0 +1,50 @@
1
+
2
+ module SOPT
3
+ class << self
4
+ attr_accessor :inputs, :input_shortcuts, :input_types, :input_descriptions, :input_defaults
5
+ end
6
+
7
+ def self.all
8
+ @all ||= {}
9
+ end
10
+
11
+ def self.shortcuts
12
+ @shortcuts ||= {}
13
+ end
14
+
15
+ def self.inputs
16
+ @inputs ||= []
17
+ end
18
+
19
+ def self.input_shortcuts
20
+ @input_shortcuts ||= {}
21
+ end
22
+
23
+ def self.input_types
24
+ @input_types ||= {}
25
+ end
26
+
27
+ def self.input_descriptions
28
+ @input_descriptions ||= {}
29
+ end
30
+
31
+ def self.input_defaults
32
+ @input_defaults ||= {}
33
+ end
34
+
35
+ def self.reset
36
+ @shortcuts = {}
37
+ @all = {}
38
+ end
39
+
40
+ def self.delete_inputs(inputs)
41
+ inputs.each do |input|
42
+ input = input.to_s
43
+ self.shortcuts.delete self.input_shortcuts.delete(input)
44
+ self.inputs.delete input
45
+ self.input_types.delete input
46
+ self.input_defaults.delete input
47
+ self.input_descriptions.delete input
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,90 @@
1
+ module SOPT
2
+
3
+ class << self
4
+ attr_accessor :command, :summary, :synopsys, :description
5
+ end
6
+
7
+ def self.command
8
+ @command ||= File.basename($0)
9
+ end
10
+
11
+ def self.summary
12
+ @summary ||= ""
13
+ end
14
+
15
+ def self.synopsys
16
+ @synopsys ||= begin
17
+ "#{command} " <<
18
+ inputs.collect{|name|
19
+ "[" << input_format(name, input_types[name] || :string, input_defaults[name], input_shortcuts[name]).sub(/:$/,'') << "]"
20
+ } * " "
21
+ end
22
+ end
23
+
24
+ def self.description
25
+ @description ||= "Missing"
26
+ end
27
+
28
+ def self.input_format(name, type = nil, default = nil, short = nil)
29
+ input_str = (short.nil? or short.empty?) ? "--#{name}" : "-#{short}, --#{name}"
30
+ input_str << case type
31
+ when nil
32
+ "#{default != nil ? " (default '#{default}')" : ""}:"
33
+ when :boolean
34
+ "[=false]#{default != nil ? " (default '#{default}')" : ""}:"
35
+ when :tsv, :text
36
+ "=<filename.#{type}|->#{default != nil ? " (default '#{default}')" : ""}; Use '-' for STDIN:"
37
+ when :array
38
+ "=<string[,string]*|filename.list|->#{default != nil ? " (default '#{default}')" : ""}; Use '-' for STDIN:"
39
+ else
40
+ "=<#{ type }>#{default != nil ? " (default '#{default}')" : ""}:"
41
+ end
42
+ end
43
+
44
+ def self.input_doc(inputs, input_types = nil, input_descriptions = nil, input_defaults = nil, input_shortcuts = nil)
45
+ type = description = default = nil
46
+ shortcut = ""
47
+ inputs.collect do |name|
48
+ name = name.to_s
49
+
50
+ type = input_types[name] unless input_types.nil?
51
+ description = input_descriptions[name] unless input_descriptions.nil?
52
+ default = input_defaults[name] unless input_defaults.nil?
53
+
54
+ case input_shortcuts
55
+ when nil, FalseClass
56
+ shortcut = nil
57
+ when Hash
58
+ shortcut = input_shortcuts[name]
59
+ when TrueClass
60
+ shortcut = fix_shortcut(name[0], name)
61
+ end
62
+
63
+ type = :string if type.nil?
64
+ register(shortcut, name, type, description) unless self.inputs.include? name
65
+
66
+ str = " * " << SOPT.input_format(name, type.to_sym, default, shortcut) << "\n"
67
+ str << " " << description << "\n" if description and not description.empty?
68
+ str
69
+ end * "\n"
70
+ end
71
+
72
+ def self.doc
73
+ doc = <<-EOF
74
+ #{command}(1) -- #{summary}
75
+ #{"=" * (command.length + summary.length + 7)}
76
+
77
+ ## SYNOPSYS
78
+
79
+ #{synopsys}
80
+
81
+ ## DESCRIPTION
82
+
83
+ #{description}
84
+
85
+ ## OPTIONS
86
+
87
+ #{input_doc(inputs, input_types, input_descriptions, input_defaults, input_shortcuts)}
88
+ EOF
89
+ end
90
+ end
@@ -0,0 +1,41 @@
1
+ module SOPT
2
+ def self.consume(args = ARGV)
3
+ i = 0
4
+ values = {}
5
+ while i < args.length do
6
+ current = args[i]
7
+ if m = current.match(/--?(.+?)(?:=(.+))?$/)
8
+ key = $1
9
+ value = $2
10
+
11
+ input = inputs.include?(key)? key : shortcuts[key]
12
+
13
+ if input.nil?
14
+ i += 1
15
+ next
16
+ else
17
+ args.delete_at i
18
+ end
19
+ else
20
+ i += 1
21
+ next
22
+ end
23
+
24
+ if input_types[input] == :string
25
+ value = args.delete_at(i) if value.nil?
26
+ values[input] = value
27
+ else
28
+ values[input] = %w(F false FALSE no).include?(value)? false : true
29
+ end
30
+ end
31
+
32
+ IndiferentHash.setup values
33
+
34
+ values
35
+ end
36
+
37
+ def self.get(opt_str)
38
+ SOPT.parse(opt_str)
39
+ SOPT.consume(ARGV)
40
+ end
41
+ end
@@ -0,0 +1,44 @@
1
+ require 'rbbt/util/simpleopt/accessor'
2
+ module SOPT
3
+ def self.fix_shortcut(short, long)
4
+ return short unless short and shortcuts.include?(short)
5
+
6
+ chars = long.chars.to_a
7
+ current = [chars.shift]
8
+ short = current * ""
9
+
10
+ while shortcuts.include? short
11
+ next_letter = chars.shift
12
+ return nil if next_letter.nil?
13
+ current << next_letter
14
+ short = current * ""
15
+ end
16
+
17
+ short
18
+ end
19
+
20
+ def self.register(short, long, asterisk, description)
21
+ short = fix_shortcut(short, long)
22
+ shortcuts[short] = long if short
23
+ inputs << long
24
+ input_shortcuts[long] = short
25
+ input_descriptions[long] = description
26
+ input_types[long] = asterisk ? :string : :boolean
27
+ end
28
+
29
+ def self.parse(opt_str)
30
+ info = {}
31
+
32
+ inputs = []
33
+ opt_str.split(/[:\n]+/).each do |entry|
34
+ entry.strip!
35
+ next if entry.empty?
36
+ names, _sep, description = entry.partition /\s+/
37
+ short, long, asterisk = names.match(/\s*(?:-(.+))?(?:--(.+?))([*])?$/).values_at 1,2,3
38
+
39
+ inputs << long
40
+ register short, long, asterisk, description
41
+ end
42
+ inputs
43
+ end
44
+ end
@@ -1,244 +1,7 @@
1
- module SOPT
2
-
3
- #{{{ ACCESSORS
4
-
5
- class << self
6
- attr_accessor :command, :summary, :synopsys, :description
7
- attr_accessor :inputs, :input_shortcuts, :input_types, :input_descriptions, :input_defaults
8
- end
9
-
10
- def self.command
11
- @command ||= File.basename($0)
12
- end
13
-
14
- def self.summary
15
- @summary ||= ""
16
- end
17
-
18
- def self.synopsys
19
- @synopsys ||= begin
20
- "#{command} " <<
21
- inputs.collect{|name|
22
- "[" << input_format(name, input_types[name] || :string, input_defaults[name], input_shortcuts[name]).sub(/:$/,'') << "]"
23
- } * " "
24
- end
25
- end
26
-
27
- def self.description
28
- @description ||= "Missing"
29
- end
30
-
31
- def self.shortcuts
32
- @shortcuts ||= []
33
- end
34
-
35
- def self.delete_inputs(inputs)
36
- inputs.each do |input|
37
- input = input.to_s
38
- self.shortcuts.delete self.input_shortcuts.delete(input)
39
- self.inputs.delete input
40
- self.input_types.delete input
41
- self.input_defaults.delete input
42
- self.input_descriptions.delete input
43
- end
44
- end
45
-
46
- def self.all
47
- @all ||= {}
48
- end
49
-
50
- def self.inputs
51
- @inputs ||= []
52
- end
53
-
54
- def self.input_shortcuts
55
- @input_shortcuts ||= {}
56
- end
57
-
58
- def self.input_types
59
- @input_types ||= {}
60
- end
61
-
62
- def self.input_descriptions
63
- @input_descriptions ||= {}
64
- end
65
-
66
- def self.input_defaults
67
- @input_defaults ||= {}
68
- end
69
-
70
- def self.reset
71
- @shortcuts = []
72
- @all = {}
73
- end
74
-
75
- #{{{ PARSING
76
-
77
- def self.record(info)
78
- input = info[:long].sub("--", '')
79
- inputs << input
80
- input_types[input] = info[:arg] ? :string : :boolean
81
- input_descriptions[input] = info[:description]
82
- input_defaults[input] = info[:default]
83
- input_shortcuts[input] = info[:short]? info[:short].sub("-",'') : nil
84
- end
85
-
86
- def self.short_for(name)
87
- short = []
88
- chars = name.to_s.chars.to_a
89
-
90
- short << chars.shift
91
- shortcuts = input_shortcuts.values.compact.flatten
92
- while shortcuts.include? short * "" and chars.any?
93
- short << chars.shift
94
- end
95
- return nil if chars.empty?
96
-
97
- short * ""
98
- end
99
-
100
-
101
- def self.name(info)
102
- (info[:long] || info[:short]).sub(/^-*/,'')
103
- end
104
-
105
- def self.parse(opts)
106
- info = {}
107
-
108
- opts.split(/[:\n]+/).each do |opt|
109
- next if opt.strip.empty?
110
-
111
- short, long = opt.strip.sub(/(^[^\s]*)\*/,'\1').split('--').values_at(0,1)
112
- long, short = short, nil if long.nil?
113
-
114
- if long.index(" ")
115
- long, description = long.match(/^([^\s]+)\s+(.*)/).values_at 1, 2
116
- else
117
- description = nil
118
- end
119
-
120
- i= { :arg => !!opt.match(/^[^\s]*\*/) }
121
-
122
- i[:short] = short unless short.nil? || short.empty?
123
- i[:long] = '--' + long unless long.nil? || long.empty?
124
- i[:description] = description unless description.nil? || description.empty?
125
-
126
- if shortcuts.include? short
127
- i[:short] = short_for(i[:long])
128
- Log.debug{ "Short for #{ long } is taken. Changed to #{i[:short]}" }
129
- else
130
- shortcuts << i[:short] if short
131
- end
1
+ require 'rbbt/util/simpleopt/accessor'
2
+ require 'rbbt/util/simpleopt/doc'
3
+ require 'rbbt/util/simpleopt/parse'
4
+ require 'rbbt/util/simpleopt/get'
132
5
 
133
- record(i)
134
-
135
- info[name(i)] = i
136
- end
137
-
138
- info
139
- end
140
-
141
- def self.get(opts)
142
- info = parse(opts)
143
-
144
- switches = {}
145
- info.each do |name, i|
146
- switches[i[:short]] = name if i[:short]
147
- switches[i[:long]] = name if i[:long]
148
- end
149
-
150
- options = Hash.new(false)
151
- rest = []
152
-
153
- index = 0
154
- while index < ARGV.length do
155
- orig_arg = ARGV[index]
156
-
157
- if orig_arg =~ /=/
158
- arg, value = orig_arg.match(/(.*?)=(.*)/).values_at 1, 2
159
- else
160
- arg = orig_arg
161
- value = nil
162
- end
163
-
164
- if switches.include? arg
165
- name = switches[arg]
166
- i = info[name]
167
- if i[:arg]
168
- if value.nil?
169
- value = ARGV[index + 1]
170
- index += 1
171
- end
172
- options[name.to_sym] = value
173
- else
174
- options[name.to_sym] = value == "false" ? false : true
175
- end
176
- else
177
- rest << orig_arg
178
- end
179
- index += 1
180
- end
181
-
182
- ARGV.delete_if do true end
183
- rest.each do |e| ARGV << e end
184
-
185
- options
186
- end
187
-
188
- #{{{ DOCUMENTATION
189
-
190
- def self.input_format(name, type = nil, default = nil, short = "")
191
- short = short_for(name) if not short.nil? and short.empty?
192
-
193
- input_str = short.nil? ? "--#{name}" : "-#{short}, --#{name}"
194
- input_str << case type
195
- when nil
196
- "#{default != nil ? " (default '#{default}')" : ""}:"
197
- when :boolean
198
- "[=false]#{default != nil ? " (default '#{default}')" : ""}:"
199
- when :tsv, :text
200
- "=<filename.#{type}|->#{default != nil ? " (default '#{default}')" : ""}; Use '-' for STDIN:"
201
- when :array
202
- "=<string[,string]*|filename.list|->#{default != nil ? " (default '#{default}')" : ""}; Use '-' for STDIN:"
203
- else
204
- "=<#{ type }>#{default != nil ? " (default '#{default}')" : ""}:"
205
- end
206
- end
207
-
208
- def self.input_doc(inputs, input_types = nil, input_descriptions = nil, input_defaults = nil, input_shortcuts = nil)
209
- type = description = default = nil
210
- shortcut = ""
211
- inputs.collect do |name|
212
-
213
- type = input_types[name] unless input_types.nil?
214
- description = input_descriptions[name] unless input_descriptions.nil?
215
- default = input_defaults[name] unless input_defaults.nil?
216
- shortcut = input_shortcuts[name] unless input_shortcuts.nil?
217
-
218
- type = :string if type.nil?
219
-
220
- str = " * " << SOPT.input_format(name, type.to_sym, default, shortcut) << "\n"
221
- str << " " << description << "\n" if description and not description.empty?
222
- str
223
- end * "\n"
224
- end
225
-
226
- def self.doc
227
- doc = <<-EOF
228
- #{command}(1) -- #{summary}
229
- #{"=" * (command.length + summary.length + 7)}
230
-
231
- ## SYNOPSYS
232
-
233
- #{synopsys}
234
-
235
- ## DESCRIPTION
236
-
237
- #{description}
238
-
239
- ## OPTIONS
240
-
241
- #{input_doc(inputs, input_types, input_descriptions, input_defaults, input_shortcuts)}
242
- EOF
243
- end
6
+ module SOPT
244
7
  end
@@ -260,19 +260,23 @@ module Workflow
260
260
  end
261
261
 
262
262
  def rec_input_defaults(taskname)
263
- [taskname].concat(rec_dependencies(taskname)).inject({}){|acc, tn| acc.merge tasks[tn.to_sym].input_defaults}
263
+ [taskname].concat(rec_dependencies(taskname)).inject({}){|acc, tn| acc.merge tasks[tn.to_sym].input_defaults}.
264
+ tap{|h| IndiferentHash.setup(h)}
264
265
  end
265
266
 
266
267
  def rec_input_types(taskname)
267
- [taskname].concat(rec_dependencies(taskname)).inject({}){|acc, tn| acc.merge tasks[tn.to_sym].input_types}
268
+ [taskname].concat(rec_dependencies(taskname)).inject({}){|acc, tn| acc.merge tasks[tn.to_sym].input_types}.
269
+ tap{|h| IndiferentHash.setup(h)}
268
270
  end
269
271
 
270
272
  def rec_input_descriptions(taskname)
271
- [taskname].concat(rec_dependencies(taskname)).inject({}){|acc, tn| acc.merge tasks[tn.to_sym].input_descriptions}
273
+ [taskname].concat(rec_dependencies(taskname)).inject({}){|acc, tn| acc.merge tasks[tn.to_sym].input_descriptions}.
274
+ tap{|h| IndiferentHash.setup(h)}
272
275
  end
273
276
 
274
277
  def rec_input_options(taskname)
275
- [taskname].concat(rec_dependencies(taskname)).inject({}){|acc, tn| acc.merge tasks[tn.to_sym].input_options}
278
+ [taskname].concat(rec_dependencies(taskname)).inject({}){|acc, tn| acc.merge tasks[tn.to_sym].input_options}.
279
+ tap{|h| IndiferentHash.setup(h)}
276
280
  end
277
281
 
278
282
  def real_dependencies(task, jobname, inputs, dependencies)
@@ -4,8 +4,7 @@ module Task
4
4
  def doc(deps = nil)
5
5
  puts "## #{ name }:"
6
6
  puts "\n" << description if description and not description.empty?
7
- puts
8
- puts SOPT.input_doc(inputs, input_types, input_descriptions, input_defaults)
7
+ puts SOPT.input_doc(inputs, input_types, input_descriptions, input_defaults, true)
9
8
 
10
9
  if deps and deps.any?
11
10
  puts
@@ -14,7 +13,7 @@ module Task
14
13
  deps.each do |dep|
15
14
  puts " #{dep.name}:"
16
15
  puts
17
- puts SOPT.input_doc(dep.inputs, dep.input_types, dep.input_descriptions, dep.input_defaults)
16
+ puts SOPT.input_doc(dep.inputs, dep.input_types, dep.input_descriptions, dep.input_defaults, true)
18
17
  puts
19
18
  end
20
19
  end
@@ -108,17 +108,19 @@ end
108
108
 
109
109
  options = SOPT.get <<EOF
110
110
  -h--help Show this help:
111
+ -wd--workdir* Change the working directory of the workflow:
111
112
  -as--array_separator* Change the character that separates elements of Arrays, ',', '|', or '\\n' by default:
113
+ -jn--jobname* Job name to use. The name 'Default' is used by default:
114
+ -pn--printname Print the name of the job and exit without starting it:
112
115
  -cl--clean Clean the last step of the job so that it gets recomputed:
113
116
  -rcl--recursive_clean Clean the last step and its dependencies to recompute the job completely:
114
- -jn--jobname* Job name to use. The name 'Default' is used by default:
115
- -wd--workdir* Change the working directory of the workflow:
117
+ --fork Run job asyncronously:
118
+ --exec Run job with no persistence:
116
119
  -O--output* Save job result into file:
117
- -pn--printname Print the name of the job and exit without starting it:
118
120
  -jf--job_file* Output one of the job produced files:
121
+ -ljf--list_job_files List all the files produced in that step:
119
122
  --info Show the job info:
120
123
  --provenance Report the jobs provenance:
121
- --fork Run job asyncronously:
122
124
  EOF
123
125
 
124
126
  workflow = ARGV.shift
@@ -132,6 +134,8 @@ do_fork = !!options.delete(:fork)
132
134
  do_exec = !!options.delete(:exec)
133
135
  clean = !!options.delete(:clean)
134
136
  recursive_clean = !!options.delete(:recursive_clean)
137
+ out = options.include?(:output) ? File.open(options[:output], 'wb') : STDOUT
138
+
135
139
  $array_separator = options.delete(:array_separator)
136
140
 
137
141
  # Get workflow
@@ -157,13 +161,14 @@ namespace = nil, nil
157
161
  case
158
162
  when task.nil?
159
163
  usage workflow
160
- when (task =~ /\./)
161
- namespace, task = options.delete(:task).split('.')
162
- namespace = Misc.string2const(namespace)
164
+ # Can not remember what this was
165
+ #when (task =~ /\./)
166
+ # namespace, task = options.delete(:task).split('.')
167
+ # namespace = Misc.string2const(namespace)
163
168
  else
164
169
  task_name = task.to_sym
165
170
  task = workflow.tasks[task_name]
166
- raise "Task not found: #{ task_name }" if task.nil?
171
+ raise ParameterException, "Task not found: #{ task_name }" if task.nil?
167
172
  end
168
173
 
169
174
  usage workflow, task if help
@@ -206,13 +211,13 @@ begin
206
211
  res = job.exec
207
212
  case
208
213
  when Array === res
209
- puts res * "\n"
214
+ out.puts res * "\n"
210
215
  when TSV === res
211
- puts res
216
+ out.puts res
212
217
  when Hash === res
213
- puts res.to_yaml
218
+ out.puts res.to_yaml
214
219
  else
215
- puts res
220
+ out.puts res
216
221
  end
217
222
  exit 0
218
223
  end
@@ -247,10 +252,14 @@ rescue ParameterException
247
252
  usage(workflow, task, $!.message, $!.backtrace)
248
253
  end
249
254
 
250
- out = options.include?(:output) ? File.open(options[:output], 'wb') : STDOUT
255
+
256
+ if options.delete(:list_job_files)
257
+ out.puts job.files * "\n"
258
+ exit 0
259
+ end
251
260
 
252
261
  if job_file = options.delete(:job_file)
253
- out.puts res.file(job_file).read
262
+ out.puts job.file(job_file).read
254
263
  exit 0
255
264
  end
256
265
 
@@ -0,0 +1,12 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../../..', 'test_helper.rb')
2
+ require 'rbbt/util/simpleopt/parse'
3
+ require 'rbbt/util/simpleopt/get'
4
+
5
+ class TestSOPTParse < Test::Unit::TestCase
6
+ def test_consume
7
+ SOPT.parse("-f--first* first arg:-f--fun")
8
+ args = "-f myfile --fun".split(" ")
9
+ assert_equal "myfile", SOPT.consume(args)[:first]
10
+ end
11
+ end
12
+
@@ -0,0 +1,10 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../../..', 'test_helper.rb')
2
+ require 'rbbt/util/simpleopt/parse'
3
+
4
+ class TestSOPTParse < Test::Unit::TestCase
5
+ def test_parse
6
+ SOPT.parse("-f--first* first arg:-f--fun")
7
+ assert_equal "fun", SOPT.shortcuts["fu"]
8
+ end
9
+ end
10
+
@@ -0,0 +1,18 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helper.rb')
2
+ require 'rbbt/util/semaphore'
3
+
4
+ class TestRbbtSemaphore < Test::Unit::TestCase
5
+ def test_thread
6
+ times = 50
7
+ TmpFile.with_file do |dir|
8
+ Path.setup(dir)
9
+ FileUtils.mkdir_p dir
10
+ RbbtSemaphore.thread_each_on_semaphore((1..times).to_a, 25){|elem|
11
+ sleep rand
12
+ Open.write(dir[elem], "test")
13
+ }
14
+ assert_equal times, dir.glob.length
15
+ end
16
+ end
17
+ end
18
+
@@ -5,6 +5,7 @@ require 'test/unit'
5
5
  class TestSOPT < Test::Unit::TestCase
6
6
 
7
7
  def test_cmd_option_string
8
- assert_equal("--tsv-options", SOPT.parse("-h--help:-to--tsv-options")["tsv-options"][:long])
8
+ SOPT.parse("-h--help:-to--tsv-options")
9
+ assert_equal "tsv-options", SOPT.shortcuts["to"]
9
10
  end
10
11
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbbt-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.6.2
4
+ version: 5.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-17 00:00:00.000000000 Z
11
+ date: 2014-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -196,6 +196,10 @@ files:
196
196
  - lib/rbbt/util/semaphore.rb
197
197
  - lib/rbbt/util/simpleDSL.rb
198
198
  - lib/rbbt/util/simpleopt.rb
199
+ - lib/rbbt/util/simpleopt/accessor.rb
200
+ - lib/rbbt/util/simpleopt/doc.rb
201
+ - lib/rbbt/util/simpleopt/get.rb
202
+ - lib/rbbt/util/simpleopt/parse.rb
199
203
  - lib/rbbt/util/tar.rb
200
204
  - lib/rbbt/util/task/job.rb
201
205
  - lib/rbbt/util/tmpfile.rb
@@ -267,6 +271,8 @@ files:
267
271
  - test/rbbt/tsv/test_index.rb
268
272
  - test/rbbt/tsv/test_manipulate.rb
269
273
  - test/rbbt/tsv/test_util.rb
274
+ - test/rbbt/util/simpleopt/test_get.rb
275
+ - test/rbbt/util/simpleopt/test_parse.rb
270
276
  - test/rbbt/util/test_R.rb
271
277
  - test/rbbt/util/test_chain_methods.rb
272
278
  - test/rbbt/util/test_cmd.rb
@@ -275,6 +281,7 @@ files:
275
281
  - test/rbbt/util/test_filecache.rb
276
282
  - test/rbbt/util/test_misc.rb
277
283
  - test/rbbt/util/test_open.rb
284
+ - test/rbbt/util/test_semaphore.rb
278
285
  - test/rbbt/util/test_simpleDSL.rb
279
286
  - test/rbbt/util/test_simpleopt.rb
280
287
  - test/rbbt/util/test_tmpfile.rb
@@ -309,6 +316,8 @@ test_files:
309
316
  - test/rbbt/test_workflow.rb
310
317
  - test/rbbt/resource/test_path.rb
311
318
  - test/rbbt/util/test_cmd.rb
319
+ - test/rbbt/util/simpleopt/test_get.rb
320
+ - test/rbbt/util/simpleopt/test_parse.rb
312
321
  - test/rbbt/util/test_chain_methods.rb
313
322
  - test/rbbt/util/test_simpleDSL.rb
314
323
  - test/rbbt/util/test_open.rb
@@ -317,6 +326,7 @@ test_files:
317
326
  - test/rbbt/util/test_simpleopt.rb
318
327
  - test/rbbt/util/test_excel2tsv.rb
319
328
  - test/rbbt/util/test_filecache.rb
329
+ - test/rbbt/util/test_semaphore.rb
320
330
  - test/rbbt/util/test_misc.rb
321
331
  - test/rbbt/util/test_tmpfile.rb
322
332
  - test/rbbt/test_association.rb