ministat 1.2.6 → 1.3.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.
File without changes
@@ -1,3 +1,10 @@
1
+ == 1.3.0 / 2011-10-16
2
+
3
+ * Fixing a typo in geometric mean
4
+ * Bug-fix in variance
5
+ * New tests
6
+ * Use Minitest explicitly
7
+
1
8
  == 1.2.4 / 2010-09-18
2
9
 
3
10
  * Version bump for packaging
@@ -4,6 +4,8 @@ README.rdoc
4
4
  Rakefile
5
5
  bin/ministat
6
6
  lib/ministat.rb
7
+ lib/ministat/data.rb
7
8
  test/data/1.dat
8
9
  test/data/2.dat
10
+ test/data/3.dat
9
11
  test/test_ministat.rb
@@ -1,156 +1,5 @@
1
- require 'mathn'
1
+ require 'ministat/data'
2
2
 
3
3
  module MiniStat
4
- VERSION = '1.2.6'
5
- class Data
6
- attr_reader :data
7
-
8
- def initialize(data)
9
- @data = data.collect {|data| data.to_f}.sort
10
- @sorted = true
11
- end
12
-
13
- def <<(obj)
14
- throw "#{obj.to_s} is not numeric" unless obj.to_f
15
- @data << obj
16
- # force computation!
17
- @q1 = @q3 = @iqr = @outliers = @std_dev = @variance =
18
- @mode = @harmonic_mean = @geometric_mean = nil
19
- end
20
-
21
- # Return the median of your dataset. Naive implementaion
22
- # -- does a sort on the data.
23
- def median(data=@data)
24
- unless @sorted and data == @data
25
- data.sort!
26
- @sort = true
27
- end
28
- if data.size % 2 == 0
29
- return (data[data.size / 2.0 - 1] + data[(data.size / 2.0)]) / 2
30
- else
31
- # split = (data.size - 1) / 2
32
- # this was just weird. i need to look this up
33
- # return (data[split - 1.5] + data[split - 0.5]) / 2
34
- return data[(data.size - 1)/2]
35
- end
36
- end
37
-
38
- def partition(pivot, data=@data)
39
- low = []
40
- high = []
41
- data.each do |i|
42
- high.push(i) if i > pivot
43
- low.push(i) if i < pivot
44
- end
45
- return {:low => low, :high => high}
46
- end
47
-
48
- # First quartile.
49
- def q1
50
- @q1 ||= median(partition(median(@data), @data)[:low])
51
- end
52
-
53
- # Third quartile
54
- def q3
55
- @q3 ||= median(partition(median(@data), @data)[:high])
56
- end
57
-
58
- # Interquartile range, ie, the middle 50% of the data.
59
- def iqr
60
- @iqr ||= q3 - q1
61
- end
62
-
63
- # Returns an array of outlying data points.
64
- def outliers
65
- @outliers ||=
66
- @data.collect do |i|
67
- i if (i < q1 - (1.5 * iqr) or i > q3 + (1.5 * iqr))
68
- end.compact
69
- end
70
-
71
- # Computes arthmetic mean (most common average).
72
- def mean(data=@data)
73
- @mean = (data.inject(0) {|i,j| i += j}) / data.size
74
- end
75
-
76
- # Computes mode and generates a histogram (for free!).
77
- # (We needed it anyway).
78
- def mode
79
- @hist ||= {}
80
- @max_freq ||= 0
81
- @mode ||= nil
82
- unless @mode
83
- @data.each do |val|
84
- @hist[val] ||= 0
85
- @hist[val] += 1
86
- @max_freq, @mode = @hist[val], val if @hist[val] > @max_freq
87
- end
88
- end
89
- @mode
90
- end
91
-
92
- # Computes variance. Used to measure degree of spread
93
- # in dataset.
94
- def variance
95
- @variance ||=
96
- @data.inject(0) { |i,j| i += (j - mean(@data)) ** 2} / (@data.size)
97
- end
98
-
99
- # Standard deviation. Square root of variance, measure of the
100
- # spread of the data about the mean.
101
- def std_dev
102
- @std_dev ||= Math.sqrt(variance)
103
- end
104
-
105
- # Geometric mean. Only applies to non-negative numbers, and
106
- # relates to log-normal distribution.
107
- def geometric_mean
108
- @geoeteric_mean ||=
109
- (@data.inject(1) {|i,j| i *= j})**(1.0/@data.size)
110
- end
111
-
112
- # Harmonic or subcontrary mean. Tends strongly toward the least
113
- # elements of the dataset.
114
- def harmonic_mean
115
- @harmonic_mean ||=
116
- @data.size.to_f / (@data.inject(0) {|i,j| i += (1.0/j)})
117
- end
118
-
119
- # Put the histogram into a string if we have it
120
- def hist
121
- if defined? @hist
122
- # this is a textbook example of how to lie with statistics...
123
- # TODO: iterate over a range rather than @hist.keys--a histogram
124
- # produced out of the keys won't properly represent flat spots
125
- # with no data. or something like that. do as i say, not as i do.
126
- #
127
- # this code borrows liberally from the ruby cookbook, recipe 5.12
128
- # ORA, 2006
129
- pairs = @hist.keys.collect { |x| [x.to_s, @hist[x]] }.sort
130
- largest_key_size = pairs.max {|x,y| x[0].size <=> y[0].size }[0].size
131
- pairs.inject("") do |s,kv|
132
- s<< "#{kv[0].ljust(largest_key_size)} |#{char*kv[1]}\n"
133
- end
134
- end
135
- end
136
-
137
- # Return a string with statisical info about a dataset.
138
- def to_s
139
- <<-DATA_STR
140
- Partition:#{partition(median).inspect}
141
- Mean:#{mean}
142
- Geometric Mean:#{geometric_mean}
143
- Harmonic Mean:#{harmonic_mean}
144
- Median:#{median}
145
- Min:#{data.min}
146
- Q1:#{q1}
147
- Q3:#{q3}
148
- Max:#{data.max}
149
- IQR:#{iqr}
150
- Outliers:#{outliers.inspect}
151
- Variance:#{variance}
152
- Std Dev:#{std_dev}
153
- DATA_STR
154
- end
155
- end
4
+ VERSION = '1.3.0'
156
5
  end
