miga-base 0.7.23.0 → 0.7.25.3

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.
Files changed (320) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/Rakefile +1 -0
  4. data/lib/miga/cli/action/add.rb +10 -8
  5. data/lib/miga/cli/action/classify_wf.rb +12 -11
  6. data/lib/miga/cli/action/derep_wf.rb +3 -9
  7. data/lib/miga/cli/action/edit.rb +0 -1
  8. data/lib/miga/cli/action/find.rb +1 -1
  9. data/lib/miga/cli/action/generic.rb +1 -1
  10. data/lib/miga/cli/action/get.rb +7 -2
  11. data/lib/miga/cli/action/index_wf.rb +4 -2
  12. data/lib/miga/cli/action/init.rb +60 -59
  13. data/lib/miga/cli/action/init/files_helper.rb +2 -1
  14. data/lib/miga/cli/action/ncbi_get.rb +1 -1
  15. data/lib/miga/cli/action/new.rb +15 -9
  16. data/lib/miga/cli/action/option.rb +63 -0
  17. data/lib/miga/cli/action/preproc_wf.rb +7 -5
  18. data/lib/miga/cli/action/quality_wf.rb +3 -3
  19. data/lib/miga/cli/action/tax_dist.rb +1 -1
  20. data/lib/miga/cli/action/tax_test.rb +1 -1
  21. data/lib/miga/cli/action/wf.rb +72 -54
  22. data/lib/miga/cli/base.rb +17 -5
  23. data/lib/miga/cli/objects_helper.rb +23 -18
  24. data/lib/miga/common.rb +1 -1
  25. data/lib/miga/common/with_option.rb +83 -0
  26. data/lib/miga/common/with_result.rb +2 -1
  27. data/lib/miga/dataset/base.rb +20 -2
  28. data/lib/miga/dataset/result.rb +3 -2
  29. data/lib/miga/metadata.rb +25 -13
  30. data/lib/miga/project/base.rb +82 -2
  31. data/lib/miga/project/result.rb +4 -4
  32. data/lib/miga/result.rb +18 -15
  33. data/lib/miga/result/stats.rb +2 -2
  34. data/lib/miga/version.rb +2 -2
  35. data/scripts/essential_genes.bash +18 -3
  36. data/scripts/miga.bash +8 -2
  37. data/scripts/ogs.bash +2 -3
  38. data/test/dataset_test.rb +5 -5
  39. data/test/lair_test.rb +1 -2
  40. data/test/result_test.rb +22 -0
  41. data/test/with_option_test.rb +115 -0
  42. data/utils/cleanup-databases.rb +1 -2
  43. data/utils/distance/base.rb +9 -0
  44. data/utils/distance/commands.rb +183 -81
  45. data/utils/distance/database.rb +69 -10
  46. data/utils/distance/pipeline.rb +15 -21
  47. data/utils/distance/runner.rb +28 -49
  48. data/utils/distance/temporal.rb +4 -2
  49. data/utils/distances.rb +2 -2
  50. data/utils/index_metadata.rb +1 -2
  51. data/utils/requirements.txt +1 -1
  52. data/utils/subclade/runner.rb +9 -10
  53. metadata +9 -273
  54. data/utils/enveomics/Docs/recplot2.md +0 -244
  55. data/utils/enveomics/Examples/aai-matrix.bash +0 -66
  56. data/utils/enveomics/Examples/ani-matrix.bash +0 -66
  57. data/utils/enveomics/Examples/essential-phylogeny.bash +0 -105
  58. data/utils/enveomics/Examples/unus-genome-phylogeny.bash +0 -100
  59. data/utils/enveomics/LICENSE.txt +0 -73
  60. data/utils/enveomics/Makefile +0 -52
  61. data/utils/enveomics/Manifest/Tasks/aasubs.json +0 -103
  62. data/utils/enveomics/Manifest/Tasks/blasttab.json +0 -786
  63. data/utils/enveomics/Manifest/Tasks/distances.json +0 -161
  64. data/utils/enveomics/Manifest/Tasks/fasta.json +0 -766
  65. data/utils/enveomics/Manifest/Tasks/fastq.json +0 -243
  66. data/utils/enveomics/Manifest/Tasks/graphics.json +0 -126
  67. data/utils/enveomics/Manifest/Tasks/mapping.json +0 -67
  68. data/utils/enveomics/Manifest/Tasks/ogs.json +0 -382
  69. data/utils/enveomics/Manifest/Tasks/other.json +0 -829
  70. data/utils/enveomics/Manifest/Tasks/remote.json +0 -355
  71. data/utils/enveomics/Manifest/Tasks/sequence-identity.json +0 -501
  72. data/utils/enveomics/Manifest/Tasks/tables.json +0 -308
  73. data/utils/enveomics/Manifest/Tasks/trees.json +0 -68
  74. data/utils/enveomics/Manifest/Tasks/variants.json +0 -111
  75. data/utils/enveomics/Manifest/categories.json +0 -156
  76. data/utils/enveomics/Manifest/examples.json +0 -154
  77. data/utils/enveomics/Manifest/tasks.json +0 -4
  78. data/utils/enveomics/Pipelines/assembly.pbs/CONFIG.mock.bash +0 -69
  79. data/utils/enveomics/Pipelines/assembly.pbs/FastA.N50.pl +0 -1
  80. data/utils/enveomics/Pipelines/assembly.pbs/FastA.filterN.pl +0 -1
  81. data/utils/enveomics/Pipelines/assembly.pbs/FastA.length.pl +0 -1
  82. data/utils/enveomics/Pipelines/assembly.pbs/README.md +0 -189
  83. data/utils/enveomics/Pipelines/assembly.pbs/RUNME-2.bash +0 -112
  84. data/utils/enveomics/Pipelines/assembly.pbs/RUNME-3.bash +0 -23
  85. data/utils/enveomics/Pipelines/assembly.pbs/RUNME-4.bash +0 -44
  86. data/utils/enveomics/Pipelines/assembly.pbs/RUNME.bash +0 -50
  87. data/utils/enveomics/Pipelines/assembly.pbs/kSelector.R +0 -37
  88. data/utils/enveomics/Pipelines/assembly.pbs/newbler.pbs +0 -68
  89. data/utils/enveomics/Pipelines/assembly.pbs/newbler_preparator.pl +0 -49
  90. data/utils/enveomics/Pipelines/assembly.pbs/soap.pbs +0 -80
  91. data/utils/enveomics/Pipelines/assembly.pbs/stats.pbs +0 -57
  92. data/utils/enveomics/Pipelines/assembly.pbs/velvet.pbs +0 -63
  93. data/utils/enveomics/Pipelines/blast.pbs/01.pbs.bash +0 -38
  94. data/utils/enveomics/Pipelines/blast.pbs/02.pbs.bash +0 -73
  95. data/utils/enveomics/Pipelines/blast.pbs/03.pbs.bash +0 -21
  96. data/utils/enveomics/Pipelines/blast.pbs/BlastTab.recover_job.pl +0 -72
  97. data/utils/enveomics/Pipelines/blast.pbs/CONFIG.mock.bash +0 -98
  98. data/utils/enveomics/Pipelines/blast.pbs/FastA.split.pl +0 -1
  99. data/utils/enveomics/Pipelines/blast.pbs/README.md +0 -127
  100. data/utils/enveomics/Pipelines/blast.pbs/RUNME.bash +0 -109
  101. data/utils/enveomics/Pipelines/blast.pbs/TASK.check.bash +0 -128
  102. data/utils/enveomics/Pipelines/blast.pbs/TASK.dry.bash +0 -16
  103. data/utils/enveomics/Pipelines/blast.pbs/TASK.eo.bash +0 -22
  104. data/utils/enveomics/Pipelines/blast.pbs/TASK.pause.bash +0 -26
  105. data/utils/enveomics/Pipelines/blast.pbs/TASK.run.bash +0 -89
  106. data/utils/enveomics/Pipelines/blast.pbs/sentinel.pbs.bash +0 -29
  107. data/utils/enveomics/Pipelines/idba.pbs/README.md +0 -49
  108. data/utils/enveomics/Pipelines/idba.pbs/RUNME.bash +0 -95
  109. data/utils/enveomics/Pipelines/idba.pbs/run.pbs +0 -56
  110. data/utils/enveomics/Pipelines/trim.pbs/README.md +0 -54
  111. data/utils/enveomics/Pipelines/trim.pbs/RUNME.bash +0 -70
  112. data/utils/enveomics/Pipelines/trim.pbs/run.pbs +0 -130
  113. data/utils/enveomics/README.md +0 -42
  114. data/utils/enveomics/Scripts/AAsubs.log2ratio.rb +0 -171
  115. data/utils/enveomics/Scripts/Aln.cat.rb +0 -163
  116. data/utils/enveomics/Scripts/Aln.convert.pl +0 -35
  117. data/utils/enveomics/Scripts/AlphaDiversity.pl +0 -152
  118. data/utils/enveomics/Scripts/BedGraph.tad.rb +0 -93
  119. data/utils/enveomics/Scripts/BedGraph.window.rb +0 -71
  120. data/utils/enveomics/Scripts/BlastPairwise.AAsubs.pl +0 -102
  121. data/utils/enveomics/Scripts/BlastTab.addlen.rb +0 -63
  122. data/utils/enveomics/Scripts/BlastTab.advance.bash +0 -48
  123. data/utils/enveomics/Scripts/BlastTab.best_hit_sorted.pl +0 -55
  124. data/utils/enveomics/Scripts/BlastTab.catsbj.pl +0 -104
  125. data/utils/enveomics/Scripts/BlastTab.cogCat.rb +0 -76
  126. data/utils/enveomics/Scripts/BlastTab.filter.pl +0 -47
  127. data/utils/enveomics/Scripts/BlastTab.kegg_pep2path_rest.pl +0 -194
  128. data/utils/enveomics/Scripts/BlastTab.metaxaPrep.pl +0 -104
  129. data/utils/enveomics/Scripts/BlastTab.pairedHits.rb +0 -157
  130. data/utils/enveomics/Scripts/BlastTab.recplot2.R +0 -48
  131. data/utils/enveomics/Scripts/BlastTab.seqdepth.pl +0 -86
  132. data/utils/enveomics/Scripts/BlastTab.seqdepth_ZIP.pl +0 -119
  133. data/utils/enveomics/Scripts/BlastTab.seqdepth_nomedian.pl +0 -86
  134. data/utils/enveomics/Scripts/BlastTab.subsample.pl +0 -47
  135. data/utils/enveomics/Scripts/BlastTab.sumPerHit.pl +0 -114
  136. data/utils/enveomics/Scripts/BlastTab.taxid2taxrank.pl +0 -90
  137. data/utils/enveomics/Scripts/BlastTab.topHits_sorted.rb +0 -101
  138. data/utils/enveomics/Scripts/Chao1.pl +0 -97
  139. data/utils/enveomics/Scripts/CharTable.classify.rb +0 -234
  140. data/utils/enveomics/Scripts/EBIseq2tax.rb +0 -83
  141. data/utils/enveomics/Scripts/FastA.N50.pl +0 -56
  142. data/utils/enveomics/Scripts/FastA.extract.rb +0 -152
  143. data/utils/enveomics/Scripts/FastA.filter.pl +0 -52
  144. data/utils/enveomics/Scripts/FastA.filterLen.pl +0 -28
  145. data/utils/enveomics/Scripts/FastA.filterN.pl +0 -60
  146. data/utils/enveomics/Scripts/FastA.fragment.rb +0 -92
  147. data/utils/enveomics/Scripts/FastA.gc.pl +0 -42
  148. data/utils/enveomics/Scripts/FastA.interpose.pl +0 -93
  149. data/utils/enveomics/Scripts/FastA.length.pl +0 -38
  150. data/utils/enveomics/Scripts/FastA.mask.rb +0 -89
  151. data/utils/enveomics/Scripts/FastA.per_file.pl +0 -36
  152. data/utils/enveomics/Scripts/FastA.qlen.pl +0 -57
  153. data/utils/enveomics/Scripts/FastA.rename.pl +0 -65
  154. data/utils/enveomics/Scripts/FastA.revcom.pl +0 -23
  155. data/utils/enveomics/Scripts/FastA.sample.rb +0 -83
  156. data/utils/enveomics/Scripts/FastA.slider.pl +0 -85
  157. data/utils/enveomics/Scripts/FastA.split.pl +0 -55
  158. data/utils/enveomics/Scripts/FastA.split.rb +0 -79
  159. data/utils/enveomics/Scripts/FastA.subsample.pl +0 -131
  160. data/utils/enveomics/Scripts/FastA.tag.rb +0 -65
  161. data/utils/enveomics/Scripts/FastA.wrap.rb +0 -48
  162. data/utils/enveomics/Scripts/FastQ.filter.pl +0 -54
  163. data/utils/enveomics/Scripts/FastQ.interpose.pl +0 -90
  164. data/utils/enveomics/Scripts/FastQ.offset.pl +0 -90
  165. data/utils/enveomics/Scripts/FastQ.split.pl +0 -53
  166. data/utils/enveomics/Scripts/FastQ.tag.rb +0 -63
  167. data/utils/enveomics/Scripts/FastQ.test-error.rb +0 -81
  168. data/utils/enveomics/Scripts/FastQ.toFastA.awk +0 -24
  169. data/utils/enveomics/Scripts/GFF.catsbj.pl +0 -127
  170. data/utils/enveomics/Scripts/GenBank.add_fields.rb +0 -84
  171. data/utils/enveomics/Scripts/HMM.essential.rb +0 -351
  172. data/utils/enveomics/Scripts/HMM.haai.rb +0 -168
  173. data/utils/enveomics/Scripts/HMMsearch.extractIds.rb +0 -83
  174. data/utils/enveomics/Scripts/JPlace.distances.rb +0 -88
  175. data/utils/enveomics/Scripts/JPlace.to_iToL.rb +0 -320
  176. data/utils/enveomics/Scripts/M5nr.getSequences.rb +0 -81
  177. data/utils/enveomics/Scripts/MeTaxa.distribution.pl +0 -198
  178. data/utils/enveomics/Scripts/MyTaxa.fragsByTax.pl +0 -35
  179. data/utils/enveomics/Scripts/MyTaxa.seq-taxrank.rb +0 -49
  180. data/utils/enveomics/Scripts/NCBIacc2tax.rb +0 -92
  181. data/utils/enveomics/Scripts/Newick.autoprune.R +0 -27
  182. data/utils/enveomics/Scripts/RAxML-EPA.to_iToL.pl +0 -228
  183. data/utils/enveomics/Scripts/RecPlot2.compareIdentities.R +0 -32
  184. data/utils/enveomics/Scripts/RefSeq.download.bash +0 -48
  185. data/utils/enveomics/Scripts/SRA.download.bash +0 -57
  186. data/utils/enveomics/Scripts/TRIBS.plot-test.R +0 -36
  187. data/utils/enveomics/Scripts/TRIBS.test.R +0 -39
  188. data/utils/enveomics/Scripts/Table.barplot.R +0 -31
  189. data/utils/enveomics/Scripts/Table.df2dist.R +0 -30
  190. data/utils/enveomics/Scripts/Table.filter.pl +0 -61
  191. data/utils/enveomics/Scripts/Table.merge.pl +0 -77
  192. data/utils/enveomics/Scripts/Table.replace.rb +0 -69
  193. data/utils/enveomics/Scripts/Table.round.rb +0 -63
  194. data/utils/enveomics/Scripts/Table.split.pl +0 -57
  195. data/utils/enveomics/Scripts/Taxonomy.silva2ncbi.rb +0 -227
  196. data/utils/enveomics/Scripts/VCF.KaKs.rb +0 -147
  197. data/utils/enveomics/Scripts/VCF.SNPs.rb +0 -88
  198. data/utils/enveomics/Scripts/aai.rb +0 -418
  199. data/utils/enveomics/Scripts/ani.rb +0 -362
  200. data/utils/enveomics/Scripts/clust.rand.rb +0 -102
  201. data/utils/enveomics/Scripts/gi2tax.rb +0 -103
  202. data/utils/enveomics/Scripts/in_silico_GA_GI.pl +0 -96
  203. data/utils/enveomics/Scripts/lib/data/dupont_2012_essential.hmm.gz +0 -0
  204. data/utils/enveomics/Scripts/lib/data/lee_2019_essential.hmm.gz +0 -0
  205. data/utils/enveomics/Scripts/lib/enveomics.R +0 -1
  206. data/utils/enveomics/Scripts/lib/enveomics_rb/enveomics.rb +0 -24
  207. data/utils/enveomics/Scripts/lib/enveomics_rb/jplace.rb +0 -253
  208. data/utils/enveomics/Scripts/lib/enveomics_rb/og.rb +0 -182
  209. data/utils/enveomics/Scripts/lib/enveomics_rb/remote_data.rb +0 -74
  210. data/utils/enveomics/Scripts/lib/enveomics_rb/seq_range.rb +0 -237
  211. data/utils/enveomics/Scripts/lib/enveomics_rb/stat.rb +0 -30
  212. data/utils/enveomics/Scripts/lib/enveomics_rb/vcf.rb +0 -135
  213. data/utils/enveomics/Scripts/ogs.annotate.rb +0 -88
  214. data/utils/enveomics/Scripts/ogs.core-pan.rb +0 -160
  215. data/utils/enveomics/Scripts/ogs.extract.rb +0 -125
  216. data/utils/enveomics/Scripts/ogs.mcl.rb +0 -186
  217. data/utils/enveomics/Scripts/ogs.rb +0 -104
  218. data/utils/enveomics/Scripts/ogs.stats.rb +0 -131
  219. data/utils/enveomics/Scripts/rbm.rb +0 -146
  220. data/utils/enveomics/Tests/Makefile +0 -10
  221. data/utils/enveomics/Tests/Mgen_M2288.faa +0 -3189
  222. data/utils/enveomics/Tests/Mgen_M2288.fna +0 -8282
  223. data/utils/enveomics/Tests/Mgen_M2321.fna +0 -8288
  224. data/utils/enveomics/Tests/Nequ_Kin4M.faa +0 -2970
  225. data/utils/enveomics/Tests/Xanthomonas_oryzae-PilA.tribs.Rdata +0 -0
  226. data/utils/enveomics/Tests/Xanthomonas_oryzae-PilA.txt +0 -7
  227. data/utils/enveomics/Tests/Xanthomonas_oryzae.aai-mat.tsv +0 -17
  228. data/utils/enveomics/Tests/Xanthomonas_oryzae.aai.tsv +0 -137
  229. data/utils/enveomics/Tests/a_mg.cds-go.blast.tsv +0 -123
  230. data/utils/enveomics/Tests/a_mg.reads-cds.blast.tsv +0 -200
  231. data/utils/enveomics/Tests/a_mg.reads-cds.counts.tsv +0 -55
  232. data/utils/enveomics/Tests/alkB.nwk +0 -1
  233. data/utils/enveomics/Tests/anthrax-cansnp-data.tsv +0 -13
  234. data/utils/enveomics/Tests/anthrax-cansnp-key.tsv +0 -17
  235. data/utils/enveomics/Tests/hiv1.faa +0 -59
  236. data/utils/enveomics/Tests/hiv1.fna +0 -134
  237. data/utils/enveomics/Tests/hiv2.faa +0 -70
  238. data/utils/enveomics/Tests/hiv_mix-hiv1.blast.tsv +0 -233
  239. data/utils/enveomics/Tests/hiv_mix-hiv1.blast.tsv.lim +0 -1
  240. data/utils/enveomics/Tests/hiv_mix-hiv1.blast.tsv.rec +0 -233
  241. data/utils/enveomics/Tests/phyla_counts.tsv +0 -10
  242. data/utils/enveomics/Tests/primate_lentivirus.ogs +0 -11
  243. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv1-hiv1.rbm +0 -9
  244. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv1-hiv2.rbm +0 -8
  245. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv1-siv.rbm +0 -6
  246. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv2-hiv2.rbm +0 -9
  247. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv2-siv.rbm +0 -6
  248. data/utils/enveomics/Tests/primate_lentivirus.rbm/siv-siv.rbm +0 -6
  249. data/utils/enveomics/build_enveomics_r.bash +0 -45
  250. data/utils/enveomics/enveomics.R/DESCRIPTION +0 -31
  251. data/utils/enveomics/enveomics.R/NAMESPACE +0 -39
  252. data/utils/enveomics/enveomics.R/R/autoprune.R +0 -155
  253. data/utils/enveomics/enveomics.R/R/barplot.R +0 -184
  254. data/utils/enveomics/enveomics.R/R/cliopts.R +0 -135
  255. data/utils/enveomics/enveomics.R/R/df2dist.R +0 -154
  256. data/utils/enveomics/enveomics.R/R/growthcurve.R +0 -331
  257. data/utils/enveomics/enveomics.R/R/recplot.R +0 -354
  258. data/utils/enveomics/enveomics.R/R/recplot2.R +0 -1631
  259. data/utils/enveomics/enveomics.R/R/tribs.R +0 -583
  260. data/utils/enveomics/enveomics.R/R/utils.R +0 -50
  261. data/utils/enveomics/enveomics.R/README.md +0 -80
  262. data/utils/enveomics/enveomics.R/data/growth.curves.rda +0 -0
  263. data/utils/enveomics/enveomics.R/data/phyla.counts.rda +0 -0
  264. data/utils/enveomics/enveomics.R/man/cash-enve.GrowthCurve-method.Rd +0 -17
  265. data/utils/enveomics/enveomics.R/man/cash-enve.RecPlot2-method.Rd +0 -17
  266. data/utils/enveomics/enveomics.R/man/cash-enve.RecPlot2.Peak-method.Rd +0 -17
  267. data/utils/enveomics/enveomics.R/man/enve.GrowthCurve-class.Rd +0 -25
  268. data/utils/enveomics/enveomics.R/man/enve.TRIBS-class.Rd +0 -46
  269. data/utils/enveomics/enveomics.R/man/enve.TRIBS.merge.Rd +0 -23
  270. data/utils/enveomics/enveomics.R/man/enve.TRIBStest-class.Rd +0 -47
  271. data/utils/enveomics/enveomics.R/man/enve.__prune.iter.Rd +0 -23
  272. data/utils/enveomics/enveomics.R/man/enve.__prune.reduce.Rd +0 -23
  273. data/utils/enveomics/enveomics.R/man/enve.__tribs.Rd +0 -32
  274. data/utils/enveomics/enveomics.R/man/enve.barplot.Rd +0 -91
  275. data/utils/enveomics/enveomics.R/man/enve.cliopts.Rd +0 -57
  276. data/utils/enveomics/enveomics.R/man/enve.col.alpha.Rd +0 -24
  277. data/utils/enveomics/enveomics.R/man/enve.col2alpha.Rd +0 -19
  278. data/utils/enveomics/enveomics.R/man/enve.df2dist.Rd +0 -39
  279. data/utils/enveomics/enveomics.R/man/enve.df2dist.group.Rd +0 -38
  280. data/utils/enveomics/enveomics.R/man/enve.df2dist.list.Rd +0 -40
  281. data/utils/enveomics/enveomics.R/man/enve.growthcurve.Rd +0 -67
  282. data/utils/enveomics/enveomics.R/man/enve.prune.dist.Rd +0 -37
  283. data/utils/enveomics/enveomics.R/man/enve.recplot.Rd +0 -122
  284. data/utils/enveomics/enveomics.R/man/enve.recplot2-class.Rd +0 -45
  285. data/utils/enveomics/enveomics.R/man/enve.recplot2.ANIr.Rd +0 -24
  286. data/utils/enveomics/enveomics.R/man/enve.recplot2.Rd +0 -68
  287. data/utils/enveomics/enveomics.R/man/enve.recplot2.__counts.Rd +0 -25
  288. data/utils/enveomics/enveomics.R/man/enve.recplot2.__peakHist.Rd +0 -21
  289. data/utils/enveomics/enveomics.R/man/enve.recplot2.__whichClosestPeak.Rd +0 -19
  290. data/utils/enveomics/enveomics.R/man/enve.recplot2.changeCutoff.Rd +0 -19
  291. data/utils/enveomics/enveomics.R/man/enve.recplot2.compareIdentities.Rd +0 -41
  292. data/utils/enveomics/enveomics.R/man/enve.recplot2.coordinates.Rd +0 -29
  293. data/utils/enveomics/enveomics.R/man/enve.recplot2.corePeak.Rd +0 -18
  294. data/utils/enveomics/enveomics.R/man/enve.recplot2.extractWindows.Rd +0 -40
  295. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.Rd +0 -36
  296. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__em_e.Rd +0 -19
  297. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__em_m.Rd +0 -19
  298. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__emauto_one.Rd +0 -27
  299. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__mow_one.Rd +0 -41
  300. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__mower.Rd +0 -17
  301. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.em.Rd +0 -43
  302. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.emauto.Rd +0 -37
  303. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.mower.Rd +0 -74
  304. data/utils/enveomics/enveomics.R/man/enve.recplot2.peak-class.Rd +0 -59
  305. data/utils/enveomics/enveomics.R/man/enve.recplot2.seqdepth.Rd +0 -27
  306. data/utils/enveomics/enveomics.R/man/enve.recplot2.windowDepthThreshold.Rd +0 -32
  307. data/utils/enveomics/enveomics.R/man/enve.tribs.Rd +0 -59
  308. data/utils/enveomics/enveomics.R/man/enve.tribs.test.Rd +0 -28
  309. data/utils/enveomics/enveomics.R/man/enve.truncate.Rd +0 -27
  310. data/utils/enveomics/enveomics.R/man/growth.curves.Rd +0 -14
  311. data/utils/enveomics/enveomics.R/man/phyla.counts.Rd +0 -13
  312. data/utils/enveomics/enveomics.R/man/plot.enve.GrowthCurve.Rd +0 -63
  313. data/utils/enveomics/enveomics.R/man/plot.enve.TRIBS.Rd +0 -38
  314. data/utils/enveomics/enveomics.R/man/plot.enve.TRIBStest.Rd +0 -38
  315. data/utils/enveomics/enveomics.R/man/plot.enve.recplot2.Rd +0 -111
  316. data/utils/enveomics/enveomics.R/man/summary.enve.GrowthCurve.Rd +0 -19
  317. data/utils/enveomics/enveomics.R/man/summary.enve.TRIBS.Rd +0 -19
  318. data/utils/enveomics/enveomics.R/man/summary.enve.TRIBStest.Rd +0 -19
  319. data/utils/enveomics/globals.mk +0 -8
  320. data/utils/enveomics/manifest.json +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6ed8981c0dfc266aea53be66e06b77eaf277444a094ef460021c2713aef3bf73
