persistent 2.14.1.0 → 2.14.2.0
raw patch · 5 files changed
+111/−7 lines, 5 filesdep ~aesondep ~template-haskellPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aeson, template-haskell
API changes (from Hackage documentation)
+ Database.Persist.TH: mpsCamelCaseCompositeKeySelector :: MkPersistSettings -> Bool
Files
- ChangeLog.md +6/−0
- Database/Persist/TH.hs +34/−1
- persistent.cabal +2/−1
- test/Database/Persist/TH/CompositeKeyStyleSpec.hs +62/−0
- test/Database/Persist/THSpec.hs +7/−5
ChangeLog.md view
@@ -1,5 +1,11 @@ # Changelog for persistent +## 2.14.2.0++* [#1421](https://github.com/yesodweb/persistent/pull/1421)+ * Add `mpsCamelCaseCompositeKeySelector` field to `MkPersistSettings`,+ which define the style of the entity's composite key.+ ## 2.14.1.0 * [#1418](https://github.com/yesodweb/persistent/pull/1418/)
Database/Persist/TH.hs view
@@ -39,6 +39,7 @@ , mpsEntityJSON , mpsGenerateLenses , mpsDeriveInstances+ , mpsCamelCaseCompositeKeySelector , EntityJSON(..) , mkPersistSettings , sqlSettings@@ -991,6 +992,33 @@ -- ^ TODO: document -- -- @since 2.13.0.0+ , mpsCamelCaseCompositeKeySelector :: Bool+ -- ^ Should we generate composite key accessors in the correct CamelCase style.+ --+ -- If the 'mpsCamelCaseCompositeKeySelector' value is set to 'False',+ -- then the field part of the accessor starts with the lowercase.+ -- This is a legacy style.+ --+ -- @+ -- data Key CompanyUser = CompanyUserKey+ -- { companyUserKeycompanyId :: CompanyId+ -- , companyUserKeyuserId :: UserId+ -- }+ -- @+ --+ -- If the 'mpsCamelCaseCompositeKeySelector' value is set to 'True',+ -- then field accessors are generated in CamelCase style.+ --+ -- @+ -- data Key CompanyUser = CompanyUserKey+ -- { companyUserKeyCompanyId :: CompanyId+ -- , companyUserKeyUserId :: UserId+ -- }+ -- @++ -- Default: False+ --+ -- @since 2.14.2.0 } {-# DEPRECATED mpsGeneric "The mpsGeneric function adds a considerable amount of overhead and complexity to the library without bringing significant benefit. We would like to remove it. If you require this feature, please comment on the linked GitHub issue, and we'll either keep it around, or we can figure out a nicer way to solve your problem.\n\n Github: https://github.com/yesodweb/persistent/issues/1204" #-}@@ -1035,6 +1063,7 @@ , mpsDeriveInstances = [] , mpsImplicitIdDef = autoIncrementingInteger+ , mpsCamelCaseCompositeKeySelector = False } -- | Use the 'SqlPersist' backend.@@ -3088,7 +3117,11 @@ | pkNewtype mps entDef = unKeyName entDef | otherwise =- mkName $ T.unpack $ lowerFirst (keyText entDef) `mappend` unFieldNameHS fieldDef+ mkName $ T.unpack $ lowerFirst (keyText entDef) `mappend` fieldName+ where+ fieldName = modifyFieldName (unFieldNameHS fieldDef)+ modifyFieldName =+ if mpsCamelCaseCompositeKeySelector mps then upperFirst else id filterConName :: MkPersistSettings
persistent.cabal view
@@ -1,5 +1,5 @@ name: persistent-version: 2.14.1.0+version: 2.14.2.0 license: MIT license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>@@ -166,6 +166,7 @@ Database.Persist.PersistValueSpec Database.Persist.QuasiSpec Database.Persist.TH.CommentSpec+ Database.Persist.TH.CompositeKeyStyleSpec Database.Persist.TH.DiscoverEntitiesSpec Database.Persist.TH.EmbedSpec Database.Persist.TH.ForeignRefSpec
+ test/Database/Persist/TH/CompositeKeyStyleSpec.hs view
@@ -0,0 +1,62 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE UndecidableInstances #-}++module Database.Persist.TH.CompositeKeyStyleSpec where++import Data.Data (Data, constrFields, toConstr)+import Data.Text (Text)+import Database.Persist.Sql+import Database.Persist.TH+import Test.Hspec hiding (Selector)++mkPersist sqlSettings+ [persistLowerCase|+ CompanyUserLegacyStyle+ companyName Text+ userName Text+ Primary companyName userName+ |]++deriving instance Data CompanyUserLegacyStyle+deriving instance Data (Key CompanyUserLegacyStyle)++mkPersist sqlSettings {mpsCamelCaseCompositeKeySelector = True}+ [persistLowerCase|+ CompanyUserCamelStyle+ companyName Text+ userName Text+ Primary companyName userName+ |]++deriving instance Data CompanyUserCamelStyle+deriving instance Data (Key CompanyUserCamelStyle)++spec :: Spec+spec = describe "CompositeKeyStyleSpec" $ do+ describe "mpsCamelCaseCompositeKeySelector is False" $ do+ it "Should generate Legacy style key selectors" $ do+ let key = CompanyUserLegacyStyleKey "cName" "uName"++ constrFields (toConstr key)+ `shouldBe`+ [ "companyUserLegacyStyleKeycompanyName"+ , "companyUserLegacyStyleKeyuserName"+ ]+ describe "mpsCamelCaseCompositeKeySelector is True" $ do+ it "Should generate CamelCase style key selectors" $ do+ let key = CompanyUserCamelStyleKey "cName" "uName"++ constrFields (toConstr key)+ `shouldBe`+ [ "companyUserCamelStyleKeyCompanyName"+ , "companyUserCamelStyleKeyUserName"+ ]
test/Database/Persist/THSpec.hs view
@@ -1,10 +1,10 @@-{-# LANGUAGE LambdaCase #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE LambdaCase #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-}@@ -24,8 +24,6 @@ module Database.Persist.THSpec where -import System.Environment-import Data.Time import Control.Applicative (Const(..)) import Data.Aeson (decode, encode) import Data.ByteString.Lazy.Char8 ()@@ -35,7 +33,9 @@ import qualified Data.List as List import Data.Proxy import Data.Text (Text, pack)+import Data.Time import GHC.Generics (Generic)+import System.Environment import Test.Hspec import Test.Hspec.QuickCheck import Test.QuickCheck.Arbitrary@@ -50,25 +50,26 @@ import qualified Database.Persist.TH.CommentSpec as CommentSpec+import qualified Database.Persist.TH.CompositeKeyStyleSpec as CompositeKeyStyleSpec import qualified Database.Persist.TH.DiscoverEntitiesSpec as DiscoverEntitiesSpec import qualified Database.Persist.TH.EmbedSpec as EmbedSpec import qualified Database.Persist.TH.ForeignRefSpec as ForeignRefSpec import qualified Database.Persist.TH.ImplicitIdColSpec as ImplicitIdColSpec import qualified Database.Persist.TH.JsonEncodingSpec as JsonEncodingSpec import qualified Database.Persist.TH.KindEntitiesSpec as KindEntitiesSpec-import qualified Database.Persist.TH.NestedSymbolsInTypeSpec as NestedSymbolsInTypeSpec import qualified Database.Persist.TH.MaybeFieldDefsSpec as MaybeFieldDefsSpec import qualified Database.Persist.TH.MigrationOnlySpec as MigrationOnlySpec import qualified Database.Persist.TH.MultiBlockSpec as MultiBlockSpec+import qualified Database.Persist.TH.NestedSymbolsInTypeSpec as NestedSymbolsInTypeSpec import qualified Database.Persist.TH.NoFieldSelectorsSpec as NoFieldSelectorsSpec import qualified Database.Persist.TH.OverloadedLabelSpec as OverloadedLabelSpec import qualified Database.Persist.TH.PersistWithSpec as PersistWithSpec import qualified Database.Persist.TH.RequireOnlyPersistImportSpec as RequireOnlyPersistImportSpec import qualified Database.Persist.TH.SharedPrimaryKeyImportedSpec as SharedPrimaryKeyImportedSpec import qualified Database.Persist.TH.SharedPrimaryKeySpec as SharedPrimaryKeySpec+import qualified Database.Persist.TH.SumSpec as SumSpec import qualified Database.Persist.TH.ToFromPersistValuesSpec as ToFromPersistValuesSpec import qualified Database.Persist.TH.TypeLitFieldDefsSpec as TypeLitFieldDefsSpec-import qualified Database.Persist.TH.SumSpec as SumSpec -- test to ensure we can have types ending in Id that don't trash the TH -- machinery@@ -198,6 +199,7 @@ ToFromPersistValuesSpec.spec JsonEncodingSpec.spec CommentSpec.spec+ CompositeKeyStyleSpec.spec describe "TestDefaultKeyCol" $ do let EntityIdField FieldDef{..} = entityId (entityDef (Proxy @TestDefaultKeyCol))