@@ -0,0 +1,192 @@
1
+ require 'mathn'
2
+
3
+ module MiniStat
4
+ class Data
5
+ include Enumerable
6
+
7
+ attr_reader :data
8
+
9
+ def initialize(d)
10
+ @data = d.map { |n| n.to_f }.sort
11
+ @sorted = true
12
+ clear_results
13
+ end
14
+
15
+ def <<(obj)
16
+ throw "#{obj.to_s} is not numeric" unless obj.to_f
17
+ @data << obj
18
+ # force computation!
19
+ clear_results
20
+ @sorted = false
21
+ obj
22
+ end
23
+
24
+ def each(&block)
25
+ @data.each(&block)
26
+ end
27
+
28
+ def clear_results
29
+ @q1, @q3, @iqr, @outliers, @std_dev, @variance = nil
30
+ @mode, @harmonic_mean, @geometric_mean = nil
31
+ end
32
+
33
+ ##
34
+ # Return the median of +data+. Naive implementaion
35
+ # -- does a sort on the data.
36
+ def median(data=@data)
37
+ unless @sorted and data == @data
38
+ data.sort!
39
+ @sorted = true
40
+ end
41
+ if data.size % 2 == 0
42
+ return (data[data.size / 2.0 - 1] + data[(data.size / 2.0)]) / 2.0
43
+ else
44
+ return data[(data.size - 1)/2.0]
45
+ end
46
+ end
47
+
48
+ ##
49
+ # Partition a set of numbers about +pivot+
50
+ def partition(pivot, data=@data)
51
+ low = []
52
+ high = []
53
+ data.each do |i|
54
+ high.push(i) if i > pivot
55
+ low.push(i) if i < pivot
56
+ end
57
+ return {:low => low, :high => high}
58
+ end
59
+
60
+ ##
61
+ # A note on quartiles: the below methods DO NOT produce results
62
+ # that agree with R's default approach. There is no "one true"
63
+ # method for producing quartiles--R's default is that of S, the
64
+ # code below uses another (which I find simpler). See:
65
+ # http://en.wikipedia.org/wiki/Quartile for details
66
+
67
+ ##
68
+ # First quartile.
69
+ def q1
70
+ @q1 ||= median(partition(median(@data), @data)[:low])
71
+ end
72
+
73
+ ##
74
+ # Third quartile
75
+ def q3
76
+ @q3 ||= median(partition(median(@data), @data)[:high])
77
+ end
78
+
79
+ ##
80
+ # Interquartile range, ie, the middle 50% of the data.
81
+ def iqr
82
+ @iqr ||= q3 - q1
83
+ end
84
+
85
+ ##
86
+ # Returns an array of outlying data points.
87
+ def outliers
88
+ @outliers ||=
89
+ @data.map do |i|
90
+ i if (i < q1 - (1.5 * iqr) or i > q3 + (1.5 * iqr))
91
+ end.compact
92
+ end
93
+
94
+ ##
95
+ # Computes arthmetic mean (most common average).
96
+ def mean(data=@data)
97
+ @mean = (data.inject(0) {|i,j| i += j}) / data.size
98
+ end
99
+
100
+ ##
101
+ # Computes mode and generates a histogram (for free!).
102
+ # (We needed it anyway).
103
+ def mode
104
+ @hist ||= {}
105
+ @max_freq ||= 0
106
+ @mode ||= nil
107
+ unless @mode
108
+ @data.each do |val|
109
+ @hist[val] ||= 0
110
+ @hist[val] += 1
111
+ @max_freq, @mode = @hist[val], val if @hist[val] > @max_freq
112
+ end
113
+ end
114
+ @mode
115
+ end
116
+
117
+ ##
118
+ # Computes variance. Used to measure degree of spread
119
+ # in dataset.
120
+ def variance
121
+ @variance ||=
122
+ @data.inject(0) { |i,j| i += (j - mean(@data)) ** 2} / (@data.size - 1)
123
+ end
124
+
125
+ ##
126
+ # Standard deviation. Square root of variance, measure of the
127
+ # spread of the data about the mean.
128
+ def std_dev
129
+ @std_dev ||= Math.sqrt(variance)
130
+ end
131
+
132
+ ##
133
+ # Geometric mean. Only applies to non-negative numbers, and
134
+ # relates to log-normal distribution.
135
+ def geometric_mean
136
+ if @data.any? { |x| x < 0 }
137
+ raise "Geometric mean only applies to non-negative data"
138
+ end
139
+
140
+ @geometric_mean ||=
141
+ 2 ** (mean @data.map { |x| Math.log2(x) })
142
+ # this overflowed for dataset with large numbers
143
+ # (@data.inject(1) {|i,j| i *= j})**(1.0/@data.size)
144
+ end
145
+
146
+ ##
147
+ # Harmonic or subcontrary mean. Tends strongly toward the least
148
+ # elements of the dataset.
149
+ def harmonic_mean
150
+ @harmonic_mean ||=
151
+ @data.size.to_f / (@data.inject(0) {|i,j| i += (1.0/j)})
152
+ end
153
+
154
+ ##
155
+ # Put the histogram into a string if we have it
156
+ def hist
157
+ if defined? @hist
158
+ # this is a textbook example of how to lie with statistics...
159
+ # TODO: iterate over a range rather than @hist.keys--a histogram
160
+ # produced out of the keys won't properly represent flat spots
161
+ # with no data. or something like that. do as i say, not as i do.
162
+ #
163
+ # this code borrows liberally from the ruby cookbook, recipe 5.12
164
+ # ORA, 2006
165
+ pairs = @hist.keys.map { |x| [x.to_s, @hist[x]] }.sort
166
+ largest_key_size = pairs.max { |x,y| x[0].size <=> y[0].size }[0].size
167
+ pairs.inject("") do |s,kv|
168
+ s<< "#{kv[0].ljust(largest_key_size)} |#{char*kv[1]}\n"
169
+ end
170
+ end
171
+ end
172
+
173
+ # Return a string with statisical info about a dataset.
174
+ def to_s
175
+ <<-DATA_STR
176
+ Partition:#{partition(median).inspect}
177
+ Mean:#{mean}
178
+ Geometric Mean:#{geometric_mean}
179
+ Harmonic Mean:#{harmonic_mean}
180
+ Median:#{median}
181
+ Min:#{data.min}
182
+ Q1:#{q1}
183
+ Q3:#{q3}
184
+ Max:#{data.max}
185
+ IQR:#{iqr}
186
+ Outliers:#{outliers.inspect}
187
+ Variance:#{variance}
188
+ Std Dev:#{std_dev}
189
+ DATA_STR
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,200 @@
1
+ 5662
2
+ 9159
3
+ 9073
4
+ 6734
5
+ 4514
6
+ 57
7
+ 7188
8
+ 2928
9
+ 778
10
+ 9860
11
+ 3746
12
+ 5998
13
+ 9556
14
+ 4296
15
+ 6781
16
+ 3507
17
+ 9411
18
+ 7284
19
+ 1977
20
+ 1805
21
+ 2306
22
+ 4759
23
+ 7086
24
+ 5881
25
+ 7449
26
+ 3757
27
+ 2457
28
+ 6703
29
+ 2717
30
+ 5562
31
+ 7073
32
+ 3073
33
+ 775
34
+ 3854
35
+ 2509
36
+ 4039
37
+ 3083
38
+ 3485
39
+ 568
40
+ 2470
41
+ 8080
42
+ 1252
43
+ 4610
44
+ 2803
45
+ 1711
46
+ 8435
47
+ 5663
48
+ 9774
49
+ 4025
50
+ 3494
51
+ 5417
52
+ 9426
53
+ 2899
54
+ 5857
55
+ 3138
56
+ 6309
57
+ 806
58
+ 50
59
+ 1343
60
+ 3830
61
+ 6158
62
+ 115
63
+ 6471
64
+ 1667
65
+ 6483
66
+ 5617
67
+ 7975
68
+ 3454
69
+ 9927
70
+ 5623
71
+ 9245
72
+ 8514
73
+ 8999
74
+ 205
75
+ 8126
76
+ 2168
77
+ 5621
78
+ 5223
79
+ 3170
80
+ 488
81
+ 7466
82
+ 4310
83
+ 9697
84
+ 8166
85
+ 4740
86
+ 54
87
+ 1562
88
+ 5630
89
+ 2752
90
+ 6499
91
+ 5281
92
+ 7040
93
+ 2177
94
+ 8600
95
+ 1098
96
+ 946
97
+ 5274
98
+ 1211
99
+ 9808
100
+ 6266
101
+ 8639
102
+ 1664
103
+ 5376
104
+ 483
105
+ 9620
106
+ 2365
107
+ 4478
108
+ 6159
109
+ 6123
110
+ 6491
111
+ 2054
112
+ 9623
113
+ 2427
114
+ 5710
115
+ 3082
116
+ 3013
117
+ 9741
118
+ 7880
119
+ 9302
120
+ 3213
121
+ 22
122
+ 644
123
+ 9384
124
+ 8401
125
+ 3459
126
+ 1396
127
+ 5095
128
+ 6079
129
+ 5348
130
+ 578
131
+ 121
132
+ 5932
133
+ 3206
134
+ 8480
135
+ 6580
136
+ 6161
137
+ 3352
138
+ 7017
139
+ 7815
140
+ 9826
141
+ 6287
142
+ 7483
143
+ 6786
144
+ 1161
145
+ 599
146
+ 8235
147
+ 9864
148
+ 5665
149
+ 1381
150
+ 2241
151
+ 8478
152
+ 4958
153
+ 674
154
+ 1771
155
+ 7453
156
+ 6345
157
+ 5504
158
+ 6538
159
+ 5014
160
+ 1300
161
+ 3686
162
+ 4839
163
+ 7173
164
+ 6402
165
+ 3276
166
+ 2592
167
+ 8376
168
+ 8602
169
+ 926
170
+ 273
171
+ 6680
172
+ 4613
173
+ 5880
174
+ 1420
175
+ 9842
176
+ 2939
177
+ 2348
178
+ 1308
179
+ 8784
180
+ 2821
181
+ 7724
182
+ 7030
183
+ 3020
184
+ 79
185
+ 3876
186
+ 8801
187
+ 2376
188
+ 3309
189
+ 656
190
+ 5018
191
+ 4847
192
+ 7152
193
+ 7216
194
+ 9180
195
+ 2097
196
+ 2149
197
+ 3597
198
+ 3923
199
+ 5742
200
+ 9623
@@ -1,20 +1,19 @@
1
1
  require 'rubygems'
