Class: Vers::Parser
- Inherits:
-
Object
- Object
- Vers::Parser
- 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
-
#parse(vers_string) ⇒ VersionRange
Parses a vers URI string into a VersionRange.
-
#parse_native(range_string, scheme) ⇒ VersionRange
Parses a native package manager version range into a VersionRange.
-
#to_vers_string(version_range, scheme) ⇒ String
Converts a VersionRange back to a vers URI string.
Instance Method Details
#parse(vers_string) ⇒ VersionRange
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
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
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 |