rbbt-util 5.44.1 → 6.0.4

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.
Files changed (175) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/bin/rbbt +67 -90
  4. data/bin/rbbt_exec.rb +2 -2
  5. data/etc/app.d/base.rb +2 -2
  6. data/etc/app.d/semaphores.rb +3 -3
  7. data/lib/rbbt/annotations/annotated_array.rb +207 -207
  8. data/lib/rbbt/annotations/refactor.rb +27 -0
  9. data/lib/rbbt/annotations/util.rb +282 -282
  10. data/lib/rbbt/annotations.rb +343 -320
  11. data/lib/rbbt/association/database.rb +200 -225
  12. data/lib/rbbt/association/index.rb +294 -291
  13. data/lib/rbbt/association/item.rb +227 -227
  14. data/lib/rbbt/association/open.rb +35 -34
  15. data/lib/rbbt/association/util.rb +0 -169
  16. data/lib/rbbt/association.rb +2 -4
  17. data/lib/rbbt/entity/identifiers.rb +119 -118
  18. data/lib/rbbt/entity/refactor.rb +12 -0
  19. data/lib/rbbt/entity.rb +319 -315
  20. data/lib/rbbt/hpc/batch.rb +72 -53
  21. data/lib/rbbt/hpc/lsf.rb +2 -2
  22. data/lib/rbbt/hpc/orchestrate/batches.rb +2 -2
  23. data/lib/rbbt/hpc/orchestrate/chains.rb +25 -5
  24. data/lib/rbbt/hpc/orchestrate/rules.rb +2 -2
  25. data/lib/rbbt/hpc/orchestrate.rb +19 -13
  26. data/lib/rbbt/hpc/slurm.rb +18 -18
  27. data/lib/rbbt/knowledge_base/entity.rb +13 -5
  28. data/lib/rbbt/knowledge_base/query.rb +2 -2
  29. data/lib/rbbt/knowledge_base/registry.rb +32 -31
  30. data/lib/rbbt/knowledge_base/traverse.rb +1 -1
  31. data/lib/rbbt/knowledge_base.rb +1 -1
  32. data/lib/rbbt/monitor.rb +36 -25
  33. data/lib/rbbt/persist/refactor.rb +166 -0
  34. data/lib/rbbt/persist/tsv/tokyocabinet.rb +105 -105
  35. data/lib/rbbt/persist/tsv.rb +187 -185
  36. data/lib/rbbt/persist.rb +556 -551
  37. data/lib/rbbt/refactor.rb +20 -0
  38. data/lib/rbbt/resource/path/refactor.rb +178 -0
  39. data/lib/rbbt/resource/path.rb +317 -497
  40. data/lib/rbbt/resource/util.rb +0 -48
  41. data/lib/rbbt/resource.rb +3 -390
  42. data/lib/rbbt/tsv/accessor.rb +2 -838
  43. data/lib/rbbt/tsv/attach.rb +303 -299
  44. data/lib/rbbt/tsv/change_id.rb +244 -245
  45. data/lib/rbbt/tsv/csv.rb +87 -85
  46. data/lib/rbbt/tsv/dumper.rb +2 -100
  47. data/lib/rbbt/tsv/excel.rb +26 -24
  48. data/lib/rbbt/tsv/field_index.rb +4 -1
  49. data/lib/rbbt/tsv/filter.rb +3 -2
  50. data/lib/rbbt/tsv/index.rb +2 -284
  51. data/lib/rbbt/tsv/manipulate.rb +750 -747
  52. data/lib/rbbt/tsv/marshal.rb +3 -3
  53. data/lib/rbbt/tsv/matrix.rb +2 -2
  54. data/lib/rbbt/tsv/parallel/through.rb +2 -1
  55. data/lib/rbbt/tsv/parallel/traverse.rb +783 -781
  56. data/lib/rbbt/tsv/parser.rb +678 -678
  57. data/lib/rbbt/tsv/refactor.rb +195 -0
  58. data/lib/rbbt/tsv/stream.rb +253 -251
  59. data/lib/rbbt/tsv/util.rb +420 -420
  60. data/lib/rbbt/tsv.rb +210 -208
  61. data/lib/rbbt/util/R/eval.rb +4 -4
  62. data/lib/rbbt/util/R/plot.rb +62 -166
  63. data/lib/rbbt/util/R.rb +21 -18
  64. data/lib/rbbt/util/cmd.rb +2 -318
  65. data/lib/rbbt/util/color.rb +269 -269
  66. data/lib/rbbt/util/colorize.rb +89 -89
  67. data/lib/rbbt/util/concurrency/processes/refactor.rb +22 -0
  68. data/lib/rbbt/util/concurrency/processes/worker.rb +2 -2
  69. data/lib/rbbt/util/concurrency/processes.rb +389 -386
  70. data/lib/rbbt/util/config.rb +169 -167
  71. data/lib/rbbt/util/filecache.rb +1 -1
  72. data/lib/rbbt/util/iruby.rb +20 -0
  73. data/lib/rbbt/util/log/progress/report.rb +241 -241
  74. data/lib/rbbt/util/log/progress/util.rb +99 -99
  75. data/lib/rbbt/util/log/progress.rb +102 -102
  76. data/lib/rbbt/util/log/refactor.rb +49 -0
  77. data/lib/rbbt/util/log.rb +486 -532
  78. data/lib/rbbt/util/migrate.rb +2 -2
  79. data/lib/rbbt/util/misc/concurrent_stream.rb +248 -246
  80. data/lib/rbbt/util/misc/development.rb +12 -11
  81. data/lib/rbbt/util/misc/exceptions.rb +117 -112
  82. data/lib/rbbt/util/misc/format.rb +2 -230
  83. data/lib/rbbt/util/misc/indiferent_hash.rb +2 -107
  84. data/lib/rbbt/util/misc/inspect.rb +2 -476
  85. data/lib/rbbt/util/misc/lock.rb +109 -106
  86. data/lib/rbbt/util/misc/omics.rb +9 -1
  87. data/lib/rbbt/util/misc/pipes.rb +765 -793
  88. data/lib/rbbt/util/misc/refactor.rb +20 -0
  89. data/lib/rbbt/util/misc/ssw.rb +27 -17
  90. data/lib/rbbt/util/misc/system.rb +92 -105
  91. data/lib/rbbt/util/misc.rb +39 -20
  92. data/lib/rbbt/util/named_array/refactor.rb +4 -0
  93. data/lib/rbbt/util/named_array.rb +3 -220
  94. data/lib/rbbt/util/open/refactor.rb +7 -0
  95. data/lib/rbbt/util/open.rb +3 -857
  96. data/lib/rbbt/util/procpath.rb +6 -6
  97. data/lib/rbbt/util/python/paths.rb +27 -0
  98. data/lib/rbbt/util/python/run.rb +115 -0
  99. data/lib/rbbt/util/python/script.rb +110 -0
  100. data/lib/rbbt/util/python/util.rb +3 -3
  101. data/lib/rbbt/util/python.rb +22 -81
  102. data/lib/rbbt/util/semaphore.rb +152 -148
  103. data/lib/rbbt/util/simpleopt.rb +9 -8
  104. data/lib/rbbt/util/ssh/refactor.rb +19 -0
  105. data/lib/rbbt/util/ssh.rb +122 -118
  106. data/lib/rbbt/util/tar.rb +117 -115
  107. data/lib/rbbt/util/tmpfile.rb +69 -67
  108. data/lib/rbbt/util/version.rb +2 -0
  109. data/lib/rbbt/workflow/refactor/entity.rb +11 -0
  110. data/lib/rbbt/workflow/refactor/export.rb +66 -0
  111. data/lib/rbbt/workflow/refactor/inputs.rb +24 -0
  112. data/lib/rbbt/workflow/refactor/recursive.rb +64 -0
  113. data/lib/rbbt/workflow/refactor/task_info.rb +66 -0
  114. data/lib/rbbt/workflow/refactor.rb +150 -0
  115. data/lib/rbbt/workflow/remote_workflow/driver/rest.rb +1 -2
  116. data/lib/rbbt/workflow/remote_workflow/driver/ssh.rb +55 -32
  117. data/lib/rbbt/workflow/remote_workflow/remote_step/rest.rb +3 -1
  118. data/lib/rbbt/workflow/remote_workflow/remote_step/ssh.rb +14 -5
  119. data/lib/rbbt/workflow/remote_workflow/remote_step.rb +19 -7
  120. data/lib/rbbt/workflow/remote_workflow.rb +6 -1
  121. data/lib/rbbt/workflow/step/run.rb +766 -766
  122. data/lib/rbbt/workflow/step/save_load_inputs.rb +254 -254
  123. data/lib/rbbt/workflow/step.rb +2 -362
  124. data/lib/rbbt/workflow/task.rb +118 -118
  125. data/lib/rbbt/workflow/usage.rb +289 -287
  126. data/lib/rbbt/workflow/util/archive.rb +6 -5
  127. data/lib/rbbt/workflow/util/data.rb +1 -1
  128. data/lib/rbbt/workflow/util/orchestrator.rb +249 -246
  129. data/lib/rbbt/workflow/util/trace.rb +79 -44
  130. data/lib/rbbt/workflow.rb +4 -882
  131. data/lib/rbbt-util.rb +21 -13
  132. data/lib/rbbt.rb +16 -3
  133. data/python/rbbt/__init__.py +96 -4
  134. data/python/rbbt/workflow/remote.py +104 -0
  135. data/python/rbbt/workflow.py +64 -0
  136. data/python/test.py +10 -0
  137. data/share/Rlib/plot.R +37 -37
  138. data/share/Rlib/svg.R +22 -5
  139. data/share/install/software/lib/install_helpers +1 -1
  140. data/share/rbbt_commands/hpc/list +2 -3
  141. data/share/rbbt_commands/hpc/orchestrate +4 -4
  142. data/share/rbbt_commands/hpc/tail +2 -0
  143. data/share/rbbt_commands/hpc/task +10 -7
  144. data/share/rbbt_commands/lsf/list +2 -3
  145. data/share/rbbt_commands/lsf/orchestrate +4 -4
  146. data/share/rbbt_commands/lsf/tail +2 -0
  147. data/share/rbbt_commands/lsf/task +10 -7
  148. data/share/rbbt_commands/migrate +1 -1
  149. data/share/rbbt_commands/pbs/list +2 -3
  150. data/share/rbbt_commands/pbs/orchestrate +4 -4
  151. data/share/rbbt_commands/pbs/tail +2 -0
  152. data/share/rbbt_commands/pbs/task +10 -7
  153. data/share/rbbt_commands/resource/produce +8 -1
  154. data/share/rbbt_commands/slurm/list +2 -3
  155. data/share/rbbt_commands/slurm/orchestrate +4 -4
  156. data/share/rbbt_commands/slurm/tail +2 -0
  157. data/share/rbbt_commands/slurm/task +10 -7
  158. data/share/rbbt_commands/system/clean +5 -5
  159. data/share/rbbt_commands/system/status +5 -5
  160. data/share/rbbt_commands/tsv/get +2 -3
  161. data/share/rbbt_commands/tsv/info +10 -13
  162. data/share/rbbt_commands/tsv/keys +18 -14
  163. data/share/rbbt_commands/tsv/slice +2 -2
  164. data/share/rbbt_commands/tsv/transpose +6 -2
  165. data/share/rbbt_commands/workflow/info +20 -24
  166. data/share/rbbt_commands/workflow/list +1 -1
  167. data/share/rbbt_commands/workflow/prov +20 -13
  168. data/share/rbbt_commands/workflow/retry +43 -0
  169. data/share/rbbt_commands/workflow/server +12 -2
  170. data/share/rbbt_commands/workflow/task +80 -73
  171. data/share/rbbt_commands/workflow/write_info +26 -9
  172. data/share/software/opt/ssw/ssw.c +861 -0
  173. data/share/software/opt/ssw/ssw.h +130 -0
  174. data/share/workflow_config.ru +3 -3
  175. metadata +45 -6
