miga-base 0.7.4.0 → 0.7.5.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.
- checksums.yaml +4 -4
- data/lib/miga/cli.rb +10 -8
- data/lib/miga/cli/action.rb +2 -3
- data/lib/miga/cli/action/about.rb +5 -6
- data/lib/miga/cli/action/add.rb +18 -12
- data/lib/miga/cli/action/add_result.rb +2 -3
- data/lib/miga/cli/action/archive.rb +1 -2
- data/lib/miga/cli/action/classify_wf.rb +8 -6
- data/lib/miga/cli/action/console.rb +0 -1
- data/lib/miga/cli/action/daemon.rb +7 -7
- data/lib/miga/cli/action/date.rb +0 -1
- data/lib/miga/cli/action/derep_wf.rb +5 -4
- data/lib/miga/cli/action/doctor.rb +28 -20
- data/lib/miga/cli/action/doctor/base.rb +29 -6
- data/lib/miga/cli/action/edit.rb +1 -2
- data/lib/miga/cli/action/files.rb +8 -8
- data/lib/miga/cli/action/find.rb +5 -6
- data/lib/miga/cli/action/generic.rb +7 -7
- data/lib/miga/cli/action/get.rb +20 -17
- data/lib/miga/cli/action/get_db.rb +8 -2
- data/lib/miga/cli/action/index_wf.rb +1 -1
- data/lib/miga/cli/action/init.rb +34 -29
- data/lib/miga/cli/action/init/daemon_helper.rb +65 -43
- data/lib/miga/cli/action/lair.rb +7 -7
- data/lib/miga/cli/action/ln.rb +6 -6
- data/lib/miga/cli/action/ls.rb +1 -2
- data/lib/miga/cli/action/ncbi_get.rb +11 -3
- data/lib/miga/cli/action/new.rb +4 -4
- data/lib/miga/cli/action/next_step.rb +0 -1
- data/lib/miga/cli/action/preproc_wf.rb +3 -3
- data/lib/miga/cli/action/quality_wf.rb +1 -1
- data/lib/miga/cli/action/rm.rb +2 -3
- data/lib/miga/cli/action/run.rb +8 -8
- data/lib/miga/cli/action/stats.rb +3 -3
- data/lib/miga/cli/action/summary.rb +7 -6
- data/lib/miga/cli/action/tax_dist.rb +8 -4
- data/lib/miga/cli/action/tax_index.rb +3 -4
- data/lib/miga/cli/action/tax_set.rb +7 -6
- data/lib/miga/cli/action/tax_test.rb +6 -5
- data/lib/miga/cli/action/wf.rb +21 -19
- data/lib/miga/cli/base.rb +34 -32
- data/lib/miga/cli/objects_helper.rb +24 -17
- data/lib/miga/cli/opt_helper.rb +3 -2
- data/lib/miga/common.rb +2 -5
- data/lib/miga/common/base.rb +15 -16
- data/lib/miga/common/format.rb +8 -5
- data/lib/miga/common/hooks.rb +1 -4
- data/lib/miga/common/path.rb +4 -9
- data/lib/miga/common/with_daemon.rb +5 -2
- data/lib/miga/common/with_daemon_class.rb +1 -1
- data/lib/miga/common/with_result.rb +2 -1
- data/lib/miga/daemon.rb +51 -35
- data/lib/miga/daemon/base.rb +0 -2
- data/lib/miga/dataset.rb +47 -37
- data/lib/miga/dataset/base.rb +52 -37
- data/lib/miga/dataset/hooks.rb +3 -4
- data/lib/miga/dataset/result.rb +17 -1
- data/lib/miga/json.rb +5 -7
- data/lib/miga/lair.rb +4 -0
- data/lib/miga/metadata.rb +4 -3
- data/lib/miga/project.rb +29 -20
- data/lib/miga/project/base.rb +52 -37
- data/lib/miga/project/dataset.rb +27 -13
- data/lib/miga/project/hooks.rb +0 -3
- data/lib/miga/project/result.rb +14 -5
- data/lib/miga/remote_dataset.rb +85 -72
- data/lib/miga/remote_dataset/base.rb +11 -13
- data/lib/miga/remote_dataset/download.rb +33 -12
- data/lib/miga/result.rb +34 -25
- data/lib/miga/result/base.rb +0 -2
- data/lib/miga/result/dates.rb +1 -3
- data/lib/miga/result/source.rb +15 -16
- data/lib/miga/result/stats.rb +36 -25
- data/lib/miga/tax_dist.rb +6 -3
- data/lib/miga/tax_index.rb +17 -17
- data/lib/miga/taxonomy.rb +6 -1
- data/lib/miga/taxonomy/base.rb +19 -15
- data/lib/miga/version.rb +19 -16
- data/test/common_test.rb +3 -11
- data/test/daemon_helper.rb +38 -0
- data/test/daemon_test.rb +73 -101
- data/test/dataset_test.rb +58 -59
- data/test/format_test.rb +3 -11
- data/test/hook_test.rb +50 -55
- data/test/json_test.rb +7 -8
- data/test/lair_test.rb +22 -28
- data/test/metadata_test.rb +6 -14
- data/test/project_test.rb +33 -39
- data/test/remote_dataset_test.rb +20 -28
- data/test/result_stats_test.rb +17 -27
- data/test/result_test.rb +41 -34
- data/test/tax_dist_test.rb +0 -2
- data/test/tax_index_test.rb +4 -10
- data/test/taxonomy_test.rb +7 -9
- data/test/test_helper.rb +42 -1
- data/test/with_daemon_test.rb +14 -22
- data/utils/cleanup-databases.rb +6 -5
- data/utils/distance/base.rb +0 -1
- data/utils/distance/commands.rb +19 -12
- data/utils/distance/database.rb +24 -21
- data/utils/distance/pipeline.rb +12 -9
- data/utils/distance/runner.rb +14 -13
- data/utils/distance/temporal.rb +1 -3
- data/utils/distances.rb +1 -1
- data/utils/domain-ess-genes.rb +7 -7
- data/utils/index_metadata.rb +4 -2
- data/utils/mytaxa_scan.rb +18 -16
- data/utils/representatives.rb +5 -4
- data/utils/requirements.txt +1 -1
- data/utils/subclade/base.rb +0 -1
- data/utils/subclade/pipeline.rb +7 -6
- data/utils/subclade/runner.rb +9 -9
- data/utils/subclade/temporal.rb +0 -2
- data/utils/subclades-compile.rb +39 -37
- data/utils/subclades.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6361b203b4612214936255e8b285959cbf556e7e64f88119a058e167774264f9
|
4
|
+
data.tar.gz: 1a3d8df11d57a363a49eecc88011a5337ddb40573cf8727942eea24e5071ecf5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53786e1830ed8b3c56bffbf1fc581745185084e96b68631323b01fd9994c2b59cdeac582c2f4cef8d0ed622136a2c2cf4f68e06cc3a9e7dbf580d10d1aedc9e5
|
7
|
+
data.tar.gz: 26322daf6a52906466c4f28cc93ef455bac22e98e115fc6f6b3ad685998d58854454c8044126491e5a886910ce5ddceece2713e94acafaf86459442970617f4f
|
data/lib/miga/cli.rb
CHANGED
@@ -7,7 +7,6 @@ require 'optparse'
|
|
7
7
|
##
|
8
8
|
# MiGA Command Line Interface API.
|
9
9
|
class MiGA::Cli < MiGA::MiGA
|
10
|
-
|
11
10
|
require 'miga/cli/base'
|
12
11
|
require 'miga/cli/opt_helper'
|
13
12
|
require 'miga/cli/objects_helper'
|
@@ -61,7 +60,7 @@ class MiGA::Cli < MiGA::MiGA
|
|
61
60
|
|
62
61
|
def initialize(argv)
|
63
62
|
@data = {}
|
64
|
-
@defaults = {verbose: false, tabular: false}
|
63
|
+
@defaults = { verbose: false, tabular: false }
|
65
64
|
@opt_common = true
|
66
65
|
@objects = {}
|
67
66
|
if argv[0].nil? or argv[0].to_s[0] == '-'
|
@@ -106,6 +105,7 @@ class MiGA::Cli < MiGA::MiGA
|
|
106
105
|
# otherwise it's sent to +$stderr+
|
107
106
|
def say(*par)
|
108
107
|
return unless self[:verbose]
|
108
|
+
|
109
109
|
super(*par)
|
110
110
|
end
|
111
111
|
|
@@ -116,16 +116,17 @@ class MiGA::Cli < MiGA::MiGA
|
|
116
116
|
# The report goes to $stderr iff --verborse
|
117
117
|
def advance(step, n = 0, total = nil, bin = true)
|
118
118
|
return unless self[:verbose]
|
119
|
+
|
119
120
|
adv = total.nil? ? (n == 0 ? '' : num_suffix(n, bin)) :
|
120
121
|
('%.1f%% (%s/%s)' % [100.0 * n / total,
|
121
|
-
|
122
|
+
num_suffix(n, bin), num_suffix(total, bin)])
|
122
123
|
$stderr.print("[%s] %s %s \r" % [Time.now, step, adv])
|
123
124
|
end
|
124
125
|
|
125
126
|
def num_suffix(n, bin = false)
|
126
127
|
p = ''
|
127
|
-
{T: 4, G: 3, M: 2, K: 1}.each do |k,x|
|
128
|
-
v = (bin ? 1024 : 1e3)
|
128
|
+
{ T: 4, G: 3, M: 2, K: 1 }.each do |k, x|
|
129
|
+
v = (bin ? 1024 : 1e3)**x
|
129
130
|
if n > v
|
130
131
|
n = '%.1f' % (n / v)
|
131
132
|
p = k
|
@@ -160,7 +161,7 @@ class MiGA::Cli < MiGA::MiGA
|
|
160
161
|
##
|
161
162
|
# Set default values in the Hash +hsh+
|
162
163
|
def defaults=(hsh)
|
163
|
-
hsh.each{ |k,v| @defaults[k] = v }
|
164
|
+
hsh.each { |k, v| @defaults[k] = v }
|
164
165
|
end
|
165
166
|
|
166
167
|
##
|
@@ -192,6 +193,7 @@ class MiGA::Cli < MiGA::MiGA
|
|
192
193
|
def launch
|
193
194
|
begin
|
194
195
|
raise "See `miga -h`" if action.nil?
|
196
|
+
|
195
197
|
action.launch
|
196
198
|
rescue => err
|
197
199
|
$stderr.puts "Exception: #{err}"
|
@@ -222,8 +224,8 @@ class MiGA::Cli < MiGA::MiGA
|
|
222
224
|
# +par+, a Hash with object names as keys and parameter flag as values.
|
223
225
|
# If missing, raise an error with message +msg+
|
224
226
|
def ensure_par(req, msg = '%<name>s is mandatory: please provide %<flag>s')
|
225
|
-
req.each do |k,v|
|
226
|
-
raise (msg % {name: k, flag: v}) if self[k].nil?
|
227
|
+
req.each do |k, v|
|
228
|
+
raise (msg % { name: k, flag: v }) if self[k].nil?
|
227
229
|
end
|
228
230
|
end
|
229
231
|
|
data/lib/miga/cli/action.rb
CHANGED
@@ -8,7 +8,6 @@ require 'miga/cli'
|
|
8
8
|
# by MiGA::Cli::Action::* classes. Do not attempt creating directly with +new+,
|
9
9
|
# use instead the MiGA::Cli::Action.load interface.
|
10
10
|
class MiGA::Cli::Action < MiGA::MiGA
|
11
|
-
|
12
11
|
class << self
|
13
12
|
def load(task, cli)
|
14
13
|
require "miga/cli/action/#{task}"
|
@@ -55,8 +54,8 @@ class MiGA::Cli::Action < MiGA::MiGA
|
|
55
54
|
##
|
56
55
|
# Name of the action, as referred to by the CLI
|
57
56
|
def name
|
58
|
-
camel = self.class.to_s.gsub(/.*::/,'')
|
59
|
-
camel.gsub(/(\S)([A-Z])/,'\1_\2').downcase
|
57
|
+
camel = self.class.to_s.gsub(/.*::/, '')
|
58
|
+
camel.gsub(/(\S)([A-Z])/, '\1_\2').downcase
|
60
59
|
end
|
61
60
|
|
62
61
|
##
|
@@ -4,23 +4,22 @@
|
|
4
4
|
require 'miga/cli/action'
|
5
5
|
|
6
6
|
class MiGA::Cli::Action::About < MiGA::Cli::Action
|
7
|
-
|
8
7
|
def parse_cli
|
9
|
-
cli.defaults = {info: false, processing: false, tabular: false}
|
8
|
+
cli.defaults = { info: false, processing: false, tabular: false }
|
10
9
|
cli.parse do |opt|
|
11
10
|
cli.opt_object(opt, [:project])
|
12
11
|
opt.on(
|
13
12
|
'-p', '--processing',
|
14
13
|
'Print information on processing advance'
|
15
|
-
|
14
|
+
) { |v| cli[:processing] = v }
|
16
15
|
opt.on(
|
17
16
|
'-m', '--metadata STRING',
|
18
17
|
'Print name and metadata field only'
|
19
|
-
|
18
|
+
) { |v| cli[:datum] = v }
|
20
19
|
opt.on(
|
21
20
|
'--tab',
|
22
21
|
'Return a tab-delimited table'
|
23
|
-
|
22
|
+
) { |v| cli[:tabular] = v }
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
@@ -37,7 +36,7 @@ class MiGA::Cli::Action::About < MiGA::Cli::Action
|
|
37
36
|
else
|
38
37
|
cli.puts MiGA.tabulate([:key, :value], p.metadata.data.keys.map do |k|
|
39
38
|
v = p.metadata[k]
|
40
|
-
[k, k
|
39
|
+
[k, k == :datasets ? v.size : v]
|
41
40
|
end, cli[:tabular])
|
42
41
|
end
|
43
42
|
end
|
data/lib/miga/cli/action/add.rb
CHANGED
@@ -4,7 +4,6 @@
|
|
4
4
|
require 'miga/cli/action'
|
5
5
|
|
6
6
|
class MiGA::Cli::Action::Add < MiGA::Cli::Action
|
7
|
-
|
8
7
|
def parse_cli
|
9
8
|
cli.expect_files = true
|
10
9
|
cli.defaults = {
|
@@ -47,7 +46,7 @@ class MiGA::Cli::Action::Add < MiGA::Cli::Action
|
|
47
46
|
opt.on(
|
48
47
|
'-i', '--input-type STRING',
|
49
48
|
'Type of input data, one of the following:',
|
50
|
-
*self.class.INPUT_TYPES.map{ |k,v| "~ #{k}: #{v[0]}" }
|
49
|
+
*self.class.INPUT_TYPES.map { |k, v| "~ #{k}: #{v[0]}" }
|
51
50
|
) { |v| cli[:input_type] = v.downcase.to_sym }
|
52
51
|
opt.on(
|
53
52
|
'--ignore-dups',
|
@@ -64,6 +63,7 @@ class MiGA::Cli::Action::Add < MiGA::Cli::Action
|
|
64
63
|
files.each do |file|
|
65
64
|
d = create_dataset(file, p)
|
66
65
|
next if d.nil?
|
66
|
+
|
67
67
|
copy_file_to_project(file, file_type, d, p)
|
68
68
|
d = cli.add_metadata(d)
|
69
69
|
d.save
|
@@ -76,22 +76,22 @@ class MiGA::Cli::Action::Add < MiGA::Cli::Action
|
|
76
76
|
@@INPUT_TYPES = {
|
77
77
|
raw_reads_single:
|
78
78
|
['Single raw reads in a single FastQ file',
|
79
|
-
|
79
|
+
:raw_reads, %w[.1.fastq]],
|
80
80
|
raw_reads_paired:
|
81
81
|
['Paired raw reads in two FastQ files',
|
82
|
-
|
82
|
+
:raw_reads, %w[.1.fastq .2.fastq]],
|
83
83
|
trimmed_reads_single:
|
84
84
|
['Single trimmed reads in a single FastA file',
|
85
|
-
|
85
|
+
:trimmed_fasta, %w[.SingleReads.fa]],
|
86
86
|
trimmed_reads_paired:
|
87
87
|
['Paired trimmed reads in two FastA files',
|
88
|
-
|
88
|
+
:trimmed_fasta, %w[.1.fasta .2.fasta]],
|
89
89
|
trimmed_reads_interleaved:
|
90
90
|
['Paired trimmed reads in a single FastA file',
|
91
|
-
|
91
|
+
:trimmed_fasta, %w[.CoupledReads.fa]],
|
92
92
|
assembly:
|
93
93
|
['Assembled contigs or scaffolds in FastA format',
|
94
|
-
|
94
|
+
:assembly, %w[.LargeContigs.fna]]
|
95
95
|
}
|
96
96
|
|
97
97
|
class << self
|
@@ -106,23 +106,26 @@ class MiGA::Cli::Action::Add < MiGA::Cli::Action
|
|
106
106
|
files = cli.files
|
107
107
|
file_type = nil
|
108
108
|
if files.empty?
|
109
|
-
cli.ensure_par({dataset: '-D'},
|
110
|
-
|
109
|
+
cli.ensure_par({ dataset: '-D' },
|
110
|
+
'dataset is mandatory (-D) unless files are provided')
|
111
111
|
cli.ensure_type(Dataset)
|
112
112
|
files = [nil]
|
113
113
|
else
|
114
114
|
raise 'Please specify input type (-i).' if cli[:input_type].nil?
|
115
|
+
|
115
116
|
file_type = self.class.INPUT_TYPES[cli[:input_type]]
|
116
117
|
raise "Unrecognized input type: #{cli[:input_type]}." if file_type.nil?
|
117
118
|
raise 'Some files are duplicated, files must be unique.' if
|
118
119
|
files.size != files.uniq.size
|
120
|
+
|
119
121
|
if cli[:input_type].to_s =~ /_paired$/
|
120
122
|
if files.size.odd?
|
121
123
|
raise 'Odd number of files incompatible with input type.'
|
122
124
|
end
|
125
|
+
|
123
126
|
files = Hash[*files].to_a
|
124
127
|
else
|
125
|
-
files = files.map{ |i| [i] }
|
128
|
+
files = files.map { |i| [i] }
|
126
129
|
end
|
127
130
|
if files.size > 1 && !cli[:dataset].nil?
|
128
131
|
raise 'The dataset name (-D) can only be specified with one input file.'
|
@@ -137,6 +140,7 @@ class MiGA::Cli::Action::Add < MiGA::Cli::Action
|
|
137
140
|
ref_file = file.is_a?(Array) ? file.first : file
|
138
141
|
m = cli[:regexp].match(ref_file)
|
139
142
|
raise "Cannot extract name from file: #{ref_file}" if m.nil? or m[1].nil?
|
143
|
+
|
140
144
|
name = cli[:prefix].to_s + m[1].miga_name
|
141
145
|
end
|
142
146
|
if Dataset.exist?(p, name)
|
@@ -151,12 +155,14 @@ class MiGA::Cli::Action::Add < MiGA::Cli::Action
|
|
151
155
|
cli.say "o #{name}"
|
152
156
|
d = Dataset.new(p, name, cli[:ref])
|
153
157
|
raise "Unexpected: Couldn't create dataset: #{name}." if d.nil?
|
158
|
+
|
154
159
|
d
|
155
160
|
end
|
156
161
|
|
157
162
|
def copy_file_to_project(file, file_type, d, p)
|
158
163
|
return if file.nil?
|
159
|
-
|
164
|
+
|
165
|
+
r_dir = Dataset.RESULT_DIRS[file_type[1]]
|
160
166
|
r_path = File.expand_path("data/#{r_dir}/#{d.name}", p.path)
|
161
167
|
file_type[2].each_with_index do |ext, i|
|
162
168
|
gz = file[i] =~ /\.gz/ ? '.gz' : ''
|
@@ -4,15 +4,14 @@
|
|
4
4
|
require 'miga/cli/action'
|
5
5
|
|
6
6
|
class MiGA::Cli::Action::AddResult < MiGA::Cli::Action
|
7
|
-
|
8
7
|
def parse_cli
|
9
|
-
cli.defaults = {force: false}
|
8
|
+
cli.defaults = { force: false }
|
10
9
|
cli.parse do |opt|
|
11
10
|
cli.opt_object(opt, [:project, :dataset_opt, :result])
|
12
11
|
opt.on(
|
13
12
|
'-f', '--force',
|
14
13
|
'Force re-indexing of the result even if it\'s already registered'
|
15
|
-
|
14
|
+
) { |v| cli[:force] = v }
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
@@ -5,7 +5,6 @@ require 'miga/cli/action'
|
|
5
5
|
require 'rubygems/package'
|
6
6
|
|
7
7
|
class MiGA::Cli::Action::Archive < MiGA::Cli::Action
|
8
|
-
|
9
8
|
def parse_cli
|
10
9
|
cli.parse do |opt|
|
11
10
|
opt.on(
|
@@ -26,6 +25,7 @@ class MiGA::Cli::Action::Archive < MiGA::Cli::Action
|
|
26
25
|
unless cli[:tarball] =~ /\.tar\.gz$/
|
27
26
|
raise 'The tarball path (-o) must have .tar.gz extension'
|
28
27
|
end
|
28
|
+
|
29
29
|
cli[:folder] ||= cli.load_project.name
|
30
30
|
ds = cli.load_and_filter_datasets
|
31
31
|
|
@@ -95,5 +95,4 @@ class MiGA::Cli::Action::Archive < MiGA::Cli::Action
|
|
95
95
|
in_tar = File.join(cli[:folder], rel_path)
|
96
96
|
tar.add_file_simple(in_tar, 0666, string.size) { |fh| fh.write(string) }
|
97
97
|
end
|
98
|
-
|
99
98
|
end
|
@@ -51,24 +51,24 @@ class MiGA::Cli::Action::ClassifyWf < MiGA::Cli::Action
|
|
51
51
|
ref_db = reference_db
|
52
52
|
p_metadata = Hash[
|
53
53
|
%w[project_stats haai_distances aai_distances ani_distances clade_finding]
|
54
|
-
|
54
|
+
.map { |i| ["run_#{i}", false] }
|
55
55
|
]
|
56
56
|
p_metadata[:ref_project] = ref_db.path
|
57
57
|
p_metadata[:tax_pvalue] = cli[:pvalue]
|
58
58
|
p = create_project(:assembly, p_metadata,
|
59
|
-
|
59
|
+
run_ssu: false, run_mytaxa_scan: false, run_distances: false)
|
60
60
|
# Run
|
61
61
|
run_daemon
|
62
62
|
summarize(%w[cds assembly essential_genes]) if cli[:summaries]
|
63
63
|
summarize(['taxonomy'])
|
64
64
|
cli.say "Summary: classification"
|
65
65
|
call_cli([
|
66
|
-
|
67
|
-
|
68
|
-
|
66
|
+
'ls', '-P', cli[:outdir], '-m', 'tax', '--tab',
|
67
|
+
'-o', File.expand_path('classification.tsv', cli[:outdir])
|
68
|
+
])
|
69
69
|
cleanup
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
private
|
73
73
|
|
74
74
|
def reference_db
|
@@ -85,12 +85,14 @@ class MiGA::Cli::Action::ClassifyWf < MiGA::Cli::Action
|
|
85
85
|
unless File.size? lm_f
|
86
86
|
raise 'No locally listed databases, call "miga get_db" first'
|
87
87
|
end
|
88
|
+
|
88
89
|
cli[:database] = MiGA::Json.parse(lm_f)[:databases].keys.first
|
89
90
|
end
|
90
91
|
ref_db_path = File.expand_path(cli[:database].to_s, cli[:local])
|
91
92
|
end
|
92
93
|
ref_db = MiGA::Project.load(ref_db_path)
|
93
94
|
raise "Cannot locate reference database: #{ref_db_path}" if ref_db.nil?
|
95
|
+
|
94
96
|
cli.say "Reference database: #{ref_db.name}"
|
95
97
|
ref_db
|
96
98
|
end
|
@@ -5,17 +5,17 @@ require 'miga/cli/action'
|
|
5
5
|
require 'miga/daemon'
|
6
6
|
|
7
7
|
class MiGA::Cli::Action::Daemon < MiGA::Cli::Action
|
8
|
-
|
9
8
|
def parse_cli
|
10
|
-
cli.defaults = {daemon_opts: []}
|
9
|
+
cli.defaults = { daemon_opts: [] }
|
11
10
|
cli.expect_operation = true
|
12
11
|
cli.parse do |opt|
|
13
12
|
opt.separator 'Available operations:'
|
14
|
-
{
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
{
|
14
|
+
start: 'Start an instance of the application',
|
15
|
+
stop: 'Start an instance of the application',
|
16
|
+
run: 'Start the application and stay on top',
|
17
|
+
status: 'Show status (PID) of application instances'
|
18
|
+
}.each { |k, v| opt.separator sprintf(' %*s%s', -33, k, v) }
|
19
19
|
opt.separator ''
|
20
20
|
|
21
21
|
opt.separator 'MiGA options:'
|
data/lib/miga/cli/action/date.rb
CHANGED
@@ -44,12 +44,13 @@ class MiGA::Cli::Action::DerepWf < MiGA::Cli::Action
|
|
44
44
|
def perform
|
45
45
|
# Input data
|
46
46
|
p = create_project(:assembly,
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
{ run_project_stats: false, run_clades: false,
|
48
|
+
gsp_metric: cli[:metric], :"gsp_#{cli[:metric]}" => cli[:threshold] },
|
49
|
+
{ run_mytaxa_scan: false, run_ssu: false })
|
50
50
|
unless cli[:threshold] >= 0.0 && cli[:threshold] <= 100.0
|
51
51
|
raise "The threshold of identity must be in the range [0,100]"
|
52
52
|
end
|
53
|
+
|
53
54
|
# Run
|
54
55
|
run_daemon
|
55
56
|
dereplicate(p)
|
@@ -68,7 +69,7 @@ class MiGA::Cli::Action::DerepWf < MiGA::Cli::Action
|
|
68
69
|
File.open(File.expand_path('genomospecies.tsv', cli[:outdir]), 'w') do |fh|
|
69
70
|
fh.puts "Clade\tRepresentative\tMembers"
|
70
71
|
clades.each_with_index do |i, k|
|
71
|
-
fh.puts ["gsp_#{k+1}", rep[k], i.join(',')].join("\t")
|
72
|
+
fh.puts ["gsp_#{k + 1}", rep[k], i.join(',')].join("\t")
|
72
73
|
end
|
73
74
|
end
|
74
75
|
if cli[:collection]
|
@@ -58,32 +58,31 @@ class MiGA::Cli::Action::Doctor < MiGA::Cli::Action
|
|
58
58
|
# Perform status operation with MiGA::Cli +cli+
|
59
59
|
def check_status(cli)
|
60
60
|
cli.say 'Updating metadata status'
|
61
|
-
cli.load_project.
|
61
|
+
n, k = cli.load_project.dataset_names.size, 0
|
62
|
+
cli.load_project.each_dataset do |d|
|
63
|
+
cli.advance('Datasets:', k += 1, n, false)
|
64
|
+
d.recalculate_status
|
65
|
+
end
|
66
|
+
cli.say
|
62
67
|
end
|
63
68
|
|
64
69
|
##
|
65
70
|
# Perform databases operation with MiGA::Cli +cli+
|
66
71
|
def check_db(cli)
|
67
72
|
cli.say 'Checking integrity of databases'
|
73
|
+
n, k = cli.load_project.dataset_names.size, 0
|
68
74
|
cli.load_project.each_dataset do |d|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
File.unlink(f) if File.exist? f
|
77
|
-
end
|
78
|
-
# /each |f|
|
79
|
-
end
|
80
|
-
# /check_sqlite3_database
|
75
|
+
cli.advance('Datasets:', k += 1, n, false)
|
76
|
+
each_database_file(d) do |db_file, metric, result|
|
77
|
+
check_sqlite3_database(db_file, metric) do
|
78
|
+
cli.say(" > Removing malformed database from #{d.name}:#{result} ")
|
79
|
+
File.unlink(db_file)
|
80
|
+
r = d.result(result) or next
|
81
|
+
[r.path(:done), r.path].each { |f| File.unlink(f) if File.exist?(f) }
|
81
82
|
end
|
82
|
-
# /each |db_key, metric|
|
83
83
|
end
|
84
|
-
# /each |r_key|
|
85
84
|
end
|
86
|
-
|
85
|
+
cli.say
|
87
86
|
end
|
88
87
|
|
89
88
|
##
|
@@ -93,6 +92,7 @@ class MiGA::Cli::Action::Doctor < MiGA::Cli::Action
|
|
93
92
|
%i[ani aai].each do |dist|
|
94
93
|
res = p.result("#{dist}_distances")
|
95
94
|
next if res.nil?
|
95
|
+
|
96
96
|
cli.say "Checking #{dist} table for consistent datasets"
|
97
97
|
notok, fix = check_dist_eval(cli, p, res)
|
98
98
|
check_dist_fix(cli, p, fix)
|
@@ -104,8 +104,9 @@ class MiGA::Cli::Action::Doctor < MiGA::Cli::Action
|
|
104
104
|
# Perform files operation with MiGA::Cli +cli+
|
105
105
|
def check_files(cli)
|
106
106
|
cli.say 'Looking for outdated files in results'
|
107
|
-
|
108
|
-
|
107
|
+
n, k = cli.load_project.dataset_names.size, 0
|
108
|
+
cli.load_project.each_dataset do |d|
|
109
|
+
cli.advance('Datasets:', k += 1, n, false)
|
109
110
|
d.each_result do |r_k, r|
|
110
111
|
ok = true
|
111
112
|
r.each_file do |_f_sym, _f_rel, f_abs|
|
@@ -115,25 +116,28 @@ class MiGA::Cli::Action::Doctor < MiGA::Cli::Action
|
|
115
116
|
end
|
116
117
|
end
|
117
118
|
unless ok
|
118
|
-
cli.say " > Registering again #{d.name}:#{r_k}"
|
119
|
+
cli.say " > Registering again #{d.name}:#{r_k} "
|
119
120
|
d.add_result(r_k, true, force: true)
|
120
121
|
sr = d.result(:stats) and sr.remove!
|
121
122
|
end
|
122
123
|
end
|
123
124
|
end
|
125
|
+
cli.say
|
124
126
|
end
|
125
127
|
|
126
128
|
##
|
127
129
|
# Perform cds operation with MiGA::Cli +cli+
|
128
130
|
def check_cds(cli)
|
129
131
|
cli.say 'Looking for unzipped genes or proteins'
|
132
|
+
n, k = cli.load_project.dataset_names.size, 0
|
130
133
|
cli.load_project.each_dataset do |d|
|
134
|
+
cli.advance('Datasets:', k += 1, n, false)
|
131
135
|
res = d.result(:cds) or next
|
132
136
|
changed = false
|
133
137
|
%i[genes proteins gff3 gff2 tab].each do |f|
|
134
138
|
file = res.file_path(f) or next
|
135
139
|
if file !~ /\.gz/
|
136
|
-
cli.say " > Gzipping #{d.name} #{f}"
|
140
|
+
cli.say " > Gzipping #{d.name} #{f} "
|
137
141
|
cmdo = `gzip -9 '#{file}'`.chomp
|
138
142
|
warn(cmdo) unless cmdo.empty?
|
139
143
|
changed = true
|
@@ -144,6 +148,7 @@ class MiGA::Cli::Action::Doctor < MiGA::Cli::Action
|
|
144
148
|
sr = d.result(:stats) and sr.remove!
|
145
149
|
end
|
146
150
|
end
|
151
|
+
cli.say
|
147
152
|
end
|
148
153
|
|
149
154
|
##
|
@@ -153,6 +158,7 @@ class MiGA::Cli::Action::Doctor < MiGA::Cli::Action
|
|
153
158
|
cli.load_project.each_dataset do |d|
|
154
159
|
res = d.result(:essential_genes)
|
155
160
|
next if res.nil?
|
161
|
+
|
156
162
|
dir = res.file_path(:collection)
|
157
163
|
if dir.nil?
|
158
164
|
cli.say " > Removing #{d.name}:essential_genes"
|
@@ -161,6 +167,7 @@ class MiGA::Cli::Action::Doctor < MiGA::Cli::Action
|
|
161
167
|
next
|
162
168
|
end
|
163
169
|
next if Dir["#{dir}/*.faa"].empty?
|
170
|
+
|
164
171
|
cli.say " > Fixing #{d.name}"
|
165
172
|
cmdo = `cd '#{dir}' && tar -zcf proteins.tar.gz *.faa && rm *.faa`.chomp
|
166
173
|
warn(cmdo) unless cmdo.empty?
|
@@ -174,6 +181,7 @@ class MiGA::Cli::Action::Doctor < MiGA::Cli::Action
|
|
174
181
|
cli.load_project.each_dataset do |d|
|
175
182
|
res = d.result(:mytaxa_scan)
|
176
183
|
next if res.nil?
|
184
|
+
|
177
185
|
dir = res.file_path(:regions)
|
178
186
|
fix = false
|
179
187
|
unless dir.nil?
|