nuggets 0.9.9 → 1.0.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 (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