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
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
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
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
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
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
|