Sha256: aca4050e2202273dc0388038871f67baa75bd6c1992c5a0fc8435fbd6cf20aa6

Contents?: true

Size: 1.42 KB

Versions: 19

Compression:

Stored size: 1.42 KB

Contents

# frozen_string_literal: true
class Version
  InvalidVersion = Class.new(ArgumentError)
  InvalidRequire = Class.new(ArgumentError)

  MSGS = {
    version: 'Unable to parse version: %p',
    require: 'Unable to parse requirement: %p',
  }

  VERSION = /^(\d+)(?:\.(\d+))?(?:\.(\d+))?$/
  REQUIRE = /^(~>|>|>=|=|!=|<=|<) (\d+(?:\.\d+)?(?:\.\d+)?)$/

  include Comparable

  def initialize(str)
    @nums = split(str) || raise(InvalidVersion, MSGS[:version] % str)
  end

  def satisfies?(str)
    send *parse(str) || raise(InvalidRequire, MSGS[:require] % str)
  end

  def size
    nums.size
  end

  def to_a
    nums
  end

  def to_s
    nums.join('.')
  end

  def ==(other)
    trunc(other.size).to_a == other.to_a
  end

  def !=(other)
    trunc(other.size).to_a != other.to_a
  end

  def <=>(other)
    to_a <=> other.to_a
  end

  define_method :'~>' do |min|
    min = min.trunc(nums.size)
    max = min.clone.bump
    self >= min && self < max
  end

  def bump
    ix = nums[1] ? -2 : -1
    nums[ix] = nums[ix] + 1
    nums[-1] = nums[-1] = 0 if nums[1]
    self
  end

  def trunc(size)
    @nums = nums[0..size - 1]
    self
  end

  def clone
    Version.new(to_s)
  end

  private

    attr_reader :nums

    def split(str)
      str =~ VERSION && [$1, $2, $3].compact.map(&:to_i)
    end

    def parse(str)
      op, version = str =~ REQUIRE && [$1, $2]
      op = '==' if op == '='
      [op, Version.new(version)] if op
    end
end

Version data entries

19 entries across 19 versions & 1 rubygems

Version Path
dpl-2.0.3.beta.4 lib/dpl/support/version.rb
dpl-2.0.3.beta.3 lib/dpl/support/version.rb
dpl-2.0.3.beta.2 lib/dpl/support/version.rb
dpl-2.0.3.beta.1 lib/dpl/support/version.rb
dpl-2.0.2.beta.1 lib/dpl/support/version.rb
dpl-2.0.0.beta.3 lib/dpl/support/version.rb
dpl-2.0.0.beta.2 lib/dpl/support/version.rb
dpl-2.0.0.alpha.14 lib/dpl/support/version.rb
dpl-2.0.0.alpha.13 lib/dpl/support/version.rb
dpl-2.0.0.alpha.12 lib/dpl/support/version.rb
dpl-2.0.0.alpha.11 lib/dpl/support/version.rb
dpl-2.0.0.alpha.10 lib/dpl/support/version.rb
dpl-2.0.0.alpha.9 lib/dpl/support/version.rb
dpl-2.0.0.alpha.8 lib/dpl/support/version.rb
dpl-2.0.0.alpha.7 lib/dpl/support/version.rb
dpl-2.0.0.alpha.6 lib/dpl/support/version.rb
dpl-2.0.0.alpha.5 lib/dpl/support/version.rb
dpl-2.0.0.alpha.2 lib/dpl/support/version.rb
dpl-2.0.0.alpha.1 lib/dpl/support/version.rb