Module: Vers::NuGetVersion

Defined in:
lib/vers/nuget_version.rb

Class Method Summary collapse

Class Method Details

.compare(a, b) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/vers/nuget_version.rb', line 7

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

  parts_a = parse_nuget(a)
  parts_b = parse_nuget(b)

  4.times do |i|
    cmp = parts_a[:numeric][i] <=> parts_b[:numeric][i]
    return cmp unless cmp == 0
  end

  pre_a = parts_a[:prerelease]
  pre_b = parts_b[:prerelease]

  return 1 if pre_a.empty? && !pre_b.empty?
  return -1 if !pre_a.empty? && pre_b.empty?
  return 0 if pre_a.empty? && pre_b.empty?

  compare_prerelease(pre_a, pre_b)
end

.compare_prerelease(a, b) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/vers/nuget_version.rb', line 51

def compare_prerelease(a, b)
  parts_a = a.downcase.split(".")
  parts_b = b.downcase.split(".")

  max_len = [parts_a.length, parts_b.length].max

  max_len.times do |i|
    part_a = i < parts_a.length ? parts_a[i] : nil
    part_b = i < parts_b.length ? parts_b[i] : nil

    return -1 if part_a.nil?
    return 1 if part_b.nil?

    num_a = part_a.match?(/\A\d+\z/) ? part_a.to_i : nil
    num_b = part_b.match?(/\A\d+\z/) ? part_b.to_i : nil

    if num_a && num_b
      cmp = num_a <=> num_b
      return cmp unless cmp == 0
    else
      cmp = part_a <=> part_b
      return cmp unless cmp == 0
    end
  end

  0
end

.parse_nuget(s) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/vers/nuget_version.rb', line 28

def parse_nuget(s)
  s = s.dup

  if (idx = s.index("+"))
    s = s[0...idx]
  end

  prerelease = ""
  if (idx = s.index("-"))
    prerelease = s[(idx + 1)..]
    s = s[0...idx]
  end

  numeric = [0, 0, 0, 0]
  parts = s.split(".")
  parts.each_with_index do |part, i|
    break if i >= 4
    numeric[i] = part.to_i
  end

  { numeric: numeric, prerelease: prerelease }
end