2
- require 'minitest/unit'
3
- require 'ministat'
2
+ require 'minitest/autorun'
3
+ require 'ministat'
4
4
 
5
5
  class TestMiniStat < MiniTest::Unit::TestCase
6
6
  def setup
7
7
  @data1 = [34, 47, 1, 15, 57, 24, 20, 11, 19, 50, 28, 37]
8
8
  @data2 = [60, 56, 61, 68, 51, 53, 69, 54]
9
- @data3 = File.open('test/data/1.dat').map {|l| l.chomp}
10
- @data4 = File.open('test/data/2.dat').map {|l| l.chomp}
9
+ @data3 = File.open('test/data/1.dat').map { |l| l.chomp }
10
+ @data4 = File.open('test/data/2.dat').map { |l| l.chomp }
11
+ @data5 = File.open('test/data/3.dat').map { |l| l.chomp }
11
12
  @ms1 = MiniStat::Data.new(@data1)
12
13
  @ms2 = MiniStat::Data.new(@data2)
13
14
  @ms3 = MiniStat::Data.new(@data3)
14
15
  @ms4 = MiniStat::Data.new(@data4)
15
- # we test to within a tolerance to schluff off
16
- # possible floating point and rounding errors
17
- @error = 0.001
16
+ @ms5 = MiniStat::Data.new(@data5)
18
17
  end
