Overview
Versionian supports matching versions against range specifications, useful for dependency constraints, feature flags, and version compatibility checks.
Range Types
| Type | Description |
|---|---|
:equals | Matches a specific version exactly |
:before | Matches versions less than the boundary |
:after | Matches versions greater than or equal to the boundary |
:between | Matches versions within an inclusive range |
Creating Ranges
scheme = Versionian.get_scheme(:semantic)
# Exact version
equals_range = Versionian::VersionRange.new(:equals, scheme, version: "1.12.0")
# Before a version
before_range = Versionian::VersionRange.new(:before, scheme, version: "2.0.0")
# After a version (inclusive)
after_range = Versionian::VersionRange.new(:after, scheme, version: "1.12.0")
# Between two versions
between_range = Versionian::VersionRange.new(:between, scheme, from: "1.12.0", to: "2.0.0")Matching Versions
Exact match
range = Versionian::VersionRange.new(:equals, scheme, version: "1.12.0")
range.matches?("1.12.0") # => true
range.matches?("1.12.1") # => false
range.matches?("1.11.0") # => falseBefore a version (exclusive)
range = Versionian::VersionRange.new(:before, scheme, version: "1.12.0")
range.matches?("1.11.0") # => true
range.matches?("1.12.0") # => false
range.matches?("1.13.0") # => falseAfter a version (inclusive)
range = Versionian::VersionRange.new(:after, scheme, version: "1.12.0")
range.matches?("1.13.0") # => true
range.matches?("1.12.0") # => true (inclusive)
range.matches?("1.11.0") # => falseBetween two versions
range = Versionian::VersionRange.new(:between, scheme, from: "1.12.0", to: "2.0.0")
range.matches?("1.15.0") # => true
range.matches?("2.0.0") # => true (inclusive)
range.matches?("2.1.0") # => falseScheme Methods
You can also use the scheme’s matches_range? method:
scheme.matches_range?("1.12.0", range) # => trueUse Cases
Dependency Constraints
require 'version'
MIN_VERSION = VersionRange.new(:after, scheme, version: "1.0.0")
MAX_VERSION = VersionRange.new(:before, scheme, version: "2.0.0")
def compatible?(version_string)
scheme.matches_range?(version_string, MIN_VERSION) &&
scheme.matches_range?(version_string, MAX_VERSION)
end
compatible?("1.5.0") # => true
compatible?("2.0.0") # => false