4
- data.tar.gz: d9f0bd3934dd5e3ba27cb58adfd1236a74ba6b003a06cd74b9da96e594a27e99
3
+ metadata.gz: 47313defda91b1a031e7700e193fadf688a0115deedf77e40013c16e79bb8b49
4
+ data.tar.gz: ab6ea787eee6aed1c28ca09a97c8d580b23985fb3961dbf3fa7a33fb2a14f4e5
5
5
  SHA512:
6
- metadata.gz: f40242b96f36ce5528e2206aa4f366d047b5969a45d69cff5ac825297563f9adddaee957e562eddae34c96b8a0651fd2fec39a42d2cd278d66ea03ac35afabfc
7
- data.tar.gz: ab01b09ab020c1bfcf5dd5be7a01c971e83e02066ad35f4b6a9f0c525351c81b5cdb0e80910cf4237b9e59a33c518995a073c1f625f049b6b722802541d11c1f
6
+ metadata.gz: b152125992f0ece34a0a1d59ccd3d69ed5c931c5fada4a167a12bf3e53054505bde9974fc7e43d32c1164a8d9f89b69135638d71c572b015b04a311bb38540a4
7
+ data.tar.gz: 9a5493e2d025a4c245ed9b33a2059f529b6ff265274685d602869180538895807034cb24d1628a2f7ed2a9e9124f9b6097d49ad845f736c7c05355cc4bcf7add
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/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ require 'bundler/gem_tasks'
1
2
  require 'rake/testtask'
