miga-base 0.7.21.0 → 0.7.24.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/README.md +1 -1
  4. data/Rakefile +1 -0
  5. data/lib/miga/cli/action/add.rb +1 -2
  6. data/lib/miga/cli/action/classify_wf.rb +12 -11
  7. data/lib/miga/cli/action/derep_wf.rb +3 -9
  8. data/lib/miga/cli/action/edit.rb +0 -1
  9. data/lib/miga/cli/action/find.rb +1 -1
  10. data/lib/miga/cli/action/generic.rb +1 -1
  11. data/lib/miga/cli/action/get.rb +7 -2
  12. data/lib/miga/cli/action/get_db.rb +16 -21
  13. data/lib/miga/cli/action/init.rb +41 -93
  14. data/lib/miga/cli/action/init/daemon_helper.rb +1 -2
  15. data/lib/miga/cli/action/init/files_helper.rb +118 -0
  16. data/lib/miga/cli/action/ncbi_get.rb +1 -1
  17. data/lib/miga/cli/action/new.rb +15 -9
  18. data/lib/miga/cli/action/option.rb +44 -0
  19. data/lib/miga/cli/action/quality_wf.rb +3 -3
  20. data/lib/miga/cli/action/tax_dist.rb +1 -1
  21. data/lib/miga/cli/action/tax_test.rb +1 -1
  22. data/lib/miga/cli/action/wf.rb +32 -30
  23. data/lib/miga/cli/base.rb +1 -0
  24. data/lib/miga/cli/objects_helper.rb +23 -18
  25. data/lib/miga/common.rb +4 -2
  26. data/lib/miga/common/net.rb +74 -0
  27. data/lib/miga/common/with_option.rb +83 -0
  28. data/lib/miga/common/with_result.rb +3 -2
  29. data/lib/miga/dataset/base.rb +20 -2
  30. data/lib/miga/dataset/result.rb +3 -2
  31. data/lib/miga/metadata.rb +25 -13
  32. data/lib/miga/project/base.rb +82 -2
  33. data/lib/miga/project/result.rb +4 -4
  34. data/lib/miga/remote_dataset.rb +2 -0
  35. data/lib/miga/result/stats.rb +2 -2
  36. data/lib/miga/version.rb +4 -2
  37. data/scripts/aai_distances.bash +1 -1
  38. data/scripts/ani_distances.bash +1 -1
  39. data/scripts/essential_genes.bash +1 -2
  40. data/scripts/haai_distances.bash +1 -1
  41. data/scripts/mytaxa.bash +6 -5
  42. data/scripts/mytaxa_scan.bash +8 -7
  43. data/scripts/ogs.bash +2 -3
  44. data/scripts/ssu.bash +16 -2
  45. data/test/dataset_test.rb +5 -5
  46. data/test/net_test.rb +34 -0
  47. data/test/with_option_test.rb +115 -0
  48. data/utils/cleanup-databases.rb +2 -3
  49. data/utils/distance/commands.rb +2 -2
  50. data/utils/distance/database.rb +1 -1
  51. data/utils/distance/pipeline.rb +2 -4
  52. data/utils/distance/runner.rb +15 -23
  53. data/utils/index_metadata.rb +1 -2
  54. data/utils/requirements.txt +6 -5
  55. data/utils/subclade/runner.rb +10 -11
  56. metadata +9 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed3a4b61cfc055c8f305438f304257116b7ec3fe92e10af4d00150d6835cf079
4
- data.tar.gz: 9cad53f9a308fbb96d0264932348543339a3d03e096695217b2af85f5b2ac89f
3
+ metadata.gz: 82ca84b468df712ab38eba74071c26e8dcb1d87335764dde2ba86075abc8c8d5
4
+ data.tar.gz: 36583e298fc020faa5cc16af2f6a3fcc88c30619a4f529fd6f03772f6c437bb9
5
5
  SHA512:
6
- metadata.gz: 1507b05bdc37fe6b8f7dc1b7531042d225dc2e79112b3fb9dcb1e4a558e38321a1a8a1203024cb6f956623be928c676fa3c9c1fb971190e2ef6e26328a97d5e5
7
- data.tar.gz: 570bd7b58bc0a6262ef77b1be1a797783b423d76f474fa4840eb146fdbc5fefc12dc5d8abd34f72c4dc7a7cc8ad000fe80005c33af8c9dbcb4232a757f01e07a
6
+ metadata.gz: d78a3709fecba4594d8dc9a2351f217b3605022237e424eb1a194ccf62ddf2059eb1df274f68a15cda74936dfece3f2123485483773172cc62cfba9ff454c5d2
7
+ data.tar.gz: fbf11b04c062701b204f4ba93425dea6f8ff1492fe48f7182472e65b16fccbde98e86d396a79cf51c6e410a246c3b9e9509043eaf952b320191ec086e2efa573
data/Gemfile CHANGED
@@ -1,6 +1,9 @@
1
1
  source "https://rubygems.org"
