rangify 0.1.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.
- data.tar.gz.sig +0 -0
- data/Manifest +5 -0
- data/README.rdoc +17 -0
- data/Rakefile +14 -0
- data/lib/rangify.rb +35 -0
- data/rangify.gemspec +32 -0
- data/spec/rangify_spec.rb +45 -0
- metadata +95 -0
- metadata.gz.sig +2 -0
data.tar.gz.sig
ADDED
Binary file
|
data/Manifest
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
= Rangify
|
2
|
+
|
3
|
+
This gem will add the rangify method to Ruby's Array class.
|
4
|
+
The rangify method will produce appropriate ranges from the objects in the array.
|
5
|
+
|
6
|
+
= Usage
|
7
|
+
|
8
|
+
Examples:
|
9
|
+
|
10
|
+
[1,2,3,6,7,8].rangify = [1..3, 6..8]
|
11
|
+
|
12
|
+
[10..15, 16..20, 21, 22].rangify = [10..22]
|
13
|
+
|
14
|
+
|
15
|
+
Assumes inclusive ranges (ie. 1..4) and range.first <= range.last.
|
16
|
+
|
17
|
+
Works with integers, dates and strings. However, all the objects in the array must be of the same class.
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('rangify', '0.1.0') do |p|
|
6
|
+
p.description = "Combine array elements into ranges."
|
7
|
+
p.url = "http://github.com/monocle/rangify"
|
8
|
+
p.author = "monocle"
|
9
|
+
p.email = "frappez_2000@yahoo.com"
|
10
|
+
p.ignore_pattern = ["tmp/*", "script/*"]
|
11
|
+
p.development_dependencies = []
|
12
|
+
end
|
13
|
+
|
14
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext}
|
data/lib/rangify.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Rangify
|
2
|
+
def rangify
|
3
|
+
raise 'Array elements are not consistent.' if self.collect { |value| comparison_value(value, :first).class }.uniq.size > 1
|
4
|
+
array = self.uniq.sort_by { |element| comparison_value(element, :first) }
|
5
|
+
array.inject([]) do |collection, value|
|
6
|
+
unless collection.empty?
|
7
|
+
last = collection.last
|
8
|
+
last_value = comparison_value(last, :last)
|
9
|
+
current_value = comparison_value(value, :first)
|
10
|
+
if (last_value.succ <=> current_value) == -1
|
11
|
+
collection << value
|
12
|
+
else
|
13
|
+
first = [comparison_value(last, :first), comparison_value(value, :first)].min
|
14
|
+
second = [comparison_value(last, :last), comparison_value(value, :last)].max
|
15
|
+
collection[-1] = [first..second]
|
16
|
+
collection.flatten!
|
17
|
+
end
|
18
|
+
else
|
19
|
+
collection << value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# For a Range, will return value.first or value.last. A non-Range will return itself.
|
27
|
+
def comparison_value(value, position)
|
28
|
+
return value if value.class != Range
|
29
|
+
position == :first ? value.first : value.last
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Array
|
34
|
+
include Rangify
|
35
|
+
end
|
data/rangify.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{rangify}
|
5
|
+
s.version = "0.1.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["monocle"]
|
9
|
+
s.date = %q{2010-06-29}
|
10
|
+
s.description = %q{Combine array elements into ranges.}
|
11
|
+
s.email = %q{frappez_2000@yahoo.com}
|
12
|
+
s.extra_rdoc_files = ["README.rdoc", "lib/rangify.rb"]
|
13
|
+
s.files = ["README.rdoc", "Rakefile", "lib/rangify.rb", "spec/rangify_spec.rb", "Manifest", "rangify.gemspec"]
|
14
|
+
s.homepage = %q{http://github.com/monocle/rangify}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rangify", "--main", "README.rdoc"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = %q{rangify}
|
18
|
+
s.rubygems_version = %q{1.3.6}
|
19
|
+
s.summary = %q{Combine array elements into ranges.}
|
20
|
+
s.signing_key = '/ruby/keys/rangify/gem-private_key.pem'
|
21
|
+
s.cert_chain = ['/ruby/keys/rangify/gem-public_cert.pem']
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
else
|
29
|
+
end
|
30
|
+
else
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'lib/rangify'
|
2
|
+
|
3
|
+
describe Rangify do
|
4
|
+
it 'An array of consecutive integers should return an array made up of a single range.' do
|
5
|
+
arr = [1,2,3,4,5]
|
6
|
+
arr.rangify.should == [1..5]
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'An array of non-consecutive integers should return the original array.' do
|
10
|
+
arr = [1,3,5,7]
|
11
|
+
arr.rangify.should == arr
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'An array of consecutive and non-consecutive integers' do
|
15
|
+
before :each do
|
16
|
+
@result = [1..3, 6..8, 10, 15]
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should return the correct ranges.' do
|
20
|
+
arr = [1,2,3,6,7,8,10,15]
|
21
|
+
arr.rangify.should == @result
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'Array element order should not affect the result.' do
|
25
|
+
arr = [8, 1, 15, 2, 6, 3, 7, 10]
|
26
|
+
arr.rangify.should == @result
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'Duplicate elements should not affect the result.' do
|
30
|
+
arr = [8, 1, 15, 2, 6, 3, 7, 10, 8, 15, 2, 3, 1, 2]
|
31
|
+
arr.rangify.should == @result
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'An array of ranges should return the correct ranges.' do
|
36
|
+
arr = [40..45, 1..3, 4..10, 20..30, 24..28, 42..50, 1..6, 1..3]
|
37
|
+
arr.rangify.should == [1..10, 20..30, 40..50]
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'An array of ranges and integers should return the correct ranges.' do
|
41
|
+
arr = [99, 100, 1..3, 101, 4..5, 103, 10..19, 99, 20..20, 31, 32..33, 98, 97]
|
42
|
+
arr.rangify.should == [1..5, 10..20, 31..33, 97..101, 103]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rangify
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- monocle
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain:
|
16
|
+
- |
|
17
|
+
-----BEGIN CERTIFICATE-----
|
18
|
+
MIIDOjCCAiKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBDMRUwEwYDVQQDDAxmcmFw
|
19
|
+
cGV6XzIwMDAxFTATBgoJkiaJk/IsZAEZFgV5YWhvbzETMBEGCgmSJomT8ixkARkW
|
20
|
+
A2NvbTAeFw0xMDA2MzAwMzIwMzlaFw0xMTA2MzAwMzIwMzlaMEMxFTATBgNVBAMM
|
21
|
+
DGZyYXBwZXpfMjAwMDEVMBMGCgmSJomT8ixkARkWBXlhaG9vMRMwEQYKCZImiZPy
|
22
|
+
LGQBGRYDY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvvh8+TF1
|
23
|
+
pOJ6WmRjKTBIB6Vy/Qm9Crq0KLhV5e4OWYVwtRw1+gmSb/hPHpmC4XfnDZz5pr0c
|
24
|
+
NSjPbGETWSLrdqQ5yDGUtemW2NnRdorq1xMBNfHnAlI/9aFDZFgWYhaakeCq3s/F
|
25
|
+
tul5IoH5MIgvNefbikzlp3Pm3rQnLq+VxF0WwxohjB/X8rMDqCZTjzUbF0RNmXm6
|
26
|
+
vqwGGXMgOg4VIgFGCTDA86X4IUn9i91edmbNOK4mhccBBTR6z1bME+vFMVDiCszP
|
27
|
+
9amdE3I/B83b5leE1dC26OoWy9WIf8Z6S1cH1En6vRGRQIDzWA7O2tpjj+xzm7j+
|
28
|
+
cMi3YbpZOgirEwIDAQABozkwNzAJBgNVHRMEAjAAMB0GA1UdDgQWBBRLd9Wpb7Gi
|
29
|
+
IEtR5XLqfHHipSvUSzALBgNVHQ8EBAMCBLAwDQYJKoZIhvcNAQEFBQADggEBACbZ
|
30
|
+
65w4zWwLU0C1H10elzRbWEF50BCEpz7cJksgJFyMI7r0U2vLQm6OX0xINZaSUSqN
|
31
|
+
fxPPYlKBIxj6WmuR60ZfUPXyzXd4o0k4y91L03Puk7LRkchLzHGAH/PcVGbGazOI
|
32
|
+
ypHaiPQde7G8pw6Wl7mjYG5KPgw5YymeFQgpeAoPCgVJeG4ATkNQHoCusQEmedSf
|
33
|
+
6qxBPnLWRFro6JcYRM7TmYdsOUfl72UFrI8i4AKMmP2jlopkdbe//VScGWmHtLmg
|
34
|
+
bGG93QPV3Rvt8KbaAHvzsEuXFLjJFW/1OOZb4YnNoDhiPlPWWf30t1lK2olP2iaf
|
35
|
+
tSZOvfG3gOt6w9fnBtY=
|
36
|
+
-----END CERTIFICATE-----
|
37
|
+
|
38
|
+
date: 2010-06-29 00:00:00 -07:00
|
39
|
+
default_executable:
|
40
|
+
dependencies: []
|
41
|
+
|
42
|
+
description: Combine array elements into ranges.
|
43
|
+
email: frappez_2000@yahoo.com
|
44
|
+
executables: []
|
45
|
+
|
46
|
+
extensions: []
|
47
|
+
|
48
|
+
extra_rdoc_files:
|
49
|
+
- README.rdoc
|
50
|
+
- lib/rangify.rb
|
51
|
+
files:
|
52
|
+
- README.rdoc
|
53
|
+
- Rakefile
|
54
|
+
- lib/rangify.rb
|
55
|
+
- spec/rangify_spec.rb
|
56
|
+
- Manifest
|
57
|
+
- rangify.gemspec
|
58
|
+
has_rdoc: true
|
59
|
+
homepage: http://github.com/monocle/rangify
|
60
|
+
licenses: []
|
61
|
+
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options:
|
64
|
+
- --line-numbers
|
65
|
+
- --inline-source
|
66
|
+
- --title
|
67
|
+
- Rangify
|
68
|
+
- --main
|
69
|
+
- README.rdoc
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
segments:
|
77
|
+
- 0
|
78
|
+
version: "0"
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
segments:
|
84
|
+
- 1
|
85
|
+
- 2
|
86
|
+
version: "1.2"
|
87
|
+
requirements: []
|
88
|
+
|
89
|
+
rubyforge_project: rangify
|
90
|
+
rubygems_version: 1.3.6
|
91
|
+
signing_key:
|
92
|
+
specification_version: 3
|
93
|
+
summary: Combine array elements into ranges.
|
94
|
+
test_files: []
|
95
|
+
|
metadata.gz.sig
ADDED