2
3
 
3
4
  SOURCES = FileList['lib/**/*.rb']
@@ -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
- "By default: '#{cli[:regexp]}'"
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
- d = cli.add_metadata(d)
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
- 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].to_s)
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]
@@ -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(opt, 'Input genome assemblies (nucleotides, FastA)',
20
- cleanup: false, project_type: true)
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
 
@@ -61,8 +61,7 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
61
61
  check_configuration_script(rc_fh)
62
62
  paths = check_software_requirements(rc_fh)
63
63
  check_additional_files(paths)
64
- check_r_packages(paths)
65
- check_ruby_gems(paths)
64
+ check_libraries(paths)
66
65
  configure_daemon
67
66
  close_rc_file(rc_fh)
68
67
  cli.puts 'Configuration complete. MiGA is ready to work!'
@@ -83,34 +82,6 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
83
82
  )
84
83
  end
85
84
 
86
- def test_r_package(cli, paths, pkg)
87
- run_r_cmd(cli, paths, "library('#{pkg}')")
88
- $?.success?
89
- end
90
-
91
- def install_r_package(cli, paths, pkg)
92
- r_cmd = "install.packages('#{pkg}', repos='http://cran.rstudio.com/')"
93
- run_r_cmd(cli, paths, r_cmd)
94
- end
95
-
96
- def test_ruby_gem(cli, paths, pkg)
97
- run_cmd(
98
- cli,
99
- "#{paths['ruby'].shellescape} -r #{pkg.shellescape} -e '' 2>/dev/null"
100
- )
101
- $?.success?
102
- end
103
-
104
- def install_ruby_gem(cli, paths, pkg)
105
- gem_cmd = "Gem::GemRunner.new.run %w(install --user #{pkg})"
106
- run_cmd(
107
- cli,
108
- "#{paths['ruby'].shellescape} \
109
- -r rubygems -r rubygems/gem_runner \
110
- -e #{gem_cmd.shellescape} 2>&1"
111
- )
112
- end
113
-
114
85
  def list_requirements
