ranges_merger 0.1.0 → 0.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.
- data/README.rdoc +46 -19
- data/VERSION +1 -1
- data/lib/ranges_merger/ranges_merger_exclusion.rb +88 -0
- data/lib/ranges_merger/ranges_merger_merging.rb +108 -0
- data/lib/ranges_merger/ranges_merger_utils.rb +18 -0
- data/lib/ranges_merger.rb +29 -87
- data/ranges_merger.gemspec +5 -2
- data/spec/ranges_merger_spec.rb +141 -9
- metadata +14 -11
data/README.rdoc
CHANGED
@@ -2,23 +2,9 @@
|
|
2
2
|
|
3
3
|
Very simple gem for merging range-like objects.
|
4
4
|
|
5
|
-
== How to use
|
5
|
+
== How to use, simple merge
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
If you want to merge 2 ranges please use code just like below.
|
10
|
-
|
11
|
-
a = [1, 3]
|
12
|
-
|
13
|
-
b = [2, 4]
|
14
|
-
|
15
|
-
result = RangesMerger.two_way_merge([a, b])
|
16
|
-
|
17
|
-
# => result = [[1, 4]]
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
If you want to merge more than 2 ranges please use code just like below.
|
7
|
+
If you want to merge please use code just like below.
|
22
8
|
|
23
9
|
a = [1, 3]
|
24
10
|
|
@@ -28,9 +14,9 @@ If you want to merge more than 2 ranges please use code just like below.
|
|
28
14
|
|
29
15
|
result = RangesMerger.merge([a, b, c])
|
30
16
|
|
31
|
-
#
|
32
|
-
|
17
|
+
# result => [[1, 6]]
|
33
18
|
|
19
|
+
== Range objects
|
34
20
|
|
35
21
|
If you want to merge Range objects.
|
36
22
|
|
@@ -46,8 +32,49 @@ If you want to merge Range objects.
|
|
46
32
|
|
47
33
|
result = RangesMerger.merge(ranges)
|
48
34
|
|
49
|
-
#
|
35
|
+
# result => [(1..3),(5..8)]
|
36
|
+
|
37
|
+
== Exclusion
|
38
|
+
|
39
|
+
If you want to exclude please use code just like below.
|
40
|
+
|
41
|
+
First - base:
|
42
|
+
|
43
|
+
a = [1, 3]
|
44
|
+
|
45
|
+
b = [3, 5]
|
46
|
+
|
47
|
+
c = [9, 11]
|
48
|
+
|
49
|
+
Seconds - exclusions:
|
50
|
+
|
51
|
+
x = [2, 4]
|
52
|
+
|
53
|
+
y = [4, 10]
|
54
|
+
|
55
|
+
And run some processing
|
56
|
+
|
57
|
+
result = RangesMerger.exclude([a, b, c], [x, y])
|
58
|
+
|
59
|
+
# result => [[1, 2], [10, 11]]
|
60
|
+
|
61
|
+
== I want an instance
|
62
|
+
|
63
|
+
If you want to have instance, add and remove ranges as you wish just do something like that:
|
64
|
+
|
65
|
+
r = RangesMerger.new
|
66
|
+
|
67
|
+
r += [[1, 10]]
|
68
|
+
|
69
|
+
r += [[8, 15]]
|
70
|
+
|
71
|
+
# r.to_array => [[1, 15]]
|
72
|
+
|
73
|
+
r -= [[2, 4]]
|
74
|
+
|
75
|
+
r -= [[11, 12]]
|
50
76
|
|
77
|
+
# r.to_array => [[1, 2], [4,11], [12,15]]
|
51
78
|
|
52
79
|
|
53
80
|
== Contributing to ranges_merger
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module RangesMergerExclusion
|
2
|
+
|
3
|
+
def exclude(_array_a, _array_b)
|
4
|
+
new_array = Array.new
|
5
|
+
|
6
|
+
# array of bases
|
7
|
+
bases = merge(_array_a)
|
8
|
+
|
9
|
+
# loop for "base"
|
10
|
+
i = 0
|
11
|
+
while i < bases.size
|
12
|
+
base = bases[i]
|
13
|
+
|
14
|
+
# loop for "exclusions"
|
15
|
+
_array_b.each do |b|
|
16
|
+
# base can be excluded to this level that is empty
|
17
|
+
if not base.nil?
|
18
|
+
result = two_way_exclusion([base, b])
|
19
|
+
if result.size == 1
|
20
|
+
base = two_way_exclusion([base, b])[0]
|
21
|
+
elsif result.size == 2
|
22
|
+
# first go to processing, last go to base pool
|
23
|
+
base = result[0]
|
24
|
+
bases << result[1]
|
25
|
+
elsif result.size == 0
|
26
|
+
base = nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
new_array << base if not base.nil?
|
33
|
+
i += 1
|
34
|
+
end
|
35
|
+
|
36
|
+
return merge(new_array)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Merge two Arrays
|
40
|
+
def two_way_exclusion(_array)
|
41
|
+
base_from = _array[0][0]
|
42
|
+
base_to = _array[0][1]
|
43
|
+
|
44
|
+
excl_from = _array[1][0]
|
45
|
+
excl_to = _array[1][1]
|
46
|
+
|
47
|
+
# puts "base_from #{base_from} base_to #{base_to} excl_from #{excl_from} excl_to #{excl_to}"
|
48
|
+
|
49
|
+
# 1A. BASE < EXCL
|
50
|
+
if (base_to < excl_to and base_from < excl_from and base_to < excl_from)
|
51
|
+
# puts "1a"
|
52
|
+
return [[base_from, base_to]]
|
53
|
+
end
|
54
|
+
|
55
|
+
# 1B. BASE > EXCL
|
56
|
+
if (base_to > excl_to and base_from > excl_from and excl_to < base_from)
|
57
|
+
# puts "1b"
|
58
|
+
return [[base_from, base_to]]
|
59
|
+
end
|
60
|
+
|
61
|
+
# 2 EXCL contains BASE => nothing
|
62
|
+
if base_from >= excl_from and base_to <= excl_to
|
63
|
+
# puts "2"
|
64
|
+
return []
|
65
|
+
end
|
66
|
+
|
67
|
+
# 3 EXCL inside BASE
|
68
|
+
if excl_from > base_from and excl_to < base_to
|
69
|
+
# puts "3"
|
70
|
+
return [[base_from, excl_from], [excl_to, base_to]]
|
71
|
+
end
|
72
|
+
|
73
|
+
# 4A EXCL has inside BASE from
|
74
|
+
if excl_from <= base_from and excl_to >= base_from
|
75
|
+
# puts "4a"
|
76
|
+
return [[excl_to, base_to]]
|
77
|
+
end
|
78
|
+
|
79
|
+
# 4b EXCL has inside BASE to
|
80
|
+
if excl_from <= base_to and excl_to >= base_from
|
81
|
+
# puts "4b"
|
82
|
+
return [[base_from, excl_from]]
|
83
|
+
end
|
84
|
+
|
85
|
+
raise 'Not implemented, is it even possible?'
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module RangesMergerMerging
|
2
|
+
|
3
|
+
# Merge for various objects (Array, Range). Result is
|
4
|
+
def merge(_array)
|
5
|
+
klass = _array.first.class
|
6
|
+
array = self.normalize_array(_array)
|
7
|
+
result = self.merge_loop(array)
|
8
|
+
|
9
|
+
if klass.to_s == "Range"
|
10
|
+
return self.array_to_ranges(result)
|
11
|
+
end
|
12
|
+
|
13
|
+
return result
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
# Merge loop for merging Array of Arrays
|
19
|
+
def merge_loop(_array)
|
20
|
+
return _array if _array.size <= 1
|
21
|
+
return self.two_way_merge(_array) if _array.size == 2
|
22
|
+
|
23
|
+
before = _array
|
24
|
+
while true do
|
25
|
+
after = self.merge_array(_array)
|
26
|
+
return after if before == after or not check_overlaps(after)
|
27
|
+
before = after
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Merging phase
|
32
|
+
def merge_array(_array)
|
33
|
+
return _array if _array.size <= 1
|
34
|
+
sorted = _array.sort { |a, b| a[0] <=> b[0] }.uniq
|
35
|
+
|
36
|
+
i = 1
|
37
|
+
while i < sorted.size do
|
38
|
+
to_merge = [sorted[i-1], sorted[i]]
|
39
|
+
# puts "merging #{to_merge.inspect}"
|
40
|
+
|
41
|
+
result = self.two_way_merge(to_merge)
|
42
|
+
# puts "merged #{result.inspect}"
|
43
|
+
|
44
|
+
sorted[i-1] = result[0]
|
45
|
+
|
46
|
+
if result.size == 1
|
47
|
+
sorted[i] = nil
|
48
|
+
sorted.delete_if { |s| s.nil? }
|
49
|
+
else
|
50
|
+
i += 1
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
return sorted
|
55
|
+
end
|
56
|
+
|
57
|
+
# Check if there are overlaps in Array
|
58
|
+
def check_overlaps(_array)
|
59
|
+
sorted = _array.sort { |a, b| a[0] <=> b[0] }.uniq
|
60
|
+
|
61
|
+
(1...sorted.size).each do |i|
|
62
|
+
return true if sorted[i][0] <= sorted[i-1][0]
|
63
|
+
return true if sorted[i][0] <= sorted[i-1][1]
|
64
|
+
end
|
65
|
+
return false
|
66
|
+
end
|
67
|
+
|
68
|
+
# Merge two Arrays
|
69
|
+
def two_way_merge(_array)
|
70
|
+
a_from = _array[0][0]
|
71
|
+
b_from = _array[1][0]
|
72
|
+
a_to = _array[0][1]
|
73
|
+
b_to = _array[1][1]
|
74
|
+
|
75
|
+
# 1A. outside each other A > B
|
76
|
+
if (a_to < b_to and a_from < b_from and a_to < b_from)
|
77
|
+
return [[a_from, a_to], [b_from, b_to]]
|
78
|
+
end
|
79
|
+
|
80
|
+
# 1B. outside each other B > A
|
81
|
+
if (a_to > b_to and a_from > b_from and b_to < a_from)
|
82
|
+
return [[b_from, b_to], [a_from, a_to]]
|
83
|
+
end
|
84
|
+
|
85
|
+
# 2A. A is inside B
|
86
|
+
if a_from >= b_from and a_to <= b_to
|
87
|
+
return [[b_from, b_to]]
|
88
|
+
end
|
89
|
+
|
90
|
+
# 2B. B is inside A
|
91
|
+
if b_from >= a_from and b_to <= a_to
|
92
|
+
return [[a_from, a_to]]
|
93
|
+
end
|
94
|
+
|
95
|
+
# 3A. overlapping, A < B
|
96
|
+
if a_from < b_from and a_to < b_to and a_to >= b_from
|
97
|
+
return [[a_from, b_to]]
|
98
|
+
end
|
99
|
+
|
100
|
+
# 3B. overlapping, B < A
|
101
|
+
if b_from < a_from and b_to < a_to and b_to >= a_from
|
102
|
+
return [[b_from, a_to]]
|
103
|
+
end
|
104
|
+
|
105
|
+
raise 'Not implemented, is it even possible?'
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module RangesMergerUtils
|
2
|
+
# Convert Array of Arrays or Ranges to Array of Arrays
|
3
|
+
def normalize_array(_array)
|
4
|
+
klass = _array.first.class
|
5
|
+
if klass.to_s == "Array"
|
6
|
+
return self.merge_loop(_array)
|
7
|
+
elsif klass.to_s == "Range"
|
8
|
+
return _array.collect { |a| [a.first, a.last] }
|
9
|
+
else
|
10
|
+
return []
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Convert Array of Arrays to Array of Ranges
|
15
|
+
def array_to_ranges(_array)
|
16
|
+
_array.collect { |r| Range.new(r[0], r[1]) }
|
17
|
+
end
|
18
|
+
end
|
data/lib/ranges_merger.rb
CHANGED
@@ -1,102 +1,44 @@
|
|
1
|
-
|
1
|
+
require 'ranges_merger/ranges_merger_merging'
|
2
|
+
require 'ranges_merger/ranges_merger_utils'
|
3
|
+
require 'ranges_merger/ranges_merger_exclusion'
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
|
5
|
+
class RangesMerger
|
6
|
+
extend RangesMergerMerging
|
7
|
+
extend RangesMergerUtils
|
8
|
+
extend RangesMergerExclusion
|
6
9
|
|
7
|
-
|
8
|
-
return self.merge_loop(_array)
|
9
|
-
elsif klass.to_s == "Range"
|
10
|
-
result = self.merge_loop( _array.collect{|a| [a.first, a.last]} )
|
11
|
-
return result.collect{|r| Range.new(r[0], r[1])}
|
12
|
-
else
|
13
|
-
return []
|
14
|
-
end
|
10
|
+
attr_reader :ranges
|
15
11
|
|
12
|
+
def initialize(_array = [])
|
13
|
+
@ranges = self.class.merge(
|
14
|
+
self.class.normalize_array(_array)
|
15
|
+
)
|
16
16
|
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
while true do
|
22
|
-
after = self.merge_array(_array)
|
23
|
-
return after if before == after or not check_overlaps(after)
|
24
|
-
before = after
|
25
|
-
end
|
18
|
+
def add(_array)
|
19
|
+
@ranges = self.class.merge(@ranges + _array)
|
20
|
+
return self
|
26
21
|
end
|
27
22
|
|
28
|
-
def
|
29
|
-
|
30
|
-
sorted = _array.sort { |a, b| a[0] <=> b[0] }.uniq
|
31
|
-
|
32
|
-
i = 1
|
33
|
-
while i < sorted.size do
|
34
|
-
to_merge = [sorted[i-1], sorted[i]]
|
35
|
-
# puts "merging #{to_merge.inspect}"
|
36
|
-
|
37
|
-
result = self.two_way_merge(to_merge)
|
38
|
-
# puts "merged #{result.inspect}"
|
39
|
-
|
40
|
-
sorted[i-1] = result[0]
|
41
|
-
|
42
|
-
if result.size == 1
|
43
|
-
sorted[i] = nil
|
44
|
-
sorted.delete_if { |s| s.nil? }
|
45
|
-
else
|
46
|
-
i += 1
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
return sorted
|
23
|
+
def +(_array)
|
24
|
+
add(_array)
|
51
25
|
end
|
52
26
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
(1...sorted.size).each do |i|
|
58
|
-
return true if sorted[i][0] <= sorted[i-1][0]
|
59
|
-
return true if sorted[i][0] <= sorted[i-1][1]
|
60
|
-
end
|
61
|
-
return false
|
27
|
+
def remove(_array)
|
28
|
+
@ranges = self.class.exclude(@ranges, _array)
|
29
|
+
return self
|
62
30
|
end
|
63
31
|
|
64
|
-
def
|
65
|
-
|
66
|
-
|
67
|
-
a_to = _array[0][1]
|
68
|
-
b_to = _array[1][1]
|
69
|
-
|
70
|
-
# 1A. outside each other A > B
|
71
|
-
if (a_to < b_to and a_from < b_from and a_to < b_from)
|
72
|
-
return [[a_from, a_to], [b_from, b_to]]
|
73
|
-
end
|
74
|
-
|
75
|
-
# 1B. outside each other B > A
|
76
|
-
if (a_to > b_to and a_from > b_from and b_to < a_from)
|
77
|
-
return [[b_from, b_to], [a_from, a_to]]
|
78
|
-
end
|
79
|
-
|
80
|
-
# 2A. A is inside B
|
81
|
-
if a_from >= b_from and a_to <= b_to
|
82
|
-
return [[b_from, b_to]]
|
83
|
-
end
|
84
|
-
|
85
|
-
# 2B. B is inside A
|
86
|
-
if b_from >= a_from and b_to <= a_to
|
87
|
-
return [[a_from, a_to]]
|
88
|
-
end
|
89
|
-
|
90
|
-
# 3A. overlapping, A < B
|
91
|
-
if a_from < b_from and a_to < b_to and a_to >= b_from
|
92
|
-
return [[a_from, b_to]]
|
93
|
-
end
|
32
|
+
def -(_array)
|
33
|
+
remove(_array)
|
34
|
+
end
|
94
35
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
36
|
+
def to_ranges
|
37
|
+
self.class.array_to_ranges(@ranges)
|
38
|
+
end
|
99
39
|
|
100
|
-
|
40
|
+
def to_array
|
41
|
+
@ranges
|
101
42
|
end
|
43
|
+
|
102
44
|
end
|
data/ranges_merger.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "ranges_merger"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Aleksander Kwiatkowski"]
|
12
|
-
s.date = "2011-12-
|
12
|
+
s.date = "2011-12-06"
|
13
13
|
s.description = "Simple gem used for merging range-like objects. If you have problems with operations on ranges this gem can save you some time."
|
14
14
|
s.email = "bobikx@poczta.fm"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -27,6 +27,9 @@ Gem::Specification.new do |s|
|
|
27
27
|
"Rakefile",
|
28
28
|
"VERSION",
|
29
29
|
"lib/ranges_merger.rb",
|
30
|
+
"lib/ranges_merger/ranges_merger_exclusion.rb",
|
31
|
+
"lib/ranges_merger/ranges_merger_merging.rb",
|
32
|
+
"lib/ranges_merger/ranges_merger_utils.rb",
|
30
33
|
"ranges_merger.gemspec",
|
31
34
|
"spec/ranges_merger_spec.rb",
|
32
35
|
"spec/spec_helper.rb"
|
data/spec/ranges_merger_spec.rb
CHANGED
@@ -1,17 +1,20 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe "RangesMerger" do
|
4
|
+
|
5
|
+
# Merging
|
6
|
+
|
4
7
|
it "should merge 2 overlapping ranges" do
|
5
8
|
a = [1, 3]
|
6
9
|
b = [2, 4]
|
7
|
-
result = RangesMerger.
|
10
|
+
result = RangesMerger.merge([a, b])
|
8
11
|
result.should == [[1, 4]]
|
9
12
|
end
|
10
13
|
|
11
14
|
it "should merge 2 overlapping ranges" do
|
12
15
|
a = [2, 4]
|
13
16
|
b = [1, 3]
|
14
|
-
result = RangesMerger.
|
17
|
+
result = RangesMerger.merge([a, b])
|
15
18
|
result.should == [[1, 4]]
|
16
19
|
end
|
17
20
|
|
@@ -19,7 +22,7 @@ describe "RangesMerger" do
|
|
19
22
|
b = [1, 3]
|
20
23
|
a = [5, 6]
|
21
24
|
# it sorts :)
|
22
|
-
result = RangesMerger.
|
25
|
+
result = RangesMerger.merge([a, b])
|
23
26
|
result.should == [[1, 3], [5, 6]]
|
24
27
|
result.should_not == [[5, 6], [1, 3]]
|
25
28
|
end
|
@@ -27,28 +30,28 @@ describe "RangesMerger" do
|
|
27
30
|
it "should merge 2 not overlapping ranges" do
|
28
31
|
a = [1, 3]
|
29
32
|
b = [5, 6]
|
30
|
-
result = RangesMerger.
|
33
|
+
result = RangesMerger.merge([a, b])
|
31
34
|
result.should == [[1, 3], [5, 6]]
|
32
35
|
end
|
33
36
|
|
34
37
|
it "should merge 2 identical ranges" do
|
35
38
|
a = [1, 2]
|
36
39
|
b = [1, 2]
|
37
|
-
result = RangesMerger.
|
40
|
+
result = RangesMerger.merge([a, b])
|
38
41
|
result.should == [[1, 2]]
|
39
42
|
end
|
40
43
|
|
41
44
|
it "should merge 2 ranges, A within B" do
|
42
45
|
a = [1, 5]
|
43
46
|
b = [2, 3]
|
44
|
-
result = RangesMerger.
|
47
|
+
result = RangesMerger.merge([a, b])
|
45
48
|
result.should == [[1, 5]]
|
46
49
|
end
|
47
50
|
|
48
51
|
it "should merge 2 ranges, B within A" do
|
49
52
|
b = [1, 5]
|
50
53
|
a = [2, 3]
|
51
|
-
result = RangesMerger.
|
54
|
+
result = RangesMerger.merge([a, b])
|
52
55
|
result.should == [[1, 5]]
|
53
56
|
end
|
54
57
|
|
@@ -105,7 +108,7 @@ describe "RangesMerger" do
|
|
105
108
|
it "should do the readme code" do
|
106
109
|
a = [1, 3]
|
107
110
|
b = [2, 4]
|
108
|
-
result = RangesMerger.
|
111
|
+
result = RangesMerger.merge([a, b])
|
109
112
|
result.should == [[1, 4]]
|
110
113
|
|
111
114
|
a = [1, 3]
|
@@ -142,8 +145,137 @@ describe "RangesMerger" do
|
|
142
145
|
(5..8)
|
143
146
|
]
|
144
147
|
result = RangesMerger.merge(ranges)
|
145
|
-
result.should == [(1..3),(5..8)]
|
148
|
+
result.should == [(1..3), (5..8)]
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
#Exclusion
|
153
|
+
|
154
|
+
it "should exclude ranges 'inside' range" do
|
155
|
+
result = RangesMerger.exclude([[1, 4]], [[2, 3]])
|
156
|
+
result.should == [[1, 2], [3, 4]]
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should exclude ranges at right end" do
|
160
|
+
result = RangesMerger.exclude([[1, 4]], [[3, 4]])
|
161
|
+
result.should == [[1, 3]]
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should exclude ranges at left end" do
|
165
|
+
result = RangesMerger.exclude([[1, 4]], [[1, 2]])
|
166
|
+
result.should == [[2, 4]]
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should exclude ranges 'outside' range" do
|
170
|
+
result = RangesMerger.exclude([[1, 4]], [[0, 5]])
|
171
|
+
result.should == []
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should not exclude ranges because exclude range is 'outside' base range" do
|
175
|
+
result = RangesMerger.exclude([[1, 4]], [[5, 6]])
|
176
|
+
result.should == [[1, 4]]
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should exclude using many ranges (1)" do
|
180
|
+
result = RangesMerger.exclude([[1, 2], [3, 4], [5, 6]], [[2, 5]])
|
181
|
+
result.should == [[1, 2], [5, 6]]
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should exclude using many ranges (2)" do
|
185
|
+
result = RangesMerger.exclude([[1, 2], [3, 4], [5, 6]], [[1, 6]])
|
186
|
+
result.should == []
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should exclude using many ranges (3)" do
|
190
|
+
result = RangesMerger.exclude([[1, 2], [3, 4], [5, 6]], [[2, 3], [4, 5]])
|
191
|
+
result.should == [[1, 2], [3, 4], [5, 6]]
|
192
|
+
end
|
193
|
+
|
194
|
+
it "should exclude using many ranges (4)" do
|
195
|
+
result = RangesMerger.exclude([[1, 10]], [[2, 3], [4, 5], [6, 7]])
|
196
|
+
result.should == [[1, 2], [3, 4], [5, 6], [7, 10]]
|
146
197
|
end
|
147
198
|
|
199
|
+
it "should exclude using many ranges (5)" do
|
200
|
+
result = RangesMerger.exclude([[1, 4], [6, 10]], [[4, 6]])
|
201
|
+
result.should == [[1, 4], [6, 10]]
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should exclude using many ranges (6)" do
|
205
|
+
result = RangesMerger.exclude([[1, 4], [6, 10]], [[3, 7]])
|
206
|
+
result.should == [[1, 3], [7, 10]]
|
207
|
+
end
|
208
|
+
|
209
|
+
it "should exclude using many ranges (7)" do
|
210
|
+
result = RangesMerger.exclude([[1, 4], [6, 10]], [[0, 7]])
|
211
|
+
result.should == [[7, 10]]
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should exclude using many ranges (8)" do
|
215
|
+
result = RangesMerger.exclude([[1, 4], [6, 10]], [[8, 8]])
|
216
|
+
result.should == [[1, 4], [6, 10]]
|
217
|
+
end
|
218
|
+
|
219
|
+
it "should exclude using many ranges (8)" do
|
220
|
+
result = RangesMerger.exclude([[1, 3], [3, 5], [9, 11]], [[2, 4], [4, 10]])
|
221
|
+
result.should == [[1, 2], [10, 11]]
|
222
|
+
end
|
223
|
+
|
224
|
+
# Instance
|
225
|
+
|
226
|
+
it "should create instance, add 2 ranges and process them to array format (using add method)" do
|
227
|
+
r = RangesMerger.new
|
228
|
+
r.add [[1, 2]]
|
229
|
+
r.add [[2, 3]]
|
230
|
+
r.kind_of?(RangesMerger).should
|
231
|
+
r.to_array.should == [[1, 3]]
|
232
|
+
end
|
233
|
+
|
234
|
+
it "should create instance, add 2 ranges and process them to array format (using plus operator)" do
|
235
|
+
r = RangesMerger.new
|
236
|
+
r += [[1, 2]]
|
237
|
+
r += [[2, 3]]
|
238
|
+
r.kind_of?(RangesMerger).should
|
239
|
+
r.to_array.should == [[1, 3]]
|
240
|
+
end
|
241
|
+
|
242
|
+
|
243
|
+
it "should create instance, add 2 ranges, remove 2 and process them to array format (using add/remove method)" do
|
244
|
+
r = RangesMerger.new
|
245
|
+
r.add [[1, 10]]
|
246
|
+
r.add [[8, 15]]
|
247
|
+
r.to_array.should == [[1, 15]]
|
248
|
+
|
249
|
+
r.remove [[2, 4]]
|
250
|
+
r.remove [[11, 12]]
|
251
|
+
r.kind_of?(RangesMerger).should
|
252
|
+
r.to_array.should == [[1, 2], [4, 11], [12, 15]]
|
253
|
+
end
|
254
|
+
|
255
|
+
it "should create instance, add 2 ranges, remove 2 and process them to array format (using plus/minus operator)" do
|
256
|
+
r = RangesMerger.new
|
257
|
+
r += [[1, 10]]
|
258
|
+
r += [[8, 15]]
|
259
|
+
r.to_array.should == [[1, 15]]
|
260
|
+
|
261
|
+
r -= [[2, 4]]
|
262
|
+
r -= [[11, 12]]
|
263
|
+
r.kind_of?(RangesMerger).should
|
264
|
+
r.to_array.should == [[1, 2], [4, 11], [12, 15]]
|
265
|
+
end
|
266
|
+
|
267
|
+
it "should create instance, mixed test" do
|
268
|
+
r = RangesMerger.new
|
269
|
+
r += [[10, 50]]
|
270
|
+
r.to_array.should == [[10, 50]]
|
271
|
+
r -= [[15, 30]]
|
272
|
+
r.to_array.should == [[10, 15], [30, 50]]
|
273
|
+
r += [[0, 20]]
|
274
|
+
r.to_array.should == [[0, 20], [30, 50]]
|
275
|
+
r -= [[2, 5]]
|
276
|
+
r.to_array.should == [[0, 2], [5, 20], [30, 50]]
|
277
|
+
r += [[-2, 3]]
|
278
|
+
r.to_array.should == [[-2, 3], [5, 20], [30, 50]]
|
279
|
+
end
|
148
280
|
|
149
281
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ranges_merger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-12-
|
12
|
+
date: 2011-12-06 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &83398430 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 2.3.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *83398430
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
27
|
-
requirement: &
|
27
|
+
requirement: &83398180 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.0.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *83398180
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: jeweler
|
38
|
-
requirement: &
|
38
|
+
requirement: &83397940 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.6.4
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *83397940
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rcov
|
49
|
-
requirement: &
|
49
|
+
requirement: &83333790 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *83333790
|
58
58
|
description: Simple gem used for merging range-like objects. If you have problems
|
59
59
|
with operations on ranges this gem can save you some time.
|
60
60
|
email: bobikx@poczta.fm
|
@@ -74,6 +74,9 @@ files:
|
|
74
74
|
- Rakefile
|
75
75
|
- VERSION
|
76
76
|
- lib/ranges_merger.rb
|
77
|
+
- lib/ranges_merger/ranges_merger_exclusion.rb
|
78
|
+
- lib/ranges_merger/ranges_merger_merging.rb
|
79
|
+
- lib/ranges_merger/ranges_merger_utils.rb
|
77
80
|
- ranges_merger.gemspec
|
78
81
|
- spec/ranges_merger_spec.rb
|
79
82
|
- spec/spec_helper.rb
|
@@ -92,7 +95,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
92
95
|
version: '0'
|
93
96
|
segments:
|
94
97
|
- 0
|
95
|
-
hash:
|
98
|
+
hash: -671424623
|
96
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
100
|
none: false
|
98
101
|
requirements:
|