davidrichards-just_enumerable_stats 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +1 -1
- data/lib/just_enumerable_stats.rb +37 -2
- data/lib/just_enumerable_stats/stats.rb +33 -2
- data/spec/just_enumerable_stats/stats_spec.rb +33 -1
- data/spec/just_enumerable_stats_spec.rb +29 -1
- metadata +4 -3
data/VERSION.yml
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# Need the FixedRange
|
2
|
+
$:.unshift File.dirname(__FILE__)
|
3
|
+
require 'fixed_range'
|
4
|
+
|
1
5
|
# Borrowed this from my own gem, sirb
|
2
6
|
|
3
7
|
class Object
|
@@ -200,6 +204,28 @@ module Enumerable
|
|
200
204
|
end
|
201
205
|
protected :iterate_midway
|
202
206
|
|
207
|
+
# Takes the range_class and returns its map.
|
208
|
+
# Example:
|
209
|
+
# require 'mathn'
|
210
|
+
# a = [1,2,3]
|
211
|
+
# a
|
212
|
+
# range_class = FixedRange, a.min, a.max, 1/4
|
213
|
+
# a.categories
|
214
|
+
# => [1, 5/4, 3/2, 7/4, 2, 9/4, 5/2, 11/4, 3]
|
215
|
+
# For non-numeric values, returns a unique set,
|
216
|
+
# ordered if possible.
|
217
|
+
def categories
|
218
|
+
if self.is_numeric?
|
219
|
+
self.range_instance.map
|
220
|
+
else
|
221
|
+
self.uniq.sort rescue self.uniq
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def is_numeric?
|
226
|
+
self.all? {|e| e.is_a?(Numeric)}
|
227
|
+
end
|
228
|
+
|
203
229
|
# Just an array of [min, max] to comply with R uses of the work. Use
|
204
230
|
# range_as_range if you want a real Range.
|
205
231
|
def range(&block)
|
@@ -207,9 +233,13 @@ module Enumerable
|
|
207
233
|
end
|
208
234
|
|
209
235
|
# Useful for setting a real range class (FixedRange).
|
210
|
-
def
|
236
|
+
def set_range_class(klass, *args)
|
211
237
|
@range_class = klass
|
238
|
+
@range_class_args = args
|
239
|
+
self.range_class
|
212
240
|
end
|
241
|
+
|
242
|
+
attr_reader :range_class_args
|
213
243
|
|
214
244
|
# When creating a range, what class will it be? Defaults to Range, but
|
215
245
|
# other classes are sometimes useful.
|
@@ -219,8 +249,13 @@ module Enumerable
|
|
219
249
|
|
220
250
|
# Actually instantiates the range, instead of producing a min and max array.
|
221
251
|
def range_as_range(&block)
|
222
|
-
|
252
|
+
if @range_class_args and not @range_class_args.empty?
|
253
|
+
self.range_class.new(*@range_class_args)
|
254
|
+
else
|
255
|
+
self.range_class.new(min(&block), max(&block))
|
256
|
+
end
|
223
257
|
end
|
258
|
+
alias :range_instance :range_as_range
|
224
259
|
|
225
260
|
# I don't pass the block to the sort, because a sort block needs to look
|
226
261
|
# something like: {|x,y| x <=> y}. To get around this, set the default
|
@@ -199,6 +199,28 @@ module JustEnumerableStats #:nodoc:
|
|
199
199
|
end
|
200
200
|
protected :iterate_midway
|
201
201
|
|
202
|
+
# Takes the range_class and returns its map.
|
203
|
+
# Example:
|
204
|
+
# require 'mathn'
|
205
|
+
# a = [1,2,3]
|
206
|
+
# a
|
207
|
+
# range_class = FixedRange, a.min, a.max, 1/4
|
208
|
+
# a.categories
|
209
|
+
# => [1, 5/4, 3/2, 7/4, 2, 9/4, 5/2, 11/4, 3]
|
210
|
+
# For non-numeric values, returns a unique set,
|
211
|
+
# ordered if possible.
|
212
|
+
def categories
|
213
|
+
if self.is_numeric?
|
214
|
+
self.range_instance.map
|
215
|
+
else
|
216
|
+
self.uniq.sort rescue self.uniq
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def is_numeric?
|
221
|
+
self.all? {|e| e.is_a?(Numeric)}
|
222
|
+
end
|
223
|
+
|
202
224
|
# Just an array of [min, max] to comply with R uses of the work. Use
|
203
225
|
# range_as_range if you want a real Range.
|
204
226
|
def range(&block)
|
@@ -206,10 +228,14 @@ module JustEnumerableStats #:nodoc:
|
|
206
228
|
end
|
207
229
|
|
208
230
|
# Useful for setting a real range class (FixedRange).
|
209
|
-
def
|
231
|
+
def set_range_class(klass, *args)
|
210
232
|
@range_class = klass
|
233
|
+
@range_class_args = args
|
234
|
+
self.range_class
|
211
235
|
end
|
212
236
|
|
237
|
+
attr_reader :range_class_args
|
238
|
+
|
213
239
|
# When creating a range, what class will it be? Defaults to Range, but
|
214
240
|
# other classes are sometimes useful.
|
215
241
|
def range_class
|
@@ -218,8 +244,13 @@ module JustEnumerableStats #:nodoc:
|
|
218
244
|
|
219
245
|
# Actually instantiates the range, instead of producing a min and max array.
|
220
246
|
def range_as_range(&block)
|
221
|
-
|
247
|
+
if @range_class_args and not @range_class_args.empty?
|
248
|
+
self.range_class.new(*@range_class_args)
|
249
|
+
else
|
250
|
+
self.range_class.new(min(&block), max(&block))
|
251
|
+
end
|
222
252
|
end
|
253
|
+
alias :range_instance :range_as_range
|
223
254
|
|
224
255
|
# I don't pass the block to the sort, because a sort block needs to look
|
225
256
|
# something like: {|x,y| x <=> y}. To get around this, set the default
|
@@ -207,10 +207,42 @@ describe JustEnumerableStats::Stats do
|
|
207
207
|
end
|
208
208
|
|
209
209
|
it "should have a getter and a setter on the range class" do
|
210
|
-
@a.
|
210
|
+
@a.set_range_class Array
|
211
211
|
@a.range_class.should eql(Array)
|
212
212
|
end
|
213
213
|
|
214
|
+
it "should be able to send extra arguments for the range class" do
|
215
|
+
@a.set_range_class FixedRange, 1, 3, 0.25
|
216
|
+
@a.range_as_range.should be_is_a(FixedRange)
|
217
|
+
@a.range_instance.should be_is_a(FixedRange)
|
218
|
+
end
|
219
|
+
|
220
|
+
it "should use the range arguments when instantiating a range" do
|
221
|
+
@a.set_range_class FixedRange, 1, 3, 0.5
|
222
|
+
@a.range_instance.should be_is_a(FixedRange)
|
223
|
+
@a.range_instance.min.should eql(1)
|
224
|
+
@a.range_instance.max.should eql(3)
|
225
|
+
@a.range_instance.step_size.should eql(0.5)
|
226
|
+
end
|
227
|
+
|
228
|
+
it "should be able to instantiate a range" do
|
229
|
+
@a.range_as_range.should eql(Range.new(1, 3))
|
230
|
+
end
|
231
|
+
|
232
|
+
it "should know its categories, based on its range" do
|
233
|
+
@a.categories.should eql([1,2,3])
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should know its categories with a different range class" do
|
237
|
+
@a.set_range_class FixedRange, 1, 3, 0.5
|
238
|
+
@a.categories.should eql([1.0, 1.5, 2.0, 2.5, 3.0])
|
239
|
+
end
|
240
|
+
|
241
|
+
it "should know its categories from non-numeric values" do
|
242
|
+
a = [:this, :and, :that]
|
243
|
+
a.categories.should eql(a)
|
244
|
+
end
|
245
|
+
|
214
246
|
it "should be able to instantiate a range" do
|
215
247
|
@a.range_as_range.should eql(Range.new(1, 3))
|
216
248
|
end
|
@@ -197,14 +197,42 @@ describe "JustEnumerableStats" do
|
|
197
197
|
end
|
198
198
|
|
199
199
|
it "should have a getter and a setter on the range class" do
|
200
|
-
@a.
|
200
|
+
@a.set_range_class Array
|
201
201
|
@a.range_class.should eql(Array)
|
202
202
|
end
|
203
203
|
|
204
|
+
it "should be able to send extra arguments for the range class" do
|
205
|
+
@a.set_range_class FixedRange, 1, 3, 0.25
|
206
|
+
@a.range_as_range.should be_is_a(FixedRange)
|
207
|
+
@a.range_instance.should be_is_a(FixedRange)
|
208
|
+
end
|
209
|
+
|
210
|
+
it "should use the range arguments when instantiating a range" do
|
211
|
+
@a.set_range_class FixedRange, 1, 3, 0.5
|
212
|
+
@a.range_instance.should be_is_a(FixedRange)
|
213
|
+
@a.range_instance.min.should eql(1)
|
214
|
+
@a.range_instance.max.should eql(3)
|
215
|
+
@a.range_instance.step_size.should eql(0.5)
|
216
|
+
end
|
217
|
+
|
204
218
|
it "should be able to instantiate a range" do
|
205
219
|
@a.range_as_range.should eql(Range.new(1, 3))
|
206
220
|
end
|
207
221
|
|
222
|
+
it "should know its categories, based on its range" do
|
223
|
+
@a.categories.should eql([1,2,3])
|
224
|
+
end
|
225
|
+
|
226
|
+
it "should know its categories with a different range class" do
|
227
|
+
@a.set_range_class FixedRange, 1, 3, 0.5
|
228
|
+
@a.categories.should eql([1.0, 1.5, 2.0, 2.5, 3.0])
|
229
|
+
end
|
230
|
+
|
231
|
+
it "should know its categories from non-numeric values" do
|
232
|
+
a = [:this, :and, :that]
|
233
|
+
a.categories.should eql(a)
|
234
|
+
end
|
235
|
+
|
208
236
|
it "should be able to instantiate a range with a block" do
|
209
237
|
@a.range_as_range(&@inverse_matcher).should eql(Range.new(3, 1))
|
210
238
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: davidrichards-just_enumerable_stats
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Richards
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-08-03 00:00:00 -07:00
|
13
13
|
default_executable: jes
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- spec/spec_helper.rb
|
37
37
|
has_rdoc: true
|
38
38
|
homepage: http://github.com/davidrichards/just_enumerable_stats
|
39
|
+
licenses:
|
39
40
|
post_install_message:
|
40
41
|
rdoc_options:
|
41
42
|
- --inline-source
|
@@ -57,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
57
58
|
requirements: []
|
58
59
|
|
59
60
|
rubyforge_project:
|
60
|
-
rubygems_version: 1.
|
61
|
+
rubygems_version: 1.3.5
|
61
62
|
signing_key:
|
62
63
|
specification_version: 2
|
63
64
|
summary: Basic statistics on Ruby enumerables
|