115
86
  if cli.ask_user(
116
87
  'Would you like to see all the requirements before starting?',
@@ -189,40 +160,70 @@ class MiGA::Cli::Action::Init < MiGA::Cli::Action
189
160
  path
190
161
  end
191
162
 
192
- def check_r_packages(paths)
193
- cli.puts 'Looking for R packages:'
194
- %w(ape cluster vegan).each do |pkg|
195
- cli.print "Testing #{pkg}... "
196
- if test_r_package(cli, paths, pkg)
197
- cli.puts 'yes'
198
- else
199
- cli.puts 'no, installing'
200
- cli.print '' + install_r_package(cli, paths, pkg)
201
- unless test_r_package(cli, paths, pkg)
202
- raise "Unable to auto-install R package: #{pkg}"
203
- end
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)
204
174
  end
175
+ cli.puts ''
205
176
  end
206
- cli.puts ''
207
177
  end
208
178
 
209
- def check_ruby_gems(paths)
210
- cli.puts 'Looking for Ruby gems:'
211
- %w(sqlite3 daemons json).each do |pkg|
212
- cli.print "Testing #{pkg}... "
213
- if test_ruby_gem(cli, paths, pkg)
214
- cli.puts 'yes'
215
- else
216
- cli.puts 'no, installing'
217
- # This hackey mess is meant to ensure the test and installation are done
218
- # on the configuration Ruby, not on the Ruby currently executing the
219
- # init action
220
- cli.print install_ruby_gem(cli, paths, pkg)
221
- unless test_ruby_gem(cli, paths, pkg)
222
- raise "Unable to auto-install Ruby gem: #{pkg}"
223
- 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}"
224
188
  end
