BioDSL 1.0.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 +7 -0
- data/.gitignore +10 -0
- data/BioDSL.gemspec +64 -0
- data/LICENSE +339 -0
- data/README.md +205 -0
- data/Rakefile +94 -0
- data/examples/fastq_to_fasta.rb +8 -0
- data/lib/BioDSL/cary.rb +242 -0
- data/lib/BioDSL/command.rb +133 -0
- data/lib/BioDSL/commands/add_key.rb +110 -0
- data/lib/BioDSL/commands/align_seq_mothur.rb +194 -0
- data/lib/BioDSL/commands/analyze_residue_distribution.rb +222 -0
- data/lib/BioDSL/commands/assemble_pairs.rb +336 -0
- data/lib/BioDSL/commands/assemble_seq_idba.rb +230 -0
- data/lib/BioDSL/commands/assemble_seq_ray.rb +345 -0
- data/lib/BioDSL/commands/assemble_seq_spades.rb +252 -0
- data/lib/BioDSL/commands/classify_seq.rb +217 -0
- data/lib/BioDSL/commands/classify_seq_mothur.rb +226 -0
- data/lib/BioDSL/commands/clip_primer.rb +318 -0
- data/lib/BioDSL/commands/cluster_otus.rb +181 -0
- data/lib/BioDSL/commands/collapse_otus.rb +170 -0
- data/lib/BioDSL/commands/collect_otus.rb +150 -0
- data/lib/BioDSL/commands/complement_seq.rb +117 -0
- data/lib/BioDSL/commands/count.rb +135 -0
- data/lib/BioDSL/commands/count_values.rb +149 -0
- data/lib/BioDSL/commands/degap_seq.rb +253 -0
- data/lib/BioDSL/commands/dereplicate_seq.rb +168 -0
- data/lib/BioDSL/commands/dump.rb +157 -0
- data/lib/BioDSL/commands/filter_rrna.rb +239 -0
- data/lib/BioDSL/commands/genecall.rb +237 -0
- data/lib/BioDSL/commands/grab.rb +535 -0
- data/lib/BioDSL/commands/index_taxonomy.rb +226 -0
- data/lib/BioDSL/commands/mask_seq.rb +175 -0
- data/lib/BioDSL/commands/mean_scores.rb +168 -0
- data/lib/BioDSL/commands/merge_pair_seq.rb +175 -0
- data/lib/BioDSL/commands/merge_table.rb +225 -0
- data/lib/BioDSL/commands/merge_values.rb +113 -0
- data/lib/BioDSL/commands/plot_heatmap.rb +233 -0
- data/lib/BioDSL/commands/plot_histogram.rb +306 -0
- data/lib/BioDSL/commands/plot_matches.rb +282 -0
- data/lib/BioDSL/commands/plot_residue_distribution.rb +278 -0
- data/lib/BioDSL/commands/plot_scores.rb +285 -0
- data/lib/BioDSL/commands/random.rb +153 -0
- data/lib/BioDSL/commands/read_fasta.rb +222 -0
- data/lib/BioDSL/commands/read_fastq.rb +414 -0
- data/lib/BioDSL/commands/read_table.rb +329 -0
- data/lib/BioDSL/commands/reverse_seq.rb +113 -0
- data/lib/BioDSL/commands/slice_align.rb +400 -0
- data/lib/BioDSL/commands/slice_seq.rb +151 -0
- data/lib/BioDSL/commands/sort.rb +223 -0
- data/lib/BioDSL/commands/split_pair_seq.rb +220 -0
- data/lib/BioDSL/commands/split_values.rb +165 -0
- data/lib/BioDSL/commands/trim_primer.rb +314 -0
- data/lib/BioDSL/commands/trim_seq.rb +192 -0
- data/lib/BioDSL/commands/uchime_ref.rb +170 -0
- data/lib/BioDSL/commands/uclust.rb +286 -0
- data/lib/BioDSL/commands/unique_values.rb +145 -0
- data/lib/BioDSL/commands/usearch_global.rb +171 -0
- data/lib/BioDSL/commands/usearch_local.rb +171 -0
- data/lib/BioDSL/commands/write_fasta.rb +207 -0
- data/lib/BioDSL/commands/write_fastq.rb +191 -0
- data/lib/BioDSL/commands/write_table.rb +419 -0
- data/lib/BioDSL/commands/write_tree.rb +167 -0
- data/lib/BioDSL/commands.rb +31 -0
- data/lib/BioDSL/config.rb +55 -0
- data/lib/BioDSL/csv.rb +307 -0
- data/lib/BioDSL/debug.rb +42 -0
- data/lib/BioDSL/fasta.rb +133 -0
- data/lib/BioDSL/fastq.rb +77 -0
- data/lib/BioDSL/filesys.rb +137 -0
- data/lib/BioDSL/fork.rb +145 -0
- data/lib/BioDSL/hamming.rb +128 -0
- data/lib/BioDSL/helpers/aux_helper.rb +44 -0
- data/lib/BioDSL/helpers/email_helper.rb +66 -0
- data/lib/BioDSL/helpers/history_helper.rb +40 -0
- data/lib/BioDSL/helpers/log_helper.rb +55 -0
- data/lib/BioDSL/helpers/options_helper.rb +405 -0
- data/lib/BioDSL/helpers/status_helper.rb +132 -0
- data/lib/BioDSL/helpers.rb +35 -0
- data/lib/BioDSL/html_report.rb +200 -0
- data/lib/BioDSL/math.rb +55 -0
- data/lib/BioDSL/mummer.rb +216 -0
- data/lib/BioDSL/pipeline.rb +354 -0
- data/lib/BioDSL/seq/ambiguity.rb +66 -0
- data/lib/BioDSL/seq/assemble.rb +240 -0
- data/lib/BioDSL/seq/backtrack.rb +252 -0
- data/lib/BioDSL/seq/digest.rb +99 -0
- data/lib/BioDSL/seq/dynamic.rb +263 -0
- data/lib/BioDSL/seq/homopolymer.rb +59 -0
- data/lib/BioDSL/seq/kmer.rb +293 -0
- data/lib/BioDSL/seq/levenshtein.rb +113 -0
- data/lib/BioDSL/seq/translate.rb +109 -0
- data/lib/BioDSL/seq/trim.rb +188 -0
- data/lib/BioDSL/seq.rb +742 -0
- data/lib/BioDSL/serializer.rb +98 -0
- data/lib/BioDSL/stream.rb +113 -0
- data/lib/BioDSL/taxonomy.rb +691 -0
- data/lib/BioDSL/test.rb +42 -0
- data/lib/BioDSL/tmp_dir.rb +68 -0
- data/lib/BioDSL/usearch.rb +301 -0
- data/lib/BioDSL/verbose.rb +42 -0
- data/lib/BioDSL/version.rb +31 -0
- data/lib/BioDSL.rb +81 -0
- data/test/BioDSL/commands/test_add_key.rb +105 -0
- data/test/BioDSL/commands/test_align_seq_mothur.rb +99 -0
- data/test/BioDSL/commands/test_analyze_residue_distribution.rb +134 -0
- data/test/BioDSL/commands/test_assemble_pairs.rb +459 -0
- data/test/BioDSL/commands/test_assemble_seq_idba.rb +50 -0
- data/test/BioDSL/commands/test_assemble_seq_ray.rb +51 -0
- data/test/BioDSL/commands/test_assemble_seq_spades.rb +50 -0
- data/test/BioDSL/commands/test_classify_seq.rb +50 -0
- data/test/BioDSL/commands/test_classify_seq_mothur.rb +59 -0
- data/test/BioDSL/commands/test_clip_primer.rb +377 -0
- data/test/BioDSL/commands/test_cluster_otus.rb +128 -0
- data/test/BioDSL/commands/test_collapse_otus.rb +81 -0
- data/test/BioDSL/commands/test_collect_otus.rb +82 -0
- data/test/BioDSL/commands/test_complement_seq.rb +78 -0
- data/test/BioDSL/commands/test_count.rb +103 -0
- data/test/BioDSL/commands/test_count_values.rb +85 -0
- data/test/BioDSL/commands/test_degap_seq.rb +96 -0
- data/test/BioDSL/commands/test_dereplicate_seq.rb +92 -0
- data/test/BioDSL/commands/test_dump.rb +109 -0
- data/test/BioDSL/commands/test_filter_rrna.rb +128 -0
- data/test/BioDSL/commands/test_genecall.rb +50 -0
- data/test/BioDSL/commands/test_grab.rb +398 -0
- data/test/BioDSL/commands/test_index_taxonomy.rb +62 -0
- data/test/BioDSL/commands/test_mask_seq.rb +98 -0
- data/test/BioDSL/commands/test_mean_scores.rb +111 -0
- data/test/BioDSL/commands/test_merge_pair_seq.rb +115 -0
- data/test/BioDSL/commands/test_merge_table.rb +131 -0
- data/test/BioDSL/commands/test_merge_values.rb +83 -0
- data/test/BioDSL/commands/test_plot_heatmap.rb +185 -0
- data/test/BioDSL/commands/test_plot_histogram.rb +194 -0
- data/test/BioDSL/commands/test_plot_matches.rb +157 -0
- data/test/BioDSL/commands/test_plot_residue_distribution.rb +309 -0
- data/test/BioDSL/commands/test_plot_scores.rb +308 -0
- data/test/BioDSL/commands/test_random.rb +88 -0
- data/test/BioDSL/commands/test_read_fasta.rb +229 -0
- data/test/BioDSL/commands/test_read_fastq.rb +552 -0
- data/test/BioDSL/commands/test_read_table.rb +327 -0
- data/test/BioDSL/commands/test_reverse_seq.rb +79 -0
- data/test/BioDSL/commands/test_slice_align.rb +218 -0
- data/test/BioDSL/commands/test_slice_seq.rb +131 -0
- data/test/BioDSL/commands/test_sort.rb +128 -0
- data/test/BioDSL/commands/test_split_pair_seq.rb +164 -0
- data/test/BioDSL/commands/test_split_values.rb +95 -0
- data/test/BioDSL/commands/test_trim_primer.rb +329 -0
- data/test/BioDSL/commands/test_trim_seq.rb +150 -0
- data/test/BioDSL/commands/test_uchime_ref.rb +113 -0
- data/test/BioDSL/commands/test_uclust.rb +139 -0
- data/test/BioDSL/commands/test_unique_values.rb +98 -0
- data/test/BioDSL/commands/test_usearch_global.rb +123 -0
- data/test/BioDSL/commands/test_usearch_local.rb +125 -0
- data/test/BioDSL/commands/test_write_fasta.rb +159 -0
- data/test/BioDSL/commands/test_write_fastq.rb +166 -0
- data/test/BioDSL/commands/test_write_table.rb +411 -0
- data/test/BioDSL/commands/test_write_tree.rb +122 -0
- data/test/BioDSL/helpers/test_options_helper.rb +272 -0
- data/test/BioDSL/seq/test_assemble.rb +98 -0
- data/test/BioDSL/seq/test_backtrack.rb +176 -0
- data/test/BioDSL/seq/test_digest.rb +71 -0
- data/test/BioDSL/seq/test_dynamic.rb +133 -0
- data/test/BioDSL/seq/test_homopolymer.rb +58 -0
- data/test/BioDSL/seq/test_kmer.rb +134 -0
- data/test/BioDSL/seq/test_translate.rb +75 -0
- data/test/BioDSL/seq/test_trim.rb +101 -0
- data/test/BioDSL/test_cary.rb +176 -0
- data/test/BioDSL/test_command.rb +45 -0
- data/test/BioDSL/test_csv.rb +514 -0
- data/test/BioDSL/test_debug.rb +42 -0
- data/test/BioDSL/test_fasta.rb +154 -0
- data/test/BioDSL/test_fastq.rb +46 -0
- data/test/BioDSL/test_filesys.rb +145 -0
- data/test/BioDSL/test_fork.rb +85 -0
- data/test/BioDSL/test_math.rb +41 -0
- data/test/BioDSL/test_mummer.rb +79 -0
- data/test/BioDSL/test_pipeline.rb +187 -0
- data/test/BioDSL/test_seq.rb +790 -0
- data/test/BioDSL/test_serializer.rb +72 -0
- data/test/BioDSL/test_stream.rb +55 -0
- data/test/BioDSL/test_taxonomy.rb +336 -0
- data/test/BioDSL/test_test.rb +42 -0
- data/test/BioDSL/test_tmp_dir.rb +58 -0
- data/test/BioDSL/test_usearch.rb +33 -0
- data/test/BioDSL/test_verbose.rb +42 -0
- data/test/helper.rb +82 -0
- data/www/command.html.haml +14 -0
- data/www/css.html.haml +55 -0
- data/www/input_files.html.haml +3 -0
- data/www/layout.html.haml +12 -0
- data/www/output_files.html.haml +3 -0
- data/www/overview.html.haml +15 -0
- data/www/pipeline.html.haml +4 -0
- data/www/png.html.haml +2 -0
- data/www/status.html.haml +9 -0
- data/www/time.html.haml +11 -0
- metadata +503 -0
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
|
|
2
|
+
# #
|
|
3
|
+
# Copyright (C) 2007-2015 Martin Asser Hansen (mail@maasha.dk). #
|
|
4
|
+
# #
|
|
5
|
+
# This program is free software; you can redistribute it and/or #
|
|
6
|
+
# modify it under the terms of the GNU General Public License #
|
|
7
|
+
# as published by the Free Software Foundation; either version 2 #
|
|
8
|
+
# of the License, or (at your option) any later version. #
|
|
9
|
+
# #
|
|
10
|
+
# This program is distributed in the hope that it will be useful, #
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
|
13
|
+
# GNU General Public License for more details. #
|
|
14
|
+
# #
|
|
15
|
+
# You should have received a copy of the GNU General Public License #
|
|
16
|
+
# along with this program; if not, write to the Free Software #
|
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, #
|
|
18
|
+
# USA. #
|
|
19
|
+
# #
|
|
20
|
+
# http://www.gnu.org/copyleft/gpl.html #
|
|
21
|
+
# #
|
|
22
|
+
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
|
|
23
|
+
# #
|
|
24
|
+
# This software is part of BioDSL (www.github.com/maasha/BioDSL). #
|
|
25
|
+
# #
|
|
26
|
+
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
|
|
27
|
+
module BioDSL
|
|
28
|
+
# Module containing methods to check options in various ways.
|
|
29
|
+
module OptionsHelper
|
|
30
|
+
require 'csv'
|
|
31
|
+
|
|
32
|
+
BioDSL::OptionError = Class.new(StandardError)
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
# Method that fails if options include any non-allowed options.
|
|
37
|
+
#
|
|
38
|
+
# @param options [Hash] The Hash with options to be checked.
|
|
39
|
+
# @param allowed [Symbol, Array] One or more allowed options.
|
|
40
|
+
#
|
|
41
|
+
# @example That raises:
|
|
42
|
+
# options_allowed({foo: 'bar'}, :foobar)
|
|
43
|
+
#
|
|
44
|
+
# @example That passes:
|
|
45
|
+
# options_allowed({foo: 'bar'}, :foo, :one)
|
|
46
|
+
#
|
|
47
|
+
# @raise [BioDSL::OptionError] If non-allowed options located.
|
|
48
|
+
def options_allowed(options, *allowed)
|
|
49
|
+
options.each_key do |option|
|
|
50
|
+
unless allowed.include? option
|
|
51
|
+
fail BioDSL::OptionError, "Disallowed option: #{option}. " \
|
|
52
|
+
"Allowed options: #{allowed.join(', ')}"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Method that raises if options include any non-allowed values.
|
|
58
|
+
#
|
|
59
|
+
# @param options [Hash] The Hash with options to be checked.
|
|
60
|
+
# @param allowed [Symbol, Array] One or more allowed options.
|
|
61
|
+
#
|
|
62
|
+
# @example That raises:
|
|
63
|
+
# options_allowed_values({foo: 'bar'}, foo: 1)
|
|
64
|
+
#
|
|
65
|
+
# @example That passes:
|
|
66
|
+
# options_allowed_values({foo: 'bar'}, foo: ['bar', 'rab'])
|
|
67
|
+
#
|
|
68
|
+
# @raise [BioDSL::OptionError] If non-allowed options located.
|
|
69
|
+
def options_allowed_values(options, allowed)
|
|
70
|
+
allowed.each do |key, values|
|
|
71
|
+
next unless options[key]
|
|
72
|
+
|
|
73
|
+
unless values.include? options[key]
|
|
74
|
+
fail BioDSL::OptionError, 'Disallowed option value: ' \
|
|
75
|
+
"#{options[key]}. Allowed options: #{values.join(', ')}"
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Method that raises if options don't include all required options.
|
|
81
|
+
#
|
|
82
|
+
# @param options [Hash] The Hash with options to be checked.
|
|
83
|
+
# @param required [Symbol, Array] One or more required options.
|
|
84
|
+
#
|
|
85
|
+
# @example That raises:
|
|
86
|
+
# options_required({foo: 'bar'}, foo: 1)
|
|
87
|
+
#
|
|
88
|
+
# @example That passes:
|
|
89
|
+
# options_required({foo: 'bar', one: 'two'}, :foo, :one)
|
|
90
|
+
#
|
|
91
|
+
# @raise [BioDSL::OptionError] Unless all required options are given.
|
|
92
|
+
def options_required(options, *required)
|
|
93
|
+
required.each do |option|
|
|
94
|
+
unless options[option]
|
|
95
|
+
fail BioDSL::OptionError, "Required option missing: #{option}. " \
|
|
96
|
+
"Required options: #{required.join(', ')}"
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Method that raises if options include multiple required options.
|
|
102
|
+
#
|
|
103
|
+
# @param options [Hash] The Hash with options to be checked.
|
|
104
|
+
# @param unique [Symbol, Array] Options that must be unique.
|
|
105
|
+
#
|
|
106
|
+
# @example That raises:
|
|
107
|
+
# options_required_unique({foo: 'bar', one: 'two'}, :foo, :one)
|
|
108
|
+
#
|
|
109
|
+
# @example That passes:
|
|
110
|
+
# options_required_unique({foo: 'bar', one: 'two'}, :foo)
|
|
111
|
+
#
|
|
112
|
+
# @raise [BioDSL::OptionError] If multiple required options are found.
|
|
113
|
+
def options_required_unique(options, *unique)
|
|
114
|
+
return unless unique.select { |option| options[option] }.size > 1
|
|
115
|
+
|
|
116
|
+
fail BioDSL::OptionError, 'Multiple required uniques options ' \
|
|
117
|
+
"used: #{unique.join(', ')}"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Method that raises if options include non-unique options.
|
|
121
|
+
#
|
|
122
|
+
# @param options [Hash] Hash with options to check.
|
|
123
|
+
# @param unique [Symbol, Array] List of options that must be unique.
|
|
124
|
+
#
|
|
125
|
+
# @example That raises:
|
|
126
|
+
# options_unique({foo: 'bar', one: 1}, :foo, :one)
|
|
127
|
+
#
|
|
128
|
+
# @example That passes:
|
|
129
|
+
# options_unique({foo: 'bar', one: 'two'}, :foo)
|
|
130
|
+
#
|
|
131
|
+
# @example That passes:
|
|
132
|
+
# options_unique({}, :foo)
|
|
133
|
+
#
|
|
134
|
+
# @raise [BioDSL::OptionError] If non-unique options are found.
|
|
135
|
+
def options_unique(options, *unique)
|
|
136
|
+
return unless unique.select { |option| options[option] }.size > 1
|
|
137
|
+
|
|
138
|
+
fail BioDSL::OptionError, 'Multiple uniques options used: ' \
|
|
139
|
+
"#{unique.join(', ')}"
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Method that raises if options include lists with duplicate elements.
|
|
143
|
+
#
|
|
144
|
+
# @param options [Hash] Hash with options to check.
|
|
145
|
+
# @param lists [Symbol, Array] Lists whos element to check for duplicates.
|
|
146
|
+
#
|
|
147
|
+
# @example That raises:
|
|
148
|
+
# options_unique_list({foo: [0, 0]}, :foo)
|
|
149
|
+
#
|
|
150
|
+
# @example That passes:
|
|
151
|
+
# options_unique_list({foo: [0, 1]}, :foo)
|
|
152
|
+
#
|
|
153
|
+
# @raise [BioDSL::OptionError] If duplicate elements are found.
|
|
154
|
+
def options_list_unique(options, *lists)
|
|
155
|
+
lists.each do |list|
|
|
156
|
+
if options[list] && options[list].uniq.size != options[list].size
|
|
157
|
+
fail BioDSL::OptionError, 'Duplicate elements found in list ' \
|
|
158
|
+
"#{list}: #{options[list]}"
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# Method that raises if one option is given without some other.
|
|
164
|
+
# Example: options_tie gzip: :output, bzip2: :output
|
|
165
|
+
#
|
|
166
|
+
# @param options [Hash] Hash with options to check.
|
|
167
|
+
# @param others [Hash] Hash with key/value pairs denoting ties.
|
|
168
|
+
#
|
|
169
|
+
# @example That raises:
|
|
170
|
+
# options_tie({gzip: true}, gzip: :output)
|
|
171
|
+
#
|
|
172
|
+
# @example That passes:
|
|
173
|
+
# options_tie({output: "foo", gzip: true}, gzip: :output)
|
|
174
|
+
#
|
|
175
|
+
# @raise [BioDSL::OptionError] If option found without it's tie.
|
|
176
|
+
def options_tie(options, others)
|
|
177
|
+
others.each do |option, other|
|
|
178
|
+
if options[option] && !options[other]
|
|
179
|
+
fail BioDSL::OptionError, "Tie option: #{other} not in options: " \
|
|
180
|
+
"#{options.keys.join(', ')}"
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# Method that raises if conflicting options are used.
|
|
186
|
+
# Example: select: :evaluate, reject: :evaluate
|
|
187
|
+
#
|
|
188
|
+
# @param options [Hash] Hash with options to check.
|
|
189
|
+
# @param conflicts [Hash] Hash with conflicting key/value pairs.
|
|
190
|
+
#
|
|
191
|
+
# @example That raises:
|
|
192
|
+
# options_tie({reject: true, select: true}, reject: :select)
|
|
193
|
+
#
|
|
194
|
+
# @example That passes:
|
|
195
|
+
# options_tie({reject: true}, reject: :select)
|
|
196
|
+
#
|
|
197
|
+
# @raise [BioDSL::OptionError] If conflicting options are found.
|
|
198
|
+
def options_conflict(options, conflicts)
|
|
199
|
+
conflicts.each do |option, conflict|
|
|
200
|
+
if options[option] && options[conflict]
|
|
201
|
+
fail BioDSL::OptionError, "Conflicting options: #{option}, " \
|
|
202
|
+
"#{conflict}"
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Method that fails if given files don't exist.
|
|
208
|
+
#
|
|
209
|
+
# @param options [Hash]
|
|
210
|
+
# Hash with options to check.
|
|
211
|
+
#
|
|
212
|
+
# @param args [Symbol, Array]
|
|
213
|
+
# Symbol or Array of Symbols which are keys in the option Hash and whos
|
|
214
|
+
# values to check.
|
|
215
|
+
#
|
|
216
|
+
# @example With a given Symbol.
|
|
217
|
+
# options_files_exist(options, :input)
|
|
218
|
+
#
|
|
219
|
+
# @example With a given Array.
|
|
220
|
+
# options_files_exist(options, [:input1, :input2])
|
|
221
|
+
#
|
|
222
|
+
# @raise [BioDSL::OptionError] on non-existing files.
|
|
223
|
+
def options_files_exist(options, *args)
|
|
224
|
+
args.each do |arg|
|
|
225
|
+
next unless options[arg]
|
|
226
|
+
files = (options[arg].is_a? Array) ? options[arg] : [options[arg]]
|
|
227
|
+
|
|
228
|
+
files.each do |file|
|
|
229
|
+
file = glob_check(file, arg) if file.include? '*'
|
|
230
|
+
|
|
231
|
+
unless File.file? File.expand_path(file)
|
|
232
|
+
fail BioDSL::OptionError, "For option #{arg} - no such file: " \
|
|
233
|
+
"#{file}"
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
# Method that fails if files exist unless the force option flag is set.
|
|
240
|
+
#
|
|
241
|
+
# @param options [Hash]
|
|
242
|
+
# Hash with options to check.
|
|
243
|
+
#
|
|
244
|
+
# @param args [Symbol, Array]
|
|
245
|
+
# Symbol or Array of Symbols which are keys in the option Hash and whos
|
|
246
|
+
# values to check.
|
|
247
|
+
#
|
|
248
|
+
# @example That raises
|
|
249
|
+
# options_files_exist_force({file: __FILE__}}, :file)
|
|
250
|
+
#
|
|
251
|
+
# @example That passes
|
|
252
|
+
# options_files_exist_force({file: __FILE__, force: true}, :file)
|
|
253
|
+
#
|
|
254
|
+
# @raise [BioDSL::OptionError]
|
|
255
|
+
# If files exist and the force option flag is not set
|
|
256
|
+
def options_files_exist_force(options, *args)
|
|
257
|
+
args.each do |arg|
|
|
258
|
+
next unless options[arg]
|
|
259
|
+
|
|
260
|
+
files = (options[arg].is_a? Array) ? options[arg] : [options[arg]]
|
|
261
|
+
|
|
262
|
+
files.each do |file|
|
|
263
|
+
if File.file?(file) && !options[:force]
|
|
264
|
+
fail BioDSL::OptionError, "File exist: #{file} - use " \
|
|
265
|
+
"'force: true' to override"
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
# Method that fails if given directories don't exist.
|
|
272
|
+
#
|
|
273
|
+
# @param options [Hash]
|
|
274
|
+
# Hash with options to check.
|
|
275
|
+
#
|
|
276
|
+
# @param args [Symbol, Array]
|
|
277
|
+
# Symbol or Array of Symbols which are keys in the option Hash and whos
|
|
278
|
+
# values to check.
|
|
279
|
+
#
|
|
280
|
+
# @example With a given Symbol.
|
|
281
|
+
# options_dirs_exist(options, :input)
|
|
282
|
+
#
|
|
283
|
+
# @example With a given Array.
|
|
284
|
+
# options_dirs_exist(options, [:input1, :input2])
|
|
285
|
+
#
|
|
286
|
+
# @raise [BioDSL::OptionError] on non-existing directories.
|
|
287
|
+
def options_dirs_exist(options, *args)
|
|
288
|
+
args.each do |arg|
|
|
289
|
+
next unless options[arg]
|
|
290
|
+
|
|
291
|
+
dirs = (options[arg].is_a? Array) ? options[arg] : [options[arg]]
|
|
292
|
+
|
|
293
|
+
dirs.each do |dir|
|
|
294
|
+
unless File.directory? File.expand_path(dir)
|
|
295
|
+
fail BioDSL::OptionError, "For option #{arg} - no such " \
|
|
296
|
+
"directory: #{dir}"
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
# Assert a given expression.
|
|
303
|
+
#
|
|
304
|
+
# @param options [Hash] Hash with options to check.
|
|
305
|
+
#
|
|
306
|
+
# @param expression [String] Expersion to assert.
|
|
307
|
+
#
|
|
308
|
+
# @example That raises:
|
|
309
|
+
# options_assert({min: 0}, ':min > 0')
|
|
310
|
+
#
|
|
311
|
+
# @example That passes:
|
|
312
|
+
# options_assert({{min: 0}, ':min == 0')
|
|
313
|
+
#
|
|
314
|
+
# @raise [BioDSL::OptionError] If assertion fails.
|
|
315
|
+
def options_assert(options, expression)
|
|
316
|
+
options.each do |key, value|
|
|
317
|
+
expression.gsub!(/:#{key}/, value.to_s)
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
return if expression[0] == ':'
|
|
321
|
+
return if eval expression
|
|
322
|
+
|
|
323
|
+
fail BioDSL::OptionError, "Assertion failed: #{expression}"
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
# Expand a given glob expression into lists of paths.
|
|
327
|
+
#
|
|
328
|
+
# @param expr [String] Comma sperated glob expressions.
|
|
329
|
+
#
|
|
330
|
+
# @example
|
|
331
|
+
# options_glob('foo*')
|
|
332
|
+
# # => ['foo.rb', 'foo.txt']
|
|
333
|
+
#
|
|
334
|
+
# @return [Array] List of expanded paths.
|
|
335
|
+
def options_glob(expr)
|
|
336
|
+
paths = []
|
|
337
|
+
list = expr.is_a?(Array) ? expr.join(',') : expr
|
|
338
|
+
|
|
339
|
+
list.split(/, */).each do |glob|
|
|
340
|
+
if glob.include? '*'
|
|
341
|
+
paths += Dir.glob(glob).sort.select { |file| File.file? file }
|
|
342
|
+
else
|
|
343
|
+
paths << glob
|
|
344
|
+
end
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
paths
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
# Load options from rc file and use these unless given or default options
|
|
351
|
+
# are specified. Option precedence: specified > default > rc.
|
|
352
|
+
#
|
|
353
|
+
# @param options [Hash] Hash with options to check.
|
|
354
|
+
# @param command [Symbol] Command for which to load options.
|
|
355
|
+
# @param file [String] Path to file with defaults.
|
|
356
|
+
#
|
|
357
|
+
# @example
|
|
358
|
+
# options = {}
|
|
359
|
+
# options_load_rc(options, :some_option)
|
|
360
|
+
# options == {option1: 'value1', option2: 'value2'}
|
|
361
|
+
def options_load_rc(options, command, file = BioDSL::Config::RC_FILE)
|
|
362
|
+
return unless File.exist? file
|
|
363
|
+
|
|
364
|
+
rc_options = Hash.new { |h, k| h[k] = [] }
|
|
365
|
+
rc_table = ::CSV.read(file, col_sep: "\s").
|
|
366
|
+
select { |row| row.first && row.first.to_sym == command }
|
|
367
|
+
|
|
368
|
+
add_to_rc_options(rc_table, rc_options, options)
|
|
369
|
+
add_to_options(rc_options, options)
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
# Check if a glob expressoin, a string with a *, matches any files and fail
|
|
373
|
+
# if that is not the case.
|
|
374
|
+
#
|
|
375
|
+
# @param glob [String] Glob expression (containing *) to check.
|
|
376
|
+
#
|
|
377
|
+
# @param key [Symbol] Option Hash key whos value is the glob expression.
|
|
378
|
+
#
|
|
379
|
+
# @raise [BioDSL::OptionError] If the glob expression fail to match.
|
|
380
|
+
#
|
|
381
|
+
# @return [String] The first mathing file.
|
|
382
|
+
def glob_check(glob, key)
|
|
383
|
+
first = Dir.glob(glob).select { |f| File.file? f }.first
|
|
384
|
+
fail BioDSL::OptionError, "For option #{key} - glob expression: " \
|
|
385
|
+
"#{glob} didn't match any files" if first.nil?
|
|
386
|
+
first
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
def add_to_options(rc_options, options)
|
|
390
|
+
rc_options.each do |key, value|
|
|
391
|
+
if value.size == 1
|
|
392
|
+
options[key] = value.first
|
|
393
|
+
else
|
|
394
|
+
options[key] = value
|
|
395
|
+
end
|
|
396
|
+
end
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
def add_to_rc_options(rc_table, rc_options, options)
|
|
400
|
+
rc_table.each do |row|
|
|
401
|
+
options.key?(row[1].to_sym) || rc_options[row[1].to_sym] << row[2]
|
|
402
|
+
end
|
|
403
|
+
end
|
|
404
|
+
end
|
|
405
|
+
end
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
|
|
2
|
+
# #
|
|
3
|
+
# Copyright (C) 2007-2015 Martin Asser Hansen (mail@maasha.dk). #
|
|
4
|
+
# #
|
|
5
|
+
# This program is free software; you can redistribute it and/or #
|
|
6
|
+
# modify it under the terms of the GNU General Public License #
|
|
7
|
+
# as published by the Free Software Foundation; either version 2 #
|
|
8
|
+
# of the License, or (at your option) any later version. #
|
|
9
|
+
# #
|
|
10
|
+
# This program is distributed in the hope that it will be useful, #
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
|
13
|
+
# GNU General Public License for more details. #
|
|
14
|
+
# #
|
|
15
|
+
# You should have received a copy of the GNU General Public License #
|
|
16
|
+
# along with this program; if not, write to the Free Software #
|
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, #
|
|
18
|
+
# USA. #
|
|
19
|
+
# #
|
|
20
|
+
# http://www.gnu.org/copyleft/gpl.html #
|
|
21
|
+
# #
|
|
22
|
+
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
|
|
23
|
+
# #
|
|
24
|
+
# This software is part of BioDSL (www.github.com/maasha/BioDSL). #
|
|
25
|
+
# #
|
|
26
|
+
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
|
|
27
|
+
|
|
28
|
+
module BioDSL
|
|
29
|
+
# Namespace with methods to record and manipulate cammand status.
|
|
30
|
+
module StatusHelper
|
|
31
|
+
require 'tempfile'
|
|
32
|
+
require 'terminal-table'
|
|
33
|
+
|
|
34
|
+
# Given a list of symbols initialize all as status hash keys with the value
|
|
35
|
+
# 0.
|
|
36
|
+
#
|
|
37
|
+
# @param status [Hash] Status hash.
|
|
38
|
+
# @param args [Array] List of symbols.
|
|
39
|
+
def status_init(status, args)
|
|
40
|
+
args.each { |arg| status[arg] = 0 }
|
|
41
|
+
@status = status
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Track the status progress of a running command in a seperate thread and
|
|
45
|
+
# output the status at speficied intervals.
|
|
46
|
+
#
|
|
47
|
+
# @param commands [Array] List of commands whos status should be output.
|
|
48
|
+
# @param block [Proc] Track the command in the given block.
|
|
49
|
+
#
|
|
50
|
+
# @raise [RunTimeError] If no block is given.
|
|
51
|
+
def status_progress(commands, &block)
|
|
52
|
+
fail 'No block given' unless block
|
|
53
|
+
|
|
54
|
+
thread = Thread.new do
|
|
55
|
+
print "\e[H\e[2J" # Console code to clear screen
|
|
56
|
+
|
|
57
|
+
loop do
|
|
58
|
+
progress_print(commands)
|
|
59
|
+
|
|
60
|
+
sleep BioDSL::Config::STATUS_PROGRESS_INTERVAL
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
block.call
|
|
65
|
+
|
|
66
|
+
thread.terminate
|
|
67
|
+
|
|
68
|
+
progress_print(commands)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
private
|
|
72
|
+
|
|
73
|
+
# Print the progress table to terminal.
|
|
74
|
+
#
|
|
75
|
+
# @param commands [Array] List of commands whos status should be output.
|
|
76
|
+
def progress_print(commands)
|
|
77
|
+
print "\e[1;1H" # Console code to move cursor to 1,1 coordinate.
|
|
78
|
+
puts "Started: #{commands.first.status[:time_start]}"
|
|
79
|
+
puts status_tabulate(commands)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Create status table.
|
|
83
|
+
#
|
|
84
|
+
# @param commands [Array] List of commands whos status should be output.
|
|
85
|
+
#
|
|
86
|
+
# @return [String] Status table.
|
|
87
|
+
def status_tabulate(commands)
|
|
88
|
+
return unless commands.first.status[:records_in]
|
|
89
|
+
|
|
90
|
+
table = Terminal::Table.new
|
|
91
|
+
table.style = {border_x: '', border_y: '', border_i: ''}
|
|
92
|
+
table.rows = status_rows(commands)
|
|
93
|
+
|
|
94
|
+
table.align_column(1, :right)
|
|
95
|
+
table.align_column(2, :right)
|
|
96
|
+
|
|
97
|
+
table.to_s
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Compile rows with table data.
|
|
101
|
+
#
|
|
102
|
+
# @param commands [Array] List of commands whos status should be output.
|
|
103
|
+
#
|
|
104
|
+
# @return [Array] List of rows.
|
|
105
|
+
def status_rows(commands)
|
|
106
|
+
rows = [%w(name records_in records_out time_elapsed status)]
|
|
107
|
+
|
|
108
|
+
commands.each do |command|
|
|
109
|
+
update_time(command)
|
|
110
|
+
|
|
111
|
+
row = []
|
|
112
|
+
row << command.name
|
|
113
|
+
row << command.status[:records_in].commify
|
|
114
|
+
row << command.status[:records_out].commify
|
|
115
|
+
row << command.status[:time_elapsed]
|
|
116
|
+
row << command.run_status
|
|
117
|
+
rows << row
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
rows
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Update the time_stop and time_elapsed for a given command.
|
|
124
|
+
#
|
|
125
|
+
# @param command [BioDSL::Command] Command object.
|
|
126
|
+
def update_time(command)
|
|
127
|
+
command.status[:time_stop] = Time.now unless command.run_status == 'done'
|
|
128
|
+
|
|
129
|
+
command.calc_time_elapsed
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
|
|
2
|
+
# #
|
|
3
|
+
# Copyright (C) 2007-2015 Martin Asser Hansen (mail@maasha.dk). #
|
|
4
|
+
# #
|
|
5
|
+
# This program is free software; you can redistribute it and/or #
|
|
6
|
+
# modify it under the terms of the GNU General Public License #
|
|
7
|
+
# as published by the Free Software Foundation; either version 2 #
|
|
8
|
+
# of the License, or (at your option) any later version. #
|
|
9
|
+
# #
|
|
10
|
+
# This program is distributed in the hope that it will be useful, #
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
|
13
|
+
# GNU General Public License for more details. #
|
|
14
|
+
# #
|
|
15
|
+
# You should have received a copy of the GNU General Public License #
|
|
16
|
+
# along with this program; if not, write to the Free Software #
|
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, #
|
|
18
|
+
# USA. #
|
|
19
|
+
# #
|
|
20
|
+
# http://www.gnu.org/copyleft/gpl.html #
|
|
21
|
+
# #
|
|
22
|
+
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
|
|
23
|
+
# #
|
|
24
|
+
# This software is part of BioDSL (www.github.com/maasha/BioDSL). #
|
|
25
|
+
# #
|
|
26
|
+
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
|
|
27
|
+
|
|
28
|
+
# Namespace for BioDSL.
|
|
29
|
+
module BioDSL
|
|
30
|
+
require 'BioDSL/helpers/history_helper'
|
|
31
|
+
require 'BioDSL/helpers/log_helper'
|
|
32
|
+
require 'BioDSL/helpers/options_helper'
|
|
33
|
+
require 'BioDSL/helpers/status_helper'
|
|
34
|
+
require 'BioDSL/helpers/aux_helper'
|
|
35
|
+
end
|