module VersionParser

Public Class Methods

parse(versionstring) click to toggle source
# File lib/semver_dialects/semantic_version/version_parser.rb, line 5
def self.parse(versionstring)
  if (versionstring == "=*")
    # special case = All Versions
    return VersionInterval.new(IntervalType::LEFT_OPEN | IntervalType::RIGHT_OPEN, BelowAll.new(), AboveAll.new())
  end

  version_items = versionstring.split(" ")
  interval = VersionInterval.new(IntervalType::LEFT_OPEN | IntervalType::RIGHT_OPEN, BelowAll.new(), AboveAll.new())
  version_items.each do
    |version_item|
    matches = version_item.match /(?<op>[><=]+) *(?<version>[a-zA-Z0-9\-_\.\*]+)/
    version_string = matches[:version]
    case matches[:op]
    when ">="
      new_interval = VersionInterval.new(IntervalType::LEFT_CLOSED | IntervalType::RIGHT_OPEN, VersionCut.new(version_string), AboveAll.new())
      interval = interval.intersect(new_interval)
    when "<="
      new_interval = VersionInterval.new(IntervalType::LEFT_OPEN | IntervalType::RIGHT_CLOSED, BelowAll.new(), VersionCut.new(version_string))
      interval = interval.intersect(new_interval)
    when "<"
      new_interval = VersionInterval.new(IntervalType::LEFT_OPEN | IntervalType::RIGHT_OPEN, BelowAll.new(), VersionCut.new(version_string))
      interval = interval.intersect(new_interval)
    when ">"
      new_interval = VersionInterval.new(IntervalType::LEFT_OPEN | IntervalType::RIGHT_OPEN, VersionCut.new(version_string), AboveAll.new())
      interval = interval.intersect(new_interval)
    when "=", "=="
      new_interval = VersionInterval.new(IntervalType::LEFT_CLOSED | IntervalType::RIGHT_CLOSED, VersionCut.new(version_string), VersionCut.new(version_string))
      interval = interval.intersect(new_interval)
    end
  end
  interval
end