nuggets 0.9.9 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (222) hide show
  1. checksums.yaml +4 -4
  2. data/COPYING +663 -0
  3. data/ChangeLog +7 -0
  4. data/README +74 -0
  5. data/Rakefile +50 -0
  6. data/lib/nuggets.rb +73 -0
  7. data/lib/nuggets/all.rb +35 -0
  8. data/lib/nuggets/all_mixins.rb +33 -0
  9. data/lib/nuggets/ansicolor2css.rb +124 -0
  10. data/lib/nuggets/argv/option.rb +3 -0
  11. data/lib/nuggets/argv/option_mixin.rb +84 -0
  12. data/lib/nuggets/array/boost.rb +5 -0
  13. data/lib/nuggets/array/boost_mixin.rb +77 -0
  14. data/lib/nuggets/array/combination.rb +62 -0
  15. data/lib/nuggets/array/correlation.rb +5 -0
  16. data/lib/nuggets/array/correlation_mixin.rb +63 -0
  17. data/lib/nuggets/array/flatten_once.rb +56 -0
  18. data/lib/nuggets/array/flush.rb +5 -0
  19. data/lib/nuggets/array/flush_mixin.rb +46 -0
  20. data/lib/nuggets/array/format.rb +65 -0
  21. data/lib/nuggets/array/hashify.rb +5 -0
  22. data/lib/nuggets/array/hashify_mixin.rb +47 -0
  23. data/lib/nuggets/array/histogram.rb +5 -0
  24. data/lib/nuggets/array/histogram_mixin.rb +169 -0
  25. data/lib/nuggets/array/in_order.rb +50 -0
  26. data/lib/nuggets/array/limit.rb +5 -0
  27. data/lib/nuggets/array/limit_mixin.rb +56 -0
  28. data/lib/nuggets/array/mean.rb +5 -0
  29. data/lib/nuggets/array/mean_mixin.rb +202 -0
  30. data/lib/nuggets/array/median.rb +5 -0
  31. data/lib/nuggets/array/median_mixin.rb +73 -0
  32. data/lib/nuggets/array/mode.rb +5 -0
  33. data/lib/nuggets/array/mode_mixin.rb +69 -0
  34. data/lib/nuggets/array/monotone.rb +83 -0
  35. data/lib/nuggets/array/only.rb +41 -0
  36. data/lib/nuggets/array/rand.rb +44 -0
  37. data/lib/nuggets/array/regression.rb +5 -0
  38. data/lib/nuggets/array/regression_mixin.rb +149 -0
  39. data/lib/nuggets/array/runiq.rb +5 -0
  40. data/lib/nuggets/array/runiq_mixin.rb +52 -0
  41. data/lib/nuggets/array/shuffle.rb +132 -0
  42. data/lib/nuggets/array/standard_deviation.rb +5 -0
  43. data/lib/nuggets/array/standard_deviation_mixin.rb +50 -0
  44. data/lib/nuggets/array/to_hash.rb +64 -0
  45. data/lib/nuggets/array/variance.rb +5 -0
  46. data/lib/nuggets/array/variance_mixin.rb +81 -0
  47. data/lib/nuggets/content_type.rb +97 -0
  48. data/lib/nuggets/dotted_decimal.rb +59 -0
  49. data/lib/nuggets/enumerable/agrep.rb +79 -0
  50. data/lib/nuggets/enumerable/all_any_extended.rb +66 -0
  51. data/lib/nuggets/enumerable/minmax.rb +102 -0
  52. data/lib/nuggets/env/set.rb +3 -0
  53. data/lib/nuggets/env/set_mixin.rb +67 -0
  54. data/lib/nuggets/env/user_encoding.rb +3 -0
  55. data/lib/nuggets/env/user_encoding_mixin.rb +54 -0
  56. data/lib/nuggets/env/user_home.rb +3 -0
  57. data/lib/nuggets/env/user_home_mixin.rb +56 -0
  58. data/lib/nuggets/file/ext.rb +5 -0
  59. data/lib/nuggets/file/ext_mixin.rb +87 -0
  60. data/lib/nuggets/file/replace.rb +5 -0
  61. data/lib/nuggets/file/replace_mixin.rb +55 -0
  62. data/lib/nuggets/file/sub.rb +5 -0
  63. data/lib/nuggets/file/sub_mixin.rb +95 -0
  64. data/lib/nuggets/file/which.rb +5 -0
  65. data/lib/nuggets/file/which_mixin.rb +72 -0
  66. data/lib/nuggets/hash/at.rb +68 -0
  67. data/lib/nuggets/hash/deep_fetch.rb +5 -0
  68. data/lib/nuggets/hash/deep_fetch_mixin.rb +74 -0
  69. data/lib/nuggets/hash/deep_merge.rb +5 -0
  70. data/lib/nuggets/hash/deep_merge_mixin.rb +53 -0
  71. data/lib/nuggets/hash/idmap.rb +5 -0
  72. data/lib/nuggets/hash/idmap_mixin.rb +41 -0
  73. data/lib/nuggets/hash/in_order.rb +43 -0
  74. data/lib/nuggets/hash/insert.rb +53 -0
  75. data/lib/nuggets/hash/nest.rb +5 -0
  76. data/lib/nuggets/hash/nest_mixin.rb +78 -0
  77. data/lib/nuggets/hash/only.rb +52 -0
  78. data/lib/nuggets/hash/seen.rb +5 -0
  79. data/lib/nuggets/hash/seen_mixin.rb +58 -0
  80. data/lib/nuggets/hash/unroll.rb +5 -0
  81. data/lib/nuggets/hash/unroll_mixin.rb +88 -0
  82. data/lib/nuggets/hash/zip.rb +5 -0
  83. data/lib/nuggets/hash/zip_mixin.rb +159 -0
  84. data/lib/nuggets/i18n.rb +155 -0
  85. data/lib/nuggets/integer/factorial.rb +56 -0
  86. data/lib/nuggets/integer/length.rb +5 -0
  87. data/lib/nuggets/integer/length_mixin.rb +49 -0
  88. data/lib/nuggets/integer/map.rb +5 -0
  89. data/lib/nuggets/integer/map_mixin.rb +42 -0
  90. data/lib/nuggets/integer/to_binary_s.rb +38 -0
  91. data/lib/nuggets/io/agrep.rb +43 -0
  92. data/lib/nuggets/io/interact.rb +5 -0
  93. data/lib/nuggets/io/interact_mixin.rb +159 -0
  94. data/lib/nuggets/io/modes.rb +121 -0
  95. data/lib/nuggets/io/null.rb +5 -0
  96. data/lib/nuggets/io/null_mixin.rb +40 -0
  97. data/lib/nuggets/io/redirect.rb +5 -0
  98. data/lib/nuggets/io/redirect_mixin.rb +50 -0
  99. data/lib/nuggets/lazy_attr.rb +44 -0
  100. data/lib/nuggets/log_parser.rb +70 -0
  101. data/lib/nuggets/log_parser/apache.rb +101 -0
  102. data/lib/nuggets/log_parser/rails.rb +219 -0
  103. data/lib/nuggets/net/success.rb +59 -0
  104. data/lib/nuggets/numeric/between.rb +2 -0
  105. data/lib/nuggets/numeric/duration.rb +100 -0
  106. data/lib/nuggets/numeric/limit.rb +62 -0
  107. data/lib/nuggets/numeric/signum.rb +52 -0
  108. data/lib/nuggets/numeric/to_multiple.rb +61 -0
  109. data/lib/nuggets/object/blank.rb +20 -0
  110. data/lib/nuggets/object/blank_mixin.rb +99 -0
  111. data/lib/nuggets/object/boolean.rb +5 -0
  112. data/lib/nuggets/object/boolean_mixin.rb +61 -0
  113. data/lib/nuggets/object/eigenclass.rb +2 -0
  114. data/lib/nuggets/object/ghost_class.rb +2 -0
  115. data/lib/nuggets/object/metaclass.rb +2 -0
  116. data/lib/nuggets/object/msend.rb +5 -0
  117. data/lib/nuggets/object/msend_mixin.rb +43 -0
  118. data/lib/nuggets/object/silence.rb +5 -0
  119. data/lib/nuggets/object/silence_mixin.rb +44 -0
  120. data/lib/nuggets/object/singleton_class.rb +5 -0
  121. data/lib/nuggets/object/singleton_class_mixin.rb +95 -0
  122. data/lib/nuggets/object/uniclass.rb +2 -0
  123. data/lib/nuggets/object/virtual_class.rb +2 -0
  124. data/lib/nuggets/pluggable.rb +91 -0
  125. data/lib/nuggets/proc/bind.rb +5 -0
  126. data/lib/nuggets/proc/bind_mixin.rb +51 -0
  127. data/lib/nuggets/range/quantile.rb +5 -0
  128. data/lib/nuggets/range/quantile_mixin.rb +42 -0
  129. data/lib/nuggets/ruby.rb +235 -0
  130. data/lib/nuggets/statistics.rb +12 -0
  131. data/lib/nuggets/statistics_mixins.rb +12 -0
  132. data/lib/nuggets/string/camelscore.rb +5 -0
  133. data/lib/nuggets/string/camelscore_mixin.rb +116 -0
  134. data/lib/nuggets/string/capitalize_first.rb +46 -0
  135. data/lib/nuggets/string/case.rb +81 -0
  136. data/lib/nuggets/string/evaluate.rb +5 -0
  137. data/lib/nuggets/string/evaluate_mixin.rb +47 -0
  138. data/lib/nuggets/string/msub.rb +84 -0
  139. data/lib/nuggets/string/nsub.rb +65 -0
  140. data/lib/nuggets/string/sub_with_md.rb +111 -0
  141. data/lib/nuggets/string/wc.rb +5 -0
  142. data/lib/nuggets/string/wc_mixin.rb +95 -0
  143. data/lib/nuggets/string/word_wrap.rb +76 -0
  144. data/lib/nuggets/string/xor.rb +5 -0
  145. data/lib/nuggets/string/xor_mixin.rb +59 -0
  146. data/lib/nuggets/tempfile/open.rb +57 -0
  147. data/lib/nuggets/uri/content_type.rb +5 -0
  148. data/lib/nuggets/uri/content_type_mixin.rb +47 -0
  149. data/lib/nuggets/uri/exist.rb +5 -0
  150. data/lib/nuggets/uri/exist_mixin.rb +56 -0
  151. data/lib/nuggets/uri/redirect.rb +5 -0
  152. data/lib/nuggets/uri/redirect_mixin.rb +101 -0
  153. data/lib/nuggets/version.rb +27 -0
  154. data/spec/nuggets/array/boost_spec.rb +50 -0
  155. data/spec/nuggets/array/combination_spec.rb +25 -0
  156. data/spec/nuggets/array/correlation_spec.rb +81 -0
  157. data/spec/nuggets/array/flatten_once_spec.rb +16 -0
  158. data/spec/nuggets/array/flush_spec.rb +43 -0
  159. data/spec/nuggets/array/format_spec.rb +52 -0
  160. data/spec/nuggets/array/hashify_spec.rb +41 -0
  161. data/spec/nuggets/array/histogram_spec.rb +87 -0
  162. data/spec/nuggets/array/in_order_spec.rb +13 -0
  163. data/spec/nuggets/array/limit_spec.rb +62 -0
  164. data/spec/nuggets/array/mean_spec.rb +203 -0
  165. data/spec/nuggets/array/median_spec.rb +77 -0
  166. data/spec/nuggets/array/mode_spec.rb +57 -0
  167. data/spec/nuggets/array/monotone_spec.rb +30 -0
  168. data/spec/nuggets/array/only_spec.rb +26 -0
  169. data/spec/nuggets/array/regression_spec.rb +54 -0
  170. data/spec/nuggets/array/runiq_spec.rb +25 -0
  171. data/spec/nuggets/array/standard_deviation_spec.rb +33 -0
  172. data/spec/nuggets/array/to_hash_spec.rb +28 -0
  173. data/spec/nuggets/array/variance_spec.rb +106 -0
  174. data/spec/nuggets/dotted_decimal_spec.rb +27 -0
  175. data/spec/nuggets/enumerable/all_any_extended_spec.rb +31 -0
  176. data/spec/nuggets/enumerable/minmax_spec.rb +21 -0
  177. data/spec/nuggets/env/set_spec.rb +29 -0
  178. data/spec/nuggets/env/user_encoding_spec.rb +38 -0
  179. data/spec/nuggets/env/user_home_spec.rb +42 -0
  180. data/spec/nuggets/file/ext_spec.rb +38 -0
  181. data/spec/nuggets/file/replace_spec.rb +95 -0
  182. data/spec/nuggets/file/sub_spec.rb +149 -0
  183. data/spec/nuggets/file/which_spec.rb +22 -0
  184. data/spec/nuggets/hash/at_spec.rb +19 -0
  185. data/spec/nuggets/hash/deep_fetch_spec.rb +159 -0
  186. data/spec/nuggets/hash/deep_merge_spec.rb +78 -0
  187. data/spec/nuggets/hash/in_order_spec.rb +12 -0
  188. data/spec/nuggets/hash/insert_spec.rb +13 -0
  189. data/spec/nuggets/hash/nest_spec.rb +102 -0
  190. data/spec/nuggets/hash/only_spec.rb +29 -0
  191. data/spec/nuggets/hash/seen_spec.rb +36 -0
  192. data/spec/nuggets/hash/unroll_spec.rb +68 -0
  193. data/spec/nuggets/i18n_spec.rb +13 -0
  194. data/spec/nuggets/integer/factorial_spec.rb +10 -0
  195. data/spec/nuggets/integer/length_spec.rb +18 -0
  196. data/spec/nuggets/integer/map_spec.rb +19 -0
  197. data/spec/nuggets/integer/to_binary_s_spec.rb +19 -0
  198. data/spec/nuggets/numeric/duration_spec.rb +25 -0
  199. data/spec/nuggets/numeric/limit_spec.rb +16 -0
  200. data/spec/nuggets/numeric/signum_spec.rb +16 -0
  201. data/spec/nuggets/numeric/to_multiple_spec.rb +16 -0
  202. data/spec/nuggets/object/blank_spec.rb +34 -0
  203. data/spec/nuggets/object/boolean_spec.rb +23 -0
  204. data/spec/nuggets/object/msend_spec.rb +25 -0
  205. data/spec/nuggets/object/silence_spec.rb +36 -0
  206. data/spec/nuggets/object/singleton_class_spec.rb +51 -0
  207. data/spec/nuggets/proc/bind_spec.rb +28 -0
  208. data/spec/nuggets/range/quantile_spec.rb +33 -0
  209. data/spec/nuggets/string/camelscore_spec.rb +114 -0
  210. data/spec/nuggets/string/capitalize_first_spec.rb +13 -0
  211. data/spec/nuggets/string/case_spec.rb +31 -0
  212. data/spec/nuggets/string/evaluate_spec.rb +24 -0
  213. data/spec/nuggets/string/msub_spec.rb +20 -0
  214. data/spec/nuggets/string/nsub_spec.rb +13 -0
  215. data/spec/nuggets/string/sub_with_md_spec.rb +25 -0
  216. data/spec/nuggets/string/wc_spec.rb +73 -0
  217. data/spec/nuggets/string/word_wrap_spec.rb +81 -0
  218. data/spec/nuggets/string/xor_spec.rb +57 -0
  219. data/spec/nuggets/uri/content_type_spec.rb +42 -0
  220. data/spec/nuggets/uri/exist_spec.rb +49 -0
  221. data/spec/spec_helper.rb +36 -0
  222. metadata +309 -17
