daru 0.1.3.1 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rspec +2 -1
- data/.rspec_formatter.rb +33 -0
- data/.rubocop.yml +26 -2
- data/History.md +38 -0
- data/README.md +22 -13
- data/Rakefile +50 -2
- data/benchmarks/csv_reading.rb +22 -0
- data/daru.gemspec +9 -2
- data/lib/daru.rb +36 -4
- data/lib/daru/accessors/array_wrapper.rb +6 -1
- data/lib/daru/accessors/dataframe_by_row.rb +10 -2
- data/lib/daru/accessors/gsl_wrapper.rb +1 -3
- data/lib/daru/accessors/nmatrix_wrapper.rb +9 -0
- data/lib/daru/category.rb +935 -0
- data/lib/daru/core/group_by.rb +29 -38
- data/lib/daru/core/merge.rb +186 -145
- data/lib/daru/core/query.rb +22 -11
- data/lib/daru/dataframe.rb +976 -885
- data/lib/daru/date_time/index.rb +166 -166
- data/lib/daru/date_time/offsets.rb +66 -77
- data/lib/daru/formatters/table.rb +54 -0
- data/lib/daru/helpers/array.rb +40 -0
- data/lib/daru/index.rb +476 -73
- data/lib/daru/io/io.rb +66 -45
- data/lib/daru/io/sql_data_source.rb +33 -62
- data/lib/daru/iruby/helpers.rb +38 -0
- data/lib/daru/iruby/templates/dataframe.html.erb +52 -0
- data/lib/daru/iruby/templates/dataframe_mi.html.erb +58 -0
- data/lib/daru/iruby/templates/multi_index.html.erb +12 -0
- data/lib/daru/iruby/templates/vector.html.erb +27 -0
- data/lib/daru/iruby/templates/vector_mi.html.erb +36 -0
- data/lib/daru/maths/arithmetic/dataframe.rb +16 -18
- data/lib/daru/maths/arithmetic/vector.rb +4 -6
- data/lib/daru/maths/statistics/dataframe.rb +8 -15
- data/lib/daru/maths/statistics/vector.rb +120 -98
- data/lib/daru/monkeys.rb +12 -40
- data/lib/daru/plotting/gruff.rb +3 -0
- data/lib/daru/plotting/gruff/category.rb +49 -0
- data/lib/daru/plotting/gruff/dataframe.rb +91 -0
- data/lib/daru/plotting/gruff/vector.rb +57 -0
- data/lib/daru/plotting/nyaplot.rb +3 -0
- data/lib/daru/plotting/nyaplot/category.rb +34 -0
- data/lib/daru/plotting/nyaplot/dataframe.rb +187 -0
- data/lib/daru/plotting/nyaplot/vector.rb +46 -0
- data/lib/daru/vector.rb +694 -421
- data/lib/daru/version.rb +1 -1
- data/profile/_base.rb +23 -0
- data/profile/df_to_a.rb +10 -0
- data/profile/filter.rb +13 -0
- data/profile/joining.rb +13 -0
- data/profile/sorting.rb +12 -0
- data/profile/vector_each_with_index.rb +9 -0
- data/spec/accessors/wrappers_spec.rb +2 -4
- data/spec/categorical_spec.rb +1734 -0
- data/spec/core/group_by_spec.rb +52 -2
- data/spec/core/merge_spec.rb +63 -2
- data/spec/core/query_spec.rb +236 -80
- data/spec/dataframe_spec.rb +1373 -79
- data/spec/date_time/data_spec.rb +3 -5
- data/spec/date_time/index_spec.rb +154 -17
- data/spec/date_time/offsets_spec.rb +3 -4
- data/spec/fixtures/empties.dat +2 -0
- data/spec/fixtures/strings.dat +2 -0
- data/spec/formatters/table_formatter_spec.rb +99 -0
- data/spec/helpers_spec.rb +8 -0
- data/spec/index/categorical_index_spec.rb +168 -0
- data/spec/index/index_spec.rb +283 -0
- data/spec/index/multi_index_spec.rb +570 -0
- data/spec/io/io_spec.rb +31 -4
- data/spec/io/sql_data_source_spec.rb +0 -1
- data/spec/iruby/dataframe_spec.rb +172 -0
- data/spec/iruby/helpers_spec.rb +49 -0
- data/spec/iruby/multi_index_spec.rb +37 -0
- data/spec/iruby/vector_spec.rb +107 -0
- data/spec/math/arithmetic/dataframe_spec.rb +71 -13
- data/spec/math/arithmetic/vector_spec.rb +8 -10
- data/spec/math/statistics/dataframe_spec.rb +3 -5
- data/spec/math/statistics/vector_spec.rb +45 -55
- data/spec/monkeys_spec.rb +32 -9
- data/spec/plotting/dataframe_spec.rb +386 -0
- data/spec/plotting/vector_spec.rb +230 -0
- data/spec/shared/vector_display_spec.rb +215 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/vector_spec.rb +905 -138
- metadata +143 -11
- data/.rubocop_todo.yml +0 -44
- data/lib/daru/plotting/dataframe.rb +0 -104
- data/lib/daru/plotting/vector.rb +0 -38
- data/spec/daru_spec.rb +0 -58
- data/spec/index_spec.rb +0 -375
data/spec/date_time/data_spec.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
1
|
describe Daru::Vector do
|
4
2
|
context "#initialize" do
|
5
3
|
it "accepts DateTimeIndex in index option" do
|
@@ -70,7 +68,7 @@ describe Daru::Vector do
|
|
70
68
|
end
|
71
69
|
|
72
70
|
it "assigns multiple elements when index incomplete" do
|
73
|
-
index = Daru::DateTimeIndex.date_range(:start => '2012', :periods => 100,
|
71
|
+
index = Daru::DateTimeIndex.date_range(:start => '2012', :periods => 100,
|
74
72
|
:freq => 'MB')
|
75
73
|
vector = Daru::Vector.new([1,2,3,4,5,6,7,8,9,10]*10, index: index)
|
76
74
|
vector['2012'] = 666
|
@@ -88,7 +86,7 @@ describe Daru::DataFrame do
|
|
88
86
|
@a = [1,2,3,4,5]*20
|
89
87
|
@b = @a.map { |e| e*3 }
|
90
88
|
@c = @a.map(&:to_s)
|
91
|
-
@df = Daru::DataFrame.new([@a, @b, @c], index: @index, order: @order)
|
89
|
+
@df = Daru::DataFrame.new([@a, @b, @c], index: @index, order: @order)
|
92
90
|
end
|
93
91
|
|
94
92
|
context "#initialize" do
|
@@ -111,7 +109,7 @@ describe Daru::DataFrame do
|
|
111
109
|
|
112
110
|
it "returns DataFrame when incomplete index" do
|
113
111
|
answer = Daru::DataFrame.new(
|
114
|
-
[@a, @c], index: @index, order: Daru::DateTimeIndex.new([
|
112
|
+
[@a, @c], index: @index, order: Daru::DateTimeIndex.new([
|
115
113
|
DateTime.new(2012,1,3),DateTime.new(2012,3,3)]))
|
116
114
|
expect(@df['2012']).to eq(answer)
|
117
115
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
1
|
include Daru
|
4
2
|
|
5
3
|
describe DateTimeIndex do
|
@@ -32,6 +30,20 @@ describe DateTimeIndex do
|
|
32
30
|
end
|
33
31
|
end
|
34
32
|
|
33
|
+
context '.try_create' do
|
34
|
+
it 'creates index from array of dates' do
|
35
|
+
index = DateTimeIndex.try_create([
|
36
|
+
DateTime.new(2014,7,1),DateTime.new(2014,7,2),
|
37
|
+
DateTime.new(2014,7,3),DateTime.new(2014,7,4)])
|
38
|
+
expect(index.class).to eq(DateTimeIndex)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'does not creates index from anything else' do
|
42
|
+
index = DateTimeIndex.try_create([:a, :b, :c])
|
43
|
+
expect(index).to be_nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
35
47
|
context ".date_range" do
|
36
48
|
it "creates DateTimeIndex with default options" do
|
37
49
|
index = DateTimeIndex.date_range(:start => DateTime.new(2014,5,3),
|
@@ -54,6 +66,11 @@ describe DateTimeIndex do
|
|
54
66
|
expect(index.frequency).to eq('D')
|
55
67
|
end
|
56
68
|
|
69
|
+
it 'fails on wrong string format' do
|
70
|
+
expect{DateTimeIndex.date_range(start: '2014/5/3', end: '2014/5/10')}
|
71
|
+
.to raise_error(ArgumentError, /Unacceptable date string/)
|
72
|
+
end
|
73
|
+
|
57
74
|
it "creates DateTimeIndex of per minute frequency between start and end" do
|
58
75
|
index = DateTimeIndex.date_range(start: '2015-7-1',freq: 'M', periods: 10)
|
59
76
|
|
@@ -88,7 +105,7 @@ describe DateTimeIndex do
|
|
88
105
|
end
|
89
106
|
|
90
107
|
it "creates a DateTimeIndex of (sunday) weekly frequency" do
|
91
|
-
index = DateTimeIndex.date_range(start: '2014-8-2', end: '2014-9-8',
|
108
|
+
index = DateTimeIndex.date_range(start: '2014-8-2', end: '2014-9-8',
|
92
109
|
freq: 'W')
|
93
110
|
|
94
111
|
expect(index).to eq(DateTimeIndex.new([
|
@@ -98,7 +115,7 @@ describe DateTimeIndex do
|
|
98
115
|
end
|
99
116
|
|
100
117
|
it "creates a DateTimeIndex of (monday) weekly frequency" do
|
101
|
-
index = DateTimeIndex.date_range(:start => '2015-7-6', :periods => 5,
|
118
|
+
index = DateTimeIndex.date_range(:start => '2015-7-6', :periods => 5,
|
102
119
|
:freq => 'W-MON')
|
103
120
|
expect(index).to eq(DateTimeIndex.new([
|
104
121
|
DateTime.new(2015,7,6), DateTime.new(2015,7,13), DateTime.new(2015,7,20),
|
@@ -110,7 +127,7 @@ describe DateTimeIndex do
|
|
110
127
|
index = DateTimeIndex.date_range(
|
111
128
|
:start => '2017-4-14', :freq => 'MB', :periods => 5)
|
112
129
|
expect(index).to eq(DateTimeIndex.new([
|
113
|
-
DateTime.new(2017,5,1), DateTime.new(2017,6,1),
|
130
|
+
DateTime.new(2017,5,1), DateTime.new(2017,6,1),
|
114
131
|
DateTime.new(2017,7,1), DateTime.new(2017,8,1),DateTime.new(2017,9,1)]))
|
115
132
|
end
|
116
133
|
|
@@ -132,13 +149,13 @@ describe DateTimeIndex do
|
|
132
149
|
index = DateTimeIndex.date_range(start: '2014-9',end: '2018-1',freq: 'YE')
|
133
150
|
|
134
151
|
expect(index).to eq(DateTimeIndex.new([
|
135
|
-
DateTime.new(2014,12,31), DateTime.new(2015,12,31),DateTime.new(2016,12,31),
|
152
|
+
DateTime.new(2014,12,31), DateTime.new(2015,12,31),DateTime.new(2016,12,31),
|
136
153
|
DateTime.new(2017,12,31)]))
|
137
154
|
expect(index.frequency).to eq('YE')
|
138
155
|
end
|
139
156
|
|
140
157
|
it "creates only specfied number of periods taking precendence over end" do
|
141
|
-
index = DateTimeIndex.date_range(start: '2014-5-5', end: '2015-3',
|
158
|
+
index = DateTimeIndex.date_range(start: '2014-5-5', end: '2015-3',
|
142
159
|
periods: 5, freq: 'YB')
|
143
160
|
expect(index).to eq(DateTimeIndex.new([
|
144
161
|
DateTime.new(2015,1,1),DateTime.new(2016,1,1),DateTime.new(2017,1,1),
|
@@ -148,19 +165,45 @@ describe DateTimeIndex do
|
|
148
165
|
it "does not increment start date if it satisifies the anchor" do
|
149
166
|
index = DateTimeIndex.date_range(:start => '2012-1-1', freq: 'MB', periods: 4)
|
150
167
|
expect(index).to eq(DateTimeIndex.new(
|
151
|
-
[DateTime.new(2012,1,1), DateTime.new(2012,2,1),
|
168
|
+
[DateTime.new(2012,1,1), DateTime.new(2012,2,1),
|
152
169
|
DateTime.new(2012,3,1), DateTime.new(2012,4,1)]))
|
153
170
|
end
|
154
171
|
|
155
172
|
it "raises error for different start and end timezones" do
|
156
173
|
expect {
|
157
174
|
DateTimeIndex.date_range(
|
158
|
-
:start => DateTime.new(2012,3,4,12,5,4,"+5:30"),
|
175
|
+
:start => DateTime.new(2012,3,4,12,5,4,"+5:30"),
|
159
176
|
:end => DateTime.new(2013,3,4,12,5,4,"+7:30"), freq: 'M')
|
160
177
|
}.to raise_error(ArgumentError)
|
161
178
|
end
|
162
179
|
end
|
163
180
|
|
181
|
+
context '#inspect' do
|
182
|
+
subject { index.inspect }
|
183
|
+
|
184
|
+
context 'with known frequency' do
|
185
|
+
let(:index){
|
186
|
+
DateTimeIndex.new([
|
187
|
+
DateTime.new(2014,7,1),DateTime.new(2014,7,2),DateTime.new(2014,7,3),
|
188
|
+
DateTime.new(2014,7,4)], freq: :infer)
|
189
|
+
}
|
190
|
+
it { is_expected.to eq \
|
191
|
+
"#<Daru::DateTimeIndex(4, frequency=D) 2014-07-01T00:00:00+00:00...2014-07-04T00:00:00+00:00>"
|
192
|
+
}
|
193
|
+
end
|
194
|
+
|
195
|
+
context 'with unknown frequency' do
|
196
|
+
let(:index){
|
197
|
+
DateTimeIndex.new([
|
198
|
+
DateTime.new(2014,7,1),DateTime.new(2014,7,2),DateTime.new(2014,7,3),
|
199
|
+
DateTime.new(2014,7,4)])
|
200
|
+
}
|
201
|
+
it { is_expected.to eq \
|
202
|
+
"#<Daru::DateTimeIndex(4) 2014-07-01T00:00:00+00:00...2014-07-04T00:00:00+00:00>"
|
203
|
+
}
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
164
207
|
context "#frequency" do
|
165
208
|
it "reports the frequency of when a period index is specified" do
|
166
209
|
index = DateTimeIndex.new([
|
@@ -180,7 +223,7 @@ describe DateTimeIndex do
|
|
180
223
|
context "#[]" do
|
181
224
|
it "accepts complete time as a string" do
|
182
225
|
index = DateTimeIndex.new([
|
183
|
-
DateTime.new(2014,3,3),DateTime.new(2014,3,4),DateTime.new(2014,3,5),DateTime.new(2014,3,6)],
|
226
|
+
DateTime.new(2014,3,3),DateTime.new(2014,3,4),DateTime.new(2014,3,5),DateTime.new(2014,3,6)],
|
184
227
|
freq: :infer)
|
185
228
|
expect(index.frequency).to eq('D')
|
186
229
|
expect(index['2014-3-5']).to eq(2)
|
@@ -188,7 +231,7 @@ describe DateTimeIndex do
|
|
188
231
|
|
189
232
|
it "accepts complete time as a DateTime object" do
|
190
233
|
index = DateTimeIndex.new([
|
191
|
-
DateTime.new(2014,3,3),DateTime.new(2014,3,4),DateTime.new(2014,3,5),DateTime.new(2014,3,6)],
|
234
|
+
DateTime.new(2014,3,3),DateTime.new(2014,3,4),DateTime.new(2014,3,5),DateTime.new(2014,3,6)],
|
192
235
|
freq: :infer)
|
193
236
|
expect(index[DateTime.new(2014,3,6)]).to eq(3)
|
194
237
|
end
|
@@ -202,7 +245,7 @@ describe DateTimeIndex do
|
|
202
245
|
end
|
203
246
|
|
204
247
|
it "accepts only year for frequency data" do
|
205
|
-
index = DateTimeIndex.date_range(:start => DateTime.new(2012,3,2),
|
248
|
+
index = DateTimeIndex.date_range(:start => DateTime.new(2012,3,2),
|
206
249
|
periods: 1000, freq: '5D')
|
207
250
|
expect(index['2012']).to eq(DateTimeIndex.date_range(
|
208
251
|
:start => DateTime.new(2012,3,2), :end => DateTime.new(2012,12,27), freq: '5D'))
|
@@ -233,10 +276,10 @@ describe DateTimeIndex do
|
|
233
276
|
end
|
234
277
|
|
235
278
|
it "accepts year, month, date for frequency data" do
|
236
|
-
index = DateTimeIndex.date_range(:start => DateTime.new(2012,2,29),
|
279
|
+
index = DateTimeIndex.date_range(:start => DateTime.new(2012,2,29),
|
237
280
|
periods: 1000, freq: 'M')
|
238
281
|
expect(index['2012-2-29']).to eq(DateTimeIndex.date_range(
|
239
|
-
:start => DateTime.new(2012,2,29),
|
282
|
+
:start => DateTime.new(2012,2,29),
|
240
283
|
:end => DateTime.new(2012,2,29,16,39,00), freq: 'M'))
|
241
284
|
end
|
242
285
|
|
@@ -291,7 +334,7 @@ describe DateTimeIndex do
|
|
291
334
|
end
|
292
335
|
|
293
336
|
it "returns slice upto last element if overshoot in range" do
|
294
|
-
index = DateTimeIndex.date_range(:start => '2012-2-2', :periods => 50,
|
337
|
+
index = DateTimeIndex.date_range(:start => '2012-2-2', :periods => 50,
|
295
338
|
freq: 'M')
|
296
339
|
expect(index['2012'..'2013']).to eq(DateTimeIndex.date_range(
|
297
340
|
:start => '2012-2-2',:periods => 50, freq: 'M'))
|
@@ -332,10 +375,75 @@ describe DateTimeIndex do
|
|
332
375
|
}.to raise_error(ArgumentError)
|
333
376
|
end
|
334
377
|
end
|
378
|
+
|
379
|
+
context "#pos" do
|
380
|
+
let(:idx) do
|
381
|
+
described_class.new([
|
382
|
+
DateTime.new(2014,3,3),
|
383
|
+
DateTime.new(2014,3,4),
|
384
|
+
DateTime.new(2014,3,5),
|
385
|
+
DateTime.new(2014,3,6)
|
386
|
+
], freq: :infer
|
387
|
+
)
|
388
|
+
end
|
389
|
+
|
390
|
+
context "single index" do
|
391
|
+
it { expect(idx.pos '2014-3-4').to eq 1 }
|
392
|
+
end
|
393
|
+
|
394
|
+
context "multiple indexes" do
|
395
|
+
subject { idx.pos '2014' }
|
396
|
+
|
397
|
+
it { is_expected.to be_a Array }
|
398
|
+
its(:size) { is_expected.to eq 4 }
|
399
|
+
it { is_expected.to eq [0, 1, 2, 3] }
|
400
|
+
end
|
401
|
+
|
402
|
+
context "single positional index" do
|
403
|
+
it { expect(idx.pos 1).to eq 1 }
|
404
|
+
end
|
405
|
+
|
406
|
+
context "multiple positional indexes" do
|
407
|
+
subject { idx.pos 0, 2 }
|
408
|
+
|
409
|
+
it { is_expected.to be_a Array }
|
410
|
+
its(:size) { is_expected.to eq 3 }
|
411
|
+
it { is_expected.to eq [0, 1, 2] }
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
context "#subset" do
|
416
|
+
let(:idx) do
|
417
|
+
described_class.new([
|
418
|
+
DateTime.new(2014,3,3),
|
419
|
+
DateTime.new(2014,3,4),
|
420
|
+
DateTime.new(2014,3,5),
|
421
|
+
DateTime.new(2014,3,6)
|
422
|
+
], freq: :infer
|
423
|
+
)
|
424
|
+
end
|
425
|
+
|
426
|
+
context "multiple indexes" do
|
427
|
+
subject { idx.subset '2014' }
|
428
|
+
|
429
|
+
it { is_expected.to be_a described_class }
|
430
|
+
its(:size) { is_expected.to eq 4 }
|
431
|
+
it { is_expected.to eq idx }
|
432
|
+
end
|
433
|
+
|
434
|
+
context "multiple positional indexes" do
|
435
|
+
subject { idx.subset 0, 2 }
|
436
|
+
|
437
|
+
it { is_expected.to be_a described_class }
|
438
|
+
its(:size) { is_expected.to eq 3 }
|
439
|
+
its(:to_a) { is_expected.to eq [DateTime.new(2014, 3, 3),
|
440
|
+
DateTime.new(2014, 3, 4), DateTime.new(2014, 3, 5)] }
|
441
|
+
end
|
442
|
+
end
|
335
443
|
|
336
444
|
context "#slice" do
|
337
445
|
it "supports both DateTime objects" do
|
338
|
-
index = DateTimeIndex.date_range(:start => '2012', :periods => 50,
|
446
|
+
index = DateTimeIndex.date_range(:start => '2012', :periods => 50,
|
339
447
|
:freq => 'M')
|
340
448
|
expect(index.slice(DateTime.new(2012,1,1), DateTime.new(2012,1,1,0,6))).to eq(
|
341
449
|
DateTimeIndex.date_range(:start => '2012', :periods => 7, :freq => 'M'))
|
@@ -352,6 +460,16 @@ describe DateTimeIndex do
|
|
352
460
|
expect(index.slice(DateTime.new(2012), '2013')).to eq(
|
353
461
|
DateTimeIndex.date_range(:start => '2012', :periods => 24, :freq => 'MONTH'))
|
354
462
|
end
|
463
|
+
|
464
|
+
it "supports two strings" do
|
465
|
+
index = DateTimeIndex.date_range(:start => '2012', :periods => 40, :freq => 'MONTH')
|
466
|
+
expect(index.slice('2012', '2013')).to eq(
|
467
|
+
DateTimeIndex.date_range(:start => '2012', :periods => 24, :freq => 'MONTH'))
|
468
|
+
|
469
|
+
# FIXME: It works this way now, yet I'm faithfully not sure that is most
|
470
|
+
# reasonable behavior. At least MY expectation is "slice(2012, 2013)" returns
|
471
|
+
# "from start of 2012 to start of 2013"... Or am I missing something?.. - zverok
|
472
|
+
end
|
355
473
|
end
|
356
474
|
|
357
475
|
context "#size" do
|
@@ -360,6 +478,25 @@ describe DateTimeIndex do
|
|
360
478
|
expect(index.size).to eq(100)
|
361
479
|
end
|
362
480
|
end
|
481
|
+
|
482
|
+
context "#add" do
|
483
|
+
before { skip }
|
484
|
+
let(:idx) { Daru::Index.new [:a, :b, :c] }
|
485
|
+
|
486
|
+
context "single index" do
|
487
|
+
subject { idx }
|
488
|
+
before { idx.add :d }
|
489
|
+
|
490
|
+
its(:to_a) { is_expected.to eq [:a, :b, :c, :d] }
|
491
|
+
end
|
492
|
+
|
493
|
+
context "mulitple indexes" do
|
494
|
+
subject { idx }
|
495
|
+
before { idx.add :d, :e }
|
496
|
+
|
497
|
+
its(:to_a) { is_expected.to eq [:a, :b, :c, :d, :e] }
|
498
|
+
end
|
499
|
+
end
|
363
500
|
|
364
501
|
context "#to_a" do
|
365
502
|
it "returns an Array of ruby Time objects" do
|
@@ -430,4 +567,4 @@ describe DateTimeIndex do
|
|
430
567
|
expect(index.include?(DateTime.new(2011,4,2))).to eq(false)
|
431
568
|
end
|
432
569
|
end
|
433
|
-
end
|
570
|
+
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'spec_helper'
|
2
1
|
include Daru
|
3
2
|
|
4
3
|
describe DateOffset do
|
@@ -63,7 +62,7 @@ describe Offsets do
|
|
63
62
|
end
|
64
63
|
|
65
64
|
context "#initialize" do
|
66
|
-
it "creates a seconds offset" do
|
65
|
+
it "creates a seconds offset" do
|
67
66
|
expect(@offset + DateTime.new(2012,3,4,23,4,00)).to eq(
|
68
67
|
DateTime.new(2012,3,4,23,4,05))
|
69
68
|
end
|
@@ -200,7 +199,7 @@ describe Offsets do
|
|
200
199
|
end
|
201
200
|
|
202
201
|
context "#+" do
|
203
|
-
it "offsets to beginning of next month" do
|
202
|
+
it "offsets to beginning of next month" do
|
204
203
|
expect(@offset + DateTime.new(2012,3,25)).to eq(
|
205
204
|
DateTime.new(2012,4,1))
|
206
205
|
|
@@ -296,7 +295,7 @@ describe Offsets do
|
|
296
295
|
end
|
297
296
|
|
298
297
|
context "#+" do
|
299
|
-
it "offsets date to future" do
|
298
|
+
it "offsets date to future" do
|
300
299
|
expect(@n_offset + DateTime.new(2012,3,25)).to eq(
|
301
300
|
DateTime.new(2014,1,1))
|
302
301
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
describe Daru::Formatters::Table do
|
2
|
+
let(:options) { {} }
|
3
|
+
subject {
|
4
|
+
Daru::Formatters::Table
|
5
|
+
.format(data, options.merge(headers: headers, row_headers: row_headers))
|
6
|
+
}
|
7
|
+
|
8
|
+
let(:data) { [[1,2,3], [4,5,6], [7,8,9]] }
|
9
|
+
let(:headers) { [:col1, :col2, :col3] }
|
10
|
+
let(:row_headers) { [:row1, :row2, :row3] }
|
11
|
+
|
12
|
+
context 'simple table' do
|
13
|
+
it { is_expected.to eq %Q{
|
14
|
+
| col1 col2 col3
|
15
|
+
| row1 1 2 3
|
16
|
+
| row2 4 5 6
|
17
|
+
| row3 7 8 9
|
18
|
+
}.unindent}
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'with nils' do
|
22
|
+
let(:data) { [[1,nil,3], [4,5,nil], [7,8,9]] }
|
23
|
+
let(:headers) { [:col1, :col2, nil] }
|
24
|
+
let(:row_headers) { [:row1, nil, :row3] }
|
25
|
+
|
26
|
+
it { is_expected.to eq %Q{
|
27
|
+
| col1 col2 |
|
28
|
+
| row1 1 nil 3|
|
29
|
+
| 4 5 nil|
|
30
|
+
| row3 7 8 9|
|
31
|
+
}.unindent}
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'with multivalue row headers' do
|
35
|
+
let(:row_headers) { [[:row,1], [:row,2], [:row,3]] }
|
36
|
+
it { is_expected.to eq %Q{
|
37
|
+
| col1 col2 col3
|
38
|
+
| row 1 1 2 3
|
39
|
+
| row 2 4 5 6
|
40
|
+
| row 3 7 8 9
|
41
|
+
}.unindent}
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'with multivalue column headers' do
|
45
|
+
let(:headers) { [[:col,1], [:col,2], [:col,3]] }
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'rows only' do
|
49
|
+
let(:data) { [] }
|
50
|
+
let(:headers) { nil }
|
51
|
+
it { is_expected.to eq %Q{
|
52
|
+
| row1
|
53
|
+
| row2
|
54
|
+
| row3
|
55
|
+
}.unindent}
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'columns only' do
|
59
|
+
let(:data) { [] }
|
60
|
+
let(:row_headers) { nil }
|
61
|
+
it { is_expected.to eq %Q{
|
62
|
+
| col1 col2 col3
|
63
|
+
}.unindent}
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'wide values' do
|
67
|
+
let(:options) { {spacing: 2} }
|
68
|
+
|
69
|
+
it { is_expected.to eq %Q{
|
70
|
+
| co co co
|
71
|
+
| ro 1 2 3
|
72
|
+
| ro 4 5 6
|
73
|
+
| ro 7 8 9
|
74
|
+
}.unindent}
|
75
|
+
end
|
76
|
+
|
77
|
+
context '<more> threshold' do
|
78
|
+
let(:options) { {threshold: threshold} }
|
79
|
+
context 'lower than data size' do
|
80
|
+
let(:threshold) { 2 }
|
81
|
+
it { is_expected.to eq %Q{
|
82
|
+
| col1 col2 col3
|
83
|
+
| row1 1 2 3
|
84
|
+
| row2 4 5 6
|
85
|
+
| ... ... ... ...
|
86
|
+
}.unindent}
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'greater than data size' do
|
90
|
+
let(:threshold) { 5 }
|
91
|
+
it { is_expected.to eq %Q{
|
92
|
+
| col1 col2 col3
|
93
|
+
| row1 1 2 3
|
94
|
+
| row2 4 5 6
|
95
|
+
| row3 7 8 9
|
96
|
+
}.unindent}
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|