summaryrefslogtreecommitdiff
path: root/ruby_1_9_3/lib/rubygems/version.rb
diff options
context:
space:
mode:
Diffstat (limited to 'ruby_1_9_3/lib/rubygems/version.rb')
-rw-r--r--ruby_1_9_3/lib/rubygems/version.rb329
1 files changed, 0 insertions, 329 deletions
diff --git a/ruby_1_9_3/lib/rubygems/version.rb b/ruby_1_9_3/lib/rubygems/version.rb
deleted file mode 100644
index 2ced9ccdfb..0000000000
--- a/ruby_1_9_3/lib/rubygems/version.rb
+++ /dev/null
@@ -1,329 +0,0 @@
-##
-# The Version class processes string versions into comparable
-# values. A version string should normally be a series of numbers
-# separated by periods. Each part (digits separated by periods) is
-# considered its own number, and these are used for sorting. So for
-# instance, 3.10 sorts higher than 3.2 because ten is greater than
-# two.
-#
-# If any part contains letters (currently only a-z are supported) then
-# that version is considered prerelease. Versions with a prerelease
-# part in the Nth part sort less than versions with N-1
-# parts. Prerelease parts are sorted alphabetically using the normal
-# Ruby string sorting rules. If a prerelease part contains both
-# letters and numbers, it will be broken into multiple parts to
-# provide expected sort behavior (1.0.a10 becomes 1.0.a.10, and is
-# greater than 1.0.a9).
-#
-# Prereleases sort between real releases (newest to oldest):
-#
-# 1. 1.0
-# 2. 1.0.b1
-# 3. 1.0.a.2
-# 4. 0.9
-#
-# == How Software Changes
-#
-# Users expect to be able to specify a version constraint that gives them
-# some reasonable expectation that new versions of a library will work with
-# their software if the version constraint is true, and not work with their
-# software if the version constraint is false. In other words, the perfect
-# system will accept all compatible versions of the library and reject all
-# incompatible versions.
-#
-# Libraries change in 3 ways (well, more than 3, but stay focused here!).
-#
-# 1. The change may be an implementation detail only and have no effect on
-# the client software.
-# 2. The change may add new features, but do so in a way that client software
-# written to an earlier version is still compatible.
-# 3. The change may change the public interface of the library in such a way
-# that old software is no longer compatible.
-#
-# Some examples are appropriate at this point. Suppose I have a Stack class
-# that supports a <tt>push</tt> and a <tt>pop</tt> method.
-#
-# === Examples of Category 1 changes:
-#
-# * Switch from an array based implementation to a linked-list based
-# implementation.
-# * Provide an automatic (and transparent) backing store for large stacks.
-#
-# === Examples of Category 2 changes might be:
-#
-# * Add a <tt>depth</tt> method to return the current depth of the stack.
-# * Add a <tt>top</tt> method that returns the current top of stack (without
-# changing the stack).
-# * Change <tt>push</tt> so that it returns the item pushed (previously it
-# had no usable return value).
-#
-# === Examples of Category 3 changes might be:
-#
-# * Changes <tt>pop</tt> so that it no longer returns a value (you must use
-# <tt>top</tt> to get the top of the stack).
-# * Rename the methods to <tt>push_item</tt> and <tt>pop_item</tt>.
-#
-# == RubyGems Rational Versioning
-#
-# * Versions shall be represented by three non-negative integers, separated
-# by periods (e.g. 3.1.4). The first integers is the "major" version
-# number, the second integer is the "minor" version number, and the third
-# integer is the "build" number.
-#
-# * A category 1 change (implementation detail) will increment the build
-# number.
-#
-# * A category 2 change (backwards compatible) will increment the minor
-# version number and reset the build number.
-#
-# * A category 3 change (incompatible) will increment the major build number
-# and reset the minor and build numbers.
-#
-# * Any "public" release of a gem should have a different version. Normally
-# that means incrementing the build number. This means a developer can
-# generate builds all day long for himself, but as soon as he/she makes a
-# public release, the version must be updated.
-#
-# === Examples
-#
-# Let's work through a project lifecycle using our Stack example from above.
-#
-# Version 0.0.1:: The initial Stack class is release.
-# Version 0.0.2:: Switched to a linked=list implementation because it is
-# cooler.
-# Version 0.1.0:: Added a <tt>depth</tt> method.
-# Version 1.0.0:: Added <tt>top</tt> and made <tt>pop</tt> return nil
-# (<tt>pop</tt> used to return the old top item).
-# Version 1.1.0:: <tt>push</tt> now returns the value pushed (it used it
-# return nil).
-# Version 1.1.1:: Fixed a bug in the linked list implementation.
-# Version 1.1.2:: Fixed a bug introduced in the last fix.
-#
-# Client A needs a stack with basic push/pop capability. He writes to the
-# original interface (no <tt>top</tt>), so his version constraint looks
-# like:
-#
-# gem 'stack', '~> 0.0'
-#
-# Essentially, any version is OK with Client A. An incompatible change to
-# the library will cause him grief, but he is willing to take the chance (we
-# call Client A optimistic).
-#
-# Client B is just like Client A except for two things: (1) He uses the
-# <tt>depth</tt> method and (2) he is worried about future
-# incompatibilities, so he writes his version constraint like this:
-#
-# gem 'stack', '~> 0.1'
-#
-# The <tt>depth</tt> method was introduced in version 0.1.0, so that version
-# or anything later is fine, as long as the version stays below version 1.0
-# where incompatibilities are introduced. We call Client B pessimistic
-# because he is worried about incompatible future changes (it is OK to be
-# pessimistic!).
-#
-# == Preventing Version Catastrophe:
-#
-# From: http://blog.zenspider.com/2008/10/rubygems-howto-preventing-cata.html
-#
-# Let's say you're depending on the fnord gem version 2.y.z. If you
-# specify your dependency as ">= 2.0.0" then, you're good, right? What
-# happens if fnord 3.0 comes out and it isn't backwards compatible
-# with 2.y.z? Your stuff will break as a result of using ">=". The
-# better route is to specify your dependency with a "spermy" version
-# specifier. They're a tad confusing, so here is how the dependency
-# specifiers work:
-#
-# Specification From ... To (exclusive)
-# ">= 3.0" 3.0 ... &infin;
-# "~> 3.0" 3.0 ... 4.0
-# "~> 3.0.0" 3.0.0 ... 3.1
-# "~> 3.5" 3.5 ... 4.0
-# "~> 3.5.0" 3.5.0 ... 3.6
-
-class Gem::Version
- autoload :Requirement, 'rubygems/requirement'
-
- include Comparable
-
- VERSION_PATTERN = '[0-9]+(\.[0-9a-zA-Z]+)*' # :nodoc:
- ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})*\s*\z/ # :nodoc:
-
- ##
- # A string representation of this Version.
-
- attr_reader :version
- alias to_s version
-
- ##
- # True if the +version+ string matches RubyGems' requirements.
-
- def self.correct? version
- 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
-
- 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 +version+ string. A version string is a
- # series of digits or ASCII letters separated by dots.
-
- def initialize version
- raise ArgumentError, "Malformed version number string #{version}" unless
- self.class.correct?(version)
-
- @version = version.to_s
- @version.strip!
- 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.
-
- def bump
- segments = self.segments.dup
- 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
-
- ##
- # A Version is only eql? to another version if it's specified to the
- # same precision. Version "1.0" is not the same as version "1".
-
- def eql? other
- self.class === other and @version == other.version
- end
-
- def hash # :nodoc:
- @hash ||= segments.hash
- end
-
- def init_with coder # :nodoc:
- yaml_initialize coder.tag, coder.map
- end
-
- def inspect # :nodoc:
- "#<#{self.class} #{version.inspect}>"
- end
-
- ##
- # Dump only the raw version string, not the complete object. It's a
- # string for backwards (RubyGems 1.3.5 and earlier) compatibility.
-
- def marshal_dump
- [version]
- end
-
- ##
- # Load custom marshal format. It's a string for backwards (RubyGems
- # 1.3.5 and earlier) compatibility.
-
- def marshal_load array
- initialize array[0]
- end
-
- def yaml_initialize(tag, map)
- @version = map['version']
- @segments = nil
- @hash = nil
- end
-
- ##
- # A version is considered a prerelease if it contains a letter.
-
- def prerelease?
- @prerelease ||= @version =~ /[a-zA-Z]/
- end
-
- def pretty_print q # :nodoc:
- q.text "Gem::Version.new(#{version.inspect})"
- end
-
- ##
- # The release for this version (e.g. 1.2.0.a -> 1.2.0).
- # Non-prerelease versions return themselves.
-
- def release
- return self unless prerelease?
-
- segments = self.segments.dup
- segments.pop while segments.any? { |s| String === s }
- self.class.new segments.join('.')
- end
-
- def segments # :nodoc:
-
- # segments is lazy so it can pick up version values that come from
- # old marshaled versions, which don't go through marshal_load.
-
- @segments ||= @version.scan(/[0-9]+|[a-z]+/i).map do |s|
- /^\d+$/ =~ s ? s.to_i : s
- end
- end
-
- ##
- # A recommended version for use with a ~> Requirement.
-
- def spermy_recommendation
- segments = self.segments.dup
-
- segments.pop while segments.any? { |s| String === s }
- segments.pop while segments.size > 2
- segments.push 0 while segments.size < 2
-
- "~> #{segments.join(".")}"
- 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
- # <tt>Gem::Version</tt> return +nil+.
-
- def <=> other
- return unless Gem::Version === other
- return 0 if @version == other.version
-
- lhsegments = segments
- rhsegments = other.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
-end