scout-gear 8.0.0 → 8.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.vimproject +26 -9
  3. data/Rakefile +6 -1
  4. data/VERSION +1 -1
  5. data/bin/scout +15 -4
  6. data/doc/lib/scout/path.md +35 -0
  7. data/doc/lib/scout/workflow/task.md +13 -0
  8. data/lib/scout/cmd.rb +23 -24
  9. data/lib/scout/concurrent_stream.rb +36 -19
  10. data/lib/scout/exceptions.rb +10 -0
  11. data/lib/scout/log/color.rb +11 -11
  12. data/lib/scout/log/progress/report.rb +7 -5
  13. data/lib/scout/log/progress/util.rb +3 -0
  14. data/lib/scout/log/trap.rb +3 -3
  15. data/lib/scout/log.rb +64 -36
  16. data/lib/scout/meta_extension.rb +34 -0
  17. data/lib/scout/misc/digest.rb +11 -2
  18. data/lib/scout/misc/format.rb +12 -7
  19. data/lib/scout/misc/monitor.rb +11 -0
  20. data/lib/scout/misc/system.rb +48 -0
  21. data/lib/scout/named_array.rb +8 -0
  22. data/lib/scout/offsite/ssh.rb +171 -0
  23. data/lib/scout/offsite/step.rb +83 -0
  24. data/lib/scout/offsite/sync.rb +55 -0
  25. data/lib/scout/offsite.rb +3 -0
  26. data/lib/scout/open/lock.rb +5 -24
  27. data/lib/scout/open/remote.rb +12 -1
  28. data/lib/scout/open/stream.rb +110 -122
  29. data/lib/scout/open/util.rb +9 -0
  30. data/lib/scout/open.rb +5 -4
  31. data/lib/scout/path/find.rb +15 -10
  32. data/lib/scout/path/util.rb +5 -0
  33. data/lib/scout/persist/serialize.rb +3 -3
  34. data/lib/scout/persist.rb +1 -1
  35. data/lib/scout/resource/path.rb +4 -0
  36. data/lib/scout/resource/util.rb +10 -4
  37. data/lib/scout/tsv/dumper.rb +2 -0
  38. data/lib/scout/tsv/index.rb +28 -86
  39. data/lib/scout/tsv/open.rb +35 -14
  40. data/lib/scout/tsv/parser.rb +9 -2
  41. data/lib/scout/tsv/persist/tokyocabinet.rb +2 -0
  42. data/lib/scout/tsv/stream.rb +204 -0
  43. data/lib/scout/tsv/transformer.rb +11 -0
  44. data/lib/scout/tsv.rb +9 -2
  45. data/lib/scout/work_queue/worker.rb +2 -2
  46. data/lib/scout/work_queue.rb +36 -12
  47. data/lib/scout/workflow/definition.rb +2 -1
  48. data/lib/scout/workflow/deployment/orchestrator.rb +245 -0
  49. data/lib/scout/workflow/deployment.rb +1 -0
  50. data/lib/scout/workflow/step/dependencies.rb +37 -11
  51. data/lib/scout/workflow/step/file.rb +5 -0
  52. data/lib/scout/workflow/step/info.rb +5 -3
  53. data/lib/scout/workflow/step/load.rb +1 -1
  54. data/lib/scout/workflow/step/provenance.rb +1 -0
  55. data/lib/scout/workflow/step/status.rb +6 -8
  56. data/lib/scout/workflow/step.rb +75 -30
  57. data/lib/scout/workflow/task/dependencies.rb +114 -0
  58. data/lib/scout/workflow/task/inputs.rb +27 -13
  59. data/lib/scout/workflow/task.rb +9 -108
  60. data/lib/scout/workflow/usage.rb +40 -12
  61. data/lib/scout/workflow.rb +4 -2
  62. data/lib/scout-gear.rb +2 -0
  63. data/lib/scout.rb +6 -0
  64. data/scout-gear.gemspec +32 -7
  65. data/scout_commands/doc +37 -0
  66. data/scout_commands/find +1 -0
  67. data/scout_commands/offsite +30 -0
  68. data/scout_commands/update +29 -0
  69. data/scout_commands/workflow/info +15 -3
  70. data/scout_commands/workflow/install +102 -0
  71. data/scout_commands/workflow/task +26 -5
  72. data/test/scout/offsite/test_ssh.rb +15 -0
  73. data/test/scout/offsite/test_step.rb +33 -0
  74. data/test/scout/offsite/test_sync.rb +36 -0
  75. data/test/scout/offsite/test_task.rb +0 -0
  76. data/test/scout/resource/test_path.rb +6 -0
  77. data/test/scout/test_named_array.rb +6 -0
  78. data/test/scout/test_persist.rb +3 -2
  79. data/test/scout/test_tsv.rb +17 -0
  80. data/test/scout/test_work_queue.rb +63 -41
  81. data/test/scout/tsv/persist/test_adapter.rb +1 -1
  82. data/test/scout/tsv/test_index.rb +14 -0
  83. data/test/scout/tsv/test_parser.rb +14 -0
  84. data/test/scout/tsv/test_stream.rb +200 -0
  85. data/test/scout/tsv/test_transformer.rb +12 -0
  86. data/test/scout/workflow/deployment/test_orchestrator.rb +272 -0
  87. data/test/scout/workflow/step/test_dependencies.rb +68 -0
  88. data/test/scout/workflow/step/test_info.rb +18 -0
  89. data/test/scout/workflow/step/test_status.rb +0 -1
  90. data/test/scout/workflow/task/test_dependencies.rb +355 -0
  91. data/test/scout/workflow/task/test_inputs.rb +53 -0
  92. data/test/scout/workflow/test_definition.rb +18 -0
  93. data/test/scout/workflow/test_documentation.rb +24 -0
  94. data/test/scout/workflow/test_step.rb +109 -0
  95. data/test/scout/workflow/test_task.rb +0 -287
  96. data/test/test_scout.rb +9 -0
  97. metadata +83 -5
  98. data/scout_commands/workflow/task_old +0 -706
