scbi_blast 0.0.33 → 0.0.34

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.0.34 2012-04-30
2
+
3
+ Added streamed XML parser to reduce memory usage with xml tree
4
+
1
5
  === 0.0.33 2011-07-06
2
6
 
3
7
  Added do_blast_cmd to launch any blast command
data/Manifest.txt CHANGED
@@ -14,8 +14,10 @@ test/empty_blast.xml
14
14
  test/blast.txt
15
15
  lib/scbi_blast/blast_hit.rb
16
16
  lib/scbi_blast/blast_query.rb
17
+ lib/scbi_blast/blast_result.rb
17
18
  lib/scbi_blast/blast_table_result.rb
18
19
  lib/scbi_blast/blast_xml_result.rb
19
20
  lib/scbi_blast/blast_simplexml_result.rb
21
+ lib/scbi_blast/blast_streamxml_result.rb
20
22
  lib/scbi_blast/batch_blast.rb
21
23
  lib/scbi_blast/dust_masker.rb
data/Rakefile CHANGED
@@ -14,7 +14,7 @@ $hoe = Hoe.spec 'scbi_blast' do
14
14
  self.developer 'Dario Guerrero & Almudena Bocinos', 'dariogf@gmail.com, alkoke@gmail.com'
15
15
  # self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
16
16
  self.rubyforge_name = self.name # TODO this is default value
17
- # self.extra_deps = [['activesupport','>= 2.0.2']]
17
+ self.extra_deps = [['xml-simple','>= 1.0.12']]
18
18
 
19
19
  end
20
20
 
@@ -68,7 +68,7 @@ class BatchBlast
68
68
  if fmt == :table
69
69
  res = BlastTableResult.new(res)
70
70
  elsif fmt == :xml
71
- res = BlastSimplexmlResult.new(res)
71
+ res = BlastStreamxmlResult.new(res)
72
72
  # elsif fmt ==:xml2
73
73
  # res = BlastXmlResult.new(res)
74
74
  end
@@ -25,11 +25,16 @@ class BlastHit
25
25
 
26
26
  # initializes a new hit
27
27
  def initialize(q_beg,q_end,s_beg,s_end)
28
-
28
+ set_limits(q_beg,q_end,s_beg,s_end)
29
+ end
30
+
31
+ def set_limits(q_beg,q_end,s_beg,s_end)
32
+ # puts "Set limits #{[q_beg,q_end,s_beg,s_end].join(',')}"
29
33
  @q_beg = q_beg.to_i-1 #blast indexes are 1 based
30
34
  @q_end = q_end.to_i-1
31
35
  @s_beg = s_beg.to_i-1
32
36
  @s_end = s_end.to_i-1
37
+ # puts "Set limits2 #{[@q_beg,@q_end,@s_beg,@s_end].join(',')}"
33
38
 
34
39
  @reversed = false
35
40
 
@@ -41,7 +46,9 @@ class BlastHit
41
46
  @s_end = s_beg.to_i-1
42
47
  @reversed = true
43
48
  end
44
-
49
+ # puts "Set limits3 #{[@q_beg,@q_end,@s_beg,@s_end].join(',')}"
50
+ # puts "Set limits4 #{[q_beg,q_end,s_beg,s_end].join(',')}"
51
+
45
52
  end
46
53
 
47
54
  # some accessors
@@ -125,6 +132,47 @@ class BlastHit
125
132
  def size
126
133
  return (@q_end-@q_beg+1)
127
134
  end
