daru_lite 0.1
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/.github/ISSUE_TEMPLATE.md +18 -0
- data/.github/workflows/ci.yml +33 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.rubocop.yml +27 -0
- data/.rubocop_todo.yml +137 -0
- data/CONTRIBUTING.md +47 -0
- data/Gemfile +2 -0
- data/History.md +4 -0
- data/LICENSE +24 -0
- data/README.md +218 -0
- data/Rakefile +69 -0
- data/ReleasePolicy.md +20 -0
- data/benchmarks/TradeoffData.csv +65 -0
- data/benchmarks/csv_reading.rb +22 -0
- data/benchmarks/dataframe_creation.rb +39 -0
- data/benchmarks/db_loading.rb +34 -0
- data/benchmarks/duplicating.rb +45 -0
- data/benchmarks/group_by.rb +32 -0
- data/benchmarks/joining.rb +52 -0
- data/benchmarks/row_access.rb +41 -0
- data/benchmarks/row_assign.rb +36 -0
- data/benchmarks/sorting.rb +51 -0
- data/benchmarks/statistics.rb +28 -0
- data/benchmarks/vector_access.rb +31 -0
- data/benchmarks/vector_assign.rb +42 -0
- data/benchmarks/where_clause.rb +48 -0
- data/benchmarks/where_vs_filter.rb +28 -0
- data/daru_lite.gemspec +55 -0
- data/images/README.md +5 -0
- data/images/con0.png +0 -0
- data/images/con1.png +0 -0
- data/images/init0.png +0 -0
- data/images/init1.png +0 -0
- data/images/man0.png +0 -0
- data/images/man1.png +0 -0
- data/images/man2.png +0 -0
- data/images/man3.png +0 -0
- data/images/man4.png +0 -0
- data/images/man5.png +0 -0
- data/images/man6.png +0 -0
- data/lib/daru_lite/accessors/array_wrapper.rb +109 -0
- data/lib/daru_lite/accessors/dataframe_by_row.rb +25 -0
- data/lib/daru_lite/accessors/mdarray_wrapper.rb +7 -0
- data/lib/daru_lite/category.rb +929 -0
- data/lib/daru_lite/configuration.rb +34 -0
- data/lib/daru_lite/core/group_by.rb +403 -0
- data/lib/daru_lite/core/merge.rb +270 -0
- data/lib/daru_lite/core/query.rb +109 -0
- data/lib/daru_lite/dataframe.rb +3080 -0
- data/lib/daru_lite/date_time/index.rb +569 -0
- data/lib/daru_lite/date_time/offsets.rb +397 -0
- data/lib/daru_lite/exceptions.rb +2 -0
- data/lib/daru_lite/extensions/which_dsl.rb +53 -0
- data/lib/daru_lite/formatters/table.rb +52 -0
- data/lib/daru_lite/helpers/array.rb +53 -0
- data/lib/daru_lite/index/categorical_index.rb +201 -0
- data/lib/daru_lite/index/index.rb +374 -0
- data/lib/daru_lite/index/multi_index.rb +374 -0
- data/lib/daru_lite/io/csv/converters.rb +21 -0
- data/lib/daru_lite/io/io.rb +294 -0
- data/lib/daru_lite/io/sql_data_source.rb +97 -0
- data/lib/daru_lite/iruby/helpers.rb +38 -0
- data/lib/daru_lite/iruby/templates/dataframe.html.erb +5 -0
- data/lib/daru_lite/iruby/templates/dataframe_mi.html.erb +5 -0
- data/lib/daru_lite/iruby/templates/dataframe_mi_tbody.html.erb +35 -0
- data/lib/daru_lite/iruby/templates/dataframe_mi_thead.html.erb +21 -0
- data/lib/daru_lite/iruby/templates/dataframe_tbody.html.erb +28 -0
- data/lib/daru_lite/iruby/templates/dataframe_thead.html.erb +21 -0
- data/lib/daru_lite/iruby/templates/multi_index.html.erb +12 -0
- data/lib/daru_lite/iruby/templates/vector.html.erb +5 -0
- data/lib/daru_lite/iruby/templates/vector_mi.html.erb +5 -0
- data/lib/daru_lite/iruby/templates/vector_mi_tbody.html.erb +26 -0
- data/lib/daru_lite/iruby/templates/vector_mi_thead.html.erb +8 -0
- data/lib/daru_lite/iruby/templates/vector_tbody.html.erb +17 -0
- data/lib/daru_lite/iruby/templates/vector_thead.html.erb +8 -0
- data/lib/daru_lite/maths/arithmetic/dataframe.rb +91 -0
- data/lib/daru_lite/maths/arithmetic/vector.rb +117 -0
- data/lib/daru_lite/maths/statistics/dataframe.rb +202 -0
- data/lib/daru_lite/maths/statistics/vector.rb +1019 -0
- data/lib/daru_lite/monkeys.rb +56 -0
- data/lib/daru_lite/vector.rb +1678 -0
- data/lib/daru_lite/version.rb +3 -0
- data/lib/daru_lite.rb +99 -0
- 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/profile/vector_new.rb +9 -0
- data/spec/accessors/array_wrapper_spec.rb +3 -0
- data/spec/category_spec.rb +1741 -0
- data/spec/core/group_by_spec.rb +655 -0
- data/spec/core/merge_spec.rb +179 -0
- data/spec/core/query_spec.rb +347 -0
- data/spec/daru_lite_spec.rb +22 -0
- data/spec/dataframe_spec.rb +4330 -0
- data/spec/date_time/data_spec.rb +197 -0
- data/spec/date_time/date_time_index_helper_spec.rb +72 -0
- data/spec/date_time/index_spec.rb +588 -0
- data/spec/date_time/offsets_spec.rb +465 -0
- data/spec/extensions/which_dsl_spec.rb +38 -0
- data/spec/fixtures/bank2.dat +200 -0
- data/spec/fixtures/boolean_converter_test.csv +5 -0
- data/spec/fixtures/countries.json +7794 -0
- data/spec/fixtures/duplicates.csv +32 -0
- data/spec/fixtures/eciresults.html +394 -0
- data/spec/fixtures/empties.dat +2 -0
- data/spec/fixtures/empty_rows_test.csv +17 -0
- data/spec/fixtures/macau.html +3691 -0
- data/spec/fixtures/macd_data.csv +150 -0
- data/spec/fixtures/matrix_test.csv +100 -0
- data/spec/fixtures/moneycontrol.html +6812 -0
- data/spec/fixtures/music_data.tsv +2501 -0
- data/spec/fixtures/repeated_fields.csv +7 -0
- data/spec/fixtures/sales-funnel.csv +18 -0
- data/spec/fixtures/scientific_notation.csv +4 -0
- data/spec/fixtures/string_converter_test.csv +5 -0
- data/spec/fixtures/strings.dat +2 -0
- data/spec/fixtures/test_xls.xls +0 -0
- data/spec/fixtures/test_xls_2.xls +0 -0
- data/spec/fixtures/url_test.txt~ +0 -0
- data/spec/fixtures/valid_markup.html +62 -0
- data/spec/fixtures/wiki_climate.html +1243 -0
- data/spec/fixtures/wiki_table_info.html +631 -0
- data/spec/formatters/table_formatter_spec.rb +137 -0
- data/spec/helpers_spec.rb +8 -0
- data/spec/index/categorical_index_spec.rb +170 -0
- data/spec/index/index_spec.rb +417 -0
- data/spec/index/multi_index_spec.rb +680 -0
- data/spec/io/io_spec.rb +373 -0
- data/spec/io/sql_data_source_spec.rb +56 -0
- data/spec/iruby/dataframe_spec.rb +170 -0
- data/spec/iruby/helpers_spec.rb +49 -0
- data/spec/iruby/multi_index_spec.rb +37 -0
- data/spec/iruby/vector_spec.rb +105 -0
- data/spec/maths/arithmetic/dataframe_spec.rb +148 -0
- data/spec/maths/arithmetic/vector_spec.rb +165 -0
- data/spec/maths/statistics/dataframe_spec.rb +178 -0
- data/spec/maths/statistics/vector_spec.rb +756 -0
- data/spec/monkeys_spec.rb +42 -0
- data/spec/shared/vector_display_spec.rb +213 -0
- data/spec/spec_helper.rb +87 -0
- data/spec/support/database_helper.rb +30 -0
- data/spec/support/matchers.rb +5 -0
- data/spec/vector_spec.rb +2293 -0
- metadata +571 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
require 'spec_helper.rb'
|
|
2
|
+
|
|
3
|
+
describe DaruLite::Index do
|
|
4
|
+
context ".new" do
|
|
5
|
+
it "creates an Index object if Index-like data is supplied" do
|
|
6
|
+
i = DaruLite::Index.new [:one, 'one', 1, 2, :two]
|
|
7
|
+
expect(i.class).to eq(DaruLite::Index)
|
|
8
|
+
expect(i.to_a) .to eq([:one, 'one', 1, 2, :two])
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "creates a MultiIndex if tuples are supplied" do
|
|
12
|
+
i = DaruLite::Index.new([
|
|
13
|
+
[:b,:one,:bar],
|
|
14
|
+
[:b,:two,:bar],
|
|
15
|
+
[:b,:two,:baz],
|
|
16
|
+
[:b,:one,:foo]
|
|
17
|
+
])
|
|
18
|
+
|
|
19
|
+
expect(i.class).to eq(DaruLite::MultiIndex)
|
|
20
|
+
expect(i.levels).to eq([[:b], [:one, :two], [:bar, :baz, :foo]])
|
|
21
|
+
expect(i.labels).to eq([[0,0,0,0],[0,1,1,0],[0,0,1,2]])
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "creates DateTimeIndex if date-like objects specified" do
|
|
25
|
+
i = DaruLite::Index.new([
|
|
26
|
+
DateTime.new(2012,2,4), DateTime.new(2012,2,5), DateTime.new(2012,2,6)])
|
|
27
|
+
expect(i.class).to eq(DaruLite::DateTimeIndex)
|
|
28
|
+
expect(i.to_a).to eq([DateTime.new(2012,2,4), DateTime.new(2012,2,5), DateTime.new(2012,2,6)])
|
|
29
|
+
expect(i.frequency).to eq('D')
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context "create an Index with name" do
|
|
33
|
+
context 'if no name is set' do
|
|
34
|
+
subject { DaruLite::Index.new [:a, :b, :c] }
|
|
35
|
+
its(:name) { is_expected.to be_nil }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context 'correctly return the index name' do
|
|
39
|
+
subject { DaruLite::Index.new [:a, :b, :c], name: 'index_name' }
|
|
40
|
+
its(:name) { is_expected.to eq 'index_name' }
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context "set new index name" do
|
|
44
|
+
subject {
|
|
45
|
+
DaruLite::Index.new([:a, :b, :c], name: 'index_name') }
|
|
46
|
+
before { subject.name = 'new_name'}
|
|
47
|
+
its(:name) { is_expected.to eq 'new_name' }
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
context "#initialize" do
|
|
53
|
+
it "creates an Index from Array" do
|
|
54
|
+
idx = DaruLite::Index.new ['speaker', 'mic', 'guitar', 'amp']
|
|
55
|
+
|
|
56
|
+
expect(idx.to_a).to eq(['speaker', 'mic', 'guitar', 'amp'])
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "creates an Index from Range" do
|
|
60
|
+
idx = DaruLite::Index.new 1..5
|
|
61
|
+
|
|
62
|
+
expect(idx).to eq(DaruLite::Index.new [1, 2, 3, 4, 5])
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "raises ArgumentError on invalid input type" do
|
|
66
|
+
expect { DaruLite::Index.new 'foo' }.to raise_error ArgumentError
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "accepts all sorts of objects for Indexing" do
|
|
70
|
+
idx = DaruLite::Index.new [:a, 'a', :hello, '23', 23]
|
|
71
|
+
|
|
72
|
+
expect(idx.to_a).to eq([:a, 'a', :hello, '23', 23])
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
context '#key' do
|
|
77
|
+
subject(:idx) { DaruLite::Index.new ['speaker', 'mic', 'guitar', 'amp'] }
|
|
78
|
+
|
|
79
|
+
it 'returns key by position' do
|
|
80
|
+
expect(idx.key(2)).to eq 'guitar'
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it 'returns nil on too large pos' do
|
|
84
|
+
expect(idx.key(20)).to be_nil
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it 'returns nil on wrong arg type' do
|
|
88
|
+
expect(idx.key(nil)).to be_nil
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
context '#sort' do
|
|
93
|
+
let(:asc) { index.sort }
|
|
94
|
+
let(:desc) { index.sort(ascending: false) }
|
|
95
|
+
|
|
96
|
+
context 'string index' do
|
|
97
|
+
let(:index) { DaruLite::Index.new ['mic', 'amp', 'guitar', 'speaker'] }
|
|
98
|
+
specify { expect(asc).to eq DaruLite::Index.new ['amp', 'guitar', 'mic',
|
|
99
|
+
'speaker'] }
|
|
100
|
+
specify { expect(desc).to eq DaruLite::Index.new ['speaker', 'mic', 'guitar',
|
|
101
|
+
'amp'] }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
context 'number index' do
|
|
105
|
+
let(:index) { DaruLite::Index.new [100, 99, 101, 1, 2] }
|
|
106
|
+
specify { expect(asc).to eq DaruLite::Index.new [1, 2, 99, 100, 101] }
|
|
107
|
+
specify { expect(desc).to eq DaruLite::Index.new [101, 100, 99, 2, 1] }
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
context "#size" do
|
|
112
|
+
it "correctly returns the size of the index" do
|
|
113
|
+
idx = DaruLite::Index.new ['speaker', 'mic', 'guitar', 'amp']
|
|
114
|
+
|
|
115
|
+
expect(idx.size).to eq(4)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
context "#valid?" do
|
|
120
|
+
let(:idx) { DaruLite::Index.new [:a, :b, :c] }
|
|
121
|
+
|
|
122
|
+
context "single index" do
|
|
123
|
+
it { expect(idx.valid? 2).to eq true }
|
|
124
|
+
it { expect(idx.valid? :d).to eq false }
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
context "multiple indexes" do
|
|
128
|
+
it { expect(idx.valid? :a, 1).to eq true }
|
|
129
|
+
it { expect(idx.valid? :a, 3).to eq false }
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
context '#inspect' do
|
|
134
|
+
context 'small index' do
|
|
135
|
+
subject { DaruLite::Index.new ['one', 'two', 'three'] }
|
|
136
|
+
its(:inspect) { is_expected.to eq "#<DaruLite::Index(3): {one, two, three}>" }
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
context 'large index' do
|
|
140
|
+
subject { DaruLite::Index.new ('a'..'z').to_a }
|
|
141
|
+
its(:inspect) { is_expected.to eq "#<DaruLite::Index(26): {a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ... z}>" }
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
context 'index with name' do
|
|
145
|
+
subject { DaruLite::Index.new ['one', 'two', 'three'], name: 'number' }
|
|
146
|
+
its(:inspect) { is_expected.to eq "#<DaruLite::Index(3): number {one, two, three}>" }
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
context "#&" do
|
|
151
|
+
before :each do
|
|
152
|
+
@left = DaruLite::Index.new [:miles, :geddy, :eric]
|
|
153
|
+
@right = DaruLite::Index.new [:geddy, :richie, :miles]
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it "intersects 2 indexes and returns an Index" do
|
|
157
|
+
expect(@left & @right).to eq([:miles, :geddy].to_index)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it "intersects an Index and an Array to return an Index" do
|
|
161
|
+
expect(@left & [:bob, :geddy, :richie]).to eq([:geddy].to_index)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
context "#|" do
|
|
166
|
+
before :each do
|
|
167
|
+
@left = DaruLite::Index.new [:miles, :geddy, :eric]
|
|
168
|
+
@right = DaruLite::Index.new [:bob, :jimi, :richie]
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it "unions 2 indexes and returns an Index" do
|
|
172
|
+
expect(@left | @right).to eq([:miles, :geddy, :eric, :bob, :jimi, :richie].to_index)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it "unions an Index and an Array to return an Index" do
|
|
176
|
+
expect(@left | [:bob, :jimi, :richie]).to eq([:miles, :geddy, :eric,
|
|
177
|
+
:bob, :jimi, :richie].to_index)
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
context "#[]" do
|
|
182
|
+
before do
|
|
183
|
+
@id = DaruLite::Index.new [:one, :two, :three, :four, :five, :six, :seven]
|
|
184
|
+
@mixed_id = DaruLite::Index.new ['a','b','c',:d,:a,8,3,5]
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
it "works with ranges" do
|
|
188
|
+
expect(@id[:two..:five]).to eq([1, 2, 3, 4])
|
|
189
|
+
|
|
190
|
+
expect(@mixed_id['a'..'c']).to eq([0, 1, 2])
|
|
191
|
+
|
|
192
|
+
# returns nil if first index is invalid
|
|
193
|
+
expect(@mixed_id.slice('d', 5)).to be_nil
|
|
194
|
+
|
|
195
|
+
# returns positions till the end if first index is present
|
|
196
|
+
expect(@mixed_id.slice('c', 6)).to eq([2, 3, 4, 5, 6, 7])
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "returns multiple keys if specified multiple indices" do
|
|
200
|
+
expect(@id[:one, :two, :four, :five]).to eq([0, 1, 3, 4])
|
|
201
|
+
expect(@mixed_id[0,5,3,2]).to eq([nil, 7, 6, nil])
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
it "returns nil for invalid indexes" do
|
|
205
|
+
expect(@id[:four]).to eq(3)
|
|
206
|
+
expect(@id[3]).to be_nil
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
it "returns correct index position for mixed index" do
|
|
210
|
+
expect(@mixed_id[8]).to eq(5)
|
|
211
|
+
expect(@mixed_id['c']).to eq(2)
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
context "#pos" do
|
|
216
|
+
let(:idx) { described_class.new [:a, :b, 1, 2] }
|
|
217
|
+
|
|
218
|
+
context "single index" do
|
|
219
|
+
it { expect(idx.pos :a).to eq 0 }
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
context "multiple indexes" do
|
|
223
|
+
subject { idx.pos :a, 1 }
|
|
224
|
+
|
|
225
|
+
it { is_expected.to be_a Array }
|
|
226
|
+
its(:size) { is_expected.to eq 2 }
|
|
227
|
+
it { is_expected.to eq [0, 2] }
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
context "single positional index" do
|
|
231
|
+
it { expect(idx.pos 0).to eq 0 }
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
context "multiple positional index" do
|
|
235
|
+
subject { idx.pos 0, 3 }
|
|
236
|
+
|
|
237
|
+
it { is_expected.to be_a Array }
|
|
238
|
+
its(:size) { is_expected.to eq 2 }
|
|
239
|
+
it { is_expected.to eq [0, 3] }
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
context "range" do
|
|
243
|
+
subject { idx.pos 1..3 }
|
|
244
|
+
|
|
245
|
+
it { is_expected.to be_a Array }
|
|
246
|
+
its(:size) { is_expected.to eq 3 }
|
|
247
|
+
it { is_expected.to eq [1, 2, 3] }
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
context "#subset" do
|
|
252
|
+
let(:idx) { described_class.new [:a, :b, 1, 2] }
|
|
253
|
+
|
|
254
|
+
context "multiple indexes" do
|
|
255
|
+
subject { idx.subset :a, 1 }
|
|
256
|
+
|
|
257
|
+
it { is_expected.to be_a described_class }
|
|
258
|
+
its(:size) { is_expected.to eq 2 }
|
|
259
|
+
its(:to_a) { is_expected.to eq [:a, 1] }
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
context "multiple positional indexes" do
|
|
263
|
+
subject { idx.subset 0, 3 }
|
|
264
|
+
|
|
265
|
+
it { is_expected.to be_a described_class }
|
|
266
|
+
its(:size) { is_expected.to eq 2 }
|
|
267
|
+
its(:to_a) { is_expected.to eq [:a, 2] }
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
context "range" do
|
|
271
|
+
subject { idx.subset 1..3 }
|
|
272
|
+
|
|
273
|
+
it { is_expected.to be_a described_class }
|
|
274
|
+
its(:size) { is_expected.to eq 3 }
|
|
275
|
+
its(:to_a) { is_expected.to eq [:b, 1, 2] }
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
context "#at" do
|
|
280
|
+
let(:idx) { described_class.new [:a, :b, 1 ] }
|
|
281
|
+
|
|
282
|
+
context "single position" do
|
|
283
|
+
it { expect(idx.at 1).to eq :b }
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
context "multiple positions" do
|
|
287
|
+
subject { idx.at 1, 2 }
|
|
288
|
+
|
|
289
|
+
it { is_expected.to be_a described_class }
|
|
290
|
+
its(:size) { is_expected.to eq 2 }
|
|
291
|
+
its(:to_a) { is_expected.to eq [:b, 1] }
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
context "range" do
|
|
295
|
+
subject { idx.at 1..2 }
|
|
296
|
+
|
|
297
|
+
it { is_expected.to be_a described_class }
|
|
298
|
+
its(:size) { is_expected.to eq 2 }
|
|
299
|
+
its(:to_a) { is_expected.to eq [:b, 1] }
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
context "range with negative integer" do
|
|
303
|
+
subject { idx.at 1..-1 }
|
|
304
|
+
|
|
305
|
+
it { is_expected.to be_a described_class }
|
|
306
|
+
its(:size) { is_expected.to eq 2 }
|
|
307
|
+
its(:to_a) { is_expected.to eq [:b, 1] }
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
context "rangle with single element" do
|
|
311
|
+
subject { idx.at 1..1 }
|
|
312
|
+
|
|
313
|
+
it { is_expected.to be_a described_class }
|
|
314
|
+
its(:size) { is_expected.to eq 1 }
|
|
315
|
+
its(:to_a) { is_expected.to eq [:b] }
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
context "invalid position" do
|
|
319
|
+
it { expect { idx.at 3 }.to raise_error IndexError }
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
context "invalid positions" do
|
|
323
|
+
it { expect { idx.at 2, 3 }.to raise_error IndexError }
|
|
324
|
+
end
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
# This context validate DaruLite::Index is like an enumerable.
|
|
328
|
+
# #map and #select are samples and we do not need tests all
|
|
329
|
+
# enumerable methods.
|
|
330
|
+
context "Enumerable" do
|
|
331
|
+
let(:idx) { DaruLite::Index.new ['speaker', 'mic', 'guitar', 'amp'] }
|
|
332
|
+
|
|
333
|
+
context "#map" do
|
|
334
|
+
it { expect(idx.map(&:upcase)).to eq(['SPEAKER', 'MIC', 'GUITAR', 'AMP']) }
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
context "select" do
|
|
338
|
+
it { expect(idx.select {|w| w[0] == 'g' }).to eq(['guitar']) }
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
context "#is_values" do
|
|
343
|
+
let(:klass) { DaruLite::Vector }
|
|
344
|
+
let(:idx) { described_class.new [:one, 'one', 1, 2, 'two', nil, [1, 2]] }
|
|
345
|
+
|
|
346
|
+
context "no arguments" do
|
|
347
|
+
let(:answer) { [false, false, false, false, false, false, false] }
|
|
348
|
+
it { expect(idx.is_values).to eq klass.new(answer) }
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
context "single arguments" do
|
|
352
|
+
let(:answer) { [false, true, false, false, false, false, false] }
|
|
353
|
+
it { expect(idx.is_values 'one').to eq klass.new(answer) }
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
context "multiple arguments" do
|
|
357
|
+
context "symbol and number as argument" do
|
|
358
|
+
subject { idx.is_values 2, :one }
|
|
359
|
+
let(:answer) { [true, false, false, true, false, false, false] }
|
|
360
|
+
it { is_expected.to be_a DaruLite::Vector }
|
|
361
|
+
its(:size) { is_expected.to eq 7 }
|
|
362
|
+
it { is_expected.to eq klass.new(answer) }
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
context "string and number as argument" do
|
|
366
|
+
subject { idx.is_values('one', 1)}
|
|
367
|
+
let(:answer) { [false, true, true, false, false, false, false] }
|
|
368
|
+
it { is_expected.to be_a DaruLite::Vector }
|
|
369
|
+
its(:size) { is_expected.to eq 7 }
|
|
370
|
+
it { is_expected.to eq klass.new(answer) }
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
context "nil is present in arguments" do
|
|
374
|
+
subject { idx.is_values('two', nil)}
|
|
375
|
+
let(:answer) { [false, false, false, false, true, true, false] }
|
|
376
|
+
it { is_expected.to be_a DaruLite::Vector }
|
|
377
|
+
its(:size) { is_expected.to eq 7 }
|
|
378
|
+
it { is_expected.to eq klass.new(answer) }
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
context "subarray is present in arguments" do
|
|
382
|
+
subject { idx.is_values([1, 2])}
|
|
383
|
+
let(:answer) { [false, false, false, false, false, false, true] }
|
|
384
|
+
it { is_expected.to be_a DaruLite::Vector }
|
|
385
|
+
its(:size) { is_expected.to eq 7 }
|
|
386
|
+
it { is_expected.to eq klass.new(answer) }
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
context '#to_df' do
|
|
393
|
+
let(:idx) do
|
|
394
|
+
DaruLite::Index.new(['speaker', 'mic', 'guitar', 'amp'],
|
|
395
|
+
name: 'instruments')
|
|
396
|
+
end
|
|
397
|
+
subject { idx.to_df }
|
|
398
|
+
|
|
399
|
+
it { is_expected.to eq DaruLite::DataFrame.new(
|
|
400
|
+
'instruments' => ['speaker', 'mic', 'guitar', 'amp']
|
|
401
|
+
)
|
|
402
|
+
}
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
context "#dup" do
|
|
406
|
+
let(:idx) do
|
|
407
|
+
DaruLite::Index.new(['speaker', 'mic', 'guitar', 'amp'],
|
|
408
|
+
name: 'instruments')
|
|
409
|
+
end
|
|
410
|
+
subject { idx.dup }
|
|
411
|
+
|
|
412
|
+
it { is_expected.to eq idx }
|
|
413
|
+
it 'have same names' do
|
|
414
|
+
expect(subject.name).to eq idx.name
|
|
415
|
+
end
|
|
416
|
+
end
|
|
417
|
+
end
|