packages feed

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 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)