135
+
136
+ def compare?(hit)
137
+ res=true
138
+
139
+ res &&=( @q_beg==hit.q_beg)
140
+ res &&=( @q_end==hit.q_end)
141
+ res &&=( @s_beg==hit.s_beg)
142
+ res &&=( @s_end==hit.s_end)
143
+
144
+ res &&=( @subject_id==hit.subject_id)
145
+ res &&=( @align_len==hit.align_len)
146
+ res &&=( @gaps==hit.gaps)
147
+ res &&=( @mismatches==hit.mismatches)
148
+
149
+
150
+ res &&=( @reversed==hit.reversed)
151
+ res &&=( @score==hit.score)
152
+ res &&=( @acc==hit.acc)
153
+ res &&=( @definition==hit.definition)
154
+
155
+
156
+ res &&=( @q_frame==hit.q_frame)
157
+ res &&=( @s_frame==hit.s_frame)
158
+ res &&=( @full_subject_length==hit.full_subject_length)
159
+ res &&=( @ident==hit.ident)
160
+
161
+
162
+ res &&=( @e_val==hit.e_val)
163
+ res &&=( @bit_score==hit.bit_score)
164
+ res &&=( @q_seq==hit.q_seq)
165
+ res &&=( @s_seq==hit.s_seq)
166
+
167
+ if !res
168
+ puts "Hits not equal:"
169
+ puts inspect
170
+ puts "="*20
171
+ puts hit.inspect
172
+ end
173
+
174
+ return res
175
+ end
128
176
 
129
177
  # readers and accessor for properties
130
178
  attr_accessor :q_beg, :q_end, :s_beg, :s_end
@@ -42,9 +42,9 @@ class BlastQuery
42
42
 
43
43
  # inspect query values with all hits
44
44
  def inspect
45
- res = "\n * Query #{@query_id} :"
45
+ res = "\n * Query #{@query_id}, #{@query_def}, #{@full_query_length} :"
46
46
  res += "subject_id ident align_len mismatches gaps q_beg q_end s_beg s_end e_val bit_score reversed\n\n"
47
- @hits.each{ |h| res+= h.inspect+"\n" }
47
+ @hits.each{ |h| res+= "=="+h.inspect+"\n" }
48
48
 
49
49
  return res
50
50
  end
@@ -72,6 +72,41 @@ class BlastQuery
72
72
  end until (res2.count == res.count)
73
73
 
74
74
 
75
+ return res
76
+ end
77
+
78
+ def compare?(query)
79
+ res=true
80
+
81
+
82
+ # same hits
83
+ res &&=( @hits.count==query.hits.count)
84
+
85
+ # if !res
86
+ # puts "Queries not equal:"
87
+ # puts inspect
88
+ # puts "="*20
89
+ # puts query.inspect
90
+ # end
91
+
92
+ if res
93
+ @hits.each_with_index do |h,i|
94
+ res &&= h.compare?(query.hits[i])
95
+ end
96
+ end
97
+
98
+ # if !res
99
+ # puts "Queries hits not equal:"
100
+ # puts inspect
101
+ # puts "="*20
102
+ # puts query.inspect
103
+ # end
104
+
105
+ res &&=( @query_id==query.query_id)
106
+ res &&=( @query_def==query.query_def)
107
+ res &&=( @full_query_length==query.full_query_length)
108
+
109
+
75
110
  return res
76
111
  end
77
112
 
@@ -86,7 +121,7 @@ private
86
121
  merged_ids.push hit.definition if !merged_ids.nil? && (!merged_ids.include?(hit.definition))
87
122
 
88
123
  # find overlapping hits
89
- c=merged_hits.find{|c| hit.query_overlaps?(c)}
124
+ c=merged_hits.find{|c2| hit.query_overlaps?(c2)}
90
125
 
91
126
  if (c.nil?)
92
127
  # add new hit
@@ -0,0 +1,89 @@
1
+ # Copyright (c) 2010 Dario Guerrero & Almudena Bocinos
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # 'Software'), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+
23
+ require "blast_query.rb"
24
+ require "blast_hit.rb"
25
+
26
+
27
+
28
+ # Extracts results from blast table's file and uses it to create instances of "BlastQuery" and "BlastHit"
29
+ class BlastResult
30
+
31
+ attr_accessor :querys
32
+
33
+ # Parser initialization
34
+ def initialize(input)
35
+
36
+ @querys = []
37
+
38
+ # if input.is_a?(Array)
39
+ # lines=input
40
+ # else
41
+ # fich = File.open(input,'r')
42
+ # lines = fich.readlines
43
+ # fich.close
44
+ # end
45
+ end
46
+
47
+
48
+ # inspect results
49
+ def inspect
50
+ res = "Blast results:\n"
51
+ res+= '-'*20
52
+ res+= "\nQuerys: #{@querys.count}\n"
53
+ @querys.each{|q| res+=q.inspect+"\n"}
54
+ return res
55
+ end
56
+
57
+ # find query by name
58
+ def find_query(querys,name_q)
59
+ # newq = querys.find{|q| ( q.find{|h| (h.subject_id)})}
60
+ new_q=nil
61
+
62
+ if !querys.empty?
63
+ new_q=querys.find{|q| (q.query_id==name_q)}
64
+ end
65
+
66
+ return new_q
67
+ end
68
+
69
+ # check if there are querys
70
+ def empty?
71
+ return @querys.empty?
72
+ end
73
+
74
+ # get query count
75
+ def size
76
+ @querys.size
77
+ end
78
+
79
+ def compare?(results)
80
+ res = true
81
+
82
+ @querys.each_with_index do |q,i|
83
+ res &&= q.compare?(results.querys[i])
84
+ end
85
+
86
+ return res
87
+ end
88
+
89
+ end
@@ -27,12 +27,12 @@ require 'xmlsimple'
27
27
 
