Class: Vers::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/vers/parser.rb

Overview

Parses vers URI strings and package manager specific version ranges

This class handles parsing of vers URI format (e.g., “vers:npm/>=1.2.3|<2.0.0”) and provides extensible support for different package ecosystem syntaxes.

Examples

parser = Vers::Parser.new
range = parser.parse("vers:npm/>=1.2.3|<2.0.0")
range.contains?("1.5.0")  # => true

Constant Summary collapse

VERS_URI_REGEX =

Regex for parsing vers URI format

/\Avers:([^\/]+)\/(.+)\z/

Instance Method Summary collapse

Instance Method Details

#parse(vers_string) ⇒ VersionRange

Parses a vers URI string into a VersionRange

Examples

parser = Vers::Parser.new
parser.parse("vers:npm/>=1.2.3|<2.0.0")
parser.parse("vers:gem/~>1.0")
parser.parse("vers:pypi/==1.2.3")

Parameters:

  • vers_string (String)

    The vers URI string to parse

Returns:

Raises:

  • (ArgumentError)

    if the vers string is invalid



37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/vers/parser.rb', line 37

def parse(vers_string)
  if vers_string == "*"
    return VersionRange.unbounded
  end

  match = vers_string.match(VERS_URI_REGEX)
  raise ArgumentError, "Invalid vers URI format: #{vers_string}" unless match

  scheme = match[1]
  constraints_string = match[2]

  parse_constraints(constraints_string, scheme)
end

#parse_native(range_string, scheme) ⇒ VersionRange

Parses a native package manager version range into a VersionRange

Examples

parser = Vers::Parser.new
parser.parse_native("^1.2.3", "npm")
parser.parse_native("~> 1.0", "gem")
parser.parse_native(">=1.0,<2.0", "pypi")

Parameters:

  • range_string (String)

    The native version range string

  • scheme (String)

    The package manager scheme (npm, gem, pypi, etc.)

Returns:



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/vers/parser.rb', line 65

def parse_native(range_string, scheme)
  case scheme
  when "npm"
    parse_npm_range(range_string)
  when "gem", "rubygems"
    parse_gem_range(range_string)
  when "pypi"
    parse_pypi_range(range_string)
  when "maven"
    parse_maven_range(range_string)
  when "nuget"
    parse_nuget_range(range_string)
  when "deb", "debian"
    parse_debian_range(range_string)
  when "rpm"
    parse_rpm_range(range_string)
  else
    # Fall back to generic constraint parsing
    parse_constraints(range_string, scheme)
  end
end

#to_vers_string(version_range, scheme) ⇒ String

Converts a VersionRange back to a vers URI string

Parameters:

  • version_range (VersionRange)

    The version range to convert

  • scheme (String)

    The package manager scheme

Returns:

  • (String)

    The vers URI string



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/vers/parser.rb', line 94

def to_vers_string(version_range, scheme)
  return "*" if version_range.unbounded?
  return "vers:#{scheme}/" if version_range.empty?

  constraints = []
  
  version_range.intervals.each do |interval|
    if interval.min == interval.max && interval.min_inclusive && interval.max_inclusive
      # Exact version
      constraints << "=#{interval.min}"
    else
      # Range constraints
      if interval.min
        operator = interval.min_inclusive ? ">=" : ">"
        constraints << "#{operator}#{interval.min}"
      end
      
      if interval.max
        operator = interval.max_inclusive ? "<=" : "<"
        constraints << "#{operator}#{interval.max}"
      end
    end
  end

  "vers:#{scheme}/#{constraints.join('|')}"
end