packages feed

persistable-record 0.2.0.0 → 0.3.0.0

raw patch · 2 files changed

+67/−53 lines, 2 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Database.Record.TH: defineHasNotNullKeyInstanceDefault :: String -> Int -> Q [Dec]
- Database.Record.TH: defineHasPrimaryKeyInstanceDefault :: String -> [Int] -> Q [Dec]
- Database.Record.TH: defineRecordDefault :: TypeQ -> String -> [(String, TypeQ)] -> [Name] -> Q [Dec]
- Database.Record.TH: defineRecordTypeDefault :: String -> [(String, TypeQ)] -> [Name] -> Q [Dec]
- Database.Record.TH: recordTypeDefault :: String -> TypeQ
- Database.Record.TH: recordTypeNameDefault :: String -> ConName
+ Database.Record.TH: data NameConfig
+ Database.Record.TH: defaultNameConfig :: NameConfig
+ Database.Record.TH: defineRecordTypeWithConfig :: NameConfig -> String -> String -> [(String, TypeQ)] -> [Name] -> Q [Dec]
+ Database.Record.TH: defineRecordWithConfig :: TypeQ -> NameConfig -> String -> String -> [(String, TypeQ)] -> [Name] -> Q [Dec]
+ Database.Record.TH: instance GHC.Show.Show Database.Record.TH.NameConfig
+ Database.Record.TH: makeRecordPersistableWithSqlTypeWithConfig :: TypeQ -> NameConfig -> String -> String -> Int -> Q [Dec]
+ Database.Record.TH: recordType :: NameConfig -> String -> String -> TypeQ
+ Database.Record.TH: recordTypeName :: NameConfig -> String -> String -> ConName
- Database.Record.TH: makeRecordPersistableWithSqlTypeDefault :: TypeQ -> String -> Int -> Q [Dec]
+ Database.Record.TH: makeRecordPersistableWithSqlTypeDefault :: TypeQ -> String -> String -> Int -> Q [Dec]

Files

