1
1
mirror of https://github.com/nmattia/niv.git synced 2024-10-06 12:27:35 +03:00

Work with (only) aeson 2.

This commit is contained in:
Troels Henriksen 2022-03-15 15:10:47 +01:00 committed by Nicolas Mattia
parent 5912c378c2
commit 9d09779ad1
8 changed files with 47 additions and 39 deletions

View File

@ -20,7 +20,7 @@
"README.md"
],
"dependencies": [
"aeson",
"aeson >= 2",
"aeson-pretty",
"ansi-terminal",
"base < 5",

View File

@ -13,6 +13,8 @@ import Control.Monad
import Control.Monad.Reader
import Data.Aeson ((.=))
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Key as K
import qualified Data.Aeson.KeyMap as KM
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as B8
import Data.Char (isSpace)
@ -256,7 +258,7 @@ initNixpkgs nixpkgs =
(PackageName "nixpkgs")
( specToFreeAttrs $
PackageSpec $
HMS.fromList
KM.fromList
[ "owner" .= owner,
"repo" .= repo,
"branch" .= branch
@ -330,8 +332,8 @@ parseCmdArgs cmd = collapse <$> parseNameAndShortcut <*> parsePackageSpec cmd
(pname, baseSpec) = case specAndName of
(Just (_, spec), Just pname') -> (pname', PackageSpec spec)
(Just (pname', spec), Nothing) -> (pname', PackageSpec spec)
(Nothing, Just pname') -> (pname', PackageSpec HMS.empty)
(Nothing, Nothing) -> (PackageName "unnamed", PackageSpec HMS.empty)
(Nothing, Just pname') -> (pname', PackageSpec KM.empty)
(Nothing, Nothing) -> (PackageName "unnamed", PackageSpec KM.empty)
parseNameAndShortcut =
(,)
<$> Opts.optional
@ -395,11 +397,11 @@ cmdShow = \case
showPackage :: MonadIO io => PackageName -> PackageSpec -> io ()
showPackage (PackageName pname) (PackageSpec spec) = do
tsay $ tbold pname
forM_ (HMS.toList spec) $ \(attrName, attrValValue) -> do
forM_ (KM.toList spec) $ \(attrName, attrValValue) -> do
let attrValue = case attrValValue of
Aeson.String str -> str
_ -> tfaint "<barabajagal>"
tsay $ " " <> attrName <> ": " <> attrValue
tsay $ " " <> K.toText attrName <> ": " <> attrValue
-------------------------------------------------------------------------------
-- UPDATE
@ -427,10 +429,10 @@ parseCmdUpdate =
]
specToFreeAttrs :: PackageSpec -> Attrs
specToFreeAttrs = fmap (Free,) . unPackageSpec
specToFreeAttrs = KM.toHashMapText . fmap (Free,) . unPackageSpec
specToLockedAttrs :: PackageSpec -> Attrs
specToLockedAttrs = fmap (Locked,) . unPackageSpec
specToLockedAttrs = KM.toHashMapText . fmap (Locked,) . unPackageSpec
cmdUpdate :: Maybe (PackageName, PackageSpec) -> NIO ()
cmdUpdate = \case
@ -442,7 +444,7 @@ cmdUpdate = \case
Just defaultSpec -> do
-- lookup the "type" to find a Cmd to run, defaulting to legacy
-- github
let cmd = case HMS.lookup "type" (unPackageSpec defaultSpec) of
let cmd = case KM.lookup "type" (unPackageSpec defaultSpec) of
Just "git" -> gitCmd
Just "local" -> localCmd
_ -> githubCmd
@ -465,7 +467,7 @@ cmdUpdate = \case
let initialSpec = specToFreeAttrs defaultSpec
-- lookup the "type" to find a Cmd to run, defaulting to legacy
-- github
let cmd = case HMS.lookup "type" (unPackageSpec defaultSpec) of
let cmd = case KM.lookup "type" (unPackageSpec defaultSpec) of
Just "git" -> gitCmd
Just "local" -> localCmd
_ -> githubCmd
@ -590,8 +592,8 @@ cmdDrop packageName = \case
Just (PackageSpec packageSpec) ->
pure $
PackageSpec $
HMS.mapMaybeWithKey
(\k v -> if k `elem` attrs then Nothing else Just v)
KM.mapMaybeWithKey
(\k v -> if K.toText k `elem` attrs then Nothing else Just v)
packageSpec
li $
setSources fsj $

View File

@ -10,6 +10,8 @@ module Niv.Git.Cmd where
import Control.Applicative
import Control.Arrow
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Key as K
import qualified Data.Aeson.KeyMap as KM
import qualified Data.ByteString.Char8 as B8
import qualified Data.HashMap.Strict as HMS
import Data.Maybe
@ -60,8 +62,8 @@ parseGitShortcut txt'@(T.dropWhileEnd (== '/') -> txt) =
then case T.splitOn "/" txt of
[] -> Nothing
(last -> w) -> case T.stripSuffix ".git" w of
Nothing -> Just (PackageName w, HMS.singleton "repo" (Aeson.String txt'))
Just w' -> Just (PackageName w', HMS.singleton "repo" (Aeson.String txt'))
Nothing -> Just (PackageName w, KM.singleton "repo" (Aeson.String txt'))
Just w' -> Just (PackageName w', KM.singleton "repo" (Aeson.String txt'))
else Nothing
where
isGitURL =
@ -71,7 +73,7 @@ parseGitShortcut txt'@(T.dropWhileEnd (== '/') -> txt) =
parseGitPackageSpec :: Opts.Parser PackageSpec
parseGitPackageSpec =
(PackageSpec . HMS.fromList)
(PackageSpec . KM.fromList)
<$> many (parseRepo <|> parseBranch <|> parseRev <|> parseAttr <|> parseSAttr)
where
parseRepo =
@ -116,9 +118,9 @@ parseGitPackageSpec =
-- | how to convert to JSON
(String -> Aeson.Value) ->
String ->
Maybe (T.Text, Aeson.Value)
Maybe (K.Key, Aeson.Value)
parseKeyVal toJSON str = case span (/= '=') str of
(key, '=' : val) -> Just (T.pack key, toJSON val)
(key, '=' : val) -> Just (K.fromString key, toJSON val)
_ -> Nothing
describeGit :: Opts.InfoMod a

View File

@ -7,6 +7,7 @@ module Niv.Git.Test
where
import Control.Monad
import qualified Data.Aeson.KeyMap as KM
import Data.Bifunctor
import qualified Data.HashMap.Strict as HMS
import Data.IORef
@ -29,21 +30,21 @@ test_repositoryParse =
Tasty.testCase "git@github.com:nmattia/niv" $
parseGitShortcut "git@github.com:nmattia/niv"
@=? Just
(PackageName "niv", HMS.singleton "repo" "git@github.com:nmattia/niv"),
(PackageName "niv", KM.singleton "repo" "git@github.com:nmattia/niv"),
Tasty.testCase "ssh://git@github.com/stedolan/jq" $
parseGitShortcut "ssh://git@github.com/stedolan/jq"
@=? Just
(PackageName "jq", HMS.singleton "repo" "ssh://git@github.com/stedolan/jq"),
(PackageName "jq", KM.singleton "repo" "ssh://git@github.com/stedolan/jq"),
Tasty.testCase "https://github.com/stedolan/jq.git" $
parseGitShortcut "https://github.com/stedolan/jq.git"
@=? Just
(PackageName "jq", HMS.singleton "repo" "https://github.com/stedolan/jq.git"),
(PackageName "jq", KM.singleton "repo" "https://github.com/stedolan/jq.git"),
Tasty.testCase "https://github.com/stedolan/jq" $
parseGitShortcut "https://github.com/stedolan/jq" @=? Nothing,
Tasty.testCase "~/path/to/repo.git" $
parseGitShortcut "~/path/to/repo.git"
@=? Just
(PackageName "repo", HMS.singleton "repo" "~/path/to/repo.git")
(PackageName "repo", KM.singleton "repo" "~/path/to/repo.git")
]
test_gitUpdates :: Tasty.TestTree

View File

@ -6,9 +6,9 @@
module Niv.GitHub.API where
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.KeyMap as KM
import qualified Data.ByteString.Char8 as BS8
import Data.Functor
import qualified Data.HashMap.Strict as HMS
import Data.Maybe
import Data.String.QQ (s)
import qualified Data.Text as T
@ -37,7 +37,7 @@ githubRepo owner repo = do
let resp = fmap Aeson.eitherDecodeStrict resp0
case (HTTP.getResponseStatusCode resp, HTTP.getResponseBody resp) of
(200, Right (Aeson.Object m)) -> do
let lookupText k = case HMS.lookup k m of
let lookupText k = case KM.lookup k m of
Just (Aeson.String t) -> Just t
_ -> Nothing
pure

View File

@ -13,10 +13,11 @@ where
import Control.Applicative
import Data.Aeson ((.=))
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Key as K
import qualified Data.Aeson.KeyMap as KM
import Data.Bifunctor
import qualified Data.ByteString.Char8 as B8
import Data.Char (isAlphaNum)
import qualified Data.HashMap.Strict as HMS
import Data.Maybe
import Data.String.QQ (s)
import qualified Data.Text as T
@ -45,10 +46,10 @@ githubCmd =
parseGitHubPackageSpec :: Opts.Parser PackageSpec
parseGitHubPackageSpec =
(PackageSpec . HMS.fromList)
(PackageSpec . KM.fromList)
<$> many parseAttribute
where
parseAttribute :: Opts.Parser (T.Text, Aeson.Value)
parseAttribute :: Opts.Parser (K.Key, Aeson.Value)
parseAttribute =
Opts.option
(Opts.maybeReader parseKeyValJSON)
@ -88,22 +89,22 @@ parseGitHubPackageSpec =
-- | how to convert to JSON
(String -> Aeson.Value) ->
String ->
Maybe (T.Text, Aeson.Value)
Maybe (K.Key, Aeson.Value)
parseKeyVal toJSON str = case span (/= '=') str of
(key, '=' : val) -> Just (T.pack key, toJSON val)
(key, '=' : val) -> Just (K.fromString key, toJSON val)
_ -> Nothing
-- Shortcuts for common attributes
shortcutAttributes :: Opts.Parser (T.Text, Aeson.Value)
shortcutAttributes :: Opts.Parser (K.Key, Aeson.Value)
shortcutAttributes =
foldr (<|>) empty $
mkShortcutAttribute
<$> ["branch", "owner", "rev", "version"]
-- TODO: infer those shortcuts from 'Update' keys
mkShortcutAttribute :: T.Text -> Opts.Parser (T.Text, Aeson.Value)
mkShortcutAttribute :: T.Text -> Opts.Parser (K.Key, Aeson.Value)
mkShortcutAttribute = \case
attr@(T.uncons -> Just (c, _)) ->
fmap (second Aeson.String) $
(attr,)
(K.fromText attr,)
<$> Opts.strOption
( Opts.long (T.unpack attr)
<> Opts.short c
@ -144,12 +145,12 @@ parseAddShortcutGitHub str =
) ->
Just
( PackageName repo,
HMS.fromList ["owner" .= owner, "repo" .= repo]
KM.fromList ["owner" .= owner, "repo" .= repo]
)
-- XXX: this should be "Nothing" but for the time being we keep
-- backwards compatibility with "niv add foo" adding "foo" as a
-- package name.
_ -> Just (PackageName str, HMS.empty)
_ -> Just (PackageName str, KM.empty)
-- | The IO (real) github update
githubUpdate' :: Update () ()

View File

@ -10,7 +10,8 @@ module Niv.Local.Cmd where
import Control.Arrow
import qualified Data.Aeson as Aeson
import qualified Data.HashMap.Strict as HMS
import qualified Data.Aeson.Key as K
import qualified Data.Aeson.KeyMap as KM
import qualified Data.Text as T
import Niv.Cmd
import Niv.Sources
@ -36,13 +37,13 @@ parseLocalShortcut txt =
if (T.isPrefixOf "./" txt || T.isPrefixOf "/" txt)
then do
let n = last $ T.splitOn "/" txt
Just (PackageName n, HMS.fromList [("path", Aeson.String txt)])
Just (PackageName n, KM.fromList [("path", Aeson.String txt)])
else Nothing
parseLocalPackageSpec :: Opts.Parser PackageSpec
parseLocalPackageSpec = PackageSpec . HMS.fromList <$> parseParams
parseLocalPackageSpec = PackageSpec . KM.fromList <$> parseParams
where
parseParams :: Opts.Parser [(T.Text, Aeson.Value)]
parseParams :: Opts.Parser [(K.Key, Aeson.Value)]
parseParams = maybe [] pure <$> Opts.optional parsePath
parsePath =
("path",) . Aeson.String

View File

@ -10,6 +10,7 @@ module Niv.Sources where
import Data.Aeson (FromJSON, FromJSONKey, ToJSON, ToJSONKey)
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Extended as Aeson
import qualified Data.Aeson.KeyMap as KM
import Data.Bifunctor (first)
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy.Char8 as BL8
@ -61,7 +62,7 @@ getSourcesEither fsj = do
valueToSources :: Aeson.Value -> Maybe Sources
valueToSources = \case
Aeson.Object obj ->
fmap (Sources . mapKeys PackageName) $
fmap (Sources . mapKeys PackageName . KM.toHashMapText) $
traverse
( \case
Aeson.Object obj' -> Just (PackageSpec obj')
@ -95,7 +96,7 @@ newtype PackageSpec = PackageSpec {unPackageSpec :: Aeson.Object}
-- | Simply discards the 'Freedom'
attrsToSpec :: Attrs -> PackageSpec
attrsToSpec = PackageSpec . fmap snd
attrsToSpec = PackageSpec . KM.fromHashMapText . fmap snd
-- | @nix/sources.json@ or pointed at by 'FindSourcesJson'
pathNixSourcesJson :: FindSourcesJson -> FilePath