def self.[](range)
range.gsub(/([><=])\s+/, '\1').split(/\b\s+(?!-)/).map do |r|
case r
when SemVer::VERSION
SemVer.new(pre(r)) .. SemVer.new(r)
when SemVer::SIMPLE_RANGE
r += ".0" unless SemVer.valid?(r.gsub(/x/i, '0'))
SemVer.new(r.gsub(/x/i, '0'))...SemVer.new(r.gsub(/(\d+)\.x/i) { "#{$1.to_i + 1}.0" } + '-')
when /\s+-\s+/
a, b = r.split(/\s+-\s+/)
SemVer.new(pre(a)) .. SemVer.new(b)
when /^~/
ver = r.sub(/~/, '').split('.').map(&:to_i)
start = (ver + [0] * (3 - ver.length)).join('.')
ver.pop unless ver.length == 1
ver[-1] = ver.last + 1
finish = (ver + [0] * (3 - ver.length)).join('.')
SemVer.new(pre(start)) ... SemVer.new(pre(finish))
when /^>=/
ver = r.sub(/^>=/, '')
SemVer.new(pre(ver)) .. SemVer::MAX
when /^<=/
ver = r.sub(/^<=/, '')
SemVer::MIN .. SemVer.new(ver)
when /^>/
if r =~ /-/
ver = [r[1..-1]]
else
ver = r.sub(/^>/, '').split('.').map(&:to_i)
ver[2] = ver.last + 1
end
SemVer.new(ver.join('.') + '-') .. SemVer::MAX
when /^</
ver = r.sub(/^</, '')
SemVer::MIN ... SemVer.new(pre(ver))
else
(1..1)
end
end.inject { |a,e| a & e }
end