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:
parent
5912c378c2
commit
9d09779ad1
@ -20,7 +20,7 @@
|
||||
"README.md"
|
||||
],
|
||||
"dependencies": [
|
||||
"aeson",
|
||||
"aeson >= 2",
|
||||
"aeson-pretty",
|
||||
"ansi-terminal",
|
||||
"base < 5",
|
||||
|
@ -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 $
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 () ()
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user