/naturalsort

NaturalSort is a simple library which implements a natural, human-friendly alphanumeric sort in Ruby.

Primary LanguageRubyMIT LicenseMIT

NaturalSort

Build Status Code Climate

NaturalSort is a simple library which implements a natural, human-friendly alphanumeric sort in Ruby.

Examples

   %w(a1 a11 a12 a2 a21).natural_sort  #=>  %w(a1 a2 a11 a12 a21)
   %w(a b c A B C).natural_sort        #=>  %w(A a B b C c)
   %w(x__2 x_1).natural_sort           #=>  %w(x_1 x__2)
   %w(x2-y08 x2-g8 x2-y7 x8-y8).natural_sort    #=>  %w(x2-g8 x2-y7 x2-y08 x8-y8)
   %w(x02-y08 x02-g8 x2-y7 x8-y8).natural_sort  #=>  %w(x02-g8 x2-y7 x02-y08 x8-y8)

Features

  • Sort case insensitive
  • Sort underscore insensitive
  • Sort filename matching patterns
  • Sort mixed alpha and numeric "abc1", "abc12", "abc2", "a1b2" in correct order

Install

With Bundler

In your Gemfile:

gem 'naturalsort'

or to optionally extend Ruby native objects:

gem 'naturalsort', :require => 'natural_sort_kernel'

From Command Line

$ gem install naturalsort

Usage

Extend Ruby native enumerable objects

require 'natural_sort_kernel' adds natural_sort methods to all native Ruby enumerable objects (Array, Hash, etc...)

   require 'natural_sort_kernel'

   sorted = %w(a b c A B C).natural_sort

Use as a module function

   require 'natural_sort'  # unless using Bundler

   sorted = NaturalSort.sort %w(a b c d A B C D)

Use comparator function as a standalone

Adds natural_sort methods to Ruby native enumerable objects (Array, Hash, etc...)

   person_1 = Person.new('Moe')
   person_2 = Person.new('Larry')
   person_3 = Person.new('Curly')

   [person_1, person_2, person_3].sort{|a,b| NaturalSort.comparator(a.name, b.name)}  #=> [person_3, person_2, person_1]

   sorted = %w(a b c A B C).natural_sort

Include into your own objects

Can be used to add #natural_sort method to on any enumerable object or any object which implements #to_a

   class TodoList < Array
     include NaturalSort
   end

   todo_list = TodoList.new
   todo_list << 'Wash car'
   todo_list << 'Water plants'
   todo_list << 'Feed dog'

   todo_list.natural_sort  #=> ['Feed dog', 'Wash car', 'Water plants']

Authors

Contributing

Fork -> Patch -> Spec -> Push -> Pull Request

Related Links

Links related to the natural sorting problem:

License

Copyright (c) 2007 Benjamin Francisoud

Licensed under the MIT License. Refer to LICENSE for details.