28
28
  # Extracts results from a blast results in XML
29
29
  # format and uses it to create instances of "BlastQuery" and "BlastHit"
30
- class BlastSimplexmlResult
30
+ class BlastSimplexmlResult < BlastResult
31
31
 
32
32
  # Parser initialization
33
33
  def initialize(input)
34
+ super(input)
34
35
 
35
- @querys = []
36
36
  lines=[]
37
37
  if input.is_a?(Array)
38
38
  lines=input
@@ -44,8 +44,11 @@ class BlastSimplexmlResult
44
44
  else
45
45
  raise "File #{input} doesn't exists"
46
46
  end
47
-
48
47
  end
48
+ parse(lines)
49
+ end
50
+
51
+ def parse(lines)
49
52
 
50
53
  # puts "lines length #{lines.length}"
51
54
  if !lines.empty?
@@ -59,12 +62,13 @@ class BlastSimplexmlResult
59
62
  # puts JSON::pretty_generate(iteration)
60
63
 
61
64
  query_id = iteration['Iteration_query-ID'][0]
62
- full_query_length = iteration['Iteration_query-len'][0]
65
+ full_query_length = iteration['Iteration_query-len'][0].to_i
63
66
  query_def = iteration['Iteration_query-def'][0]
64
67
 
65
68
  if query_def =~ /^([^\s]+)/
66
69
  query_def=$1
67
70
  end
71
+
68
72
 
69
73
  #@query_def = iteration['Iteration_query-def'][0]
70
74
 
@@ -135,38 +139,4 @@ class BlastSimplexmlResult
135
139
  #inspect
136
140
  end
137
141
 
138
-
139
-
140
- def inspect
141
-
142
- res = "Blast results:\n"
143
- res+= '-'*20
144
- res+= "\nQuerys: #{@querys.count}\n"
145
- @querys.each{|q| res+=q.inspect+"\n"}
146
- return res
147
- end
148
-
149
- # finds a query by name
150
- def find_query(querys,name_q)
151
- # newq = querys.find{|q| ( q.find{|h| (h.subject_id)})}
152
- new_q=nil
153
-
154
- if !querys.empty?
155
- new_q=querys.find{|q| (q.query_id==name_q)}
156
- end
157
-
158
- return new_q
159
- end
160
-
161
- # check if there are querys
162
- def empty?
163
- return @querys.empty?
164
- end
165
-
166
- # get num of querys
167
- def size
168
- @querys.size
169
- end
170
-
171
- attr_accessor :querys
172
142
  end
