Module: Vers::BazelVersion

Defined in:
lib/vers/bazel_version.rb

Defined Under Namespace

Classes: Identifier, ParsedVersion

Constant Summary collapse

VERSION_REGEX =
/\A(?<release>[a-zA-Z0-9.]+)(?:-(?<prerelease>[a-zA-Z0-9.-]+))?(?:\+[a-zA-Z0-9.-]+)?\z/
MAX_NUMERIC_IDENTIFIER =
(2**64) - 1

Class Method Summary collapse

Class Method Details

.compare(a, b) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/vers/bazel_version.rb', line 13

def compare(a, b)
  return 0 if a == b

  version_a = parse(a)
  version_b = parse(b)

  return 1 if version_a.empty && !version_b.empty
  return -1 if !version_a.empty && version_b.empty

  release_comparison = compare_identifiers(version_a.release, version_b.release)
  return release_comparison unless release_comparison == 0

  return 1 if version_a.prerelease.empty? && !version_b.prerelease.empty?
  return -1 if !version_a.prerelease.empty? && version_b.prerelease.empty?

  compare_identifiers(version_a.prerelease, version_b.prerelease)
end

.compare_identifier(identifier_a, identifier_b) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/vers/bazel_version.rb', line 101

def compare_identifier(identifier_a, identifier_b)
  if identifier_a.numeric != identifier_b.numeric
    return identifier_a.numeric ? -1 : 1
  end

  if identifier_a.numeric
    number_comparison = identifier_a.number <=> identifier_b.number
    return number_comparison unless number_comparison == 0
  end

  identifier_a.text <=> identifier_b.text
end

.compare_identifiers(identifiers_a, identifiers_b) ⇒ Object



92
93
94
95
96
97
98
99
# File 'lib/vers/bazel_version.rb', line 92

def compare_identifiers(identifiers_a, identifiers_b)
  [identifiers_a.length, identifiers_b.length].min.times do |index|
    comparison = compare_identifier(identifiers_a[index], identifiers_b[index])
    return comparison unless comparison == 0
  end

  identifiers_a.length <=> identifiers_b.length
end

.normalize(version) ⇒ Object

Raises:

  • (ArgumentError)


52
53
54
55
56
# File 'lib/vers/bazel_version.rb', line 52

def normalize(version)
  raise ArgumentError, "Invalid Bazel version: #{version.inspect}" unless valid?(version)

  version.split("+", 2).first
end

.parse(version) ⇒ Object

Raises:

  • (ArgumentError)


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/vers/bazel_version.rb', line 58

def parse(version)
  raise ArgumentError, "Invalid Bazel version: #{version.inspect}" unless version.is_a?(String)

  if version.empty?
    return ParsedVersion.new(release: [], prerelease: [], empty: true)
  end

  match = VERSION_REGEX.match(version)
  raise ArgumentError, "Invalid Bazel version: #{version.inspect}" unless match

  ParsedVersion.new(
    release: parse_identifiers(match[:release], version),
    prerelease: match[:prerelease] ? parse_identifiers(match[:prerelease], version) : [],
    empty: false
  )
end

.parse_identifiers(value, version) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/vers/bazel_version.rb', line 75

def parse_identifiers(value, version)
  value.split(".", -1).map do |identifier|
    raise ArgumentError, "Invalid Bazel version: #{version}" if identifier.empty?

    if identifier.match?(/\A[0-9]+\z/)
      number = identifier.to_i
      if number > MAX_NUMERIC_IDENTIFIER
        raise ArgumentError, "Numeric Bazel version identifier is too large: #{identifier}"
      end

      Identifier.new(numeric: true, number: number, text: identifier)
    else
      Identifier.new(numeric: false, number: 0, text: identifier)
    end
  end
end

.prerelease?(version) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
49
50
# File 'lib/vers/bazel_version.rb', line 46

def prerelease?(version)
  !parse(version).prerelease.empty?
rescue ArgumentError
  false
end

.stable?(version) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
43
44
# File 'lib/vers/bazel_version.rb', line 40

def stable?(version)
  parse(version).prerelease.empty?
rescue ArgumentError
  false
end

.valid?(version) ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
34
35
36
37
38
# File 'lib/vers/bazel_version.rb', line 31

def valid?(version)
  return false if version == ""

  parse(version)
  true
rescue ArgumentError
  false
end