[][src]Crate semver_constraints

Defines modified syntax for version constraints.


The semver crate's Version is fine. What's not fine is their VersionReq.

The reason we're rolling our own instead of using something like the semver crate is that the requirements for elba conflict with what semver provides. The vector-of-predicate approach which semver provides is too flexible, making it harder to validate versions and perform operations on them (check if one range is a subset of another, etc.). The semver crate also provides some unnecessary operations.

Instead, this module adds features in some places and removes others for flexibility where it matters for elba.


Versions in elba take lots of good ideas from Cargo and Pub (Dart) versioning. We follow Cargo's compatibility rules for 0.* and 0.0.* versions to allow for less-stable packages. Additionally, we also follow Cargo's rules when sigils are omitted. However, we purposely elide star notation since it's unnecessary; 0.* == 0, 0.0.* == 0.0. To make parsing easier, < or <= must always precede > or >=, like with Pub. Nonsensical requirements like < 1 > 2 which are valid parses under semver get caught during parsing here. In general, syntax is substantially stricter than in Cargo, and nonsensical constraints are caught immediately when creating the constraint.



A set of Ranges combines to make a Constraint. Constraints are the union of multiple Ranges. Upon manual creation or updating of a Constraint, the Constraint will unify all of its Ranges such that all of the Ranges are disjoint. Unification is eager: it's done whenever the set is modified to keep the internal representation of the set unified at all times (this is useful for converting the Constraint to a string, since the Display trait doesn't allow mutating self).


A continguous range in which a version can fall into. Syntax for ranges mirrors that of Pub or Cargo. Ranges can accept caret and tilde syntax, as well as less-than/greater-than specifications (just like Cargo). Like Pub, the any Range is completely unbounded on both sides. Pre-release Versions can satisfy a Range iff the Range mentions a pre-release Version on either bound, or if the Range is unbounded on the upper side. Additionally, if a greater-than and/or less-than Range also has a ! after the inequality symbol, the Range will include pre-release versions. >=! 1.0.0 accepts all pre-releases of 1.0.0, along with the greater versions. <! 2.0.0 includes pre-releases of 2.0.0. >! and > mean the same thing, as do <=! and <=.


Represents a version number conforming to the semantic versioning scheme.