Class: SemiSemantic::Version

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/semi_semantic/version.rb

Constant Summary collapse

PRE_RELEASE_PREFIX =
'-'
POST_RELEASE_PREFIX =
'+'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(release, pre_release = nil, post_release = nil) ⇒ Version



34
35
36
37
38
39
40
41
42
43
# File 'lib/semi_semantic/version.rb', line 34

def initialize(release, pre_release=nil, post_release=nil)
  raise ArgumentError.new 'Invalid Release: nil' if release.nil?
  @release = release
  @pre_release = pre_release
  @post_release = post_release

  @segments = [release]
  @segments << pre_release unless pre_release.nil?
  @segments << post_release unless post_release.nil?
end

Instance Attribute Details

#post_releaseObject (readonly)

Returns the value of attribute post_release.



11
12
13
# File 'lib/semi_semantic/version.rb', line 11

def post_release
  @post_release
end

#pre_releaseObject (readonly)

Returns the value of attribute pre_release.



11
12
13
# File 'lib/semi_semantic/version.rb', line 11

def pre_release
  @pre_release
end

#releaseObject (readonly)

Returns the value of attribute release.



11
12
13
# File 'lib/semi_semantic/version.rb', line 11

def release
  @release
end

#segmentsObject (readonly)

Returns the value of attribute segments.



11
12
13
# File 'lib/semi_semantic/version.rb', line 11

def segments
  @segments
end

Class Method Details

.parse(version_string) ⇒ Object

Parses a semi-semantic version string into up to three segments Raises a ParseError if the string format is invalid Raises an ArgumentError if version_string is nil



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/semi_semantic/version.rb', line 16

def self.parse(version_string)
  raise ArgumentError.new 'Invalid Version String: nil' if version_string.nil?
  raise ArgumentError.new "Invalid Version String: '#{version_string}'" if version_string == ''
  matches = /^(?<release>[0-9A-Za-z_\.]+)(\-(?<pre_release>[0-9A-Za-z_\-\.]+))?(\+(?<post_release>[0-9A-Za-z_\-\.]+))?$/.match(version_string)
  raise ParseError.new "Invalid Version Format: '#{version_string}'" if matches.nil?

  release = VersionSegment.parse matches[:release]
  pre_release = nil
  if matches[:pre_release]
    pre_release = VersionSegment.parse matches[:pre_release]
  end
  post_release = nil
  if matches[:post_release]
    post_release = VersionSegment.parse matches[:post_release]
  end
  self.new(release, pre_release, post_release)
end

Instance Method Details

#<=>(other) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/semi_semantic/version.rb', line 45

def <=>(other)
  result = (@release <=> other.release)
  return result unless result == 0

  unless @pre_release.nil? && other.pre_release.nil?
    return 1 if @pre_release.nil?
    return -1 if other.pre_release.nil?
    result = (@pre_release <=> other.pre_release)
    return result unless result == 0
  end

  unless @post_release.nil? && other.post_release.nil?
    return -1 if @post_release.nil?
    return 1 if other.post_release.nil?
    result = (@post_release <=> other.post_release)
    return result unless result == 0
  end

  0
end

#to_sObject



66
67
68
69
70
71
# File 'lib/semi_semantic/version.rb', line 66

def to_s
  str = @release.to_s
  str += PRE_RELEASE_PREFIX + @pre_release.to_s unless @pre_release.nil?
  str += POST_RELEASE_PREFIX + @post_release.to_s unless @post_release.nil?
  str
end