range_utils 1.3.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +52 -0
- data/.rubocop.yml +6 -0
- data/.travis.yml +12 -7
- data/Gemfile +1 -8
- data/Rakefile +5 -45
- data/lib/range_utils.rb +37 -21
- data/lib/range_utils/version.rb +3 -0
- data/range_utils.gemspec +28 -53
- data/spec/range_utils_spec.rb +46 -33
- metadata +30 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85078670a20334ec867fb53aaa706fa53d4bfef4
|
4
|
+
data.tar.gz: 19121fbdf103146ff2271ce90265ddf86ffeae07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7aa69429c19cf30d4f4cb25613d1f04bbbd00979e6e9bf059f56bb921b4b8082e54709bd95a50c03a74a5bef1917e649302dfbc193cef61135c56ecb341348e
|
7
|
+
data.tar.gz: e040585e49fa1cb58817c72dd235be15b6e3fb40bc77051da28efdf63ffa4366da2dd412578af14504b1b7207fb12874cac1f9d77be03f9823da0705a701ee6a
|
data/.gitignore
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# rcov generated
|
2
|
+
coverage
|
3
|
+
coverage.data
|
4
|
+
|
5
|
+
.ruby-version
|
6
|
+
|
7
|
+
# rdoc generated
|
8
|
+
rdoc
|
9
|
+
|
10
|
+
# yard generated
|
11
|
+
doc
|
12
|
+
.yardoc
|
13
|
+
|
14
|
+
# bundler
|
15
|
+
.bundle
|
16
|
+
Gemfile.lock
|
17
|
+
|
18
|
+
# jeweler generated
|
19
|
+
pkg
|
20
|
+
|
21
|
+
# Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
|
22
|
+
#
|
23
|
+
# * Create a file at ~/.gitignore
|
24
|
+
# * Include files you want ignored
|
25
|
+
# * Run: git config --global core.excludesfile ~/.gitignore
|
26
|
+
#
|
27
|
+
# After doing this, these files will be ignored in all your git projects,
|
28
|
+
# saving you from having to 'pollute' every project you touch with them
|
29
|
+
#
|
30
|
+
# Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
|
31
|
+
#
|
32
|
+
# For MacOS:
|
33
|
+
#
|
34
|
+
#.DS_Store
|
35
|
+
|
36
|
+
# For TextMate
|
37
|
+
#*.tmproj
|
38
|
+
#tmtags
|
39
|
+
|
40
|
+
# For emacs:
|
41
|
+
#*~
|
42
|
+
#\#*
|
43
|
+
#.\#*
|
44
|
+
|
45
|
+
# For vim:
|
46
|
+
#*.swp
|
47
|
+
|
48
|
+
# For redcar:
|
49
|
+
#.redcar
|
50
|
+
|
51
|
+
# For rubinius:
|
52
|
+
#*.rbc
|
data/.rubocop.yml
ADDED
data/.travis.yml
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
rvm:
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
- 2.1
|
3
|
+
- 2.2.10
|
4
|
+
- 2.3.7
|
5
|
+
- 2.4.4
|
6
|
+
- 2.5.1
|
7
|
+
- jruby-9.0
|
8
8
|
sudo: false
|
9
|
-
cache: bundler
|
9
|
+
cache: bundler
|
10
|
+
matrix:
|
11
|
+
allow_failures:
|
12
|
+
- rvm: jruby-9.0
|
13
|
+
script:
|
14
|
+
- bundle exec rake
|
data/Gemfile
CHANGED
@@ -1,10 +1,3 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
|
4
|
-
# Include everything needed to run rake, tests, features, etc.
|
5
|
-
group :development do
|
6
|
-
gem "rspec", "~> 3.0"
|
7
|
-
gem "rdoc", "~> 3.12"
|
8
|
-
gem "bundler", "~> 1.0"
|
9
|
-
gem "jeweler"
|
10
|
-
end
|
3
|
+
gemspec
|
data/Rakefile
CHANGED
@@ -1,47 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'bundler'
|
5
|
-
begin
|
6
|
-
Bundler.setup(:default, :development)
|
7
|
-
rescue Bundler::BundlerError => e
|
8
|
-
$stderr.puts e.message
|
9
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
-
exit e.status_code
|
11
|
-
end
|
12
|
-
require 'rake'
|
13
|
-
|
14
|
-
require File.dirname(__FILE__) + '/lib/range_utils'
|
15
|
-
|
16
|
-
require 'jeweler'
|
17
|
-
Jeweler::Tasks.new do |gem|
|
18
|
-
# gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
|
19
|
-
gem.version = RangeUtils::VERSION
|
20
|
-
gem.name = "range_utils"
|
21
|
-
gem.homepage = "http://github.com/julik/range_utils"
|
22
|
-
gem.license = "MIT"
|
23
|
-
gem.description = %Q{There is a whole range of things you can do with a Range}
|
24
|
-
gem.summary = %Q{Range splice, split and other niceties}
|
25
|
-
gem.email = "me@julik.nl"
|
26
|
-
gem.authors = ["Julik Tarkhanov"]
|
27
|
-
# dependencies defined in Gemfile
|
28
|
-
end
|
29
|
-
Jeweler::RubygemsDotOrgTasks.new
|
30
|
-
|
31
|
-
require 'rspec/core'
|
1
|
+
require 'bundler/gem_tasks'
|
32
2
|
require 'rspec/core/rake_task'
|
33
|
-
|
34
|
-
spec.pattern = FileList['spec/**/*_spec.rb']
|
35
|
-
end
|
36
|
-
|
37
|
-
task :default => :spec
|
38
|
-
|
39
|
-
require 'rdoc/task'
|
40
|
-
Rake::RDocTask.new do |rdoc|
|
41
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
3
|
+
require 'rubocop/rake_task'
|
42
4
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
47
|
-
end
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
RuboCop::RakeTask.new(:rubocop)
|
7
|
+
task default: [:spec, :rubocop]
|
data/lib/range_utils.rb
CHANGED
@@ -1,25 +1,24 @@
|
|
1
1
|
module RangeUtils
|
2
|
-
|
3
|
-
|
2
|
+
require_relative 'range_utils/version'
|
3
|
+
|
4
4
|
NegativeRangeSpan = Class.new(ArgumentError)
|
5
|
-
|
5
|
+
|
6
6
|
# Tells whether the +item+ is included in the +range+, without enumerating
|
7
7
|
# through the +range+ (performing a quick bounds check).
|
8
8
|
# The first value of the range and the +item+ have to support +<=>+
|
9
9
|
def range_includes_item?(range, item)
|
10
10
|
range.begin <= item && item <= range.end
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
# Splits the given Range into subranges of +size+.
|
14
14
|
#
|
15
15
|
# split_range_into_subranges_of(0..7, 3) #=> [0..2, 3..5, 5..7]
|
16
|
-
#
|
17
|
-
# Range members must support +<=>+ and
|
16
|
+
#
|
17
|
+
# Range members must support +<=>+ and arithmetic with integers.
|
18
18
|
# +size+ has to be > 0.
|
19
19
|
def split_range_into_subranges_of(range, size)
|
20
20
|
raise ArgumentError, "Chunk size should be > 0, was #{size}" unless size > 0
|
21
|
-
|
22
|
-
num_values = range.end - range.begin + 1
|
21
|
+
|
23
22
|
ranges = []
|
24
23
|
at = range.begin
|
25
24
|
loop do
|
@@ -34,7 +33,7 @@ module RangeUtils
|
|
34
33
|
end
|
35
34
|
end
|
36
35
|
end
|
37
|
-
|
36
|
+
|
38
37
|
# Returns ranges for the given size. The returned ranges start at zero.
|
39
38
|
# Can be used to split a Content-Length of an HTTP resource into
|
40
39
|
# ranges usable in Range: header for instance.
|
@@ -44,14 +43,14 @@ module RangeUtils
|
|
44
43
|
#
|
45
44
|
# ranges_of_offfsets_for_size(3, 1) #=> [0..0, 1..1, 2..2]
|
46
45
|
# ranges_of_offfsets_for_size(3, 2) #=> [0..1, 2..2]
|
47
|
-
#
|
48
|
-
# Range members must support +<=>+ and
|
46
|
+
#
|
47
|
+
# Range members must support +<=>+ and arithmetic with integers.
|
49
48
|
# +size+ has to be > 0.
|
50
49
|
def ranges_of_offfsets_for_size(number_of_items, chunk_size)
|
51
50
|
raise ArgumentError, "Chunk size should be > 0, was #{chunk_size}" unless chunk_size > 0
|
52
51
|
split_range_into_subranges_of(range_for_size_of(number_of_items), chunk_size)
|
53
52
|
end
|
54
|
-
|
53
|
+
|
55
54
|
# Creates a Range that can be used to grab N first elements from, say,
|
56
55
|
# an Array or a String.
|
57
56
|
# range_for_size(14) #=> 0..13
|
@@ -63,19 +62,20 @@ module RangeUtils
|
|
63
62
|
raise ArgumentError, "Number of items should be at least 0, was #{number_of_items}" if number_of_items < 0
|
64
63
|
(0..(number_of_items - 1))
|
65
64
|
end
|
66
|
-
|
65
|
+
|
67
66
|
# Combine ranges with adjacent or overlapping values (create a union range).
|
68
67
|
# splice([0..0, 0..4, 5..14, 16..20]) #=> [0..14, 16..20]
|
69
|
-
# Range members must support +<=>+ and
|
68
|
+
# Range members must support +<=>+ and arithmetic with integers.
|
70
69
|
def splice(ranges)
|
71
|
-
ranges.sort_by(&:begin).inject([]) do |
|
70
|
+
ranges.sort_by(&:begin).inject([]) do |spliced, r|
|
72
71
|
if spliced.empty?
|
73
72
|
spliced + [r]
|
74
73
|
else
|
75
74
|
last = spliced.pop
|
76
75
|
if last.end >= (r.begin - 1)
|
77
76
|
ends = [last.end, last.begin, r.begin, r.end].sort
|
78
|
-
new_end
|
77
|
+
new_end = ends.shift
|
78
|
+
new_begin = ends.pop
|
79
79
|
spliced + [(new_end..new_begin)]
|
80
80
|
else
|
81
81
|
spliced + [last, r]
|
@@ -83,17 +83,17 @@ module RangeUtils
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
# Returns the number of members of the given Range.
|
88
88
|
# size_from_range(0..0) #=> 1
|
89
89
|
# size_from_range(12..123) #=> 112
|
90
|
-
# Range members must support
|
90
|
+
# Range members must support arithmetic with integers.
|
91
91
|
def size_from_range(range)
|
92
92
|
size = range.end - range.begin + 1
|
93
93
|
raise NegativeRangeSpan, "The resulting size for range #{range} is negative" if size < 0
|
94
94
|
size
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
# Take N items from the range, and return two Ranges
|
98
98
|
# the first being the range containing N items requested,
|
99
99
|
# and the other containing the remainder
|
@@ -103,13 +103,29 @@ module RangeUtils
|
|
103
103
|
#
|
104
104
|
# take(4..514, 1024) #=> [4..514, nil]
|
105
105
|
#
|
106
|
-
# Range members and n_items must support
|
106
|
+
# Range members and n_items must support arithmetic with integers
|
107
107
|
def take(from_range, n_items)
|
108
108
|
end_at = from_range.begin + (n_items - 1)
|
109
109
|
return [from_range, nil] if end_at >= from_range.end
|
110
110
|
[from_range.begin..end_at, end_at.succ..from_range.end]
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
|
+
# Returns the intersection of two given Ranges or `nil` if they do not intersect.
|
114
|
+
# Adjacent ranges do not get merged.
|
115
|
+
#
|
116
|
+
# intersection_of(0..456, 26..12889) #=> 26..456
|
117
|
+
# intersection_of(0..456, 7811..12889) #=> nil
|
118
|
+
# intersection_of(0..0, 1..1) #=> nil
|
119
|
+
#
|
120
|
+
# Range members and n_items must support arithmetic with integers
|
121
|
+
def intersection_of(range_a, range_b)
|
122
|
+
range_a, range_b = [range_a, range_b].sort_by(&:begin)
|
123
|
+
return if range_a.end < range_b.begin
|
124
|
+
heads_and_tails = [range_a.begin, range_b.begin, range_a.end, range_b.end].sort
|
125
|
+
middle = heads_and_tails[1..-2]
|
126
|
+
middle[0]..middle[1]
|
127
|
+
end
|
128
|
+
|
113
129
|
alias_method :http_ranges_for_size, :ranges_of_offfsets_for_size
|
114
130
|
extend self
|
115
131
|
end
|
data/range_utils.gemspec
CHANGED
@@ -1,59 +1,34 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: range_utils 1.3.1 ruby lib
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'range_utils/version'
|
6
4
|
|
7
|
-
Gem::Specification.new do |
|
8
|
-
|
9
|
-
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'range_utils'
|
7
|
+
spec.version = RangeUtils::VERSION
|
8
|
+
spec.authors = ['Julik Tarkhanov']
|
9
|
+
spec.email = ['me@julik.nl']
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
s.date = "2015-11-26"
|
15
|
-
s.description = "There is a whole range of things you can do with a Range"
|
16
|
-
s.email = "me@julik.nl"
|
17
|
-
s.extra_rdoc_files = [
|
18
|
-
"LICENSE.txt",
|
19
|
-
"README.md"
|
20
|
-
]
|
21
|
-
s.files = [
|
22
|
-
".document",
|
23
|
-
".rspec",
|
24
|
-
".travis.yml",
|
25
|
-
"Gemfile",
|
26
|
-
"LICENSE.txt",
|
27
|
-
"README.md",
|
28
|
-
"Rakefile",
|
29
|
-
"lib/range_utils.rb",
|
30
|
-
"range_utils.gemspec",
|
31
|
-
"spec/range_utils_spec.rb"
|
32
|
-
]
|
33
|
-
s.homepage = "http://github.com/julik/range_utils"
|
34
|
-
s.licenses = ["MIT"]
|
35
|
-
s.rubygems_version = "2.2.2"
|
36
|
-
s.summary = "Range splice, split and other niceties"
|
11
|
+
spec.description = %q{There is a whole range of things you can do with a Range}
|
12
|
+
spec.summary = %q{Range splice, split and other niceties}
|
13
|
+
spec.homepage = 'http://github.com/wetransfer/range_utils'
|
37
14
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
44
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
45
|
-
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
46
|
-
else
|
47
|
-
s.add_dependency(%q<rspec>, ["~> 3.0"])
|
48
|
-
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
49
|
-
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
50
|
-
s.add_dependency(%q<jeweler>, [">= 0"])
|
51
|
-
end
|
15
|
+
# Prevent pushing this gem to RubyGems.org.
|
16
|
+
# To allow pushes either set the 'allowed_push_host'
|
17
|
+
# To allow pushing to a single host or delete this section to allow pushing to any host.
|
18
|
+
if spec.respond_to?(:metadata)
|
19
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
52
20
|
else
|
53
|
-
|
54
|
-
|
55
|
-
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
56
|
-
s.add_dependency(%q<jeweler>, [">= 0"])
|
21
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
22
|
+
'public gem pushes.'
|
57
23
|
end
|
58
|
-
end
|
59
24
|
|
25
|
+
spec.files = `git ls-files -z`.split("\x0")
|
26
|
+
spec.bindir = 'exe'
|
27
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
+
spec.require_paths = ['lib']
|
29
|
+
|
30
|
+
spec.add_development_dependency 'bundler'
|
31
|
+
spec.add_development_dependency 'rake', '~> 12.2'
|
32
|
+
spec.add_development_dependency 'rspec', '~> 3'
|
33
|
+
spec.add_development_dependency 'wetransfer_style', '0.6.0'
|
34
|
+
end
|
data/spec/range_utils_spec.rb
CHANGED
@@ -3,96 +3,96 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
3
3
|
require 'rspec'
|
4
4
|
require 'range_utils'
|
5
5
|
|
6
|
-
RSpec.configure {|c| c.order = 'random' }
|
6
|
+
RSpec.configure { |c| c.order = 'random' }
|
7
7
|
|
8
8
|
describe "RangeUtils" do
|
9
9
|
let(:subject) { RangeUtils }
|
10
|
-
|
10
|
+
|
11
11
|
context '.range_includes_item?' do
|
12
12
|
it 'properly detects inclusion' do
|
13
13
|
range = 5..98
|
14
14
|
expect(subject.range_includes_item?(range, 5)).to eq(true)
|
15
15
|
expect(subject.range_includes_item?(range, 98)).to eq(true)
|
16
16
|
expect(subject.range_includes_item?(range, 97)).to eq(true)
|
17
|
-
|
17
|
+
|
18
18
|
expect(subject.range_includes_item?(range, 1)).to eq(false)
|
19
19
|
expect(subject.range_includes_item?(range, 4)).to eq(false)
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
context '.split_range_into_subranges_of' do
|
24
24
|
it 'raises an ArgumentError when the size is < 1' do
|
25
25
|
expect {
|
26
26
|
subject.split_range_into_subranges_of(15..456, -2)
|
27
27
|
}.to raise_error(ArgumentError, 'Chunk size should be > 0, was -2')
|
28
|
-
|
28
|
+
|
29
29
|
expect {
|
30
30
|
subject.split_range_into_subranges_of(15..456, 0)
|
31
31
|
}.to raise_error(ArgumentError, 'Chunk size should be > 0, was 0')
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
it 'splits a range into ranges' do
|
35
35
|
expect(subject.split_range_into_subranges_of(0..7, 3)).to eq([0..2, 3..5, 6..7])
|
36
36
|
expect(subject.split_range_into_subranges_of(0..786, 324)).to eq([0..323, 324..647, 648..786])
|
37
37
|
expect(subject.split_range_into_subranges_of(245..786, 324)).to eq([245..568, 569..786])
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
it 'yields each subrange in succession' do
|
41
41
|
expect { |b|
|
42
42
|
subject.split_range_into_subranges_of(0..786, 324, &b)
|
43
43
|
}.to yield_successive_args(0..323, 324..647, 648..786)
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
it 'splits a range that spans 1 item' do
|
47
47
|
expect(subject.split_range_into_subranges_of(0..0, 1)).to eq([0..0])
|
48
48
|
expect(subject.split_range_into_subranges_of(0..0, 15)).to eq([0..0])
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
it 'handles all division cases without raising exceptions' do
|
52
|
-
(1..300).each do |
|
52
|
+
(1..300).each do |chunk_size|
|
53
53
|
subject.split_range_into_subranges_of(0..786, chunk_size)
|
54
54
|
end
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
it 'is usable for HTTP ranges' do
|
58
58
|
bytes_total = 3087
|
59
59
|
chunk_size = 991
|
60
60
|
range = 128..(bytes_total + 128)
|
61
|
-
|
61
|
+
|
62
62
|
ranges = subject.split_range_into_subranges_of(range, chunk_size)
|
63
63
|
expect(ranges).to eq([128..1118, 1119..2109, 2110..3100, 3101..3215])
|
64
64
|
end
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
context '.splice' do
|
68
68
|
it 'splices adjacent and overlapping ranges, regardless of their ordering in the argument array' do
|
69
|
-
expect(
|
70
|
-
expect(
|
71
|
-
expect(
|
69
|
+
expect(subject.splice([500..600, 601..999])).to eq([500..999])
|
70
|
+
expect(subject.splice([601..999, 500..600])).to eq([500..999])
|
71
|
+
expect(subject.splice([500..700, 601..999])).to eq([500..999])
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
it 'creates gaps when the ranges cannot be spliced' do
|
75
|
-
expect(
|
76
|
-
expect(
|
75
|
+
expect(subject.splice([500..600, 602..999])).to eq([500..600, 602..999])
|
76
|
+
expect(subject.splice([601..999, 500..600, 10..44])).to eq([10..44, 500..999])
|
77
77
|
end
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
context '.ranges_of_offfsets_for_size' do
|
81
81
|
it 'raises with a size < 1' do
|
82
82
|
expect {
|
83
83
|
subject.ranges_of_offfsets_for_size(3, 0)
|
84
84
|
}.to raise_error(ArgumentError, 'Chunk size should be > 0, was 0')
|
85
|
-
|
85
|
+
|
86
86
|
expect {
|
87
87
|
subject.ranges_of_offfsets_for_size(3, -1)
|
88
88
|
}.to raise_error(ArgumentError, 'Chunk size should be > 0, was -1')
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
it 'creates the ranges that cover the given number of elements' do
|
92
92
|
expect(subject.ranges_of_offfsets_for_size(3, 1)).to eq([0..0, 1..1, 2..2])
|
93
93
|
expect(subject.ranges_of_offfsets_for_size(3, 2)).to eq([0..1, 2..2])
|
94
94
|
end
|
95
|
-
|
95
|
+
|
96
96
|
it 'splits a bigger size' do
|
97
97
|
bytes_total = 3087
|
98
98
|
chunk_size = 991
|
@@ -100,29 +100,29 @@ describe "RangeUtils" do
|
|
100
100
|
expect(ranges).to eq([0..990, 991..1981, 1982..2972, 2973..3086])
|
101
101
|
end
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
context '.range_for_size_of' do
|
105
105
|
it 'raises on size being < 0' do
|
106
106
|
expect {
|
107
107
|
subject.range_for_size_of(-4)
|
108
108
|
}.to raise_error(ArgumentError)
|
109
109
|
end
|
110
|
-
|
110
|
+
|
111
111
|
it 'returns a special range for size 0 case' do
|
112
112
|
expect(subject.range_for_size_of(0)).to eq(0..-1)
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
it 'returns the right range for the size' do
|
116
116
|
expect(subject.range_for_size_of(456)).to eq(0..455)
|
117
117
|
end
|
118
118
|
end
|
119
|
-
|
119
|
+
|
120
120
|
context '.http_ranges_for_resource_size' do
|
121
121
|
it 'get returned without including the last value' do
|
122
122
|
expect(subject.http_ranges_for_size(785, 324)).to eq([0..323, 324..647, 648..784])
|
123
123
|
end
|
124
124
|
end
|
125
|
-
|
125
|
+
|
126
126
|
context '.take' do
|
127
127
|
it 'returns the first range and the remainder' do
|
128
128
|
first, remainder = subject.take(0..12, 3)
|
@@ -131,29 +131,42 @@ describe "RangeUtils" do
|
|
131
131
|
expect(remainder).to eq(3..12)
|
132
132
|
expect(subject.splice([first, remainder])).to eq([0..12])
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
135
|
it 'returns nil as the remainder if n_items exceeds the whole range' do
|
136
136
|
first, remainder = subject.take(0..12, 15)
|
137
137
|
expect(first).to eq(0..12)
|
138
138
|
expect(remainder).to be_nil
|
139
139
|
end
|
140
|
-
|
140
|
+
|
141
141
|
it 'handles the 0-item remainder range case correctly' do
|
142
142
|
first, remainder = subject.take(0..1, 2)
|
143
143
|
expect(first).to eq(0..1)
|
144
144
|
expect(remainder).to be_nil
|
145
145
|
end
|
146
146
|
end
|
147
|
-
|
147
|
+
|
148
148
|
context '.size_from_range' do
|
149
149
|
it 'raises an ArgumentError when the range goes into negative' do
|
150
|
-
expect{
|
150
|
+
expect {
|
151
151
|
subject.size_from_range(0..-15)
|
152
152
|
}.to raise_error(RangeUtils::NegativeRangeSpan, 'The resulting size for range 0..-15 is negative')
|
153
153
|
end
|
154
|
-
|
154
|
+
|
155
155
|
it 'computes the right size from the given Range' do
|
156
156
|
expect(subject.size_from_range(0..522753)).to eq(522754)
|
157
157
|
end
|
158
158
|
end
|
159
|
+
|
160
|
+
context '.range_intersection_of' do
|
161
|
+
it 'computes range intersections' do
|
162
|
+
expect(RangeUtils.intersection_of(0..123, 456..456)).to be_nil
|
163
|
+
expect(RangeUtils.intersection_of(0..123, 245..245)).to be_nil
|
164
|
+
|
165
|
+
expect(RangeUtils.intersection_of(0..0, 1..1)).to be_nil
|
166
|
+
expect(RangeUtils.intersection_of(0..1, 1..1)).to eq(1..1)
|
167
|
+
|
168
|
+
expect(RangeUtils.intersection_of(15..145859, 85..564)).to eq(85..564)
|
169
|
+
expect(RangeUtils.intersection_of(15..145859, 85..145870)).to eq(85..145859)
|
170
|
+
end
|
171
|
+
end
|
159
172
|
end
|
metadata
CHANGED
@@ -1,93 +1,95 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: range_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julik Tarkhanov
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '12.2'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '12.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: wetransfer_style
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.6.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.6.0
|
69
69
|
description: There is a whole range of things you can do with a Range
|
70
|
-
email:
|
70
|
+
email:
|
71
|
+
- me@julik.nl
|
71
72
|
executables: []
|
72
73
|
extensions: []
|
73
|
-
extra_rdoc_files:
|
74
|
-
- LICENSE.txt
|
75
|
-
- README.md
|
74
|
+
extra_rdoc_files: []
|
76
75
|
files:
|
77
76
|
- ".document"
|
77
|
+
- ".gitignore"
|
78
78
|
- ".rspec"
|
79
|
+
- ".rubocop.yml"
|
79
80
|
- ".travis.yml"
|
80
81
|
- Gemfile
|
81
82
|
- LICENSE.txt
|
82
83
|
- README.md
|
83
84
|
- Rakefile
|
84
85
|
- lib/range_utils.rb
|
86
|
+
- lib/range_utils/version.rb
|
85
87
|
- range_utils.gemspec
|
86
88
|
- spec/range_utils_spec.rb
|
87
|
-
homepage: http://github.com/
|
88
|
-
licenses:
|
89
|
-
|
90
|
-
|
89
|
+
homepage: http://github.com/wetransfer/range_utils
|
90
|
+
licenses: []
|
91
|
+
metadata:
|
92
|
+
allowed_push_host: https://rubygems.org
|
91
93
|
post_install_message:
|
92
94
|
rdoc_options: []
|
93
95
|
require_paths:
|
@@ -104,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
106
|
version: '0'
|
105
107
|
requirements: []
|
106
108
|
rubyforge_project:
|
107
|
-
rubygems_version: 2.
|
109
|
+
rubygems_version: 2.6.11
|
108
110
|
signing_key:
|
109
111
|
specification_version: 4
|
110
112
|
summary: Range splice, split and other niceties
|