miga-base 0.7.20.0 → 0.7.20.1
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.
- checksums.yaml +4 -4
- data/lib/miga/daemon.rb +24 -14
- data/lib/miga/daemon/base.rb +1 -1
- data/lib/miga/project/dataset.rb +2 -1
- data/lib/miga/tax_index.rb +20 -12
- data/lib/miga/version.rb +2 -2
- data/test/common_test.rb +30 -0
- data/test/daemon_test.rb +17 -1
- data/test/tax_index_test.rb +26 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76b06be04db6bb162666752f374da5a3adab38e010acf8a07f20fc2e8f97e75b
|
4
|
+
data.tar.gz: 6c4f9b9118b21b11921b4c0a70ae99f3b1728d5737175ca5b9f23088ff985063
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d90839141adeb99d0551d0228c7b5806b11a971852bf2ca8040f419af79330be47fc7abe7f1bffec35fe935b3857a1631c860d8e6aa877ba74eb1524d24f8153
|
7
|
+
data.tar.gz: baeee018956a1877065e2e9b5f689e1dc99af71cecc2705f951ab384b05b5760cffd7d85218068bb674541cb766a585add60c5b23a6209c15e2276b369d0f1b0
|
data/lib/miga/daemon.rb
CHANGED
@@ -103,7 +103,7 @@ class MiGA::Daemon < MiGA::MiGA
|
|
103
103
|
##
|
104
104
|
# Queue maintenance tasks as an analysis job
|
105
105
|
def queue_maintenance
|
106
|
-
return if bypass_maintenance?
|
106
|
+
return if bypass_maintenance? || shutdown_when_done?
|
107
107
|
|
108
108
|
say 'Queueing maintenance tasks'
|
109
109
|
queue_job(:maintenance)
|
@@ -214,29 +214,38 @@ class MiGA::Daemon < MiGA::MiGA
|
|
214
214
|
return nil unless get_job(job, ds).nil?
|
215
215
|
|
216
216
|
ds_name = (ds.nil? ? 'miga-project' : ds.name)
|
217
|
-
|
217
|
+
task_name = "#{project.metadata[:name][0..9]}:#{job}:#{ds_name}"
|
218
|
+
to_run = { ds: ds, ds_name: ds_name, job: job, task_name: task_name }
|
219
|
+
say 'Queueing %s:%s' % [to_run[:ds_name], to_run[:job]]
|
220
|
+
@jobs_to_run << to_run
|
221
|
+
end
|
222
|
+
|
223
|
+
##
|
224
|
+
# Construct the command for the given job definition with current
|
225
|
+
# daemon settings
|
226
|
+
def job_cmd(to_run)
|
218
227
|
vars = {
|
219
228
|
'PROJECT' => project.path,
|
220
229
|
'RUNTYPE' => runopts(:type),
|
221
230
|
'CORES' => ppn,
|
222
231
|
'MIGA' => MiGA::MiGA.root_path
|
223
232
|
}
|
224
|
-
vars['DATASET'] = ds.name unless ds.nil?
|
225
|
-
log_dir = File.expand_path("daemon/#{job}", project.path)
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
233
|
+
vars['DATASET'] = to_run[:ds].name unless to_run[:ds].nil?
|
234
|
+
log_dir = File.expand_path("daemon/#{to_run[:job]}", project.path)
|
235
|
+
FileUtils.mkdir_p(log_dir)
|
236
|
+
var_hsh = {
|
237
|
+
script: MiGA::MiGA.script_path(
|
238
|
+
to_run[:job], miga: vars['MIGA'], project: project
|
239
|
+
),
|
231
240
|
vars: vars.map do |k, v|
|
232
241
|
runopts(:var).miga_variables(key: k, value: v)
|
233
242
|
end.join(runopts(:varsep)),
|
234
243
|
cpus: ppn,
|
235
|
-
log: File.
|
236
|
-
task_name: task_name,
|
237
|
-
miga: File.
|
238
|
-
|
239
|
-
|
244
|
+
log: File.join(log_dir, "#{to_run[:ds_name]}.log"),
|
245
|
+
task_name: to_run[:task_name],
|
246
|
+
miga: File.join(MiGA::MiGA.root_path, 'bin/miga').shellescape
|
247
|
+
}
|
248
|
+
runopts(:cmd).miga_variables(var_hsh)
|
240
249
|
end
|
241
250
|
|
242
251
|
##
|
@@ -312,6 +321,7 @@ class MiGA::Daemon < MiGA::MiGA
|
|
312
321
|
# Launch the job described by Hash +job+ to +hostk+-th host
|
313
322
|
def launch_job(job, hostk = nil)
|
314
323
|
# Execute job
|
324
|
+
job[:cmd] = job_cmd(job)
|
315
325
|
case runopts(:type)
|
316
326
|
when 'ssh'
|
317
327
|
# Remote job
|
data/lib/miga/daemon/base.rb
CHANGED
data/lib/miga/project/dataset.rb
CHANGED
@@ -48,10 +48,11 @@ module MiGA::Project::Dataset
|
|
48
48
|
# Add dataset identified by +name+ and return MiGA::Dataset.
|
49
49
|
def add_dataset(name)
|
50
50
|
unless metadata[:datasets].include? name
|
51
|
-
MiGA::Dataset.new(self, name)
|
51
|
+
ds = MiGA::Dataset.new(self, name)
|
52
52
|
@metadata[:datasets] << name
|
53
53
|
@dataset_names_hash = nil # Ensure loading even if +do_not_save+ is true
|
54
54
|
save
|
55
|
+
# TODO redo_project_steps if ds.ref?
|
55
56
|
pull_hook(:on_add_dataset, name)
|
56
57
|
end
|
57
58
|
dataset(name)
|
data/lib/miga/tax_index.rb
CHANGED
@@ -17,7 +17,7 @@ class MiGA::TaxIndex < MiGA::MiGA
|
|
17
17
|
##
|
18
18
|
# Initialize an empty MiGA::TaxIndex
|
19
19
|
def initialize
|
20
|
-
@root = MiGA::TaxIndexTaxon.new
|
20
|
+
@root = MiGA::TaxIndexTaxon.new(:root, 'biota')
|
21
21
|
@datasets = []
|
22
22
|
end
|
23
23
|
|
@@ -37,21 +37,22 @@ class MiGA::TaxIndex < MiGA::MiGA
|
|
37
37
|
end
|
38
38
|
|
39
39
|
##
|
40
|
-
# Finds all the taxa in the collection at the +rank+ taxonomic rank
|
40
|
+
# Finds all the taxa in the collection at the +rank+ taxonomic rank
|
41
41
|
def taxa_by_rank(rank)
|
42
42
|
rank = MiGA::Taxonomy.normalize_rank(rank)
|
43
43
|
taxa = [@root]
|
44
44
|
select = []
|
45
45
|
loop do
|
46
46
|
new_taxa = []
|
47
|
-
taxa.map
|
47
|
+
taxa.map(&:children).flatten.each do |ch|
|
48
48
|
if ch.rank == rank
|
49
49
|
select << ch
|
50
|
-
elsif
|
50
|
+
elsif !ch.children.empty?
|
51
51
|
new_taxa << ch
|
52
52
|
end
|
53
53
|
end
|
54
|
-
|
54
|
+
taxa = new_taxa
|
55
|
+
break if taxa.empty?
|
55
56
|
end
|
56
57
|
select
|
57
58
|
end
|
@@ -60,7 +61,8 @@ class MiGA::TaxIndex < MiGA::MiGA
|
|
60
61
|
# Generate JSON String for the index.
|
61
62
|
def to_json
|
62
63
|
MiGA::Json.generate(
|
63
|
-
|
64
|
+
root: root.to_hash,
|
65
|
+
datasets: datasets.map(&:name)
|
64
66
|
)
|
65
67
|
end
|
66
68
|
|
@@ -119,27 +121,33 @@ class MiGA::TaxIndexTaxon < MiGA::MiGA
|
|
119
121
|
##
|
120
122
|
# Get the number of datasets in the taxon (including children).
|
121
123
|
def datasets_count
|
122
|
-
children.map
|
124
|
+
children.map(&:datasets_count).reduce(datasets.size, :+)
|
123
125
|
end
|
124
126
|
|
125
127
|
##
|
126
128
|
# Get all the datasets in the taxon (including children).
|
127
129
|
def all_datasets
|
128
|
-
children.map
|
130
|
+
children.map(&:datasets).reduce(datasets, :+)
|
129
131
|
end
|
130
132
|
|
131
133
|
##
|
132
134
|
# JSON String of the taxon.
|
133
135
|
def to_json(*a)
|
134
|
-
{
|
135
|
-
|
136
|
+
{
|
137
|
+
str: tax_str,
|
138
|
+
datasets: datasets.map(&:name),
|
139
|
+
children: children
|
140
|
+
}.to_json(a)
|
136
141
|
end
|
137
142
|
|
138
143
|
##
|
139
144
|
# Hash representation of the taxon.
|
140
145
|
def to_hash
|
141
|
-
{
|
142
|
-
|
146
|
+
{
|
147
|
+
str: tax_str,
|
148
|
+
datasets: datasets.map(&:name),
|
149
|
+
children: children.map(&:to_hash)
|
150
|
+
}
|
143
151
|
end
|
144
152
|
|
145
153
|
##
|
data/lib/miga/version.rb
CHANGED
@@ -8,7 +8,7 @@ module MiGA
|
|
8
8
|
# - Float representing the major.minor version.
|
9
9
|
# - Integer representing gem releases of the current version.
|
10
10
|
# - Integer representing minor changes that require new version number.
|
11
|
-
VERSION = [0.7, 20,
|
11
|
+
VERSION = [0.7, 20, 1]
|
12
12
|
|
13
13
|
##
|
14
14
|
# Nickname for the current major.minor version.
|
@@ -16,7 +16,7 @@ module MiGA
|
|
16
16
|
|
17
17
|
##
|
18
18
|
# Date of the current gem release.
|
19
|
-
VERSION_DATE = Date.new(2021, 1,
|
19
|
+
VERSION_DATE = Date.new(2021, 1, 10)
|
20
20
|
|
21
21
|
##
|
22
22
|
# Reference of MiGA.
|
data/test/common_test.rb
CHANGED
@@ -72,4 +72,34 @@ class CommonTest < Test::Unit::TestCase
|
|
72
72
|
assert_not_predicate('C3-PO', :miga_name?)
|
73
73
|
assert_equal("123\n1\n", '1231'.wrap_width(3))
|
74
74
|
end
|
75
|
+
|
76
|
+
def test_advance
|
77
|
+
m = MiGA::MiGA.new
|
78
|
+
|
79
|
+
# Check advance when missing total
|
80
|
+
o = capture_stderr { m.advance('x', 0) }.string
|
81
|
+
assert_match(/\] x *\r/, o)
|
82
|
+
|
83
|
+
# Initialize advance
|
84
|
+
o = capture_stderr { m.advance('x', 0, 10) }.string
|
85
|
+
assert_match(/\] x 0\.0% \(0\/10\) *\r/, o)
|
86
|
+
|
87
|
+
# Insufficient data for prediction
|
88
|
+
sleep(1)
|
89
|
+
o = capture_stderr { m.advance('x', 1, 10) }.string
|
90
|
+
assert_match(/\] x 10\.0% \(1\/10\) *\r/, o)
|
91
|
+
|
92
|
+
# Predict time
|
93
|
+
sleep(1)
|
94
|
+
o = capture_stderr { m.advance('x', 2, 10) }.string
|
95
|
+
assert_match(/\] x 20\.0% \(2\/10\) [7-9]s left *\r/, o)
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_num_suffix
|
99
|
+
m = MiGA::MiGA.new
|
100
|
+
assert_equal('12', m.num_suffix(12))
|
101
|
+
assert_equal('1.5K', m.num_suffix(1.5e3))
|
102
|
+
assert_equal('1.0M', m.num_suffix(1024**2 + 1, true))
|
103
|
+
assert_equal('1.1G', m.num_suffix(1024**3))
|
104
|
+
end
|
75
105
|
end
|
data/test/daemon_test.rb
CHANGED
@@ -48,7 +48,10 @@ class DaemonTest < Test::Unit::TestCase
|
|
48
48
|
end
|
49
49
|
assert_match(/Queueing #{ds.name}:d/, out.string)
|
50
50
|
assert_equal(1, d.jobs_to_run.size)
|
51
|
-
assert_equal(
|
51
|
+
assert_equal(
|
52
|
+
'echo project0:d:ds1 >/dev/null',
|
53
|
+
d.job_cmd(d.jobs_to_run.first)
|
54
|
+
)
|
52
55
|
assert_equal(d.jobs_to_run.first, d.get_job(:d, ds))
|
53
56
|
end
|
54
57
|
|
@@ -335,4 +338,17 @@ class DaemonTest < Test::Unit::TestCase
|
|
335
338
|
capture_stderr { d.in_loop }
|
336
339
|
assert_equal([], d.jobs_running)
|
337
340
|
end
|
341
|
+
|
342
|
+
def test_show_log
|
343
|
+
d = daemon
|
344
|
+
assert(d.show_log?)
|
345
|
+
d.runopts(:show_log, false)
|
346
|
+
assert(!d.show_log?)
|
347
|
+
d.show_log!
|
348
|
+
assert(d.show_log?)
|
349
|
+
assert_equal($stderr, d.logfh)
|
350
|
+
d.show_summary!
|
351
|
+
assert(!d.show_log?)
|
352
|
+
assert_not_equal($stderr, d.logfh)
|
353
|
+
end
|
338
354
|
end
|
data/test/tax_index_test.rb
CHANGED
@@ -35,4 +35,30 @@ class TaxIndexTest < Test::Unit::TestCase
|
|
35
35
|
ti = MiGA::TaxIndex.new
|
36
36
|
assert_equal("root:biota: 0\n", ti.to_tab)
|
37
37
|
end
|
38
|
+
|
39
|
+
def test_tax_index_taxon
|
40
|
+
taxon = MiGA::TaxIndexTaxon.new(:root, 'biota')
|
41
|
+
assert_empty(taxon.datasets)
|
42
|
+
assert_equal('root:biota', taxon.to_hash[:str])
|
43
|
+
assert_equal(
|
44
|
+
'{"str":"root:biota","datasets":[],"children":[]}',
|
45
|
+
taxon.to_json
|
46
|
+
)
|
47
|
+
assert_empty(taxon.all_datasets)
|
48
|
+
assert_equal(0, taxon.datasets_count)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_taxa_by_rank
|
52
|
+
initialize_miga_home
|
53
|
+
d = dataset
|
54
|
+
d.metadata[:tax] = MiGA::Taxonomy.new('k:Fantasia g:Unicornia')
|
55
|
+
|
56
|
+
# Empty
|
57
|
+
ti = MiGA::TaxIndex.new
|
58
|
+
assert_empty(ti.taxa_by_rank(:genus))
|
59
|
+
|
60
|
+
# Unicorn
|
61
|
+
ti << d
|
62
|
+
assert_equal('Unicornia', ti.taxa_by_rank(:genus).first.name)
|
63
|
+
end
|
38
64
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: miga-base
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.20.
|
4
|
+
version: 0.7.20.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luis M. Rodriguez-R
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: daemons
|