@@ -0,0 +1,181 @@
1
+ require "blast_query.rb"
2
+ require "blast_hit.rb"
3
+
4
+ require 'rexml/document'
5
+ require 'rexml/streamlistener'
6
+
7
+ include REXML
8
+ include REXML::StreamListener
9
+
10
+ # Extracts results from a blast results in XML
11
+ # format and uses it to create instances of "BlastQuery" and "BlastHit"
12
+ class BlastStreamxmlResult < BlastResult
13
+
14
+ # Parser initialization
15
+ def initialize(input)
16
+ super(input)
17
+
18
+ lines=[]
19
+
20
+ # some variables for tracking the state of the parse
21
+ @current_query = nil
22
+ @current_hit = nil
23
+ @current_element = nil
24
+ @current_hit_subject_id=''
25
+ @current_hit_acc=''
26
+ @current_hit_full_subject_length=0
27
+ @current_hit_hit_def=''
28
+
29
+ # @state = nil # (values :in_query,:in_hit)
30
+
31
+
32
+ if input.is_a?(Array)
33
+ lines=input.join("\n")
34
+ do_parse(lines)
35
+
36
+ elsif !input.strip.empty?
37
+
38
+ if File.exists?(input)
39
+ lines= File.open(input,'r')
40
+ # @lines = fich.readlines
41
+ # fich.close
42
+ do_parse(lines)
43
+ lines.close
44
+ else
45
+ raise "File #{input} doesn't exists"
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+
52
+ def tag_start(name, attributes)
53
+ # puts "+#{name}: #{attributes}"
54
+ case name
55
+ when 'Iteration'
56
+ @current_query= BlastQuery.new(-1)
57
+
58
+ when 'Hit'
59
+ @current_hit_subject_id=''
60
+ @current_hit_acc=''
61
+ @current_hit_full_subject_length=0
62
+ @current_hit_hit_def=''
63
+
64
+ when 'Hsp'
65
+ @current_hit = BlastHit.new(0,0,0,0)
66
+
67
+ # populate results from hit
68
+ @current_hit.subject_id=@current_hit_subject_id
69
+ @current_hit.full_subject_length=@current_hit_full_subject_length
70
+ @current_hit.definition=@current_hit_hit_def
71
+ @current_hit.acc=@current_hit_acc
72
+ else
73
+ @current_element = name
74
+ end
75
+
76
+ end
77
+
78
+ def tag_end(name)
79
+
80
+ case name
81
+ when 'Iteration'
82
+ @querys.push @current_query
83
+ @current_query=nil
84
+ when 'Hit'
85
+ @current_hit_subject_id=''
86
+ @current_hit_acc=''
87
+ @current_hit_full_subject_length=0
88
+ @current_hit_hit_def=''
89
+ @current_hit=nil
90
+
91
+ when 'Hsp'
92
+ @current_hit.set_limits(@current_hit.q_beg,@current_hit.q_end,@current_hit.s_beg,@current_hit.s_end)
93
+
94
+ @current_query.hits.push @current_hit
95
+
96
+ end
97
+
98
+ @current_element=nil
99
+ # puts "-#{name}"
100
+
101
+ end
102
+
103
+ def text(text)
104
+
105
+ case @current_element
106
+
107
+ # values for querys
108
+ when 'Iteration_query-ID'
109
+ @current_query.query_id=text
110
+ when 'Iteration_query-len'
111
+ @current_query.full_query_length=text.to_i
112
+ when 'Iteration_query-def'
113
+ @current_query.query_def=text
114
+
115
+ # values for hits
116
+ when 'Hit_id'
117
+ @current_hit_subject_id=text
118
+ when 'Hit_accession'
119
+ @current_hit_acc=text
120
+ when 'Hit_len'
121
+ @current_hit_full_subject_length=text.to_i
122
+ when 'Hit_def'
123
+ @current_hit_hit_def=text
124
+ if @current_hit_hit_def=='No definition line'
125
+ @current_hit_hit_def =@current_hit_subject_id
126
+ end
127
+
128
+ # values for HSPs
129
+
130
+
131
+ when 'Hsp_query-from'
132
+ # puts "QBEG1:#{text.to_i}"
133
+ @current_hit.q_beg=text.to_i
134
+ # puts "QBEG2:#{@current_hit.q_beg},#{text.to_i}"
135
+ when 'Hsp_query-to'
136
+ @current_hit.q_end=text.to_i
137
+ when 'Hsp_hit-from'
138
+ @current_hit.s_beg=text.to_i
139
+ when 'Hsp_hit-to'
140
+ @current_hit.s_end=text.to_i
141
+ when 'Hsp_align-len'
142
+ @current_hit.align_len=text.to_i
143
+ @current_hit.ident=(@current_hit.ident/@current_hit.align_len)*100
144
+ when 'Hsp_identity'
145
+
146
+ @current_hit.ident=(text.to_f)
147
+ # @current_hit.ident=(text.to_f/@current_hit.align_len)*100
148
+ # percent calculation now goes to align-len
149
+ when 'Hsp_gaps'
150
+ @current_hit.gaps=text.to_i
151
+ when 'Hsp_midline'
152
+ @current_hit.mismatches= text.count(' ').to_i - @current_hit.gaps
153
+ when 'Hsp_evalue'
154
+ @current_hit.e_val=text.to_f
155
+ @current_hit.e_val = (@current_hit.e_val*1000).round/1000.0
156
+ when 'Hsp_bit-score'
157
+ @current_hit.bit_score=text.to_f
158
+ @current_hit.bit_score = (@current_hit.bit_score*100).round/100.0
159
+ when 'Hsp_score'
160
+ @current_hit.score =text.to_f
161
+ when 'Hsp_query-frame'
162
+ @current_hit.q_frame = text.to_i
163
+ when 'Hsp_hit-frame'
164
+ @current_hit.s_frame =text.to_i
165
+
166
+ when 'Hsp_qseq'
167
+ @current_hit.q_seq = text
168
+ when 'Hsp_hseq'
169
+ @current_hit.s_seq = text
170
+
171
+ end
172
+
173
+ # reset the current element so we don't pick up empty text
174
+ @current_element = nil
175
+ end
176
+
177
+ def do_parse(lines)
178
+ Document.parse_stream(lines, self)
179
+ end
180
+
181
+ end
@@ -24,14 +24,13 @@ require "blast_query.rb"
24
24
  require "blast_hit.rb"
