genomer-plugin-summary 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,285 @@
1
+ require 'spec_helper'
2
+ require 'genomer-plugin-summary/format'
3
+
4
+ describe GenomerPluginSummary::Format do
5
+
6
+ subject do
7
+ o = Object.new
8
+ o.extend described_class
9
+ o.table(data,options.merge(:output => output))
10
+ end
11
+
12
+ describe "#table" do
13
+
14
+ let(:data) do
15
+ [['Contigs (#)',1.0],
16
+ :separator,
17
+ ['Gaps (#)',0]]
18
+ end
19
+
20
+ context "passed no output option" do
21
+
22
+ let(:output) do
23
+ nil
24
+ end
25
+
26
+ context "without any addtional options" do
27
+
28
+ let(:options) do
29
+ {}
30
+ end
31
+
32
+ it do
33
+ should ==<<-EOS.unindent!
34
+ +-------------+-----+
35
+ | Contigs (#) | 1.0 |
36
+ +-------------+-----+
37
+ | Gaps (#) | 0 |
38
+ +-------------+-----+
39
+ EOS
40
+ end
41
+ end
42
+
43
+ context "the header option" do
44
+
45
+ let(:options) do
46
+ {:title => 'Scaffold' }
47
+ end
48
+
49
+ it do
50
+ should ==<<-EOS.unindent!
51
+ +-------------+-----+
52
+ | Scaffold |
53
+ +-------------+-----+
54
+ | Contigs (#) | 1.0 |
55
+ +-------------+-----+
56
+ | Gaps (#) | 0 |
57
+ +-------------+-----+
58
+ EOS
59
+ end
60
+
61
+ end
62
+
63
+ context "with the justification option" do
64
+
65
+ let(:options) do
66
+ {:justification => {
67
+ 0 => :left,
68
+ 1 => :right
69
+ }}
70
+ end
71
+
72
+ it do
73
+ should ==<<-EOS.unindent!
74
+ +-------------+-----+
75
+ | Contigs (#) | 1.0 |
76
+ +-------------+-----+
77
+ | Gaps (#) | 0 |
78
+ +-------------+-----+
79
+ EOS
80
+ end
81
+ end
82
+
83
+ context "with the width option" do
84
+
85
+ let(:options) do
86
+ {:width => { 0 => 15, 1 => 10 },
87
+ :justification => { 1 => :right }}
88
+ end
89
+
90
+ it do
91
+ should ==<<-EOS.unindent!
92
+ +-----------------+------------+
93
+ | Contigs (#) | 1.0 |
94
+ +-----------------+------------+
95
+ | Gaps (#) | 0 |
96
+ +-----------------+------------+
97
+ EOS
98
+ end
99
+
100
+ end
101
+
102
+ context "with the format option" do
103
+
104
+ let(:options) do
105
+ {:format => { 1 => '%#.2f'}}
106
+ end
107
+
108
+ it do
109
+ should ==<<-EOS.unindent!
110
+ +-------------+------+
111
+ | Contigs (#) | 1.00 |
112
+ +-------------+------+
113
+ | Gaps (#) | 0.00 |
114
+ +-------------+------+
115
+ EOS
116
+ end
117
+
118
+ end
119
+
120
+ context "with the format option as a lambda" do
121
+
122
+ let(:options) do
123
+ {:format => { 1 => lambda{|i| i.class == Float ? sprintf('%#.2f',i) : i }}}
124
+ end
125
+
126
+ it do
127
+ should ==<<-EOS.unindent!
128
+ +-------------+------+
129
+ | Contigs (#) | 1.00 |
130
+ +-------------+------+
131
+ | Gaps (#) | 0 |
132
+ +-------------+------+
133
+ EOS
134
+ end
135
+
136
+ end
137
+
138
+ context "with the header option" do
139
+
140
+ let(:options) do
141
+ {:headers => ['One','Two']}
142
+ end
143
+
144
+ it do
145
+ should ==<<-EOS.unindent!
146
+ +-------------+-----+
147
+ | One | Two |
148
+ +-------------+-----+
149
+ | Contigs (#) | 1.0 |
150
+ +-------------+-----+
151
+ | Gaps (#) | 0 |
152
+ +-------------+-----+
153
+ EOS
154
+ end
155
+
156
+ end
157
+
158
+ context "with the header and width options but no data" do
159
+
160
+ let(:options) do
161
+ {:headers => ['One','Two'],
162
+ :width => { 0 => 15, 1 => 10 }}
163
+ end
164
+
165
+ let(:data) do
166
+ []
167
+ end
168
+
169
+ it do
170
+ should ==<<-EOS.unindent!
171
+ +-----------------+------------+
172
+ | One | Two |
173
+ +-----------------+------------+
174
+ +-----------------+------------+
175
+ EOS
176
+ end
177
+
178
+ end
179
+
180
+ end
181
+
182
+ context "passed the csv output option" do
183
+
184
+ let(:output) do
185
+ 'csv'
186
+ end
187
+
188
+ context "without any additional options" do
189
+
190
+ let(:options) do
191
+ {}
192
+ end
193
+
194
+ it do
195
+ should ==<<-EOS.unindent!
196
+ contigs_#,1.0
197
+ gaps_#,0
198
+ EOS
199
+ end
200
+ end
201
+
202
+ context "with the justification option" do
203
+
204
+ let(:options) do
205
+ {:justification => {
206
+ 0 => :left,
207
+ 1 => :right
208
+ }}
209
+ end
210
+
211
+ it do
212
+ should ==<<-EOS.unindent!
213
+ contigs_#,1.0
214
+ gaps_#,0
215
+ EOS
216
+ end
217
+ end
218
+
219
+ context "with the width option" do
220
+
221
+ let(:options) do
222
+ {:width => { 0 => 15, 1 => 10 },
223
+ :justification => { 1 => :right }}
224
+ end
225
+
226
+ it do
227
+ should ==<<-EOS.unindent!
228
+ contigs_#,1.0
229
+ gaps_#,0
230
+ EOS
231
+ end
232
+
233
+ end
234
+
235
+ context "with the header option" do
236
+
237
+ let(:options) do
238
+ {:headers => ['One','Two']}
239
+ end
240
+
241
+ it do
242
+ should ==<<-EOS.unindent!
243
+ one,two
244
+ contigs_#,1.0
245
+ gaps_#,0
246
+ EOS
247
+ end
248
+
249
+ end
250
+
251
+ context "with the format option" do
252
+
253
+ let(:options) do
254
+ {:format => { 1 => '%#.2f'}}
255
+ end
256
+
257
+ it do
258
+ should ==<<-EOS.unindent!
259
+ contigs_#,1.00
260
+ gaps_#,0.00
261
+ EOS
262
+ end
263
+
264
+ end
265
+
266
+ context "with the format option as a lambda" do
267
+
268
+ let(:options) do
269
+ {:format => { 1 => lambda{|i| i.class == Float ? sprintf('%#.2f',i) : i }}}
270
+ end
271
+
272
+ it do
273
+ should ==<<-EOS.unindent!
274
+ contigs_#,1.00
275
+ gaps_#,0
276
+ EOS
277
+ end
278
+
279
+ end
280
+
281
+ end
282
+
283
+ end
284
+
285
+ end
@@ -6,12 +6,16 @@ describe GenomerPluginSummary::Gaps do
6
6
  describe "#tabulate" do
7
7
 
8
8
  subject do
9
- described_class.new([],{}).tabulate(contigs) + "\n"
9
+ described_class.new([],{}).tabulate(sequences,flags)
10
+ end
11
+
12
+ let(:flags) do
13
+ {}
10
14
  end
11
15
 
12
16
  context "passed an empty array" do
13
17
 
14
- let(:contigs) do
18
+ let(:sequences) do
15
19
  []
16
20
  end
17
21
 
@@ -30,7 +34,7 @@ describe GenomerPluginSummary::Gaps do
30
34
 
31
35
  context "passed an array with one entry" do
32
36
 
33
- let(:contigs) do
37
+ let(:sequences) do
34
38
  [{:number => 1, :length => 1, :start => 1, :end => 1, :type => :contig}]
35
39
  end
36
40
 
@@ -50,7 +54,7 @@ describe GenomerPluginSummary::Gaps do
50
54
 
51
55
  context "passed an array with two entries" do
52
56
 
53
- let(:contigs) do
57
+ let(:sequences) do
54
58
  [{:number => 1, :length => 1, :start => 1, :end => 1, :type => :contig},
55
59
  {:number => 2, :length => 2, :start => 2, :end => 2, :type => :unresolved}]
56
60
  end
@@ -70,6 +74,27 @@ describe GenomerPluginSummary::Gaps do
70
74
 
71
75
  end
72
76
 
77
+ context "passed the csv option" do
78
+
79
+ let(:flags) do
80
+ {:output => 'csv'}
81
+ end
82
+
83
+ let(:sequences) do
84
+ [{:number => 1, :length => 1, :start => 1, :end => 1, :type => :contig},
85
+ {:number => 2, :length => 2, :start => 2, :end => 2, :type => :unresolved}]
86
+ end
87
+
88
+ it do
89
+ should ==<<-EOS.unindent!
90
+ number,length,start,end,type
91
+ 1,1,1,1,contig
92
+ 2,2,2,2,unresolved
93
+ EOS
94
+ end
95
+
96
+ end
97
+
73
98
  end
74
99
 
75
100
  describe "#determine_gaps" do
@@ -104,7 +129,7 @@ describe GenomerPluginSummary::Gaps do
104
129
  end
105
130
  end
106
131
 
107
- context "a scaffold with a two contigs containing gaps" do
132
+ context "a scaffold with a two sequences containing gaps" do
108
133
  let(:scaffold) do
109
134
  [sequence('AANNTT'), sequence('AANNTT')]
110
135
  end
@@ -116,7 +141,7 @@ describe GenomerPluginSummary::Gaps do
116
141
  end
117
142
  end
118
143
 
119
- context "a scaffold with two contigs separated by an unresolved region" do
144
+ context "a scaffold with two sequences separated by an unresolved region" do
120
145
  let(:scaffold) do
121
146
  [sequence('AAT'),
122
147
  unresolved('NNNNNNNNNN'),
@@ -129,7 +154,7 @@ describe GenomerPluginSummary::Gaps do
129
154
  end
130
155
  end
131
156
 
132
- context "a scaffold with a mixture of gapped contigs and unresolved regions" do
157
+ context "a scaffold with a mixture of gapped sequences and unresolved regions" do
133
158
  let(:scaffold) do
134
159
  [sequence('AAANNNTTT'),
135
160
  unresolved('NNNNNNNNNN'),
@@ -1,20 +1,24 @@
1
1
  require 'spec_helper'
2
- require 'genomer-plugin-summary/scaffold'
2
+ require 'genomer-plugin-summary/genome'
3
3
 
4
- describe GenomerPluginSummary::Scaffold do
4
+ describe GenomerPluginSummary::Genome do
5
5
 
6
6
  describe "#tabulate" do
7
7
 
8
8
  subject do
9
- described_class.new([],{}).tabulate(data) + "\n"
9
+ described_class.new([],{}).tabulate(data,flags)
10
+ end
11
+
12
+ let(:data) do
13
+ [['Contigs (#)',1.0],
14
+ :separator,
15
+ ['Gaps (#)',0]]
10
16
  end
11
17
 
12
18
  context "passed table data" do
13
19
 
14
- let(:data) do
15
- [['Contigs (#)',1.0],
16
- :separator,
17
- ['Gaps (#)',0]]
20
+ let(:flags) do
21
+ {}
18
22
  end
19
23
 
20
24
  it do
@@ -28,6 +32,21 @@ describe GenomerPluginSummary::Scaffold do
28
32
  +--------------+-----------+
29
33
  EOS
30
34
  end
35
+
36
+ end
37
+
38
+ context "passed table with the format option" do
39
+
40
+ let(:flags) do
41
+ {:output => 'csv'}
42
+ end
43
+
44
+ it do
45
+ should ==<<-EOS.unindent!
46
+ contigs_#,1.00
47
+ gaps_#,0
48
+ EOS
49
+ end
31
50
  end
32
51
  end
33
52
 
@@ -70,6 +70,7 @@ describe GenomerPluginSummary::Metrics do
70
70
  end
71
71
 
72
72
  end
73
+
73
74
  describe "#count" do
74
75
 
75
76
  subject do
@@ -252,4 +253,67 @@ describe GenomerPluginSummary::Metrics do
252
253
 
253
254
  end
254
255
 
256
+ describe "#sequence_total" do
257
+
258
+ def row(name,start,stop,percent,gc)
259
+ {:id => name,
260
+ :type => :sequence,
261
+ :start => start,
262
+ :stop => stop,
263
+ :size => (stop - start) + 1,
264
+ :percent => percent,
265
+ :gc => gc}
266
+ end
267
+
268
+ subject do
269
+ metric.sequence_total(sequences)
270
+ end
271
+
272
+ context "passed an empty array" do
273
+ let(:sequences) do
274
+ []
275
+ end
276
+
277
+ it do
278
+ should == {
279
+ :start => 0,
280
+ :stop => 0,
281
+ :size => 0,
282
+ :percent => 0,
283
+ :gc => 0 }
284
+ end
285
+ end
286
+
287
+ context "passed one entry" do
288
+ let(:sequences) do
289
+ [row('contig1',1,6,100.0,50.0)]
290
+ end
291
+
292
+ it do
293
+ should == {
294
+ :start => 1,
295
+ :stop => 6,
296
+ :size => 6,
297
+ :percent => 100.0,
298
+ :gc => 50.0 }
299
+ end
300
+ end
301
+
302
+ context "passed two entries less than 100% of the scaffold" do
303
+ let(:sequences) do
304
+ [row('contig1', 1, 6, 30.0, 50.0),
305
+ row('contig2', 15, 20, 30.0, 50.0)]
306
+ end
307
+
308
+ it do
309
+ should == {
310
+ :start => 1,
311
+ :stop => 20,
312
+ :size => 12,
313
+ :percent => 60.0,
314
+ :gc => 50.0 }
315
+ end
316
+ end
317
+ end
318
+
255
319
  end
@@ -4,9 +4,10 @@ require 'genomer-plugin-summary/sequences'
4
4
  describe GenomerPluginSummary::Sequences do
5
5
 
6
6
  def row(name,start,stop,percent,gc)
7
- {:sequence => name,
7
+ {:id => name,
8
+ :type => :sequence,
8
9
  :start => start,
9
- :end => stop,
10
+ :stop => stop,
10
11
  :size => (stop - start) + 1,
11
12
  :percent => percent,
12
13
  :gc => gc}
@@ -15,7 +16,11 @@ describe GenomerPluginSummary::Sequences do
15
16
  describe "#tabulate" do
16
17
 
17
18
  subject do
18
- described_class.new([],{}).tabulate(sequences,total) + "\n"
19
+ described_class.new([],{}).tabulate(sequences,total,flags)
20
+ end
21
+
22
+ let(:flags) do
23
+ {}
19
24
  end
20
25
 
21
26
  context "passed an empty array" do
@@ -25,11 +30,11 @@ describe GenomerPluginSummary::Sequences do
25
30
  end
26
31
 
27
32
  let(:total) do
28
- {:start => 'NA',
29
- :end => 'NA',
30
- :size => 'NA',
31
- :percent => 'NA',
32
- :gc => 'NA' }
33
+ {:start => 0,
34
+ :stop => 0,
35
+ :size => 0,
36
+ :percent => 0,
37
+ :gc => 0 }
33
38
  end
34
39
 
35
40
  it do
@@ -37,10 +42,10 @@ describe GenomerPluginSummary::Sequences do
37
42
  +------------------+------------+------------+------------+----------+--------+
38
43
  | Scaffold Sequences |
39
44
  +------------------+------------+------------+------------+----------+--------+
40
- | Sequence | Start (bp) | End (bp) | Size (bp) | Size (%) | GC (%) |
45
+ | Sequence | Start (bp) | End (bp) | Size (bp) | Size (%) | GC (%) |
41
46
  +------------------+------------+------------+------------+----------+--------+
42
47
  +------------------+------------+------------+------------+----------+--------+
43
- | All | NA | NA | NA | NA | NA |
48
+ | All | 0 | 0 | 0 | 0.00 | 0.00 |
44
49
  +------------------+------------+------------+------------+----------+--------+
45
50
  EOS
46
51
  end
@@ -50,17 +55,12 @@ describe GenomerPluginSummary::Sequences do
50
55
  context "passed an array with a single row" do
51
56
 
52
57
  let(:sequences) do
53
- [{:sequence => 'contig1',
54
- :start => '1',
55
- :end => '4',
56
- :size => '4',
57
- :percent => 100.0,
58
- :gc => 50.0 }]
58
+ [row('contig1',1,4,100.0,50.0)]
59
59
  end
60
60
 
61
61
  let(:total) do
62
62
  {:start => '1',
63
- :end => '4',
63
+ :stop => '4',
64
64
  :size => '4',
65
65
  :percent => 100.0,
66
66
  :gc => 50.0 }
@@ -71,7 +71,7 @@ describe GenomerPluginSummary::Sequences do
71
71
  +------------------+------------+------------+------------+----------+--------+
72
72
  | Scaffold Sequences |
73
73
  +------------------+------------+------------+------------+----------+--------+
74
- | Sequence | Start (bp) | End (bp) | Size (bp) | Size (%) | GC (%) |
74
+ | Sequence | Start (bp) | End (bp) | Size (bp) | Size (%) | GC (%) |
75
75
  +------------------+------------+------------+------------+----------+--------+
76
76
  | contig1 | 1 | 4 | 4 | 100.00 | 50.00 |
77
77
  +------------------+------------+------------+------------+----------+--------+
@@ -85,23 +85,13 @@ describe GenomerPluginSummary::Sequences do
85
85
  context "passed a array with two rows" do
86
86
 
87
87
  let(:sequences) do
88
- [{:sequence => 'contig1',
89
- :start => '1',
90
- :end => '4',
91
- :size => '4',
92
- :percent => 100.0,
93
- :gc => 50.0 },
94
- {:sequence => 'contig2',
95
- :start => '1',
96
- :end => '4',
97
- :size => '4',
98
- :percent => 100.0,
99
- :gc => 50.0 }]
88
+ [row('contig1',1,4,100.0,50.0),
89
+ row('contig2',1,4,100.0,50.0)]
100
90
  end
101
91
 
102
92
  let(:total) do
103
93
  {:start => '1',
104
- :end => '4',
94
+ :stop => '4',
105
95
  :size => '4',
106
96
  :percent => 100.0,
107
97
  :gc => 50.0 }
@@ -112,7 +102,7 @@ describe GenomerPluginSummary::Sequences do
112
102
  +------------------+------------+------------+------------+----------+--------+
113
103
  | Scaffold Sequences |
114
104
  +------------------+------------+------------+------------+----------+--------+
115
- | Sequence | Start (bp) | End (bp) | Size (bp) | Size (%) | GC (%) |
105
+ | Sequence | Start (bp) | End (bp) | Size (bp) | Size (%) | GC (%) |
116
106
  +------------------+------------+------------+------------+----------+--------+
117
107
  | contig1 | 1 | 4 | 4 | 100.00 | 50.00 |
118
108
  | contig2 | 1 | 4 | 4 | 100.00 | 50.00 |
@@ -124,6 +114,36 @@ describe GenomerPluginSummary::Sequences do
124
114
 
125
115
  end
126
116
 
117
+ context "passed the csv output option" do
118
+
119
+ let(:flags) do
120
+ {:output => 'csv'}
121
+ end
122
+
123
+ let(:sequences) do
124
+ [row('contig1',1,4,100.0,50.0),
125
+ row('contig2',1,4,100.0,50.0)]
126
+ end
127
+
128
+ let(:total) do
129
+ {:start => '1',
130
+ :stop => '4',
131
+ :size => '4',
132
+ :percent => 100.0,
133
+ :gc => 50.0 }
134
+ end
135
+
136
+ it do
137
+ should ==<<-EOS.unindent!
138
+ sequence,start_bp,end_bp,size_bp,size_%,gc_%
139
+ contig1,1,4,4,100.00,50.00
140
+ contig2,1,4,4,100.00,50.00
141
+ all,1,4,4,100.00,50.00
142
+ EOS
143
+ end
144
+
145
+ end
146
+
127
147
  end
128
148
 
129
149
  describe "#calculate" do
@@ -179,57 +199,4 @@ describe GenomerPluginSummary::Sequences do
179
199
 
180
200
  end
181
201
 
182
- describe "#total" do
183
-
184
- subject do
185
- described_class.new([],{}).total(sequences)
186
- end
187
-
188
- context "passed an empty array" do
189
- let(:sequences) do
190
- []
191
- end
192
-
193
- it do
194
- should == {
195
- :start => 'NA',
196
- :end => 'NA',
197
- :size => 'NA',
198
- :percent => 'NA',
199
- :gc => 'NA' }
200
- end
201
- end
202
-
203
- context "passed one entry" do
204
- let(:sequences) do
205
- [row('contig1',1,6,100.0,50.0)]
206
- end
207
-
208
- it do
209
- should == {
210
- :start => 1,
211
- :end => 6,
212
- :size => 6,
213
- :percent => 100.0,
214
- :gc => 50.0 }
215
- end
216
- end
217
-
218
- context "passed two entries less than 100% of the scaffold" do
219
- let(:sequences) do
220
- [row('contig1', 1, 6, 30.0, 50.0),
221
- row('contig2', 15, 20, 30.0, 50.0)]
222
- end
223
-
224
- it do
225
- should == {
226
- :start => 1,
227
- :end => 20,
228
- :size => 12,
229
- :percent => 60.0,
230
- :gc => 50.0 }
231
- end
232
- end
233
- end
234
-
235
202
  end