packages feed

generic-override-aeson 0.0.0.0 → 0.0.0.2

raw patch · 5 files changed

+144/−29 lines, 5 filesdep ~aesondep ~generic-overridePVP ok

version bump matches the API change (PVP)

Dependency ranges changed: aeson, generic-override

API changes (from Hackage documentation)

Files

+ CHANGELOG.md view
@@ -0,0 +1,9 @@+# Changelog for generic-override-aeson++## 0.0.0.1++* Bumping dependency bounds to support aeson 1.5++## 0.0.0.0++* Initial release
+ README.md view
@@ -0,0 +1,75 @@+# generic-override++[![Hackage](https://img.shields.io/hackage/v/generic-override.svg?logo=haskell&color=blueviolet)](https://hackage.haskell.org/package/generic-override)+[![Build](https://img.shields.io/travis/estatico/generic-override.svg?logo=travis)](http://travis-ci.org/estatico/generic-override)++For the associated blog post describing how this works, see+[Overriding Type Class Instances](http://caryrobbins.com/dev/overriding-type-class-instances-2/).++-------------------------++This repo contains the following libraries -+* [generic-override](https://hackage.haskell.org/package/generic-override)+* [generic-override-aeson](https://hackage.haskell.org/package/generic-override-aeson)++-------------------------++This library provides the ability to override instances used by generic derivation.++## Example++```haskell+-- Needed for constructing our 'Override' type in the DerivingVia clause.+import Data.Override (Override(Override), As)+-- Provides aeson support for generic-override (lives in generic-override-aeson).+import Data.Override.Aeson ()+-- Basic imports we need for the example.+import Data.Aeson (ToJSON(toJSON))+import Data.Text (Text)+import qualified Data.Text as Text++-- | A simple record type. We'll use generic derivation for the 'ToJSON' instance+-- but override the instances used by derivation for the 'String' and 'baz'+-- fields.+data MyRec = MyRec+  { foo :: Int+  , bar :: String+  , baz :: Text+  } deriving stock (Show, Eq, Generic)+    deriving (ToJSON)+      via Override MyRec+            '[ -- Derive the 'String' field via 'CharArray'.+               String `As` CharArray+               -- Derive the 'baz' field via 'Uptext'.+             , "baz" `As` Uptext+             ]++-- | Newtype wrapper to override 'ToJSON Text' instances with ones that+-- encode the 'Text' as uppercase.+newtype Uptext = Uptext { unUptext :: Text }++instance ToJSON Uptext where+  toJSON = toJSON . Text.toUpper . unUptext++-- | Newtype wrapper to override 'ToJSON String' instances with ones that+-- encode the 'String' as a JSON array of characters.+newtype CharArray = CharArray { unCharArray :: String }++instance ToJSON CharArray where+  toJSON = toJSON . map (:[]) . unCharArray+```++Let's serialize an example `MyRec` to JSON -++```haskell+% ghci+> :{+  Data.ByteString.Lazy.Char8.putStrLn+    $ Data.Aeson.encode+    $ Data.Aeson.toJSON MyRec { foo = 12, bar = "hi", baz = "bye" }+  :}+{"foo":12,"bar":["h","i"],"baz":"BYE"}+```++For more examples, see the test suite in+[generic-override-aeson](https://github.com/estatico/generic-override/blob/master/generic-override-aeson/test/Test.hs).
generic-override-aeson.cabal view
@@ -1,48 +1,53 @@-cabal-version: 1.12-name: generic-override-aeson-version: 0.0.0.0-license: BSD3-license-file: LICENSE-copyright: 2020 Estatico Studios LLC-maintainer: carymrobbins@gmail.com-author: Cary Robbins-homepage: https://github.com/estatico/generic-override#readme-bug-reports: https://github.com/estatico/generic-override/issues-synopsis: Provides orphan instances necessary for integrating generic-override and aeson+cabal-version:      1.12+name:               generic-override-aeson+version:            0.0.0.2+license:            BSD3+license-file:       LICENSE+copyright:          2020 Estatico Studios LLC+maintainer:         carymrobbins@gmail.com+author:             Cary Robbins+homepage:           https://github.com/estatico/generic-override#readme+bug-reports:        https://github.com/estatico/generic-override/issues+synopsis:+    Provides orphan instances necessary for integrating generic-override and aeson+ description:     Please see the README on GitHub at <https://github.com/estatico/generic-override#readme>-category: Generics-build-type: Simple +category:           Generics+build-type:         Simple+extra-source-files:+    README.md+    CHANGELOG.md+ source-repository head-    type: git+    type:     git     location: https://github.com/estatico/generic-override  library-    exposed-modules:-        Data.Override.Aeson-    hs-source-dirs: src-    other-modules:-        Paths_generic_override_aeson+    exposed-modules:  Data.Override.Aeson+    hs-source-dirs:   src+    other-modules:    Paths_generic_override_aeson     default-language: Haskell2010     build-depends:-        aeson >=1.4.5.0 && <1.5,+        aeson >=1.4 && <1.6,         base >=4.7 && <5,-        generic-override >=0.0.0.0 && <0.1+        generic-override >=0.2.0.0 && <0.3  test-suite generic-override-aeson-test-    type: exitcode-stdio-1.0-    main-is: Test.hs-    hs-source-dirs: test+    type:             exitcode-stdio-1.0+    main-is:          Test.hs+    hs-source-dirs:   test     other-modules:         LispCaseAeson         Paths_generic_override_aeson+     default-language: Haskell2010-    ghc-options: -threaded -rtsopts -with-rtsopts=-N+    ghc-options:      -threaded -rtsopts -with-rtsopts=-N     build-depends:-        aeson >=1.4.5.0 && <1.5,+        aeson >=1.4 && <1.6,         base >=4.7 && <5,-        generic-override >=0.0.0.0 && <0.1,+        generic-override >=0.2.0.0 && <0.3,         generic-override-aeson -any,         hspec >=2.7.1 && <2.8,         text >=1.2.3.1 && <1.3
src/Data/Override/Aeson.hs view
@@ -15,7 +15,7 @@ module Data.Override.Aeson where  import Data.Coerce (Coercible, coerce)-import Data.Override (Override, Overridden(Overridden), Using)+import Data.Override.Internal (Override, Overridden(Overridden), Using) import GHC.Generics (Generic, Rep) import qualified Data.Aeson as Aeson 
test/Test.hs view
@@ -15,7 +15,7 @@  import Data.Aeson (FromJSON(parseJSON), ToJSON(toJSON), Result(Success), fromJSON) import Data.Aeson.QQ.Simple (aesonQQ)-import Data.Override (Override(Override), As)+import Data.Override (Override(Override), As, With) import Data.Override.Aeson () import Data.Text (Text) import GHC.Generics (Generic)@@ -33,6 +33,7 @@     it "Rec4" testRec4     it "Rec5" testRec5     it "Rec6" testRec6+    it "Rec7" testRec6  newtype Uptext = Uptext { unUptext :: Text } @@ -198,6 +199,31 @@ testRec6 :: IO () testRec6 = do   let r = Rec6 { foo = 1, bar = "hi", baz = "bye" }+  let j = [aesonQQ|+    {+      "foo": "1",+      "bar": ["h", "i"],+      "baz": "bye"+    }+  |]+  toJSON r `shouldBe` j+  fromJSON j `shouldBe` Success r++-- Test 'Override' for both 'ToJSON' and 'FromJSON'.+data Rec7 = Rec7+  { foo :: Int+  , bar :: String+  , baz :: Text+  } deriving stock (Show, Eq, Generic)+    deriving (ToJSON, FromJSON)+      via Override Rec7+            '[ "foo" `With` Shown+             , String `With` CharArray+             ]++testRec7 :: IO ()+testRec7 = do+  let r = Rec7 { foo = 1, bar = "hi", baz = "bye" }   let j = [aesonQQ|     {       "foo": "1",