2
2
  gemspec name: "miga-base"
3
+
3
4
  group :test do
4
5
  gem "simplecov"
5
6
  gem "codeclimate-test-reporter", "~> 1.0.0"
6
7
  end
8
+
9
+ gem "rake", "~> 12.0"
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  [![Code Climate](https://codeclimate.com/github/bio-miga/miga/badges/gpa.svg)](https://codeclimate.com/github/bio-miga/miga)
2
2
  [![Test Coverage](https://codeclimate.com/github/bio-miga/miga/badges/coverage.svg)](https://codeclimate.com/github/bio-miga/miga/coverage)
3
- [![Build Status](https://travis-ci.org/bio-miga/miga.svg?branch=master)](https://travis-ci.org/bio-miga/miga)
3
+ [![Build Status](https://github.com/bio-miga/miga/workflows/build/badge.svg)](https://github.com/bio-miga/miga/actions?query=workflow:build)
4
4
  [![Gem Version](https://badge.fury.io/rb/miga-base.svg)](https://badge.fury.io/rb/miga-base)
5
5
  [![Inch docs](http://inch-ci.org/github/bio-miga/miga.svg)](http://inch-ci.org/github/bio-miga/miga)
6
6
 
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ require 'bundler/gem_tasks'
1
2
  require 'rake/testtask'
2
3
 
3
4
  SOURCES = FileList['lib/**/*.rb']
@@ -65,8 +65,7 @@ class MiGA::Cli::Action::Add < MiGA::Cli::Action
65
65
  next if d.nil?
66
66
 
67
67
  copy_file_to_project(file, file_type, d, p)
68
- d = cli.add_metadata(d)
69
- d.save
68
+ cli.add_metadata(d)
70
69
  p.add_dataset(d.name)
71
70
  res = d.first_preprocessing(true)
72
71
  cli.say " result: #{res}"
@@ -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
- p_metadata = Hash[
53
- %w[project_stats haai_distances aai_distances ani_distances clade_finding]
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[:ref_project] = ref_db.path
57
- p_metadata[:tax_pvalue] = cli[:pvalue]
58
- p = create_project(:assembly, p_metadata,
59
- run_ssu: false, run_mytaxa_scan: false, run_distances: false)
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
- call_cli([
66
- 'ls', '-P', cli[:outdir], '-m', 'tax', '--tab',
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
- unless cli[:threshold] >= 0.0 && cli[:threshold] <= 100.0
64
- raise 'The threshold of identity must be in the range [0,100]'
65
- end
58
+ p.set_option(:gsp_metric, cli[:metric])
59
+ p.set_option(:"gsp_#{cli[:metric]}", cli[:threshold])
66
60
 
67
61
  # Run
68
62
  run_daemon
@@ -34,6 +34,5 @@ class MiGA::Cli::Action::Edit < MiGA::Cli::Action
34
34
  cli[:activate] ? obj.activate! : obj.inactivate!(cli[:reason])
35
35
  end
36
36
  cli.add_metadata(obj)
37
- obj.save
38
37
  end
39
38
  end
@@ -37,7 +37,7 @@ class MiGA::Cli::Action::Find < MiGA::Cli::Action
37
37
  if cli[:add]
38
38
  cli.say "Registering: #{dn}"
39
39
  d = Dataset.new(p, dn, cli[:ref])
40
- d = add_metadata(d)
40
+ add_metadata(d)
41
41
  p.add_dataset(dn)
42
42
  res = d.first_preprocessing(true)
43
43
  cli.say "- #{res}"
@@ -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.VERSION; exit }
23
+ ) { puts MiGA::MiGA.FULL_VERSION; exit }
24
24
  opt.on(
25
25
  '-V', '--long-version',
26
26
  'Show complete MiGA version'
@@ -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 = { query: false, universe: :ncbi, db: :nuccore,
10
- get_md: false, only_md: false }
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: 'ftp://microbial-genomes.org/db',
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
- uri = URI.parse(cli[:host])
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
- filesize = ftp.size(path)
96
- transferred = 0
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.expand_path(cli[:database].to_s, cli[:local])
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)
@@ -1,18 +1,24 @@
1
- # @package MiGA
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 = { mytaxa: nil,
14
- config: File.expand_path('.miga_modules', ENV['HOME']),
15
- ask: false, auto: false, dtype: :bash }
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,13 @@ 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 rc_fh
51
- paths = check_software_requirements rc_fh
52
- check_additional_files paths
53
- check_r_packages paths
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_r_packages(paths)
65
+ check_ruby_gems(paths)
55
66
  configure_daemon
56
- close_rc_file rc_fh
67
+ close_rc_file(rc_fh)
57
68
  cli.puts 'Configuration complete. MiGA is ready to work!'
58
69
  cli.puts ''
59
70
  end
@@ -116,58 +127,18 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
116
127
 
117
128
  private
118
129
 
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
130
  def check_software_requirements(rc_fh)
158
131
  cli.puts 'Looking for requirements:'
159
- ask_for_mytaxa
160
- rc_fh.puts 'export MIGA_MYTAXA="no"' unless cli[:mytaxa]
132
+ ask_for_optional(:mytaxa, 'MyTaxa')
133
+ rc_fh.puts "export MIGA_MYTAXA='#{cli[:mytaxa] ? 'yes' : 'no'}'"
134
+ ask_for_optional(:rdp, 'RDP classifier')
135
+ rc_fh.puts "export MIGA_RDP='#{cli[:rdp] ? 'yes' : 'no'}'"
161
136
  paths = {}
162
137
  rc_fh.puts 'MIGA_PATH=""'
163
138
  req_path = File.expand_path('utils/requirements.txt', MiGA.root_path)
164
139
  File.open(req_path, 'r') do |fh|
165
140
  fh.each_line do |ln|
166
- next if $. < 3
167
-
168
- r = ln.chomp.split(/\t+/)
169
- next if r[0] =~ /\(opt\)$/ && !cli[:mytaxa]
170
-
141
+ r = define_software(ln) or next
171
142
  cli.print "Testing #{r[0]}#{" (#{r[3]})" if r[3]}... "
172
143
  path = find_software(r[1])
173
144
  paths[r[1]] = File.expand_path(r[1], path).shellescape
@@ -178,11 +149,20 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
178
149
  paths
179
150
  end
180
151
 
181
- def ask_for_mytaxa
182
- if cli[:mytaxa].nil?
183
- cli[:mytaxa] =
152
+ def define_software(ln)
153
+ r = ln.chomp.split(/\t+/)
154
+ return if %w[Software --------].include?(r[0])
155
+ return if r[0] =~ /\(mytaxa\)$/ && !cli[:mytaxa]
156
+ return if r[0] =~ /\(rdp\)$/ && !cli[:rdp]
157
+
158
+ r
159
+ end
160
+
161
+ def ask_for_optional(symbol, name)
162
+ if cli[symbol].nil?
163
+ cli[symbol] =
184
164
  cli.ask_user(
185
- 'Should I include MyTaxa modules?',
165
+ "Should I include #{name} modules?",
186
166
  'yes', %w(yes no)
187
167
  ) == 'yes'
188
168
  end
@@ -209,27 +189,6 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
209
189
  path
210
190
  end
211
191
 
212
- def check_additional_files(paths)
213
- if cli[:mytaxa]
214
- cli.puts 'Looking for MyTaxa databases:'
215
- mt = File.dirname paths['MyTaxa']
216
- cli.print 'Looking for scores... '
217
- unless Dir.exist?(File.expand_path('db', mt))
218
- cli.puts "no\nExecute 'python2 #{mt}/utils/download_db.py'"
219
- exit(1)
220
- end
221
- cli.puts 'yes'
222
- cli.print 'Looking for diamond db... '
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)
228
- end
229
- cli.puts ''
230
- end
231
- end
232
-
233
192
  def check_r_packages(paths)
234
193
  cli.puts 'Looking for R packages:'
235
194
  %w(ape cluster vegan).each do |pkg|
@@ -266,15 +225,4 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
266
225
  end
267
226
  cli.puts ''
268
227
  end
269
-
270
- def close_rc_file(rc_fh)
271
- rc_fh.puts <<~FOOT
272
-
273
- MIGA_CONFIG_VERSION='#{MiGA::MiGA.VERSION}'
274
- MIGA_CONFIG_LONGVERSION='#{MiGA::MiGA.LONG_VERSION}'
275
- MIGA_CONFIG_DATE='#{Time.now}'
276
-
277
- FOOT
278
- rc_fh.close
279
- end
280
228
  end
@@ -1,5 +1,4 @@
1
- # @package MiGA
2
- # @license Artistic-2.0
1
+ # frozen_string_literal: true
3
2
 
4
3
  ##
5
4
  # Helper module with daemon configuration functions for MiGA::Cli::Action::Init