darkext 0.12.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.
Files changed (51) hide show
  1. data/.gitignore +4 -0
  2. data/History.txt +140 -0
  3. data/LICENSE +21 -0
  4. data/README.md +45 -0
  5. data/Rakefile +45 -0
  6. data/TODO +4 -0
  7. data/VERSION.yml +4 -0
  8. data/app_generators/sinatra_app_generator.rb +57 -0
  9. data/app_generators/templates/app.rb +16 -0
  10. data/app_generators/templates/config.ru +2 -0
  11. data/app_generators/templates/error.rb +8 -0
  12. data/app_generators/templates/gitignore +0 -0
  13. data/app_generators/templates/helpers.rb +12 -0
  14. data/app_generators/templates/http_method.rb +8 -0
  15. data/app_generators/templates/options.rb +9 -0
  16. data/bin/sinatra-app +14 -0
  17. data/darkext.gemspec +105 -0
  18. data/lib/darkext.rb +13 -0
  19. data/lib/darkext/array.rb +52 -0
  20. data/lib/darkext/beagle.rb +88 -0
  21. data/lib/darkext/boolean.rb +17 -0
  22. data/lib/darkext/fiber.rb +48 -0
  23. data/lib/darkext/float.rb +6 -0
  24. data/lib/darkext/hash.rb +38 -0
  25. data/lib/darkext/integer.rb +10 -0
  26. data/lib/darkext/io.rb +37 -0
  27. data/lib/darkext/net.rb +28 -0
  28. data/lib/darkext/numeric.rb +35 -0
  29. data/lib/darkext/object.rb +11 -0
  30. data/lib/darkext/sinatra.rb +70 -0
  31. data/lib/darkext/sitemap_generator.rb +90 -0
  32. data/lib/darkext/statistics.rb +197 -0
  33. data/lib/darkext/string.rb +63 -0
  34. data/lib/darkext/symbol.rb +7 -0
  35. data/spec/array_spec.rb +112 -0
  36. data/spec/beagle_spec.rb +42 -0
  37. data/spec/boolean_spec.rb +53 -0
  38. data/spec/fiber_spec.rb +35 -0
  39. data/spec/float_spec.rb +18 -0
  40. data/spec/hash_spec.rb +26 -0
  41. data/spec/integer_spec.rb +22 -0
  42. data/spec/io_spec.rb +44 -0
  43. data/spec/net_spec.rb +23 -0
  44. data/spec/numeric_spec.rb +52 -0
  45. data/spec/object_spec.rb +28 -0
  46. data/spec/spec.opts +3 -0
  47. data/spec/spec_helper.rb +13 -0
  48. data/spec/statistics_spec.rb +162 -0
  49. data/spec/string_spec.rb +54 -0
  50. data/spec/symbol_spec.rb +16 -0
  51. metadata +119 -0
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Beagle do
4
+ it 'should respond to all the methods' do
5
+ Beagle.should respond_to(*%w(home home= start stop status query running?))
6
+ end
7
+
8
+ it 'should not work if Beagle.home is nil' do
9
+ Beagle.home = nil
10
+ lambda { Beagle.start }.should raise_error
11
+ end
12
+
13
+ it 'should return a true or false value from running' do
14
+ # TODO: use temp dir
15
+ Beagle.home = '/balls'
16
+ Beagle.running?.is_boolean?.should be_true
17
+ end
18
+
19
+ it 'should probably not be running for a random directory' do
20
+ # TODO: use temp dir
21
+ Beagle.home = '/balls'
22
+ Beagle.running?.should be_false
23
+ end
24
+
25
+ it 'should return a String for the status' do
26
+ # TODO: use temp dir
27
+ Beagle.home = '/balls'
28
+ Beagle.status.should be_a_kind_of(String)
29
+ end
30
+
31
+ it 'should return a true or false value from start' do
32
+ # TODO: use temp dir
33
+ Beagle.home = '/usr'
34
+ Beagle.start.is_boolean?.should be_true
35
+ end
36
+
37
+ it 'should return a true or false value from stop' do
38
+ # TODO: use temp dir
39
+ Beagle.home = '/usr'
40
+ Beagle.stop.is_boolean?.should be_true
41
+ end
42
+ end
@@ -0,0 +1,53 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Object do
4
+ it 'should respond to the new method' do
5
+ Object.new.should respond_to(*%w(is_boolean?))
6
+ end
7
+
8
+ it 'should return a boolean from is_boolean' do
9
+ true.is_boolean?.is_boolean?.should be_true
10
+ end
11
+
12
+ it 'should be randomly booolean' do
13
+ 1.is_boolean?.should be_false
14
+ 'true'.is_boolean?.should be_false
15
+ :true.is_boolean?.should be_false
16
+ end
17
+ end
18
+
19
+ describe TrueClass do
20
+ it 'should respond to the new method' do
21
+ true.should respond_to(*%w(intern))
22
+ end
23
+
24
+ it 'should return a symbol from intern' do
25
+ true.intern.should be_a_kind_of(Symbol)
26
+ end
27
+
28
+ it 'should be boolean' do
29
+ true.is_boolean?.should be_true
30
+ end
31
+
32
+ it 'should intern properly' do
33
+ true.intern.should == :true
34
+ end
35
+ end
36
+
37
+ describe FalseClass do
38
+ it 'should respond to the new method' do
39
+ false.should respond_to(*%w(intern))
40
+ end
41
+
42
+ it 'should return a symbol from intern' do
43
+ false.intern.should be_a_kind_of(Symbol)
44
+ end
45
+
46
+ it 'should be boolean' do
47
+ false.is_boolean?.should be_true
48
+ end
49
+
50
+ it 'should intern properly' do
51
+ false.intern.should == :false
52
+ end
53
+ end
@@ -0,0 +1,35 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Fiber do
4
+ before(:each) do
5
+ @fiber = Fiber.new do
6
+ (1..10).each { |i| Fiber.yield(i) }
7
+ end
8
+ end
9
+
10
+ it 'should respond to all the class methods' do
11
+ Fiber.should respond_to(*%w(yield current))
12
+ end
13
+
14
+ it 'should respond to all the instance methods' do
15
+ @fiber.should respond_to(*%w(resume yield))
16
+ end
17
+
18
+ it 'should raise an error when it is done' do
19
+ lambda { 100.times { @fiber.resume } }.should raise_error
20
+ end
21
+
22
+ it 'should return a string from inspect' do
23
+ @fiber.inspect.should be_a_kind_of(String)
24
+ end
25
+
26
+ it 'should inspect properly' do
27
+ @fiber.inspect.should match(/.*Fiber:0x/)
28
+ end
29
+
30
+ it 'should, um, work' do
31
+ a = Array.new
32
+ 10.times { a << @fiber.resume }
33
+ a.should == (1..10).to_a
34
+ end
35
+ end
@@ -0,0 +1,18 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Float do
4
+ it 'should respond to the new methods' do
5
+ 1.0.should respond_to(*%w(equals?))
6
+ end
7
+
8
+ it 'should return a boolean from equals?' do
9
+ 1.0.equals?(1.0000001).is_boolean?.should be_true
10
+ end
11
+
12
+ it 'should properly equals' do
13
+ 1.00000000000000001.equals?(1.00000000000000002).should be_true
14
+ 1.1.equals?(1.2).should be_false
15
+ 1.1.equals?(1.2,0.1).should be_true
16
+ 1.2.equals?(1.1,0.1).should be_true
17
+ end
18
+ end
data/spec/hash_spec.rb ADDED
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Hash do
4
+ before(:each) do
5
+ @h = { :foo => 1, :bar => 2, :baz => 3 }
6
+ @nh = { :foo => { :bar => 2 }, :baz => { :biz => 4 } }
7
+ end
8
+
9
+ it 'should respond to all the new methods' do
10
+ Hash.new.should respond_to(*%w(nested_find deep_merge!))
11
+ end
12
+
13
+ it 'should deep merge' do
14
+ a = { :foo => 1, :bar => { :baz => 10, :biz => { :hello => :world }}}
15
+ b = { :pickles => true, :sandwich => { :ham => 2, :bread => { :grains => :whole }}}
16
+ result = { :foo => 1, :pickles => true, :sandwich => { :ham => 2, :bread => { :grains => :whole }}, :bar => { :baz => 10, :biz => { :hello => :world }}}
17
+ a.deep_merge!(b)
18
+ a.should == result
19
+ end
20
+
21
+ it 'should find nested things' do
22
+ @nh.nested_find(:baz,:biz).should == 4
23
+ @nh.nested_find(:foo,:bar).should == 2
24
+ @nh.nested_find(:foo,:biz).should be_nil
25
+ end
26
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Integer do
4
+ it 'should respond to the new methods' do
5
+ 10.should respond_to(*%w(fact))
6
+ end
7
+
8
+ it 'should not calculate the factorial of negative numbers' do
9
+ lambda { -10.fact }.should raise_error
10
+ end
11
+
12
+ it 'should return an Integer from factorial' do
13
+ 10.fact.should be_a_kind_of(Integer)
14
+ end
15
+
16
+ it 'should factorial properly' do
17
+ 5.fact.should == 120
18
+ 1.fact.should == 1
19
+ 0.fact.should == 1
20
+ 1000.fact.should == 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
21
+ end
22
+ end
data/spec/io_spec.rb ADDED
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe DarkIO do
4
+ it 'should return an array of size 2 when capturing both stdout and stderr' do
5
+ out = DarkIO::capture_output(:stderr => true, :stdout => true) do
6
+ STDOUT.print('Hello, World!')
7
+ STDERR.print('Hello, World!')
8
+ end
9
+ out.should be_a_kind_of(Array)
10
+ out.size.should == 2
11
+ end
12
+
13
+ it 'should return a string when capturing either stdout or stderr' do
14
+ out = DarkIO::capture_output(:stderr => true, :stdout => false) do
15
+ STDERR.print('Hello, World!')
16
+ end
17
+ out.should be_a_kind_of(String)
18
+ out = DarkIO::capture_output(:stdout => true, :stderr => false) do
19
+ STDOUT.print('Hello, World!')
20
+ end
21
+ out.should be_a_kind_of(String)
22
+ end
23
+
24
+ it 'should return nil if not capturing anything' do
25
+ DarkIO::capture_output(:stderr => false, :stdout => false) do
26
+ STDOUT.print('Hello, World!')
27
+ STDERR.print('Hello, World!')
28
+ end.nil?.should be_true
29
+ end
30
+
31
+ it 'should capture output' do
32
+ HW = 'Hello, World!'
33
+ out = DarkIO::capture_output { HW.print }
34
+ out.should == HW
35
+ out = DarkIO::capture_output(:stderr => true) do
36
+ (HW + 'STDOUT').print
37
+ STDERR.print(HW + 'STDERR')
38
+ end
39
+ out.shift.should == HW + 'STDOUT'
40
+ out.shift.should == HW + 'STDERR'
41
+ out = DarkIO::capture_output(:stderr => true, :stdout => false) { STDERR.print(HW) }
42
+ out.should == HW
43
+ end
44
+ end
data/spec/net_spec.rb ADDED
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Net do
4
+ it 'should respond to the new methods' do
5
+ Net.should respond_to(*%w(download download_and_save))
6
+ end
7
+
8
+ it 'should raise an exception on 404' do
9
+ lambda { Net::download('http://www.google.com/pickles.html') }.should raise_error
10
+ end
11
+
12
+ it 'should raise an exception when trying to save an empty path' do
13
+ lambda { Net::download_and_save('http://www.google.com/','') }.should raise_error
14
+ end
15
+
16
+ it 'should not write anything to the disk if not success' do
17
+ begin
18
+ Net::download_and_save('http://www.google.com/pickles.html')
19
+ rescue
20
+ end
21
+ File.exists?('pickles.html').should be_false
22
+ end
23
+ end
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Numeric do
4
+ it 'should respond to the new methods' do
5
+ [10,10.5].each do |num|
6
+ num.should respond_to(*%w(square cube sqrt root ln log))
7
+ end
8
+ end
9
+
10
+ it 'should return Numeric from most new methods' do
11
+ %w(square cube sqrt root ln log).each do |method|
12
+ [10,10.5].each do |num|
13
+ num.send(method.intern).should be_a_kind_of(Numeric)
14
+ end
15
+ end
16
+ end
17
+
18
+ it 'should do squares' do
19
+ 4.square.should == 16
20
+ -4.square.should == 16
21
+ end
22
+
23
+ it 'should do cubes' do
24
+ 3.cube.should == 27
25
+ -3.cube.should == -27
26
+ end
27
+
28
+ it 'should do square roots' do
29
+ 9.sqrt.should == 3
30
+ 81.sqrt.should == 9
31
+ end
32
+
33
+ it 'should do roots' do
34
+ 9.sqrt.should == 9.root
35
+ 27.root(3).should == 3
36
+ 81.root(4).should == 3
37
+ 5.root(1).should == 5
38
+ 10.root(-1).should == 0.1
39
+ 100.root(-2).should == 0.1
40
+ end
41
+
42
+ it 'should do ln' do
43
+ Math::E.ln.should == 1
44
+ Math::PI.ln.should be_close(1.14473, 0.001)
45
+ end
46
+
47
+ it 'should do log' do
48
+ 10.log.should == 1
49
+ 100.log.should == 2
50
+ Math::PI.log.should be_close(0.4971, 0.0001)
51
+ end
52
+ end
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Object do
4
+ it 'should respond to the new methods' do
5
+ Object.new.should respond_to(*%w(try tap))
6
+ end
7
+
8
+ it 'should return itself from tap' do
9
+ a = Object.new
10
+ a.tap { |s| }.should equal(a)
11
+ end
12
+
13
+ it 'should return nil from try if called on nil' do
14
+ nil.try(1) { |a| }.should be_nil
15
+ end
16
+
17
+ it 'should try...like really try' do
18
+ nil.try { |me| me.foo }.should be_nil
19
+ true.try { |me| me }.should be_true
20
+ true.try(:nil?).should_not be_nil
21
+ end
22
+
23
+ it 'should tap dance' do
24
+ 10.tap { |m| m.should == 10 }.should == 10
25
+ o = Object.new
26
+ o.tap { |m| m.should == o }.should == o
27
+ end
28
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,3 @@
1
+ --diff
2
+ --color
3
+ --format nested
@@ -0,0 +1,13 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+
4
+ # gem install redgreen for colored test output
5
+ begin
6
+ require 'redgreen' unless ENV['TM_CURRENT_LINE'];
7
+ rescue LoadError
8
+ end
9
+
10
+ path = File.expand_path(File.dirname(__FILE__) + '/../lib/')
11
+ $LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
12
+
13
+ require 'lib/darkext'
@@ -0,0 +1,162 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Array do
4
+ before(:each) do
5
+ @a = [1,2,3,4,5,6,7,8,9,10]
6
+ @hist = [1,2,1,1,3,2,1,1,3,3,3,3,3,2,2,1]
7
+ @b = [5,1,9,12,6,7,8,8,8,1,2,3,4]
8
+ end
9
+
10
+ it 'should respond to all the new methods' do
11
+ Array.new.should respond_to(*%w(mean average ave harmonic_mean h_mean geometric_mean g_mean median histogram mode standard_deviation stddev standard_deviation sample ci standardize standardize! sum_of_squares))
12
+ Darkext::Statistics.should respond_to(*%w(prob zscore))
13
+ Darkext::Statistics::Regression.should respond_to(*%w(least_squares))
14
+ end
15
+
16
+ it 'should return a Numeric from mean, harmonic_mean, geometric_mean, median, variance, standard_deviation, and sum_of_squares' do
17
+ %w(mean harmonic_mean geometric_mean median variance standard_deviation sum_of_squares).each do |method|
18
+ @a.send(method.intern).should be_a_kind_of(Numeric)
19
+ end
20
+ end
21
+
22
+ it 'should return a hash from histogram' do
23
+ @a.histogram.should be_a_kind_of(Hash)
24
+ end
25
+
26
+ it 'should return an array from mode, sample, ci, and standardize' do
27
+ %w(mode sample ci standardize).each do |method|
28
+ @a.send(method.intern).should be_a_kind_of(Array)
29
+ end
30
+ end
31
+
32
+ it 'should raise and erro from mean, harmonic_mean, geometric_mean, median, mode, population_variance, sample_variance, standard_deviation, ci, and sum_of_squares if size is zero' do
33
+ %w(mean harmonic_mean geometric_mean median mode population_variance sample_variance population_deviation sample_deviation geometric_deviation ci sum_of_squares).each do |method|
34
+ lambda { Array.new.send(method.intern) }.should raise_error
35
+ end
36
+ end
37
+
38
+ it 'should return a Numeric from prob and zscore' do
39
+ Darkext::Statistics::prob(1).should be_a_kind_of(Numeric)
40
+ Darkext::Statistics::zscore(0.9).should be_a_kind_of(Numeric)
41
+ end
42
+
43
+ it 'should return a Hash from least_squares' do
44
+ Darkext::Statistics::Regression::least_squares([1,2,4,5],[2,3,6,10]).should be_a_kind_of(Hash)
45
+ end
46
+
47
+ it 'should raise an error if the arguments to least_squares have different sizes' do
48
+ lambda { Darkext::Statistics::Regression::least_squares(@a,[1,2,3]) }.should raise_error
49
+ end
50
+
51
+ it 'should raise an error if either argument has size.zero?' do
52
+ lambda { Darkext::Statistics::Regression::least_squares(@a,Array.new) }.should raise_error
53
+ end
54
+
55
+ it 'should handle mean' do
56
+ (1..6).to_a.mean.should == 3.5
57
+ [1].mean.should == 1
58
+ end
59
+
60
+ it 'should handle harmonic mean' do
61
+ [60,40].harmonic_mean.should be_close(48, 0.0001)
62
+ [9].harmonic_mean.should be_close(9, 0.0001)
63
+ end
64
+
65
+ it 'should handle geometric mean' do
66
+ [2,8].geometric_mean.should == 4
67
+ [9].geometric_mean.should be_close(9, 0.0001)
68
+ end
69
+
70
+ it 'should handle median' do
71
+ (1..3).to_a.median.should == 2
72
+ [1].median.should == 1
73
+ [2,4,6,8].median.should == 5
74
+ end
75
+
76
+ it 'should make histograms' do
77
+ @hist.histogram.should == { 1 => 6, 2 => 4, 3 => 6 }
78
+ end
79
+
80
+ it 'should handle mode' do
81
+ @hist.mode.should == [1,3]
82
+ (@hist + [1]).mode.should == [1]
83
+ end
84
+
85
+ it 'should handle variance' do
86
+ (1..6).to_a.variance.should be_close(35/12, 0.0001)
87
+ [1].variance.should be_close(0, 0.0001)
88
+ [1,1].variance.should be_close(0, 0.0001)
89
+ @b.variance.should be_close(10.5, 0.05)
90
+ end
91
+
92
+ it 'should handle std dev' do
93
+ [2,4,4,4,5,5,7,9].stddev.should be_close(2, 0.0001)
94
+ @b.stddev.should be_close(3.24, 0.01)
95
+ end
96
+
97
+ it 'should sample' do
98
+ @hist.sample(5).size.should == 5
99
+ end
100
+
101
+ it 'should handle confidence intervals' do
102
+ ci = @b.ci
103
+ ci.shift.should be_close(5.15, 0.01)
104
+ ci.shift.should be_close(6.24, 0.01)
105
+ @b.ci(:type => :upper).shift.should be_close(6.15, 0.01)
106
+ @b.ci(:type => :lower).shift.should be_close(5.24, 0.01)
107
+ end
108
+
109
+ it 'should standardize' do
110
+ [2,2,4,4].standardize.should == [-1,-1,1,1].map(&:to_f)
111
+ @b.standardize.size.should == 13
112
+ end
113
+
114
+ it 'should do sum of squares' do
115
+ (1..3).to_a.sum_of_squares.should == 2.0
116
+ end
117
+
118
+ it 'should do probability' do
119
+ Darkext::Statistics::prob(2).should be_close(0.96, 0.02)
120
+ Darkext::Statistics::prob(0.5).should be_close(0.69, 0.02)
121
+ Darkext::Statistics::prob(Darkext::Statistics::zscore(1)).should be_close(1, 0.0001)
122
+ end
123
+
124
+ it 'should do zscore' do
125
+ Darkext::Statistics::zscore(0.5).should be_close(0, 0.1)
126
+ Darkext::Statistics::prob(0.75).should be_close(0.77, 0.02)
127
+ Darkext::Statistics::zscore(Darkext::Statistics::prob(2.5)).should be_close(2.5, 0.0001)
128
+ end
129
+
130
+ it 'should handle regressions' do
131
+ xs = [0,1.2,2,2.9,4,5,6]
132
+ ys = [0.1,1,2.1,3,4.3,4.9,6]
133
+
134
+ results = Darkext::Statistics::Regression::least_squares(xs,ys)
135
+
136
+ results[:n].should == xs.size
137
+ results[:b_1].should be_close(1, 0.1)
138
+ results[:b_0].should be_close(0, 0.1)
139
+ results[:predicted].size.should == xs.size
140
+
141
+ results[:predicted].each_with_index do |pred,index|
142
+ pred.should be_close(index, 0.3)
143
+ end
144
+
145
+ results[:residuals].size.should == xs.size
146
+
147
+ results[:residuals].each_with_index do |pred,index|
148
+ pred.should be_close(0, 0.3)
149
+ end
150
+
151
+ results[:ss_e].should be_close(0.15, 0.01)
152
+ results[:ss_t].should be_close(27.49, 0.01)
153
+ results[:estimator].should be_close(0.03, 0.01)
154
+ results[:r_2].should be_close(1, 0.01)
155
+ results[:r].should be_close(1, 0.01)
156
+
157
+ eqn = results[:equation]
158
+ (0..100).each do |i|
159
+ eqn.call(i).should be_close(i, 0.25)
160
+ end
161
+ end
162
+ end