data/scout-gear.gemspec CHANGED
@@ -2,17 +2,17 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: scout-gear 8.0.0 ruby lib
5
+ # stub: scout-gear 8.1.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "scout-gear".freeze
9
- s.version = "8.0.0"
9
+ s.version = "8.1.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Miguel Vazquez".freeze]
14
- s.date = "2023-05-23"
15
- s.description = "Temporary files, logs, etc.".freeze
14
+ s.date = "2023-06-15"
15
+ s.description = "Temporary files, logs, path, resources, persistence, workflows, TSV, etc.".freeze
16
16
  s.email = "mikisvaz@gmail.com".freeze
17
17
  s.executables = ["scout".freeze]
18
18
  s.extra_rdoc_files = [
@@ -28,6 +28,8 @@ Gem::Specification.new do |s|
28
28
  "Rakefile",
29
29
  "VERSION",
30
30
  "bin/scout",
31
+ "doc/lib/scout/path.md",
32
+ "doc/lib/scout/workflow/task.md",
31
33
  "lib/rbbt-scout.rb",
32
34
  "lib/scout-gear.rb",
33
35
  "lib/scout.rb",
@@ -56,6 +58,10 @@ Gem::Specification.new do |s|
56
58
  "lib/scout/misc/monitor.rb",
57
59
  "lib/scout/misc/system.rb",
58
60
  "lib/scout/named_array.rb",
61
+ "lib/scout/offsite.rb",
62
+ "lib/scout/offsite/ssh.rb",
63
+ "lib/scout/offsite/step.rb",
64
+ "lib/scout/offsite/sync.rb",
59
65
  "lib/scout/open.rb",
60
66
  "lib/scout/open/lock.rb",
61
67
  "lib/scout/open/lock/lockfile.rb",
@@ -98,6 +104,7 @@ Gem::Specification.new do |s|
98
104
  "lib/scout/tsv/persist/fix_width_table.rb",
99
105
  "lib/scout/tsv/persist/serialize.rb",
100
106
  "lib/scout/tsv/persist/tokyocabinet.rb",
107
+ "lib/scout/tsv/stream.rb",
101
108
  "lib/scout/tsv/transformer.rb",
102
109
  "lib/scout/tsv/traverse.rb",
103
110
  "lib/scout/tsv/util.rb",
@@ -111,6 +118,8 @@ Gem::Specification.new do |s|
111
118
  "lib/scout/work_queue/worker.rb",
112
119
  "lib/scout/workflow.rb",
113
120
  "lib/scout/workflow/definition.rb",
121
+ "lib/scout/workflow/deployment.rb",
122
+ "lib/scout/workflow/deployment/orchestrator.rb",
114
123
  "lib/scout/workflow/documentation.rb",
115
124
  "lib/scout/workflow/step.rb",
116
125
  "lib/scout/workflow/step/config.rb",
@@ -122,19 +131,23 @@ Gem::Specification.new do |s|
122
131
  "lib/scout/workflow/step/provenance.rb",
123
132
  "lib/scout/workflow/step/status.rb",
124
133
  "lib/scout/workflow/task.rb",
134
+ "lib/scout/workflow/task/dependencies.rb",
125
135
  "lib/scout/workflow/task/inputs.rb",
126
136
  "lib/scout/workflow/usage.rb",
127
137
  "lib/scout/workflow/util.rb",
128
138
  "lib/workflow-scout.rb",
129
139
  "scout-gear.gemspec",
130
140
  "scout_commands/alias",
141
+ "scout_commands/doc",
131
142
  "scout_commands/find",
132
143
  "scout_commands/glob",
144
+ "scout_commands/offsite",
133
145
  "scout_commands/rbbt",
146
+ "scout_commands/update",
134
147
  "scout_commands/workflow/info",
148
+ "scout_commands/workflow/install",
135
149
  "scout_commands/workflow/list",
136
150
  "scout_commands/workflow/task",
137
- "scout_commands/workflow/task_old",
138
151
  "share/color/color_names",
139
152
  "share/color/diverging_colors.hex",
140
153
  "share/software/install_helpers",
@@ -146,6 +159,10 @@ Gem::Specification.new do |s|
146
159
  "test/scout/misc/test_filesystem.rb",
147
160
  "test/scout/misc/test_insist.rb",
148
161
  "test/scout/misc/test_system.rb",
162
+ "test/scout/offsite/test_ssh.rb",
163
+ "test/scout/offsite/test_step.rb",
164
+ "test/scout/offsite/test_sync.rb",
165
+ "test/scout/offsite/test_task.rb",
149
166
  "test/scout/open/test_lock.rb",
150
167
  "test/scout/open/test_remote.rb",
151
168
  "test/scout/open/test_stream.rb",
@@ -190,6 +207,7 @@ Gem::Specification.new do |s|
190
207
  "test/scout/tsv/test_open.rb",
191
208
  "test/scout/tsv/test_parser.rb",
192
209
  "test/scout/tsv/test_persist.rb",
210
+ "test/scout/tsv/test_stream.rb",
193
211
  "test/scout/tsv/test_transformer.rb",
194
212
  "test/scout/tsv/test_traverse.rb",
195
213
  "test/scout/tsv/test_util.rb",
@@ -200,11 +218,13 @@ Gem::Specification.new do |s|
200
218
  "test/scout/tsv/util/test_unzip.rb",
201
219
  "test/scout/work_queue/test_socket.rb",
202
220
  "test/scout/work_queue/test_worker.rb",
221
+ "test/scout/workflow/deployment/test_orchestrator.rb",
203
222
  "test/scout/workflow/step/test_dependencies.rb",
204
223
  "test/scout/workflow/step/test_info.rb",
205
224
  "test/scout/workflow/step/test_load.rb",
206
225
  "test/scout/workflow/step/test_provenance.rb",
207
226
  "test/scout/workflow/step/test_status.rb",
227
+ "test/scout/workflow/task/test_dependencies.rb",
208
228
  "test/scout/workflow/task/test_inputs.rb",
209
229
  "test/scout/workflow/test_definition.rb",
210
230
  "test/scout/workflow/test_documentation.rb",
@@ -213,16 +233,21 @@ Gem::Specification.new do |s|
213
233
  "test/scout/workflow/test_usage.rb",
214
234
  "test/scout/workflow/test_util.rb",
215
235
  "test/test_helper.rb",
216
- "test/test_scout-gear.rb"
236
+ "test/test_scout-gear.rb",
237
+ "test/test_scout.rb"
217
238
  ]
