naturally 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.travis.yml +2 -3
- data/README.md +5 -4
- data/lib/naturally.rb +13 -5
- data/lib/naturally/segment.rb +3 -2
- data/lib/naturally/version.rb +1 -1
- data/naturally.gemspec +1 -1
- data/spec/naturally_spec.rb +39 -13
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f7b3bdea2bec4624b2f0725d0e52e05d93cf0638fe8ddc42e8dd8c7b20696920
|
4
|
+
data.tar.gz: ddc8c8f12e62e604deb0d8345df5f29464051ca859834747d2a6db1d8f51c263
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 602b9798ae11958dd850f1f992a7217cf4b981ccdb7446899b410154c5e9d009318cbf8106232e4dc83c3ba7d06b37df148f3c96770f0165d259d92032e9872f
|
7
|
+
data.tar.gz: ee6d95f697088d3a6196f64b863dbac96cb2cfc5bf83357af029ed6aa00d0c49cd24345356d12c616ef2780d30785d2bd40a60c42c4321e07047f990094c9b60
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# Naturally
|
2
|
-
[](http://badge.fury.io/rb/naturally) [](http://badge.fury.io/rb/naturally) [](https://travis-ci.org/public-law/naturally)
|
3
|
+
[](https://codeclimate.com/github/dogweather/naturally/maintainability)
|
3
4
|
|
4
5
|
Natural (version number) sorting with support for **legal document numbering**, **college course codes**, and **Unicode**.
|
5
|
-
See Jeff Atwood's [Sorting for Humans: Natural Sort Order](http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html) and the
|
6
|
+
See Jeff Atwood's [Sorting for Humans: Natural Sort Order](http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html) and the Public.Law post [Counting to 10 in Californian](https://blog.public.law/2012/08/07/counting-from-1-to-10-in-californian/).
|
6
7
|
|
7
|
-
##Installation
|
8
|
+
## Installation
|
8
9
|
|
9
10
|
```Shell
|
10
11
|
$ gem install naturally
|
@@ -37,7 +38,7 @@ releases = [
|
|
37
38
|
]
|
38
39
|
|
39
40
|
# Sort by version number
|
40
|
-
sorted = Naturally.
|
41
|
+
sorted = Naturally.sort releases, by: :version
|
41
42
|
|
42
43
|
# Check what we have
|
43
44
|
expect(sorted.map(&:name)).to eq [
|
data/lib/naturally.rb
CHANGED
@@ -3,12 +3,20 @@ require 'naturally/segment'
|
|
3
3
|
# A module which performs natural sorting on a variety of number
|
4
4
|
# formats. (See the specs for examples.)
|
5
5
|
module Naturally
|
6
|
-
# Perform a natural sort.
|
6
|
+
# Perform a natural sort. Supports two syntaxes:
|
7
|
+
#
|
8
|
+
# 1. sort(objects) # Simple arrays
|
9
|
+
# 2. sort(objects, by: some_attribute) # Complex objects
|
7
10
|
#
|
8
11
|
# @param [Array<String>] an_array the list of numbers to sort.
|
12
|
+
# @param [by] (optional) an attribute of the array by which to sort.
|
9
13
|
# @return [Array<String>] the numbers sorted naturally.
|
10
|
-
def self.sort(an_array)
|
11
|
-
|
14
|
+
def self.sort(an_array, by:nil)
|
15
|
+
if by.nil?
|
16
|
+
an_array.sort_by { |x| normalize(x) }
|
17
|
+
else
|
18
|
+
self.sort_by(an_array, by)
|
19
|
+
end
|
12
20
|
end
|
13
21
|
|
14
22
|
# Sort an array of objects "naturally" by a given attribute.
|
@@ -25,9 +33,9 @@ module Naturally
|
|
25
33
|
an_array.sort_by { |obj| normalize(obj.send(an_attribute)) }
|
26
34
|
end
|
27
35
|
|
28
|
-
# Convert the given number an array of {Segment}s.
|
36
|
+
# Convert the given number to an array of {Segment}s.
|
29
37
|
# This enables it to be sorted against other arrays
|
30
|
-
# by the
|
38
|
+
# by the built-in #sort method.
|
31
39
|
#
|
32
40
|
# For example, '1.2a.3' becomes
|
33
41
|
# [Segment<'1'>, Segment<'2a'>, Segment<'3'>]
|
data/lib/naturally/segment.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Naturally
|
2
2
|
# An entity which can be compared to other like elements for
|
3
3
|
# sorting. It's an object representing
|
4
|
-
# a value which implements the {Comparable} interface
|
4
|
+
# a value which implements the {Comparable} interface which can
|
5
|
+
# convert itself to an array.
|
5
6
|
class Segment
|
6
7
|
include Comparable
|
7
8
|
|
@@ -25,7 +26,7 @@ module Naturally
|
|
25
26
|
# @example a college course code
|
26
27
|
# Segment.new('MATH101').to_array #=> [:str, "MATH", 101]
|
27
28
|
#
|
28
|
-
# @example Section 633a of the
|
29
|
+
# @example Section 633a of the U.S. Age Discrimination in Employment Act
|
29
30
|
# Segment.new('633a').to_array #=> [:int, 633, "a"]
|
30
31
|
def to_array
|
31
32
|
# TODO: Refactor, probably via polymorphism
|
data/lib/naturally/version.rb
CHANGED
data/naturally.gemspec
CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |gem|
|
|
7
7
|
gem.version = Naturally::VERSION
|
8
8
|
gem.license = 'MIT'
|
9
9
|
gem.authors = ["Robb Shecter"]
|
10
|
-
gem.email = ["robb@
|
10
|
+
gem.email = ["robb@public.law"]
|
11
11
|
gem.summary = %q{Sorts numbers according to the way people are used to seeing them.}
|
12
12
|
gem.description = %q{Natural Sorting with support for legal numbering, course numbers, and other number/letter mixes.}
|
13
13
|
gem.homepage = "http://github.com/dogweather/naturally"
|
data/spec/naturally_spec.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require 'naturally'
|
3
3
|
|
4
4
|
describe Naturally do
|
5
|
+
# Just a helper for these tests
|
5
6
|
def it_sorts(opts = {})
|
6
7
|
this = opts[:this]
|
7
8
|
to_this = opts[:to_this]
|
@@ -9,59 +10,84 @@ describe Naturally do
|
|
9
10
|
expect(actual).to eq(to_this)
|
10
11
|
end
|
11
12
|
|
13
|
+
|
12
14
|
describe '#sort' do
|
15
|
+
it 'supports a nicer by: syntax' do
|
16
|
+
UbuntuVersion ||= Struct.new(:name, :version)
|
17
|
+
releases = [
|
18
|
+
UbuntuVersion.new('Saucy Salamander', '13.10'),
|
19
|
+
UbuntuVersion.new('Raring Ringtail', '13.04'),
|
20
|
+
UbuntuVersion.new('Precise Pangolin', '12.04.4'),
|
21
|
+
UbuntuVersion.new('Maverick Meerkat', '10.10'),
|
22
|
+
UbuntuVersion.new('Quantal Quetzal', '12.10'),
|
23
|
+
UbuntuVersion.new('Lucid Lynx', '10.04.4')
|
24
|
+
]
|
25
|
+
|
26
|
+
actual = Naturally.sort releases, by: :version
|
27
|
+
|
28
|
+
expect(actual.map(&:name)).to eq [
|
29
|
+
'Lucid Lynx',
|
30
|
+
'Maverick Meerkat',
|
31
|
+
'Precise Pangolin',
|
32
|
+
'Quantal Quetzal',
|
33
|
+
'Raring Ringtail',
|
34
|
+
'Saucy Salamander'
|
35
|
+
]
|
36
|
+
end
|
37
|
+
|
38
|
+
|
13
39
|
it 'sorts an array of strings nicely as if they were legal numbers' do
|
14
40
|
it_sorts(
|
15
|
-
this:
|
41
|
+
this: %w(676 676.1 676.11 676.12 676.2 676.3 676.9 676.10),
|
16
42
|
to_this: %w(676 676.1 676.2 676.3 676.9 676.10 676.11 676.12)
|
17
43
|
)
|
18
44
|
end
|
19
45
|
|
20
46
|
it 'sorts a more complex list of strings' do
|
21
47
|
it_sorts(
|
22
|
-
this:
|
48
|
+
this: %w(350 351 352 352.1 352.5 353.1 354 354.3 354.4 354.45 354.5),
|
23
49
|
to_this: %w(350 351 352 352.1 352.5 353.1 354 354.3 354.4 354.5 354.45)
|
24
50
|
)
|
25
51
|
end
|
26
52
|
|
27
53
|
it 'sorts when numbers have letters in them' do
|
28
54
|
it_sorts(
|
29
|
-
this:
|
55
|
+
this: %w(335 335.1 336a 336 337 337a 337.1 337.15 337.2),
|
30
56
|
to_this: %w(335 335.1 336 336a 337 337.1 337.2 337.15 337a)
|
31
57
|
)
|
32
58
|
end
|
33
59
|
|
34
60
|
it 'sorts when numbers have unicode letters in them' do
|
35
61
|
it_sorts(
|
36
|
-
this:
|
62
|
+
this: %w(335 335.1 336a 336 337 337я 337.1 337.15 337.2),
|
37
63
|
to_this: %w(335 335.1 336 336a 337 337.1 337.2 337.15 337я)
|
38
64
|
)
|
39
65
|
end
|
40
66
|
|
41
67
|
it 'sorts when letters have numbers in them' do
|
42
68
|
it_sorts(
|
43
|
-
this:
|
69
|
+
this: %w(PC1, PC3, PC5, PC7, PC9, PC10, PC11, PC12, PC13, PC14, PROF2, PBLI, SBP1, SBP3),
|
44
70
|
to_this: %w(PBLI, PC1, PC3, PC5, PC7, PC9, PC10, PC11, PC12, PC13, PC14, PROF2, SBP1, SBP3)
|
45
71
|
)
|
46
72
|
end
|
47
73
|
|
48
74
|
it 'sorts when letters have numbers and unicode characters in them' do
|
49
75
|
it_sorts(
|
50
|
-
this:
|
76
|
+
this: %w(АБ4, АБ2, АБ10, АБ12, АБ1, АБ3, АД8, АД5, АЩФ12, АЩФ8, ЫВА1),
|
51
77
|
to_this: %w(АБ1, АБ2, АБ3, АБ4, АБ10, АБ12, АД5, АД8, АЩФ8, АЩФ12, ЫВА1)
|
52
78
|
)
|
53
79
|
end
|
54
80
|
|
55
81
|
it 'sorts double digits with letters correctly' do
|
56
82
|
it_sorts(
|
57
|
-
this:
|
83
|
+
this: %w(12a 12b 12c 13a 13b 2 3 4 5 10 11 12),
|
58
84
|
to_this: %w(2 3 4 5 10 11 12 12a 12b 12c 13a 13b)
|
59
85
|
)
|
60
86
|
end
|
61
87
|
|
62
88
|
it 'sorts double digits with unicode letters correctly' do
|
63
89
|
it_sorts(
|
64
|
-
this:
|
90
|
+
this: %w(12а 12б 12в 13а 13б 2 3 4 5 10 11 12),
|
65
91
|
to_this: %w(2 3 4 5 10 11 12 12а 12б 12в 13а 13б)
|
66
92
|
)
|
67
93
|
end
|
@@ -75,28 +101,28 @@ describe Naturally do
|
|
75
101
|
|
76
102
|
it 'sorts letters with digits correctly' do
|
77
103
|
it_sorts(
|
78
|
-
this:
|
104
|
+
this: %w(1 a 2 b 3 c),
|
79
105
|
to_this: %w(1 2 3 a b c)
|
80
106
|
)
|
81
107
|
end
|
82
108
|
|
83
109
|
it 'sorts complex numbers with digits correctly' do
|
84
110
|
it_sorts(
|
85
|
-
this:
|
111
|
+
this: %w(1 a 2 b 3 c 1.1 a.1 1.2 a.2 1.3 a.3 b.1 ),
|
86
112
|
to_this: %w(1 1.1 1.2 1.3 2 3 a a.1 a.2 a.3 b b.1 c)
|
87
113
|
)
|
88
114
|
end
|
89
115
|
|
90
116
|
it 'sorts complex mixes of numbers and digits correctly' do
|
91
117
|
it_sorts(
|
92
|
-
this:
|
118
|
+
this: %w( 1.a.1 1.1 ),
|
93
119
|
to_this: %w( 1.1 1.a.1 )
|
94
120
|
)
|
95
121
|
end
|
96
122
|
|
97
123
|
it 'sorts complex mixes of numbers and digits correctly' do
|
98
124
|
it_sorts(
|
99
|
-
this:
|
125
|
+
this: %w( 1a1 1aa aaa ),
|
100
126
|
to_this: %w( 1aa 1a1 aaa )
|
101
127
|
)
|
102
128
|
end
|
@@ -104,7 +130,7 @@ describe Naturally do
|
|
104
130
|
|
105
131
|
describe '#sort_naturally_by' do
|
106
132
|
it 'sorts by an attribute' do
|
107
|
-
UbuntuVersion
|
133
|
+
UbuntuVersion ||= Struct.new(:name, :version)
|
108
134
|
releases = [
|
109
135
|
UbuntuVersion.new('Saucy Salamander', '13.10'),
|
110
136
|
UbuntuVersion.new('Raring Ringtail', '13.04'),
|
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: naturally
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robb Shecter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Natural Sorting with support for legal numbering, course numbers, and
|
14
14
|
other number/letter mixes.
|
15
15
|
email:
|
16
|
-
- robb@
|
16
|
+
- robb@public.law
|
17
17
|
executables: []
|
18
18
|
extensions: []
|
19
19
|
extra_rdoc_files: []
|
@@ -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: 2.4
|
52
|
+
rubygems_version: 2.7.4
|
53
53
|
signing_key:
|
54
54
|
specification_version: 4
|
55
55
|
summary: Sorts numbers according to the way people are used to seeing them.
|