-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Types and parsers for software version numbers.
--
-- A 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:
--
--
-- 1.2.3-r1+git123
--
--
-- ...or a monstrosity like this:
--
--
-- 2:10.2+0.0093r3+1-1
--
--
-- 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.
@package versions
@version 3.5.2
-- | A library for parsing and comparing software version numbers.
--
-- We like to give version numbers to our software in a myriad of
-- different 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:
--
--
-- 1.2.3-r1+git123
--
--
-- ...or a monstrosity like this:
--
--
-- 2:10.2+0.0093r3+1-1
--
--
-- 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.
--
-- Using the Parsers
--
-- In general, versioning is the function you want. It attempts to
-- parse a given Text using the three individual parsers,
-- semver, version and mess. If one fails, it tries
-- the next. If you know you only want to parse one specific version
-- type, use that parser directly (e.g. semver).
module Data.Versions
-- | A top-level Versioning type. Acts as a wrapper for the more specific
-- types. This allows each subtype to have its own parser, and for said
-- parsers to be composed. This is useful for specifying custom behaviour
-- for when a certain parser fails.
data Versioning
Ideal :: SemVer -> Versioning
General :: Version -> Versioning
Complex :: Mess -> Versioning
-- | An (Ideal) version number that conforms to Semantic Versioning. This
-- is a prescriptive parser, meaning it follows the SemVer
-- standard.
--
-- Legal semvers are of the form: MAJOR.MINOR.PATCH-PREREL+META
--
-- Example: 1.2.3-r1+commithash
--
-- Extra Rules:
--
--
-- - Pre-release versions have lower precedence than normal
-- versions.
-- - Build metadata does not affect version precedence.
-- - PREREL and META strings may only contain ASCII alphanumerics.
--
--
-- For more information, see http://semver.org
data SemVer
SemVer :: Word -> Word -> Word -> [VChunk] -> [VChunk] -> SemVer
[_svMajor] :: SemVer -> Word
[_svMinor] :: SemVer -> Word
[_svPatch] :: SemVer -> Word
[_svPreRel] :: SemVer -> [VChunk]
[_svMeta] :: SemVer -> [VChunk]
-- | A PVP version number specific to the Haskell ecosystem. Like SemVer
-- this is a prescriptive scheme, and follows the PVP spec.
--
-- Legal PVP values are of the form: MAJOR(.MAJOR.MINOR)
--
-- Example: 1.2.3
--
-- Extra Rules:
--
--
-- - Each component must be a number.
-- - Only the first MAJOR component is actually necessary. Otherwise,
-- there can be any number of components. 1.2.3.4.5.6.7 is
-- legal.
-- - Unlike SemVer there are two MAJOR components, and both indicate a
-- breaking change. The spec otherwise designates no special meaning to
-- components past the MINOR position.
--
newtype PVP
PVP :: NonEmpty Word -> PVP
[_pComponents] :: PVP -> NonEmpty Word
-- | A (General) Version. Not quite as ideal as a SemVer, but has
-- some internal consistancy from version to version. Generally conforms
-- to the x.x.x-x pattern, and may optionally have an
-- epoch. These are prefixes marked by a colon, like in
-- 1:2.3.4.
--
-- Examples of Version that are not SemVer: 0.25-2,
-- 8.u51-1, 20150826-1, 1:2.3.4
data Version
Version :: Maybe Word -> [VChunk] -> [VChunk] -> Version
[_vEpoch] :: Version -> Maybe Word
[_vChunks] :: Version -> [VChunk]
[_vRel] :: Version -> [VChunk]
-- | A (Complex) Mess. This is a descriptive parser, based on
-- examples of stupidly crafted version numbers used in the wild.
--
-- Groups of letters/numbers, separated by a period, can be further
-- separated by the symbols _-+:
--
-- Unfortunately, VChunks cannot be used here, as some
-- developers have numbers like 1.003.04 which make parsers
-- quite sad.
--
-- Not guaranteed to have well-defined ordering (Ord) behaviour,
-- but so far internal tests show consistency.
data Mess
VLeaf :: [Text] -> Mess
VNode :: [Text] -> VSep -> Mess -> Mess
-- | A single unit of a Version. May be digits or a string of characters.
-- Groups of these are called VChunks, and are the identifiers
-- separated by periods in the source.
data VUnit
Digits :: Word -> VUnit
Str :: Text -> VUnit
-- | Smart constructor for a VUnit made of digits.
digits :: Word -> VUnit
-- | Smart constructor for a VUnit made of letters.
str :: Text -> Maybe VUnit
-- | A logical unit of a version number. Can consist of multiple letters
-- and numbers.
type VChunk = [VUnit]
-- | Developers use a number of symbols to seperate groups of
-- digits/letters in their version numbers. These are:
--
--
-- - A colon (:). Often denotes an "epoch".
-- - A hyphen (-).
-- - A plus (+). Stop using this outside of metadata if you are.
-- Example: 10.2+0.93+1-1
-- - An underscore (_). Stop using this if you are.
--
data VSep
VColon :: VSep
VHyphen :: VSep
VPlus :: VSep
VUnder :: VSep
-- | A synonym for the more verbose megaparsec error type.
type ParsingError = ParseErrorBundle Text Void
-- | Parse a piece of Text into either an (Ideal) SemVer, a
-- (General) Version, or a (Complex) Mess.
versioning :: Text -> Either ParsingError Versioning
-- | Parse a (Ideal) Semantic Version.
semver :: Text -> Either ParsingError SemVer
-- | Parse a (Haskell) PVP, as defined above.
pvp :: Text -> Either ParsingError PVP
-- | Parse a (General) Version, as defined above.
version :: Text -> Either ParsingError Version
-- | Parse a (Complex) Mess, as defined above.
mess :: Text -> Either ParsingError Mess
-- | Parse a Versioning. Assumes the version number is the last
-- token in the string.
versioning' :: Parsec Void Text Versioning
-- | Internal megaparsec parser of semver.
semver' :: Parsec Void Text SemVer
-- | Internal megaparsec parser of pvp.
pvp' :: Parsec Void Text PVP
-- | Internal megaparsec parser of version.
version' :: Parsec Void Text Version
-- | Internal megaparsec parser of mess.
mess' :: Parsec Void Text Mess
-- | Convert any parsed Versioning type to its textual representation.
prettyV :: Versioning -> Text
-- | Convert a SemVer back to its textual representation.
prettySemVer :: SemVer -> Text
-- | Convert a PVP back to its textual representation.
prettyPVP :: PVP -> Text
-- | Convert a Version back to its textual representation.
prettyVer :: Version -> Text
-- | Convert a Mess back to its textual representation.
prettyMess :: Mess -> Text
-- | Pretty-print a ParseErrorBundle. All ParseErrors in the
-- bundle will be pretty-printed in order together with the corresponding
-- offending lines by doing a single efficient pass over the input
-- stream. The rendered String always ends with a newline.
errorBundlePretty :: (Stream s, ShowErrorComponent e) => ParseErrorBundle s e -> String
-- | Simple Lenses compatible with both lens and microlens.
type Lens' s a = forall f. Functor f => (a -> f a) -> s -> f s
-- | Simple Traversals compatible with both lens and microlens.
type Traversal' s a = forall f. Applicative f => (a -> f a) -> s -> f s
-- | Version types which sanely and safely yield SemVer-like
-- information about themselves. For instances other than SemVer
-- itself however, these optics may not yield anything, depending
-- on the actual value being traversed. Hence, the optics here are all
-- Traversal's.
--
-- Consider the Version 1.2.3.4.5. We can imagine wanting
-- to increment the minor number:
--
--
-- λ "1.2.3.4.5" & minor %~ (+ 1)
-- "1.3.3.4.5"
--
--
-- But of course something like this would fail:
--
--
-- λ "1.e.3.4.5" & minor %~ (+ 1)
-- "1.e.3.4.5"
--
--
-- However!
--
--
-- λ "1.e.3.4.5" & major %~ (+ 1)
-- "2.e.3.4.5"
--
class Semantic v
-- |
-- MAJOR.minor.patch-prerel+meta
--
major :: Semantic v => Traversal' v Word
-- |
-- major.MINOR.patch-prerel+meta
--
minor :: Semantic v => Traversal' v Word
-- |
-- major.minor.PATCH-prerel+meta
--
patch :: Semantic v => Traversal' v Word
-- |
-- major.minor.patch-PREREL+meta
--
release :: Semantic v => Traversal' v [VChunk]
-- |
-- major.minor.patch-prerel+META
--
meta :: Semantic v => Traversal' v [VChunk]
-- | A Natural Transformation into an proper SemVer.
semantic :: Semantic v => Traversal' v SemVer
-- | Traverse some Text for its inner versioning.
--
--
-- λ "1.2.3" & _Versioning . _Ideal . patch %~ (+ 1) -- or just: "1.2.3" & patch %~ (+ 1)
-- "1.2.4"
--
_Versioning :: Traversal' Text Versioning
-- | Traverse some Text for its inner SemVer.
_SemVer :: Traversal' Text SemVer
-- | Traverse some Text for its inner Version.
_Version :: Traversal' Text Version
-- | Traverse some Text for its inner Mess.
_Mess :: Traversal' Text Mess
_Ideal :: Traversal' Versioning SemVer
_General :: Traversal' Versioning Version
_Complex :: Traversal' Versioning Mess
epoch :: Lens' Version (Maybe Word)
_Digits :: Traversal' VUnit Word
_Str :: Traversal' VUnit Text
instance Data.Hashable.Class.Hashable Data.Versions.Versioning
instance Control.DeepSeq.NFData Data.Versions.Versioning
instance GHC.Generics.Generic Data.Versions.Versioning
instance GHC.Show.Show Data.Versions.Versioning
instance GHC.Classes.Eq Data.Versions.Versioning
instance Data.Hashable.Class.Hashable Data.Versions.Mess
instance Control.DeepSeq.NFData Data.Versions.Mess
instance GHC.Generics.Generic Data.Versions.Mess
instance GHC.Show.Show Data.Versions.Mess
instance GHC.Classes.Eq Data.Versions.Mess
instance Data.Hashable.Class.Hashable Data.Versions.VSep
instance Control.DeepSeq.NFData Data.Versions.VSep
instance GHC.Generics.Generic Data.Versions.VSep
instance GHC.Show.Show Data.Versions.VSep
instance GHC.Classes.Eq Data.Versions.VSep
instance Data.Hashable.Class.Hashable Data.Versions.Version
instance Control.DeepSeq.NFData Data.Versions.Version
instance GHC.Generics.Generic Data.Versions.Version
instance GHC.Show.Show Data.Versions.Version
instance GHC.Classes.Eq Data.Versions.Version
instance Data.Hashable.Class.Hashable Data.Versions.PVP
instance Control.DeepSeq.NFData Data.Versions.PVP
instance GHC.Generics.Generic Data.Versions.PVP
instance GHC.Show.Show Data.Versions.PVP
instance GHC.Classes.Ord Data.Versions.PVP
instance GHC.Classes.Eq Data.Versions.PVP
instance Data.Hashable.Class.Hashable Data.Versions.SemVer
instance Control.DeepSeq.NFData Data.Versions.SemVer
instance GHC.Generics.Generic Data.Versions.SemVer
instance GHC.Show.Show Data.Versions.SemVer
instance Data.Hashable.Class.Hashable Data.Versions.VUnit
instance Control.DeepSeq.NFData Data.Versions.VUnit
instance GHC.Generics.Generic Data.Versions.VUnit
instance GHC.Classes.Ord Data.Versions.VUnit
instance GHC.Read.Read Data.Versions.VUnit
instance GHC.Show.Show Data.Versions.VUnit
instance GHC.Classes.Eq Data.Versions.VUnit
instance GHC.Classes.Ord Data.Versions.Versioning
instance Data.Versions.Semantic Data.Versions.Versioning
instance GHC.Classes.Ord Data.Versions.Mess
instance Data.Versions.Semantic Data.Versions.Mess
instance GHC.Base.Semigroup Data.Versions.Version
instance GHC.Base.Monoid Data.Versions.Version
instance GHC.Classes.Ord Data.Versions.Version
instance Data.Versions.Semantic Data.Versions.Version
instance GHC.Base.Semigroup Data.Versions.PVP
instance GHC.Base.Monoid Data.Versions.PVP
instance Data.Versions.Semantic Data.Versions.PVP
instance Data.Versions.Semantic Data.Text.Internal.Text
instance Data.Versions.Semantic Data.Versions.SemVer
instance GHC.Classes.Eq Data.Versions.SemVer
instance GHC.Classes.Ord Data.Versions.SemVer
instance GHC.Base.Semigroup Data.Versions.SemVer
instance GHC.Base.Monoid Data.Versions.SemVer
instance GHC.Base.Semigroup Data.Versions.VUnit
instance GHC.Base.Monoid Data.Versions.VUnit