25
25
 
26
26
 
27
-
28
27
  # Extracts results from blast table's file and uses it to create instances of "BlastQuery" and "BlastHit"
29
- class BlastTableResult
28
+ class BlastTableResult < BlastResult
30
29
 
31
30
  # Parser initialization
32
31
  def initialize(input)
33
32
 
34
- @querys = []
33
+ super(input)
35
34
 
36
35
 
37
36
  if input.is_a?(Array)
@@ -44,7 +43,10 @@ class BlastTableResult
44
43
  fich.close
45
44
 
46
45
  end
47
-
46
+ parse(lines)
47
+ end
48
+
49
+ def parse(lines)
48
50
  query_name=''
49
51
 
50
52
  lines.each do |line|
@@ -57,9 +59,9 @@ class BlastTableResult
57
59
  elsif line =~ /^#\s0\shits\sfound$/
58
60
  @querys.push BlastQuery.new(query_name)
59
61
  end
62
+
60
63
  # 0 hits found
61
64
 
62
-
63
65
  else
64
66
  params = line.split(/\t+/)
65
67
 
@@ -168,38 +170,4 @@ class BlastTableResult
168
170
 
169
171
  end
170
172
 
171
-
172
- # inspect results
173
- def inspect
174
- res = "Blast results:\n"
175
- res+= '-'*20
176
- res+= "\nQuerys: #{@querys.count}\n"
177
- @querys.each{|q| res+=q.inspect+"\n"}
178
- return res
179
- end
180
-
181
- # find query by name
182
- def find_query(querys,name_q)
183
- # newq = querys.find{|q| ( q.find{|h| (h.subject_id)})}
184
- new_q=nil
185
-
186
- if !querys.empty?
187
- new_q=querys.find{|q| (q.query_id==name_q)}
188
- end
189
-
190
- return new_q
191
- end
192
-
193
- # check if there are querys
194
- def empty?
195
-
196
- return @querys.empty?
197
- end
198
-
199
- # get query count
200
- def size
201
- @querys.size
202
- end
203
-
204
- attr_accessor :querys
205
173
  end
data/lib/scbi_blast.rb CHANGED
@@ -26,12 +26,14 @@ require 'batch_blast'
26
26
  require 'dust_masker'
27
27
  require 'blast_query'
28
28
  # require 'blast_xml_result'
29
+ require 'blast_result'
29
30
  require 'blast_simplexml_result'
31
+ require 'blast_streamxml_result'
30
32
  require 'blast_hit'
31
33
  require 'blast_table_result'
32
34
 
33
35
  module ScbiBlast