218
239
  s.homepage = "http://github.com/mikisvaz/scout-gear".freeze
219
240
  s.licenses = ["MIT".freeze]
220
- s.rubygems_version = "3.4.11".freeze
241
+ s.rubygems_version = "3.4.13".freeze
221
242
  s.summary = "basic gear for scouts".freeze
222
243
 
223
244
  s.specification_version = 4
224
245
 
225
246
  s.add_runtime_dependency(%q<term-ansicolor>.freeze, [">= 0"])
247
+ s.add_runtime_dependency(%q<net-ssh>.freeze, [">= 0"])
248
+ s.add_runtime_dependency(%q<matrix>.freeze, [">= 0"])
249
+ s.add_runtime_dependency(%q<sys-proctable>.freeze, [">= 0"])
250
+ s.add_runtime_dependency(%q<RubyInline>.freeze, [">= 0"])
226
251
  s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
227
252
  s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
228
253
  s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'scout'
4
+
5
+ $0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
6
+
7
+ options = SOPT.setup <<EOF
8
+
9
+ Print documentation for a module
10
+
11
+ $ #{$0} [<options>] [module]
12
+
13
+ If you don't specify the module it prints those available
14
+
15
+ -h--help Print this help
16
+ EOF
17
+ if options[:help]
18
+ if defined? scout_usage
19
+ scout_usage
20
+ else
21
+ puts SOPT.doc
22
+ end
23
+ exit 0
24
+ end
25
+
26
+
27
+ module_name = ARGV.first
28
+ if module_name.nil?
29
+ puts Rbbt.doc.lib.scout.glob("**/*.md").collect{|f| File.basename(f.unset_extension) } * "\n"
30
+ else
31
+ begin
32
+ puts Rbbt.doc.lib.scout[module_name].find_with_extension('md', :lib).read
33
+ rescue
34
+ puts Rbbt.doc.lib.scout.glob("**/*.md").select{|f| File.basename(f.unset_extension) == module_name }.first.read
35
+ end
36
+ end
37
+
data/scout_commands/find CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'scout-gear'
4
+ require 'scout/offsite'
4
5
 
