зеркало из https://github.com/github/ruby.git
159 строки
3.2 KiB
Ruby
159 строки
3.2 KiB
Ruby
|
#--
|
||
|
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
|
||
|
# All rights reserved.
|
||
|
# See LICENSE.txt for permissions.
|
||
|
#++
|
||
|
|
||
|
require 'rubygems'
|
||
|
|
||
|
##
|
||
|
# The Version class processes string versions into comparable values
|
||
|
class Gem::Version
|
||
|
|
||
|
include Comparable
|
||
|
|
||
|
attr_reader :ints
|
||
|
|
||
|
attr_reader :version
|
||
|
|
||
|
##
|
||
|
# Checks if version string is valid format
|
||
|
#
|
||
|
# str:: [String] the version string
|
||
|
# return:: [Boolean] true if the string format is correct, otherwise false
|
||
|
#
|
||
|
def self.correct?(version)
|
||
|
case version
|
||
|
when Integer, /\A\s*(\d+(\.\d+)*)*\s*\z/ then true
|
||
|
else false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Factory method to create a Version object. Input may be a Version or a
|
||
|
# String. Intended to simplify client code.
|
||
|
#
|
||
|
# ver1 = Version.create('1.3.17') # -> (Version object)
|
||
|
# ver2 = Version.create(ver1) # -> (ver1)
|
||
|
# ver3 = Version.create(nil) # -> nil
|
||
|
#
|
||
|
def self.create(input)
|
||
|
if input.respond_to? :version then
|
||
|
input
|
||
|
elsif input.nil? then
|
||
|
nil
|
||
|
else
|
||
|
new input
|
||
|
end
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Constructs a version from the supplied string
|
||
|
#
|
||
|
# version:: [String] The version string. Format is digit.digit...
|
||
|
#
|
||
|
def initialize(version)
|
||
|
raise ArgumentError, "Malformed version number string #{version}" unless
|
||
|
self.class.correct?(version)
|
||
|
|
||
|
self.version = version
|
||
|
end
|
||
|
|
||
|
def inspect # :nodoc:
|
||
|
"#<#{self.class} #{@version.inspect}>"
|
||
|
end
|
||
|
|
||
|
# Dump only the raw version string, not the complete object
|
||
|
def marshal_dump
|
||
|
[@version]
|
||
|
end
|
||
|
|
||
|
# Load custom marshal format
|
||
|
def marshal_load(array)
|
||
|
self.version = array[0]
|
||
|
end
|
||
|
|
||
|
# Strip ignored trailing zeros.
|
||
|
def normalize
|
||
|
@ints = @version.to_s.scan(/\d+/).map { |s| s.to_i }
|
||
|
|
||
|
return if @ints.length == 1
|
||
|
|
||
|
@ints.pop while @ints.last == 0
|
||
|
|
||
|
@ints = [0] if @ints.empty?
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Returns the text representation of the version
|
||
|
#
|
||
|
# return:: [String] version as string
|
||
|
#
|
||
|
def to_s
|
||
|
@version
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Convert version to integer array
|
||
|
#
|
||
|
# return:: [Array] list of integers
|
||
|
#
|
||
|
def to_ints
|
||
|
normalize unless @ints
|
||
|
@ints
|
||
|
end
|
||
|
|
||
|
def to_yaml_properties
|
||
|
['@version']
|
||
|
end
|
||
|
|
||
|
def version=(version)
|
||
|
@version = version.to_s.strip
|
||
|
normalize
|
||
|
end
|
||
|
|
||
|
def yaml_initialize(tag, values)
|
||
|
self.version = values['version']
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Compares two versions
|
||
|
#
|
||
|
# other:: [Version or .ints] other version to compare to
|
||
|
# return:: [Fixnum] -1, 0, 1
|
||
|
#
|
||
|
def <=>(other)
|
||
|
return 1 unless other
|
||
|
@ints <=> other.ints
|
||
|
end
|
||
|
|
||
|
def hash
|
||
|
to_ints.inject { |hash_code, n| hash_code + n }
|
||
|
end
|
||
|
|
||
|
# Return a new version object where the next to the last revision
|
||
|
# number is one greater. (e.g. 5.3.1 => 5.4)
|
||
|
def bump
|
||
|
ints = @ints.dup
|
||
|
ints.pop if ints.size > 1
|
||
|
ints[-1] += 1
|
||
|
self.class.new(ints.join("."))
|
||
|
end
|
||
|
|
||
|
#:stopdoc:
|
||
|
|
||
|
require 'rubygems/requirement'
|
||
|
|
||
|
# Gem::Requirement's original definition is nested in Version.
|
||
|
# Although an inappropriate place, current gems specs reference the nested
|
||
|
# class name explicitly. To remain compatible with old software loading
|
||
|
# gemspecs, we leave a copy of original definition in Version, but define an
|
||
|
# alias Gem::Requirement for use everywhere else.
|
||
|
|
||
|
Requirement = ::Gem::Requirement
|
||
|
|
||
|
# :startdoc:
|
||
|
|
||
|
end
|
||
|
|