persistable-record.cabal view
@@ -1,5 +1,5 @@ name:                persistable-record-version:             0.2.0.0+version:             0.3.0.0 synopsis:            Binding between SQL database values and haskell records. description:         This package contiains types to represent table constraints and                      interfaces to bind between SQL database values and Haskell records.
src/Database/Record/TH.hs view
@@ -16,7 +16,7 @@ module Database.Record.TH (   -- * Generate all templates about record   defineRecord,-  defineRecordDefault,+  defineRecordWithConfig,    -- * Deriving class symbols   derivingEq, derivingShow, derivingRead, derivingData, derivingTypeable,@@ -24,16 +24,16 @@   -- * Table constraint specified by key   defineHasColumnConstraintInstance,   defineHasPrimaryConstraintInstanceDerived,-  defineHasNotNullKeyInstance,   defineHasPrimaryKeyInstance,-  defineHasPrimaryKeyInstanceDefault,-  defineHasNotNullKeyInstanceDefault,+  defineHasNotNullKeyInstance,    -- * Record type-  defineRecordType, defineRecordTypeDefault,+  defineRecordType,+  defineRecordTypeWithConfig,    -- * Function declarations depending on SQL type   makeRecordPersistableWithSqlType,+  makeRecordPersistableWithSqlTypeWithConfig,   makeRecordPersistableWithSqlTypeDefault,    -- * Function declarations against defined record types@@ -52,8 +52,10 @@   reifyRecordType,    -- * Templates about record type name-  recordTypeNameDefault, recordTypeDefault,+  NameConfig,  defaultNameConfig, +  recordTypeName, recordType,+   columnOffsetsVarNameDefault,    persistableFunctionNamesDefault,@@ -93,16 +95,33 @@ import qualified Database.Record.Persistable as Persistable  --- | Generate default name of record type constructor from SQL table name 'String'-recordTypeNameDefault :: String  -- ^ Table name in SQL-                      -> ConName -- ^ Result name-recordTypeNameDefault =  conCamelcaseName+-- | 'NameConfig' type to customize names of expanded record templates.+data NameConfig =+  NameConfig+  { recordTypeName  ::  String -> String -> ConName+    -- ^ Make record type symbol name from schema name and table name in SQL+  , columnName      ::  String -> String -> VarName+    -- ^ Make column variable symbol name from table name and column name in SQL+  } +-- | Dummy show instance. Handy to define show instance recursively.+instance Show NameConfig where+  show = const "<nameConfig>"++-- | Default implementation of 'NameConfig' type+defaultNameConfig :: NameConfig+defaultNameConfig =+  NameConfig+  { recordTypeName  =  const conCamelcaseName+  , columnName      =  const varCamelcaseName+  }+ -- | Record type constructor template from SQL table name 'String'.---   Type name is generated by 'recordTypeNameDefault'.-recordTypeDefault :: String -- ^ Table name in SQL-                  -> TypeQ  -- ^ Result type template-recordTypeDefault =  toTypeCon . recordTypeNameDefault+recordType :: NameConfig -- ^ name rule config+           -> String     -- ^ Schema name string in SQL+           -> String     -- ^ Table name string in SQL+           -> TypeQ      -- ^ Record type constructor+recordType config scm = toTypeCon . recordTypeName config scm  -- | Variable expression of record column offset array. columnOffsetsVarNameDefault :: Name    -- ^ Table type name@@ -148,22 +167,6 @@ defineHasNotNullKeyInstance =   defineHasColumnConstraintInstance [t| NotNull |] --- | Template of 'HasColumnConstraint' 'Primary' instance---   from SQL table name 'String' and key index.-defineHasPrimaryKeyInstanceDefault :: String  -- ^ Table name-                                   -> [Int]   -- ^ Key index which specifies this constraint-                                   -> Q [Dec] -- ^ Declaration of primary key constraint instance-defineHasPrimaryKeyInstanceDefault =-  defineHasPrimaryKeyInstance . recordTypeDefault---- | Template of 'HasColumnConstraint' 'NotNull' instance---   from SQL table name 'String' and key index.-defineHasNotNullKeyInstanceDefault :: String  -- ^ Table name-                                   -> Int     -- ^ Key index which specifies this constraint-                                   -> Q [Dec] -- ^ Declaration of not null key constraint instance-defineHasNotNullKeyInstanceDefault =-  defineHasNotNullKeyInstance . recordTypeDefault- {-# DEPRECATED derivingEq "Use TH quasi-quotation like ''Eq instead of this." #-} -- | Name to specify deriving 'Eq' derivingEq   :: Name@@ -228,13 +231,11 @@ columnDefault :: String -> TypeQ -> (VarName, TypeQ) columnDefault n t = (varCamelcaseName n, t) --- | Record type declaration template from SQL table name 'String'---   and column name 'String' - type pairs, derivings.-defineRecordTypeDefault :: String -> [(String, TypeQ)] -> [Name] -> Q [Dec]-defineRecordTypeDefault table columns =+defineRecordTypeWithConfig :: NameConfig -> String -> String -> [(String, TypeQ)] -> [Name] -> Q [Dec]+defineRecordTypeWithConfig config schema table columns =   defineRecordType-  (recordTypeNameDefault table)-  [ columnDefault n t | (n, t) <- columns ]+  (recordTypeName config schema table)+  [ (columnName config schema n, t) | (n, t) <- columns ]   -- | Record parser template.@@ -318,18 +319,29 @@ toSqlNameDefault :: String -> VarName toSqlNameDefault =  (`varNameWithPrefix` "toSqlOf") --- | All templates depending on SQL value type with default names.-makeRecordPersistableWithSqlTypeDefault :: TypeQ   -- ^ SQL value type-                                        -> String  -- ^ Table name of database-                                        -> Int     -- ^ Count of record columns-                                        -> Q [Dec] -- ^ Result declarations-makeRecordPersistableWithSqlTypeDefault sqlValueType table width = do+-- | All templates depending on SQL value type with configured names.+makeRecordPersistableWithSqlTypeWithConfig :: TypeQ      -- ^ SQL value type+                                         -> NameConfig -- ^ name rule config+                                         -> String     -- ^ Schema name of database+                                         -> String     -- ^ Table name of database+                                         -> Int        -- ^ Count of record columns+                                         -> Q [Dec]    -- ^ Result declarations+makeRecordPersistableWithSqlTypeWithConfig sqlValueType config schema table width =   makeRecordPersistableWithSqlType     sqlValueType     (persistableFunctionNamesDefault . conName . conCamelcaseName $ table)-    (recordTypeDefault table, toDataCon . recordTypeNameDefault $ table)+    (recordType config schema table, toDataCon . recordTypeName config schema $ table)     width +-- | All templates depending on SQL value type with default names.+makeRecordPersistableWithSqlTypeDefault :: TypeQ   -- ^ SQL value type+                                        -> String  -- ^ Schema name+                                        -> String  -- ^ Table name+                                        -> Int     -- ^ Count of record columns+                                        -> Q [Dec] -- ^ Result declarations+makeRecordPersistableWithSqlTypeDefault sqlValueType =+  makeRecordPersistableWithSqlTypeWithConfig sqlValueType defaultNameConfig+ recordInfo' :: Info -> Maybe ((TypeQ, ExpQ), (Maybe [Name], [TypeQ])) recordInfo' =  d  where   d (TyConI (DataD _cxt tcn _bs [r] _ds)) = case r of@@ -385,15 +397,17 @@   withSql <- makeRecordPersistableWithSqlType sqlValueType fnames (toTypeCon tyC, toDataCon tyC) $ length columns   return $ typ ++ withSql --- | All templates for record type with default names.-defineRecordDefault :: TypeQ             -- ^ SQL value type-                    -> String            -- ^ Table name-                    -> [(String, TypeQ)] -- ^ Column names and types-                    -> [Name]            -- ^ Record derivings-                    -> Q [Dec]           -- ^ Result declarations-defineRecordDefault sqlValueType table columns derives = do-  typ     <- defineRecordTypeDefault table columns derives-  withSql <- makeRecordPersistableWithSqlTypeDefault sqlValueType table $ length columns+-- | All templates for record type with configured names.+defineRecordWithConfig :: TypeQ             -- ^ SQL value type+                     -> NameConfig        -- ^ name rule config+                     -> String            -- ^ Schema name+                     -> String            -- ^ Table name+                     -> [(String, TypeQ)] -- ^ Column names and types+                     -> [Name]            -- ^ Record derivings+                     -> Q [Dec]           -- ^ Result declarations+defineRecordWithConfig sqlValueType config schema table columns derives = do+  typ     <- defineRecordTypeWithConfig config schema table columns derives+  withSql <- makeRecordPersistableWithSqlTypeWithConfig sqlValueType config schema table $ length columns   return $ typ ++ withSql