deriveJsonNoPrefix 0.1.0.0 → 0.1.0.1
raw patch · 6 files changed
+146/−7 lines, 6 filesdep +deriveJsonNoPrefixdep +hspecdep +textdep ~aesonPVP ok
version bump matches the API change (PVP)
Dependencies added: deriveJsonNoPrefix, hspec, text, unordered-containers
Dependency ranges changed: aeson
API changes (from Hackage documentation)
Files
- ChangeLog.md +5/−0
- README.md +70/−0
- deriveJsonNoPrefix.cabal +25/−7
- src/Data/Aeson/DeriveNoPrefix.hs +1/−0
- test/Data/Aeson/DeriveNoPrefixSpec.hs +30/−0
- test/Data/Aeson/DeriveNoPrefixSpecLib.hs +15/−0
ChangeLog.md view
@@ -2,4 +2,9 @@ ## 0.1.0.1 +- Add tests.+- Add more detailed README.++## 0.1.0.0+ Initial release.
README.md view
@@ -1,3 +1,73 @@ # deriveJsonNoPrefix Template Haskell macros to derive ToJSON/FromJSON instances in a more prefix-friendly manner.++## Example++Suppose you want to create a JSON like this:++```json+{+ "id": "ID STRING",+ "max": 0.789,+ "min": 0.123+}+```++You'd want to define a record type to derive the instance of [ToJSON](http://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:ToJSON) (and possibly [FromJSON](http://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:FromJSON)) automatically:++```hs+{-# LANGUAGE TemplateHaskell #-}++import Data.Aeson.TH++data SomeRecord = SomeRecord+ { id :: String+ , max :: Double+ , min :: Double+ } deriving (Eq, Show)++$(deriveToJSON ''SomeRecord)+```++But you shouldn't define such a record because both `id`, `max`, and `min` are predefined functions of `Prelude`!!++As a workaround, we frequently prefix the record labels with their type name:++```hs+data SomeRecord = SomeRecord+ { someRecordId :: String+ , someRecordMax :: Double+ , someRecordMin :: Double+ } deriving (Eq, Show)+```++Then `deriveToJSON` with a modified option:++```hs+deriveToJSON Json.defaultOptions { fieldLabelModifier = firstLower . drop (length "SomeRecord") } ''SomeRecord+```++That's almost exactly what `deriveToJsonNoTypeNamePrefix` does!! +`deriveToJsonNoTypeNamePrefix` is essentially defined as:++```hs+deriveToJsonNoTypeNamePrefix :: Name -> Q [Dec]+deriveToJsonNoTypeNamePrefix deriver name =+ deriveToJSON Json.defaultOptions { fieldLabelModifier = dropPrefix name } name+```++So now, you don't have reimplement the `fieldLabelModifier` anymore!++```hs+import Data.Aeson.DeriveNoPrefix++$(deriveJsonNoTypeNamePrefix ''SomeRecord)+```++## Other libraries which would solve the same problem++- [extensible](https://hackage.haskell.org/package/extensible).+- And other libraries providing extensible records with `ToJSON` / `FromJSON` instances.++So use this package all of them are too heavy in learning cost / dependency footprint / etc.
deriveJsonNoPrefix.cabal view
@@ -1,14 +1,14 @@--- This file has been generated from package.yaml by hpack version 0.20.0.+-- This file has been generated from package.yaml by hpack version 0.28.2. -- -- see: https://github.com/sol/hpack ----- hash: 74c415c4bbc0bc2e444cf6fbe4775273c0a303d76c37296a0ae26695cd3c3527+-- hash: 23a67c72a62e37dccc7fbe295b2d85f31f964da40fbd65ea1e15e4bd7458ea84 name: deriveJsonNoPrefix-version: 0.1.0.0+version: 0.1.0.1 synopsis: Derive ToJSON/FromJSON instances in a more prefix-friendly manner. description: Please see the README on GitLab at <https://gitlab.com/igrep/deriveJsonNoPrefix#readme>-category: Development+category: Data homepage: https://gitlab.com/igrep/deriveJsonNoPrefix author: Yuji Yamamoto maintainer: whosekiteneverfly@gmail.com@@ -17,7 +17,6 @@ license-file: LICENSE build-type: Simple cabal-version: >= 1.10- extra-source-files: ChangeLog.md README.md@@ -27,14 +26,33 @@ location: https://gitlab.com/igrep/deriveJsonNoPrefix library+ exposed-modules:+ Data.Aeson.DeriveNoPrefix+ other-modules:+ Paths_deriveJsonNoPrefix hs-source-dirs: src build-depends: aeson , base >=4.7 && <5 , template-haskell- exposed-modules:- Data.Aeson.DeriveNoPrefix+ default-language: Haskell2010++test-suite deriveJsonNoPrefix-test+ type: exitcode-stdio-1.0+ main-is: Data/Aeson/DeriveNoPrefixSpec.hs other-modules:+ Data.Aeson.DeriveNoPrefixSpecLib Paths_deriveJsonNoPrefix+ hs-source-dirs:+ test+ ghc-options: -main-is Data.Aeson.DeriveNoPrefixSpec+ build-depends:+ aeson+ , base >=4.7 && <5+ , deriveJsonNoPrefix+ , hspec+ , template-haskell+ , text+ , unordered-containers default-language: Haskell2010
src/Data/Aeson/DeriveNoPrefix.hs view
@@ -1,4 +1,5 @@ -- | Template Haskell macros to derive ToJSON/FromJSON instances in a more prefix-friendly manner.+-- See <https://gitlab.com/igrep/deriveJsonNoPrefix#readme>. module Data.Aeson.DeriveNoPrefix ( deriveJsonNoTypeNamePrefix
+ test/Data/Aeson/DeriveNoPrefixSpec.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE OverloadedStrings #-}++module Data.Aeson.DeriveNoPrefixSpec where+++import qualified Data.Aeson as Json+import qualified Data.HashMap.Strict as HM+import Data.Text ()+import Test.Hspec++import Data.Aeson.DeriveNoPrefixSpecLib+++main :: IO ()+main = hspec $ do+ let jsonVal = Json.Object $+ HM.fromList+ [ ("id", Json.String "the id")+ , ("max", Json.Number 456)+ , ("min", Json.Number 123)+ ]+ record = SomeRecord "the id" 456 123++ describe "ToJSON instance derived by deriveJsonNoTypeNamePrefix" $+ it "the encoded JSON's keys are same as record labels without their type name prefix." $+ Json.toJSON record `shouldBe` jsonVal++ describe "FromJSON instance derived by deriveJsonNoTypeNamePrefix" $+ it "decodes JSONs whose keys are same as record labels without their type name prefix." $+ Json.fromJSON jsonVal `shouldBe` Json.Success record
+ test/Data/Aeson/DeriveNoPrefixSpecLib.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE TemplateHaskell #-}++module Data.Aeson.DeriveNoPrefixSpecLib where++import Data.Aeson.DeriveNoPrefix+++data SomeRecord = SomeRecord+ { someRecordId :: String+ , someRecordMax :: Double+ , someRecordMin :: Double+ } deriving (Eq, Show)+++$(deriveJsonNoTypeNamePrefix ''SomeRecord)