Module: Vers::GoVersion

Extended by:
GoVersion
Included in:
GoVersion
Defined in:
lib/vers/semver_version.rb

Instance Method Summary collapse

Instance Method Details

#compare(left, right) ⇒ Object



214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
# File 'lib/vers/semver_version.rb', line 214

def compare(left, right)
  return SemverVersion.compare(left, right) unless left.start_with?("v") || right.start_with?("v")

  parsed_left = parse(left)
  parsed_right = parse(right)
  return 1 if parsed_left && !parsed_right
  return -1 if !parsed_left && parsed_right
  return 0 unless parsed_left && parsed_right

  parsed_left.core.zip(parsed_right.core).each do |left_part, right_part|
    comparison = VersionComparison.compare_numbers(left_part, right_part)
    return comparison unless comparison.zero?
  end

  SemverVersion.compare_prerelease(parsed_left.prerelease, parsed_right.prerelease)
end

#normalize(value) ⇒ Object



286
287
288
# File 'lib/vers/semver_version.rb', line 286

def normalize(value)
  SemverVersion.normalize(value.to_s.strip, preserve_v: true)
end

#parse(value) ⇒ Object



231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/vers/semver_version.rb', line 231

def parse(value)
  return nil unless value.start_with?("v")

  string = value.delete_prefix("v")
  core_end = string.index(/[-+]/) || string.length
  core = string[0...core_end].split(".", -1)
  return nil if core.empty? || core.length > 3
  return nil unless core.all? { |part| valid_core_part?(part) }
  return nil if core.length < 3 && core_end != string.length

  core << "0" while core.length < 3
  remainder = string[core_end..]
  prerelease = ""
  build = ""

  if remainder.start_with?("-")
    value = remainder.delete_prefix("-")
    prerelease_end = value.index("+") || value.length
    prerelease = value[0...prerelease_end]
    return nil unless valid_identifiers?(prerelease, build: false)

    remainder = value[prerelease_end..]
  end

  if remainder.start_with?("+")
    build = remainder.delete_prefix("+")
    return nil unless valid_identifiers?(build, build: true)

    remainder = ""
  end

  return nil unless remainder.empty?

  SemverVersion::Parsed.new(core.freeze, prerelease, build)
end

#prerelease?(value) ⇒ Boolean

Returns:

  • (Boolean)


290
291
292
# File 'lib/vers/semver_version.rb', line 290

def prerelease?(value)
  SemverVersion.prerelease?(value.to_s.strip)
end

#valid?(value) ⇒ Boolean

Returns:

  • (Boolean)


281
282
283
284
# File 'lib/vers/semver_version.rb', line 281

def valid?(value)
  string = value.to_s.strip
  string.start_with?("v") ? !parse(string).nil? : SemverVersion.valid?(string)
end

#valid_core_part?(part) ⇒ Boolean

Returns:

  • (Boolean)


267
268
269
# File 'lib/vers/semver_version.rb', line 267

def valid_core_part?(part)
  VersionComparison.numeric?(part) && (part == "0" || !part.start_with?("0"))
end

#valid_identifiers?(value, build:) ⇒ Boolean

Returns:

  • (Boolean)


271
272
273
274
275
276
277
278
279
# File 'lib/vers/semver_version.rb', line 271

def valid_identifiers?(value, build:)
  return false if value.empty?

  value.split(".", -1).all? do |identifier|
    next false unless identifier.match?(/\A[0-9A-Za-z-]+\z/)

    build || identifier == "0" || !VersionComparison.numeric?(identifier) || !identifier.start_with?("0")
  end
end