5
6
  $0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
6
7
 
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'scout'
4
+ require 'scout/offsite'
5
+
6
+ $0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
7
+
8
+ options = SOPT.setup <<EOF
9
+
10
+ Description of the tool
11
+
12
+ $ #{$0} [<options>] <where> <command> ... -- [<protected options>]
13
+
14
+ Run a command offsite. Use -- to make sure options reach the offsite
15
+
16
+ -h--help Print this help
17
+ EOF
18
+ if options[:help]
19
+ if defined? scout_usage
20
+ scout_usage
21
+ else
22
+ puts SOPT.doc
23
+ end
24
+ exit 0
25
+ end
26
+
27
+ where = ARGV.shift
28
+ command = ARGV.shift
29
+
30
+ puts SSHLine.command(where, command, ARGV)
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'scout'
4
+
5
+ $0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
6
+
7
+ options = SOPT.setup <<EOF
8
+
9
+ Update scout installation
10
+
11
+ $ #{$0} [<options>] [gem]
12
+
13
+ If no gem is specified 'scout-gear' is selected.
14
+
15
+ -h--help Print this help
16
+ EOF
17
+ if options[:help]
18
+ if defined? scout_usage
19
+ scout_usage
20
+ else
21
+ puts SOPT.doc
22
+ end
23
+ exit 0
24
+ end
25
+
26
+ gem_name = ARGV.first
27
+ Misc.update_git(gem_name)
28
+
29
+
@@ -23,7 +23,19 @@ end
23
23
 
24
24
  path = ARGV.first
25
25
  raise MissingParameterException.new :step_path if path.nil?