19
18
 
20
19
  def test_enum
@@ -24,20 +23,44 @@ class TestMiniStat < MiniTest::Unit::TestCase
24
23
  assert ms.mean == 1.5
25
24
  end
26
25
 
26
+ ##
27
+ # Expected test values are computed in a 3rd party statistics
28
+ # package (usually R) when possible.
29
+ #
30
+ # All the basic tests do a dummy check of adding a value to the data
31
+ # set and ensuring the the values are re-computed.
32
+
27
33
  def test_iqr
28
- assert(@ms1.iqr - 25 < @error)
34
+ assert_in_delta 25, @ms1.iqr
35
+ assert_in_delta 11, @ms2.iqr
36
+ assert_in_delta 1.94, @ms3.iqr
37
+ assert_in_delta 9.15, @ms4.iqr
38
+ assert_in_delta 4677, @ms5.iqr
39
+
40
+ @ms1 << 32
41
+ assert_in_delta 25, @ms1.iqr
29
42
  end
30
43
 
31
44
  def test_mean
32
- assert(@ms2.mean - 59 < @error)
33
- assert(@ms3.mean - 2.179 < @error)
34
- assert(@ms4.mean - 1.878 < @error)
45
+ assert_in_delta 28.583, @ms1.mean
46
+ assert_in_delta 59, @ms2.mean
47
+ assert_in_delta 2.179, @ms3.mean
48
+ assert_in_delta 1.878, @ms4.mean
49
+ assert_in_delta 4884.695, @ms5.mean
50
+
51
+ @ms1 << 32
52
+ assert_in_delta 28.84615, @ms1.mean
35
53
  end
