ranges_merger 0.2.0 → 0.3.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 +56 -0
- data/VERSION +1 -1
- data/lib/ranges_merger.rb +14 -0
- data/lib/ranges_merger/ranges_merger_divider.rb +31 -0
- data/ranges_merger.gemspec +3 -2
- data/spec/ranges_merger_spec.rb +69 -0
- metadata +12 -11
data/README.rdoc
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
Very simple gem for merging range-like objects.
|
4
4
|
|
5
|
+
|
6
|
+
|
5
7
|
== How to use, simple merge
|
6
8
|
|
7
9
|
If you want to merge please use code just like below.
|
@@ -16,6 +18,8 @@ If you want to merge please use code just like below.
|
|
16
18
|
|
17
19
|
# result => [[1, 6]]
|
18
20
|
|
21
|
+
|
22
|
+
|
19
23
|
== Range objects
|
20
24
|
|
21
25
|
If you want to merge Range objects.
|
@@ -34,6 +38,8 @@ If you want to merge Range objects.
|
|
34
38
|
|
35
39
|
# result => [(1..3),(5..8)]
|
36
40
|
|
41
|
+
|
42
|
+
|
37
43
|
== Exclusion
|
38
44
|
|
39
45
|
If you want to exclude please use code just like below.
|
@@ -58,6 +64,8 @@ And run some processing
|
|
58
64
|
|
59
65
|
# result => [[1, 2], [10, 11]]
|
60
66
|
|
67
|
+
|
68
|
+
|
61
69
|
== I want an instance
|
62
70
|
|
63
71
|
If you want to have instance, add and remove ranges as you wish just do something like that:
|
@@ -77,6 +85,54 @@ If you want to have instance, add and remove ranges as you wish just do somethin
|
|
77
85
|
# r.to_array => [[1, 2], [4,11], [12,15]]
|
78
86
|
|
79
87
|
|
88
|
+
|
89
|
+
== Dividing
|
90
|
+
|
91
|
+
Then you have range you may divide it to small pieced with proper interval. You can divide it with 'partials' - smaller
|
92
|
+
parts than interval, or without them.
|
93
|
+
|
94
|
+
r = RangesMerger.new
|
95
|
+
|
96
|
+
r += [[1, 9]]
|
97
|
+
|
98
|
+
result = r % 3
|
99
|
+
|
100
|
+
# result => [[1, 4], [4, 7]]
|
101
|
+
|
102
|
+
result = r / 3
|
103
|
+
|
104
|
+
# result => [[1, 4], [4, 7], [7, 9]]
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
== Ranges are not only numbers
|
109
|
+
|
110
|
+
They can be made from all objects which can be compared, and has simple math. operation like sum. For example - Time
|
111
|
+
object.
|
112
|
+
|
113
|
+
t_now = Time.now
|
114
|
+
|
115
|
+
r = RangesMerger.new
|
116
|
+
|
117
|
+
r += [[t_now - 2*3600, t_now - 0*3600]]
|
118
|
+
r += [[t_now - 3*3600, t_now - 1.3600]]
|
119
|
+
|
120
|
+
result = r.to_array
|
121
|
+
|
122
|
+
# try by yourself or read spec :]
|
123
|
+
|
124
|
+
r -= [[t_now - 2*3600, t_now - 1*3600]]
|
125
|
+
|
126
|
+
result = r.to_array
|
127
|
+
|
128
|
+
# try by yourself or read spec :]
|
129
|
+
|
130
|
+
result = r / (10*60)
|
131
|
+
|
132
|
+
# try by yourself or read spec :]
|
133
|
+
|
134
|
+
|
135
|
+
|
80
136
|
== Contributing to ranges_merger
|
81
137
|
|
82
138
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/ranges_merger.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
require 'ranges_merger/ranges_merger_merging'
|
2
2
|
require 'ranges_merger/ranges_merger_utils'
|
3
3
|
require 'ranges_merger/ranges_merger_exclusion'
|
4
|
+
require 'ranges_merger/ranges_merger_divider'
|
4
5
|
|
5
6
|
class RangesMerger
|
6
7
|
extend RangesMergerMerging
|
7
8
|
extend RangesMergerUtils
|
8
9
|
extend RangesMergerExclusion
|
10
|
+
extend RangesMergerDivider
|
9
11
|
|
10
12
|
attr_reader :ranges
|
11
13
|
|
@@ -33,6 +35,18 @@ class RangesMerger
|
|
33
35
|
remove(_array)
|
34
36
|
end
|
35
37
|
|
38
|
+
def divide(interval, allow_partials = true)
|
39
|
+
return self.class.divide(@ranges, interval, allow_partials)
|
40
|
+
end
|
41
|
+
|
42
|
+
def /(interval)
|
43
|
+
divide(interval, true)
|
44
|
+
end
|
45
|
+
|
46
|
+
def %(interval)
|
47
|
+
divide(interval, false)
|
48
|
+
end
|
49
|
+
|
36
50
|
def to_ranges
|
37
51
|
self.class.array_to_ranges(@ranges)
|
38
52
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RangesMergerDivider
|
2
|
+
# Divide not merged array
|
3
|
+
def divide(_array, interval, allow_partials = true)
|
4
|
+
divided_array = Array.new
|
5
|
+
joined_array = merge(_array)
|
6
|
+
|
7
|
+
joined_array.each do |r|
|
8
|
+
r_from = r[0]
|
9
|
+
r_to = r[1]
|
10
|
+
r_now = r_from
|
11
|
+
|
12
|
+
while r_now <= r_to
|
13
|
+
new_r_from = r_now
|
14
|
+
new_r_to = new_r_from + interval
|
15
|
+
|
16
|
+
if allow_partials and new_r_to > r_to and new_r_from < r_to
|
17
|
+
new_r_to = r_to
|
18
|
+
end
|
19
|
+
|
20
|
+
divided_array << [new_r_from, new_r_to] if new_r_to <= r_to
|
21
|
+
r_now += interval
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
return divided_array
|
29
|
+
|
30
|
+
end
|
31
|
+
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.3.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-08"
|
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,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
"Rakefile",
|
28
28
|
"VERSION",
|
29
29
|
"lib/ranges_merger.rb",
|
30
|
+
"lib/ranges_merger/ranges_merger_divider.rb",
|
30
31
|
"lib/ranges_merger/ranges_merger_exclusion.rb",
|
31
32
|
"lib/ranges_merger/ranges_merger_merging.rb",
|
32
33
|
"lib/ranges_merger/ranges_merger_utils.rb",
|
data/spec/ranges_merger_spec.rb
CHANGED
@@ -278,4 +278,73 @@ describe "RangesMerger" do
|
|
278
278
|
r.to_array.should == [[-2, 3], [5, 20], [30, 50]]
|
279
279
|
end
|
280
280
|
|
281
|
+
# Dividing
|
282
|
+
|
283
|
+
it "should divide simple range" do
|
284
|
+
r = RangesMerger.new
|
285
|
+
r += [[10, 50]]
|
286
|
+
#result = r.divide(5)
|
287
|
+
result = r / 5
|
288
|
+
result.should == [[10, 15], [15, 20], [20, 25], [25, 30], [30, 35], [35, 40], [40, 45], [45, 50]]
|
289
|
+
|
290
|
+
result = r % 5
|
291
|
+
result.should == [[10, 15], [15, 20], [20, 25], [25, 30], [30, 35], [35, 40], [40, 45], [45, 50]]
|
292
|
+
end
|
293
|
+
|
294
|
+
it "should divide simple range with partials and without" do
|
295
|
+
r = RangesMerger.new
|
296
|
+
r += [[1, 9]]
|
297
|
+
result = r % 3
|
298
|
+
result.should == [[1, 4], [4, 7]]
|
299
|
+
result = r / 3
|
300
|
+
result.should == [[1, 4], [4, 7], [7, 9]]
|
301
|
+
end
|
302
|
+
|
303
|
+
it "should divide simple range with partials and without" do
|
304
|
+
r = RangesMerger.new
|
305
|
+
r += [[1, 2], [3, 5], [6, 9]]
|
306
|
+
result = r % 2
|
307
|
+
result.should == [[3, 5], [6, 8]]
|
308
|
+
result = r / 2
|
309
|
+
result.should == [[1, 2], [3, 5], [6, 8], [8, 9]]
|
310
|
+
end
|
311
|
+
|
312
|
+
it "should merge Time ranges" do
|
313
|
+
t_now = Time.now
|
314
|
+
|
315
|
+
r = RangesMerger.new
|
316
|
+
r += [[t_now - 2*3600, t_now - 0*3600]]
|
317
|
+
r += [[t_now - 3*3600, t_now - 1.3600]]
|
318
|
+
|
319
|
+
result = r.to_array
|
320
|
+
(result[0][1] - result[0][0]).should == 3*3600
|
321
|
+
|
322
|
+
r -= [[t_now - 2*3600, t_now - 1*3600]]
|
323
|
+
|
324
|
+
result = r.to_array
|
325
|
+
result.should == [
|
326
|
+
[t_now - 3*3600, t_now - 2*3600],
|
327
|
+
[t_now - 1*3600, t_now - 0*3600]
|
328
|
+
]
|
329
|
+
|
330
|
+
result = r / (10*60)
|
331
|
+
result.size.should == 12
|
332
|
+
(result.first[1] - result.first[0]).should == 10*60
|
333
|
+
end
|
334
|
+
|
335
|
+
it "should divide simple Time ranges" do
|
336
|
+
t_now = Time.now
|
337
|
+
r = RangesMerger.new
|
338
|
+
r += [[t_now - 1*3600, t_now - 1*3600 + 45*60]]
|
339
|
+
|
340
|
+
result = r / (10*60)
|
341
|
+
result.size.should == 5
|
342
|
+
(result.last[1] - result.last[0]).should == 5*60
|
343
|
+
|
344
|
+
result = r % (10*60)
|
345
|
+
result.size.should == 4
|
346
|
+
(result.last[1] - result.last[0]).should == 10*60
|
347
|
+
end
|
348
|
+
|
349
|
+
|
281
350
|
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.3.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-08 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &90032930 !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: *90032930
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
27
|
-
requirement: &
|
27
|
+
requirement: &90032640 !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: *90032640
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: jeweler
|
38
|
-
requirement: &
|
38
|
+
requirement: &90032340 !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: *90032340
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rcov
|
49
|
-
requirement: &
|
49
|
+
requirement: &90032040 !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: *90032040
|
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,7 @@ files:
|
|
74
74
|
- Rakefile
|
75
75
|
- VERSION
|
76
76
|
- lib/ranges_merger.rb
|
77
|
+
- lib/ranges_merger/ranges_merger_divider.rb
|
77
78
|
- lib/ranges_merger/ranges_merger_exclusion.rb
|
78
79
|
- lib/ranges_merger/ranges_merger_merging.rb
|
79
80
|
- lib/ranges_merger/ranges_merger_utils.rb
|
@@ -95,7 +96,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
95
96
|
version: '0'
|
96
97
|
segments:
|
97
98
|
- 0
|
98
|
-
hash:
|
99
|
+
hash: 29790049
|
99
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
101
|
none: false
|
101
102
|
requirements:
|