26
- step = Step.load(path)
27
-
28
- puts step.info.to_json
26
+ step = Step.load(path.dup)
27
+
28
+ step.info.each do |k,v|
29
+ case v
30
+ when nil
31
+ next
32
+ when Exception
33
+ puts Log.color(:title, "Exception")
34
+ Log.exception v
35
+ else
36
+ puts [Log.color(:title, k), Log.fingerprint(v)] * " = "
37
+ end
38
+ rescue
39
+ next
40
+ end
29
41
 
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'scout'
4
+
5
+ $0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
6
+
7
+ options = SOPT.setup <<EOF
8
+
9
+ Description of the tool
10
+
11
+ $ #{$0} [<options>] <filename> [<other|->]*
12
+
13
+ Install a workflow, or a coma separated list of workflows, from its source. If
14
+ repo is not specified then 'http://github.com/Rbbt-Workflows/' will be used. If
15
+ the workflow is already installed it will be updated. If 'all' is specified
16
+ instead of a particular workflow, all installed workflows will be updated.
17
+
18
+ You can set the environment variable SCOUT_WORKFLOW_AUTOINSTALL=true to make
19
+ workflows install automatically as required.
20
+
21
+ -h--help Print this help
22
+ EOF
23
+ if options[:help]
24
+ if defined? scout_usage
25
+ scout_usage
26
+ else
27
+ puts SOPT.doc
28
+ end
29
+ exit 0
30
+ end
31
+
32
+
33
+ workflow = ARGV[0]
34
+ base_repo = ARGV[1]
35
+
36
+ raise "No workflow specified" if workflow.nil?
37
+
38
+ workflow_dir = Scout.etc.workflow_dir.exists? ? Path.setup(Scout.etc.workflow_dir.read.strip) : Scout.workflows.find(:user)
39
+
40
+ FileUtils.mkdir_p workflow_dir unless File.exist? workflow_dir
41
+
42
+ all_workflows = workflow_dir.find.glob("*/.git").collect{|d| File.basename(File.dirname(d))}
43
+ workflows = workflow == 'all' ? all_workflows : workflow.split(",")
44
+
45
+ Misc.in_dir(workflow_dir) do
46
+ workflows.each do |workflow|
47
+ case
48
+ when File.exist?(Misc.snake_case(workflow))
49
+ Log.info "Updating: " + workflow
50
+ Misc.in_dir(Misc.snake_case(workflow)) do
51
+ `git pull`
52
+ `git submodule init`
53
+ `git submodule update`
54
+ end
55
+ when File.exist?(workflow)
56
+ Misc.in_dir(workflow) do
57
+ Log.info "Updating: " + workflow
58
+ `git pull`
59
+ `git submodule init`
60
+ `git submodule update`
61
+ end
62
+ else
63
+ Log.info "Installing: " + workflow
64
+
65
+ if base_repo.nil?
66
+ repo_base_url = Rbbt.etc.workflow_repo.exists? ? Rbbt.etc.workflow_repo.read.strip : 'https://github.com/Rbbt-Workflows/'
67
+ else
68
+ repo_base_url = base_repo
69
+ end
70
+
71
+
72
+ if repo_base_url.include?(workflow) or repo_base_url.include?(Misc.snake_case(workflow))
73
+ repo = repo_base_url
74
+ else
75
+ begin
76
+ repo = File.join(repo_base_url, workflow + '.git')
77
+ CMD.cmd("wget '#{repo}' -O /dev/null").read
78
+ rescue
79
+ Log.debug "Workflow repo does not exist, trying snake_case: #{ repo }"
80
+ begin
81
+ repo = File.join(repo_base_url, Misc.snake_case(workflow) + '.git')
82
+ CMD.cmd("wget '#{repo}' -O /dev/null").read
83
+ rescue
84
+ raise "Workflow repo does not exist: #{ repo }"
85
+ end
86
+ end
87
+ end
88
+
89
+ Log.warn "Cloning #{ repo }"
90
+ Misc.insist do
91
+ `git clone "#{repo}" #{ Misc.snake_case(workflow) }`
92
+ raise unless $?.success?
93
+ end
94
+ Log.warn "Initializing and updating submodules for #{repo}. You might be prompted for passwords."
95
+ Misc.in_dir(Misc.snake_case(workflow)) do
96
+ `git submodule init`
97
+ `git submodule update`
98
+ end
99
+ end
100
+ end
101
+ end
102
+
@@ -5,7 +5,9 @@ require 'scout'
5
5
  $0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
