From 687961cd22dba85b81b553b7056227eb27ffb21c Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Fri, 6 Apr 2012 12:16:03 -0400 Subject: [PATCH 1/7] [scaffold] refactor uses of CPP into pure Haskell --- yesod/scaffold/Application.hs.cg | 16 +++------------- yesod/scaffold/Import.hs.cg | 1 + yesod/scaffold/Settings.hs.cg | 8 +++----- yesod/scaffold/Settings/Development.hs.cg | 12 ++++++++++++ yesod/scaffold/Settings/StaticFiles.hs.cg | 8 ++------ 5 files changed, 21 insertions(+), 24 deletions(-) create mode 100644 yesod/scaffold/Settings/Development.hs.cg diff --git a/yesod/scaffold/Application.hs.cg b/yesod/scaffold/Application.hs.cg index 20a58b61..64a38706 100644 --- a/yesod/scaffold/Application.hs.cg +++ b/yesod/scaffold/Application.hs.cg @@ -10,13 +10,8 @@ import Yesod.Auth import Yesod.Default.Config import Yesod.Default.Main import Yesod.Default.Handlers -#if DEVELOPMENT -import Yesod.Logger (Logger, logBS) -import Network.Wai.Middleware.RequestLogger (logCallbackDev) -#else import Yesod.Logger (Logger, logBS, toProduction) -import Network.Wai.Middleware.RequestLogger (logCallback) -#endif +import Network.Wai.Middleware.RequestLogger (logCallback, logCallbackDev) import qualified Database.Persist.Store~importMigration~ import Network.HTTP.Conduit (newManager, def) @@ -38,13 +33,8 @@ makeApplication conf logger = do app <- toWaiAppPlain foundation return $ logWare app where -#ifdef DEVELOPMENT - logWare = logCallbackDev (logBS setLogger) - setLogger = logger -#else - setLogger = toProduction logger -- by default the logger is set for development - logWare = logCallback (logBS setLogger) -#endif + logWare = dev logCallbackDev logCallback (logBS setLogger) + setLogger = dev id toProduction logger makeFoundation :: AppConfig DefaultEnv Extra -> Logger -> IO ~sitearg~ makeFoundation conf setLogger = do diff --git a/yesod/scaffold/Import.hs.cg b/yesod/scaffold/Import.hs.cg index bc64119d..61ccab17 100644 --- a/yesod/scaffold/Import.hs.cg +++ b/yesod/scaffold/Import.hs.cg @@ -18,6 +18,7 @@ import Data.Monoid (Monoid (mappend, mempty, mconcat)) import Control.Applicative ((<$>), (<*>), pure) import Data.Text (Text) import Settings.StaticFiles +import Settings.Development #if __GLASGOW_HASKELL__ < 704 infixr 5 <> diff --git a/yesod/scaffold/Settings.hs.cg b/yesod/scaffold/Settings.hs.cg index e022d478..2c8434e6 100644 --- a/yesod/scaffold/Settings.hs.cg +++ b/yesod/scaffold/Settings.hs.cg @@ -21,6 +21,7 @@ import qualified Yesod.Default.Util import Data.Text (Text) import Data.Yaml import Control.Applicative +import Settings.Development -- | Which Persistent backend this site is using. type PersistConfig = ~configPersist~ @@ -53,11 +54,8 @@ staticRoot conf = [st|#{appRoot conf}/static|] -- user. widgetFile :: String -> Q Exp -#if DEVELOPMENT -widgetFile = Yesod.Default.Util.widgetFileReload -#else -widgetFile = Yesod.Default.Util.widgetFileNoReload -#endif +widgetFile = dev Yesod.Default.Util.widgetFileReload + Yesod.Default.Util.widgetFileNoReload data Extra = Extra { extraCopyright :: Text diff --git a/yesod/scaffold/Settings/Development.hs.cg b/yesod/scaffold/Settings/Development.hs.cg new file mode 100644 index 00000000..38e4448f --- /dev/null +++ b/yesod/scaffold/Settings/Development.hs.cg @@ -0,0 +1,12 @@ +module Settings.Development where + +development :: Bool +development = +#if DEVELOPMENT + True +#else + False +#endif + +dev :: a -> a -> a +dev a b = if development then a else b diff --git a/yesod/scaffold/Settings/StaticFiles.hs.cg b/yesod/scaffold/Settings/StaticFiles.hs.cg index e6048731..759c7427 100644 --- a/yesod/scaffold/Settings/StaticFiles.hs.cg +++ b/yesod/scaffold/Settings/StaticFiles.hs.cg @@ -4,15 +4,11 @@ import Prelude (IO) import Yesod.Static import qualified Yesod.Static as Static import Settings (staticDir) +import Settings.Development -- | use this to create your static file serving site staticSite :: IO Static.Static -staticSite = -#ifdef DEVELOPMENT - Static.staticDevel staticDir -#else - Static.static staticDir -#endif +staticSite = dev Static.staticDevel Static.static staticDir -- | This generates easy references to files in the static directory at compile time, -- giving you compile-time verification that referenced files exist. From 55bd35fc5c0b7359d2c2eee0788064096ca52370 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Fri, 6 Apr 2012 12:21:03 -0400 Subject: [PATCH 2/7] [scaffold] add 'production' and 'prod' combinator --- yesod/scaffold/Settings/Development.hs.cg | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/yesod/scaffold/Settings/Development.hs.cg b/yesod/scaffold/Settings/Development.hs.cg index 38e4448f..30964dc1 100644 --- a/yesod/scaffold/Settings/Development.hs.cg +++ b/yesod/scaffold/Settings/Development.hs.cg @@ -10,3 +10,9 @@ development = dev :: a -> a -> a dev a b = if development then a else b + +production :: Bool +production = not development + +prod :: a -> a -> a +prod a b = if production then a else b From 5b8925962f70c03b6b47f6a91a38a0776c20f371 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Sun, 8 Apr 2012 00:27:22 -0400 Subject: [PATCH 3/7] [scaffold] make the scaffolding buildable --- yesod/Scaffolding/Scaffolder.hs | 1 + yesod/scaffold/Import.hs.cg | 1 + yesod/scaffold/Settings/Development.hs.cg | 2 ++ yesod/scaffold/project.cabal.cg | 1 + 4 files changed, 5 insertions(+) diff --git a/yesod/Scaffolding/Scaffolder.hs b/yesod/Scaffolding/Scaffolder.hs index a730b408..163b69d3 100644 --- a/yesod/Scaffolding/Scaffolder.hs +++ b/yesod/Scaffolding/Scaffolder.hs @@ -161,6 +161,7 @@ scaffold = do writeFile' "Model.hs" $(codegen "Model.hs") writeFile' "Settings.hs" $(codegen "Settings.hs") writeFile' "Settings/StaticFiles.hs" $(codegen "Settings/StaticFiles.hs") + writeFile' "Settings/Development.hs" $(codegen "Settings/Development.hs") writeFile' "static/css/bootstrap.css" $(codegen "static/css/bootstrap.css") writeFile' "templates/default-layout.hamlet" diff --git a/yesod/scaffold/Import.hs.cg b/yesod/scaffold/Import.hs.cg index 61ccab17..641de382 100644 --- a/yesod/scaffold/Import.hs.cg +++ b/yesod/scaffold/Import.hs.cg @@ -3,6 +3,7 @@ module Import , module Yesod , module Foundation , module Settings.StaticFiles + , module Settings.Development , module Data.Monoid , module Control.Applicative , Text diff --git a/yesod/scaffold/Settings/Development.hs.cg b/yesod/scaffold/Settings/Development.hs.cg index 30964dc1..46194f72 100644 --- a/yesod/scaffold/Settings/Development.hs.cg +++ b/yesod/scaffold/Settings/Development.hs.cg @@ -1,5 +1,7 @@ module Settings.Development where +import Prelude + development :: Bool development = #if DEVELOPMENT diff --git a/yesod/scaffold/project.cabal.cg b/yesod/scaffold/project.cabal.cg index 44d3f503..3fb9ce34 100644 --- a/yesod/scaffold/project.cabal.cg +++ b/yesod/scaffold/project.cabal.cg @@ -32,6 +32,7 @@ library Model Settings Settings.StaticFiles + Settings.Development Handler.Home ghc-options: -Wall -threaded -O0 From 27d8f13e7fdcdb8b3ef3d975528029766ab33fe5 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Sun, 8 Apr 2012 00:58:19 -0400 Subject: [PATCH 4/7] [yesod] update extra-source-files in cabal file --- yesod/yesod.cabal | 1 + 1 file changed, 1 insertion(+) diff --git a/yesod/yesod.cabal b/yesod/yesod.cabal index 058770b2..a7a0a009 100644 --- a/yesod/yesod.cabal +++ b/yesod/yesod.cabal @@ -32,6 +32,7 @@ extra-source-files: scaffold/.ghci.cg scaffold/tests/main.hs.cg scaffold/Settings.hs.cg + scaffold/Settings/Development.hs.cg scaffold/Settings/StaticFiles.hs.cg scaffold/Application.hs.cg scaffold/deploy/Procfile.cg From 78be263e022c5fb2d2325745cc370e5ad42e3b4d Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Mon, 9 Apr 2012 11:09:42 -0400 Subject: [PATCH 5/7] [scaffold] remove the cryptic dev/prod combinators --- yesod/scaffold/Application.hs.cg | 5 +++-- yesod/scaffold/Settings.hs.cg | 5 +++-- yesod/scaffold/Settings/Development.hs.cg | 6 ------ yesod/scaffold/Settings/StaticFiles.hs.cg | 4 +++- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/yesod/scaffold/Application.hs.cg b/yesod/scaffold/Application.hs.cg index 64a38706..bf8afa99 100644 --- a/yesod/scaffold/Application.hs.cg +++ b/yesod/scaffold/Application.hs.cg @@ -33,8 +33,9 @@ makeApplication conf logger = do app <- toWaiAppPlain foundation return $ logWare app where - logWare = dev logCallbackDev logCallback (logBS setLogger) - setLogger = dev id toProduction logger + (logWare, setLogger) + | development = (logCallbackDev (logBS setLogger), logger) + | production = (logCallback (logBS setLogger), logger) makeFoundation :: AppConfig DefaultEnv Extra -> Logger -> IO ~sitearg~ makeFoundation conf setLogger = do diff --git a/yesod/scaffold/Settings.hs.cg b/yesod/scaffold/Settings.hs.cg index 2c8434e6..aa9877e8 100644 --- a/yesod/scaffold/Settings.hs.cg +++ b/yesod/scaffold/Settings.hs.cg @@ -54,8 +54,9 @@ staticRoot conf = [st|#{appRoot conf}/static|] -- user. widgetFile :: String -> Q Exp -widgetFile = dev Yesod.Default.Util.widgetFileReload - Yesod.Default.Util.widgetFileNoReload +widgetFile + | development = Yesod.Default.Util.widgetFileReload + | production = Yesod.Default.Util.widgetFileNoReload data Extra = Extra { extraCopyright :: Text diff --git a/yesod/scaffold/Settings/Development.hs.cg b/yesod/scaffold/Settings/Development.hs.cg index 46194f72..73613f0b 100644 --- a/yesod/scaffold/Settings/Development.hs.cg +++ b/yesod/scaffold/Settings/Development.hs.cg @@ -10,11 +10,5 @@ development = False #endif -dev :: a -> a -> a -dev a b = if development then a else b - production :: Bool production = not development - -prod :: a -> a -> a -prod a b = if production then a else b diff --git a/yesod/scaffold/Settings/StaticFiles.hs.cg b/yesod/scaffold/Settings/StaticFiles.hs.cg index 759c7427..d0581212 100644 --- a/yesod/scaffold/Settings/StaticFiles.hs.cg +++ b/yesod/scaffold/Settings/StaticFiles.hs.cg @@ -8,7 +8,9 @@ import Settings.Development -- | use this to create your static file serving site staticSite :: IO Static.Static -staticSite = dev Static.staticDevel Static.static staticDir +staticSite + | development = Static.staticDevel staticDir + | production = Static.static staticDir -- | This generates easy references to files in the static directory at compile time, -- giving you compile-time verification that referenced files exist. From 7ce991d9cbbd2a7346d003eef86c61f63ce4dca0 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Mon, 9 Apr 2012 11:13:28 -0400 Subject: [PATCH 6/7] [scaffold] fix typo in setLogger definition --- yesod/scaffold/Application.hs.cg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yesod/scaffold/Application.hs.cg b/yesod/scaffold/Application.hs.cg index bf8afa99..c7ee2a86 100644 --- a/yesod/scaffold/Application.hs.cg +++ b/yesod/scaffold/Application.hs.cg @@ -35,7 +35,7 @@ makeApplication conf logger = do where (logWare, setLogger) | development = (logCallbackDev (logBS setLogger), logger) - | production = (logCallback (logBS setLogger), logger) + | production = (logCallback (logBS setLogger), toProduction logger) makeFoundation :: AppConfig DefaultEnv Extra -> Logger -> IO ~sitearg~ makeFoundation conf setLogger = do From 1b9b19bb648136be4b6375ce43fc899cc4cfe1d3 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Tue, 10 Apr 2012 12:12:54 -0400 Subject: [PATCH 7/7] [scaffold] use if-then-else instead of guards While the guards solution was nice, it causes GHC to emit a non-exhaustive pattern warning. --- yesod/scaffold/Application.hs.cg | 6 +++--- yesod/scaffold/Settings.hs.cg | 5 ++--- yesod/scaffold/Settings/StaticFiles.hs.cg | 5 ++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/yesod/scaffold/Application.hs.cg b/yesod/scaffold/Application.hs.cg index c7ee2a86..49303583 100644 --- a/yesod/scaffold/Application.hs.cg +++ b/yesod/scaffold/Application.hs.cg @@ -33,9 +33,9 @@ makeApplication conf logger = do app <- toWaiAppPlain foundation return $ logWare app where - (logWare, setLogger) - | development = (logCallbackDev (logBS setLogger), logger) - | production = (logCallback (logBS setLogger), toProduction logger) + setLogger = if development then logger else toProduction logger + logWare = if development then logCallbackDev (logBS setLogger) + else logCallback (logBS setLogger) makeFoundation :: AppConfig DefaultEnv Extra -> Logger -> IO ~sitearg~ makeFoundation conf setLogger = do diff --git a/yesod/scaffold/Settings.hs.cg b/yesod/scaffold/Settings.hs.cg index aa9877e8..8a8af894 100644 --- a/yesod/scaffold/Settings.hs.cg +++ b/yesod/scaffold/Settings.hs.cg @@ -54,9 +54,8 @@ staticRoot conf = [st|#{appRoot conf}/static|] -- user. widgetFile :: String -> Q Exp -widgetFile - | development = Yesod.Default.Util.widgetFileReload - | production = Yesod.Default.Util.widgetFileNoReload +widgetFile = if development then Yesod.Default.Util.widgetFileReload + else Yesod.Default.Util.widgetFileNoReload data Extra = Extra { extraCopyright :: Text diff --git a/yesod/scaffold/Settings/StaticFiles.hs.cg b/yesod/scaffold/Settings/StaticFiles.hs.cg index d0581212..25107956 100644 --- a/yesod/scaffold/Settings/StaticFiles.hs.cg +++ b/yesod/scaffold/Settings/StaticFiles.hs.cg @@ -8,9 +8,8 @@ import Settings.Development -- | use this to create your static file serving site staticSite :: IO Static.Static -staticSite - | development = Static.staticDevel staticDir - | production = Static.static staticDir +staticSite = if development then Static.staticDevel staticDir + else Static.static staticDir -- | This generates easy references to files in the static directory at compile time, -- giving you compile-time verification that referenced files exist.