Module: Vers::ConanVersion

Extended by:
ConanVersion
Included in:
ConanVersion
Defined in:
lib/vers/conan_version.rb

Instance Method Summary collapse

Instance Method Details

#compare(left, right) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/vers/conan_version.rb', line 9

def compare(left, right)
  left_main, left_pre, left_build = split(left)
  right_main, right_pre, right_build = split(right)

  comparison = compare_main(left_main, right_main)
  return comparison unless comparison.zero?

  comparison = compare_optional(left_pre, right_pre, prerelease: true)
  return comparison unless comparison.zero?

  compare_optional(left_build, right_build, prerelease: false)
end

#compare_main(left, right) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/vers/conan_version.rb', line 55

def compare_main(left, right)
  left_parts = significant_parts(left)
  right_parts = significant_parts(right)

  left_parts.zip(right_parts).each do |left_part, right_part|
    break unless left_part && right_part

    comparison = if VersionComparison.numeric?(left_part) && VersionComparison.numeric?(right_part)
                   VersionComparison.compare_numbers(left_part, right_part)
                 else
                   left_part <=> right_part
                 end
    return comparison unless comparison.zero?
  end

  left_parts.length <=> right_parts.length
end

#compare_optional(left, right, prerelease:) ⇒ Object



79
80
81
82
83
84
85
# File 'lib/vers/conan_version.rb', line 79

def compare_optional(left, right, prerelease:)
  return 0 if left.nil? && right.nil?
  return prerelease ? 1 : -1 if left.nil?
  return prerelease ? -1 : 1 if right.nil?

  compare(left, right)
end

#normalize(value) ⇒ Object



47
48
49
# File 'lib/vers/conan_version.rb', line 47

def normalize(value)
  value.to_s.strip
end

#prerelease?(value) ⇒ Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/vers/conan_version.rb', line 51

def prerelease?(value)
  !split(value.to_s.strip)[1].nil?
end

#significant_parts(value) ⇒ Object



73
74
75
76
77
# File 'lib/vers/conan_version.rb', line 73

def significant_parts(value)
  parts = value.split(".", -1)
  parts.pop while parts.last && VersionComparison.numeric?(parts.last) && VersionComparison.compare_numbers(parts.last, "0").zero?
  parts
end

#split(value) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/vers/conan_version.rb', line 22

def split(value)
  main = value.to_s
  build = nil
  prerelease = nil

  separator = main.rindex("+")
  if separator
    build = main[(separator + 1)..]
    main = main[0...separator]
  end

  separator = main.rindex("-")
  if separator
    prerelease = main[(separator + 1)..]
    main = main[0...separator]
  end

  [main, prerelease, build]
end

#valid?(value) ⇒ Boolean

Returns:

  • (Boolean)


42
43
44
45
# File 'lib/vers/conan_version.rb', line 42

def valid?(value)
  string = value.to_s.strip
  !string.empty? && !string.match?(/[[:space:]]/)
end