225
189
  end
226
- cli.puts ''
190
+ end
191
+
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}"
204
+ end
205
+ $?.success?
206
+ end
207
+
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 --user #{pkg.shellescape} 2>&1"
224
+ run_cmd(cli, x)
225
+ else
226
+ raise "Unrecognized language: #{language}"
227
+ end
227
228
  end
228
229
  end
@@ -26,7 +26,7 @@ module MiGA::Cli::Action::Init::FilesHelper
26
26
  def close_rc_file(rc_fh)
27
27
  rc_fh.puts <<~FOOT
28
28
 
29
- MIGA_CONFIG_VERSION='#{MiGA::MiGA.VERSION}'
29
+ MIGA_CONFIG_VERSION='#{MiGA::MiGA.FULL_VERSION}'
30
30
  MIGA_CONFIG_LONGVERSION='#{MiGA::MiGA.LONG_VERSION}'
31
31
  MIGA_CONFIG_DATE='#{Time.now}'
32
32
 
@@ -59,6 +59,7 @@ module MiGA::Cli::Action::Init::FilesHelper
59
59
  end
60
60
  check_rdp_classifier if cli[:rdp]
61
61
  check_phyla_lite
62
+ cli.puts ''
62
63
  end
63
64
 
64
65
  def check_mytaxa_scores(paths)
