wrnap 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b2cc53a30fd53e8dc635b9a6f0e6b9dfc985eefb
4
- data.tar.gz: ce9692b9164e77fac7b6d4e56ed6398500c19e71
3
+ metadata.gz: f2efcb65abde80f14ce6f0e5eba3d5438b23ba33
4
+ data.tar.gz: 6c7873c5b0936b137a7f0f957f4853bcdc48d345
5
5
  SHA512:
6
- metadata.gz: 6e5c9b208ddb20f3d9377a40bfa6e5467a35c9012ddd0a0e38bcb47f082de147bd82df8ef7040a9dad2910f87f6bcc18df79b0f187a142f5ba99afa6bcc76d17
7
- data.tar.gz: cf74fe53fde6cbdf70a7430d6dee2e56cbbcd12ad64b9a9e6c11a68e279b7a46657ffd2fe1b5d5ed9d813e223016f27479a638b72e8f05537ed1f0762cb22f92
6
+ metadata.gz: aa223b71c6b69f3207ebf76b4b34b90a73d4686293adc10579936d3ac609247648ff62dd1f4cf529ac6be9b8fa28010151c673c39c6d0ef4040ecacc07a3875f
7
+ data.tar.gz: 3808f6f38a0c3a9a5877e3d829afab5fe11766d31dd55a1091207a774dfa31b87d3b4376a1baaf1adc15c396d6cc85f403e4af30eb031a5f5f83964ee5bf4b88
@@ -8,12 +8,13 @@ module Wrnap
8
8
  "-fftbor2d-i" => context.data.seq,
9
9
  "-fftbor2d-j" => context.data.str_1,
10
10
  "-fftbor2d-k" => context.data.str_2,
11
- "-population-e" => 1e-4
11
+ "-population-q" => true
12
12
  }
13
13
  end
14
14
 
15
15
  def post_process
16
- @equilibrium = (response.empty? || response =~ /Infinity/ ? -1 : 10 ** response.strip.to_f)
16
+ raw_eq_time = (response.match(/index\tlogtime\n\d+\t(.*)\n/) || [])[1] || ""
17
+ @equilibrium = (raw_eq_time =~ /^(|-?Infinity)$/ ? -1 : 10 ** raw_eq_time.to_f)
17
18
  end
18
19
  end
19
20
  end
@@ -11,7 +11,7 @@ module Wrnap
11
11
  "-fftbor2d-i" => context.data.seq,
12
12
  "-fftbor2d-j" => context.data.str_1,
13
13
  "-fftbor2d-k" => context.data.str_2,
14
- "-mfpt-x" => true
14
+ "X" => true
15
15
  }
16
16
  end
17
17
  self.quote_flag_params = %w|-fftbor2d-i -fftbor2d-j -fftbor2d-k|
@@ -2,12 +2,12 @@ module Wrnap
2
2
  module Package
3
3
  class Fftbor2d < EnergyGrid2d
4
4
  self.executable_name = "FFTbor2D"
5
- self.default_flags = ->(_, flags) { (flags.keys & %i|M S|).empty? ? { S: :empty } : {} }
5
+ self.default_flags = ->(_, flags) { (flags.keys & %i|m s|).empty? ? { s: :empty } : {} }
6
6
 
7
7
  def run_command(flags)
8
8
  Wrnap.debugger { "Running #{exec_name} on #{data.inspect}" }
9
9
 