6
6
 
7
7
  ENV["SCOUT_NO_STREAM"] = "true" if ARGV.include? "--nostream"
8
+ ARGV.delete '--nostream'
8
9
  ENV["SCOUT_UPDATE"] = "true" if ARGV.include? "--update"
10
+ ARGV.delete '--update'
9
11
 
10
12
  options = SOPT.setup <<EOF
11
13
 
@@ -17,11 +19,13 @@ $ #{$0} [<options>] <workflow> <task>
17
19
  --nostream Disable job streaming
18
20
  --update Update jobs with newer dependencies
19
21
  -jn--job_name* Name to use as job identifier
22
+ -li--load_inputs* Directory with inputs files to load
20
23
  -pf--print_filepath Print the file path
21
24
  -prov--provenance Print the step provenance
22
25
  -cl--clean Clean the last step
23
26
  -rcl--recursive_clean Clean all steps
24
27
  -ct--clean_task* Clean a particular task
28
+ -d--deploy* Deploy mode: serial, local, or SLURM (default 'serial')
25
29
  EOF
26
30
 
27
31
  workflow_name, task_name = ARGV
@@ -34,8 +38,9 @@ task = workflow.tasks[task_name.to_sym] if task_name
34
38
 
35
39
  options[:help] = true if task.nil?
36
40
 
37
- help, provenance, clean, recursive_clean, clean_task, jobname, print_filepath = IndiferentHash.process_options options,
38
- :help, :provenance, :clean, :recursive_clean, :clean_task, :job_name, :print_filepath
41
+ help, provenance, clean, recursive_clean, clean_task, load_inputs, jobname, print_filepath, deploy = IndiferentHash.process_options options,
42
+ :help, :provenance, :clean, :recursive_clean, :clean_task, :load_inputs, :job_name, :print_filepath, :deploy,
43
+ :deploy => 'serial'
39
44
 
40
45
  if help
41
46
  if defined? scout_usage
@@ -48,8 +53,13 @@ if help
48
53
  exit 0
49
54
  end
50
55
 
51
- job_options = task.get_SOPT(task)
52
- job = workflow.job(task_name, jobname, job_options)
56
+ if load_inputs
57
+ job_inputs = workflow.tasks[task_name].load_inputs(load_inputs)
58
+ else
59
+ job_inputs = task.get_SOPT
60
+ end
61
+
62
+ job = workflow.job(task_name, jobname, job_inputs)
53
63
 
54
64
  job.recursive_clean if recursive_clean
55
65
  job.clean if clean
@@ -75,7 +85,18 @@ end
75
85
  if provenance
76
86
  puts Step.prov_report(job)
77
87
  else
78
- job.run(true) unless job.done?
88
+ case deploy
89
+ when "serial"
90
+ job.run(true)
91
+ when "local"
92
+ orchestrator = Workflow::Orchestrator.new 3, "cpus" => Misc.processors
93
+ orchestrator.process({}, job)
94
+ when "slurm"
95
+ SLURM.orchestrate(job)
96
+ else
97
+ OffsiteStep.setup(job, server: deploy, provided_inputs: job_inputs)
98
+ job.run
99
+ end unless job.done?
79
100
 
80
101
  if print_filepath
81
102
  job.join
