utilities 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/utilities.rb +11 -360
  2. data/lib/version.rb +1 -1
  3. metadata +3 -3
data/lib/utilities.rb CHANGED
@@ -1,360 +1,11 @@
1
- module Kernel
2
- # Add .inspect to any object passed, than call Kernel.raise
3
- def raiser o
4
- raise o.inspect
5
- end
6
- end
7
-
8
- class Object
9
- def within? enumerable
10
- if enumerable.is_a? Range
11
- enumerable.cover?(self)
12
- else
13
- enumerable.min <= self && self <= enumerable.max
14
- end
15
- end
16
- end
17
-
18
- class Range
19
- # Return a range containing elements common to the two ranges, with no duplicates
20
- def intersection range
21
- values = self.to_a & range.to_a
22
- values.empty? ? nil : (values.first..values.last)
23
- end
24
- alias_method :&, :intersection
25
-
26
- # Verify if self is empty
27
- def empty?
28
- count.zero?
29
- end
30
-
31
- # Detect if the two ranges overlap one with the other
32
- def overlap? range
33
- !(self & range).nil?
34
- end
35
-
36
- # Adds cover? if not defined (like in previous rubies)
37
- unless self.instance_methods.include?(:cover?)
38
- def cover? object
39
- ends = [self.first, self.last]
40
- ends.min <= object && object <= ends.max
41
- end
42
- end
43
- end
44
-
45
- class DateTime
46
- # Transform a DateTime to a Time
47
- def to_time
48
- Time.parse(self.to_s)
49
- end
50
- end
51
-
52
- class Time
53
- # Transform a Time to a DateTime
54
- def to_datetime
55
- DateTime.parse(self.to_s)
56
- end
57
- end
58
-
59
- class String
60
- # Transform self to a Date
61
- def to_date
62
- Date.parse(self)
63
- end
64
-
65
- # Transform self to a Time
66
- def to_time
67
- Time.parse(self)
68
- end
69
- end
70
-
71
- class Numeric
72
- # Convert to degrees
73
- def degrees
74
- self * Math::PI / 180
75
- end
76
-
77
- # Return the square of self
78
- def square
79
- self * self
80
- end
81
-
82
- #Transform self to a string formatted time (HH:MM) Ex: 14.5 => “14:30“
83
- def hour_to_string delimiter = ':'
84
- hour = self.to_i
85
- min = "%02d" % (self.abs * 60 % 60).to_i
86
- "#{hour}#{delimiter}#{min}"
87
- end
88
-
89
- # Return the square root of self
90
- def sqrt
91
- Math.sqrt(self)
92
- end
93
-
94
- # Calculate the rank of self based on provided min and max
95
- def rank min, max
96
- s, min, max = self.to_f, min.to_f, max.to_f
97
- min == max ? 0.0 : (s - min) / (max - min)
98
- end
99
-
100
- # Transforms self to a string with *decimals* decimals
101
- def to_decimals decimals = 2
102
- "%.#{decimals}f" % self
103
- end
104
-
105
- # Calculate the percentage of self on n
106
- def percentage_of n, t = 100
107
- n == 0 ? 0.0 : self / n.to_f * t
108
- end
109
- alias_method :percent_of, :percentage_of
110
- end
111
-
112
- module Utilities
113
- module Submodules
114
- # Find every submodules of an object.
115
- def submodules
116
- constants.collect{ |const_name| const_get(const_name) }.select{ |const| const.class == Module }
117
- end
118
- end
119
-
120
- module Subclasses
121
- # Find every subclass of an object.
122
- def subclasses(direct = false)
123
- classes = []
124
-
125
- if direct
126
- ObjectSpace.each_object(Class) do |c|
127
- classes << c if c.superclass == self
128
- end
129
- else
130
- ObjectSpace.each_object(Class) do |c|
131
- classes << c if c.ancestors.include?(self) and (c != self)
132
- end
133
- end
134
-
135
- classes
136
- end
137
- end
138
-
139
- module Statistics
140
- # Add each object of the array to each other in order to get the sum, as long as all objects respond to + operator
141
- def sum
142
- flatten.compact.inject( :+ )
143
- end
144
-
145
- # Calculate squares of each item
146
- def squares
147
- map{ |i| i**2 }
148
- end
149
-
150
- # Return a new array containing the rank of each value
151
- # Ex: [1, 2, 2, 8, 9] #=> [0.0, 1.5, 1.5, 3.0, 4.0]
152
- def ranks( already_sorted = false )
153
- a = already_sorted ? self : sort
154
- map{ |i| (a.index(i) + a.rindex(i)) / 2.0 }
155
- end
156
-
157
- # Calculate square roots of each item
158
- def sqrts
159
- map{ |i| i.sqrt }
160
- end
161
-
162
- # Calculate the mean of the array, as long as all objects respond to / operator
163
- def mean
164
- a = flatten.compact.to_stat
165
- (a.size > 0) ? a.sum.to_f / a.size : 0.0
166
- end
167
- alias_method :average, :mean
168
-
169
- # Calculate the number of occurences for each element of the array
170
- def frequences
171
- inject(Hash.new(0)) { |h, v| h[v] += 1; h }
172
- end
173
-
174
- # Return the variance of self
175
- def variance
176
- m = mean
177
- inject(0) { |v, x| v += (x - m) ** 2 }
178
- end
179
-
180
- # Return the (sample|population) standard deviation of self
181
- # If population is set to true, then we consider the dataset as the complete population
182
- # Else, we consider the dataset as a sample, so we use the sample standard deviation (size - 1)
183
- def standard_deviation( population = false )
184
- size > 1 ? Math.sqrt( variance / ( size - ( population ? 0 : 1 ) ) ) : 0.0
185
- end
186
- alias_method :std_dev, :standard_deviation
187
-
188
- # Return the median of sorted self
189
- def median( already_sorted = false )
190
- return nil if empty?
191
- a = sort_and_extend( already_sorted )
192
- m_pos = size / 2
193
- size % 2 == 1 ? a[m_pos] : (a[m_pos-1] + a[m_pos]).to_f / 2
194
- end
195
- alias_method :second_quartile, :median
196
-
197
- # Return the first quartile of self
198
- def first_quartile( already_sorted = false )
199
- return nil if size < 4
200
- a = already_sorted ? self : sort
201
- a[0..((size / 2) - 1)].extend(Utilities::Statistics).median( true )
202
- end
203
- alias_method :lower_quartile, :first_quartile
204
-
205
- # Return the last quartile of self
206
- def last_quartile( already_sorted = false )
207
- return nil if size < 4
208
- a = already_sorted ? self : sort
209
- a[((size / 2) + 1)..-1].extend(Utilities::Statistics).median( true )
210
- end
211
- alias_method :upper_quartile, :last_quartile
212
-
213
- # Return an array containing the first, the second and the last quartile of self
214
- def quartiles( already_sorted = false )
215
- a = sort_and_extend( already_sorted )
216
- [a.first_quartile( true ), a.median( true ), a.last_quartile( true )]
217
- end
218
-
219
- # Calculate the interquartile range of self
220
- def interquartile_range( already_sorted = false )
221
- return nil if size < 4
222
- a = sort_and_extend( already_sorted )
223
- a.last_quartile - a.first_quartile
224
- end
225
-
226
- # Return an array of modes with their corresponding occurences
227
- def modes
228
- freq = frequences
229
- max = freq.values.max
230
- freq.select { |k, f| f == max }
231
- end
232
-
233
- # Return the midrange of sorted self
234
- def midrange( already_sorted = false )
235
- return nil if empty?
236
- a = sort_and_extend( already_sorted )
237
- (a.first + a.last) / 2.0
238
- end
239
-
240
- # Return the statistical range of sorted self
241
- def statistical_range( already_sorted = false )
242
- return nil if empty?
243
- a = sort_and_extend( already_sorted )
244
- (a.last - a.first)
245
- end
246
-
247
- # Return all statistics from self in a simple hash
248
- def statistics( already_sorted = false )
249
- sorted = sort_and_extend( already_sorted )
250
-
251
- {
252
- :first => self.first,
253
- :last => self.last,
254
- :size => self.size,
255
- :sum => self.sum,
256
- :min => self.min,
257
- :max => self.max,
258
- :mean => self.mean,
259
- :frequences => self.frequences,
260
- :variance => self.variance,
261
- :standard_deviation => self.standard_deviation,
262
- :modes => self.modes,
263
-
264
- # Need to be sorted...
265
- :ranks => sorted.ranks( true ),
266
- :median => sorted.median( true ),
267
- :midrange => sorted.midrange( true ),
268
- :statistical_range => sorted.statistical_range( true ),
269
- :quartiles => sorted.quartiles( true ),
270
- :interquartile_range => sorted.interquartile_range( true )
271
- }
272
- end
273
- alias_method :stats, :statistics
274
-
275
- protected
276
- def sort_and_extend( already_sorted = false )
277
- already_sorted ? self : sort.extend(Utilities::Statistics)
278
- end
279
- end
280
- end
281
-
282
- class Hash
283
- # Returns a new hash with the results of running block once for every key in self
284
- def collect_keys
285
- each_with_object({}){ |(k,v),h| h[yield(k)] = v } if block_given?
286
- end
287
- alias_method :map_keys, :collect_keys
288
-
289
- # Returns a new hash with the results of running block once for every value in self
290
- def collect_values
291
- each_with_object({}){ |(k,v),h| h[k] = yield(v) } if block_given?
292
- end
293
- alias_method :map_values, :collect_values
294
-
295
- # Returns a new hash where all keys have been symbolized
296
- def symbolize_keys
297
- collect_keys{ |k| k.to_sym }
298
- end
299
- end
300
-
301
- class Array
302
- # Returns true if the array contains only numerical values
303
- def numerics?( allow_nil = false )
304
- (allow_nil ? compact : self).reject{ |x| x.is_a?( Numeric ) }.empty?
305
- end
306
- alias_method :numeric?, :numerics?
307
- alias_method :narray?, :numerics?
308
-
309
- # Transforms an array
310
- def to_numerics
311
- map{ |x| x.to_f }
312
- end
313
- alias_method :to_numeric, :to_numerics
314
- alias_method :to_narray, :to_numerics
315
-
316
- # Returns a copy of self reverse sorted
317
- def reverse_sort
318
- dup.rsort!
319
- end
320
- alias_method :rsort, :reverse_sort
321
-
322
- # Reverse sort self
323
- def reverse_sort!
324
- sort!{|x,y| y <=> x }
325
- end
326
- alias_method :rsort!, :reverse_sort!
327
-
328
- # Returns a copy of self that includes the Statistics methods
329
- def to_stat
330
- dup.to_stat!
331
- end
332
- alias_method :to_stats, :to_stat
333
-
334
- # Adds the statistics methods to self
335
- def to_stat!
336
- extend(Utilities::Statistics)
337
- end
338
- alias_method :to_stats!, :to_stat!
339
- end
340
-
341
-
342
- module Enumerable
343
- # Collects the first N truthy values
344
- # {}.collect_first {|a, b| obj} => obj
345
- # {}.collect_first(n) {|a, b| obj} => [obj]
346
- def collect_first( amount = nil, &block )
347
- array = !amount.nil?
348
- amount ||= 1
349
-
350
- values = []
351
- self.each do |val|
352
- break if values.length >= amount
353
- t = yield(val)
354
- values << t if t
355
- end
356
-
357
- !array && amount == 1 ? values.first : values
358
- end
359
- alias_method :map_first, :collect_first
360
- end
1
+ require File.dirname(__FILE__) + "/utilities/array"
2
+ require File.dirname(__FILE__) + "/utilities/datetime"
3
+ require File.dirname(__FILE__) + "/utilities/enumerable"
4
+ require File.dirname(__FILE__) + "/utilities/hash"
5
+ require File.dirname(__FILE__) + "/utilities/kernel"
6
+ require File.dirname(__FILE__) + "/utilities/numeric"
7
+ require File.dirname(__FILE__) + "/utilities/object"
8
+ require File.dirname(__FILE__) + "/utilities/range"
9
+ require File.dirname(__FILE__) + "/utilities/string"
10
+ require File.dirname(__FILE__) + "/utilities/time"
11
+ require File.dirname(__FILE__) + "/utilities/utilities"
data/lib/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  class Utilities
2
2
  MAJOR = 0
3
3
  MINOR = 0
4
- BUILD = 13
4
+ BUILD = 14
5
5
 
6
6
  VERSION = "#{MAJOR}.#{MINOR}.#{BUILD}"
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: utilities
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2011-08-22 00:00:00.000000000Z
14
+ date: 2011-08-28 00:00:00.000000000Z
15
15
  dependencies: []
16
16
  description: Few utilities include in all my projects, including a module for statistics,
17
17
  some to_date and to_time functions as well as intersection method for Range object.
@@ -49,7 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
49
  version: '0'
50
50
  requirements: []
51
51
  rubyforge_project:
52
- rubygems_version: 1.8.6
52
+ rubygems_version: 1.8.8
53
53
  signing_key:
54
54
  specification_version: 3
55
55
  summary: Few utilities include in all my projects