10
- "%s %s %s" % [
10
+ "%s %s -f %s" % [
11
11
  exec_name,
12
12
  stringify_flags(flags),
13
13
  data.temp_fa_file!
@@ -15,7 +15,7 @@ module Wrnap
15
15
  end
16
16
 
17
17
  def distribution
18
- response.split(/\n/).map { |line| line.split(/\t/) }
18
+ response.split(/\n/).map { |line| line.scanf("%d\t%d\t%f\t%f") }
19
19
  end
20
20
  end
21
21
  end
data/lib/wrnap/rna/box.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  module Wrnap
2
2
  class Rna
3
3
  class Box
4
+ prepend MetaMissing
4
5
  extend Forwardable
5
6
  include Enumerable
6
7
  include Wrnap::Global::Yaml
@@ -9,7 +10,10 @@ module Wrnap
9
10
 
10
11
  class << self
11
12
  def load_all(pattern = "*.fa", &block)
12
- new(Dir[File.directory?(pattern) ? pattern + "/*.fa" : pattern].inject([]) { |array, file| array + RNA.from_fasta(file, &block).rnas })
13
+ new(Dir[File.directory?(pattern) ? File.join(pattern, "*.fa") : pattern].inject([]) do |array, file|
14
+ loaded_rnas = RNA.from_fasta(file, &block)
15
+ array + (loaded_rnas.is_a?(Box) ? loaded_rnas.rnas : [loaded_rnas])
16
+ end)
13
17
  end
14
18
  end
15
19
 
@@ -47,10 +51,8 @@ module Wrnap
47
51
  klass == Array ? true : super
48
52
  end
49
53
 
50
- def method_missing(name, *args, &block)
51
- if (name_str = "#{name}") =~ /^run_\w+$/
52
- run_in_parallel(name_str, *args)
53
- else super end
54
+ handle_methods_like(/^run_\w+$/) do |match, name, *args, &block|
55
+ run_in_parallel(name, *args)
54
56
  end
55
57
 
56
58
  def inspect
@@ -1,3 +1,5 @@
1
+ require File.join(File.dirname(__FILE__), "tree.rb")
2
+
1
3
  module Wrnap
2
4
  class Rna
3
5
  module Constraints
@@ -22,6 +24,8 @@ module Wrnap
22
24
  end
23
25
 
24
26
  class ConstraintBox
27
+ prepend MetaMissing
28
+
25
29
  attr_reader :rna, :constraints
26
30
 
27
31
  def initialize(rna)
@@ -100,21 +104,19 @@ module Wrnap
100
104
  end
101
105
  end
102
106
 
103
- alias :mask :to_s
107
+ alias_method :mask, :to_s
104
108
 
105
- def method_missing(name, *args, &block)
106
- method_name = name.to_s
109
+ handle_methods_like(TreeStem::STEM_NOTATION_REGEX) do |match, name, *args, &block|
110
+ rna.trunk.send(name.to_s)
111
+ end
112
+
113
+ handle_methods_like(/^(prohibit|force)(_(left|right)_stem)?$/) do |match, name, *args, &block|
114
+ side_symbol = match[3] ? match[3].to_sym : :both
107
115
 
108
- if method_name =~ TreeStem::STEM_NOTATION_REGEX
109
- rna.trunk.send(method_name)
110
- elsif mask_type = method_name.match(/^(prohibit|force)(_(left|right)_stem)?$/)
111
- side_symbol = mask_type[3] ? mask_type[3].to_sym : :both
112
-
113
- case mask_type[1]
114
- when "prohibit" then mask!(args[0], side: side_symbol, symbol: args[1] || ?x)
115
- when "force" then mask!(args[0], side: side_symbol, symbol: args[1] || "()")
116
- end
117
- else super end
116
+ case match[1]
117
+ when "prohibit" then mask!(args[0], side: side_symbol, symbol: args[1] || ?x)
118
+ when "force" then mask!(args[0], side: side_symbol, symbol: args[1] || "()")
119
+ end
118
120
  end
119
121
  end
120
122
 
@@ -40,10 +40,9 @@ module Wrnap
40
40
  end
41
41
 
42
42
  super(
43
- sequence: self.sequence,
44
- structure: options[:rna][:structure] || options[:rna][:str_1] || options[:rna][:str],
45
- second_structure: options[:rna][:second_structure] || options[:rna][:str_2],
46
- comment: options[:rna][:comment] || options[:rna][:name] || identifier,
43
+ sequence: self.sequence,
44
+ structures: options[:rna][:structures] || options[:rna][:structure] || options[:rna][:strs] || options[:rna][:str],
45
+ comment: options[:rna][:comment] || options[:rna][:name] || identifier,
47
46
  &block
48
47
  )
49
48
 
@@ -94,7 +93,7 @@ module Wrnap
94
93
  !plus_strand?
95
94
  end
96
95
 
97
- def sequence
96
+ alias_method :seq, def sequence
98
97
  if @raw_sequence
99
98
  @raw_sequence
100
99
  else
@@ -102,8 +101,6 @@ module Wrnap
102
101
  @raw_sequence = (minus_strand? ? entrez_sequence.complement : entrez_sequence).upcase
103
102
  end
104
103
  end
105
-
106
- alias :seq :sequence
107
104
 
108
105
  def_delegator :@raw_sequence, :length, :len
109
106
 
@@ -46,6 +46,11 @@ module Wrnap
46
46
  end
47
47
 
48
48
  def local_structural_shuffle(dishuffle: false)
49
+ # Permutes the base pairs of the structure provided for the template sequence independently of the unpaired regions, as in
50
+ # global_structural_shuffle. This adds the additional constraint that loops and helices are permuted as individual sets,
51
+ # rather than using two global loop / helix bags.
52
+ raise "the structural_shuffle functions require the initial RNA to have a structure" unless str
53
+
49
54
  sequence = " " * len
50
55
  loops, helices = loops_and_helices
51
56
 
@@ -69,6 +74,10 @@ module Wrnap
69
74
  end
70
75
 
71
76
  def global_structural_shuffle
77
+ # Permutes the nucleotides of the sequence such that the basepairs in the initial structure are shuffled independently of the
78
+ # unpaired bases. This ensures that the resulting sequence is compatible with the original structure.
79
+ raise "the structural_shuffle functions require the initial RNA to have a structure" unless str
80
+
72
81
  sequence = " " * len
73
82
  loops, helices = loops_and_helices
74
83
  shuffled_loops = Shuffle.new(loops.map { |loop| loop.in(seq) }.join.split(//)).shuffle
@@ -28,12 +28,10 @@ module Wrnap
28
28
  @__rna__, @__data__ = rna, {}
29
29
  end
30
30
 
31
- def inspect
31
+ alias_method :to_s, def inspect
32
32
  "#<Metadata: %s>" % __data__.inspect
33
33
  end
34
34
 
35
- alias :to_s :inspect
36
-
37
35
  def method_missing(name, *args, &block)
38
36
  case args.size
39
37
  when 0 then __data__[name]
@@ -11,6 +11,7 @@ module Wrnap
11
11
  end
12
12
 
13
13
  class TreeStem < Tree::TreeNode
14
+ prepend MetaMissing
14
15
  extend Forwardable
15
16
  include Enumerable
16
17
 
@@ -19,6 +20,10 @@ module Wrnap
19
20
  def_delegators :@content, :i, :j, :k, :l
20
21
  def_delegator :@content, :length, :stem_length
21
22
 
23
+ def in(sequence)
24
+ sequence[i..j]
25
+ end
26
+
22
27
  def unpaired_regions
23
28
  Wrnap.debugger { "Collecting unpaired regions for %s" % [root.content.name] }
24
29
 
@@ -78,26 +83,27 @@ module Wrnap
78
83
  children.each { |child| child.postorder_traversal(&block) }
79
84
  yield self
80
85
  end
81
-
82
- def method_missing(name, *args, &block)
83
- if (method_name = name.to_s) =~ STEM_NOTATION_REGEX
84
- call_type = method_name[0]
85
- indices = method_name.gsub(/\D+/, ?_).split(?_).reject(&:empty?).map(&:to_i)
86
- helix_index = method_name.match(/([ijkl])$/) ? $1 : ""
87
-
88
- if indices.size > 1 && child = children[indices[0] - 1]
89
- child.send(call_type + indices[1..-1].join(?_) + helix_index)
90
- elsif child = children[indices[0] - 1]
91
- case call_type
92
- when ?p then helix_index.empty? ? child.content : child.send(helix_index)
93
- when ?t then child
94
- end
86
+
87
+ handle_methods_like(STEM_NOTATION_REGEX) do |match, name, *args, &block|
88
+ method_name = name.to_s
89
+ call_type = method_name[0]
90
+ indices = method_name.gsub(/\D+/, ?_).split(?_).reject(&:empty?).map(&:to_i)
91
+ helix_index = method_name.match(/([ijkl])$/) ? $1 : ""
92
+
93
+ if indices.size > 1 && child = children[indices[0] - 1]
94
+ child.send(call_type + indices[1..-1].join(?_) + helix_index)
95
+ elsif child = children[indices[0] - 1]
96
+ case call_type
97
+ when ?p then helix_index.empty? ? child.content : child.send(helix_index)
98
+ when ?t then child
95
99
  end
96
- else super end
100
+ end
97
101
  end
98
102
  end
99
103
 
100
104
  class TreePlanter
105
+ prepend MetaMissing
106
+
101
107
  attr_reader :rna, :root
102
108
 
103
109
  def initialize(rna, tree = false)
@@ -144,7 +150,7 @@ module Wrnap
144
150
  end
145
151
 
146
152
  def coalesce
147
- self.class.new(rna, root.dup).tap { |tree| tree.merge_interior_loops! }
153
+ self.class.new(rna, root.clone).tap { |tree| tree.merge_interior_loops! }
148
154
  end
149
155
 
150
156
  def coalesce!
@@ -152,7 +158,7 @@ module Wrnap
152
158
  end
153
159
 
154
160
  def fuse
155
- self.class.new(rna, root.dup).tap { |tree| tree.extend_interior_loops! }
161
+ self.class.new(rna, root.clone).tap { |tree| tree.extend_interior_loops! }
156
162
  end
157
163
 
158
164
  def fuse!
@@ -194,16 +200,12 @@ module Wrnap
194
200
  root.print_tree and nil
195
201
  end
196
202
 
197
- def inspect
203
+ alias_method :to_s, def inspect
198
204
  "#<TreePlanter: %s>" % depth_signature.inspect
199
205
  end
200
-
201
- alias :to_s :inspect
202
-
203
- def method_missing(name, *args, &block)
204
- if name.to_s =~ TreeStem::STEM_NOTATION_REGEX
205
- root.send(name, *args, &block)
206
- else super end
206
+
207
+ handle_methods_like(TreeStem::STEM_NOTATION_REGEX) do |match, name, *args, &block|
208
+ root.send(name, *args, &block)
207
209
  end
208
210
  end
209
211
  end
data/lib/wrnap/rna.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  module Wrnap
2
2
  class Rna
3
+ prepend MetaMissing
3
4
  extend Forwardable
4
5
  include Wrnap::Global::Yaml
5
6
  include Wrnap::Rna::Extensions
@@ -11,25 +12,28 @@ module Wrnap
11
12
  CANONICAL_BASES = Set.new << Set.new([?G, ?C]) << Set.new([?A, ?U]) << Set.new([?G, ?U])
12
13
 
13
14
  attr_accessor :comment
14
- attr_reader :sequence, :structure, :second_structure, :metadata
15
+ attr_reader :sequence, :structures, :metadata
15
16
 
16
17
  class << self
17
- def init_from_string(sequence, structure = nil, second_structure = nil, comment = nil, &block)
18
- new(
19
- sequence: sequence,
20
- structure: structure,
21
- second_structure: second_structure,
22
- comment: comment,
23
- &block
24
- )
18
+ def init_from_string(sequence, *remaining_args, &block)
19
+ init_from_hash(parse_rna_attributes(sequence, remaining_args), &block)
20
+ end
21
+
22
+ def parse_rna_attributes(sequence, attributes = [])
23
+ last_arg = (attributes = attributes.flatten).last
24
+
25
+ if last_arg.is_a?(Symbol) || Regexp.compile("^[\\.\\(\\)]{%d}$" % sequence.length) =~ last_arg
26
+ { seq: sequence, strs: attributes }
27
+ else
28
+ { seq: sequence, strs: attributes[0..-2], comment: last_arg }
29
+ end
25
30
  end
26
31
 
27
32
  def init_from_hash(hash, &block)
28
33
  new(
29
- sequence: hash[:sequence] || hash[:seq],
30
- structure: hash[:structure] || hash[:str_1] || hash[:str],
31
- second_structure: hash[:second_structure] || hash[:str_2],
32
- comment: hash[:comment] || hash[:name],
34
+ sequence: hash[:sequence] || hash[:seq],
35
+ structures: hash[:structures] || hash[:structure] || hash[:strs] || hash[:str],
36
+ comment: hash[:comment] || hash[:name],
33
37
  &block
34
38
  )
35
39
  end
@@ -38,7 +42,7 @@ module Wrnap
38
42
  init_from_string(*array, &block)
39
43
  end
40
44
 
41
- def init_from_fasta(string, &block)
45
+ alias_method :init_from_fa, def init_from_fasta(string, &block)
42
46
  if File.exist?(string)
43
47
  comment = File.basename(string, string.include?(?.) ? ".%s" % string.split(?.)[-1] : "")
44
48
  string = File.read(string).chomp
@@ -46,12 +50,12 @@ module Wrnap
46
50
 
47
51
  if string.count(?>) > 1
48
52
  string.split(/>/).reject(&:empty?).map do |rna_string|
49
- rna_data = rna_string.split(?\n)
53
+ rna_data = rna_string.split(?\n).reject(&:empty?)
50
54
  init_from_string(*rna_data[1..-1]).copy_name_from(rna_data[0])
51
55
  end.wrnap
52
56
  else
53
- init_from_string(*string.split(/\n/).reject { |line| line.start_with?(">") }[0, 3], &block).tap do |rna|
54
- if (line = string.split(/\n/).first).start_with?(">") && !(file_comment = line.gsub(/^>\s*/, "")).empty?
57
+ init_from_string(*string.split(?\n).reject { |line| line.start_with?(?>) || line.empty? }, &block).tap do |rna|
58
+ if (line = string.split(?\n).first).start_with?(?>) && !(file_comment = line.gsub(/^>\s*/, "")).empty?
55
59
  rna.comment = file_comment
56
60
  elsif comment
57
61
  rna.comment = comment
@@ -67,100 +71,99 @@ module Wrnap
67
71
  def init_from_self(rna, &block)
68
72
  # This happens when you call a Wrnap library function with the output of something like Wrnap::Fold.run(...).mfe
69
73
  new(
70
- sequence: rna.sequence,
71
- structure: rna.structure,
72
- second_structure: rna.second_structure,
73
- comment: rna.comment,
74
+ sequence: rna.sequence,
75
+ structures: rna.structures,
76
+ comment: rna.comment,
74
77
  &block
75
- )
78
+ ).tap do |new_rna|
79
+ new_rna.instance_variable_set(:@metadata, rna.metadata.clone)
80
+ end
81
+ end
82
+
83
+ def init_from_old_rna_object(rna)
84
+ init_from_self(rna).tap do |new_rna|
85
+ new_rna.instance_variable_set(:@structures, [
86
+ rna.instance_variable_get(:@structure),
87
+ rna.instance_variable_get(:@second_structure)
88
+ ].compact)
89
+ end
76
90
  end
77
91
 
78
92
  alias_method :placeholder, :new
79
93
  end
80
94
 
81
- def initialize(sequence: "", structure: "", second_structure: "", comment: "", &block)
82
- @sequence, @comment, @metadata = (sequence.kind_of?(Rna) ? sequence.seq : sequence).upcase, comment, Metadata::Container.new(self)
83
-
84
- [:structure, :second_structure].each do |structure_symbol|
85
- instance_variable_set(
86
- :"@#{structure_symbol}",
87
- case structure_value = eval("#{structure_symbol}")
88
- when :empty then empty_structure
89
- when :mfe then RNA(sequence).run(:fold).mfe_rna.structure
90
- when String then structure_value
91
- when Hash then
92
- if structure_value.keys.count > 1
93
- Wrnap.debugger { "The following options hash has more than one key. This will probably produce unpredictable results: %s" % structure_value.inspect }
94
- end
95
+ def initialize(sequence: "", structures: [], comment: "", &block)
96
+ @sequence = (sequence.kind_of?(Rna) ? sequence.seq : sequence).upcase
97
+ @comment = comment
98
+ @metadata = Metadata::Container.new(self)
99
+ @structures = (structures ? [structures].flatten : []).each_with_index.map do |structure, i|
100
+ case structure
101
+ when :empty, :empty_str then empty_structure
102
+ when :mfe then RNA(@sequence).run(:fold).mfe_rna.structure
103
+ when String then structure
104
+ when Hash then
105
+ if structure.keys.count > 1
106
+ Wrnap.debugger { "The following options hash has more than one key. This will probably produce unpredictable results: %s" % structure.inspect }
107
+ end
95
108
 
96
- RNA(sequence).run(*structure_value.keys, *structure_value.values).mfe_rna.structure
109
+ RNA(@sequence).run(*structure.keys, *structure.values).mfe_rna.structure
110
+ end.tap do |parsed_structure|
111
+ if parsed_structure.length != len
112
+ Wrnap.debugger { "The sequence length (%d) doesn't match the structure length at index %d (%d)" % [len, i, parsed_structure.length] }
97
113
  end
98
- )
114
+ end
99
115
  end
100
116
 
101
117
  metadata.instance_eval(&block) if block_given?
102
-
103
- if str && len != str.length
104
- Wrnap.debugger { "The sequence length (%d) doesn't match the structure length (%d)" % [seq, str].map(&:length) }
105
- end
106
-
107
- if str_2 && str_1.length != str_2.length
108
- Wrnap.debugger { "The first structure length (%d) doesn't match the second structure length (%d)" % [str_1, str_2].map(&:length) }
109
- end
110
118
  end
111
119
 
112
- alias :seq :sequence
113
- alias :str :structure
114
- alias :str_1 :structure
115
- alias :str_2 :second_structure
116
- alias :name :comment
120
+ alias_method :seq, :sequence
121
+ alias_method :strs, :structures
122
+ alias_method :name, :comment
117
123
 
118
- def_delegator :@sequence, :length, :len
124
+ def_delegator :@sequence, :length, :len
125
+ def_delegator :@structures, :first, :structure
126
+ def_delegator :@structures, :first, :str
119
127
 
120
128
  def copy_name_from(nameish)
121
129
  tap { @comment = nameish.is_a?(String) ? nameish : nameish.name }
122
130
  end
131
+
132
+ alias_method :num_strs, def number_of_structures
133
+ structures.length
134
+ end
123
135
 
124
- def empty_structure
136
+ alias_method :empty_str, def empty_structure
125
137
  "." * len
126
138
  end
127
139
 
128
- alias :empty_str :empty_structure
129
-
130
- def no_structure
131
- self.class.init_from_string(seq, nil, nil, name)
140
+ alias_method :no_str, def no_structure
141
+ self.class.init_from_string(seq, name)
132
142
  end
133
143
 
134
- alias :no_str :no_structure
135
-
136
- def one_structure(structure_1)
137
- self.class.init_from_string(seq, structure_1.is_a?(Symbol) ? send(structure_1) : structure_1, nil, name)
144
+ alias_method :one_str, def one_structure(structure_1)
145
+ self.class.init_from_string(seq, structure_1.is_a?(Symbol) ? send(structure_1) : structure_1, name)
138
146
  end
139
147
 
140
- alias :one_str :one_structure
141
-
142
- def two_structures(structure_1, structure_2)
148
+ alias_method :two_str, def two_structures(structure_1, structure_2)
143
149
  self.class.init_from_string(
144
150
  seq,
145
- *[structure_1, structure_2].map { |argument| argument.is_a?(Symbol) ? send(argument) : argument },
151
+ [structure_1, structure_2].map { |argument| argument.is_a?(Symbol) ? send(argument) : argument },
146
152
  name
147
153
  )
148
154
  end
149
-
150
- alias :two_str :two_structures
151
155
 
152
156
  def formatted_string
153
157
  [
154
- (">%s" % name if name),
155
- ("%s" % seq if seq),
156
- ("%s" % str_1 if str_1),
157
- ("%s" % str_2 if str_2)
158
+ (">%s" % name if name),
159
+ ("%s" % seq if seq),
160
+ *structures
158
161
  ].compact.join(?\n)
159
162
  end
160
163
 
161
164
  def write_fa!(filename)
162
165
  filename.tap do |filename|
163
- File.open(filename, ?w) { |file| file.write(formatted_string) }
166
+ File.open(filename, ?w) { |file| file.write(formatted_string + ?\n) }
164
167
  end
165
168
  end
166
169
 
@@ -180,24 +183,25 @@ module Wrnap
180
183
  other_rna.kind_of?(Wrnap::Rna) ? [seq, str_1, str_2] == [other_rna.seq, other_rna.str_1, other_rna.str_2] : super
181
184
  end
182
185
 
183
- def method_missing(name, *args, &block)
184
- if (name_str = "#{name}") =~ /^run_\w+$/
185
- run(name_str.gsub(/^run_/, ""), *args)
186
- else super end
187
- end
188
-
189
186
  def pp
190
187
  puts(formatted_string)
191
188
  end
192
189
 
193
190
  def inspect
194
191
  "#<RNA: %s>" % [
195
- ("#{seq[0, 20] + (len > 20 ? '... [%d]' % len : '')}" if seq && !seq.empty?),
196
- ("#{str_1[0, 20] + (str_1.length > 20 ? ' [%d]' % str_1.length : '')}" if str_1 && !str_1.empty?),
197
- ("#{str_2[0, 20] + (str_2.length > 20 ? ' [%d]' % str_2.length : '')}" if str_2 && !str_1.empty?),
192
+ ("#{seq[0, 20] + (len > 20 ? '... [%d]' % len : '')}" if seq && !seq.empty?),
193
+ *strs.map { |str| ("#{str[0, 20] + (str.length > 20 ? ' [%d]' % str.length : '')}" if str && !str.empty?) },
198
194
  (md.inspect unless md.nil? || md.empty?),
199
195
  (name ? name : "#{self.class.name}")
200
196
  ].compact.join(", ")
201
197
  end
198
+
199
+ handle_methods_like(/^str(ucture)?_(\d+)$/) do |match, name, *args, &block|
200
+ structures[match[2].to_i - 1]
201
+ end
202
+
203
+ handle_methods_like(/^run_(\w+)$/) do |match, name, *args, &block|
204
+ run(match[1], *args)
205
+ end
202
206
  end
203
207
  end
data/lib/wrnap/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Wrnap
2
- VERSION = "1.2.0"
2
+ VERSION = "1.2.1"
3
3
  end
data/lib/wrnap.rb CHANGED
@@ -1,12 +1,16 @@
1
- require "active_support/core_ext/class"
1
+ require "active_support/core_ext"
2
2
  require "active_support/inflector"
3
3
  require "benchmark"
4
4
  require "bigdecimal"
5
5
  require "bio"
6
6
  require "bio-stockholm"
7
7
  require "entrez"
8
+ require "meta_missing"
9
+ require "numbers_in_words"
10
+ require "numbers_in_words/duck_punch"
8
11
  require "parallel"
9
12
  require "rroc"
13
+ require "scanf"
10
14
  require "set"
11
15
  require "shuffle"
12
16
  require "tempfile"
data/wrnap.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Wrnap::VERSION
9
9
  spec.authors = ["Evan Senter"]
10
10
  spec.email = ["evansenter@gmail.com"]
11
- spec.summary = %q{A comprehensive wrapper (wRNApper) for various RNA CLI programs.}
11
+ spec.summary = %q{A comprehensive wrapper w(RNA)pper for various RNA CLI programs.}
12
12
  spec.description = %q{}
13
13
  spec.homepage = ""
14
14
  spec.license = "MIT"
@@ -20,13 +20,17 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.required_ruby_version = ">= 2.0"
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.6"
24
- spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "awesome_print", "~> 1.2.0"
24
+ spec.add_development_dependency "bundler", "~> 1.7"
25
+ spec.add_development_dependency "gem-release", "~> 0.7", ">= 0.7.3"
26
+ spec.add_development_dependency "rake", "~> 10.0"
25
27
 
26
28
  spec.add_runtime_dependency "activesupport", "~> 4.0"
27
29
  spec.add_runtime_dependency "bio", "~> 1.4"
28
30
  spec.add_runtime_dependency "bio-stockholm", "~> 0.0.1"
29
31
  spec.add_runtime_dependency "entrez", "~> 0.5"
32
+ spec.add_runtime_dependency "meta_missing", "~> 0.3.0"
33
+ spec.add_runtime_dependency "numbers_in_words", "~> 0.2.0"
30
34
  spec.add_runtime_dependency "parallel", "~> 1.3", ">= 1.3.2"
31
35
  spec.add_runtime_dependency "rinruby", "~> 2.0"
32
36
  spec.add_runtime_dependency "rroc", "~> 0.1"
metadata CHANGED
@@ -1,43 +1,77 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wrnap
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Senter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-15 00:00:00.000000000 Z
11
+ date: 2014-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: awesome_print
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.2.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '1.6'
33
+ version: '1.7'
20
34
  type: :development
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '1.6'
40
+ version: '1.7'
27
41
  - !ruby/object:Gem::Dependency
28
- name: rake
42
+ name: gem-release
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.7'
31
48
  - - ">="
32
49
  - !ruby/object:Gem::Version
33
- version: '0'
50
+ version: 0.7.3
34
51
  type: :development
35
52
  prerelease: false
36
53
  version_requirements: !ruby/object:Gem::Requirement
37
54
  requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '0.7'
38
58
  - - ">="
39
59
  - !ruby/object:Gem::Version
40
- version: '0'
60
+ version: 0.7.3
61
+ - !ruby/object:Gem::Dependency
62
+ name: rake
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '10.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '10.0'
41
75
  - !ruby/object:Gem::Dependency
42
76
  name: activesupport
43
77
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +128,34 @@ dependencies:
94
128
  - - "~>"
95
129
  - !ruby/object:Gem::Version
96
130
  version: '0.5'
131
+ - !ruby/object:Gem::Dependency
132
+ name: meta_missing
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: 0.3.0
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: 0.3.0
145
+ - !ruby/object:Gem::Dependency
146
+ name: numbers_in_words
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: 0.2.0
152
+ type: :runtime
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: 0.2.0
97
159
  - !ruby/object:Gem::Dependency
98
160
  name: parallel
99
161
  requirement: !ruby/object:Gem::Requirement
@@ -272,9 +334,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
272
334
  version: '0'
273
335
  requirements: []
274
336
  rubyforge_project:
275
- rubygems_version: 2.4.2
337
+ rubygems_version: 2.4.5
276
338
  signing_key:
277
339
  specification_version: 4
278
- summary: A comprehensive wrapper (wRNApper) for various RNA CLI programs.
340
+ summary: A comprehensive wrapper w(RNA)pper for various RNA CLI programs.
279
341
  test_files: []
280
- has_rdoc: