mirror of
https://github.com/Start9Labs/registry.git
synced 2026-03-26 02:11:53 +00:00
Merge pull request #30 from Start9Labs/feature/emver
fixes issues in operator negation update
This commit is contained in:
@@ -24,6 +24,7 @@ module Lib.Types.Emver
|
|||||||
, satisfies
|
, satisfies
|
||||||
, (<||)
|
, (<||)
|
||||||
, (||>)
|
, (||>)
|
||||||
|
-- we do not export 'None' because it is useful for its internal algebraic properties only
|
||||||
, VersionRange(Anchor, Any, None)
|
, VersionRange(Anchor, Any, None)
|
||||||
, Version(..)
|
, Version(..)
|
||||||
, AnyRange(..)
|
, AnyRange(..)
|
||||||
@@ -140,10 +141,9 @@ instance Show VersionRange where
|
|||||||
show Any = "*"
|
show Any = "*"
|
||||||
show None = "!"
|
show None = "!"
|
||||||
instance Read VersionRange where
|
instance Read VersionRange where
|
||||||
readsPrec _ s = case Atto.parse parseRange (T.pack s) of
|
readsPrec _ s = case Atto.parseOnly parseRange (T.pack s) of
|
||||||
Atto.Fail _ _ _ -> []
|
Left _ -> []
|
||||||
Atto.Partial _ -> []
|
Right a -> [(a, "")]
|
||||||
Atto.Done i r -> [(r, T.unpack i)]
|
|
||||||
|
|
||||||
paren :: String -> String
|
paren :: String -> String
|
||||||
paren = mappend "(" . flip mappend ")"
|
paren = mappend "(" . flip mappend ")"
|
||||||
@@ -182,11 +182,12 @@ satisfies _ None = False
|
|||||||
|
|
||||||
parseOperator :: Atto.Parser Operator
|
parseOperator :: Atto.Parser Operator
|
||||||
parseOperator =
|
parseOperator =
|
||||||
(Atto.char '=' $> Left EQ)
|
(Atto.char '=' $> Right EQ)
|
||||||
<|> (Atto.string ">=" $> Right GT)
|
<|> (Atto.string "!=" $> Left EQ)
|
||||||
<|> (Atto.string "<=" $> Right LT)
|
<|> (Atto.string ">=" $> Left LT)
|
||||||
<|> (Atto.char '>' $> Left GT)
|
<|> (Atto.string "<=" $> Left GT)
|
||||||
<|> (Atto.char '<' $> Left LT)
|
<|> (Atto.char '>' $> Right GT)
|
||||||
|
<|> (Atto.char '<' $> Right LT)
|
||||||
|
|
||||||
parseVersion :: Atto.Parser Version
|
parseVersion :: Atto.Parser Version
|
||||||
parseVersion = do
|
parseVersion = do
|
||||||
@@ -197,7 +198,7 @@ parseVersion = do
|
|||||||
pure $ Version (major', minor', patch', quad')
|
pure $ Version (major', minor', patch', quad')
|
||||||
|
|
||||||
-- >>> Atto.parseOnly parseRange "=2.3.4 1.2.3.4 - 2.3.4.5 (>3.0.0 || <3.4.5)"
|
-- >>> Atto.parseOnly parseRange "=2.3.4 1.2.3.4 - 2.3.4.5 (>3.0.0 || <3.4.5)"
|
||||||
-- Right (=2.3.4 ((>=1.2.3.4 <=2.3.4.5) (>3.0.0 || <3.4.5)))
|
-- Right =2.3.4 >=1.2.3.4 <=2.3.4.5 ((>3.0.0 || <3.4.5))
|
||||||
parseRange :: Atto.Parser VersionRange
|
parseRange :: Atto.Parser VersionRange
|
||||||
parseRange = s <|> (Atto.char '*' *> pure Any)
|
parseRange = s <|> (Atto.char '*' *> pure Any)
|
||||||
where
|
where
|
||||||
@@ -209,8 +210,8 @@ parseRange = s <|> (Atto.char '*' *> pure Any)
|
|||||||
p = unAllRange . foldMap AllRange <$> ((a <|> sub) `Atto.sepBy1` Atto.space)
|
p = unAllRange . foldMap AllRange <$> ((a <|> sub) `Atto.sepBy1` Atto.space)
|
||||||
a = liftA2 Anchor parseOperator parseVersion <|> caret <|> tilde <|> wildcard <|> hyphen
|
a = liftA2 Anchor parseOperator parseVersion <|> caret <|> tilde <|> wildcard <|> hyphen
|
||||||
|
|
||||||
-- >>> Atto.parseOnly parseRange "^2.3.0.5"
|
-- >>> Atto.parseOnly parseRange "^2.3.4.5"
|
||||||
-- Right (>=2.3.0.5 <3.0.0)
|
-- Right >=2.3.4.5 <3.0.0
|
||||||
caret :: Atto.Parser VersionRange
|
caret :: Atto.Parser VersionRange
|
||||||
caret = (Atto.char '^' *> parseVersion) <&> \case
|
caret = (Atto.char '^' *> parseVersion) <&> \case
|
||||||
v@(Version (0, 0, 0, _)) -> Anchor (Right EQ) v
|
v@(Version (0, 0, 0, _)) -> Anchor (Right EQ) v
|
||||||
@@ -219,7 +220,7 @@ caret = (Atto.char '^' *> parseVersion) <&> \case
|
|||||||
v@(Version (x, _, _, _)) -> rangeIE v (Version (x + 1, 0, 0, 0))
|
v@(Version (x, _, _, _)) -> rangeIE v (Version (x + 1, 0, 0, 0))
|
||||||
|
|
||||||
-- >>> Atto.parseOnly tilde "~1.2.3.4"
|
-- >>> Atto.parseOnly tilde "~1.2.3.4"
|
||||||
-- Right (>=1.2.3.4 <1.2.4)
|
-- Right >=1.2.3.4 <1.2.4
|
||||||
tilde :: Atto.Parser VersionRange
|
tilde :: Atto.Parser VersionRange
|
||||||
tilde = (Atto.char '~' *> (Atto.decimal `Atto.sepBy1` Atto.char '.')) >>= \case
|
tilde = (Atto.char '~' *> (Atto.decimal `Atto.sepBy1` Atto.char '.')) >>= \case
|
||||||
[x, y, z, q] -> pure $ rangeIE (Version (x, y, z, q)) (Version (x, y, z + 1, 0))
|
[x, y, z, q] -> pure $ rangeIE (Version (x, y, z, q)) (Version (x, y, z + 1, 0))
|
||||||
@@ -238,7 +239,7 @@ rangeIE :: Version -> Version -> VersionRange
|
|||||||
rangeIE = range True False
|
rangeIE = range True False
|
||||||
|
|
||||||
-- >>> Atto.parseOnly wildcard "1.2.3.x"
|
-- >>> Atto.parseOnly wildcard "1.2.3.x"
|
||||||
-- Right (>=1.2.3 <1.2.4)
|
-- Right >=1.2.3 <1.2.4
|
||||||
wildcard :: Atto.Parser VersionRange
|
wildcard :: Atto.Parser VersionRange
|
||||||
wildcard = (Atto.many1 (Atto.decimal <* Atto.char '.') <* Atto.char 'x') >>= \case
|
wildcard = (Atto.many1 (Atto.decimal <* Atto.char '.') <* Atto.char 'x') >>= \case
|
||||||
[x, y, z] -> pure $ rangeIE (Version (x, y, z, 0)) (Version (x, y, z + 1, 0))
|
[x, y, z] -> pure $ rangeIE (Version (x, y, z, 0)) (Version (x, y, z + 1, 0))
|
||||||
@@ -247,6 +248,6 @@ wildcard = (Atto.many1 (Atto.decimal <* Atto.char '.') <* Atto.char 'x') >>= \ca
|
|||||||
o -> fail $ "Invalid number of version numbers: " <> show (length o)
|
o -> fail $ "Invalid number of version numbers: " <> show (length o)
|
||||||
|
|
||||||
-- >>> Atto.parseOnly hyphen "0.1.2.3 - 1.2.3.4"
|
-- >>> Atto.parseOnly hyphen "0.1.2.3 - 1.2.3.4"
|
||||||
-- Right (>=0.1.2.3 <=1.2.3.4)
|
-- Right >=0.1.2.3 <=1.2.3.4
|
||||||
hyphen :: Atto.Parser VersionRange
|
hyphen :: Atto.Parser VersionRange
|
||||||
hyphen = liftA2 (range True True) parseVersion (Atto.skipSpace *> Atto.char '-' *> Atto.skipSpace *> parseVersion)
|
hyphen = liftA2 (range True True) parseVersion (Atto.skipSpace *> Atto.char '-' *> Atto.skipSpace *> parseVersion)
|
||||||
|
|||||||
Reference in New Issue
Block a user