@@ -0,0 +1,203 @@
1
+ require 'nuggets/array/mean'
2
+ require 'nuggets/array/standard_deviation'
3
+
4
+ describe_extended Array, Nuggets::Array::MeanMixin do
5
+
6
+ describe 'equalities' do
7
+
8
+ %w[arithmetic geometric harmonic].each { |type|
9
+ method = "#{type}_mean"
10
+
11
+ example do
12
+ val = rand
13
+ ary = [val] * 10
14
+
15
+ ary.send(method).should equal_float(val)
16
+ end
17
+
18
+ example do
19
+ ary, const = Array.new(10) { rand }, rand
20
+
21
+ res1 = ary.map { |i| const * i }.send(method)
22
+ res2 = ary.send(method)
23
+
24
+ res1.should equal_float(const * res2)
25
+ end
26
+ }
27
+
28
+ end
29
+
30
+ describe 'inequalities' do
31
+
32
+ before :each do
33
+ @ary = Array.new(10) { rand }
34
+ end
35
+
36
+ 3.times {
37
+
38
+ { 0 => 1, 1 => 2, 3 => 23, 0.1 => 0.2, -1 => 0, -3 => -2 }.each { |exponent1, exponent2|
39
+ example do
40
+ @ary.generalized_mean(exponent1).should <= @ary.generalized_mean(exponent2)
41
+ end
42
+ }
43
+
44
+ example do
45
+ res = %w[quadratic arithmetic geometric harmonic].map { |type| @ary.send("#{type}_mean") }
46
+ res[0].should >= res[1]; res[1].should >= res[2]; res[2].should >= res[3]
47
+ end
48
+
49
+ }
50
+
51
+ end
52
+
53
+ describe 'arithmetic mean' do
54
+
55
+ example do
56
+ [].arithmetic_mean.should be_nil
57
+ end
58
+
59
+ example do
60
+ [1].arithmetic_mean.should == 1.0
61
+ end
62
+
63
+ example do
64
+ [1, 1, 1].arithmetic_mean.should == 1.0
65
+ end
66
+
67
+ example do
68
+ [1, 2, 3].arithmetic_mean.should == 2.0
69
+ end
70
+
71
+ example do
72
+ [3, 2, 1].arithmetic_mean.should == 2.0
73
+ end
74
+
75
+ example do
76
+ [-3, -2, -1].arithmetic_mean.should == -[3, 2, 1].arithmetic_mean
77
+ end
78
+
79
+ example do
80
+ [1e16, 1, 3, -1e16].arithmetic_mean.should == 1.0
81
+ end
82
+
83
+ xexample do
84
+ [1e30, 1, 3, -1e30].arithmetic_mean.should == 1.0
85
+ end
86
+
87
+ context do
88
+
89
+ before :each do
90
+ @ary = [1, -2, 1, 2, 3, -4, 0, 3, 1, 2, 1, 0, 24]
91
+ @res = @ary.arithmetic_mean
92
+ end
93
+
94
+ example do
95
+ @res.should equal_float(2.46153846153846)
96
+ end
97
+
98
+ %w[mean average avg].each { |method|
99
+ example { @ary.send(method).should == @res }
100
+ }
101
+
102
+ end
103
+
104
+ describe '(weighted)' do
105
+
106
+ example do
107
+ [1, 2, 3].arithmetic_mean { |i| 0 }.should be_nil
108
+ end
109
+
110
+ example do
111
+ [1, 2, 3].arithmetic_mean { |i| 1 / i.to_f }.should equal_float(1.63636363636364)
112
+ end
113
+
114
+ example do
115
+ w = rand
116
+ [1, 2, 3].arithmetic_mean { |i| w }.should == 2.0
117
+ end
118
+
119
+ example do
120
+ [1, 2, 3].arithmetic_mean { |i| i ** 2 }.should equal_float(2.57142857142857)
121
+ end
122
+
123
+ end
124
+
125
+ end
126
+
127
+ # TODO: other methods
128
+ # TODO: more examples: http://people.revoledu.com/kardi/tutorial/BasicMath/Average/mean.html
129
+
130
+ describe 'report mean' do
131
+
132
+ before :each do
133
+ @ary = [[9.4, 34.75], [9.46, 34.68], [9.51, 34.61]]
134
+
135
+ @ary1 = @ary.map(&:first)
136
+ @ary2 = @ary.map(&:last)
137
+ end
138
+
139
+ describe 'w/o stddev' do
140
+
141
+ before :each do
142
+ [@ary, @ary1, @ary2].each { |ary|
143
+ class << ary; undef_method :std; end if ary.respond_to?(:std)
144
+ }
145
+ end
146
+
147
+ example do
148
+ @ary.report_mean.should == ['9.4567', '34.6800']
149
+ end
150
+
151
+ example do
152
+ @ary.report_mean(:harmonic).should == ['9.4565', '34.6799']
153
+ end
154
+
155
+ example do
156
+ @ary.unshift(%w[a b]).report_mean(nil, 2).should == ['a 9.46', 'b 34.68']
157
+ end
158
+
159
+ example do
160
+ @ary1.report_mean.should == ['9.4567']
161
+ end
162
+
163
+ example do
164
+ @ary2.report_mean.should == ['34.6800']
165
+ end
166
+
167
+ example do
168
+ [].report_mean.should be_nil
169
+ end
170
+
171
+ end
172
+
173
+ describe 'w/ stddev' do
174
+
175
+ example do
176
+ @ary.report_mean.should == ['9.4567 +/- 0.0450', '34.6800 +/- 0.0572']
177
+ end
178
+
179
+ example do
180
+ @ary.report_mean(:harmonic).should == ['9.4565 +/- 0.0450', '34.6799 +/- 0.0572']
181
+ end
182
+
183
+ example do
184
+ @ary.unshift(%w[a b]).report_mean(nil, 2).should == ['a 9.46 +/- 0.04', 'b 34.68 +/- 0.06']
185
+ end
186
+
187
+ example do
188
+ @ary1.report_mean.should == ['9.4567 +/- 0.0450']
189
+ end
190
+
191
+ example do
192
+ @ary2.report_mean.should == ['34.6800 +/- 0.0572']
193
+ end
194
+
195
+ example do
196
+ [].report_mean.should be_nil
197
+ end
198
+
199
+ end
200
+
201
+ end
202
+
203
+ end
@@ -0,0 +1,77 @@
1
+ require 'nuggets/array/median'
2
+
3
+ describe_extended Array, Nuggets::Array::MedianMixin do
4
+
5
+ example do
6
+ [].median.should be_nil
7
+ end
8
+
9
+ example do
10
+ [1].median.should == 1
11
+ end
12
+
13
+ example do
14
+ [1, 1, 1].median.should == 1
15
+ end
16
+
17
+ example do
18
+ [1, 2, 3].median.should == 2
19
+ end
20
+
21
+ example do
22
+ [3, 2, 1].median.should == 2
23
+ end
24
+
25
+ example do
26
+ [-3, -2, -1].median.should == -[3, 2, 1].median
27
+ end
28
+
29
+ example do
30
+ [1, -2, 1, 2, 3, -4, 0, 3, 1, 2, 1, 0, 24].median.should == 1
31
+ end
32
+
33
+ example do
34
+ [1, 2, 3, 4].median.should == 2.5
35
+ end
36
+
37
+ example do
38
+ %w[one two three].median.should == 'three'
39
+ end
40
+
41
+ example do
42
+ %w[three two one].median.should == 'three'
43
+ end
44
+
45
+ [true, 1, :left].each { |prefer|
46
+ example { [1, 2, 3].median(prefer).should == 2 }
47
+ example { [1, 2, 3, 4].median(prefer).should == 2 }
48
+
49
+ example { %w[one two three].median(prefer).should == 'three' }
50
+ example { %w[one two three four].median(prefer).should == 'one' }
51
+ }
52
+
53
+ [false, 2, :right].each { |prefer|
54
+ example { [1, 2, 3].median(prefer).should == 2 }
55
+ example { [1, 2, 3, 4].median(prefer).should == 3 }
56
+
57
+ example { %w[one two three].median(prefer).should == 'three' }
58
+ example { %w[one two three four].median(prefer).should == 'three' }
59
+ }
60
+
61
+ example do
62
+ [1, 2, 3, 4].median { |a, b| a * b }.should == 6
63
+ end
64
+
65
+ example do
66
+ %w[one two three four].median { |a, b| b * a.length }.should == 'threethreethree'
67
+ end
68
+
69
+ example do
70
+ lambda { %w[one two three four].median }.should raise_error(NoMethodError, %r{undefined method `/' .*String})
71
+ end
72
+
73
+ example do
74
+ lambda { [1, 2, 'three'].median }.should raise_error(ArgumentError, /comparison .* failed/)
75
+ end
76
+
77
+ end
@@ -0,0 +1,57 @@
1
+ require 'nuggets/array/mode'
2
+
3
+ describe_extended Array, Nuggets::Array::ModeMixin do
4
+
5
+ example do
6
+ [].mode.should be_nil
7
+ end
8
+
9
+ example do
10
+ [1].mode.should == 1
11
+ end
12
+
13
+ example do
14
+ [1, 1, 1].mode.should == 1
15
+ end
16
+
17
+ example do
18
+ [1, 2, 2, 3].mode.should == 2
19
+ end
20
+
21
+ example do
22
+ [3, 2, 2, 1].mode.should == 2
23
+ end
24
+
25
+ example do
26
+ [-3, -2, -2, -1].mode.should == -[3, 2, 2, 1].mode
27
+ end
28
+
29
+ example do
30
+ [1, -2, 1, 2, 3, -4, 0, 3, 1, 2, 1, 0, 24].mode.should == 1
31
+ end
32
+
33
+ example do
34
+ [1, 2, 2, 3, 3, 4].modes.should == [2, 3]
35
+ end
36
+
37
+ example do
38
+ [2, 3].should include([1, 2, 2, 3, 3, 4].mode)
39
+ end
40
+
41
+ example do
42
+ %w[one two three three].mode.should == 'three'
43
+ end
44
+
45
+ example do
46
+ %w[three two one three].mode.should == 'three'
47
+ end
48
+
49
+ example do
50
+ [1, 2, 2, 3, 4].mode { |x| x * 2 }.should == 4
51
+ end
52
+
53
+ example do
54
+ [1, 2, 3, 4].modes { |x| x / 2 }.should == [1]
55
+ end
56
+
57
+ end
@@ -0,0 +1,30 @@
1
+ require 'nuggets/array/monotone'
2
+
3
+ describe Array, 'monotone' do
4
+
5
+ example {
6
+ a = [1, 2, 3, 4]
7
+
8
+ a.should be_monotonic
9
+ a.should be_ascending
10
+ a.should be_strictly_ascending
11
+ a.should_not be_descending
12
+ }
13
+
14
+ example {
15
+ b = [1, 2, 4, 3]
16
+
17
+ b.should_not be_monotonic
18
+ b.should_not be_ascending
19
+ b.should_not be_descending
20
+ }
21
+
22
+ example {
23
+ c = [1, 2, 4, 4]
24
+
25
+ c.should be_monotonic
26
+ c.should be_ascending
27
+ c.should_not be_strictly_ascending
28
+ }
29
+
30
+ end
@@ -0,0 +1,26 @@
1
+ require 'nuggets/array/only'
2
+
3
+ describe Array, 'only' do
4
+
5
+ example {
6
+ a = [5]
7
+
8
+ a.only.should == 5
9
+ a.only(true).should == 5
10
+ }
11
+
12
+ example {
13
+ a = [1, 2, 3]
14
+
15
+ lambda { a.only }.should raise_error(IndexError, 'not a single-element array')
16
+ a.only(true).should == 1
17
+ }
18
+
19
+ example {
20
+ a = []
21
+
22
+ lambda { a.only }.should raise_error(IndexError, 'not a single-element array')
23
+ a.only(true).should be_nil
24
+ }
25
+
26
+ end
@@ -0,0 +1,54 @@
1
+ require 'nuggets/array/regression'
2
+
3
+ describe_extended Array, Nuggets::Array::RegressionMixin do
4
+
5
+ example {
6
+ [].linear_least_squares.should == []
7
+ }
8
+
9
+ example {
10
+ [0].linear_least_squares.should == [[1, 0]]
11
+ }
12
+
13
+ example {
14
+ [1].linear_least_squares.should == [[1, 1]]
15
+ }
16
+
17
+ example {
18
+ [1, 1].linear_least_squares.should == [[1, 1], [2, 1]]
19
+ }
20
+
21
+ example {
22
+ [1, 2, 3, 4].linear_least_squares.should == [[1, 1], [2, 2], [3, 3], [4, 4]]
23
+ }
24
+
25
+ example {
26
+ [1, 2, 4, 1].linear_least_squares.should == [[1, 1.7], [2, 1.9], [3, 2.1], [4, 2.3]]
27
+ }
28
+
29
+ example {
30
+ r = [2.3, 1.6, 0.9, 0.2]
31
+
32
+ [1, 2, 4, -2].linear_least_squares.each_with_index { |(x, y), i|
33
+ x.should == i + 1
34
+ y.should equal_float(r[i])
35
+ }
36
+ }
37
+
38
+ [
39
+ [],
40
+ [0],
41
+ [1, 1],
42
+ [1, 2, 4, -2],
43
+ [2.3, 1.6, 0.9, 0.2],
44
+ [1, 2, -1, 3, -2, 4, -3]
45
+ ].each { |a|
46
+ example {
47
+ a.llsq.zip(a.llsqi.to_a).each { |(x1, y1), (x2, y2)|
48
+ x1.should == x2
49
+ y1.should equal_float(y2)
50
+ }
51
+ }
52
+ }
53
+
54
+ end