versioneye/naturalsorter

View on GitHub
README.markdown

Summary

Maintainability
Test Coverage
# NaturalSorter

[![Gem Version](https://badge.fury.io/rb/naturalsorter.png)](http://badge.fury.io/rb/naturalsorter)
[![Build Status](https://travis-ci.org/versioneye/naturalsorter.png)](https://travis-ci.org/versioneye/naturalsorter)
[![Coverage Status](https://coveralls.io/repos/versioneye/naturalsorter/badge.svg?branch=master&service=github)](https://coveralls.io/github/versioneye/naturalsorter?branch=master)
[![Code Climate](https://codeclimate.com/github/versioneye/naturalsorter.png)](https://codeclimate.com/github/versioneye/naturalsorter)
[![Bountysource](https://www.bountysource.com/badge/tracker?tracker_id=157523)](https://www.bountysource.com/trackers/157523-versioneye-naturalsorter?utm_source=157523&utm_medium=shield&utm_campaign=TRACKER_BADGE)


## 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.22'`

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.