@@ -1,287 +1,289 @@
1
- require 'rbbt/util/simpleopt'
2
-
3
- module Task
4
- def doc(workflow = nil, deps = nil)
5
- puts Log.color(:yellow, "## #{ name }") << ":"
6
- puts "\n" << Misc.format_paragraph(description.strip) << "\n" if description and not description.empty?
7
- puts
8
-
9
- selects = []
10
- if inputs.any?
11
- inputs.zip(input_types.values_at(*inputs)).select{|i,t| t.to_sym == :select && input_options[i] && input_options[i][:select_options] }.each{|i,t| selects << [i, input_options[i][:select_options]] }
12
- puts SOPT.input_doc(inputs, input_types, input_descriptions, input_defaults, true)
13
- puts
14
- end
15
-
16
- if deps and deps.any?
17
- puts Log.color(:magenta, "Inputs from dependencies:")
18
- puts
19
- seen = []
20
- task_inputs = dep_inputs deps, workflow
21
- task_inputs.each do |task,new_inputs|
22
- new_inputs.zip(task.input_types.values_at(*new_inputs)).select do |i,t|
23
- t.to_sym == :select && task.input_options.include?(i) && task.input_options[i][:select_options]
24
- end.each do |i,t|
25
- selects << [i, task.input_options[i][:select_options]]
26
- end
27
-
28
- next if new_inputs.empty?
29
-
30
- if task.workflow and task.workflow != workflow
31
- puts " #{Log.color :yellow, ["[#{task.workflow.to_s}]", task.name.to_s] *" "}:"
32
- else
33
- puts " #{Log.color :yellow, task.name.to_s}:"
34
- end
35
- puts unless Log.compact
36
- puts SOPT.input_doc(new_inputs, task.input_types, task.input_descriptions, task.input_defaults, true)
37
- puts unless Log.compact
38
- end
39
- puts
40
- end
41
-
42
- case
43
- when (input_types.values & [:array]).any?
44
- puts Log.color(:green, Misc.format_paragraph("Lists are specified as arguments using ',' or '|'. When specified as files the '\\n'
45
- also works in addition to the others. You may use the '--array_separator' option
46
- the change this default. Whenever a file is specified it may also accept STDIN using
47
- the '-' character."))
48
- puts
49
-
50
- when (input_types.values & [:text, :tsv]).any?
51
- puts Log.color(:green, Misc.format_paragraph("Whenever a file is specified it may also accept STDIN using the '-' character."))
52
- puts
53
- end
54
-
55
- puts Log.color(:magenta, "Returns: ") << Log.color(:blue, result_type.to_s) << "\n"
56
- puts
57
-
58
- if selects.any?
59
- puts Log.color(:magenta, "Input select options")
60
- puts
61
- selects.collect{|p| p}.uniq.each do |input,options|
62
- puts Log.color(:blue, input.to_s + ": ") << Misc.format_paragraph(options.collect{|o| Array === o ? o.first.to_s : o.to_s} * ", ") << "\n"
63
- puts unless Log.compact
64
- end
65
- puts
66
- end
67
- end
68
- end
69
-
70
- module Workflow
71
-
72
- def dep_tree(name, seen = [])
73
- @dep_tree ||= {}
74
- @dep_tree[name] ||= begin
75
- dep_tree = {}
76
- self.task_dependencies[name.to_sym].reverse.each do |dep|
77
- next if seen.include? dep
78
- seen << dep
79
- dep = dep.first if Array === dep && dep.length == 1
80
- dep = dep.dependency if DependencyBlock === dep
81
-
82
- workflow, task = case dep
83
- when Array
84
- dep.values_at 0, 1
85
- when Symbol, String
86
- [self, dep]
87
- else
88
- next
89
- end
90
-
91
-
92
- key = [workflow, task]
93
-
94
- dep_tree[key] = workflow.dep_tree(task, seen)
95
- end if name && self.task_dependencies[name.to_sym]
96
- dep_tree
97
- end
98
- end
99
-
100
- def _prov_tasks(tree)
101
- tasks = []
102
- heap = [tree]
103
- while heap.any?
104
- t = heap.pop
105
- t.each do |k,v|
106
- tasks << k
107
- heap << v
108
- end
109
- end
110
- tasks
111
- end
112
-
113
- def prov_string(tree)
114
- description = ""
115
-
116
- last = nil
117
- seen = Set.new
118
-
119
- tasks = _prov_tasks(tree)
120
- tasks.each do |workflow,task_name|
121
-
122
- next if seen.include?([workflow,task_name])
123
-
124
- child = last && last.include?([workflow, task_name])
125
- first = last.nil?
126
- last = _prov_tasks(workflow.dep_tree(task_name))
127
-
128
- break if child
129
-
130
- if child
131
- description << "->" << task_name.to_s
132
- elsif first
133
- description << "" << task_name.to_s
134
- else
135
- description << ";" << task_name.to_s
136
- end
137
-
138
- seen << [workflow, task_name]
139
- end
140
- description
141
- end
142
-
143
- def prov_tree(tree, offset = 0, seen = [])
144
-
145
- return "" if tree.empty?
146
-
147
- lines = []
148
-
149
- offset_str = " " * offset
150
-
151
- lines << offset_str
152
-
153
- tree.each do |p,dtree|
154
- next if seen.include?(p)
155
- seen.push(p)
156
- workflow, task = p
157
- lines << offset_str + [workflow.to_s, task.to_s] * "#" + "\n" + workflow.prov_tree(dtree, offset + 1, seen)
158
- end
159
-
160
- lines * "\n"
161
- end
162
-
163
- def doc(task = nil, abridge = false)
164
-
165
- if task.nil?
166
- puts Log.color :magenta, self.to_s
167
- puts Log.color :magenta, "=" * self.to_s.length
168
-
169
- if self.documentation[:title] and not self.documentation[:title].empty?
170
- puts
171
- puts Misc.format_paragraph self.documentation[:title]
172
- end
173
-
174
- if self.documentation[:description] and not self.documentation[:description].empty?
175
- puts
176
- puts Misc.format_paragraph self.documentation[:description]
177
- end
178
- puts
179
-
180
- puts Log.color :magenta, "## TASKS"
181
- if self.documentation[:task_description] and not self.documentation[:task_description].empty?
182
- puts
183
- puts Misc.format_paragraph self.documentation[:task_description]
184
- end
185
- puts
186
-
187
- final = Set.new
188
- not_final = Set.new
189
- tasks.each do |name,task|
190
- tree = dep_tree(name)
191
- not_final += tree.keys
192
- final << name unless not_final.include?(name)
193
- end
194
-
195
- not_final.each do |p|
196
- final -= [p.last]
197
- end
198
-
199
- tasks.each do |name,task|
200
- description = task.description || ""
201
- description = description.split("\n\n").first
202
-
203
- next if abridge && ! final.include?(name)
204
- puts Misc.format_definition_list_item(name.to_s, description, Log.tty_size || 80, 30, :yellow)
205
-
206
- prov_string = prov_string(dep_tree(name))
207
- puts Misc.format_paragraph Log.color(:blue, "->" + prov_string) if prov_string && ! prov_string.empty?
208
- end
209
-
210
- else
211
-
212
- if Task === task
213
- task_name = task.name
214
- else
215
- task_name = task
216
- task = self.tasks[task_name]
217
- end
218
-
219
- #dependencies = self.rec_dependencies(task_name).collect{|dep_name| Array === dep_name ? dep_name.first.tasks[dep_name[1].to_sym] : self.tasks[dep_name.to_sym]}
220
- task.doc(self, self.rec_dependencies(task_name))
221
-
222
- dep_tree = {[self, task_name] => dep_tree(task_name)}
223
- prov_tree = prov_tree(dep_tree)
224
- if prov_tree && ! prov_tree.empty? && prov_tree.split("\n").length > 2
225
-
226
- puts Log.color :magenta, "## DEPENDENCY GRAPH (abridged)"
227
- puts
228
- prov_tree.split("\n").each do |line|
229
- next if line.strip.empty?
230
- if m = line.match(/^( *)(\w+?)#(\w*)/i)
231
- offset, workflow, task_name = m.values_at 1, 2, 3
232
- puts [offset, Log.color(:magenta, workflow), "#", Log.color(:yellow, task_name)] * ""
233
- else
234
- puts Log.color :blue, line
235
- end
236
- end
237
- puts
238
- end
239
-
240
- if self.examples.include? task_name
241
- self.examples[task_name].each do |example|
242
-
243
- puts Log.color(:magenta, "Example ") << Log.color(:green, example) + " -- " + Log.color(:blue, example_dir[task_name][example])
244
-
245
- inputs = self.example(task_name, example)
246
-
247
- inputs.each do |input, type, file|
248
- case type
249
- when :tsv, :array, :text, :file
250
- lines = file.read.split("\n")
251
- head = lines[0..5].compact * "\n\n"
252
- head = head[0..500]
253
- puts Misc.format_definition_list_item(input, head, 1000, -1, :blue).gsub(/\n\s*\n/,"\n")
254
- puts '...' if lines.length > 6
255
- else
256
- puts Misc.format_definition_list_item(input, file.read, Log.tty_size, 20, :blue)
257
- end
258
- end
259
- puts
260
- end
261
- end
262
- end
263
- end
264
-
265
- def SOPT_str(task)
266
- sopt_options = []
267
- self.rec_inputs(task.name).each do |name|
268
- short = name.to_s.chars.first
269
- boolean = self.rec_input_types(task.name)[name].to_sym == :boolean
270
-
271
- sopt_options << "-#{short}--#{name}#{boolean ? "" : "*"}"
272
- end
273
-
274
- sopt_options * ":"
275
- end
276
-
277
- def get_SOPT(task)
278
- sopt_option_string = self.SOPT_str(task)
279
- SOPT.get sopt_option_string
280
- end
281
-
282
- def self.get_SOPT(workflow, task)
283
- workflow = Workflow.require_workflow workflow if String === workflow
284
- task = workflow.tasks[task.to_sym] if String === task || Symbol === task
285
- workflow.get_SOPT(task)
286
- end
287
- end
1
+ require_relative '../refactor'
2
+ Rbbt.require_instead 'scout/workflow/usage'
3
+ #require 'rbbt/util/simpleopt'
4
+ #
5
+ #module Task
6
+ # def doc(workflow = nil, deps = nil)
7
+ # puts Log.color(:yellow, "## #{ name }") << ":"
8
+ # puts "\n" << Misc.format_paragraph(description.strip) << "\n" if description and not description.empty?
9
+ # puts
10
+ #
11
+ # selects = []
12
+ # if inputs.any?
13
+ # inputs.zip(input_types.values_at(*inputs)).select{|i,t| t.to_sym == :select && input_options[i] && input_options[i][:select_options] }.each{|i,t| selects << [i, input_options[i][:select_options]] }
14
+ # puts SOPT.input_doc(inputs, input_types, input_descriptions, input_defaults, true)
15
+ # puts
16
+ # end
17
+ #
18
+ # if deps and deps.any?
19
+ # puts Log.color(:magenta, "Inputs from dependencies:")
20
+ # puts
21
+ # seen = []
22
+ # task_inputs = dep_inputs deps, workflow
23
+ # task_inputs.each do |task,new_inputs|
24
+ # new_inputs.zip(task.input_types.values_at(*new_inputs)).select do |i,t|
25
+ # t.to_sym == :select && task.input_options.include?(i) && task.input_options[i][:select_options]
26
+ # end.each do |i,t|
27
+ # selects << [i, task.input_options[i][:select_options]]
28
+ # end
29
+ #
30
+ # next if new_inputs.empty?
31
+ #
32
+ # if task.workflow and task.workflow != workflow
33
+ # puts " #{Log.color :yellow, ["[#{task.workflow.to_s}]", task.name.to_s] *" "}:"
34
+ # else
35
+ # puts " #{Log.color :yellow, task.name.to_s}:"
36
+ # end
37
+ # puts unless Log.compact
38
+ # puts SOPT.input_doc(new_inputs, task.input_types, task.input_descriptions, task.input_defaults, true)
39
+ # puts unless Log.compact
40
+ # end
41
+ # puts
42
+ # end
43
+ #
44
+ # case
45
+ # when (input_types.values & [:array]).any?
46
+ # puts Log.color(:green, Misc.format_paragraph("Lists are specified as arguments using ',' or '|'. When specified as files the '\\n'
47
+ # also works in addition to the others. You may use the '--array_separator' option
48
+ # the change this default. Whenever a file is specified it may also accept STDIN using
49
+ # the '-' character."))
50
+ # puts
51
+ #
52
+ # when (input_types.values & [:text, :tsv]).any?
53
+ # puts Log.color(:green, Misc.format_paragraph("Whenever a file is specified it may also accept STDIN using the '-' character."))
54
+ # puts
55
+ # end
56
+ #
57
+ # puts Log.color(:magenta, "Returns: ") << Log.color(:blue, result_type.to_s) << "\n"
58
+ # puts
59
+ #
60
+ # if selects.any?
61
+ # puts Log.color(:magenta, "Input select options")
62
+ # puts
63
+ # selects.collect{|p| p}.uniq.each do |input,options|
64
+ # puts Log.color(:blue, input.to_s + ": ") << Misc.format_paragraph(options.collect{|o| Array === o ? o.first.to_s : o.to_s} * ", ") << "\n"
65
+ # puts unless Log.compact
66
+ # end
67
+ # puts
68
+ # end
69
+ # end
70
+ #end
71
+ #
72
+ #module Workflow
73
+ #
74
+ # def dep_tree(name, seen = [])
75
+ # @dep_tree ||= {}
76
+ # @dep_tree[name] ||= begin
77
+ # dep_tree = {}
78
+ # self.task_dependencies[name.to_sym].reverse.each do |dep|
79
+ # next if seen.include? dep
80
+ # seen << dep
81
+ # dep = dep.first if Array === dep && dep.length == 1
82
+ # dep = dep.dependency if DependencyBlock === dep
83
+ #
84
+ # workflow, task = case dep
85
+ # when Array
86
+ # dep.values_at 0, 1
87
+ # when Symbol, String
88
+ # [self, dep]
89
+ # else
90
+ # next
91
+ # end
92
+ #
93
+ #
94
+ # key = [workflow, task]
95
+ #
96
+ # dep_tree[key] = workflow.dep_tree(task, seen)
97
+ # end if name && self.task_dependencies[name.to_sym]
98
+ # dep_tree
99
+ # end
100
+ # end
101
+ #
102
+ # def _prov_tasks(tree)
103
+ # tasks = []
104
+ # heap = [tree]
105
+ # while heap.any?
106
+ # t = heap.pop
107
+ # t.each do |k,v|
108
+ # tasks << k
109
+ # heap << v
110
+ # end
111
+ # end
112
+ # tasks
113
+ # end
114
+ #
115
+ # def prov_string(tree)
116
+ # description = ""
117
+ #
118
+ # last = nil
119
+ # seen = Set.new
120
+ #
121
+ # tasks = _prov_tasks(tree)
122
+ # tasks.each do |workflow,task_name|
123
+ #
124
+ # next if seen.include?([workflow,task_name])
125
+ #
126
+ # child = last && last.include?([workflow, task_name])
127
+ # first = last.nil?
128
+ # last = _prov_tasks(workflow.dep_tree(task_name))
129
+ #
130
+ # break if child
131
+ #
132
+ # if child
133
+ # description << "->" << task_name.to_s
134
+ # elsif first
135
+ # description << "" << task_name.to_s
136
+ # else
137
+ # description << ";" << task_name.to_s
138
+ # end
139
+ #
140
+ # seen << [workflow, task_name]
141
+ # end
142
+ # description
143
+ # end
144
+ #
145
+ # def prov_tree(tree, offset = 0, seen = [])
146
+ #
147
+ # return "" if tree.empty?
148
+ #
149
+ # lines = []
150
+ #
151
+ # offset_str = " " * offset
152
+ #
153
+ # lines << offset_str
154
+ #
155
+ # tree.each do |p,dtree|
156
+ # next if seen.include?(p)
157
+ # seen.push(p)
158
+ # workflow, task = p
159
+ # lines << offset_str + [workflow.to_s, task.to_s] * "#" + "\n" + workflow.prov_tree(dtree, offset + 1, seen)
160
+ # end
161
+ #
162
+ # lines * "\n"
163
+ # end
164
+ #
165
+ # def doc(task = nil, abridge = false)
166
+ #
167
+ # if task.nil?
168
+ # puts Log.color :magenta, self.to_s
169
+ # puts Log.color :magenta, "=" * self.to_s.length
170
+ #
171
+ # if self.documentation[:title] and not self.documentation[:title].empty?
172
+ # puts
173
+ # puts Misc.format_paragraph self.documentation[:title]
174
+ # end
175
+ #
176
+ # if self.documentation[:description] and not self.documentation[:description].empty?
177
+ # puts
178
+ # puts Misc.format_paragraph self.documentation[:description]
179
+ # end
180
+ # puts
181
+ #
182
+ # puts Log.color :magenta, "## TASKS"
183
+ # if self.documentation[:task_description] and not self.documentation[:task_description].empty?
184
+ # puts
185
+ # puts Misc.format_paragraph self.documentation[:task_description]
186
+ # end
187
+ # puts
188
+ #
189
+ # final = Set.new
190
+ # not_final = Set.new
191
+ # tasks.each do |name,task|
192
+ # tree = dep_tree(name)
193
+ # not_final += tree.keys
194
+ # final << name unless not_final.include?(name)
195
+ # end
196
+ #
197
+ # not_final.each do |p|
198
+ # final -= [p.last]
199
+ # end
200
+ #
201
+ # tasks.each do |name,task|
202
+ # description = task.description || ""
203
+ # description = description.split("\n\n").first
204
+ #
205
+ # next if abridge && ! final.include?(name)
206
+ # puts Misc.format_definition_list_item(name.to_s, description, Log.tty_size || 80, 30, :yellow)
207
+ #
208
+ # prov_string = prov_string(dep_tree(name))
209
+ # puts Misc.format_paragraph Log.color(:blue, "->" + prov_string) if prov_string && ! prov_string.empty?
210
+ # end
211
+ #
212
+ # else
213
+ #
214
+ # if Task === task
215
+ # task_name = task.name
216
+ # else
217
+ # task_name = task
218
+ # task = self.tasks[task_name]
219
+ # end
220
+ #
221
+ # #dependencies = self.rec_dependencies(task_name).collect{|dep_name| Array === dep_name ? dep_name.first.tasks[dep_name[1].to_sym] : self.tasks[dep_name.to_sym]}
222
+ # task.doc(self, self.rec_dependencies(task_name))
223
+ #
224
+ # dep_tree = {[self, task_name] => dep_tree(task_name)}
225
+ # prov_tree = prov_tree(dep_tree)
226
+ # if prov_tree && ! prov_tree.empty? && prov_tree.split("\n").length > 2
227
+ #
228
+ # puts Log.color :magenta, "## DEPENDENCY GRAPH (abridged)"
229
+ # puts
230
+ # prov_tree.split("\n").each do |line|
231
+ # next if line.strip.empty?
232
+ # if m = line.match(/^( *)(\w+?)#(\w*)/i)
233
+ # offset, workflow, task_name = m.values_at 1, 2, 3
234
+ # puts [offset, Log.color(:magenta, workflow), "#", Log.color(:yellow, task_name)] * ""
235
+ # else
236
+ # puts Log.color :blue, line
237
+ # end
238
+ # end
239
+ # puts
240
+ # end
241
+ #
242
+ # if self.examples.include? task_name
243
+ # self.examples[task_name].each do |example|
244
+ #
245
+ # puts Log.color(:magenta, "Example ") << Log.color(:green, example) + " -- " + Log.color(:blue, example_dir[task_name][example])
246
+ #
247
+ # inputs = self.example(task_name, example)
248
+ #
249
+ # inputs.each do |input, type, file|
250
+ # case type
251
+ # when :tsv, :array, :text, :file
252
+ # lines = file.read.split("\n")
253
+ # head = lines[0..5].compact * "\n\n"
254
+ # head = head[0..500]
255
+ # puts Misc.format_definition_list_item(input, head, 1000, -1, :blue).gsub(/\n\s*\n/,"\n")
256
+ # puts '...' if lines.length > 6
257
+ # else
258
+ # puts Misc.format_definition_list_item(input, file.read, Log.tty_size, 20, :blue)
259
+ # end
260
+ # end
261
+ # puts
262
+ # end
263
+ # end
264
+ # end
265
+ # end
266
+ #
267
+ # def SOPT_str(task)
268
+ # sopt_options = []
269
+ # self.rec_inputs(task.name).each do |name|
270
+ # short = name.to_s.chars.first
271
+ # boolean = self.rec_input_types(task.name)[name].to_sym == :boolean
272
+ #
273
+ # sopt_options << "-#{short}--#{name}#{boolean ? "" : "*"}"
274
+ # end
275
+ #
276
+ # sopt_options * ":"
277
+ # end
278
+ #
279
+ # def get_SOPT(task)
280
+ # sopt_option_string = self.SOPT_str(task)
281
+ # SOPT.get sopt_option_string
282
+ # end
283
+ #
284
+ # def self.get_SOPT(workflow, task)
285
+ # workflow = Workflow.require_workflow workflow if String === workflow
286
+ # task = workflow.tasks[task.to_sym] if String === task || Symbol === task
287
+ # workflow.get_SOPT(task)
288
+ # end
289
+ #end
@@ -28,7 +28,7 @@ class Step
28
28
  seen = Set.new
29
29
  while deps.any?
30
30
  path = deps.shift
31
- dep = Workflow.load_step path
31
+ dep = Step.load path
32
32
  seen << dep.path
33
33
  dep.dependencies.each do |dep|
34
34
  next if seen.include? dep.path
@@ -83,10 +83,10 @@ class Step
83
83
  while deps.any?
84
84
  path = deps.shift
85
85
 
86
- dep = Workflow.load_step path
86
+ dep = Step.load path
87
87
  seen << dep.path
88
88
 
89
- dep.load_dependencies_from_info
89
+ #dep.load_dependencies_from_info
90
90
 
91
91
  dep.dependencies.each do |dep|
92
92
  next if seen.include? dep.path
@@ -96,7 +96,7 @@ class Step
96
96
  end
97
97
 
98
98
  rec_dependencies.each do |path|
99
- dep = Workflow.load_step path
99
+ dep = Workflow.load_step path.dup
100
100
  job_files << dep.path
101
101
  job_files << dep.files_dir if Dir.glob(dep.files_dir + '/*').any?
102
102
  job_files << dep.info_file if File.exist?(dep.info_file)
@@ -120,7 +120,8 @@ class Step
120
120
  if File.directory?(target)
121
121
  CMD.cmd_log("rsync #{MAIN_RSYNC_ARGS} --copy-unsafe-links '#{ tmpdir }/' '#{ target }/'")
122
122
  else
123
- CMD.cmd_log("tar cvhzf '#{target}' ./*")
123
+ Misc.tarize('.', target)
124
+ #CMD.cmd_log("tar cvhzf '#{target}' ./*")
124
125
  end
125
126
  end
126
127
  Log.debug "Archive finished at: #{target}"
@@ -3,7 +3,7 @@ require 'rbbt/workflow/examples'
3
3
 
4
4
  module Workflow
5
5
  module Data
6
- class DataNotFound < RbbtException; end
6
+ class DataNotFound < ScoutException; end
7
7
 
8
8
  def data_dir(directory)
9
9
  @@data_directory = directory