Sha256: 97a2adbab4b21ad64e05026cf7927ccc5bf35007bca3f06e925efdb126ae953c

Contents?: true

Size: 1.92 KB

Versions: 28

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

28 entries across 28 versions & 1 rubygems

Version Path
puppet-8.10.0 lib/puppet/util/package/version/range.rb
puppet-8.10.0-x86-mingw32 lib/puppet/util/package/version/range.rb
puppet-8.10.0-x64-mingw32 lib/puppet/util/package/version/range.rb
puppet-8.10.0-universal-darwin lib/puppet/util/package/version/range.rb
puppet-8.9.0 lib/puppet/util/package/version/range.rb
puppet-8.9.0-x86-mingw32 lib/puppet/util/package/version/range.rb
puppet-8.9.0-x64-mingw32 lib/puppet/util/package/version/range.rb
puppet-8.9.0-universal-darwin lib/puppet/util/package/version/range.rb
puppet-8.8.1 lib/puppet/util/package/version/range.rb
puppet-8.8.1-x86-mingw32 lib/puppet/util/package/version/range.rb
puppet-8.8.1-x64-mingw32 lib/puppet/util/package/version/range.rb
puppet-8.8.1-universal-darwin lib/puppet/util/package/version/range.rb
puppet-8.7.0 lib/puppet/util/package/version/range.rb
puppet-8.7.0-x86-mingw32 lib/puppet/util/package/version/range.rb
puppet-8.7.0-x64-mingw32 lib/puppet/util/package/version/range.rb
puppet-8.7.0-universal-darwin lib/puppet/util/package/version/range.rb
puppet-8.6.0 lib/puppet/util/package/version/range.rb
puppet-8.6.0-x86-mingw32 lib/puppet/util/package/version/range.rb
puppet-8.6.0-x64-mingw32 lib/puppet/util/package/version/range.rb
puppet-8.6.0-universal-darwin lib/puppet/util/package/version/range.rb