Sorting an array in a natural way
Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
lib
spec
.coveralls.yml
.gitignore
.ruby-version
.travis.yml
Gemfile
LICENSE
README.markdown
Rakefile
naturalsorter.gemspec

README.markdown

NaturalSorter

Gem Version Dependency Status Build Status Coverage Status Code Climate Bountysource

The Mission

This open source project is sorting arrays in a natural way. Assume you have an string array like this here

["init30", "init20", "init200"]

If you are sorting this in ruby with ".sort" you will get this result

["init20", "init200", "init30"]

Because the default sort method does not recognize the numbers in the string. The NaturalSorter will return this result.

["init20", "init30", "init200"]

Installation

You should add this line to your Gemfile

gem 'naturalsorter', '3.0.14'

and run this command in your app root directory

bundle install

Testing

This project has a lot of test cases and a test coverage above 90%. To run the tests you need to have installed Ruby 2.X. To install the test dependencies run this in the root directory:

bundle install

To execute the tests run this in the root directory:

rspec

Version Sorting

This fork contains some special algorithms to sort version numbers in a natural order. This project is used at https://www.versioneye.com to show versions of selected open source projects.

API

These 2 methods are sorting a simple array of Strings. The name of the methods and the parameters are self explained.

Naturalsorter::Sorter.sort(array, caseinsensitive = false, asc = true)

And this here is for more advanced sorting. Where you can put in a array of objects and the method which should called on every object for comparison.

Naturalsorter::Sorter.sort_by_method(array, method, caseinsensitive = false, asc = true)

These methods are based on a different algorithm. Especially optimized for sorting version strings.

Naturalsorter::Sorter.sort_version(array, asc = true)

This here is again for an array with objects. Especially optimized for sorting version strings.

Naturalsorter::Sorter.sort_version_by_method(array, method, asc = true )

Get the newest version from the both given.

Naturalsorter::Sorter.get_newest_version(first, second)

Is a bigger than b?

Naturalsorter::Sorter.bigger?(a, b)

Is a bigger than b or equal?

Naturalsorter::Sorter.bigger_or_equal?(a, b)

Is a smaller than b?

Naturalsorter::Sorter.smaller?(a, b)

Is a smaller than b or equal?

Naturalsorter::Sorter.smaller_or_equal?(a, b)

This is for the Ruby GEM notation '~>'. For example '~>1.1' fits '1.2' and '1.9' and '1.14'. But not 2.0. The parameter version would be for example '~>1.1' and the parameter newest_version would be the current newest version of the GEM, for example "2.0". The method will return false in this case because '~>1.1' doesn't fit anymore the newest version.

Naturalsorter::Sorter.is_version_current?(version, newest_version)

How To Use - Examples

After the installation you can use it like this:

Naturalsorter::Sorter.sort(["a400", "a5", "a1"], true)

it will return the array ["a1", "a5", "a400"]. The second parameter is for "caseinsensitive".

If you have more advanced objects you want to sort, you should use the second method. Assume you have a Class User with 3 attributes: "firstname", "lastname", "age" and you want to sort an array of class Users by "firstname".

Naturalsorter::Sorter.sort_by_method(users, "firstname", true)

Isn't that awesome?

The next methods are based on my own implementation, optimized for sorting version strings like "1.1, 1.4, 1.10"

Naturalsorter::Sorter.sort_version(["1.10", "1.1", "1.2"])

will return the array ["1.1", "1.2", "1.10"]

Alan Davies

The first 4 methods in this library are internal based on the natcmp implementation from Alan Davies. All glory to him for his awesome work.