# File lib/r10k/semver.rb, line 26
  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