Class: MetadataJsonLint::VersionRequirement

Inherits:
Object
  • Object
show all
Defined in:
lib/metadata-json-lint/version_requirement.rb

Overview

Parses a string module version requirement with semantic_puppet and provides methods to analyse it for lint warnings

Instance Method Summary collapse

Constructor Details

#initialize(requirement) ⇒ VersionRequirement

Returns a new instance of VersionRequirement.



5
6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/metadata-json-lint/version_requirement.rb', line 5

def initialize(requirement)
  @requirement = requirement

  if defined?(SemanticPuppet::VersionRange)
    @range = SemanticPuppet::VersionRange.parse(requirement)
    if @range == SemanticPuppet::VersionRange::EMPTY_RANGE
      raise ArgumentError,
            "Range matches no versions: \"#{requirement}\""
    end
  elsif requirement.match(/\A[a-z0-9*.\-^~><=|\t ]*\Z/i).nil?
    raise ArgumentError, "Unparsable version range: \"#{requirement}\""
  end
end

Instance Method Details

#maxObject



65
66
67
# File 'lib/metadata-json-lint/version_requirement.rb', line 65

def max
  range.end
end

#minObject



61
62
63
# File 'lib/metadata-json-lint/version_requirement.rb', line 61

def min
  range.begin
end

#mixed_syntax?Boolean

Whether the range uses a comparison operator (e.g. >=) with a wildcard syntax, such as ">= 1.x" or "< 2.0.x"

Returns:

  • (Boolean)


21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/metadata-json-lint/version_requirement.rb', line 21

def mixed_syntax?
  !/
    [><=^~]{1,2} # comparison operators
    \s*
    \d\. # MAJOR
    (?:
      (?:x|\*) # MINOR is wildcard
      |
      \d\.(?:x|\*)  # MINOR is digit and PATCH is wildcard
    )
  /x.match(requirement).nil?
end

#open_ended?Boolean

Returns:

  • (Boolean)


34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/metadata-json-lint/version_requirement.rb', line 34

def open_ended?
  if range
    range.end == SemanticPuppet::Version::MAX
  else
    # Empty requirement strings are open-ended.
    return true if requirement.strip.empty?

    # Strip superfluous whitespace.
    range_set = requirement.gsub(/([><=~^])(?:\s+|\s*v)/, '\1')

    # Split on logical OR
    ranges = range_set.split(/\s*\|\|\s*/)

    # Returns true if any range includes a '>' but not a corresponding '<'
    # which should be the only way to declare an open-ended range.
    ranges.select { |r| r.include?('>') }.any? { |r| !r.include?('<') }
  end
end

#puppet_eol?Boolean

Returns:

  • (Boolean)


53
54
55
# File 'lib/metadata-json-lint/version_requirement.rb', line 53

def puppet_eol?
  true if range.begin < SemanticPuppet::Version.parse(MIN_PUPPET_VER)
end

#ver_rangeObject



57
58
59
# File 'lib/metadata-json-lint/version_requirement.rb', line 57

def ver_range
  range
end