34
- VERSION = '0.0.33'
36
+ VERSION = '0.0.34'
35
37
  end
36
38
 
37
39
 
@@ -17,15 +17,48 @@ class TestScbiBlast < Test::Unit::TestCase
17
17
  puts res.inspect
18
18
  end
19
19
 
20
- def test_querys
21
- res = BlastSimplexmlResult.new(File.join(File.dirname(__FILE__),'blast.xml'))
20
+ def test_querys
21
+ res = BlastSimplexmlResult.new(File.join(File.dirname(__FILE__),'blast.xml'))
22
22
  # puts "BLAST.XML"
23
23
  # puts res.inspect
24
- assert_equal(2,res.querys.count)
25
- assert_equal(2,res.querys[0].hits.count)
26
- assert_equal(2,res.querys[1].hits.count)
27
-
28
- end
24
+ assert_equal(2,res.querys.count)
25
+ assert_equal(2,res.querys[0].hits.count)
26
+ assert_equal(2,res.querys[1].hits.count)
27
+
28
+ end
29
+
30
+ def test_streamxml
31
+ file='blast.xml'
32
+
33
+ resStream = BlastStreamxmlResult.new(File.join(File.dirname(__FILE__),file))
34
+ resSimple = BlastSimplexmlResult.new(File.join(File.dirname(__FILE__),file))
35
+
36
+ # res = BlastStreamxmlResult.new(File.join(File.dirname(__FILE__),'db_1.xml'))
37
+ # puts "BLAST.XML"
38
+ # puts res.inspect
39
+ assert_equal(2,resStream.querys.count)
40
+ assert_equal(2,resStream.querys[0].hits.count)
41
+ assert_equal(2,resStream.querys[1].hits.count)
42
+
43
+ assert(resStream.compare?(resSimple))
44
+
45
+ resStream.querys.each_with_index do |q,i|
46
+ q2=resSimple.querys[i]
47
+
48
+ q.hits.each_with_index do |h,i2|
49
+ h2=q2.hits[i2]
50
+ assert(h.compare?(h2),"Hits not equal: #{h.inspect},#{h2.inspect}")
51
+ end
52
+
53
+ assert_equal(q.query_id,q2.query_id)
54
+ assert_equal(q.query_def,q2.query_def)
55
+ assert_equal(q.full_query_length , q2.full_query_length)
56
+
57
+ assert(q.compare?(q2),"Query not equal: #{q.inspect},#{q2.inspect}")
58
+
59
+ end
60
+
61
+ end
29
62
 
30
63
  def test_hits
31
64
  assert true
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: scbi_blast
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.33
5
+ version: 0.0.34
6
6
  platform: ruby
7
7
  authors:
8
8
  - Dario Guerrero & Almudena Bocinos
@@ -10,19 +10,30 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-06 00:00:00 Z
13
+ date: 2012-04-30 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: hoe
16
+ name: xml-simple
17
17
  prerelease: false
18
18
  requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.0.12
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: hoe
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
19
30
  none: false
20
31
  requirements:
21
32
  - - ">="
22
33
  - !ruby/object:Gem::Version
23
34
  version: 2.8.0
24
35
  type: :development
25
- version_requirements: *id001
36
+ version_requirements: *id002
26
37
  description: |-
27
38
  scbi_blast is a ruby gem to handle blast+ executions without the need of temporary files,
28
39
  it has been developed at [SCBI](http://www.scbi.uma.es) by Almudena Bocinos & Dario Guerrero.
@@ -53,9 +64,11 @@ files:
53
64
  - test/blast.txt
54
65
  - lib/scbi_blast/blast_hit.rb
55
66
  - lib/scbi_blast/blast_query.rb
67
+ - lib/scbi_blast/blast_result.rb
56
68
  - lib/scbi_blast/blast_table_result.rb
57
69
  - lib/scbi_blast/blast_xml_result.rb
58
70
  - lib/scbi_blast/blast_simplexml_result.rb
71
+ - lib/scbi_blast/blast_streamxml_result.rb
59
72
  - lib/scbi_blast/batch_blast.rb
60
73
  - lib/scbi_blast/dust_masker.rb
61
74
  homepage: http://www.scbi.uma.es/downloads