miga-base 0.7.20.0 → 0.7.22.2
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/cli/action/add_result.rb +1 -1
- data/lib/miga/cli/action/next_step.rb +3 -11
- data/lib/miga/common/with_result.rb +39 -1
- data/lib/miga/daemon.rb +24 -14
- data/lib/miga/daemon/base.rb +1 -1
- data/lib/miga/dataset.rb +2 -0
- data/lib/miga/dataset/result.rb +2 -13
- data/lib/miga/project.rb +17 -2
- data/lib/miga/project/base.rb +1 -4
- data/lib/miga/project/dataset.rb +3 -1
- data/lib/miga/project/result.rb +5 -11
- data/lib/miga/remote_dataset.rb +2 -0
- data/lib/miga/result.rb +17 -1
- data/lib/miga/tax_index.rb +20 -12
- data/lib/miga/version.rb +2 -2
- data/scripts/aai_distances.bash +1 -1
- data/scripts/ani_distances.bash +1 -1
- data/scripts/haai_distances.bash +1 -1
- data/test/common_test.rb +30 -0
- data/test/daemon_test.rb +17 -1
- data/test/hook_test.rb +2 -2
- data/test/tax_index_test.rb +26 -0
- data/utils/cleanup-databases.rb +1 -1
- data/utils/subclade/runner.rb +1 -1
- 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: 6c0bdcbce7b3490a9b011ab551789b11a48169404f92ef6e61aa8e1f3a05d998
|
4
|
+
data.tar.gz: ab789c8da45a841561fc6b1d91717907cd54fc52934607997e895d27e5bdf636
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c8177696eb041e7628810371b1fb347c831aaf2be5f74b0861b789520f656c8c275505b01c017802afb31439c2e7e20d940274e4493f77bf09b23e11703fadc
|
7
|
+
data.tar.gz: ae768cd8ff0037e109d9ab6e9a6bce448e9cdf56bc763b6e5a6571204ae33d7ffd26194fa47ae2380d028bf3fb37533f7a620c3f6cd57ac970c6bd7e432d4dcb
|
@@ -20,6 +20,6 @@ class MiGA::Cli::Action::AddResult < MiGA::Cli::Action
|
|
20
20
|
obj = cli.load_project_or_dataset
|
21
21
|
cli.say "Registering result: #{cli[:result]}"
|
22
22
|
r = obj.add_result(cli[:result], true, force: cli[:force])
|
23
|
-
raise
|
23
|
+
raise 'Cannot add result, incomplete expected files' if r.nil?
|
24
24
|
end
|
25
25
|
end
|
@@ -11,16 +11,8 @@ class MiGA::Cli::Action::NextStep < MiGA::Cli::Action
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def perform
|
14
|
-
|
15
|
-
n =
|
16
|
-
|
17
|
-
n = p.next_distances(false)
|
18
|
-
n ||= p.next_inclade(false)
|
19
|
-
else
|
20
|
-
d = cli.load_dataset
|
21
|
-
n = d.next_preprocessing if d.is_active?
|
22
|
-
end
|
23
|
-
n ||= '?'
|
24
|
-
cli.puts n
|
14
|
+
obj = cli.load_project_or_dataset
|
15
|
+
n = obj.next_task
|
16
|
+
cli.puts(n || '?')
|
25
17
|
end
|
26
18
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
##
|
2
2
|
# Helper module including specific functions to handle objects that
|
3
|
-
# have results.
|
3
|
+
# have results. The class including this module must implement methods
|
4
|
+
# +.RESULT_DIRS+, +#ignore_task?+, +#metadata+, +#project+,
|
5
|
+
# and +#inactivate!+.
|
4
6
|
module MiGA::Common::WithResult
|
5
7
|
##
|
6
8
|
# Result directories as a Hash
|
@@ -68,4 +70,40 @@ module MiGA::Common::WithResult
|
|
68
70
|
def get_result(task)
|
69
71
|
add_result(task, false)
|
70
72
|
end
|
73
|
+
|
74
|
+
##
|
75
|
+
# Get the next task from +tasks+, saving intermediate results if +save+.
|
76
|
+
# If +tasks+ is +nil+ (default), it uses the entire list of tasks.
|
77
|
+
# Returns a Symbol.
|
78
|
+
def next_task(tasks = nil, save = false)
|
79
|
+
tasks ||= result_dirs.keys
|
80
|
+
tasks.find do |t|
|
81
|
+
if ignore_task?(t)
|
82
|
+
# Do not run if this step is to be ignored
|
83
|
+
false
|
84
|
+
else
|
85
|
+
res = add_result(t, save)
|
86
|
+
if res.nil?
|
87
|
+
# Run if the step has not been calculated,
|
88
|
+
# unless too many attempts were already made
|
89
|
+
if (metadata["_try_#{t}"] || 0) > (project.metadata[:max_try] || 10)
|
90
|
+
inactivate! "Too many errors in step #{t}"
|
91
|
+
false
|
92
|
+
else
|
93
|
+
true
|
94
|
+
end
|
95
|
+
else
|
96
|
+
# Run if the step is ready but has to be recalculated
|
97
|
+
res.recalculate? ? true : false
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
##
|
104
|
+
# Mark all results for recalculation
|
105
|
+
def recalculate_tasks(reason = nil)
|
106
|
+
each_result { |res| res.recalculate!(reason).save }
|
107
|
+
end
|
108
|
+
|
71
109
|
end
|
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/dataset.rb
CHANGED
@@ -107,6 +107,7 @@ class MiGA::Dataset < MiGA::MiGA
|
|
107
107
|
metadata[:warn] = "Inactive: #{reason}" unless reason.nil?
|
108
108
|
metadata[:inactive] = true
|
109
109
|
metadata.save
|
110
|
+
project.recalculate_tasks('Reference dataset inactivated') if ref?
|
110
111
|
pull_hook :on_inactivate
|
111
112
|
end
|
112
113
|
|
@@ -116,6 +117,7 @@ class MiGA::Dataset < MiGA::MiGA
|
|
116
117
|
metadata[:inactive] = nil
|
117
118
|
metadata[:warn] = nil if metadata[:warn] && metadata[:warn] =~ /^Inactive: /
|
118
119
|
metadata.save
|
120
|
+
project.recalculate_tasks('Reference dataset activated') if ref?
|
119
121
|
pull_hook :on_activate
|
120
122
|
end
|
121
123
|
|
data/lib/miga/dataset/result.rb
CHANGED
@@ -77,19 +77,8 @@ module MiGA::Dataset::Result
|
|
77
77
|
# Returns the key symbol of the next task that needs to be executed or nil.
|
78
78
|
# Passes +save+ to #add_result.
|
79
79
|
def next_preprocessing(save = false)
|
80
|
-
|
81
|
-
|
82
|
-
if ignore_task? t
|
83
|
-
false
|
84
|
-
elsif add_result(t, save).nil?
|
85
|
-
if (metadata["_try_#{t}"] || 0) > (project.metadata[:max_try] || 10)
|
86
|
-
inactivate! "Too many errors in step #{t}"
|
87
|
-
false
|
88
|
-
else
|
89
|
-
true
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
80
|
+
first_preprocessing(save) if save
|
81
|
+
next_task(nil, save)
|
93
82
|
end
|
94
83
|
|
95
84
|
##
|
data/lib/miga/project.rb
CHANGED
@@ -97,13 +97,28 @@ class MiGA::Project < MiGA::MiGA
|
|
97
97
|
|
98
98
|
##
|
99
99
|
# Is this a clade project?
|
100
|
-
def
|
100
|
+
def clade?
|
101
101
|
type == :clade
|
102
102
|
end
|
103
103
|
|
104
|
+
##
|
105
|
+
# Same as active? For backward compatibility
|
106
|
+
alias is_clade? clade?
|
107
|
+
|
104
108
|
##
|
105
109
|
# Is this a project for multi-organism datasets?
|
106
|
-
def
|
110
|
+
def multi?
|
107
111
|
@@KNOWN_TYPES[type][:multi]
|
108
112
|
end
|
113
|
+
|
114
|
+
##
|
115
|
+
# Same as multi? For backward compatibility
|
116
|
+
alias is_multi? multi?
|
117
|
+
|
118
|
+
##
|
119
|
+
# Is this project active? Currently a dummy function, returns
|
120
|
+
# always true.
|
121
|
+
def active?
|
122
|
+
true
|
123
|
+
end
|
109
124
|
end
|
data/lib/miga/project/base.rb
CHANGED
@@ -50,14 +50,11 @@ module MiGA::Project::Base
|
|
50
50
|
07.annotation/01.function/01.essential
|
51
51
|
07.annotation/01.function/02.ssu
|
52
52
|
07.annotation/02.taxonomy/01.mytaxa
|
53
|
-
07.annotation/03.qa 07.annotation/03.qa/
|
54
|
-
07.annotation/03.qa/02.mytaxa_scan
|
53
|
+
07.annotation/03.qa 07.annotation/03.qa/02.mytaxa_scan
|
55
54
|
08.mapping 08.mapping/01.read-ctg 08.mapping/02.read-gene
|
56
55
|
09.distances 09.distances/01.haai 09.distances/02.aai
|
57
56
|
09.distances/03.ani 09.distances/04.ssu 09.distances/05.taxonomy
|
58
57
|
10.clades 10.clades/01.find 10.clades/02.ani 10.clades/03.ogs
|
59
|
-
10.clades/04.phylogeny 10.clades/04.phylogeny/01.essential
|
60
|
-
10.clades/04.phylogeny/02.core 10.clades/05.metadata
|
61
58
|
90.stats
|
62
59
|
]
|
63
60
|
|
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
|
+
d = 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
|
+
recalculate_tasks('New reference dataset added') if d.ref? && d.active?
|
55
56
|
pull_hook(:on_add_dataset, name)
|
56
57
|
end
|
57
58
|
dataset(name)
|
@@ -65,6 +66,7 @@ module MiGA::Project::Dataset
|
|
65
66
|
|
66
67
|
self.metadata[:datasets].delete(name)
|
67
68
|
save
|
69
|
+
recalculate_tasks('Reference dataset unlinked') if d.ref? && d.active?
|
68
70
|
pull_hook(:on_unlink_dataset, name)
|
69
71
|
d
|
70
72
|
end
|
data/lib/miga/project/result.rb
CHANGED
@@ -23,6 +23,11 @@ module MiGA::Project::Result
|
|
23
23
|
self
|
24
24
|
end
|
25
25
|
|
26
|
+
##
|
27
|
+
# Do nothing, only to comply with MiGA::Common::WithResult
|
28
|
+
def inactivate!(reason = nil)
|
29
|
+
end
|
30
|
+
|
26
31
|
##
|
27
32
|
# Is this +task+ to be bypassed?
|
28
33
|
def ignore_task?(task)
|
@@ -45,17 +50,6 @@ module MiGA::Project::Result
|
|
45
50
|
next_task(@@INCLADE_TASKS, save)
|
46
51
|
end
|
47
52
|
|
48
|
-
##
|
49
|
-
# Get the next task from +tasks+, saving intermediate results if +save+.
|
50
|
-
# If +tasks+ is +nil+ (default), it uses the entire list of tasks.
|
51
|
-
# Returns a Symbol.
|
52
|
-
def next_task(tasks = nil, save = true)
|
53
|
-
tasks ||= @@DISTANCE_TASKS + @@INCLADE_TASKS
|
54
|
-
tasks.find do |t|
|
55
|
-
ignore_task?(t) ? false : add_result(t, save).nil?
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
53
|
private
|
60
54
|
|
61
55
|
##
|
data/lib/miga/remote_dataset.rb
CHANGED
@@ -162,6 +162,8 @@ class MiGA::RemoteDataset < MiGA::MiGA
|
|
162
162
|
txt.empty? ? sleep(1) : break
|
163
163
|
end
|
164
164
|
doc = MiGA::Json.parse(txt, symbolize: false, contents: true)
|
165
|
+
return if doc.nil? || doc['result'].nil? || doc['result'].empty?
|
166
|
+
|
165
167
|
@_ncbi_asm_json_doc = doc['result'][ doc['result']['uids'].first ]
|
166
168
|
end
|
167
169
|
|
data/lib/miga/result.rb
CHANGED
@@ -59,9 +59,25 @@ class MiGA::Result < MiGA::MiGA
|
|
59
59
|
end
|
60
60
|
|
61
61
|
##
|
62
|
-
# Register the result as cleaned
|
62
|
+
# Register the result as cleaned, returns self
|
63
63
|
def clean!
|
64
64
|
self[:clean] = true
|
65
|
+
self
|
66
|
+
end
|
67
|
+
|
68
|
+
##
|
69
|
+
# Is the result marked to be recalculated? Returns Boolean
|
70
|
+
def recalculate?
|
71
|
+
!!self[:recalculate]
|
72
|
+
end
|
73
|
+
|
74
|
+
##
|
75
|
+
# Mark the result to be recalculated, returns self
|
76
|
+
def recalculate!(reason = nil)
|
77
|
+
self[:recalculate] = true
|
78
|
+
self[:recalculate_why] = reason
|
79
|
+
self[:recalculate_when] = Time.now.to_s
|
80
|
+
self
|
65
81
|
end
|
66
82
|
|
67
83
|
##
|
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,
|
11
|
+
VERSION = [0.7, 22, 2]
|
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, 30)
|
20
20
|
|
21
21
|
##
|
22
22
|
# Reference of MiGA.
|
data/scripts/aai_distances.bash
CHANGED
@@ -19,7 +19,7 @@ rm -f miga-project.txt
|
|
19
19
|
for i in $DS ; do
|
20
20
|
echo "SELECT CASE WHEN omega!=0 THEN 'AAI' ELSE 'hAAI_AAI' END," \
|
21
21
|
" seq1, seq2, aai, sd, n, omega from aai;" \
|
22
|
-
| sqlite3 "$i.db" | tr "\\|" "\\t"
|
22
|
+
| sqlite3 "$DIR/$i.db" | tr "\\|" "\\t"
|
23
23
|
echo "$i" >> miga-project.log
|
24
24
|
done
|
25
25
|
) | gzip -9c > miga-project.txt.gz
|
data/scripts/ani_distances.bash
CHANGED
@@ -18,7 +18,7 @@ rm -f miga-project.txt
|
|
18
18
|
echo "metric a b value sd n omega" | tr " " "\\t"
|
19
19
|
for i in $DS ; do
|
20
20
|
echo "SELECT 'ANI', seq1, seq2, ani, sd, n, omega from ani ;" \
|
21
|
-
| sqlite3 "$i.db" | tr "\\|" "\\t"
|
21
|
+
| sqlite3 "$DIR/$i.db" | tr "\\|" "\\t"
|
22
22
|
echo "$i" >> miga-project.log
|
23
23
|
done
|
24
24
|
) | gzip -9c > miga-project.txt.gz
|
data/scripts/haai_distances.bash
CHANGED
@@ -22,7 +22,7 @@ rm -f miga-project.txt
|
|
22
22
|
echo "metric a b value sd n omega" | tr " " "\\t"
|
23
23
|
for i in $DS ; do
|
24
24
|
echo "SELECT 'hAAI', seq1, seq2, aai, sd, n, omega from aai ;" \
|
25
|
-
| sqlite3 "$i.db" | tr "\\|" "\\t"
|
25
|
+
| sqlite3 "$DIR/$i.db" | tr "\\|" "\\t"
|
26
26
|
echo "$i" >> miga-project.log
|
27
27
|
done
|
28
28
|
) | gzip -9c > miga-project.txt.gz
|
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/hook_test.rb
CHANGED
@@ -107,10 +107,10 @@ class HookTest < Test::Unit::TestCase
|
|
107
107
|
File.join(project.path, 'data', '90.stats', "miga-project.#{ext}")
|
108
108
|
)
|
109
109
|
end
|
110
|
-
assert_equal(:project_stats, project.next_task
|
110
|
+
assert_equal(:project_stats, project.next_task)
|
111
111
|
assert_equal(:test, $res)
|
112
112
|
assert_equal(1, $counter)
|
113
|
-
assert_equal(:haai_distances, project.next_task)
|
113
|
+
assert_equal(:haai_distances, project.next_task(nil, true))
|
114
114
|
assert_equal(:project_stats, $res)
|
115
115
|
assert_equal(2, $counter)
|
116
116
|
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
|
data/utils/cleanup-databases.rb
CHANGED
@@ -15,7 +15,7 @@ m.say 'Cleaning Databases'
|
|
15
15
|
(0..thr - 1).each do |t|
|
16
16
|
fork do
|
17
17
|
dsn.each_with_index do |i, idx|
|
18
|
-
m.advance('Dataset:',
|
18
|
+
m.advance('Dataset:', idx + 1, dsn.size) if t == 0
|
19
19
|
next unless (idx % thr) == t
|
20
20
|
|
21
21
|
d = p.dataset(i)
|
data/utils/subclade/runner.rb
CHANGED
@@ -15,7 +15,7 @@ class MiGA::SubcladeRunner
|
|
15
15
|
@step = step.to_sym
|
16
16
|
@home = File.join(
|
17
17
|
File.join(project.path, 'data', '10.clades'),
|
18
|
-
@step == :clade_finding ? '01.find' : '02.ani'
|
18
|
+
@step == :clade_finding ? '01.find.running' : '02.ani.running'
|
19
19
|
)
|
20
20
|
@opts[:thr] ||= ENV.fetch('CORES') { 2 }.to_i
|
21
21
|
@opts[:run_clades] = !!@project.metadata.data.fetch(:run_clades) { true }
|
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.
|
4
|
+
version: 0.7.22.2
|
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-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: daemons
|