36
54
 
37
55
  def test_median
38
- assert(@ms1.median - 26 < @error)
39
- assert(@ms3.median - 1.735 < @error)
40
- assert(@ms3.median - 2.8 < @error)
56
+ assert_in_delta 26, @ms1.median
57
+ assert_in_delta 58, @ms2.median
58
+ assert_in_delta 1.735, @ms3.median
59
+ assert_in_delta 2.8, @ms4.median
60
+ assert_in_delta 5016, @ms5.median
61
+
62
+ @ms1 << 32
63
+ assert_in_delta 28, @ms1.median
41
64
  end
42
65
 
43
66
  def test_mode
@@ -48,34 +71,81 @@ class TestMiniStat < MiniTest::Unit::TestCase
48
71
  end
49
72
 
50
73
  def test_outliers
51
- assert_equal(@ms1.outliers, [])
74
+ assert_equal @ms1.outliers, []
75
+ assert_includes @ms3.outliers, 6.0
76
+
77
+ @ms1 << 1000
78
+ assert_includes @ms1.outliers, 1000
52
79
  end
53
80
 
54
81
  def test_q1
55
- assert(@ms1.q1 - 17 < @error)
56
- assert(@ms3.q1 - 1.05 < @error)
57
- assert(@ms4.q1 - -2.4 < @error)
82
+ assert_in_delta 17, @ms1.q1
83
+ assert_in_delta 53.5, @ms2.q1
84
+ assert_in_delta 1.05, @ms3.q1
85
+ assert_in_delta(-2.4, @ms4.q1)
86
+ assert_in_delta 2442, @ms5.q1
87
+
88
+ # add below our initial q1 to skew the result
89
+ @ms1 << 1
90
+ assert_in_delta 13, @ms1.q1
58
91
  end
