range_utils 1.3.1 → 2.0.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 +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
|