miga-base 0.7.22.0 → 0.7.25.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/Gemfile +3 -0
- data/README.md +1 -1
- data/Rakefile +1 -0
- data/lib/miga/cli/action/add.rb +10 -8
- data/lib/miga/cli/action/classify_wf.rb +12 -11
- data/lib/miga/cli/action/derep_wf.rb +3 -9
- data/lib/miga/cli/action/edit.rb +0 -1
- data/lib/miga/cli/action/find.rb +1 -1
- data/lib/miga/cli/action/generic.rb +1 -1
- data/lib/miga/cli/action/get.rb +7 -2
- data/lib/miga/cli/action/get_db.rb +16 -21
- data/lib/miga/cli/action/index_wf.rb +4 -2
- data/lib/miga/cli/action/init.rb +93 -144
- data/lib/miga/cli/action/init/daemon_helper.rb +1 -2
- data/lib/miga/cli/action/init/files_helper.rb +119 -0
- data/lib/miga/cli/action/ncbi_get.rb +1 -1
- data/lib/miga/cli/action/new.rb +15 -9
- data/lib/miga/cli/action/option.rb +44 -0
- data/lib/miga/cli/action/preproc_wf.rb +7 -5
- data/lib/miga/cli/action/quality_wf.rb +3 -3
- data/lib/miga/cli/action/tax_dist.rb +1 -1
- data/lib/miga/cli/action/tax_test.rb +1 -1
- data/lib/miga/cli/action/wf.rb +71 -53
- data/lib/miga/cli/base.rb +17 -5
- data/lib/miga/cli/objects_helper.rb +23 -18
- data/lib/miga/common.rb +4 -2
- data/lib/miga/common/net.rb +74 -0
- data/lib/miga/common/with_option.rb +83 -0
- data/lib/miga/common/with_result.rb +3 -2
- data/lib/miga/dataset/base.rb +20 -2
- data/lib/miga/dataset/result.rb +5 -3
- data/lib/miga/metadata.rb +25 -13
- data/lib/miga/project/base.rb +82 -2
- data/lib/miga/project/result.rb +4 -4
- data/lib/miga/remote_dataset.rb +2 -0
- data/lib/miga/result/stats.rb +2 -2
- data/lib/miga/version.rb +4 -2
- data/scripts/essential_genes.bash +18 -3
- data/scripts/miga.bash +8 -2
- data/scripts/mytaxa.bash +6 -5
- data/scripts/mytaxa_scan.bash +8 -7
- data/scripts/ogs.bash +2 -3
- data/scripts/ssu.bash +16 -2
- data/test/dataset_test.rb +5 -5
- data/test/lair_test.rb +1 -2
- data/test/net_test.rb +34 -0
- data/test/with_option_test.rb +115 -0
- data/utils/FastAAI/00.Libraries/01.SCG_HMMs/Archaea_SCG.hmm +41964 -0
- data/utils/FastAAI/00.Libraries/01.SCG_HMMs/Bacteria_SCG.hmm +32439 -0
- data/utils/FastAAI/00.Libraries/01.SCG_HMMs/Complete_SCG_DB.hmm +62056 -0
- data/utils/FastAAI/FastAAI/FastAAI +1336 -0
- data/utils/FastAAI/README.md +84 -0
- data/utils/FastAAI/kAAI_v1.0_virus.py +1296 -0
- data/utils/cleanup-databases.rb +2 -3
- data/utils/distance/base.rb +9 -0
- data/utils/distance/commands.rb +183 -81
- data/utils/distance/database.rb +69 -10
- data/utils/distance/pipeline.rb +15 -21
- data/utils/distance/runner.rb +27 -49
- data/utils/distance/temporal.rb +4 -2
- data/utils/distances.rb +2 -2
- data/utils/index_metadata.rb +1 -2
- data/utils/requirements.txt +6 -5
- data/utils/subclade/runner.rb +10 -11
- metadata +18 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fefd5ed0ec84f2b49d25243ecaec7e567000c04598605ba8a78d0a866c35e5b1
|
|
4
|
+
data.tar.gz: b0f473401ccf64d31fcfc0ed19b54a2b84d29c138e3f983a69083659fcfe547e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2520f7169e91e38aed0027e679d0cbc126271a6948ce27916bef9a34299eb50df249568d06bbdb09c5ff13754ec7628d48d7154a18c5bf363628b69d241757c2
|
|
7
|
+
data.tar.gz: 0e684e321ec13e022f95d0499c2c83fea6230bbcadbaacce226e20423cda9ea7466fac929b579e29b6a50745b243da53b9d1697a5e08876b2d423d577205e269
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[](https://codeclimate.com/github/bio-miga/miga)
|
|
2
2
|
[](https://codeclimate.com/github/bio-miga/miga/coverage)
|
|
3
|
-
[](https://github.com/bio-miga/miga/actions?query=workflow:build)
|
|
4
4
|
[](https://badge.fury.io/rb/miga-base)
|
|
5
5
|
[](http://inch-ci.org/github/bio-miga/miga)
|
|
6
6
|
|
data/Rakefile
CHANGED
data/lib/miga/cli/action/add.rb
CHANGED
|
@@ -6,10 +6,7 @@ require 'miga/cli/action'
|
|
|
6
6
|
class MiGA::Cli::Action::Add < MiGA::Cli::Action
|
|
7
7
|
def parse_cli
|
|
8
8
|
cli.expect_files = true
|
|
9
|
-
cli.defaults = {
|
|
10
|
-
ref: true, ignore_dups: false,
|
|
11
|
-
regexp: MiGA::Cli.FILE_REGEXP
|
|
12
|
-
}
|
|
9
|
+
cli.defaults = { ref: true, ignore_dups: false }
|
|
13
10
|
cli.parse do |opt|
|
|
14
11
|
opt.separator 'You can create multiple datasets with a single command; ' \
|
|
15
12
|
'simply pass all the files at the end: {FILES...}'
|
|
@@ -37,7 +34,10 @@ class MiGA::Cli::Action::Add < MiGA::Cli::Action
|
|
|
37
34
|
opt.on(
|
|
38
35
|
'-R', '--name-regexp REGEXP', Regexp,
|
|
39
36
|
'Regular expression indicating how to extract the name from the path',
|
|
40
|
-
|
|
37
|
+
'By default for paired files:',
|
|
38
|
+
"'#{MiGA::Cli.FILE_REGEXP(true)}'",
|
|
39
|
+
'By default for other files:',
|
|
40
|
+
"'#{MiGA::Cli.FILE_REGEXP}'"
|
|
41
41
|
) { |v| cli[:regexp] = v }
|
|
42
42
|
opt.on(
|
|
43
43
|
'--prefix STRING',
|
|
@@ -59,14 +59,16 @@ class MiGA::Cli::Action::Add < MiGA::Cli::Action
|
|
|
59
59
|
p = cli.load_project
|
|
60
60
|
files, file_type = get_files_and_type
|
|
61
61
|
|
|
62
|
+
paired = cli[:input_type].to_s.include?('_paired')
|
|
63
|
+
cli[:regexp] ||= MiGA::Cli.FILE_REGEXP(paired)
|
|
64
|
+
|
|
62
65
|
cli.say 'Creating datasets:'
|
|
63
66
|
files.each do |file|
|
|
64
67
|
d = create_dataset(file, p)
|
|
65
68
|
next if d.nil?
|
|
66
69
|
|
|
67
70
|
copy_file_to_project(file, file_type, d, p)
|
|
68
|
-
|
|
69
|
-
d.save
|
|
71
|
+
cli.add_metadata(d)
|
|
70
72
|
p.add_dataset(d.name)
|
|
71
73
|
res = d.first_preprocessing(true)
|
|
72
74
|
cli.say " result: #{res}"
|
|
@@ -167,7 +169,7 @@ class MiGA::Cli::Action::Add < MiGA::Cli::Action
|
|
|
167
169
|
file_type[2].each_with_index do |ext, i|
|
|
168
170
|
gz = file[i] =~ /\.gz/ ? '.gz' : ''
|
|
169
171
|
FileUtils.cp(file[i], "#{r_path}#{ext}#{gz}")
|
|
170
|
-
cli.say " file: #{file[i]}"
|
|
172
|
+
cli.say " file: #{File.basename(file[i])}"
|
|
171
173
|
end
|
|
172
174
|
File.open("#{r_path}.done", 'w') { |f| f.print Time.now.to_s }
|
|
173
175
|
end
|
|
@@ -49,23 +49,24 @@ class MiGA::Cli::Action::ClassifyWf < MiGA::Cli::Action
|
|
|
49
49
|
def perform
|
|
50
50
|
# Input data
|
|
51
51
|
ref_db = reference_db
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
.map { |i| ["run_#{i}", false] }
|
|
52
|
+
norun = %w[
|
|
53
|
+
project_stats haai_distances aai_distances ani_distances clade_finding
|
|
55
54
|
]
|
|
56
|
-
p_metadata
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
p_metadata = Hash[norun.map { |i| ["run_#{i}", false] }]
|
|
56
|
+
p = create_project(
|
|
57
|
+
:assembly,
|
|
58
|
+
p_metadata,
|
|
59
|
+
run_ssu: false, run_mytaxa_scan: false, run_distances: false
|
|
60
|
+
)
|
|
61
|
+
p.set_option(:ref_project, ref_db.path)
|
|
62
|
+
p.set_option(:tax_pvalue, cli[:pvalue], true)
|
|
60
63
|
# Run
|
|
61
64
|
run_daemon
|
|
62
65
|
summarize(%w[cds assembly essential_genes]) if cli[:summaries]
|
|
63
66
|
summarize(['taxonomy'])
|
|
64
67
|
cli.say "Summary: classification"
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
'-o', File.expand_path('classification.tsv', cli[:outdir])
|
|
68
|
-
])
|
|
68
|
+
ofile = File.expand_path('classification.tsv', cli[:outdir])
|
|
69
|
+
call_cli(['ls', '-P', cli[:outdir], '-m', 'tax', '--tab', '-o', ofile])
|
|
69
70
|
cleanup
|
|
70
71
|
end
|
|
71
72
|
|
|
@@ -52,17 +52,11 @@ class MiGA::Cli::Action::DerepWf < MiGA::Cli::Action
|
|
|
52
52
|
# Input data
|
|
53
53
|
p = create_project(
|
|
54
54
|
:assembly,
|
|
55
|
-
{
|
|
56
|
-
run_project_stats: false,
|
|
57
|
-
run_clades: false,
|
|
58
|
-
gsp_metric: cli[:metric],
|
|
59
|
-
:"gsp_#{cli[:metric]}" => cli[:threshold]
|
|
60
|
-
},
|
|
55
|
+
{ run_project_stats: false, run_clades: false },
|
|
61
56
|
{ run_mytaxa_scan: false, run_ssu: false }
|
|
62
57
|
)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
end
|
|
58
|
+
p.set_option(:gsp_metric, cli[:metric].to_s)
|
|
59
|
+
p.set_option(:"gsp_#{cli[:metric]}", cli[:threshold])
|
|
66
60
|
|
|
67
61
|
# Run
|
|
68
62
|
run_daemon
|
data/lib/miga/cli/action/edit.rb
CHANGED
data/lib/miga/cli/action/find.rb
CHANGED
|
@@ -20,7 +20,7 @@ class MiGA::Cli::Action::Generic < MiGA::Cli::Action
|
|
|
20
20
|
opt.on(
|
|
21
21
|
'-v', '--version',
|
|
22
22
|
'Show MiGA version'
|
|
23
|
-
) { puts MiGA::MiGA.
|
|
23
|
+
) { puts MiGA::MiGA.FULL_VERSION; exit }
|
|
24
24
|
opt.on(
|
|
25
25
|
'-V', '--long-version',
|
|
26
26
|
'Show complete MiGA version'
|
data/lib/miga/cli/action/get.rb
CHANGED
|
@@ -6,8 +6,9 @@ require 'miga/remote_dataset'
|
|
|
6
6
|
|
|
7
7
|
class MiGA::Cli::Action::Get < MiGA::Cli::Action
|
|
8
8
|
def parse_cli
|
|
9
|
-
cli.defaults = {
|
|
10
|
-
|
|
9
|
+
cli.defaults = {
|
|
10
|
+
query: false, universe: :ncbi, db: :nuccore, get_md: false, only_md: false
|
|
11
|
+
}
|
|
11
12
|
cli.parse do |opt|
|
|
12
13
|
cli.opt_object(opt, [:project, :dataset, :dataset_type])
|
|
13
14
|
opt.on(
|
|
@@ -141,6 +142,10 @@ class MiGA::Cli::Action::Get < MiGA::Cli::Action
|
|
|
141
142
|
|
|
142
143
|
def create_dataset(sub_cli, p, rd)
|
|
143
144
|
sub_cli.say 'Creating dataset'
|
|
145
|
+
if Dataset.exist?(p, sub_cli[:dataset])
|
|
146
|
+
raise "Dataset already exists: #{sub_cli[:dataset]}"
|
|
147
|
+
end
|
|
148
|
+
|
|
144
149
|
dummy_d = Dataset.new(p, sub_cli[:dataset])
|
|
145
150
|
md = sub_cli.add_metadata(dummy_d).metadata.data
|
|
146
151
|
md[:metadata_only] = true if cli[:only_md]
|
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
# @license Artistic-2.0
|
|
3
3
|
|
|
4
4
|
require 'miga/cli/action'
|
|
5
|
-
require 'net/ftp'
|
|
6
5
|
require 'digest/md5'
|
|
7
|
-
require 'open-uri'
|
|
8
6
|
|
|
9
7
|
class MiGA::Cli::Action::GetDb < MiGA::Cli::Action
|
|
10
8
|
def parse_cli
|
|
@@ -12,7 +10,7 @@ class MiGA::Cli::Action::GetDb < MiGA::Cli::Action
|
|
|
12
10
|
database: :recommended,
|
|
13
11
|
version: :latest,
|
|
14
12
|
local: File.expand_path('.miga_db', ENV['MIGA_HOME']),
|
|
15
|
-
host:
|
|
13
|
+
host: MiGA::MiGA.known_hosts(:miga_db),
|
|
16
14
|
pb: true,
|
|
17
15
|
overwrite: true
|
|
18
16
|
}
|
|
@@ -50,6 +48,14 @@ class MiGA::Cli::Action::GetDb < MiGA::Cli::Action
|
|
|
50
48
|
end
|
|
51
49
|
|
|
52
50
|
def perform
|
|
51
|
+
# Quick check when the database is not an alias
|
|
52
|
+
dir = File.join(cli[:local], cli[:database].to_s)
|
|
53
|
+
if !cli[:overwrite] && Dir.exist?(dir)
|
|
54
|
+
cli.puts "Database exists: #{dir}"
|
|
55
|
+
return
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Remote manifest
|
|
53
59
|
@ftp = remote_connection
|
|
54
60
|
manif = remote_manifest(@ftp)
|
|
55
61
|
cli.puts "# Host: #{manif[:host]}"
|
|
@@ -59,6 +65,8 @@ class MiGA::Cli::Action::GetDb < MiGA::Cli::Action
|
|
|
59
65
|
list_versions(db) and return
|
|
60
66
|
ver = version_requested(db)
|
|
61
67
|
check_target and return
|
|
68
|
+
|
|
69
|
+
# Download and expand
|
|
62
70
|
file = download_file(@ftp, ver[:path])
|
|
63
71
|
check_digest(ver, file)
|
|
64
72
|
unarchive(file)
|
|
@@ -78,27 +86,14 @@ class MiGA::Cli::Action::GetDb < MiGA::Cli::Action
|
|
|
78
86
|
|
|
79
87
|
def remote_connection
|
|
80
88
|
cli.say "Connecting to '#{cli[:host]}'"
|
|
81
|
-
|
|
82
|
-
raise 'Only FTP hosts are supported' unless uri.scheme == 'ftp'
|
|
83
|
-
|
|
84
|
-
ftp = Net::FTP.new(uri.host)
|
|
85
|
-
ftp.passive = true
|
|
86
|
-
ftp.login
|
|
87
|
-
ftp.chdir(uri.path)
|
|
88
|
-
ftp
|
|
89
|
+
MiGA::MiGA.remote_connection(cli[:host])
|
|
89
90
|
end
|
|
90
91
|
|
|
91
92
|
def download_file(ftp, path)
|
|
92
93
|
cli.say "Downloading '#{path}'"
|
|
93
|
-
Dir.mkdir(cli[:local]) unless Dir.exist? cli[:local]
|
|
94
94
|
file = File.expand_path(path, cli[:local])
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
ftp.getbinaryfile(path, file, 1024) do |data|
|
|
98
|
-
if cli[:pb]
|
|
99
|
-
transferred += data.size
|
|
100
|
-
cli.advance("#{path}:", transferred, filesize)
|
|
101
|
-
end
|
|
95
|
+
MiGA::MiGA.download_file_ftp(ftp, path, file) do |n, size|
|
|
96
|
+
cli.advance("#{path}:", n, size) if cli[:pb]
|
|
102
97
|
end
|
|
103
98
|
cli.print "\n" if cli[:pb]
|
|
104
99
|
file
|
|
@@ -165,7 +160,7 @@ class MiGA::Cli::Action::GetDb < MiGA::Cli::Action
|
|
|
165
160
|
def check_target
|
|
166
161
|
return false if cli[:overwrite]
|
|
167
162
|
|
|
168
|
-
file = File.
|
|
163
|
+
file = File.join(cli[:local], cli[:database].to_s)
|
|
169
164
|
if Dir.exist? file
|
|
170
165
|
warn "The target directory already exists: #{file}"
|
|
171
166
|
true
|
|
@@ -195,7 +190,7 @@ class MiGA::Cli::Action::GetDb < MiGA::Cli::Action
|
|
|
195
190
|
|
|
196
191
|
def unarchive(file)
|
|
197
192
|
cli.say "Unarchiving #{file}"
|
|
198
|
-
`cd "#{cli[:local]}" && tar -zxf "#{file}"`
|
|
193
|
+
`cd "#{cli[:local]}" && tar -zxf "#{file}" && rm "#{file}"`
|
|
199
194
|
end
|
|
200
195
|
|
|
201
196
|
def register_database(manif, db, ver)
|
|
@@ -16,8 +16,10 @@ class MiGA::Cli::Action::IndexWf < MiGA::Cli::Action
|
|
|
16
16
|
'Perform MyTaxa scan analysis'
|
|
17
17
|
) { |v| cli[:mytaxa] = v }
|
|
18
18
|
opts_for_wf_distances(opt)
|
|
19
|
-
opts_for_wf(
|
|
20
|
-
|
|
19
|
+
opts_for_wf(
|
|
20
|
+
opt, 'Input genome assemblies (nucleotides, FastA)',
|
|
21
|
+
cleanup: false, project_type: true
|
|
22
|
+
)
|
|
21
23
|
end
|
|
22
24
|
end
|
|
23
25
|
|
data/lib/miga/cli/action/init.rb
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
|
-
#
|
|
2
|
-
# @license Artistic-2.0
|
|
1
|
+
# frozen_string_literal: true
|
|
3
2
|
|
|
4
3
|
require 'miga/cli/action'
|
|
5
4
|
require 'shellwords'
|
|
6
5
|
|
|
7
6
|
class MiGA::Cli::Action::Init < MiGA::Cli::Action
|
|
8
7
|
require 'miga/cli/action/init/daemon_helper'
|
|
8
|
+
require 'miga/cli/action/init/files_helper'
|
|
9
9
|
include MiGA::Cli::Action::Init::DaemonHelper
|
|
10
|
+
include MiGA::Cli::Action::Init::FilesHelper
|
|
10
11
|
|
|
11
12
|
def parse_cli
|
|
12
13
|
cli.interactive = true
|
|
13
|
-
cli.defaults = {
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
cli.defaults = {
|
|
15
|
+
mytaxa: nil,
|
|
16
|
+
rdp: nil,
|
|
17
|
+
config: File.join(ENV['MIGA_HOME'], '.miga_modules'),
|
|
18
|
+
ask: false,
|
|
19
|
+
auto: false,
|
|
20
|
+
dtype: :bash
|
|
21
|
+
}
|
|
16
22
|
cli.parse do |opt|
|
|
17
23
|
opt.on(
|
|
18
24
|
'-c', '--config PATH',
|
|
@@ -21,9 +27,14 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
|
|
|
21
27
|
) { |v| cli[:config] = v }
|
|
22
28
|
opt.on(
|
|
23
29
|
'--[no-]mytaxa',
|
|
24
|
-
'Should I try setting up MyTaxa its dependencies?',
|
|
30
|
+
'Should I try setting up MyTaxa and its dependencies?',
|
|
25
31
|
'By default: interactive (true if --auto)'
|
|
26
32
|
) { |v| cli[:mytaxa] = v }
|
|
33
|
+
opt.on(
|
|
34
|
+
'--[no-]rdp',
|
|
35
|
+
'Should I try setting up the RDP classifier?',
|
|
36
|
+
'By default: interactive (true if --auto)'
|
|
37
|
+
) { |v| cli[:rdp] = v }
|
|
27
38
|
opt.on(
|
|
28
39
|
'--daemon-type STRING',
|
|
29
40
|
'Type of daemon launcher, one of: bash, ssh, qsub, msub, slurm',
|
|
@@ -47,13 +58,12 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
|
|
|
47
58
|
BANNER
|
|
48
59
|
list_requirements
|
|
49
60
|
rc_fh = open_rc_file
|
|
50
|
-
check_configuration_script
|
|
51
|
-
paths = check_software_requirements
|
|
52
|
-
check_additional_files
|
|
53
|
-
|
|
54
|
-
check_ruby_gems paths
|
|
61
|
+
check_configuration_script(rc_fh)
|
|
62
|
+
paths = check_software_requirements(rc_fh)
|
|
63
|
+
check_additional_files(paths)
|
|
64
|
+
check_libraries(paths)
|
|
55
65
|
configure_daemon
|
|
56
|
-
close_rc_file
|
|
66
|
+
close_rc_file(rc_fh)
|
|
57
67
|
cli.puts 'Configuration complete. MiGA is ready to work!'
|
|
58
68
|
cli.puts ''
|
|
59
69
|
end
|
|
@@ -72,34 +82,6 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
|
|
|
72
82
|
)
|
|
73
83
|
end
|
|
74
84
|
|
|
75
|
-
def test_r_package(cli, paths, pkg)
|
|
76
|
-
run_r_cmd(cli, paths, "library('#{pkg}')")
|
|
77
|
-
$?.success?
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def install_r_package(cli, paths, pkg)
|
|
81
|
-
r_cmd = "install.packages('#{pkg}', repos='http://cran.rstudio.com/')"
|
|
82
|
-
run_r_cmd(cli, paths, r_cmd)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def test_ruby_gem(cli, paths, pkg)
|
|
86
|
-
run_cmd(
|
|
87
|
-
cli,
|
|
88
|
-
"#{paths['ruby'].shellescape} -r #{pkg.shellescape} -e '' 2>/dev/null"
|
|
89
|
-
)
|
|
90
|
-
$?.success?
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def install_ruby_gem(cli, paths, pkg)
|
|
94
|
-
gem_cmd = "Gem::GemRunner.new.run %w(install --user #{pkg})"
|
|
95
|
-
run_cmd(
|
|
96
|
-
cli,
|
|
97
|
-
"#{paths['ruby'].shellescape} \
|
|
98
|
-
-r rubygems -r rubygems/gem_runner \
|
|
99
|
-
-e #{gem_cmd.shellescape} 2>&1"
|
|
100
|
-
)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
85
|
def list_requirements
|
|
104
86
|
if cli.ask_user(
|
|
105
87
|
'Would you like to see all the requirements before starting?',
|
|
@@ -116,58 +98,18 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
|
|
|
116
98
|
|
|
117
99
|
private
|
|
118
100
|
|
|
119
|
-
def open_rc_file
|
|
120
|
-
rc_path = File.expand_path('.miga_rc', ENV['HOME'])
|
|
121
|
-
if File.exist? rc_path
|
|
122
|
-
if cli.ask_user(
|
|
123
|
-
'I found a previous configuration. Do you want to continue?',
|
|
124
|
-
'yes', %w(yes no)
|
|
125
|
-
) == 'no'
|
|
126
|
-
cli.puts 'OK, see you soon!'
|
|
127
|
-
exit(0)
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
rc_fh = File.open(rc_path, 'w')
|
|
131
|
-
rc_fh.puts <<~BASH
|
|
132
|
-
#!/bin/bash
|
|
133
|
-
# `miga init` made this on #{Time.now}
|
|
134
|
-
|
|
135
|
-
BASH
|
|
136
|
-
rc_fh
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
def check_configuration_script(rc_fh)
|
|
140
|
-
unless File.exist? cli[:config]
|
|
141
|
-
cli[:config] = cli.ask_user(
|
|
142
|
-
'Is there a script I need to load at startup?',
|
|
143
|
-
cli[:config]
|
|
144
|
-
)
|
|
145
|
-
end
|
|
146
|
-
if File.exist? cli[:config]
|
|
147
|
-
cli[:config] = File.expand_path(cli[:config])
|
|
148
|
-
cli.puts "Found bash configuration script: #{cli[:config]}"
|
|
149
|
-
rc_fh.puts "MIGA_STARTUP='#{cli[:config]}'"
|
|
150
|
-
rc_fh.puts '. "$MIGA_STARTUP"'
|
|
151
|
-
else
|
|
152
|
-
cli[:config] = '/dev/null'
|
|
153
|
-
end
|
|
154
|
-
cli.puts ''
|
|
155
|
-
end
|
|
156
|
-
|
|
157
101
|
def check_software_requirements(rc_fh)
|
|
158
102
|
cli.puts 'Looking for requirements:'
|
|
159
|
-
|
|
160
|
-
rc_fh.puts
|
|
103
|
+
ask_for_optional(:mytaxa, 'MyTaxa')
|
|
104
|
+
rc_fh.puts "export MIGA_MYTAXA='#{cli[:mytaxa] ? 'yes' : 'no'}'"
|
|
105
|
+
ask_for_optional(:rdp, 'RDP classifier')
|
|
106
|
+
rc_fh.puts "export MIGA_RDP='#{cli[:rdp] ? 'yes' : 'no'}'"
|
|
161
107
|
paths = {}
|
|
162
108
|
rc_fh.puts 'MIGA_PATH=""'
|
|
163
109
|
req_path = File.expand_path('utils/requirements.txt', MiGA.root_path)
|
|
164
110
|
File.open(req_path, 'r') do |fh|
|
|
165
111
|
fh.each_line do |ln|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
r = ln.chomp.split(/\t+/)
|
|
169
|
-
next if r[0] =~ /\(opt\)$/ && !cli[:mytaxa]
|
|
170
|
-
|
|
112
|
+
r = define_software(ln) or next
|
|
171
113
|
cli.print "Testing #{r[0]}#{" (#{r[3]})" if r[3]}... "
|
|
172
114
|
path = find_software(r[1])
|
|
173
115
|
paths[r[1]] = File.expand_path(r[1], path).shellescape
|
|
@@ -178,11 +120,20 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
|
|
|
178
120
|
paths
|
|
179
121
|
end
|
|
180
122
|
|
|
181
|
-
def
|
|
182
|
-
|
|
183
|
-
|
|
123
|
+
def define_software(ln)
|
|
124
|
+
r = ln.chomp.split(/\t+/)
|
|
125
|
+
return if %w[Software --------].include?(r[0])
|
|
126
|
+
return if r[0] =~ /\(mytaxa\)$/ && !cli[:mytaxa]
|
|
127
|
+
return if r[0] =~ /\(rdp\)$/ && !cli[:rdp]
|
|
128
|
+
|
|
129
|
+
r
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def ask_for_optional(symbol, name)
|
|
133
|
+
if cli[symbol].nil?
|
|
134
|
+
cli[symbol] =
|
|
184
135
|
cli.ask_user(
|
|
185
|
-
|
|
136
|
+
"Should I include #{name} modules?",
|
|
186
137
|
'yes', %w(yes no)
|
|
187
138
|
) == 'yes'
|
|
188
139
|
end
|
|
@@ -209,72 +160,70 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
|
|
|
209
160
|
path
|
|
210
161
|
end
|
|
211
162
|
|
|
212
|
-
def
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
unless File.exist?(File.expand_path('AllGenomes.faa.dmnd', mt))
|
|
224
|
-
cli.puts "no\nDownload " \
|
|
225
|
-
"'http://enve-omics.ce.gatech.edu/data/public_mytaxa/" \
|
|
226
|
-
"AllGenomes.faa.dmnd' into #{mt}"
|
|
227
|
-
exit(1)
|
|
163
|
+
def check_libraries(paths)
|
|
164
|
+
req_libraries = {
|
|
165
|
+
r: %w[ape cluster vegan],
|
|
166
|
+
ruby: %w[sqlite3 daemons json],
|
|
167
|
+
python: %w[numpy]
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
req_libraries.each do |language, libraries|
|
|
171
|
+
cli.puts "Looking for #{language.to_s.capitalize} libraries:"
|
|
172
|
+
libraries.each do |lib|
|
|
173
|
+
check_and_install_library(paths, language, lib)
|
|
228
174
|
end
|
|
229
175
|
cli.puts ''
|
|
230
176
|
end
|
|
231
177
|
end
|
|
232
178
|
|
|
233
|
-
def
|
|
234
|
-
cli.
|
|
235
|
-
|
|
236
|
-
cli.
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
unless test_r_package(cli, paths, pkg)
|
|
243
|
-
raise "Unable to auto-install R package: #{pkg}"
|
|
244
|
-
end
|
|
179
|
+
def check_and_install_library(paths, language, library)
|
|
180
|
+
cli.print "Testing #{library}... "
|
|
181
|
+
if test_library(cli, paths, language, library)
|
|
182
|
+
cli.puts 'yes'
|
|
183
|
+
else
|
|
184
|
+
cli.puts 'no, installing'
|
|
185
|
+
cli.print '' + install_library(cli, paths, language, library)
|
|
186
|
+
unless test_library(cli, paths, language, library)
|
|
187
|
+
raise "Cannot install #{language.to_s.capitalize} library: #{library}"
|
|
245
188
|
end
|
|
246
189
|
end
|
|
247
|
-
cli.puts ''
|
|
248
190
|
end
|
|
249
191
|
|
|
250
|
-
def
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
cli
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
unless test_ruby_gem(cli, paths, pkg)
|
|
263
|
-
raise "Unable to auto-install Ruby gem: #{pkg}"
|
|
264
|
-
end
|
|
265
|
-
end
|
|
192
|
+
def test_library(cli, paths, language, pkg)
|
|
193
|
+
case language
|
|
194
|
+
when :r
|
|
195
|
+
run_r_cmd(cli, paths, "library('#{pkg}')")
|
|
196
|
+
when :ruby
|
|
197
|
+
x = "#{paths['ruby'].shellescape} -r #{pkg.shellescape} -e '' 2>/dev/null"
|
|
198
|
+
run_cmd(cli, x)
|
|
199
|
+
when :python
|
|
200
|
+
x = "#{paths['python3'].shellescape} -c 'import #{pkg}' 2>/dev/null"
|
|
201
|
+
run_cmd(cli, x)
|
|
202
|
+
else
|
|
203
|
+
raise "Unrecognized language: #{language}"
|
|
266
204
|
end
|
|
267
|
-
|
|
205
|
+
$?.success?
|
|
268
206
|
end
|
|
269
207
|
|
|
270
|
-
def
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
208
|
+
def install_library(cli, paths, language, pkg)
|
|
209
|
+
case language
|
|
210
|
+
when :r
|
|
211
|
+
r_cmd = "install.packages('#{pkg}', repos='http://cran.rstudio.com/')"
|
|
212
|
+
run_r_cmd(cli, paths, r_cmd)
|
|
213
|
+
when :ruby
|
|
214
|
+
# This hackey mess is meant to ensure the test and installation are done
|
|
215
|
+
# on the configuration Ruby, not on the Ruby currently executing the
|
|
216
|
+
# init action
|
|
217
|
+
gem_cmd = "Gem::GemRunner.new.run %w(install --user #{pkg})"
|
|
218
|
+
x = "#{paths['ruby'].shellescape} -r rubygems -r rubygems/gem_runner \
|
|
219
|
+
-e #{gem_cmd.shellescape} 2>&1"
|
|
220
|
+
run_cmd(cli, x)
|
|
221
|
+
when :python
|
|
222
|
+
x = "#{paths['python3'].shellescape} \
|
|
223
|
+
-m pip install #{pkg.shellescape} 2>&1"
|
|
224
|
+
run_cmd(cli, x)
|
|
225
|
+
else
|
|
226
|
+
raise "Unrecognized language: #{language}"
|
|
227
|
+
end
|
|
279
228
|
end
|
|
280
229
|
end
|