A Haskell library for parsing and comparing software version numbers.
We like to give version numbers to our software in a myriad of ways. Some ways follow strict guidelines for incrementing and comparison. Some follow conventional wisdom and are generally self-consistent. Some are just plain asinine. This library provides a means of parsing and comparing any style of versioning, be it a nice Semantic Version like this:
…or a monstrosity like this:
Please switch to Semantic Versioning if you aren’t currently using it. It provides consistency in version incrementing and has the best constraints on comparisons.
versioning is the function you want. It attempts to parse a given
Text using the three individual parsers,
one fails, it tries the next. If you know you only want to parse one
specific version type, use that parser directly (e.g.
Lenses and Traversals
The parse result types have Lenses/Traversals for accessing their data fields. For instance, to increment the patch number of a parsed SemVer, you could:
incPatch :: SemVer -> SemVer incPatch s = s & patch %~ (+ 1)
Or, something more involved:
-- | Get all major versions of legally parsed SemVers. majors :: [Text] -> [Word] majors vs = vs ^.. each . to semver . _Right . major
-- | Get the major version of any `Text` that has one. majors :: [Text] -> [Word] majors vs = vs ^.. each . major
We can also use these
Text Traversals to increment versions, as above:
incPatch :: Text -> Text incPatch s = s & patch %~ (+ 1) > incPatch "1.2.3" "1.2.4"
- A bug in zero parsing within SemVer prereleases. #42
- An infinite loop in
VChunknow cannot be empty.
- Breaking: A
- Breaking: A
NonEmptychunks, and its structure has been significantly changed. Particularly,
Messvalues are now aware of the
Intvalues they hold (when they do), as well as “revision” values of the pattern
- Comparison of
Versionvalues is more memory efficient.
Versionnow has an extra field,
_vMeta :: [VChunk]for capturing “metadata” like Semver. This prevents otherwise nice-looking versions from being demoted to
MChunktype to accomodate the changes to
Versionno longer has a
""no longer parses in any way. #32
- Version strings with trailing whitespace no longer parse via
- Particular edge cases involving
- A particular edge case involving prereleases in
- The functions
Bool-based inspection of parse results.
messPatchChunkfor improved introspection into
- GHC 8.10 support.
- Added a new
PVPtype and parsers.
- GHC 8.8 compatibility.
- Updated to
ParsingErrortype alias has changed to match Megaparsec’s new error model, and
errorBundlePrettyis now exposed instead of the old
- Enhanced the whitespace handling in
ParseVand surrounding machinery. Use
versioningnow instead of the
- GHC 8.4.1 compatibility.
Semantictypeclass that provides Traversals for SemVer-like data out of all the version types.
Textwas also given an instance, so its much easier to manipulate directly:
λ "1.2.3" & minor %~ (+ 1) "1.3.3"
Some Lenses and Traversals had their names changed or were removed entirely to accomodate this new typeclass.
Versionshould never contain negative values, so their numeric components were changed from
- Updated for
megaparsec-6and GHC 8.2.
- Added instances for common typeclasses:
Hashable. This is to avoid having users define these instances themselves as orphans. If there are more instances you want added, please let me know.
Datawas left out on purpose.
- Added support for epoch numbers in the
Versiontype. These are numbers like the
1:2.3.4. These are used in Arch Linux in rare cases where packages change their versioning scheme, but need a reliable integer prefix to establish ordering. The
Versiontype has been given a new field,
_vEpoch :: Maybe Int, and a corresponding lens,
- Expose internal parsers so that they could be used in other parser programs that parse version numbers in larger files.
- Updated for
- Switched to
megaparsecto perform all parsing as
- Support for legacy
- Added more Traversals and INLINE’d all Lenses/Traversals
- Added Lenses and Traversals (no