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/- NPM_CARET_REGEX =
Pre-compiled regex patterns for common npm patterns
/\A\^(.+)\z/- NPM_TILDE_REGEX =
/\A~(.+)\z/- NPM_HYPHEN_REGEX =
/\A(.+?)\s+-\s+(.+)\z/- NPM_X_RANGE_MAJOR_REGEX =
/\A(\d+)\.x\z/- NPM_X_RANGE_MINOR_REGEX =
/\A(\d+)\.(\d+)\.x\z/- @@parser_cache =
Cache for parsed ranges to improve performance
{}
- @@cache_size_limit =
200
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
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")
48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/vers/parser.rb', line 48 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")
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/vers/parser.rb', line 76 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
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/vers/parser.rb', line 105 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 |