Object
True if the version
string matches RubyGems' requirements.
# File rubygems/version.rb, line 174 def self.correct?(version) unless Gem::Deprecate.skip warn "nil versions are discouraged and will be deprecated in Rubygems 4" if version.nil? end !!(version.to_s =~ ANCHORED_VERSION_PATTERN) 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
# File rubygems/version.rb, line 190 def self.create(input) if self === input # check yourself before you wreck yourself input elsif input.nil? nil else new input end end
Constructs a Version
from the version
string. A version string is a series of digits or ASCII letters separated by dots.
# File rubygems/version.rb, line 214 def initialize(version) unless self.class.correct?(version) raise ArgumentError, "Malformed version number string #{version}" end # If version is an empty string convert it to 0 version = 0 if version.is_a?(String) && version =~ /\A\s*\Z/ @version = version.to_s.strip.gsub("-",".pre.") @segments = nil end
Compares this version with other
returning -1, 0, or 1 if the other version is larger, the same, or smaller than this one. Attempts to compare to something that's not a Gem::Version
return nil
.
# File rubygems/version.rb, line 346 def <=>(other) return unless Gem::Version === other return 0 if @version == other._version || canonical_segments == other.canonical_segments lhsegments = canonical_segments rhsegments = other.canonical_segments lhsize = lhsegments.size rhsize = rhsegments.size limit = (lhsize > rhsize ? lhsize : rhsize) - 1 i = 0 while i <= limit lhs, rhs = lhsegments[i] || 0, rhsegments[i] || 0 i += 1 next if lhs == rhs return -1 if String === lhs && Numeric === rhs return 1 if Numeric === lhs && String === rhs return lhs <=> rhs end return 0 end
A recommended version for use with a ~> Requirement.
# File rubygems/version.rb, line 328 def approximate_recommendation segments = self.segments segments.pop while segments.any? {|s| String === s } segments.pop while segments.size > 2 segments.push 0 while segments.size < 2 recommendation = "~> #{segments.join(".")}" recommendation += ".a" if prerelease? recommendation end
Return a new version object where the next to the last revision number is one greater (e.g., 5.3.1 => 5.4).
Pre-release (alpha) parts, e.g, 5.3.1.b.2 => 5.4, are ignored.
# File rubygems/version.rb, line 232 def bump @@bump[self] ||= begin segments = self.segments segments.pop while segments.any? {|s| String === s } segments.pop if segments.size > 1 segments[-1] = segments[-1].succ self.class.new segments.join(".") end end
# File rubygems/version.rb, line 373 def canonical_segments @canonical_segments ||= _split_segments.map! do |segments| segments.reverse_each.drop_while {|s| s == 0 }.reverse end.reduce(&:concat) end
# File rubygems/version.rb, line 380 def freeze prerelease? canonical_segments super end
Dump only the raw version string, not the complete object. It's a string for backwards (RubyGems 1.3.5 and earlier) compatibility.
# File rubygems/version.rb, line 267 def marshal_dump [version] end
Load custom marshal format. It's a string for backwards (RubyGems 1.3.5 and earlier) compatibility.
# File rubygems/version.rb, line 275 def marshal_load(array) initialize array[0] end
A version is considered a prerelease if it contains a letter.
# File rubygems/version.rb, line 296 def prerelease? unless instance_variable_defined? :@prerelease @prerelease = !!(@version =~ /[a-zA-Z]/) end @prerelease end
The release for this version (e.g. 1.2.0.a -> 1.2.0). Non-prerelease versions return themselves.
# File rubygems/version.rb, line 311 def release @@release[self] ||= if prerelease? segments = self.segments segments.pop while segments.any? {|s| String === s } self.class.new segments.join('.') else self end end
# File rubygems/version.rb, line 392 def _segments # segments is lazy so it can pick up version values that come from # old marshaled versions, which don't go through marshal_load. # since this version object is cached in @@all, its @segments should be frozen @segments ||= @version.scan(/[0-9]+|[a-z]+/i).map do |s| /^\d+$/ =~ s ? s.to_i : s end.freeze end
# File rubygems/version.rb, line 402 def _split_segments string_start = _segments.index {|s| s.is_a?(String) } string_segments = segments numeric_segments = string_segments.slice!(0, string_start || string_segments.size) return numeric_segments, string_segments end