@@ -269,7 +269,7 @@ class MiGA::Cli::Action::NcbiGet < MiGA::Cli::Action
269
269
  else
270
270
  cli.say ' Creating dataset'
271
271
  rd.save_to(p, name, !cli[:query], body[:md])
272
- cli.add_metadata(p.add_dataset(name)).save
272
+ cli.add_metadata(p.add_dataset(name))
273
273
  end
274
274
  end
275
275
  end
@@ -24,6 +24,11 @@ class MiGA::Cli::Action::New < MiGA::Cli::Action
24
24
  'Use faster identity engines (Diamond-AAI and FastANI)',
25
25
  'Equivalent to: -m aai_p=diamond,ani_p=fastani'
26
26
  ) { |v| cli[:fast] = v }
27
+ opt.on(
28
+ '--sensitive',
29
+ 'Use more sensitive identity engines (BLAST+)',
30
+ 'Equivalent to: -m aai_p=blast+,ani_p=blast+'
31
+ ) { |v| cli[:sensitive] = v }
27
32
  opt.on(
28
33
  '-m', '--metadata STRING',
29
34
  'Metadata as key-value pairs separated by = and delimited by comma',
@@ -35,20 +40,21 @@ class MiGA::Cli::Action::New < MiGA::Cli::Action
35
40
  def perform
36
41
  cli.ensure_type(MiGA::Project)
37
42
  cli.ensure_par(project: '-P')
38
- unless File.exist?(File.join(ENV['HOME'], '.miga_rc')) &&
39
- File.exist?(File.join(ENV['HOME'], '.miga_daemon.json'))
40
- raise "You must initialize MiGA before creating the first project.\n" +
41
- 'Please use "miga init".'
43
+ unless MiGA::MiGA.initialized?
44
+ raise 'MiGA has not been initialized, please use "miga init" first'
42
45
  end
43
46
  cli.say "Creating project: #{cli[:project]}"
44
- raise 'Project already exists, aborting.' if Project.exist? cli[:project]
47
+ raise 'Project already exists, aborting' if Project.exist?(cli[:project])
45
48
 
46
49
  p = Project.new(cli[:project], false)
47
50
  p = cli.add_metadata(p)
48
- if cli[:fast]
49
- p.metadata[:aai_p] = 'diamond'
50
- p.metadata[:ani_p] = 'fastani'
51
+
52
+ if cli[:sensitive]
53
+ p.set_option(:aai_p, 'blast+')
54
+ p.set_option(:ani_p, 'blast+')
55
+ elsif cli[:fast]
56
+ p.set_option(:aai_p, 'diamond')
57
+ p.set_option(:ani_p, 'fastani')
51
58
  end
52
- p.save
53
59
  end
54
60
  end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'miga/cli/action'
4
+
5
+ ##
6
+ # CLI: `miga option`
7
+ class MiGA::Cli::Action::Option < MiGA::Cli::Action
8
+ def parse_cli
9
+ cli.parse do |opt|
10
+ cli.opt_object(opt, %i[project dataset_opt])
11
+ opt.on(
12
+ '-k', '--key STRING',
13
+ 'Option name to get or set (by default, all options are printed)'
14
+ ) { |v| cli[:key] = v }
15
+ opt.on(
16
+ '--value STRING',
17
+ 'Value of the option to set (by default, option value is not changed)',
18
+ 'Recognized tokens: nil, true, false'
19
+ ) { |v| cli[:value] = v }
20
+ opt.on(
21
+ '--about',
22
+ 'Print additional information about the values supported by this option'
23
+ ) { |v| cli[:about] = v }
24
+ opt.on(
25
+ '--tab',
26
+ 'Return a tab-delimited table'
27
+ ) { |v| cli[:tabular] = v }
28
+ opt.on(
29
+ '-o', '--output PATH',
30
+ 'Create output file instead of returning to STDOUT'
31
+ ) { |v| cli[:output] = v }
32
+ end
33
+ end
34
+
35
+ def perform
36
+ unless cli[:value].nil?
37
+ cli.ensure_par(
38
+ { key: '-k' },
39
+ '%<name>s is mandatory when --value is set: provide %<flag>s'
40
+ )
41
+ end
42
+ obj = cli.load_project_or_dataset
43
+ io = cli[:output].nil? ? $stdout : File.open(cli[:output], 'w')
44
+ if cli[:key].nil?
45
+ opts = obj.all_options
46
+ .map { |k, v| [k, v, obj.assert_has_option(k)[:desc]] }
47
+ cli.table(%w[Key Value Definition], opts, io)
48
+ elsif cli[:about]
49
+ opt = obj.assert_has_option(cli[:key])
50
+ title = "#{cli[:key]}: #{opt[:desc]}"
51
+ io.puts title
52
+ io.puts '-' * title.length
53
+ opt.each do |k, v|
54
+ v = v[obj] if v.is_a? Proc
55
+ io.puts "#{k.to_s.capitalize}: #{v}" unless k == :desc
56
+ end
57
+ else
58
+ obj.set_option(cli[:key], cli[:value], true) unless cli[:value].nil?
59
+ io.puts obj.option(cli[:key])
60
+ end
61
+ io.close unless cli[:output].nil?
62
+ end
63
+ end