scout-gear 8.0.0 → 8.1.0

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