Sha256: 37727928675f6f9eed46db32cb503ea6d5d7f83df7a50eabb827b5df9f01fe1b
Contents?: true
Size: 1.92 KB
Versions: 20
Compression:
Stored size: 1.92 KB
Contents
# frozen_string_literal: true require_relative 'range/lt' require_relative 'range/lt_eq' require_relative 'range/gt' require_relative 'range/gt_eq' require_relative 'range/eq' require_relative 'range/min_max' module Puppet::Util::Package::Version class Range class ValidationFailure < ArgumentError; end # Parses a version range string into a comparable {Range} instance. # # Currently parsed version range string may take any of the following # forms: # # * Regular Version strings # * ex. `"1.0.0"`, `"1.2.3-pre"` # * Inequalities # * ex. `">1.0.0"`, `"<3.2.0"`, `">=4.0.0"` # * Range Intersections (min is always first) # * ex. `">1.0.0 <=2.3.0"` # RANGE_SPLIT = /\s+/ FULL_REGEX = /\A((?:[<>=])*)(.+)\Z/ # @param range_string [String] the version range string to parse # @param version_class [Version] a version class implementing comparison operators and parse method # @return [Range] a new {Range} instance # @api public def self.parse(range_string, version_class) raise ValidationFailure, "Unable to parse '#{range_string}' as a string" unless range_string.is_a?(String) simples = range_string.split(RANGE_SPLIT).map do |simple| match, operator, version = *simple.match(FULL_REGEX) raise ValidationFailure, "Unable to parse '#{simple}' as a version range identifier" unless match case operator when '>' Gt.new(version_class::parse(version)) when '>=' GtEq.new(version_class::parse(version)) when '<' Lt.new(version_class::parse(version)) when '<=' LtEq.new(version_class::parse(version)) when '' Eq.new(version_class::parse(version)) else raise ValidationFailure, "Operator '#{operator}' is not implemented" end end simples.size == 1 ? simples[0] : MinMax.new(simples[0], simples[1]) end end end
Version data entries
20 entries across 20 versions & 1 rubygems