groundhog-inspector 0.7.1.2 → 0.8
raw patch · 4 files changed
+46/−27 lines, 4 filesdep ~aeson-prettydep ~groundhogdep ~groundhog-thPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aeson-pretty, groundhog, groundhog-th, syb
API changes (from Hackage documentation)
- Database.Groundhog.Inspector: generateUniqueKeysPhantoms :: DataCodegenConfig -> Bool
- Database.Groundhog.Inspector: mkChooseReferencedUnique :: ReverseNamingStyle -> QualifiedName -> [UniqueDefInfo] -> UniqueDefInfo
- Database.Groundhog.Inspector: mkConstructorName :: ReverseNamingStyle -> QualifiedName -> String
- Database.Groundhog.Inspector: mkEntityName :: ReverseNamingStyle -> QualifiedName -> String
- Database.Groundhog.Inspector: mkFieldName :: ReverseNamingStyle -> QualifiedName -> String -> String
- Database.Groundhog.Inspector: mkKeyFieldName :: ReverseNamingStyle -> QualifiedName -> Reference -> String
- Database.Groundhog.Inspector: mkType :: DataCodegenConfig -> Column -> Type
- Database.Groundhog.Inspector: mkUniqueKeyPhantomName :: ReverseNamingStyle -> QualifiedName -> UniqueDefInfo -> String
- Database.Groundhog.Inspector: mkUniqueName :: ReverseNamingStyle -> QualifiedName -> Int -> UniqueDefInfo -> String
+ Database.Groundhog.Inspector: [generateUniqueKeysPhantoms] :: DataCodegenConfig -> Bool
+ Database.Groundhog.Inspector: [mkChooseReferencedUnique] :: ReverseNamingStyle -> QualifiedName -> [UniqueDefInfo] -> UniqueDefInfo
+ Database.Groundhog.Inspector: [mkConstructorName] :: ReverseNamingStyle -> QualifiedName -> String
+ Database.Groundhog.Inspector: [mkEntityName] :: ReverseNamingStyle -> QualifiedName -> String
+ Database.Groundhog.Inspector: [mkFieldName] :: ReverseNamingStyle -> QualifiedName -> String -> String
+ Database.Groundhog.Inspector: [mkKeyFieldName] :: ReverseNamingStyle -> QualifiedName -> Reference -> String
+ Database.Groundhog.Inspector: [mkType] :: DataCodegenConfig -> Column -> Type
+ Database.Groundhog.Inspector: [mkUniqueKeyPhantomName] :: ReverseNamingStyle -> QualifiedName -> UniqueDefInfo -> String
+ Database.Groundhog.Inspector: [mkUniqueName] :: ReverseNamingStyle -> QualifiedName -> Int -> UniqueDefInfo -> String
- Database.Groundhog.Inspector: collectTables :: SchemaAnalyzer m => (QualifiedName -> Bool) -> Maybe String -> m (Map QualifiedName TableInfo)
+ Database.Groundhog.Inspector: collectTables :: (PersistBackend m, SchemaAnalyzer (Conn m)) => (QualifiedName -> Bool) -> Maybe String -> m (Map QualifiedName TableInfo)
- Database.Groundhog.Inspector: followReferencedTables :: SchemaAnalyzer m => (QualifiedName -> Bool) -> Map QualifiedName TableInfo -> m (Map QualifiedName TableInfo)
+ Database.Groundhog.Inspector: followReferencedTables :: (PersistBackend m, SchemaAnalyzer (Conn m)) => (QualifiedName -> Bool) -> Map QualifiedName TableInfo -> m (Map QualifiedName TableInfo)
- Database.Groundhog.Inspector: generateMapping :: (PersistBackend m, SchemaAnalyzer m) => ReverseNamingStyle -> Map QualifiedName TableInfo -> m (Map QualifiedName PSEntityDef)
+ Database.Groundhog.Inspector: generateMapping :: (PersistBackend m, SchemaAnalyzer (Conn m)) => ReverseNamingStyle -> Map QualifiedName TableInfo -> m (Map QualifiedName PSEntityDef)
Files
- Database/Groundhog/Inspector.hs +36/−20
- changelog +3/−0
- groundhog-inspector.cabal +5/−5
- main/Main.hs +2/−2
Database/Groundhog/Inspector.hs view
@@ -25,7 +25,7 @@ ) where import Database.Groundhog.Core-import Database.Groundhog.Generic (haveSameElems, findOne, getAutoKeyType)+import Database.Groundhog.Generic (haveSameElems, findOne, getDefaultAutoKeyType) import Database.Groundhog.Generic.Migration import Database.Groundhog.TH (NamingStyle, firstChar, mkTHEntityDef) import Database.Groundhog.TH.Settings@@ -168,7 +168,7 @@ -- | It looks for the references to the tables not contained in the passed map. -- If there are such references and the reference filter function returns True, the corresponding TableInfo is fetched and included into the map. -- The references for the newly added tables are processed in the same way. This function can be useful if your set of tables is created not by 'collectTables'.-followReferencedTables :: SchemaAnalyzer m+followReferencedTables :: (PersistBackend m, SchemaAnalyzer (Conn m)) => (QualifiedName -> Bool) -- ^ Decides if we follow reference to this table. It can be used to prevent mapping of the referenced audit or system tables -> Map QualifiedName TableInfo -> m (Map QualifiedName TableInfo)@@ -196,7 +196,7 @@ -- > publicTables <- collectTables filterRefs (Just "public") -- > websiteTables <- collectTables filterRefs (Just "website") -- > let allTables = publicTables <> websiteTables-collectTables :: SchemaAnalyzer m+collectTables :: (PersistBackend m, SchemaAnalyzer (Conn m)) => (QualifiedName -> Bool) -- ^ Decides if we follow the reference to a table. It can be used to prevent mapping of the referenced audit or system tables -> Maybe String -- ^ Schema name -> m (Map QualifiedName TableInfo)@@ -221,7 +221,7 @@ -> Map QualifiedName TableInfo -> QualifiedName -> TableInfo -> (Dec, [Dec]) generateData' DataCodegenConfig{..} ReverseNamingStyle{..} tables tName tInfo = decs where- decs = (DataD [] (mkName $ mkEntityName tName) [] [constr] [], uniquePhantoms)+ decs = (dataD' [] (mkName $ mkEntityName tName) [] [constr] [], uniquePhantoms) constr = RecC (mkName $ mkConstructorName tName) fields -- if a set of columns is referenced, do nothing. If we have a reference to a mapped table, collect all columns and create Key. If reference is to a not mapped table, do nothing -- Drop autogenerated id@@ -242,7 +242,7 @@ getRefs = any (compareRef . snd) . tableReferences uniquePhantoms = if generateUniqueKeysPhantoms then map mkPhantom uniqueKeys else [] where entity = ConT $ mkName $ mkEntityName tName- mkPhantom u = DataD [] name [PlainTV v] [c] [] where+ mkPhantom u = dataD' [] name [PlainTV v] [c] [] where v = mkName "v" name = mkName $ mkUniqueKeyPhantomName tName u phantom = ConT ''UniqueMarker `AppT` entity@@ -259,9 +259,9 @@ go (c:cs) = case getReference $ colName c of Just ref -> (case Map.lookup parentName tables of Just parentInfo ->- (mkName $ mkKeyFieldName tName ref, NotStrict, mkKeyType parentInfo)+ (mkName $ mkKeyFieldName tName ref, notStrict', mkKeyType parentInfo) Nothing -> - (mkName $ mkKeyFieldName tName ref, NotStrict, notMappedRefType)+ (mkName $ mkKeyFieldName tName ref, notStrict', notMappedRefType) ):go (filter (`notElem` childCols) cs) where parentName = referencedTableName ref@@ -281,7 +281,7 @@ _ | map colNull childCols == [True] -> ConT ''Maybe `AppT` typ -- wrap non-composite keys in Maybe _ -> notMappedRefType parentCols = getCols parentInfo $ map snd $ referencedColumns ref- Nothing -> (mkName $ mkFieldName tName $ colName c, NotStrict, mkType c):go cs+ Nothing -> (mkName $ mkFieldName tName $ colName c, notStrict', mkType c):go cs equalP' :: Type -> Type -> Pred equalP' t1 t2 =@@ -292,15 +292,15 @@ #endif -generateMapping :: (PersistBackend m, SchemaAnalyzer m) => ReverseNamingStyle -> Map QualifiedName TableInfo -> m (Map QualifiedName PSEntityDef)+generateMapping :: (PersistBackend m, SchemaAnalyzer (Conn m)) => ReverseNamingStyle -> Map QualifiedName TableInfo -> m (Map QualifiedName PSEntityDef) generateMapping style tables = do m <- getMigrationPack return $ generateMappingPure style m tables -generateMappingPure :: DbDescriptor (PhantomDb m) => ReverseNamingStyle -> MigrationPack m -> Map QualifiedName TableInfo -> Map QualifiedName PSEntityDef+generateMappingPure :: DbDescriptor conn => ReverseNamingStyle -> MigrationPack conn -> Map QualifiedName TableInfo -> Map QualifiedName PSEntityDef generateMappingPure style m tables = Map.mapWithKey (generateMapping' style m tables) tables -generateMapping' :: DbDescriptor (PhantomDb m) => ReverseNamingStyle -> MigrationPack m -> Map QualifiedName TableInfo -> QualifiedName -> TableInfo -> PSEntityDef+generateMapping' :: DbDescriptor conn => ReverseNamingStyle -> MigrationPack conn -> Map QualifiedName TableInfo -> QualifiedName -> TableInfo -> PSEntityDef generateMapping' ReverseNamingStyle{..} m@MigrationPack{..} tables tName tInfo = entity where entity = PSEntityDef (mkEntityName tName) (Just $ snd tName) (fst tName) autoKey (Just uniqueKeyDefs) (Just [constr]) idColumns = (filter ((== UniquePrimary True) . uniqueDefType) $ tableUniques tInfo) >>= uniqueDefFields@@ -357,19 +357,19 @@ parentName = referencedTableName ref - notMappedRef = PSFieldDef (mkKeyFieldName tName ref) (Just $ colName c) (case colType c of DbOther t -> Just $ showOther t; _ -> Nothing) Nothing Nothing (colDefault c) (Just (Just (referencedTableName ref, map snd $ referencedColumns ref), refOnDelete, refOnUpdate))- notMappedEmbeddedRef = PSFieldDef (mkKeyFieldName tName ref) Nothing Nothing Nothing (Just embeddeds) Nothing (Just (Just (referencedTableName ref, map snd $ referencedColumns ref), refOnDelete, refOnUpdate)) where- embeddeds = zipWith (\c1 i -> PSFieldDef ("val" ++ show i) (Just $ colName c1) (case colType c1 of DbOther t -> Just $ showOther t; _ -> Nothing) Nothing Nothing (colDefault c1) Nothing) childCols [0 :: Int ..]- mappedEmbeddedRef parentCols = PSFieldDef (mkKeyFieldName tName ref) Nothing Nothing Nothing (Just embeddeds) Nothing (Just (Nothing, refOnDelete, refOnUpdate)) where- embeddeds = zipWith (\c1 c2 -> PSFieldDef (colName c2) (Just $ colName c1) (showSqlType <$> mfilter (/= colType c2) (Just $ colType c1)) Nothing Nothing (colDefault c1) Nothing) childCols parentCols- autoKeyRef = PSFieldDef (mkKeyFieldName tName ref) (Just $ colName c) (showSqlType <$> mfilter (/= autoKeyType) (Just $ colType c)) Nothing Nothing (colDefault c) (Just (Nothing, refOnDelete, refOnUpdate)) where- autoKeyType = getAutoKeyType $ (undefined :: MigrationPack m -> p (PhantomDb m)) m+ notMappedRef = PSFieldDef (mkKeyFieldName tName ref) (Just $ colName c) (case colType c of DbOther t -> Just $ showOther t; _ -> Nothing) Nothing Nothing (colDefault c) (Just (Just (referencedTableName ref, map snd $ referencedColumns ref), refOnDelete, refOnUpdate)) Nothing+ notMappedEmbeddedRef = PSFieldDef (mkKeyFieldName tName ref) Nothing Nothing Nothing (Just embeddeds) Nothing (Just (Just (referencedTableName ref, map snd $ referencedColumns ref), refOnDelete, refOnUpdate)) Nothing where+ embeddeds = zipWith (\c1 i -> PSFieldDef ("val" ++ show i) (Just $ colName c1) (case colType c1 of DbOther t -> Just $ showOther t; _ -> Nothing) Nothing Nothing (colDefault c1) Nothing Nothing) childCols [0 :: Int ..]+ mappedEmbeddedRef parentCols = PSFieldDef (mkKeyFieldName tName ref) Nothing Nothing Nothing (Just embeddeds) Nothing (Just (Nothing, refOnDelete, refOnUpdate)) Nothing where+ embeddeds = zipWith (\c1 c2 -> PSFieldDef (colName c2) (Just $ colName c1) (showSqlType <$> mfilter (/= colType c2) (Just $ colType c1)) Nothing Nothing (colDefault c1) Nothing Nothing) childCols parentCols+ autoKeyRef = PSFieldDef (mkKeyFieldName tName ref) (Just $ colName c) (showSqlType <$> mfilter (/= autoKeyType) (Just $ colType c)) Nothing Nothing (colDefault c) (Just (Nothing, refOnDelete, refOnUpdate)) Nothing where+ autoKeyType = getDefaultAutoKeyType $ (undefined :: MigrationPack conn -> p conn) m refOnDelete = mfilter (/= defaultReferenceOnDelete) $ referenceOnDelete ref refOnUpdate = mfilter (/= defaultReferenceOnUpdate) $ referenceOnUpdate ref getCols info cols = map (\cName -> findOne "column" colName cName $ tableColumns info) cols childCols = getCols tInfo $ map fst $ referencedColumns ref- Nothing -> PSFieldDef (mkFieldName tName $ colName c) (Just $ colName c) (case colType c of DbOther t -> Just $ showOther t; _ -> Nothing) Nothing Nothing (colDefault c) Nothing:go cs+ Nothing -> PSFieldDef (mkFieldName tName $ colName c) (Just $ colName c) (case colType c of DbOther t -> Just $ showOther t; _ -> Nothing) Nothing Nothing (colDefault c) Nothing Nothing:go cs subtractSame :: THEntityDef -> PSEntityDef -> PSEntityDef subtractSame = subtractEntity where@@ -408,5 +408,21 @@ -- You can use a third-party tool to convert JSON to YAML. showMappings :: [PSEntityDef] -> ByteString showMappings = encodePretty' config where- config = Config { confIndent = 4, confCompare = keyOrder keys }+ config = Config { confIndent = Spaces 4, confCompare = keyOrder keys } keys = ["entity", "name", "dbName", "schema", "autoKey", "keyDbName", "type", "embeddedType", "columns", "keys", "fields", "uniques"]++dataD' :: Cxt -> Name -> [TyVarBndr] -> [Con] -> [Name] -> InstanceDec+dataD' cxt name types constrs derives =+#if MIN_VERSION_template_haskell(2, 11, 0)+ DataD cxt name types Nothing constrs (map ConT derives)+#else+ DataD cxt name types constrs derives+#endif++#if MIN_VERSION_template_haskell(2, 11, 0)+notStrict' :: Bang+notStrict' = Bang NoSourceUnpackedness NoSourceStrictness+#else+notStrict' :: Strict+notStrict' = NotStrict+#endif
changelog view
@@ -1,3 +1,6 @@+0.8+* Support for GHC 8+ 0.7.1.2 * Compatibility with template-haskell-2.10
groundhog-inspector.cabal view
@@ -1,5 +1,5 @@ name: groundhog-inspector-version: 0.7.1.2+version: 0.8 license: BSD3 license-file: LICENSE author: Boris Lykah <lykahb@gmail.com>@@ -32,14 +32,14 @@ , bytestring >= 0.9 , time >= 1.1.4 , transformers >= 0.2.1- , groundhog >= 0.7 && < 0.8- , groundhog-th >= 0.7 && < 0.8+ , groundhog >= 0.8 && < 0.9+ , groundhog-th >= 0.8 && < 0.9 , template-haskell , containers >= 0.2- , aeson-pretty >= 0.7+ , aeson-pretty >= 0.8 , text >= 0.8 , regex-compat < 1.0- , syb >= 0.3 && < 0.5+ , syb >= 0.3 exposed-modules: Database.Groundhog.Inspector ghc-options: -Wall
main/Main.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, DeriveDataTypeable, RecordWildCards #-}+{-# LANGUAGE CPP, DeriveDataTypeable, RecordWildCards, FlexibleContexts #-} module Main where @@ -44,7 +44,7 @@ &= details ["Pass a name of a database. The connection string is an argument to with*Conn. " , "MySQL connection string is \"ConnectInfo {...}\""] -analyze :: (PersistBackend m, SchemaAnalyzer m, MonadIO m) => Maybe String -> m ()+analyze :: (PersistBackend m, SchemaAnalyzer (Conn m), MonadIO m) => Maybe String -> m () analyze schema = do tables <- collectTables (const True) schema -- Analyze tables