@@ -0,0 +1,15 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ class TestSSH < Test::Unit::TestCase
5
+ def test_marshal
6
+ return unless SSHLine.reach?
7
+
8
+ assert TrueClass === SSHLine.rbbt(:default, 'true')
9
+ end
10
+
11
+ def test_localhost
12
+ assert SSHLine.scout('localhost', 'true')
13
+ end
14
+ end
15
+
@@ -0,0 +1,33 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ class TestOffsiteStep < Test::Unit::TestCase
5
+ def test_offsite_task
6
+ workflow_code =<<-EOF
7
+ module TestWF
8
+ extend Workflow
9
+
10
+ input :string, :string, "String", "string"
11
+ task :string => :string do |string| string end
12
+ end
13
+
14
+ TestWF.directory = Path.setup("#{tmpdir.offsite.TestWF}")
15
+ EOF
16
+
17
+ TmpFile.with_file workflow_code, :extension => 'rb' do |wffile|
18
+ wf = Workflow.require_workflow wffile
19
+
20
+ job = wf.job(:string)
21
+
22
+ sss 0
23
+ off = OffsiteStep.setup job, server: 'localhost', workflow_name: wffile
24
+
25
+ refute off.done?
26
+ assert_equal 'string', off.run
27
+
28
+ assert off.done?
29
+ assert_equal 'string', off.run
30
+ end
31
+ end
32
+ end
33
+
@@ -0,0 +1,36 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ class TestSync < Test::Unit::TestCase
5
+ def test_sync
6
+ TmpFile.with_path do |tmpdir|
7
+ tmpdir = Scout.tmp.tmpdir_sync
8
+ tmpdir.dir1.foo.write("FOO")
9
+ tmpdir.dir1.bar.write("BAR")
10
+
11
+ TmpFile.with_path do |tmpdir2|
12
+ Misc.in_dir tmpdir2 do
13
+ SSHLine.sync([tmpdir.dir1], map: :current)
14
+
15
+ assert tmpdir2.glob("**/*").select{|f| f.include?('foo') }.any?
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ def test_sync_dir_map
22
+ TmpFile.with_path do |tmpdir|
23
+ tmpdir = Scout.tmp.tmpdir_sync
24
+ tmpdir.dir1.foo.write("FOO")
25
+ tmpdir.dir1.bar.write("BAR")
26
+
27
+ TmpFile.with_path do |tmpdir2|
28
+ SSHLine.sync([tmpdir.dir1], map: tmpdir2)
29
+ Misc.in_dir tmpdir2 do
30
+ assert tmpdir2.glob("**/*").select{|f| f.include?('foo') }.any?
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+
File without changes
@@ -36,5 +36,11 @@ class TestResourcePath < Test::Unit::TestCase
36
36
  assert_include tmpfile.foo.bar.read, "TEST"
37
37
  end
38
38
  end
39
+
40
+ def test_identify
41
+ p = Scout.data.file.find(:lib)
42
+ assert p.located?
43
+ assert_equal "data/file", p.identify
44
+ end
39
45
  end
40
46
 
@@ -33,5 +33,11 @@ ValueB (Entity type)
33
33
  NamedArray.add_zipped a, [%w(d), %w(1)]
34
34
  assert_equal [%w(a b c d), %w(1 1 1 1)], a
35
35
  end
36
+
37
+ def test_method_missing
38
+ a = NamedArray.setup([1,2], [:a, :b])
39
+ assert_equal 1, a.a
40
+ assert_equal 2, a.b
41
+ end
36
42
  end
37
43
 
@@ -114,6 +114,7 @@ class TestPersist < Test::Unit::TestCase
114
114
  end
115
115
  end
116
116
  end
117
+
117
118
  if IO === io
118
119
  Open.consume_stream(io, false)
119
120
  else
@@ -137,8 +138,8 @@ class TestPersist < Test::Unit::TestCase
137
138
  Open.write(output2, io)
138
139
  end
139
140
  end
140
- Process.wait
141
- Process.wait
141
+ Process.wait pid1
142
+ Process.wait pid2
142
143
 
143
144
  assert File.exist?(output1) || File.exist?(output2)
144
145
  [pid1, pid2].zip([output2, output1]).each do |pid, found|
@@ -290,4 +290,21 @@ row2 b bbb bbbb bb
290
290
  tsv = TSV.str_setup("ID~ValueA,ValueB#:type=:flat", {})
291
291
  assert_equal "ID", tsv.key_field
292
292
  end
293
+
294
+ def test_cast_in_header
295
+ content =<<-EOF
296
+ #: :sep=/\\s+/#:type=:single
297
+ #Id Value
298
+ a 1
299
+ b 2
300
+ c 3
301
+ EOF
302
+
303
+ TmpFile.with_file(content) do |filename|
304
+ tsv = TSV.open(filename, :key_field => "Value", :grep => "#\\|2")
305
+ refute tsv.to_s.include?(":cast=:to_f")
306
+ tsv.cast = :to_f
307
+ assert_include tsv.to_s, ":cast=:to_f"
308
+ end
309
+ end
293
310
  end