59
92
 
60
93
  def test_q3
61
- assert(@ms1.q3 - 42 < @error)
62
- assert(@ms3.q3 - 2.99 < @error)
63
- assert(@ms4.q3 - 6.75 < @error)
94
+ assert_in_delta 42, @ms1.q3
95
+ assert_in_delta 64.5, @ms2.q3
96
+ assert_in_delta 2.99, @ms3.q3
97
+ assert_in_delta 6.75, @ms4.q3
98
+ assert_in_delta 7119, @ms5.q3
99
+
100
+ # add above our initial q3 to skew the result
101
+ @ms1 << 100
102
+ assert_in_delta 48.5, @ms1.q3
103
+ end
104
+
105
+ def test_variance
106
+ assert_in_delta 286.0833, @ms1.variance
107
+ assert_in_delta 45.71429, @ms2.variance
108
+ assert_in_delta 2.297878, @ms3.variance
109
+ assert_in_delta 57.06196, @ms4.variance
110
+ assert_in_delta 8376067, @ms5.variance, 1
111
+
112
+ @ms1 << 32
113
+ assert_in_delta 263.141, @ms1.variance
64
114
  end
65
115
 
66
116
  def test_std_dev
67
- assert(@ms2.std_dev - 6.324 < @error)
68
- assert(@ms3.std_dev - 1.515 < @error)
69
- assert(@ms4.std_dev - 7.553 < @error)
117
+ assert_in_delta 16.914, @ms1.std_dev
118
+ assert_in_delta 6.761, @ms2.std_dev
119
+ assert_in_delta 1.515, @ms3.std_dev
120
+ assert_in_delta 7.553, @ms4.std_dev
121
+ assert_in_delta 2894.144, @ms5.std_dev
122
+
123
+ @ms1 << 32
124
+ assert_in_delta 16.22162, @ms1.std_dev
70
125
  end
71
126
 
72
127
  def test_geo_mean
73
- # debugger
128
+ assert_in_delta 58.66896, @ms2.geometric_mean
129
+ assert_in_delta 1.695651, @ms3.geometric_mean
130
+ # @ms4 contains negative numbers, so we should complain
131
+ assert_raises RuntimeError do
132
+ @ms4.geometric_mean
133
+ end
134
+ assert_in_delta 3463.229, @ms5.geometric_mean
135
+
136
+ @ms1 << 32
137
+ assert_in_delta 21.63259, @ms1.geometric_mean
74
138
  end
75
139
 
76
140
  def test_harm_mean
