fat_core 1.0.3 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +3 -0
- data/Rakefile +2 -2
- data/fat_core.gemspec +19 -18
- data/lib/core_extensions/date/fat_core.rb +0 -1
- data/lib/fat_core.rb +5 -1
- data/lib/fat_core/column.rb +197 -0
- data/lib/fat_core/date.rb +192 -132
- data/lib/fat_core/enumerable.rb +1 -1
- data/lib/fat_core/evaluator.rb +43 -0
- data/lib/fat_core/hash.rb +1 -1
- data/lib/fat_core/nil.rb +4 -0
- data/lib/fat_core/numeric.rb +30 -17
- data/lib/fat_core/period.rb +58 -67
- data/lib/fat_core/range.rb +20 -25
- data/lib/fat_core/string.rb +95 -55
- data/lib/fat_core/symbol.rb +12 -14
- data/lib/fat_core/table.rb +515 -0
- data/lib/fat_core/version.rb +2 -2
- data/spec/example_files/goldberg.org +199 -0
- data/spec/example_files/wpcs.csv +92 -0
- data/spec/lib/array_spec.rb +1 -1
- data/spec/lib/date_spec.rb +5 -6
- data/spec/lib/enumerable_spec.rb +1 -1
- data/spec/lib/evaluator_spec.rb +34 -0
- data/spec/lib/hash_spec.rb +5 -5
- data/spec/lib/kernel_spec.rb +3 -3
- data/spec/lib/nil_spec.rb +2 -2
- data/spec/lib/numeric_spec.rb +22 -22
- data/spec/lib/period_spec.rb +11 -12
- data/spec/lib/range_spec.rb +50 -50
- data/spec/lib/string_spec.rb +71 -74
- data/spec/lib/symbol_spec.rb +3 -3
- data/spec/lib/table_spec.rb +659 -0
- data/spec/spec_helper.rb +1 -1
- metadata +28 -2
data/spec/lib/numeric_spec.rb
CHANGED
@@ -1,68 +1,68 @@
|
|
1
1
|
require File.dirname(File.absolute_path(__FILE__)) + '/../spec_helper.rb'
|
2
2
|
|
3
3
|
describe Numeric do
|
4
|
-
it
|
4
|
+
it 'should implement signum function' do
|
5
5
|
# Integers
|
6
6
|
expect(33.signum).to eq 1
|
7
|
-
expect(-33.signum).to eq
|
7
|
+
expect(-33.signum).to eq(-1)
|
8
8
|
expect(0.signum).to eq 0
|
9
9
|
|
10
10
|
# Floats
|
11
11
|
expect(33.45.signum).to eq 1
|
12
|
-
expect(-33.45.signum).to eq
|
12
|
+
expect(-33.45.signum).to eq(-1)
|
13
13
|
expect(0.0.signum).to eq 0
|
14
14
|
end
|
15
15
|
|
16
|
-
it
|
16
|
+
it 'should provide a tex_quote method for erb docs' do
|
17
17
|
expect(195.45.tex_quote).to eq '195.45'
|
18
18
|
end
|
19
19
|
|
20
|
-
it
|
20
|
+
it 'should provide a human-readable inspect for BigDecimal' do
|
21
21
|
expect(BigDecimal('33.45').inspect).to eq '33.45'
|
22
22
|
end
|
23
23
|
|
24
|
-
it
|
24
|
+
it 'should be able to report if its a whole number' do
|
25
25
|
expect(236.whole?).to be true
|
26
26
|
expect(236.5555.whole?).to be false
|
27
27
|
end
|
28
28
|
|
29
|
-
it
|
29
|
+
it 'should properly round up' do
|
30
30
|
expect(236.5555.commas(2)).to eq '236.56'
|
31
31
|
expect(-236.5555.commas(2)).to eq '-236.56'
|
32
32
|
end
|
33
33
|
|
34
|
-
it
|
34
|
+
it 'should properly round down' do
|
35
35
|
expect(236.5512.commas(2)).to eq '236.55'
|
36
36
|
expect(-236.5512.commas(2)).to eq '-236.55'
|
37
37
|
end
|
38
38
|
|
39
|
-
it
|
40
|
-
expect(
|
41
|
-
expect(-
|
39
|
+
it 'should place commas properly' do
|
40
|
+
expect(123_456_789.0123.commas(2)).to eq '123,456,789.01'
|
41
|
+
expect(-123_456_789.0123.commas(2)).to eq '-123,456,789.01'
|
42
42
|
|
43
43
|
# if places is nil, use 4 places for numbers with a fractional
|
44
44
|
# part and 0 places for numbers without
|
45
|
-
expect(-
|
46
|
-
expect(-
|
47
|
-
expect(-
|
45
|
+
expect(-123_456_789.0123456.commas).to eq '-123,456,789.0123'
|
46
|
+
expect(-123_456_789.0.commas).to eq '-123,456,789'
|
47
|
+
expect(-123_456_789.00.commas).to eq '-123,456,789'
|
48
48
|
end
|
49
49
|
|
50
|
-
it
|
50
|
+
it 'should be able to convert a non-fractional float to an int' do
|
51
51
|
expect(195.45.int_if_whole).to eq 195.45
|
52
52
|
expect(195.0.int_if_whole).to eq 195
|
53
|
-
expect(195.0.int_if_whole.
|
53
|
+
expect(195.0.int_if_whole.is_a?(Integer)).to be true
|
54
54
|
end
|
55
55
|
|
56
|
-
it
|
57
|
-
expect(
|
58
|
-
expect(-
|
56
|
+
it 'should place commas properly with no fraction' do
|
57
|
+
expect(123_456_789.commas).to eq '123,456,789'
|
58
|
+
expect(-123_456_789.commas).to eq '-123,456,789'
|
59
59
|
end
|
60
60
|
|
61
|
-
it
|
62
|
-
expect(
|
61
|
+
it 'should not place commas in a number with exponent' do
|
62
|
+
expect(123_456.789e100.commas).to eq '1.23456789e+105'
|
63
63
|
end
|
64
64
|
|
65
|
-
it
|
65
|
+
it 'should be able to convert itself into an H:M:S string' do
|
66
66
|
expect(60.secs_to_hms).to eq('00:01:00')
|
67
67
|
expect(120.secs_to_hms).to eq('00:02:00')
|
68
68
|
expect(6584.secs_to_hms).to eq('01:49:44')
|
data/spec/lib/period_spec.rb
CHANGED
@@ -35,7 +35,7 @@ describe Period do
|
|
35
35
|
|
36
36
|
it 'should raise a ArgumentError if initialized otherwise' do
|
37
37
|
expect {
|
38
|
-
Period.new(2013-
|
38
|
+
Period.new(2013 - 1 - 1, 2013 - 12 - 31)
|
39
39
|
}.to raise_error ArgumentError
|
40
40
|
end
|
41
41
|
end
|
@@ -289,14 +289,13 @@ describe Period do
|
|
289
289
|
end
|
290
290
|
|
291
291
|
it 'should be able to convert itself to fractional months' do
|
292
|
-
expect(Period.new('2013-01-01', '2013-01-01').months).to eq(1/30.436875)
|
293
|
-
expect(Period.new('2013-01-01', '2013-12-31').months(30)).
|
294
|
-
to eq(365 / 30.0)
|
292
|
+
expect(Period.new('2013-01-01', '2013-01-01').months).to eq(1 / 30.436875)
|
293
|
+
expect(Period.new('2013-01-01', '2013-12-31').months(30)).to eq(365 / 30.0)
|
295
294
|
expect(Period.new('2013-01-01', '2013-06-30').months.round(0)).to eq(6.0)
|
296
295
|
end
|
297
296
|
|
298
297
|
it 'should be able to convert itself to fractional years' do
|
299
|
-
expect(Period.new('2013-01-01', '2013-01-01').years).to eq(1/365.2425)
|
298
|
+
expect(Period.new('2013-01-01', '2013-01-01').years).to eq(1 / 365.2425)
|
300
299
|
expect(Period.new('2013-01-01', '2013-12-31').years(365)).to eq(1.0)
|
301
300
|
expect(Period.new('2013-01-01', '2013-06-30').years.round(1)).to eq(0.5)
|
302
301
|
end
|
@@ -416,7 +415,7 @@ describe Period do
|
|
416
415
|
|
417
416
|
it 'should be able to chunk into biweeks' do
|
418
417
|
chunks = Period.new('2009-12-29', '2013-01-10').chunks(size: :biweek)
|
419
|
-
expect(chunks.size).to be >=(26*3)
|
418
|
+
expect(chunks.size).to be >= (26 * 3)
|
420
419
|
expect(chunks[0].first.iso).to eq('2010-01-04')
|
421
420
|
expect(chunks[0].last.iso).to eq('2010-01-17')
|
422
421
|
expect(chunks[1].first.iso).to eq('2010-01-18')
|
@@ -454,9 +453,9 @@ describe Period do
|
|
454
453
|
end
|
455
454
|
|
456
455
|
it 'should raise error for invalid chunk name' do
|
457
|
-
expect
|
456
|
+
expect {
|
458
457
|
Period.new('2012-12-28', '2012-12-31').chunks(size: :wally)
|
459
|
-
|
458
|
+
}.to raise_error(ArgumentError)
|
460
459
|
end
|
461
460
|
|
462
461
|
it 'should not include a partial final chunk by default' do
|
@@ -466,7 +465,7 @@ describe Period do
|
|
466
465
|
|
467
466
|
it 'should include a partial final chunk if partial_last' do
|
468
467
|
chunks = Period.new('2012-01-01', '2012-03-30')
|
469
|
-
|
468
|
+
.chunks(size: :month, partial_last: true)
|
470
469
|
expect(chunks.size).to eq(3)
|
471
470
|
expect(chunks.last.first).to eq(Date.parse('2012-03-01'))
|
472
471
|
expect(chunks.last.last).to eq(Date.parse('2012-03-30'))
|
@@ -474,7 +473,7 @@ describe Period do
|
|
474
473
|
|
475
474
|
it 'should include a final chunk beyond end_date if round_up' do
|
476
475
|
chunks = Period.new('2012-01-01', '2012-03-30')
|
477
|
-
|
476
|
+
.chunks(size: :month, round_up_last: true)
|
478
477
|
expect(chunks.size).to eq(3)
|
479
478
|
expect(chunks.last.first).to eq(Date.parse('2012-03-01'))
|
480
479
|
expect(chunks.last.last).to eq(Date.parse('2012-03-31'))
|
@@ -489,7 +488,7 @@ describe Period do
|
|
489
488
|
|
490
489
|
it 'should include a partial initial chunk by if partial_first' do
|
491
490
|
chunks = Period.new('2012-01-13', '2012-03-31')
|
492
|
-
|
491
|
+
.chunks(size: :month, partial_first: true)
|
493
492
|
expect(chunks.size).to eq(3)
|
494
493
|
expect(chunks[0].first).to eq(Date.parse('2012-01-13'))
|
495
494
|
expect(chunks[0].last).to eq(Date.parse('2012-01-31'))
|
@@ -497,7 +496,7 @@ describe Period do
|
|
497
496
|
|
498
497
|
it 'should include a final chunk beyond end_date if round_up' do
|
499
498
|
chunks = Period.new('2012-01-01', '2012-03-30')
|
500
|
-
|
499
|
+
.chunks(size: :month, round_up_last: true)
|
501
500
|
expect(chunks.size).to eq(3)
|
502
501
|
expect(chunks.last.first).to eq(Date.parse('2012-03-01'))
|
503
502
|
expect(chunks.last.last).to eq(Date.parse('2012-03-31'))
|
data/spec/lib/range_spec.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require File.dirname(File.absolute_path(__FILE__)) + '/../spec_helper.rb'
|
2
2
|
|
3
3
|
describe Range do
|
4
|
-
describe
|
5
|
-
it
|
4
|
+
describe 'set operations' do
|
5
|
+
it 'should know if it is a subset of another range' do
|
6
6
|
expect((4..8)).to be_subset_of((2..9))
|
7
7
|
expect((4..8)).to be_subset_of((4..8))
|
8
8
|
expect((4..8)).not_to be_subset_of((2..7))
|
@@ -10,7 +10,7 @@ describe Range do
|
|
10
10
|
expect((4..8)).not_to be_subset_of((11..20))
|
11
11
|
end
|
12
12
|
|
13
|
-
it
|
13
|
+
it 'should know if it is a proper subset of another range' do
|
14
14
|
expect((4..8)).to be_proper_subset_of((2..9))
|
15
15
|
expect((4..8)).not_to be_proper_subset_of((4..8))
|
16
16
|
expect((4..8)).not_to be_proper_subset_of((2..7))
|
@@ -18,7 +18,7 @@ describe Range do
|
|
18
18
|
expect((4..8)).not_to be_proper_subset_of((11..20))
|
19
19
|
end
|
20
20
|
|
21
|
-
it
|
21
|
+
it 'should know if it is a superset of another range' do
|
22
22
|
expect((4..8)).to be_superset_of((5..7))
|
23
23
|
expect((4..8)).to be_superset_of((6..8))
|
24
24
|
expect((4..8)).to be_superset_of((4..7))
|
@@ -32,7 +32,7 @@ describe Range do
|
|
32
32
|
expect((4..8)).not_to be_superset_of((9..20))
|
33
33
|
end
|
34
34
|
|
35
|
-
it
|
35
|
+
it 'should know if it is a proper superset of another range' do
|
36
36
|
expect((4..8)).to be_proper_superset_of((5..7))
|
37
37
|
expect((4..8)).not_to be_proper_superset_of((6..8))
|
38
38
|
expect((4..8)).not_to be_proper_superset_of((4..7))
|
@@ -46,17 +46,17 @@ describe Range do
|
|
46
46
|
expect((4..8)).not_to be_proper_superset_of((9..20))
|
47
47
|
end
|
48
48
|
|
49
|
-
it
|
49
|
+
it 'should know its intersection with another range' do
|
50
50
|
expect(((0..10) & (5..20))).to eq((5..10))
|
51
51
|
expect(((0..10) & (5..20))).to eq((5..20) & (0..10))
|
52
52
|
expect(((0..10) & (10..20))).to eq((10..10))
|
53
|
-
|
53
|
+
end
|
54
54
|
|
55
|
-
it
|
55
|
+
it 'intersection should return nil if there is no overlap' do
|
56
56
|
expect(((0..10) & (15..20))).to be_nil
|
57
57
|
end
|
58
58
|
|
59
|
-
it
|
59
|
+
it 'should know its union with another range' do
|
60
60
|
expect(((0..10) + (5..20))).to eq((0..20))
|
61
61
|
expect(((0..10) + (5..20))).to eq((5..20) + (0..10))
|
62
62
|
expect(((0..10) + (10..20))).to eq((0..20))
|
@@ -65,12 +65,12 @@ describe Range do
|
|
65
65
|
expect(((0..5) + (6..20))).to eq((0..20))
|
66
66
|
end
|
67
67
|
|
68
|
-
it
|
68
|
+
it 'union should return nil if there is no overlap' do
|
69
69
|
expect(((0..10) & (15..20))).to be_nil
|
70
70
|
expect(((15..20) & (0..10))).to be_nil
|
71
71
|
end
|
72
72
|
|
73
|
-
it
|
73
|
+
it 'should know the difference with another range' do
|
74
74
|
# Other is same as self
|
75
75
|
expect(((4..10) - (4..10)).size).to eq(0)
|
76
76
|
expect(((4..10) - (4..10))).to be_empty
|
@@ -101,13 +101,13 @@ describe Range do
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
|
-
describe
|
105
|
-
it
|
106
|
-
expect((0..3).join(4..8)).to eq
|
107
|
-
expect((4..8).join(0..3)).to eq
|
104
|
+
describe 'joining' do
|
105
|
+
it 'should be able to join contiguous ranges' do
|
106
|
+
expect((0..3).join(4..8)).to eq((0..8))
|
107
|
+
expect((4..8).join(0..3)).to eq((0..8))
|
108
108
|
end
|
109
109
|
|
110
|
-
it
|
110
|
+
it 'should return nil on join of non-contiguous ranges' do
|
111
111
|
expect((0..3).join(5..8)).to be_nil
|
112
112
|
expect((0...3).join(4..8)).to be_nil
|
113
113
|
|
@@ -115,22 +115,22 @@ describe Range do
|
|
115
115
|
expect((4..8).join(0...3)).to be_nil
|
116
116
|
end
|
117
117
|
|
118
|
-
it
|
119
|
-
expect((0.0..3.0).join(3.0..8.2)).to eq
|
120
|
-
expect((3.0..8.2).join(0.0..3.0)).to eq
|
118
|
+
it 'should work with Floats, allowing single-point overlap' do
|
119
|
+
expect((0.0..3.0).join(3.0..8.2)).to eq((0.0..8.2))
|
120
|
+
expect((3.0..8.2).join(0.0..3.0)).to eq((0.0..8.2))
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
124
|
-
describe
|
125
|
-
it
|
124
|
+
describe 'spanning' do
|
125
|
+
it 'should be able to determine whether it is spanned by a set of ranges' do
|
126
126
|
expect((0..10)).to be_spanned_by([(0..3), (4..6), (7..10)])
|
127
127
|
end
|
128
128
|
|
129
|
-
it
|
129
|
+
it 'should be determine that overlapping ranges do not span' do
|
130
130
|
expect((0..10)).to_not be_spanned_by([(0..3), (3..6), (7..10)])
|
131
131
|
end
|
132
132
|
|
133
|
-
it
|
133
|
+
it 'should allow spanning ranges to be any Enumerable' do
|
134
134
|
require 'set'
|
135
135
|
set = [(0..3), (4..6), (7..10)].to_set
|
136
136
|
expect((0..10)).to be_spanned_by(set)
|
@@ -138,15 +138,15 @@ describe Range do
|
|
138
138
|
expect((0..10)).to_not be_spanned_by(set)
|
139
139
|
end
|
140
140
|
|
141
|
-
it
|
141
|
+
it 'should allow the spanning set to be wider than itself' do
|
142
142
|
set = [(0..3), (4..6), (7..10)].to_set
|
143
143
|
expect((2..8)).to be_spanned_by(set)
|
144
144
|
expect((5..6)).to be_spanned_by(set)
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
|
-
describe
|
149
|
-
it
|
148
|
+
describe 'overlapping a single range' do
|
149
|
+
it 'should know if another range overlaps it' do
|
150
150
|
expect((0..10).overlaps?(-3..5)).to be_truthy
|
151
151
|
expect((0..10).overlaps?(3..5)).to be_truthy
|
152
152
|
expect((0..10).overlaps?(8..15)).to be_truthy
|
@@ -163,114 +163,114 @@ describe Range do
|
|
163
163
|
expect((-11..-1).overlaps?(0..10)).to be_falsy
|
164
164
|
end
|
165
165
|
|
166
|
-
it
|
166
|
+
it 'should be able to determine whether a set contains covered overlaps' do
|
167
167
|
expect((0..10)).to have_overlaps_within([(0..3), (2..6), (7..10)])
|
168
168
|
end
|
169
169
|
|
170
|
-
it
|
170
|
+
it 'should not care about overlaps outside range' do
|
171
171
|
expect((11..15)).to_not have_overlaps_within([(0..3), (2..6), (7..10)])
|
172
172
|
end
|
173
173
|
|
174
|
-
it
|
174
|
+
it 'should not count contiguous ranges as overlapping' do
|
175
175
|
expect((0..10)).to_not have_overlaps_within([(0..3), (4..6), (7..10)])
|
176
176
|
end
|
177
177
|
|
178
|
-
it
|
178
|
+
it 'should not count non-contiguous ranges as overlapping' do
|
179
179
|
expect((0..10)).to_not have_overlaps_within([(0..3), (4..6), (8..10)])
|
180
180
|
end
|
181
181
|
|
182
|
-
it
|
182
|
+
it 'should not count an empty set as overlapping' do
|
183
183
|
expect((0..10)).to_not have_overlaps_within([])
|
184
184
|
end
|
185
185
|
end
|
186
186
|
|
187
|
-
describe
|
188
|
-
it
|
187
|
+
describe 'coverage gaps' do
|
188
|
+
it 'should return an empty array if ranges completely cover' do
|
189
189
|
expect((0..10).gaps([(-1..3), (4..8), (9..11)])).to be_empty
|
190
190
|
end
|
191
191
|
|
192
|
-
it
|
192
|
+
it 'should return array for itself if ranges are empty' do
|
193
193
|
expect((0..10).gaps([])).to eq([(0..10)])
|
194
194
|
end
|
195
195
|
|
196
|
-
it
|
196
|
+
it 'should return an array of gaps' do
|
197
197
|
gaps = (0..10).gaps([(0..3), (5..6), (9..10)])
|
198
198
|
expect(gaps[0]).to eq((4..4))
|
199
199
|
expect(gaps[1]).to eq((7..8))
|
200
200
|
end
|
201
201
|
|
202
|
-
it
|
202
|
+
it 'should allow ranges to extend before and after self' do
|
203
203
|
gaps = (0..10).gaps([(-3..3), (4..6), (7..13)])
|
204
204
|
expect(gaps).to be_empty
|
205
205
|
end
|
206
206
|
|
207
|
-
it
|
207
|
+
it 'should not include parts before or after in gaps' do
|
208
208
|
gaps = (0..10).gaps([(-10..-8), (-3..3), (7..13), (30..40)])
|
209
209
|
expect(gaps.size).to eq(1)
|
210
210
|
expect(gaps[0]).to eq((4..6))
|
211
211
|
end
|
212
212
|
|
213
|
-
it
|
213
|
+
it 'should return gaps at beginning and end' do
|
214
214
|
gaps = (0..10).gaps([(2..3), (4..6), (7..8)])
|
215
215
|
expect(gaps[0]).to eq((0..1))
|
216
216
|
expect(gaps[1]).to eq((9..10))
|
217
217
|
end
|
218
218
|
|
219
|
-
it
|
219
|
+
it 'should work even if ranges are out of order' do
|
220
220
|
gaps = (0..10).gaps([(2..3), (30..40), (7..8), (-10..-8), (4..6)])
|
221
221
|
expect(gaps[0]).to eq((0..1))
|
222
222
|
expect(gaps[1]).to eq((9..10))
|
223
223
|
end
|
224
224
|
|
225
|
-
it
|
225
|
+
it 'should notice single point coverage' do
|
226
226
|
gaps = (0..10).gaps([(4..4), (5..5), (6..6)])
|
227
227
|
expect(gaps[0]).to eq((0..3))
|
228
228
|
expect(gaps[1]).to eq((7..10))
|
229
229
|
end
|
230
230
|
|
231
|
-
it
|
231
|
+
it 'should work for a single-point range' do
|
232
232
|
gaps = (3..3).gaps([(0..2), (4..4), (5..5), (6..6)])
|
233
233
|
expect(gaps[0]).to eq((3..3))
|
234
234
|
end
|
235
235
|
|
236
|
-
it
|
236
|
+
it 'should work even if ranges overlap' do
|
237
237
|
gaps = (0..10).gaps([(-2..3), (2..8), (4..10)])
|
238
238
|
expect(gaps).to be_empty
|
239
239
|
end
|
240
240
|
end
|
241
241
|
|
242
|
-
describe
|
243
|
-
it
|
242
|
+
describe 'coverage overlaps' do
|
243
|
+
it 'should return an empty array if ranges are empty' do
|
244
244
|
expect((0..10).overlaps([])).to be_empty
|
245
245
|
end
|
246
246
|
|
247
|
-
it
|
247
|
+
it 'should return an empty array if ranges is same as self' do
|
248
248
|
expect((0..10).overlaps([(0..10)])).to be_empty
|
249
249
|
end
|
250
250
|
|
251
|
-
it
|
251
|
+
it 'should return an empty array if ranges is wider than self' do
|
252
252
|
expect((0..10).overlaps([(-5..15)])).to be_empty
|
253
253
|
end
|
254
254
|
|
255
|
-
it
|
255
|
+
it 'should return an empty array if ranges is narrower than self' do
|
256
256
|
expect((0..10).overlaps([(5..8)])).to be_empty
|
257
257
|
end
|
258
258
|
|
259
|
-
it
|
259
|
+
it 'should return an array of overlaps' do
|
260
260
|
overlaps = (0..10).overlaps([(0..3), (2..6), (4..10)])
|
261
261
|
expect(overlaps.size).to eq(2)
|
262
262
|
expect(overlaps[0]).to eq((2..3))
|
263
263
|
expect(overlaps[1]).to eq((4..6))
|
264
264
|
end
|
265
265
|
|
266
|
-
it
|
266
|
+
it 'should not return any overlaps before self' do
|
267
267
|
overlaps = (0..10).overlaps([(-5..-3), (-4..-1), (0..3), (2..6), (4..10)])
|
268
268
|
expect(overlaps.size).to eq(2)
|
269
269
|
expect(overlaps[0]).to eq((2..3))
|
270
270
|
expect(overlaps[1]).to eq((4..6))
|
271
271
|
end
|
272
272
|
|
273
|
-
it
|
273
|
+
it 'should not return any overlaps after self' do
|
274
274
|
overlaps = (0..10).overlaps([(0..3), (2..6), (4..15), (11..20)])
|
275
275
|
expect(overlaps.size).to eq(2)
|
276
276
|
expect(overlaps[0]).to eq((2..3))
|
data/spec/lib/string_spec.rb
CHANGED
@@ -55,33 +55,33 @@ the people, for the people, shall not perish from the earth."
|
|
55
55
|
##123456789012345678901234567890123456789012345678901234567890123456789|
|
56
56
|
end
|
57
57
|
|
58
|
-
describe
|
59
|
-
it
|
58
|
+
describe 'class methods' do
|
59
|
+
it 'should be able to generate a random string' do
|
60
60
|
ss = String.random(100)
|
61
61
|
expect(ss.class).to eq String
|
62
62
|
expect(ss.size).to eq 100
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
-
describe
|
67
|
-
it
|
66
|
+
describe 'instance methods' do
|
67
|
+
it 'should be able to clean up white space in a string' do
|
68
68
|
expect(' string here '.clean).to eq 'string here'
|
69
69
|
end
|
70
70
|
|
71
|
-
it
|
72
|
-
expect(
|
71
|
+
it 'should be able to convert a digital date to iso form' do
|
72
|
+
expect('20140521'.digdate2iso).to eq '2014-05-21'
|
73
73
|
end
|
74
74
|
|
75
|
-
it
|
76
|
-
expect(
|
75
|
+
it 'should wrap a short string' do
|
76
|
+
expect('hello, world'.wrap).to eq 'hello, world'
|
77
77
|
end
|
78
78
|
|
79
|
-
it
|
80
|
-
@getty.wrap.split("\n").each {|l| expect(l.length).to be <= 70}
|
79
|
+
it 'should wrap a long string' do
|
80
|
+
@getty.wrap.split("\n").each { |l| expect(l.length).to be <= 70 }
|
81
81
|
end
|
82
82
|
|
83
|
-
it
|
84
|
-
@getty.wrap(70, 10).split("\n").each {|l| expect(l.length).to be <= 70}
|
83
|
+
it 'should wrap a long string with a hangining indent' do
|
84
|
+
@getty.wrap(70, 10).split("\n").each { |l| expect(l.length).to be <= 70 }
|
85
85
|
@getty.wrap(70, 10).split("\n")[1..-1].each do |l|
|
86
86
|
expect(l).to match(/^ /)
|
87
87
|
end
|
@@ -93,14 +93,14 @@ the people, for the people, shall not perish from the earth."
|
|
93
93
|
expect(@getty.wrap(70, 10).split("\n")[23]).to match(/^#{twenty_fourth_line}/)
|
94
94
|
end
|
95
95
|
|
96
|
-
it
|
97
|
-
expect(
|
98
|
-
expect(
|
99
|
-
expect(
|
100
|
-
expect(
|
96
|
+
it 'should be able to quote special TeX characters' do
|
97
|
+
expect('$10,000'.tex_quote).to eq('\\$10,000')
|
98
|
+
expect('would~~have'.tex_quote).to eq('would\\textasciitilde{}\\textasciitilde{}have')
|
99
|
+
expect('<hello>'.tex_quote).to eq('\\textless{}hello\\textgreater{}')
|
100
|
+
expect('{hello}'.tex_quote).to eq('\\{hello\\}')
|
101
101
|
end
|
102
102
|
|
103
|
-
it
|
103
|
+
it 'should be able to determine is it\'s a valid number' do
|
104
104
|
expect('88'.number?).to be true
|
105
105
|
expect('-88'.number?).to be true
|
106
106
|
expect('8.008'.number?).to be true
|
@@ -111,7 +111,7 @@ the people, for the people, shall not perish from the earth."
|
|
111
111
|
expect('hello world'.number?).to be false
|
112
112
|
end
|
113
113
|
|
114
|
-
it
|
114
|
+
it 'should be able to convert a string to a regular expression' do
|
115
115
|
re = "/hello((\s+)(world))?/".to_regexp
|
116
116
|
expect(re.class).to eq Regexp
|
117
117
|
expect(re.casefold?).to be true
|
@@ -129,101 +129,98 @@ the people, for the people, shall not perish from the earth."
|
|
129
129
|
expect(re.multiline?).to be false
|
130
130
|
end
|
131
131
|
|
132
|
-
it
|
133
|
-
expect(
|
134
|
-
expect(
|
132
|
+
it 'should be able to convert itself to a sym' do
|
133
|
+
expect('joke'.as_sym).to eq :joke
|
134
|
+
expect('hello world'.as_sym).to eq :hello_world
|
135
135
|
expect("hello world it's me".as_sym).to eq :hello_world_its_me
|
136
|
-
expect(
|
136
|
+
expect('Street1'.as_sym).to eq :street1
|
137
137
|
end
|
138
138
|
|
139
|
-
it
|
140
|
-
expect(
|
141
|
-
expect(
|
139
|
+
it 'should do nothing in response to as_string' do
|
140
|
+
expect('joke'.as_string).to eq 'joke'
|
141
|
+
expect('hello world'.as_string).to eq 'hello world'
|
142
142
|
expect("hello world it's me".as_string)
|
143
143
|
.to eq "hello world it's me"
|
144
144
|
end
|
145
145
|
|
146
|
-
it
|
147
|
-
expect(
|
148
|
-
expect(
|
146
|
+
it 'should be able to fuzzy match with another string' do
|
147
|
+
expect('Hello, world'.fuzzy_match('or')).to be_truthy
|
148
|
+
expect('Hello, world'.fuzzy_match('ox')).to be_falsy
|
149
149
|
end
|
150
150
|
|
151
|
-
it
|
152
|
-
expect(
|
153
|
-
expect(
|
151
|
+
it 'should be able to match with another string containing re' do
|
152
|
+
expect('Hello, world'.matches_with('/or/')).to be_truthy
|
153
|
+
expect('Hello, world'.matches_with('/ox/')).to be_falsy
|
154
154
|
end
|
155
155
|
|
156
|
-
it
|
157
|
-
expect(
|
158
|
-
expect(
|
156
|
+
it 'should be able to match with another string containing string' do
|
157
|
+
expect('Hello, world'.matches_with('or')).to be_truthy
|
158
|
+
expect('Hello, world'.matches_with('ox')).to be_falsy
|
159
159
|
end
|
160
160
|
|
161
|
-
it
|
162
|
-
expect(
|
163
|
-
expect(
|
161
|
+
it 'should be able to fuzzy match space-separated parts' do
|
162
|
+
expect('Hello world'.fuzzy_match('hel or')).to be_truthy
|
163
|
+
expect('Hello, world'.fuzzy_match('hel ox')).to be_falsy
|
164
164
|
end
|
165
165
|
|
166
|
-
it
|
167
|
-
expect(
|
168
|
-
expect(
|
166
|
+
it 'should be able to fuzzy match colon-separated parts' do
|
167
|
+
expect('Hello:world'.fuzzy_match('hel:or')).to be_truthy
|
168
|
+
expect('Hello:world'.fuzzy_match('hel:ox')).to be_falsy
|
169
169
|
end
|
170
170
|
|
171
|
-
it
|
172
|
-
expect(
|
173
|
-
expect(
|
171
|
+
it 'should be able to fuzzy match colon-separated parts' do
|
172
|
+
expect('Hello:world'.fuzzy_match('hel:or')).to be_truthy
|
173
|
+
expect('Hello:world'.fuzzy_match('hel:ox')).to be_falsy
|
174
174
|
end
|
175
175
|
|
176
|
-
it
|
177
|
-
expect(
|
178
|
-
expect(
|
179
|
-
expect(
|
176
|
+
it 'should return the matched text' do
|
177
|
+
expect('Hello:world'.fuzzy_match('hel')).to eq('Hel')
|
178
|
+
expect('Hello:world'.fuzzy_match('hel:or')).to eq('Hello:wor')
|
179
|
+
expect('Hello:world'.matches_with('/^h.*r/')).to eq('Hello:wor')
|
180
180
|
end
|
181
181
|
|
182
|
-
it
|
182
|
+
it 'should ignore periods, commas, and apostrophes when matching' do
|
183
183
|
expect("St. Luke's".fuzzy_match('st lukes')).to eq('St Lukes')
|
184
|
-
expect(
|
185
|
-
expect(
|
186
|
-
expect(
|
184
|
+
expect('St Lukes'.fuzzy_match('st. luke\'s')).to eq('St Lukes')
|
185
|
+
expect('St Lukes, Inc.'.fuzzy_match('st luke inc')).to eq('St Lukes Inc')
|
186
|
+
expect('E*TRADE'.fuzzy_match('etrade')).to eq('ETRADE')
|
187
187
|
end
|
188
188
|
|
189
|
-
it
|
189
|
+
it 'should be able to properly capitalize a string as a title' do
|
190
190
|
# Capitalize little words only at beginning and end
|
191
|
-
expect(
|
192
|
-
expect(
|
193
|
-
expect(
|
191
|
+
expect('the cat in the hat'.entitle).to eq('The Cat in the Hat')
|
192
|
+
expect('dr'.entitle).to eq('Dr')
|
193
|
+
expect('cr'.entitle).to eq('Cr')
|
194
194
|
# Capitalize all consonants size if >= 3
|
195
|
-
expect(
|
196
|
-
expect(
|
195
|
+
expect('tr'.entitle).to eq('Tr')
|
196
|
+
expect('trd'.entitle).to eq('TRD')
|
197
197
|
# Don't capitalize c/o
|
198
|
-
expect(
|
198
|
+
expect('IBM c/o watson'.entitle).to eq('Ibm c/o Watson')
|
199
199
|
# Capitlaize p.o.
|
200
|
-
expect(
|
200
|
+
expect('p.o. box 123'.entitle).to eq('P.O. Box 123')
|
201
201
|
# Don't capitalize ordinals
|
202
|
-
expect(
|
202
|
+
expect('22nd of september'.entitle).to eq('22nd of September')
|
203
203
|
# Capitalize common abbrevs
|
204
|
-
expect(
|
205
|
-
expect(
|
204
|
+
expect('US BANK'.entitle).to eq('US Bank')
|
205
|
+
expect('NW territory'.entitle).to eq('NW Territory')
|
206
206
|
# Leave word starting with numbers alone
|
207
|
-
expect(
|
207
|
+
expect('apartment 33-B'.entitle).to eq('Apartment 33-B')
|
208
208
|
# Assume all consanants is an acronym
|
209
|
-
expect(
|
209
|
+
expect('the cbs network'.entitle).to eq('The CBS Network')
|
210
210
|
# Capitalize both parts of a hyphenated word
|
211
|
-
expect(
|
212
|
-
to eq('The Hitler-Stalin Pact')
|
211
|
+
expect('the hitler-stalin pact'.entitle).to eq('The Hitler-Stalin Pact')
|
213
212
|
end
|
214
213
|
|
215
|
-
it
|
214
|
+
it 'should be able to compute its Levenshtein distance from another string' do
|
216
215
|
expect('Something'.distance('Smoething')).to eq 1
|
217
216
|
expect('Something'.distance('Smoething', block_size: 0)).to eq 2
|
218
217
|
expect('Something'.distance('meSothing', block_size: 1)).to eq 4
|
219
218
|
expect('Something'.distance('meSothing', block_size: 2)).to eq 2
|
220
219
|
expect('SomethingElse'.distance('Encyclopedia')).to eq 10
|
221
|
-
expect('SomethingElseUnrelated'.
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
distance('EncyclopediaBritanica',
|
226
|
-
max_distance: 15)).to eq 15
|
220
|
+
expect('SomethingElseUnrelated'.distance('EncyclopediaBritanica', max_distance: 40))
|
221
|
+
.to eq 21
|
222
|
+
expect('SomethingElseUnrelated'.distance('EncyclopediaBritanica',
|
223
|
+
max_distance: 15)).to eq 15
|
227
224
|
end
|
228
225
|
end
|
229
226
|
end
|