summaryrefslogtreecommitdiff
path: root/lib/rubygems/version.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/version.rb')
-rw-r--r--lib/rubygems/version.rb158
1 files changed, 158 insertions, 0 deletions
diff --git a/lib/rubygems/version.rb b/lib/rubygems/version.rb
new file mode 100644
index 0000000000..35dd60a74a
--- /dev/null
+++ b/lib/rubygems/version.rb
@@ -0,0 +1,158 @@
+#--
+# 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
+