77
- # debugger
141
+ assert_in_delta 8.259642, @ms1.harmonic_mean
142
+ assert_in_delta 58.34724, @ms2.harmonic_mean
143
+ assert_in_delta 1.218216, @ms3.harmonic_mean
144
+ assert_in_delta 5.921447, @ms4.harmonic_mean
145
+ assert_in_delta 976.2331, @ms5.harmonic_mean
146
+
147
+ @ms1 << 32
148
+ assert_in_delta 8.759532, @ms1.harmonic_mean
78
149
  end
79
- end
80
150
 
81
- # Number of errors detected: 11
151
+ end
metadata CHANGED
@@ -1,121 +1,91 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ministat
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 2
8
- - 6
9
- version: 1.2.6
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Dean Hudson
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2010-11-23 00:00:00 -08:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: rubyforge
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 2
30
- - 0
31
- - 4
32
- version: 2.0.4
33
- type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
12
+ date: 2011-10-16 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
36
15
  name: minitest
37
- prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
16
+ requirement: &70294540175900 !ruby/object:Gem::Requirement
39
17
  none: false
40
- requirements:
18
+ requirements:
41
19
  - - ~>
42
- - !ruby/object:Gem::Version
43
- segments:
44
- - 2
45
- - 0
46
- version: "2.0"
20
+ - !ruby/object:Gem::Version
21
+ version: '2.0'
47
22
  type: :development
48
- version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
50
- name: hoe
51
23
  prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
24
+ version_requirements: *70294540175900
25
+ - !ruby/object:Gem::Dependency
26
+ name: hoe
27
+ requirement: &70294540175380 !ruby/object:Gem::Requirement
53
28
  none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- segments:
58
- - 2
59
- - 6
60
- - 2
61
- version: 2.6.2
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '2.12'
62
33
  type: :development
63
- version_requirements: *id003
64
- description: |-
65
- This is a simple package that generates simple statistical info on
66
- numerical data sets of a single variable. It's nothing too fancy, but
34
+ prerelease: false
35
+ version_requirements: *70294540175380
36
+ description: ! 'This is a simple package that generates simple statistical info on
37
+
38
+ numerical data sets of a single variable. It''s nothing too fancy, but
39
+
67
40
  maybe just enough to coat your numbers with a thin layer of science. Or,
68
- at least to get you thinking about what it may take to do so.
69
- email:
41
+
42
+ at least to get you thinking about what it may take to do so.'
43
+ email:
70
44
  - dean@ero.com
71
- executables:
45
+ executables:
72
46
  - ministat
73
47
  extensions: []
74
-
75
- extra_rdoc_files:
48
+ extra_rdoc_files:
76
49
  - Manifest.txt
77
- files:
50
+ files:
78
51
  - History.rdoc
79
52
  - Manifest.txt
80
53
  - README.rdoc
81
54
  - Rakefile
82
55
  - bin/ministat
83
56
  - lib/ministat.rb
57
+ - lib/ministat/data.rb
84
58
  - test/data/1.dat
85
59
  - test/data/2.dat
60
+ - test/data/3.dat
86
61
  - test/test_ministat.rb
87
- has_rdoc: true
62
+ - .gemtest
88
63
  homepage: http://github.com/deanh/MiniStat
89
64
  licenses: []
90
-
91
65
  post_install_message:
92
- rdoc_options:
66
+ rdoc_options:
93
67
  - --main
94
68
  - README.rdoc
95
- require_paths:
69
+ require_paths:
96
70
  - lib
97
- required_ruby_version: !ruby/object:Gem::Requirement
71
+ required_ruby_version: !ruby/object:Gem::Requirement
98
72
  none: false
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- segments:
103
- - 0
104
- version: "0"
105
- required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
78
  none: false
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- segments:
111
- - 0
112
- version: "0"
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
113
83
  requirements: []
114
-
115
84
  rubyforge_project: ministat
116
- rubygems_version: 1.3.7
85
+ rubygems_version: 1.8.10
117
86
  signing_key:
118
87
  specification_version: 3
119
- summary: This is a simple package that generates simple statistical info on numerical data sets of a single variable
120
- test_files:
88
+ summary: This is a simple package that generates simple statistical info on numerical
89
+ data sets of a single variable
90
+ test_files:
121
91
  - test/test_ministat.rb