Class: Solve::Version

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

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(version_array) ⇒ Version #initialize(version_string) ⇒ Version #initialize(version) ⇒ Version

Returns a new instance of Version.

Overloads:

  • #initialize(version_array) ⇒ Version

    Examples:

    Version.new([1, 2, 3, 'rc.1', 'build.1']) => #<Version: @major=1, @minor=2, @patch=3, @pre_release='rc.1', @build='build.1'>

    Parameters:

    • version_array (Array)
  • #initialize(version_string) ⇒ Version

    Examples:

    Version.new("1.2.3-rc.1+build.1") => #<Version: @major=1, @minor=2, @patch=3, @pre_release='rc.1', @build='build.1'>

    Parameters:

    • version_string (#to_s)
  • #initialize(version) ⇒ Version

    Examples:

    Version.new(Version.new("1.2.3-rc.1+build.1")) => #<Version: @major=1, @minor=2, @pre_release='rc.1', @build='build.1'>

    Parameters:



51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/solve/version.rb', line 51

def initialize(*args)
  if args.first.is_a?(Array)
    @major, @minor, @patch, @pre_release, @build = args.first
  else
    @major, @minor, @patch, @pre_release, @build = self.class.split(args.first.to_s)
  end

  @major       ||= 0
  @minor       ||= 0
  @patch       ||= 0
  @pre_release ||= nil
  @build       ||= nil
end

Instance Attribute Details

#buildObject (readonly)

Returns the value of attribute build.



31
32
33
# File 'lib/solve/version.rb', line 31

def build
  @build
end

#majorObject (readonly)

Returns the value of attribute major.



27
28
29
# File 'lib/solve/version.rb', line 27

def major
  @major
end

#minorObject (readonly)

Returns the value of attribute minor.



28
29
30
# File 'lib/solve/version.rb', line 28

def minor
  @minor
end

#patchObject (readonly)

Returns the value of attribute patch.



29
30
31
# File 'lib/solve/version.rb', line 29

def patch
  @patch
end

#pre_releaseObject (readonly)

Returns the value of attribute pre_release.



30
31
32
# File 'lib/solve/version.rb', line 30

def pre_release
  @pre_release
end

Class Method Details

.split(version_string) ⇒ Array

Parameters:

  • version_string (#to_s)

Returns:

  • (Array)

Raises:

  • (InvalidVersionFormat)


9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/solve/version.rb', line 9

def split(version_string)
  case version_string.to_s
  when /^(\d+)\.(\d+)\.(\d+)(-([0-9a-z\-\.]+))?(\+([0-9a-z\-\.]+))?$/i
    [ $1.to_i, $2.to_i, $3.to_i, $5, $7 ]
  when /^(\d+)\.(\d+)\.(\d+)?$/
    [ $1.to_i, $2.to_i, $3.to_i ]
  when /^(\d+)\.(\d+)?$/
    [ $1.to_i, $2.to_i, 0 ]
  when /^(\d+)$/
    [ $1.to_i, 0, 0 ]
  else
    raise Errors::InvalidVersionFormat.new(version_string)
  end
end

Instance Method Details

#<=>(other) ⇒ Integer

Parameters:

Returns:

  • (Integer)


68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/solve/version.rb', line 68

def <=>(other)
  [:major, :minor, :patch].each do |release|
    ans = self.send(release) <=> other.send(release)
    return ans if ans != 0
  end
  ans = pre_release_and_build_presence_score <=> other.pre_release_and_build_presence_score
  return ans if ans != 0
  ans = identifiers_comparaison(other, :pre_release)
  return ans if ans != 0
  if build && other.build
    return identifiers_comparaison(other, :build)
  else
    return build.to_s <=> other.build.to_s
  end
  0
end

#eql?(other) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


125
126
127
# File 'lib/solve/version.rb', line 125

def eql?(other)
  other.is_a?(Version) && self == other
end

#identifiers(release) ⇒ Array

Returns:

  • (Array)


86
87
88
89
90
# File 'lib/solve/version.rb', line 86

def identifiers(release)
  send(release).to_s.split('.').map do |str|
    str.to_i.to_s == str ? str.to_i : str
  end
end

#identifiers_comparaison(other, release) ⇒ Integer

Parameters:

Returns:

  • (Integer)


108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/solve/version.rb', line 108

def identifiers_comparaison(other, release)
  [identifiers(release).length, other.identifiers(release).length].max.times do |i|
    if identifiers(release)[i].class == other.identifiers(release)[i].class
      ans = identifiers(release)[i] <=> other.identifiers(release)[i]
      return ans if ans != 0
    elsif identifiers(release)[i] && other.identifiers(release)[i]
      return identifiers(release)[i].class.to_s <=> other.identifiers(release)[i].class.to_s
    elsif identifiers(release)[i] || other.identifiers(release)[i]
      return other.identifiers(release)[i].class.to_s <=> identifiers(release)[i].class.to_s
    end
  end
  0
end

#inspectObject



129
130
131
# File 'lib/solve/version.rb', line 129

def inspect
  "#<#{self.class.to_s} #{to_s}>"
end

#pre_release?Boolean

Returns:

  • (Boolean)


92
93
94
# File 'lib/solve/version.rb', line 92

def pre_release?
  !!pre_release
end

#pre_release_and_build_presence_scoreInteger

Returns:

  • (Integer)


101
102
103
# File 'lib/solve/version.rb', line 101

def pre_release_and_build_presence_score
  pre_release ? 0 : (build.nil? ? 1 : 2)
end

#to_sObject



133
134
135
136
137
138
# File 'lib/solve/version.rb', line 133

def to_s
  str = "#{major}.#{minor}.#{patch}"
  str += "-#{pre_release}" if pre_release
  str += "+#{build}" if build
  str
end

#zero?Boolean

Returns:

  • (Boolean)


96
97
98
# File 'lib/solve/version.rb', line 96

def zero?
  [major, minor, patch].all? { |n| n == 0 }
end