class Tins::StringVersion::Version
def <=>(other)
def <=>(other) pairs = array.zip(other.array) pairs.map! { |a, b| [ a.to_i, b.to_i ] } a, b = pairs.transpose a <=> b end
def ==(other)
def ==(other) (self <=> other).zero? end
def [](level)
def [](level) array[level_of(level)] end
def []=(level, value)
def []=(level, value) level = level_of(level) value = value.to_i value >= 0 or raise ArgumentError, "version numbers can't contain negative numbers like #{value}" a = array a[level] = value a.map!(&:to_i) @version.replace a * ?. end
def array
def array @version.split(?.).map(&:to_i) end
def bump(level = array.size - 1)
def bump(level = array.size - 1) level = level_of(level) self[level] += 1 for l in level.succ..3 self[l] &&= 0 end self end
def initialize(string)
def initialize(string) string =~ /\A\d+(\.\d+)*\z/ or raise ArgumentError, "#{string.inspect} isn't a version number" @version = string.frozen? ? string.dup : string end
def initialize_copy(source)
def initialize_copy(source) super @version = source.instance_variable_get(:@version).dup end
def level_of(specifier)
def level_of(specifier) if specifier.respond_to?(:to_sym) LEVELS.fetch(specifier) else specifier end end
def pred!
def pred! self[-1] -= 1 self end
def succ!
def succ! self[-1] += 1 self end
def to_s
def to_s @version end