zucker 100.0.0 → 100.1.0
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 +4 -4
- data/{CHANGELOG → CHANGELOG.txt} +8 -0
- data/{MIT-LICENSE → MIT-LICENSE.txt} +1 -1
- data/README.md +8 -6
- data/doc/create_documentation.rb +2 -2
- data/doc/zucker.html +615 -332
- data/lib/zucker.rb +2 -4
- data/lib/zucker/array_stats.rb +31 -0
- data/lib/zucker/chain_map.rb +11 -0
- data/lib/zucker/float_extras.rb +11 -0
- data/lib/zucker/inner_map.rb +15 -0
- data/spec/array_stats_spec.rb +82 -0
- data/spec/chain_map_spec.rb +16 -0
- data/spec/file_extras_spec.rb +4 -4
- data/spec/float_extras_spec.rb +10 -0
- data/spec/inner_map_spec.rb +24 -0
- data/spec/iterate_spec.rb +1 -1
- data/zucker.gemspec +8 -7
- metadata +22 -15
data/lib/zucker.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
begin
|
2
2
|
require 'refine'
|
3
3
|
rescue LoadError
|
4
|
-
if RUBY_VERSION < '2.0'
|
5
|
-
warn "The zucker library depends on refinements, please install the refine gem, when running a RubyVersion < 2.0"
|
6
|
-
end
|
7
4
|
end
|
8
5
|
|
6
|
+
|
9
7
|
module Zucker
|
10
|
-
VERSION = '100.
|
8
|
+
VERSION = '100.1.0'
|
11
9
|
DATE = '2014-04-01'
|
12
10
|
|
13
11
|
class << self
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "zucker"
|
2
|
+
|
3
|
+
module Zucker
|
4
|
+
module ArrayStats
|
5
|
+
refine Array do
|
6
|
+
def mean
|
7
|
+
inject(&:+) / length.to_f
|
8
|
+
end
|
9
|
+
|
10
|
+
def stdev(type = :population)
|
11
|
+
case type
|
12
|
+
when :population then stdev_population
|
13
|
+
when :sample then stdev_sample
|
14
|
+
else raise ArgumentError.new("%s is not a valid argument" % type)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def stdev_sample
|
19
|
+
Math.sqrt(inject(0.0) { |sum, x| sum + (mean - x) ** 2 } / (length - 1))
|
20
|
+
end
|
21
|
+
|
22
|
+
def stdev_population
|
23
|
+
Math.sqrt(inject(0.0) { |sum, x| sum + (mean - x) ** 2 } / length)
|
24
|
+
end
|
25
|
+
|
26
|
+
def z_score(type = :population)
|
27
|
+
map { |x| (x - mean) / stdev(type) }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "zucker"
|
2
|
+
|
3
|
+
module Zucker
|
4
|
+
module InnerMap
|
5
|
+
refine Array do
|
6
|
+
def inner_map(&block)
|
7
|
+
map { |object| object.map(&block) }
|
8
|
+
end
|
9
|
+
|
10
|
+
def inner_inject(default = :not_used, &block)
|
11
|
+
map { |object| default == :not_used ? object.inject(&block) : object.inject(default, &block) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require "zucker/array_stats"
|
2
|
+
using Zucker::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
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "zucker/chain_map"
|
2
|
+
using Zucker::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
|
data/spec/file_extras_spec.rb
CHANGED
@@ -13,7 +13,7 @@ describe File do
|
|
13
13
|
describe '.gsub' do
|
14
14
|
after{ File.delete! 'random_filename' }
|
15
15
|
let :random_filename do
|
16
|
-
'test_' + (0..20).map{|e| [*'a'..'z'].
|
16
|
+
'test_' + (0..20).map{|e| [*'a'..'z'].sample }*''
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'should read filename in arg1, substitute every key in the arg2 with its value and save the file' do
|
@@ -34,7 +34,7 @@ describe File do
|
|
34
34
|
describe '.delete!' do
|
35
35
|
after{ File.delete! 'random_filename' }
|
36
36
|
let :random_filename do
|
37
|
-
'test_' + (0..20).map{|e| [*'a'..'z'].
|
37
|
+
'test_' + (0..20).map{|e| [*'a'..'z'].sample }*''
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'should delete the filename given as argument if it exists + return non-nil' do
|
@@ -43,7 +43,7 @@ describe File do
|
|
43
43
|
proc do
|
44
44
|
res = File.delete! random_filename
|
45
45
|
end.should_not raise_exception
|
46
|
-
res.should
|
46
|
+
res.should be_truthy
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'should do nothing if the filename given as argument does not exist + return nil' do
|
@@ -51,7 +51,7 @@ describe File do
|
|
51
51
|
proc do
|
52
52
|
res = File.delete! random_filename
|
53
53
|
end.should_not raise_exception
|
54
|
-
res.should
|
54
|
+
res.should be_falsey
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "zucker/inner_map"
|
2
|
+
using Zucker::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/iterate_spec.rb
CHANGED
@@ -55,7 +55,7 @@ describe 'Object#iterate' do
|
|
55
55
|
res[:iter_b_a] = [] # ....
|
56
56
|
|
57
57
|
enumerator = iterate a,b
|
58
|
-
enumerator.should be_kind_of(
|
58
|
+
enumerator.should be_kind_of(Enumerator)
|
59
59
|
enumerator.to_a.should == [[1,'a'], [2,'b'], [3,'c'], [nil, 'd']]
|
60
60
|
end
|
61
61
|
end
|
data/zucker.gemspec
CHANGED
@@ -4,17 +4,18 @@ require File.dirname(__FILE__) + '/lib/zucker'
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "zucker"
|
6
6
|
s.version = Zucker::VERSION
|
7
|
-
s.authors = ['Jan Lelis'
|
7
|
+
s.authors = ['Jan Lelis']
|
8
8
|
s.email = 'mail@janlelis.de'
|
9
9
|
s.summary = "Sweetens your Ruby code with syntactic sugar."
|
10
|
-
s.description = "Lots of refinements to sweeten your Ruby code"
|
10
|
+
s.description = "Lots of refinements to sweeten your Ruby code."
|
11
11
|
s.homepage = "http://rubyzucker.info"
|
12
|
-
s.files = Dir.glob( %w[{lib,spec}/**/*.rb desc/**/*.yaml] ) + %w{Rakefile zucker.gemspec MIT-LICENSE README.md CHANGELOG doc/create_documentation.rb doc/zucker.html}
|
12
|
+
s.files = Dir.glob( %w[{lib,spec}/**/*.rb desc/**/*.yaml] ) + %w{Rakefile zucker.gemspec MIT-LICENSE.txt README.md CHANGELOG.txt doc/create_documentation.rb doc/zucker.html}
|
13
13
|
s.require_paths = ["lib"]
|
14
|
-
s.required_ruby_version = '>= 1.9.2'
|
15
14
|
s.license = 'MIT'
|
15
|
+
|
16
|
+
s.required_ruby_version = '~> 2.0'
|
16
17
|
s.add_dependency 'refine', '~> 0'
|
17
|
-
s.add_development_dependency 'rake', '~>
|
18
|
-
s.add_development_dependency 'rspec', '~> 2.
|
19
|
-
s.add_development_dependency 'coderay', '~>
|
18
|
+
s.add_development_dependency 'rake', '~> 10.4'
|
19
|
+
s.add_development_dependency 'rspec', '~> 2.99'
|
20
|
+
s.add_development_dependency 'coderay', '~> 1.1'
|
20
21
|
end
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zucker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 100.
|
4
|
+
version: 100.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Lelis
|
8
|
-
- others
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2015-04-01 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: refine
|
@@ -31,50 +30,50 @@ dependencies:
|
|
31
30
|
requirements:
|
32
31
|
- - "~>"
|
33
32
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
33
|
+
version: '10.4'
|
35
34
|
type: :development
|
36
35
|
prerelease: false
|
37
36
|
version_requirements: !ruby/object:Gem::Requirement
|
38
37
|
requirements:
|
39
38
|
- - "~>"
|
40
39
|
- !ruby/object:Gem::Version
|
41
|
-
version: '
|
40
|
+
version: '10.4'
|
42
41
|
- !ruby/object:Gem::Dependency
|
43
42
|
name: rspec
|
44
43
|
requirement: !ruby/object:Gem::Requirement
|
45
44
|
requirements:
|
46
45
|
- - "~>"
|
47
46
|
- !ruby/object:Gem::Version
|
48
|
-
version: '2.
|
47
|
+
version: '2.99'
|
49
48
|
type: :development
|
50
49
|
prerelease: false
|
51
50
|
version_requirements: !ruby/object:Gem::Requirement
|
52
51
|
requirements:
|
53
52
|
- - "~>"
|
54
53
|
- !ruby/object:Gem::Version
|
55
|
-
version: '2.
|
54
|
+
version: '2.99'
|
56
55
|
- !ruby/object:Gem::Dependency
|
57
56
|
name: coderay
|
58
57
|
requirement: !ruby/object:Gem::Requirement
|
59
58
|
requirements:
|
60
59
|
- - "~>"
|
61
60
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
61
|
+
version: '1.1'
|
63
62
|
type: :development
|
64
63
|
prerelease: false
|
65
64
|
version_requirements: !ruby/object:Gem::Requirement
|
66
65
|
requirements:
|
67
66
|
- - "~>"
|
68
67
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
70
|
-
description: Lots of refinements to sweeten your Ruby code
|
68
|
+
version: '1.1'
|
69
|
+
description: Lots of refinements to sweeten your Ruby code.
|
71
70
|
email: mail@janlelis.de
|
72
71
|
executables: []
|
73
72
|
extensions: []
|
74
73
|
extra_rdoc_files: []
|
75
74
|
files:
|
76
|
-
- CHANGELOG
|
77
|
-
- MIT-LICENSE
|
75
|
+
- CHANGELOG.txt
|
76
|
+
- MIT-LICENSE.txt
|
78
77
|
- README.md
|
79
78
|
- Rakefile
|
80
79
|
- doc/create_documentation.rb
|
@@ -83,14 +82,18 @@ files:
|
|
83
82
|
- lib/zucker/alias_for.rb
|
84
83
|
- lib/zucker/all.rb
|
85
84
|
- lib/zucker/array_op.rb
|
85
|
+
- lib/zucker/array_stats.rb
|
86
86
|
- lib/zucker/blank.rb
|
87
87
|
- lib/zucker/camel_snake.rb
|
88
|
+
- lib/zucker/chain_map.rb
|
88
89
|
- lib/zucker/constantize.rb
|
89
90
|
- lib/zucker/dir_extras.rb
|
90
91
|
- lib/zucker/egonil.rb
|
91
92
|
- lib/zucker/file_extras.rb
|
93
|
+
- lib/zucker/float_extras.rb
|
92
94
|
- lib/zucker/hash_extras.rb
|
93
95
|
- lib/zucker/hash_op.rb
|
96
|
+
- lib/zucker/inner_map.rb
|
94
97
|
- lib/zucker/instance_variables_from.rb
|
95
98
|
- lib/zucker/iterate.rb
|
96
99
|
- lib/zucker/marshal_copy.rb
|
@@ -104,14 +107,18 @@ files:
|
|
104
107
|
- lib/zucker/unary_conversion.rb
|
105
108
|
- spec/alias_for_spec.rb
|
106
109
|
- spec/array_op_spec.rb
|
110
|
+
- spec/array_stats_spec.rb
|
107
111
|
- spec/blank_spec.rb
|
108
112
|
- spec/camel_snake_spec.rb
|
113
|
+
- spec/chain_map_spec.rb
|
109
114
|
- spec/constantize_spec.rb
|
110
115
|
- spec/dir_extras_spec.rb
|
111
116
|
- spec/egonil_spec.rb
|
112
117
|
- spec/file_extras_spec.rb
|
118
|
+
- spec/float_extras_spec.rb
|
113
119
|
- spec/hash_extras_spec.rb
|
114
120
|
- spec/hash_op_spec.rb
|
121
|
+
- spec/inner_map_spec.rb
|
115
122
|
- spec/instance_variables_from_spec.rb
|
116
123
|
- spec/iterate_spec.rb
|
117
124
|
- spec/marshal_copy_spec.rb
|
@@ -135,9 +142,9 @@ require_paths:
|
|
135
142
|
- lib
|
136
143
|
required_ruby_version: !ruby/object:Gem::Requirement
|
137
144
|
requirements:
|
138
|
-
- - "
|
145
|
+
- - "~>"
|
139
146
|
- !ruby/object:Gem::Version
|
140
|
-
version:
|
147
|
+
version: '2.0'
|
141
148
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
149
|
requirements:
|
143
150
|
- - ">="
|
@@ -145,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
152
|
version: '0'
|
146
153
|
requirements: []
|
147
154
|
rubyforge_project:
|
148
|
-
rubygems_version: 2.
|
155
|
+
rubygems_version: 2.4.6
|
149
156
|
signing_key:
|
150
157
|
specification_version: 4
|
151
158
|
summary: Sweetens your Ruby code with syntactic sugar.
|