packages feed

hw-aeson 0.1.1.0 → 0.1.1.1

raw patch · 4 files changed

+56/−14 lines, 4 filesdep ~aesondep ~doctestdep ~hedgehogPVP: minor bump suggested

API additions: PVP suggests at least a minor version bump

Dependency ranges changed: aeson, doctest, hedgehog

API changes (from Hackage documentation)

+ HaskellWorks.Data.Aeson: (.!=) :: (KeyValue kv, ToJSON v) => Key -> v -> kv
+ HaskellWorks.Data.Aeson: (.?=) :: (KeyValue p, ToJSON v, Monoid p) => Key -> Maybe v -> p
+ HaskellWorks.Data.Aeson: JsonEndo :: ([a] -> [a]) -> JsonEndo a
+ HaskellWorks.Data.Aeson: [unJsonEndo] :: JsonEndo a -> [a] -> [a]
+ HaskellWorks.Data.Aeson: infixr 7 .!=
+ HaskellWorks.Data.Aeson: instance Data.Aeson.Types.ToJSON.KeyValue a => Data.Aeson.Types.ToJSON.KeyValue (HaskellWorks.Data.Aeson.JsonEndo a)
+ HaskellWorks.Data.Aeson: instance GHC.Base.Monoid (HaskellWorks.Data.Aeson.JsonEndo a)
+ HaskellWorks.Data.Aeson: instance GHC.Base.Semigroup (HaskellWorks.Data.Aeson.JsonEndo a)
+ HaskellWorks.Data.Aeson: newtype JsonEndo a
+ HaskellWorks.Data.Aeson: objectEndo :: [JsonEndo Pair] -> Value

Files

README.md view
@@ -1,3 +1,3 @@ # hw-aeson -[![CircleCI](https://circleci.com/gh/haskell-works/hw-aeson.svg?style=svg)](https://circleci.com/gh/haskell-works/hw-aeson)+[![Binaries](https://github.com/haskell-works/hw-aeson/actions/workflows/haskell.yml/badge.svg)](https://github.com/haskell-works/hw-aeson/actions/workflows/haskell.yml)
hw-aeson.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.2  name:                   hw-aeson-version:                0.1.1.0+version:                0.1.1.1 synopsis:               Convenience functions for Aeson description:            Convenience functions for Aeson. category:               Data, JSON@@ -9,10 +9,10 @@ bug-reports:            https://github.com/haskell-works/hw-aeson/issues author:                 John Ky maintainer:             newhoggy@gmail.com-copyright:              2018-2020 John Ky+copyright:              2018-2022 John Ky license:                BSD-3-Clause license-file:           LICENSE-tested-with:            GHC == 8.10.1, GHC == 8.8.3, GHC == 8.6.5, GHC == 8.4.4+tested-with:            GHC == 9.2.2, GHC == 9.0.2, GHC == 8.10.7, GHC == 8.8.4, GHC == 8.6.5 build-type:             Simple extra-source-files:     README.md @@ -22,10 +22,10 @@  common base                       { build-depends: base                       >= 4.11       && < 5      } -common doctest                    { build-depends: doctest                    >= 0.16.2     && < 0.17   }+common doctest                    { build-depends: doctest                    >= 0.16.2     && < 0.21   } common doctest-discover           { build-depends: doctest-discover           >= 0.2        && < 0.3    }-common aeson                      { build-depends: aeson                      >= 1.4        && < 1.5    }-common hedgehog                   { build-depends: hedgehog                   >= 0.6        && < 1.1    }+common aeson                      { build-depends: aeson                      >= 1.4        && < 2.1    }+common hedgehog                   { build-depends: hedgehog                   >= 0.6        && < 1.3    } common hspec                      { build-depends: hspec                      >= 2.4        && < 3      } common text                       { build-depends: text                       >= 1.2        && < 1.3    } @@ -67,7 +67,7 @@                       , hw-aeson   default-language:     Haskell2010   type:                 exitcode-stdio-1.0-  ghc-options:          -threaded+  ghc-options:          -threaded -rtsopts -with-rtsopts=-N   main-is:              DoctestDriver.hs   HS-Source-Dirs:       doctest   build-tool-depends:   doctest-discover:doctest-discover
src/HaskellWorks/Data/Aeson.hs view
@@ -1,13 +1,32 @@+{-# LANGUAGE DerivingVia #-}+ module HaskellWorks.Data.Aeson-    ( objectWithoutNulls+    ( JsonEndo(..)+    , objectWithoutNulls     , readJson+    , objectEndo+    , (.?=)+    , (.!=)     ) where -import Data.Aeson-import Data.Aeson.Types-import Data.Text-import Text.Read+import Text.Read (readMaybe)+import Data.Aeson (pairs, object, KeyValue((.=)), ToJSON(toJSON, toEncoding), Series, Value(Null))+import Data.Aeson.Encoding (Encoding)+import Data.Aeson.Key (Key)+import Data.Aeson.Types (Pair, Parser)+import Data.Monoid (Endo(..)) +infixr 7 .?=+infixr 7 .!=++newtype JsonEndo a = JsonEndo+  { unJsonEndo :: [a] -> [a]+  }+  deriving (Semigroup, Monoid) via (Endo [a])++instance KeyValue a => KeyValue (JsonEndo a) where+  k .= v = JsonEndo (k .= v:)+ objectWithoutNulls :: [Pair] -> Value objectWithoutNulls = object . Prelude.filter (not . isNull . snd)   where@@ -18,3 +37,26 @@ readJson t s = case readMaybe s of   Just a  -> pure a   Nothing -> fail $ "Could not parse " <> t++-- | Render optional fields as missing in JSON output.+(.?=) :: (KeyValue p, ToJSON v, Monoid p) => Key -> Maybe v -> p+(.?=) k mv = case mv of+  Just v -> k .= v+  Nothing -> mempty++-- | Same as '.=', but with lower precedence to work well with lens.+(.!=) :: (KeyValue kv, ToJSON v) => Key -> v -> kv+(.!=) = (.=)++-- | Same as 'object' except used in combination with '.?=' and '.!=' instead of '.='.+--+-- For example:+--+-- @+-- 'toJSON' o = 'objectEndo'+--   [ \"mandatory\" '.!=' o '^.' the @\"mandatory\"+--   , \"optional\"  '.?=' o '^.' the @\"optional\"+--   ]+-- @+objectEndo :: [JsonEndo Pair] -> Value+objectEndo es = object $ unJsonEndo (mconcat es) []
test/HaskellWorks/Data/AesonSpec.hs view
@@ -8,7 +8,7 @@ import HaskellWorks.Data.Aeson import Test.Hspec -{-# ANN module ("HLint: ignore Redundant do"  :: String) #-}+{- HLINT ignore "Redundant do"        -}  spec :: Spec spec = describe "HaskellWorks.Data.Aeson" $ do