packages feed

mysql-simple-quasi 1.0.0.1 → 1.0.0.2

raw patch · 2 files changed

+5/−105 lines, 2 filesdep −Cabaldep −sybdep ~base

Dependencies removed: Cabal, syb

Dependency ranges changed: base

Files

− Database/MySQL/Simple/Quasi/Test.hs
@@ -1,100 +0,0 @@-{-# OPTIONS_GHC -Wall -fno-warn-missing-signatures #-}---module Database.MySQL.Simple.QQ.Test where--import Control.Applicative ((<$>))-import System.Exit (ExitCode(..), exitWith)--import Data.Generics (everywhere, mkT)-import Data.Generics.Text (gshow)-import Data.List (isPrefixOf)--import Database.MySQL.Simple.Quasi--import Language.Haskell.TH (runQ)-import Language.Haskell.TH.Ppr (pprint)-import Language.Haskell.TH.Quote (quoteExp)-import qualified Language.Haskell.TH.Syntax as TH-import Language.Haskell.Meta.Parse (parseExp)--qual :: [(String, String)] -> String -> String-qual prefixTgts = go prefixTgts-  where-    go _ [] = []-    go ((prefix, tgt):more) src-      | tgt `isPrefixOf` src = prefix ++ tgt ++ go prefixTgts (drop (length tgt) src)-      | otherwise = go more src-    go [] (c:cs) = c : go prefixTgts cs---collapseForall :: TH.Exp -> TH.Exp-collapseForall (TH.SigE e t) = TH.SigE e $ collapseForallT t-  where-    collapseForallT (TH.ForallT ts [] (TH.ForallT [] ctxt inner)) = TH.ForallT ts ctxt inner-    collapseForallT x = x-collapseForall e = e---- | Code from qquery uses NameG but haskell-src-meta uses NameQ.--- This hack turns all NameG into NameQ ready for comparison:-canonName :: TH.Name -> TH.Name-canonName = TH.mkName . show --unqualName :: TH.Name -> TH.Name-unqualName = TH.mkName . TH.nameBase--asCode :: TH.Exp -> String-asCode = pprint . everywhere (mkT unqualName)--dupeQueries :: String -> String-dupeQueries ('$':'\"':rest)-  = let (queryStr, '\"':more) = span (/= '\"') rest-    in "(\"" ++ queryStr ++ "\", Data.String.fromString \"" ++ queryStr ++ "\")" ++ dupeQueries more-dupeQueries (c:cs) = c : dupeQueries cs-dupeQueries [] = []--(==>) :: String -> String -> IO Bool-(==>) src expS = do-  act <- everywhere (mkT canonName) <$> runQ (quoteExp qquery src)-  let expS' = qual [("Database.MySQL.Simple.QQ.", "QQuery") -- Handles QQuery_ too-                   ,("Database.MySQL.Simple.QueryResults.", "QueryResults")-                   ,("Database.MySQL.Simple.Param.", "Param")-                   ,("Database.MySQL.Simple.Types.", "fromOnly") -- Try fromOnly before Only-                   ,("Database.MySQL.Simple.Types.", "Only")-                   ] . dupeQueries $ expS-  case collapseForall <$> parseExp expS' of-    Left e -> do putStrLn $ "Problem parsing expected output: " ++ e-                 return False-    Right x | x == act -> return True-            | otherwise -> do mapM_ putStrLn-                                [ "Mismatch. Expected:", "  " ++ asCode x, "  " ++ gshow x-                                , "Actual:", "  " ++ asCode act, "  " ++ gshow act]-                              return False--simple = "select * from users" ==> "QQuery_ GHC.Base.id $\"select * from users\" :: forall r. QueryResults r => QQuery_ r"--ret1 = "select id{Int} from users" ==> "QQuery_ fromOnly $\"select id from users\" :: QQuery_ Int" --ret2 = "select id{Int}, name{String} from users" ==> "QQuery_ GHC.Base.id $\"select id, name from users\" :: QQuery_ (Int, String)"--ret4 = "select id{Int}, f.*{String, Bool}, name{Double} from users, f" ==>-       "QQuery_ GHC.Base.id $\"select id, f.*, name from users, f\" :: QQuery_ (Int, String, Bool, Double)"--subst1 = "select * from users where name = ?{String}" ==>-         "QQuery Only GHC.Base.id $\"select * from users where name = ?\" :: forall r. QueryResults r => QQuery String r"--subst1b = "select * from users where name = ?" ==>-          "QQuery Only GHC.Base.id $\"select * from users where name = ?\" :: forall q r. (Param q, QueryResults r) => QQuery q r"--subst3 = "select id{Maybe Int} from users where name = ?{Int} and name2 = ?{Bool} and name3 = ?{Maybe Double}" ==>-          "QQuery GHC.Base.id fromOnly $\"select id from users where name = ? and name2 = ? and name3 = ?\" :: QQuery (Int, Bool, Maybe Double) (Maybe Int)"--subst3b = "select * from users where name = ? and name2 = ? and name3 = ?" ==>-          "QQuery GHC.Base.id GHC.Base.id $\"select * from users where name = ? and name2 = ? and name3 = ?\" :: forall q q1 q2 r. (Param q, Param q1, Param q2, QueryResults r) => QQuery (q, q1, q2) r"---escaped = "select \\{curled} from whatever where text = 'hello\\?'" ==>-          "QQuery_ GHC.Base.id $\"select {curled} from whatever where text = 'hello?'\" :: forall r. QueryResults r => QQuery_ r"--main :: IO ()-main = do passed <- and <$> sequence [simple, ret1, ret2, ret4, escaped, subst1, subst1b,-            subst3, subst3b]-          exitWith $ if passed then ExitSuccess else ExitFailure 1
mysql-simple-quasi.cabal view
@@ -1,5 +1,5 @@ name:                mysql-simple-quasi-version:             1.0.0.1+version:             1.0.0.2 synopsis:            Quasi-quoter for use with mysql-simple. description:         See the "Database.MySQL.Simple.Quasi" module documentation for more details. license:             BSD3@@ -18,7 +18,7 @@                        mysql-simple == 0.2.*,                        template-haskell -Test-Suite test-qq-    type:              exitcode-stdio-1.0-    main-is:           Database/MySQL/Simple/Quasi/Test.hs-    build-depends:     base, Cabal >= 1.18, haskell-src-meta, mysql-simple == 0.2.*, syb, template-haskell+--Test-Suite test-qq+--    type:              exitcode-stdio-1.0+--    main-is:           Database/MySQL/Simple/Quasi/Test.hs+--    build-depends:     base, Cabal >= 1.18, haskell-src-meta, mysql-simple == 0.2.*, syb, template-haskell