sugar_refinery 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +157 -0
- data/MIT-LICENSE.txt +20 -0
- data/README.md +42 -0
- data/Rakefile +49 -0
- data/doc/create_documentation.rb +471 -0
- data/doc/index.html +1687 -0
- data/lib/sugar_refinery.rb +1 -0
- data/lib/sugar_refinery/alias_for.rb +15 -0
- data/lib/sugar_refinery/all.rb +5 -0
- data/lib/sugar_refinery/array_op.rb +15 -0
- data/lib/sugar_refinery/array_stats.rb +31 -0
- data/lib/sugar_refinery/blank.rb +47 -0
- data/lib/sugar_refinery/camel_snake.rb +15 -0
- data/lib/sugar_refinery/chain_map.rb +11 -0
- data/lib/sugar_refinery/constantize.rb +29 -0
- data/lib/sugar_refinery/dir_utils.rb +20 -0
- data/lib/sugar_refinery/file_force_delete.rb +12 -0
- data/lib/sugar_refinery/file_gsub.rb +23 -0
- data/lib/sugar_refinery/hash_op.rb +28 -0
- data/lib/sugar_refinery/hash_zip.rb +11 -0
- data/lib/sugar_refinery/inner_map.rb +15 -0
- data/lib/sugar_refinery/lchomp.rb +15 -0
- data/lib/sugar_refinery/marshal_copy.rb +11 -0
- data/lib/sugar_refinery/mash.rb +22 -0
- data/lib/sugar_refinery/ords.rb +17 -0
- data/lib/sugar_refinery/regexp_union.rb +17 -0
- data/lib/sugar_refinery/same.rb +11 -0
- data/lib/sugar_refinery/string_op.rb +20 -0
- data/lib/sugar_refinery/version.rb +3 -0
- data/spec/alias_for_spec.rb +55 -0
- data/spec/array_op_spec.rb +17 -0
- data/spec/array_stats_spec.rb +82 -0
- data/spec/blank_spec.rb +22 -0
- data/spec/camel_snake_spec.rb +15 -0
- data/spec/chain_map_spec.rb +16 -0
- data/spec/constantize_spec.rb +33 -0
- data/spec/dir_utils_spec.rb +32 -0
- data/spec/file_force_delete_spec.rb +30 -0
- data/spec/file_gsub_spec.rb +26 -0
- data/spec/hash_op_spec.rb +28 -0
- data/spec/hash_zip_spec.rb +11 -0
- data/spec/inner_map_spec.rb +24 -0
- data/spec/lchomp_spec.rb +20 -0
- data/spec/marshal_copy_spec.rb +15 -0
- data/spec/mash_spec.rb +17 -0
- data/spec/ords_spec.rb +15 -0
- data/spec/regexp_union_spec.rb +19 -0
- data/spec/same_spec.rb +10 -0
- data/spec/spec_helper.rb +18 -0
- data/spec/string_op_spec.rb +22 -0
- data/sugar_refinery.gemspec +20 -0
- metadata +138 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'sugar_refinery/array_op'
|
2
|
+
using SugarRefinery::ArrayOp
|
3
|
+
|
4
|
+
|
5
|
+
describe 'Array#^' do
|
6
|
+
it 'does an exclusive or' do
|
7
|
+
a = [1,2,3,4]
|
8
|
+
b = [3,4,5,6]
|
9
|
+
(a^b).should == [1,2,5,6]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'Array#**' do
|
14
|
+
it 'returns the array product' do
|
15
|
+
([1,2] ** %w[a b]).should == [[1, "a"], [1, "b"], [2, "a"], [2, "b"]]
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require "sugar_refinery/array_stats"
|
2
|
+
using SugarRefinery::ArrayStats
|
3
|
+
|
4
|
+
describe "doing statistics on arrays" do
|
5
|
+
let(:list) { (2..5).to_a }
|
6
|
+
|
7
|
+
describe "Array#mean" do
|
8
|
+
it "should return the average" do
|
9
|
+
list.mean.should == 3.5
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "Array#stdev_sample" do
|
14
|
+
it "should return the standard deviation of the sample" do
|
15
|
+
list.stdev_sample.should be_close(1.2909944487358056, 1e-8)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "Array#stdev_population" do
|
20
|
+
it "should return the standard deviation of the population" do
|
21
|
+
list.stdev_population.should be_close(1.118033988749895, 1e-8)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "Array#stdev" do
|
26
|
+
it "should default to population" do
|
27
|
+
list.stdev.should be_close(list.stdev_population, 1e-8)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should delegate sample correctly" do
|
31
|
+
list.stdev(:sample).should be_close(list.stdev_sample, 1e-8)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should delegate population correctly" do
|
35
|
+
list.stdev(:population).should be_close(list.stdev_population, 1e-8)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should raise an error with any other key" do
|
39
|
+
expect { list.stdev(:pony) }.to raise_error(ArgumentError)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "Array#z_score" do
|
44
|
+
it "should default to population" do
|
45
|
+
list.z_score.zip(list.z_score(:population)).each do |value, actual|
|
46
|
+
value.should be_close(actual, 1e-8)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should delegate sample correctly" do
|
51
|
+
sample_z_score = [
|
52
|
+
-1.161895003862225,
|
53
|
+
-0.3872983346207417,
|
54
|
+
0.3872983346207417,
|
55
|
+
1.161895003862225
|
56
|
+
]
|
57
|
+
|
58
|
+
p list
|
59
|
+
|
60
|
+
list.z_score(:sample).zip(sample_z_score).each do |value, actual|
|
61
|
+
value.should be_close(actual, 1e-8)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should delegate population correctly" do
|
66
|
+
population_z_score = [
|
67
|
+
-1.3416407864998738,
|
68
|
+
-0.4472135954999579,
|
69
|
+
0.4472135954999579,
|
70
|
+
1.3416407864998738
|
71
|
+
]
|
72
|
+
|
73
|
+
list.z_score(:population).zip(population_z_score).each do |value, actual|
|
74
|
+
value.should be_close(actual, 1e-8)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should raise an error with any other key" do
|
79
|
+
expect { list.z_score(:pony) }.to raise_error(ArgumentError)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/spec/blank_spec.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'sugar_refinery/blank'
|
2
|
+
using SugarRefinery::Blank
|
3
|
+
|
4
|
+
|
5
|
+
describe 'Object#blank?' do
|
6
|
+
it 'should be blank for blank values' do
|
7
|
+
blank_values = [ nil, false, '', ' ', " \n\t \r ", [], {}, // ]
|
8
|
+
|
9
|
+
blank_values.each{ |blank|
|
10
|
+
blank.blank?.should == true
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should not be blank for non blank values' do
|
15
|
+
present_values = [ Object.new, true, 0, 1, 'a', [nil], { nil => nil } ]
|
16
|
+
|
17
|
+
present_values.each{ |present|
|
18
|
+
present.blank?.should == false
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'sugar_refinery/camel_snake'
|
2
|
+
using SugarRefinery::CamelSnake
|
3
|
+
|
4
|
+
|
5
|
+
describe 'String#to_camel' do
|
6
|
+
it 'should turn a snake_cased string to CamelCase' do
|
7
|
+
'was_snake_case'.to_camel.should == 'WasSnakeCase'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'String#to_snake' do
|
12
|
+
it 'should turn a CamelCased string to snake_case' do
|
13
|
+
'WasCamelCase'.to_snake.should == 'was_camel_case'
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "sugar_refinery/chain_map"
|
2
|
+
using SugarRefinery::ChainMap
|
3
|
+
|
4
|
+
describe "Array#chain_map" do
|
5
|
+
it "should repeatedly chain symbols as map calls" do
|
6
|
+
list = [-3, -2, -1]
|
7
|
+
|
8
|
+
list.chain_map(:abs, :to_s) == %w{3 2 1}
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should repeatedly chain blocks as map calls" do
|
12
|
+
list = [-3, -2, -1]
|
13
|
+
|
14
|
+
list.chain_map(->(e) { e ** 2 }, ->(e) { e * -1 }) == [-9, -4, -1]
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'sugar_refinery/constantize'
|
2
|
+
using SugarRefinery::Constantize
|
3
|
+
|
4
|
+
|
5
|
+
describe 'String#constantize' do
|
6
|
+
it 'should return the constant with that name' do
|
7
|
+
'Object'.constantize.should == Object
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should also work for nested constants' do
|
11
|
+
'SugarRefinery::VERSION'.constantize.should == SugarRefinery::VERSION
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should throw name error if constant does not exist (and no parameter is given)' do
|
15
|
+
proc do
|
16
|
+
'ObfsefsefsefafesafaefRubySugarRefineryafdfselijfesject'.constantize
|
17
|
+
end.should raise_exception NameError
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should call the block (and not raise an error) if constant does not exist and block given' do
|
21
|
+
proc do
|
22
|
+
'ObfsefsefsefafesafaefRubySugarRefineryafdfselijfesject'.constantize do |string|
|
23
|
+
Default = [1,2,3]
|
24
|
+
end.should == [1,2,3]
|
25
|
+
end.should_not raise_exception
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should return the second parameter (and not raise an error) if constant does not exist and parameter given' do
|
29
|
+
proc do
|
30
|
+
'ObfsefsefsefafesafaefRubySugarRefineryafdfselijfesject'.constantize(Array).should == Array
|
31
|
+
end.should_not raise_exception
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'sugar_refinery/dir_utils'
|
2
|
+
require 'securerandom'
|
3
|
+
using SugarRefinery::DirUtils
|
4
|
+
|
5
|
+
|
6
|
+
describe Dir do
|
7
|
+
describe '.join' do
|
8
|
+
it 'delegates to File.join' do
|
9
|
+
a = %w[some file path]
|
10
|
+
expect( Dir.join(a) ).to be == File.join(a)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.split' do
|
15
|
+
it 'delegates to File.split' do
|
16
|
+
a = 'some/file/path'
|
17
|
+
expect( Dir.split(a) ).to be == File.split(a)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '.rm' do
|
22
|
+
it 'removes directories with content' do
|
23
|
+
path = "tmp_#{SecureRandom.uuid}"
|
24
|
+
FileUtils.mkdir path
|
25
|
+
FileUtils.touch "#{path}/123"
|
26
|
+
expect{
|
27
|
+
Dir.rm path
|
28
|
+
}.not_to raise_error
|
29
|
+
expect( Dir['*'] ).to_not include(path)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'sugar_refinery/file_force_delete'
|
2
|
+
require 'fileutils'
|
3
|
+
using SugarRefinery::FileForceDelete
|
4
|
+
|
5
|
+
|
6
|
+
describe File do
|
7
|
+
describe '.delete!' do
|
8
|
+
after{ File.delete! 'random_filename' }
|
9
|
+
let :random_filename do
|
10
|
+
'test_' + (0..20).map{|e| [*'a'..'z'].sample }*''
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should delete the filename given as argument if it exists + return non-nil' do
|
14
|
+
FileUtils.touch random_filename
|
15
|
+
res = false
|
16
|
+
proc do
|
17
|
+
res = File.delete! random_filename
|
18
|
+
end.should_not raise_exception
|
19
|
+
res.should be_truthy
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should do nothing if the filename given as argument does not exist + return nil' do
|
23
|
+
res = false
|
24
|
+
proc do
|
25
|
+
res = File.delete! random_filename
|
26
|
+
end.should_not raise_exception
|
27
|
+
res.should be_falsey
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'sugar_refinery/file_gsub'
|
2
|
+
require 'fileutils'
|
3
|
+
using SugarRefinery::FileGsub
|
4
|
+
|
5
|
+
|
6
|
+
describe File do
|
7
|
+
describe '.gsub' do
|
8
|
+
let :random_filename do
|
9
|
+
'test_' + (0..20).map{|e| [*'a'..'z'].sample }*''
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should read filename in arg1, substitute every key in the arg2 with its value and save the file' do
|
13
|
+
File.open(random_filename,'w'){ |file|
|
14
|
+
file.print 'should read filename in arg1, substitute every key in the arg2 with its value and save the file'
|
15
|
+
}
|
16
|
+
File.gsub random_filename,
|
17
|
+
/read/ => 'write',
|
18
|
+
/\d+/ => proc{|m| (m.to_i+1).to_s }
|
19
|
+
|
20
|
+
File.read(random_filename).should ==
|
21
|
+
'should write filename in arg2, substitute every key in the arg3 with its value and save the file'
|
22
|
+
|
23
|
+
FileUtils.rm random_filename
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'sugar_refinery/hash_op'
|
2
|
+
using SugarRefinery::HashOp
|
3
|
+
|
4
|
+
|
5
|
+
describe 'Hash#<<' do
|
6
|
+
it 'appends new elements to the hash' do
|
7
|
+
a = { 1=>4, 2=>5, 3=>6 }
|
8
|
+
a << { 4=>7 }
|
9
|
+
a << [5, 8]
|
10
|
+
a.should == { 1=>4, 2=>5, 3=>6, 4=>7, 5=>8 }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'Hash#&' do
|
15
|
+
it 'selects a sub hash containt only equal key-value pairs' do
|
16
|
+
a = { 1=>4, 2=>5, 3=>6 }
|
17
|
+
b = { 1=>4, 2=>7 }
|
18
|
+
(a & b).should == { 1=>4 }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'Hash#+' do
|
23
|
+
it 'merges two hashes' do
|
24
|
+
a = { 1=>4, 2=>5, 3=>6 }
|
25
|
+
b = { 1=>4, 2=>7, 4=>0 }
|
26
|
+
(a + b).should == { 1=>4, 2=>7, 3=>6, 4=>0 }
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'sugar_refinery/hash_zip'
|
2
|
+
using SugarRefinery::HashZip
|
3
|
+
|
4
|
+
|
5
|
+
describe Hash do
|
6
|
+
describe '.zip' do
|
7
|
+
it 'should zip together both given enumerables and take them as key=>values for a new hash' do
|
8
|
+
Hash.zip( [1,2,3], [4,5,6] ).should == { 1=>4, 2=>5, 3=>6 }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "sugar_refinery/inner_map"
|
2
|
+
using SugarRefinery::InnerMap
|
3
|
+
|
4
|
+
describe "Array#inner_map" do
|
5
|
+
it "should delegate map to inner lists" do
|
6
|
+
list = [[1, 2], [3, 4]]
|
7
|
+
|
8
|
+
list.inner_map { |i| i + 1 }.should == [[2, 3], [4, 5]]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "Array#inner_inject" do
|
13
|
+
it "should delegate inject to inner lists" do
|
14
|
+
list = [%w{a b c}, %w{d e f}]
|
15
|
+
|
16
|
+
list.inner_inject(&:+).should == list.map(&:join)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should take default values" do
|
20
|
+
list = [[3, 2, 1], [-4]]
|
21
|
+
|
22
|
+
list.inner_inject(4, &:+).should == [10, 0]
|
23
|
+
end
|
24
|
+
end
|
data/spec/lchomp_spec.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'sugar_refinery/lchomp'
|
2
|
+
using SugarRefinery::Lchomp
|
3
|
+
|
4
|
+
describe String do
|
5
|
+
describe '#lchomp' do
|
6
|
+
it 'should chomp on the left side' do
|
7
|
+
string = 'ameise'
|
8
|
+
expect( string.lchomp('a') ).to eq 'meise'
|
9
|
+
expect( string ).to eq 'ameise'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#lchomp!' do
|
14
|
+
it 'should chomp on the left side (mutating)' do
|
15
|
+
string = 'ameise'
|
16
|
+
expect( string.lchomp!('a') ).to eq 'meise'
|
17
|
+
expect( string ).to eq 'meise'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'sugar_refinery/marshal_copy'
|
2
|
+
using SugarRefinery::MarshalCopy
|
3
|
+
|
4
|
+
|
5
|
+
describe 'Object#marshal_copy' do
|
6
|
+
it 'create a (deep) copy via marshalling' do
|
7
|
+
a = %w[hello world]
|
8
|
+
b = a.marshal_copy
|
9
|
+
b.should == a
|
10
|
+
|
11
|
+
b[0][1,1] = ''
|
12
|
+
b.should_not == a
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
data/spec/mash_spec.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'sugar_refinery/mash'
|
2
|
+
using SugarRefinery::Mash
|
3
|
+
|
4
|
+
|
5
|
+
describe 'Array#mash' do
|
6
|
+
it 'should "map" a hash' do
|
7
|
+
[1,2,3].mash{|e| [e, e.to_s] }.should == {1=>'1',2=>'2',3=>'3',}
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
describe 'Enumerator#mash' do
|
13
|
+
it 'should "map" a hash' do
|
14
|
+
[1,2,3].each.mash{|e| [e, e.to_s] }.should == {1=>'1',2=>'2',3=>'3',}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
data/spec/ords_spec.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'sugar_refinery/ords'
|
2
|
+
using SugarRefinery::Ords
|
3
|
+
|
4
|
+
|
5
|
+
describe 'Array#chrs' do
|
6
|
+
it 'converts the array to a string, using each element as ord value for the char' do
|
7
|
+
[72, 97, 108, 108, 111].chrs.should == 'Hallo'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'String#ords' do
|
12
|
+
it 'unpacks characters' do
|
13
|
+
'Hallo'.ords.should == [72, 97, 108, 108, 111]
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'sugar_refinery/regexp_union'
|
2
|
+
using SugarRefinery::RegexpUnion
|
3
|
+
|
4
|
+
|
5
|
+
shared_examples_for "Regexp.union operator" do
|
6
|
+
it "creates a Regexp.union of both operands" do
|
7
|
+
(/Ruby\d/ | /test/i | "cheat").should ==
|
8
|
+
Regexp.union( Regexp.union( /Ruby\d/, /test/i ), "cheat" )
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe 'Regexp#|' do
|
13
|
+
it_should_behave_like 'Regexp.union operator'
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'String#|' do
|
17
|
+
it_should_behave_like 'Regexp.union operator'
|
18
|
+
end
|
19
|
+
|