Module: Naturally

Defined in:
lib/naturally.rb,
lib/naturally/segment.rb,
lib/naturally/version.rb

Overview

A module which performs natural sorting on a variety of number formats. (See the specs for examples.)

Defined Under Namespace

Classes: Segment

Constant Summary collapse

VERSION =

Gem version

'2.1.0'

Class Method Summary collapse

Class Method Details

.normalize(complex_number) ⇒ Array<Segment>

Convert the given number an array of Segments. This enables it to be sorted against other arrays by the standard #sort method.

For example, ‘1.2a.3’ becomes

Segment<‘1’>, Segment<‘2a’>, Segment<‘3’>


39
40
41
42
# File 'lib/naturally.rb', line 39

def self.normalize(complex_number)
  tokens = complex_number.to_s.gsub(/\_/,'').scan(/\p{Word}+/)
  tokens.map { |t| Segment.new(t) }
end

.sort(an_array) ⇒ Array<String>

Perform a natural sort.



10
11
12
# File 'lib/naturally.rb', line 10

def self.sort(an_array)
  an_array.sort_by { |x| normalize(x) }
end

.sort_by(an_array, an_attribute = nil, &block) ⇒ Array<Object>

Sort an array of objects “naturally” by a given attribute. If block is given, attribute is ignored and each object is yielded to the block to obtain the sort key.



23
24
25
26
# File 'lib/naturally.rb', line 23

def self.sort_by(an_array, an_attribute=nil, &block)
  return sort_by_block(an_array, &block) if block_given?
  an_array.sort_by { |obj| normalize(obj.send(an_attribute)) }
end