Class Version
In: lib/version.rb
Parent: Object
Copyright:Copyright (c) 2004 Nicolas Despres. All rights reserved.
Author:Nicolas Despres <polrop@lrde.epita.fr>.
License:Gnu General Public License.
Revision:$Id: /w/fey/ruby_ex/trunk/core_ex/lib/version.rb 22439 2006-03-11T15:45:50.050946Z pouillar $

Methods

Included Modules

Comparable

Classes and Modules

Module Version::ShortCut
Class Version::Tag

Attributes

category  [RW] 
major  [RW] 
minor  [RW] 
name  [RW] 
release_name  [RW] 
tag  [RW] 

Public Class methods

protected :major=, :minor=, :tag=,

          :category=, :name=, :release_name=

[Source]

# File lib/version.rb, line 15
  def initialize ( major, minor, tag=nil, tag_offset=nil,
                   category=nil, name=nil, release_name=nil )
    @major    = major
    @minor    = minor
    @tag      = Tag[tag || :off, tag_offset || 0]
    if @tag.offset.zero?
      case @tag.name
      when :p then raise ArgumentError, 'The patch level tag (p) needs an offset'
      when :r then raise ArgumentError, 'The revision tag (r) needs an offset'
      end
    elsif @tag.name == :off
      raise ArgumentError, 'The official release tag (off) cannot have an offset'
    end
    @category = category || ''
    @name     = name || ''
    @release_name = release_name || ''
  end

[Source]

# File lib/version.rb, line 33
  def self.parse ( str )
    re_cat_name = /([\w-]+\/)?([\w-]+)/
    re_tag = /_(r|alpha|beta|pre|rc|off|p)(\d*)/
    unless str =~ /^(#{re_cat_name}-)?([\d.]+)(#{re_tag})?(#.*)?$/
      raise ArgumentError, "Cannot parse your version: #{str}"
    end
    category, name, head, _, tag, offset, release_name = Regexp.last_match[2..8]
    parts = head.split('.').map { |x| x.to_i }
    raise ArgumentError, "Too many parts: #{head}" if parts.size > 2
    major, minor = parts

    # Remove now useless chars (/, #)
    category[-1]    = '' if category
    release_name[0] = '' if release_name

    tag = (tag.nil?)? :off : tag.to_sym
    new(major || 0, minor || 0, tag, offset.to_i,
        category || '', name || '', release_name || '')
  end

[Source]

# File lib/version.rb, line 53
  def self.yaml_new( klass, tag, val )
    parse val
  end

Public Instance methods

[Source]

# File lib/version.rb, line 57
  def <=>(other)
    category_cmp = @category <=> other.category
    return category_cmp unless category_cmp.zero?

    name_cmp = @name <=> other.name
    return name_cmp unless name_cmp.zero?

    major_cmp = @major <=> other.major
    return major_cmp unless major_cmp.zero?
    
    minor_cmp = @minor <=> other.minor
    return minor_cmp unless minor_cmp.zero?
    
    @tag <=> other.tag
  end

[Source]

# File lib/version.rb, line 198
  def alpha_release
    tag_release :alpha
  end

[Source]

# File lib/version.rb, line 194
  def beta_release
    tag_release :beta
  end

[Source]

# File lib/version.rb, line 85
  def category_and_name
    (@name.empty?)? '' : ((@category.empty?)? "#@name-" : "#@category/#@name-")
  end

[Source]

# File lib/version.rb, line 208
  def import!
    true
  end

[Source]

# File lib/version.rb, line 101
  def inspect
    "#<Version: #{to_s}>"
  end

[Source]

# File lib/version.rb, line 77
  def major_minor
    "#@major.#@minor"
  end

[Source]

# File lib/version.rb, line 129
  def major_release
    release do |r|
      r.major += 1
      r.minor = 0
      r.tag = Tag[:alpha, 0]
    end
  end

[Source]

# File lib/version.rb, line 137
  def minor_release
    release do |r|
      r.minor += 1
      r.tag = Tag[:alpha, 0]
    end
  end

[Source]

# File lib/version.rb, line 73
  def official?
    @tag.name == :off
  end

[Source]

# File lib/version.rb, line 182
  def official_release
    tag_release :off
  end

[Source]

# File lib/version.rb, line 178
  def patch_level_release
    tag_release :p
  end

[Source]

# File lib/version.rb, line 190
  def pre_release
    tag_release :pre
  end

[Source]

# File lib/version.rb, line 115
  def pretty_version
    more = ''
    more << " #@release_name" unless @release_name.empty?
    "#{@tag.pretty_string}: #{major_minor}#{more}"
  end

[Source]

# File lib/version.rb, line 202
  def release ( &block )
    x = dup
    x.instance_eval { block[self] }
    x
  end

[Source]

# File lib/version.rb, line 186
  def release_candidate
    tag_release :rc
  end

[Source]

# File lib/version.rb, line 95
  def short_string
    s = ''
    s << @name << '-' unless @name.empty?
    s << major_minor << tag_string
  end

[Source]

# File lib/version.rb, line 159
  def tag_release ( tag )
    return incr_tag_release if @tag.name == tag

    dest = new_tag_release tag
    off = new_tag_release :off
    if self < dest and dest <= off
      dest
    elsif off <= self and self < dest
      dest
    elsif self < off and off < dest
      raise ArgumentError,
        "You need to be at least on an official release (not #{self}) to go on #{dest}"
    elsif dest < self
      raise ArgumentError, "You cannot downgrade (#{self} to #{dest})"
    else
      raise ArgumentError, "Unhandled case: self=#{self}, dest=#{dest}, off=#{off}"
    end
  end

[Source]

# File lib/version.rb, line 81
  def tag_string
    (official?)? '' : "_#{@tag.name}#{(@tag.offset.zero?)? '' : @tag.offset}"
  end

[Source]

# File lib/version.rb, line 121
  def to_a
    [ @major, @minor, @tag.name, @tag.offset ]
  end

[Source]

# File lib/version.rb, line 125
  def to_positive_integers
    [@major, @minor, @tag.rank + 5, @tag.offset]
  end

[Source]

# File lib/version.rb, line 105
  def to_rubygems_version_string
    to_positive_integers.join '.'
  end

[Source]

# File lib/version.rb, line 89
  def to_s
    s = category_and_name + major_minor + tag_string
    s << '#' << @release_name unless @release_name.empty?
    s
  end

[Source]

# File lib/version.rb, line 109
  def to_yaml ( opts={} )
    YAML::quick_emit nil, opts do |out|
      out.scalar taguri, to_s, :plain
    end
  end

[Validate]