From 6757f2e2118fb00f92c28535b50d9eb69a020484 Mon Sep 17 00:00:00 2001 From: Clint Adams Date: Sat, 8 Oct 2011 12:13:26 -0400 Subject: [PATCH 01/10] Depend on a blaze-html version with unsafeLazyByteString. --- yesod-core/yesod-core.cabal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yesod-core/yesod-core.cabal b/yesod-core/yesod-core.cabal index 2bba3e64..7c7bec8a 100644 --- a/yesod-core/yesod-core.cabal +++ b/yesod-core/yesod-core.cabal @@ -60,7 +60,7 @@ library , monad-control >= 0.2 && < 0.3 , enumerator >= 0.4.7 && < 0.5 , cookie >= 0.3 && < 0.4 - , blaze-html >= 0.4 && < 0.5 + , blaze-html >= 0.4.1.3 && < 0.5 , http-types >= 0.6.5 && < 0.7 , case-insensitive >= 0.2 && < 0.4 , parsec >= 2 && < 3.2 From ea224733c0fc96571ffbe9e285d46fbd20bc31a4 Mon Sep 17 00:00:00 2001 From: Nick Partridge Date: Wed, 12 Oct 2011 09:21:22 +1000 Subject: [PATCH 02/10] Allows passing through a set of openid extension fields, and returns the full openid response params in credsExtra --- yesod-auth/Yesod/Auth/OpenId.hs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/yesod-auth/Yesod/Auth/OpenId.hs b/yesod-auth/Yesod/Auth/OpenId.hs index 4f650be4..38891278 100644 --- a/yesod-auth/Yesod/Auth/OpenId.hs +++ b/yesod-auth/Yesod/Auth/OpenId.hs @@ -3,6 +3,7 @@ {-# LANGUAGE OverloadedStrings #-} module Yesod.Auth.OpenId ( authOpenId + , authOpenIdExtended , forwardUrl ) where @@ -26,7 +27,10 @@ forwardUrl :: AuthRoute forwardUrl = PluginR "openid" ["forward"] authOpenId :: YesodAuth m => AuthPlugin m -authOpenId = +authOpenId = authOpenIdExtended [] + +authOpenIdExtended :: YesodAuth m => [(Text, Text)] -> AuthPlugin m +authOpenIdExtended extensionFields = AuthPlugin "openid" dispatch login where complete = PluginR "openid" ["complete"] @@ -57,7 +61,7 @@ authOpenId = render <- getUrlRender toMaster <- getRouteToMaster let complete' = render $ toMaster complete - res <- runAttemptT $ OpenId.getForwardUrl oid complete' Nothing [] + res <- runAttemptT $ OpenId.getForwardUrl oid complete' Nothing extensionFields attempt (\err -> do setMessage $ toHtml $ show err @@ -87,5 +91,5 @@ completeHelper gets' = do setMessage $ toHtml $ show err redirect RedirectTemporary $ toMaster LoginR let onSuccess (OpenId.Identifier ident, _) = - setCreds True $ Creds "openid" ident [] + setCreds True $ Creds "openid" ident gets' attempt onFailure onSuccess res From 0d716a50c28f3bb32125bf71bb07be27809546cf Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Fri, 14 Oct 2011 07:44:50 +0200 Subject: [PATCH 03/10] yesod-static: fix containers dep --- yesod-static/yesod-static.cabal | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yesod-static/yesod-static.cabal b/yesod-static/yesod-static.cabal index fc455c10..8ca6961f 100644 --- a/yesod-static/yesod-static.cabal +++ b/yesod-static/yesod-static.cabal @@ -1,5 +1,5 @@ name: yesod-static -version: 0.3.1.1 +version: 0.3.1.2 license: BSD3 license-file: LICENSE author: Michael Snoyman @@ -20,7 +20,7 @@ flag test library build-depends: base >= 4 && < 5 - , containers >= 0.4 + , containers , old-time >= 1.0 , yesod-core >= 0.9 && < 0.10 , base64-bytestring >= 0.1.0.1 && < 0.2 From 7e37608df95c909913f6e96ab900be14cd1ddf70 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Fri, 14 Oct 2011 09:44:56 +0200 Subject: [PATCH 04/10] Scaffolding: unified templates folder --- yesod-default/Yesod/Default/Util.hs | 16 ++++----- yesod-default/yesod-default.cabal | 2 +- yesod/Scaffolding/Scaffolder.hs | 34 +++++++++---------- yesod/scaffold/Foundation.hs.cg | 2 +- yesod/scaffold/project.cabal.cg | 2 +- .../boilerplate-layout.hamlet.cg | 0 .../default-layout-wrapper.hamlet.cg | 0 .../default-layout.hamlet.cg | 0 .../default-layout.lucius.cg | 0 .../{hamlet => templates}/homepage.hamlet.cg | 0 .../{julius => templates}/homepage.julius.cg | 0 .../{lucius => templates}/homepage.lucius.cg | 0 .../{lucius => templates}/normalize.lucius.cg | 0 yesod/scaffold/tiny/Application.hs.cg | 1 - yesod/scaffold/tiny/Foundation.hs.cg | 2 +- yesod/scaffold/tiny/project.cabal.cg | 2 +- yesod/yesod.cabal | 16 ++++----- 17 files changed, 38 insertions(+), 39 deletions(-) rename yesod/scaffold/{hamlet => templates}/boilerplate-layout.hamlet.cg (100%) rename yesod/scaffold/{hamlet => templates}/default-layout-wrapper.hamlet.cg (100%) rename yesod/scaffold/{hamlet => templates}/default-layout.hamlet.cg (100%) rename yesod/scaffold/{lucius => templates}/default-layout.lucius.cg (100%) rename yesod/scaffold/{hamlet => templates}/homepage.hamlet.cg (100%) rename yesod/scaffold/{julius => templates}/homepage.julius.cg (100%) rename yesod/scaffold/{lucius => templates}/homepage.lucius.cg (100%) rename yesod/scaffold/{lucius => templates}/normalize.lucius.cg (100%) diff --git a/yesod-default/Yesod/Default/Util.hs b/yesod-default/Yesod/Default/Util.hs index 4ab93b33..fa21a8b3 100644 --- a/yesod-default/Yesod/Default/Util.hs +++ b/yesod-default/Yesod/Default/Util.hs @@ -58,18 +58,18 @@ globFile kind x = kind ++ "/" ++ x ++ "." ++ kind widgetFileProduction :: FilePath -> Q Exp widgetFileProduction x = do - let h = whenExists x "hamlet" whamletFile - let c = whenExists x "cassius" cassiusFile - let j = whenExists x "julius" juliusFile - let l = whenExists x "lucius" luciusFile + let h = whenExists x "templates" whamletFile + let c = whenExists x "templates" cassiusFile + let j = whenExists x "templates" juliusFile + let l = whenExists x "templates" luciusFile [|$h >> addCassius $c >> addJulius $j >> addLucius $l|] widgetFileDebug :: FilePath -> Q Exp widgetFileDebug x = do - let h = whenExists x "hamlet" whamletFile - let c = whenExists x "cassius" cassiusFileDebug - let j = whenExists x "julius" juliusFileDebug - let l = whenExists x "lucius" luciusFileDebug + let h = whenExists x "templates" whamletFile + let c = whenExists x "templates" cassiusFileDebug + let j = whenExists x "templates" juliusFileDebug + let l = whenExists x "templates" luciusFileDebug [|$h >> addCassius $c >> addJulius $j >> addLucius $l|] whenExists :: String -> String -> (FilePath -> Q Exp) -> Q Exp diff --git a/yesod-default/yesod-default.cabal b/yesod-default/yesod-default.cabal index ec8524aa..7c43324a 100644 --- a/yesod-default/yesod-default.cabal +++ b/yesod-default/yesod-default.cabal @@ -1,5 +1,5 @@ name: yesod-default -version: 0.3.1 +version: 0.4.0 license: BSD3 license-file: LICENSE author: Patrick Brisbin diff --git a/yesod/Scaffolding/Scaffolder.hs b/yesod/Scaffolding/Scaffolder.hs index 15790c95..b48fcee2 100644 --- a/yesod/Scaffolding/Scaffolder.hs +++ b/yesod/Scaffolding/Scaffolder.hs @@ -128,10 +128,7 @@ scaffold = do mkDir fp = createDirectoryIfMissing True $ dir ++ '/' : fp mkDir "Handler" - mkDir "hamlet" - mkDir "cassius" - mkDir "lucius" - mkDir "julius" + mkDir "templates" mkDir "static" mkDir "static/css" mkDir "static/js" @@ -163,20 +160,23 @@ scaffold = do unless isTiny $ writeFile' "Model.hs" $(codegen "Model.hs") writeFile' "Settings.hs" $ ifTiny $(codegen "tiny/Settings.hs") $(codegen "Settings.hs") writeFile' "Settings/StaticFiles.hs" $(codegen "Settings/StaticFiles.hs") - writeFile' "lucius/default-layout.lucius" - $(codegen "lucius/default-layout.lucius") - writeFile' "hamlet/default-layout.hamlet" - $(codegen "hamlet/default-layout.hamlet") - writeFile' "hamlet/default-layout-wrapper.hamlet" - $(codegen "hamlet/default-layout-wrapper.hamlet") - writeFile' "hamlet/boilerplate-layout.hamlet" - $(codegen "hamlet/boilerplate-layout.hamlet") - writeFile' "lucius/normalize.lucius" - $(codegen "lucius/normalize.lucius") - writeFile' "hamlet/homepage.hamlet" $(codegen "hamlet/homepage.hamlet") + writeFile' "templates/default-layout.lucius" + $(codegen "templates/default-layout.lucius") + writeFile' "templates/default-layout.hamlet" + $(codegen "templates/default-layout.hamlet") + writeFile' "templates/default-layout-wrapper.hamlet" + $(codegen "templates/default-layout-wrapper.hamlet") + writeFile' "templates/boilerplate-layout.hamlet" + $(codegen "templates/boilerplate-layout.hamlet") + writeFile' "templates/normalize.lucius" + $(codegen "templates/normalize.lucius") + writeFile' "templates/homepage.hamlet" + $(codegen "templates/homepage.hamlet") writeFile' "config/routes" $ ifTiny $(codegen "tiny/config/routes") $(codegen "config/routes") - writeFile' "lucius/homepage.lucius" $(codegen "lucius/homepage.lucius") - writeFile' "julius/homepage.julius" $(codegen "julius/homepage.julius") + writeFile' "templates/homepage.lucius" + $(codegen "templates/homepage.lucius") + writeFile' "templates/homepage.julius" + $(codegen "templates/homepage.julius") unless isTiny $ writeFile' "config/models" $(codegen "config/models") writeFile' "messages/en.msg" $(codegen "messages/en.msg") diff --git a/yesod/scaffold/Foundation.hs.cg b/yesod/scaffold/Foundation.hs.cg index 4e1d736b..caedd061 100644 --- a/yesod/scaffold/Foundation.hs.cg +++ b/yesod/scaffold/Foundation.hs.cg @@ -95,7 +95,7 @@ instance Yesod ~sitearg~ where pc <- widgetToPageContent $ do $(widgetFile "normalize") $(widgetFile "default-layout") - hamletToRepHtml $(hamletFile "hamlet/default-layout-wrapper.hamlet") + hamletToRepHtml $(hamletFile "templates/default-layout-wrapper.hamlet") -- This is done to provide an optimization for serving static files from -- a separate domain. Please see the staticRoot setting in Settings.hs diff --git a/yesod/scaffold/project.cabal.cg b/yesod/scaffold/project.cabal.cg index a61906c4..ac7297cb 100644 --- a/yesod/scaffold/project.cabal.cg +++ b/yesod/scaffold/project.cabal.cg @@ -52,7 +52,7 @@ executable ~project~ , yesod-core >= 0.9.3 && < 0.10 , yesod-auth >= 0.7.3 && < 0.8 , yesod-static >= 0.3.1 && < 0.4 - , yesod-default >= 0.3.1 && < 0.4 + , yesod-default >= 0.4 && < 0.5 , yesod-form >= 0.3.3 && < 0.4 , mime-mail >= 0.3.0.3 && < 0.4 , clientsession >= 0.7.3 && < 0.8 diff --git a/yesod/scaffold/hamlet/boilerplate-layout.hamlet.cg b/yesod/scaffold/templates/boilerplate-layout.hamlet.cg similarity index 100% rename from yesod/scaffold/hamlet/boilerplate-layout.hamlet.cg rename to yesod/scaffold/templates/boilerplate-layout.hamlet.cg diff --git a/yesod/scaffold/hamlet/default-layout-wrapper.hamlet.cg b/yesod/scaffold/templates/default-layout-wrapper.hamlet.cg similarity index 100% rename from yesod/scaffold/hamlet/default-layout-wrapper.hamlet.cg rename to yesod/scaffold/templates/default-layout-wrapper.hamlet.cg diff --git a/yesod/scaffold/hamlet/default-layout.hamlet.cg b/yesod/scaffold/templates/default-layout.hamlet.cg similarity index 100% rename from yesod/scaffold/hamlet/default-layout.hamlet.cg rename to yesod/scaffold/templates/default-layout.hamlet.cg diff --git a/yesod/scaffold/lucius/default-layout.lucius.cg b/yesod/scaffold/templates/default-layout.lucius.cg similarity index 100% rename from yesod/scaffold/lucius/default-layout.lucius.cg rename to yesod/scaffold/templates/default-layout.lucius.cg diff --git a/yesod/scaffold/hamlet/homepage.hamlet.cg b/yesod/scaffold/templates/homepage.hamlet.cg similarity index 100% rename from yesod/scaffold/hamlet/homepage.hamlet.cg rename to yesod/scaffold/templates/homepage.hamlet.cg diff --git a/yesod/scaffold/julius/homepage.julius.cg b/yesod/scaffold/templates/homepage.julius.cg similarity index 100% rename from yesod/scaffold/julius/homepage.julius.cg rename to yesod/scaffold/templates/homepage.julius.cg diff --git a/yesod/scaffold/lucius/homepage.lucius.cg b/yesod/scaffold/templates/homepage.lucius.cg similarity index 100% rename from yesod/scaffold/lucius/homepage.lucius.cg rename to yesod/scaffold/templates/homepage.lucius.cg diff --git a/yesod/scaffold/lucius/normalize.lucius.cg b/yesod/scaffold/templates/normalize.lucius.cg similarity index 100% rename from yesod/scaffold/lucius/normalize.lucius.cg rename to yesod/scaffold/templates/normalize.lucius.cg diff --git a/yesod/scaffold/tiny/Application.hs.cg b/yesod/scaffold/tiny/Application.hs.cg index 110747bc..7419e196 100644 --- a/yesod/scaffold/tiny/Application.hs.cg +++ b/yesod/scaffold/tiny/Application.hs.cg @@ -14,7 +14,6 @@ import Yesod.Default.Config import Yesod.Default.Main (defaultDevelApp, defaultRunner) import Yesod.Default.Handlers (getFaviconR, getRobotsR) import Yesod.Logger (Logger) -import Data.ByteString (ByteString) import Network.Wai (Application) import Data.Dynamic (Dynamic, toDyn) diff --git a/yesod/scaffold/tiny/Foundation.hs.cg b/yesod/scaffold/tiny/Foundation.hs.cg index 50e5e1ec..c8c72d34 100644 --- a/yesod/scaffold/tiny/Foundation.hs.cg +++ b/yesod/scaffold/tiny/Foundation.hs.cg @@ -81,7 +81,7 @@ instance Yesod ~sitearg~ where pc <- widgetToPageContent $ do $(widgetFile "normalize") $(widgetFile "default-layout") - hamletToRepHtml $(hamletFile "hamlet/default-layout-wrapper.hamlet") + hamletToRepHtml $(hamletFile "templates/default-layout-wrapper.hamlet") -- This is done to provide an optimization for serving static files from -- a separate domain. Please see the staticroot setting in Settings.hs diff --git a/yesod/scaffold/tiny/project.cabal.cg b/yesod/scaffold/tiny/project.cabal.cg index 1d987f2d..d6725b56 100644 --- a/yesod/scaffold/tiny/project.cabal.cg +++ b/yesod/scaffold/tiny/project.cabal.cg @@ -48,7 +48,7 @@ executable ~project~ build-depends: base >= 4 && < 5 , yesod-core >= 0.9.3 && < 0.10 , yesod-static >= 0.3.1 && < 0.4 - , yesod-default >= 0.3.1 && < 0.4 + , yesod-default >= 0.4 && < 0.5 , clientsession >= 0.7.3 && < 0.8 , bytestring >= 0.9 && < 0.10 , text >= 0.11 && < 0.12 diff --git a/yesod/yesod.cabal b/yesod/yesod.cabal index 2692cb3d..9f202099 100644 --- a/yesod/yesod.cabal +++ b/yesod/yesod.cabal @@ -17,8 +17,8 @@ homepage: http://www.yesodweb.com/ extra-source-files: input/*.cg - scaffold/lucius/default-layout.lucius.cg - scaffold/lucius/homepage.lucius.cg + scaffold/templates/default-layout.lucius.cg + scaffold/templates/homepage.lucius.cg scaffold/Model.hs.cg scaffold/Foundation.hs.cg scaffold/LICENSE.cg @@ -28,17 +28,17 @@ extra-source-files: scaffold/tiny/Application.hs.cg scaffold/tiny/config/routes.cg scaffold/tiny/Settings.hs.cg - scaffold/lucius/normalize.lucius.cg + scaffold/templates/normalize.lucius.cg scaffold/postgresqlConnPool.cg scaffold/sqliteConnPool.cg scaffold/.ghci.cg scaffold/project.cabal.cg scaffold/Application.hs.cg - scaffold/julius/homepage.julius.cg - scaffold/hamlet/homepage.hamlet.cg - scaffold/hamlet/default-layout.hamlet.cg - scaffold/hamlet/default-layout-wrapper.hamlet.cg - scaffold/hamlet/boilerplate-layout.hamlet.cg + scaffold/templates/homepage.julius.cg + scaffold/templates/homepage.hamlet.cg + scaffold/templates/default-layout.hamlet.cg + scaffold/templates/default-layout-wrapper.hamlet.cg + scaffold/templates/boilerplate-layout.hamlet.cg scaffold/deploy/Procfile.cg scaffold/main.hs.cg scaffold/Handler/Root.hs.cg From 23139a579dbcd2b48062950355facf4f1e3ed122 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Fri, 14 Oct 2011 09:54:31 +0200 Subject: [PATCH 05/10] Import.hs in scaffolding --- yesod/Scaffolding/Scaffolder.hs | 1 + yesod/scaffold/Application.hs.cg | 1 - yesod/scaffold/Handler/Root.hs.cg | 4 ++-- yesod/scaffold/Import.hs.cg | 18 ++++++++++++++++++ yesod/scaffold/project.cabal.cg | 1 + yesod/scaffold/tiny/project.cabal.cg | 1 + yesod/yesod.cabal | 1 + 7 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 yesod/scaffold/Import.hs.cg diff --git a/yesod/Scaffolding/Scaffolder.hs b/yesod/Scaffolding/Scaffolder.hs index b48fcee2..0d814b49 100644 --- a/yesod/Scaffolding/Scaffolder.hs +++ b/yesod/Scaffolding/Scaffolder.hs @@ -155,6 +155,7 @@ scaffold = do writeFile' ".ghci" $(codegen ".ghci") writeFile' "LICENSE" $(codegen "LICENSE") writeFile' ("Foundation.hs") $ ifTiny $(codegen "tiny/Foundation.hs") $(codegen "Foundation.hs") + writeFile' "Import.hs" $(codegen "Import.hs") writeFile' "Application.hs" $ ifTiny $(codegen "tiny/Application.hs") $(codegen "Application.hs") writeFile' "Handler/Root.hs" $(codegen "Handler/Root.hs") unless isTiny $ writeFile' "Model.hs" $(codegen "Model.hs") diff --git a/yesod/scaffold/Application.hs.cg b/yesod/scaffold/Application.hs.cg index 3c60a604..e780f068 100644 --- a/yesod/scaffold/Application.hs.cg +++ b/yesod/scaffold/Application.hs.cg @@ -15,7 +15,6 @@ import Yesod.Default.Config import Yesod.Default.Main import Yesod.Default.Handlers import Yesod.Logger (Logger) -import Data.ByteString (ByteString) import Data.Dynamic (Dynamic, toDyn) import qualified Database.Persist.Base~importMigration~ diff --git a/yesod/scaffold/Handler/Root.hs.cg b/yesod/scaffold/Handler/Root.hs.cg index 4ee59109..1ab268e8 100644 --- a/yesod/scaffold/Handler/Root.hs.cg +++ b/yesod/scaffold/Handler/Root.hs.cg @@ -1,7 +1,7 @@ -{-# LANGUAGE TemplateHaskell, QuasiQuotes, OverloadedStrings #-} +{-# LANGUAGE TemplateHaskell, QuasiQuotes, OverloadedStrings, NoImplicitPrelude #-} module Handler.Root where -import Foundation +import Import -- This is a handler function for the GET request method on the RootR -- resource pattern. All of your resource patterns are defined in diff --git a/yesod/scaffold/Import.hs.cg b/yesod/scaffold/Import.hs.cg new file mode 100644 index 00000000..cef85920 --- /dev/null +++ b/yesod/scaffold/Import.hs.cg @@ -0,0 +1,18 @@ +module Import + ( module Prelude + , module Foundation + , (<>) + , Text + , module Data.Monoid + , module Control.Applicative + ) where + +import Prelude hiding (writeFile, readFile) +import Foundation +import Data.Monoid (Monoid (mappend, mempty, mconcat)) +import Control.Applicative ((<$>), (<*>), pure) +import Data.Text (Text) + +infixr 5 <> +(<>) :: Monoid m => m -> m -> m +(<>) = mappend diff --git a/yesod/scaffold/project.cabal.cg b/yesod/scaffold/project.cabal.cg index ac7297cb..a078def6 100644 --- a/yesod/scaffold/project.cabal.cg +++ b/yesod/scaffold/project.cabal.cg @@ -28,6 +28,7 @@ library exposed-modules: Application other-modules: Foundation + Import Model Settings Settings.StaticFiles diff --git a/yesod/scaffold/tiny/project.cabal.cg b/yesod/scaffold/tiny/project.cabal.cg index d6725b56..f0a25a02 100644 --- a/yesod/scaffold/tiny/project.cabal.cg +++ b/yesod/scaffold/tiny/project.cabal.cg @@ -27,6 +27,7 @@ library Buildable: False exposed-modules: Application other-modules: Foundation + Import Settings Settings.StaticFiles Handler.Root diff --git a/yesod/yesod.cabal b/yesod/yesod.cabal index 9f202099..94ce8900 100644 --- a/yesod/yesod.cabal +++ b/yesod/yesod.cabal @@ -20,6 +20,7 @@ extra-source-files: scaffold/templates/default-layout.lucius.cg scaffold/templates/homepage.lucius.cg scaffold/Model.hs.cg + scaffold/Import.hs.cg scaffold/Foundation.hs.cg scaffold/LICENSE.cg scaffold/mongoDBConnPool.cg From 39692f8379d2241b99b821dbde655f4e6db121a8 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Fri, 14 Oct 2011 10:10:05 +0200 Subject: [PATCH 06/10] Fixes for templates folder --- yesod-default/Yesod/Default/Util.hs | 20 ++++++++++---------- yesod/Build.hs | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/yesod-default/Yesod/Default/Util.hs b/yesod-default/Yesod/Default/Util.hs index fa21a8b3..1e3a5418 100644 --- a/yesod-default/Yesod/Default/Util.hs +++ b/yesod-default/Yesod/Default/Util.hs @@ -52,24 +52,24 @@ addStaticContentExternal minify hash staticDir toRoute ext' _ content = do | ext' == "js" = either (const content) id $ minify content | otherwise = content --- | expects a root folder for each type, e.g: hamlet/ lucius/ julius/ +-- | expects a file extension for each type, e.g: hamlet lucius julius globFile :: String -> String -> FilePath -globFile kind x = kind ++ "/" ++ x ++ "." ++ kind +globFile kind x = "templates/" ++ x ++ "." ++ kind widgetFileProduction :: FilePath -> Q Exp widgetFileProduction x = do - let h = whenExists x "templates" whamletFile - let c = whenExists x "templates" cassiusFile - let j = whenExists x "templates" juliusFile - let l = whenExists x "templates" luciusFile + let h = whenExists x "hamlet" whamletFile + let c = whenExists x "cassius" cassiusFile + let j = whenExists x "julius" juliusFile + let l = whenExists x "lucius" luciusFile [|$h >> addCassius $c >> addJulius $j >> addLucius $l|] widgetFileDebug :: FilePath -> Q Exp widgetFileDebug x = do - let h = whenExists x "templates" whamletFile - let c = whenExists x "templates" cassiusFileDebug - let j = whenExists x "templates" juliusFileDebug - let l = whenExists x "templates" luciusFileDebug + let h = whenExists x "hamlet" whamletFile + let c = whenExists x "cassius" cassiusFileDebug + let j = whenExists x "julius" juliusFileDebug + let l = whenExists x "lucius" luciusFileDebug [|$h >> addCassius $c >> addJulius $j >> addLucius $l|] whenExists :: String -> String -> (FilePath -> Q Exp) -> Q Exp diff --git a/yesod/Build.hs b/yesod/Build.hs index f0b68ad4..51ff311c 100644 --- a/yesod/Build.hs +++ b/yesod/Build.hs @@ -125,7 +125,7 @@ determineHamletDeps x = do A.Fail{} -> return [] A.Done _ r -> mapM go r >>= filterM doesFileExist . concat where - go (Just (Hamlet, f)) = return [f, "hamlet/" ++ f ++ ".hamlet"] + go (Just (Hamlet, f)) = return [f, "templates/" ++ f ++ ".hamlet"] go (Just (Verbatim, f)) = return [f] go (Just (Messages f, _)) = return [f] go (Just (StaticFiles fp, _)) = getFolderContents fp From 22bf832cbbaede222abd0de2648eaf9c28620a9d Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Fri, 14 Oct 2011 10:22:54 +0200 Subject: [PATCH 07/10] Scaffolding: define extensions in cabal file --- yesod/scaffold/Application.hs.cg | 5 +---- yesod/scaffold/Foundation.hs.cg | 4 +--- yesod/scaffold/Handler/Root.hs.cg | 1 - yesod/scaffold/Model.hs.cg | 2 +- yesod/scaffold/Settings.hs.cg | 4 +--- yesod/scaffold/Settings/StaticFiles.hs.cg | 1 - yesod/scaffold/main.hs.cg | 1 + yesod/scaffold/project.cabal.cg | 22 ++++++++++++++++++++++ yesod/scaffold/tiny/Application.hs.cg | 5 +---- yesod/scaffold/tiny/Foundation.hs.cg | 3 +-- yesod/scaffold/tiny/Settings.hs.cg | 4 +--- yesod/scaffold/tiny/project.cabal.cg | 18 ++++++++++++++++++ 12 files changed, 48 insertions(+), 22 deletions(-) diff --git a/yesod/scaffold/Application.hs.cg b/yesod/scaffold/Application.hs.cg index e780f068..5914c84c 100644 --- a/yesod/scaffold/Application.hs.cg +++ b/yesod/scaffold/Application.hs.cg @@ -1,13 +1,10 @@ -{-# LANGUAGE TemplateHaskell #-} -{-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE CPP #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Application ( with~sitearg~ , withDevelAppPort ) where -import Foundation +import Import import Settings import Yesod.Static import Yesod.Auth diff --git a/yesod/scaffold/Foundation.hs.cg b/yesod/scaffold/Foundation.hs.cg index caedd061..cbbbb074 100644 --- a/yesod/scaffold/Foundation.hs.cg +++ b/yesod/scaffold/Foundation.hs.cg @@ -1,6 +1,3 @@ -{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies #-} -{-# LANGUAGE OverloadedStrings, MultiParamTypeClasses #-} -{-# LANGUAGE CPP #-} module Foundation ( ~sitearg~ (..) , ~sitearg~Route (..) @@ -17,6 +14,7 @@ module Foundation , AuthRoute (..) ) where +import Prelude import Yesod import Yesod.Static (Static, base64md5, StaticRoute(..)) import Settings.StaticFiles diff --git a/yesod/scaffold/Handler/Root.hs.cg b/yesod/scaffold/Handler/Root.hs.cg index 1ab268e8..708a5382 100644 --- a/yesod/scaffold/Handler/Root.hs.cg +++ b/yesod/scaffold/Handler/Root.hs.cg @@ -1,4 +1,3 @@ -{-# LANGUAGE TemplateHaskell, QuasiQuotes, OverloadedStrings, NoImplicitPrelude #-} module Handler.Root where import Import diff --git a/yesod/scaffold/Model.hs.cg b/yesod/scaffold/Model.hs.cg index 87f7e502..0c78f3d0 100644 --- a/yesod/scaffold/Model.hs.cg +++ b/yesod/scaffold/Model.hs.cg @@ -1,6 +1,6 @@ -{-# LANGUAGE QuasiQuotes, TypeFamilies, GeneralizedNewtypeDeriving, TemplateHaskell, GADTs #-} module Model where +import Prelude import Yesod import Data.Text (Text) ~modelImports~ diff --git a/yesod/scaffold/Settings.hs.cg b/yesod/scaffold/Settings.hs.cg index 6ab29b6f..37d07341 100644 --- a/yesod/scaffold/Settings.hs.cg +++ b/yesod/scaffold/Settings.hs.cg @@ -1,6 +1,3 @@ -{-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell, QuasiQuotes #-} -{-# LANGUAGE OverloadedStrings #-} -- | Settings are centralized, as much as possible, into this file. This -- includes database connection settings, static file locations, etc. -- In addition, you can configure a number of different aspects of Yesod @@ -13,6 +10,7 @@ module Settings , staticDir ) where +import Prelude (FilePath, String) import Text.Shakespeare.Text (st) import Language.Haskell.TH.Syntax import Database.Persist.~importPersist~ (~configPersist~) diff --git a/yesod/scaffold/Settings/StaticFiles.hs.cg b/yesod/scaffold/Settings/StaticFiles.hs.cg index 5d9f51f3..f4f01920 100644 --- a/yesod/scaffold/Settings/StaticFiles.hs.cg +++ b/yesod/scaffold/Settings/StaticFiles.hs.cg @@ -1,4 +1,3 @@ -{-# LANGUAGE CPP, QuasiQuotes, TemplateHaskell, TypeFamilies #-} module Settings.StaticFiles where import Yesod.Static (staticFiles, StaticRoute (StaticRoute)) diff --git a/yesod/scaffold/main.hs.cg b/yesod/scaffold/main.hs.cg index db9ccf5b..08fb4a4c 100644 --- a/yesod/scaffold/main.hs.cg +++ b/yesod/scaffold/main.hs.cg @@ -1,6 +1,7 @@ import Yesod.Default.Config (fromArgs) import Yesod.Default.Main (defaultMain) import Application (with~sitearg~) +import Prelude (IO) main :: IO () main = defaultMain fromArgs with~sitearg~ diff --git a/yesod/scaffold/project.cabal.cg b/yesod/scaffold/project.cabal.cg index a078def6..2af3df49 100644 --- a/yesod/scaffold/project.cabal.cg +++ b/yesod/scaffold/project.cabal.cg @@ -36,6 +36,17 @@ library ghc-options: -Wall -threaded -O0 + extensions: TemplateHaskell + QuasiQuotes + OverloadedStrings + NoImplicitPrelude + CPP + OverloadedStrings + MultiParamTypeClasses + TypeFamilies + GADTs + GeneralizedNewtypeDeriving + executable ~project~ if flag(devel) Buildable: False @@ -48,6 +59,17 @@ executable ~project~ main-is: main.hs + extensions: TemplateHaskell + QuasiQuotes + OverloadedStrings + NoImplicitPrelude + CPP + OverloadedStrings + MultiParamTypeClasses + TypeFamilies + GADTs + GeneralizedNewtypeDeriving + build-depends: base >= 4 && < 5 , yesod >= 0.9 && < 0.10 , yesod-core >= 0.9.3 && < 0.10 diff --git a/yesod/scaffold/tiny/Application.hs.cg b/yesod/scaffold/tiny/Application.hs.cg index 7419e196..47ce7469 100644 --- a/yesod/scaffold/tiny/Application.hs.cg +++ b/yesod/scaffold/tiny/Application.hs.cg @@ -1,13 +1,10 @@ -{-# LANGUAGE TemplateHaskell #-} -{-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE CPP #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Application ( with~sitearg~ , withDevelAppPort ) where -import Foundation +import Import import Settings import Yesod.Static import Yesod.Default.Config diff --git a/yesod/scaffold/tiny/Foundation.hs.cg b/yesod/scaffold/tiny/Foundation.hs.cg index c8c72d34..868d8fcd 100644 --- a/yesod/scaffold/tiny/Foundation.hs.cg +++ b/yesod/scaffold/tiny/Foundation.hs.cg @@ -1,5 +1,3 @@ -{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies #-} -{-# LANGUAGE OverloadedStrings, MultiParamTypeClasses #-} module Foundation ( ~sitearg~ (..) , ~sitearg~Route (..) @@ -14,6 +12,7 @@ module Foundation , liftIO ) where +import Prelude import Yesod.Core import Yesod.Default.Config import Yesod.Default.Util (addStaticContentExternal) diff --git a/yesod/scaffold/tiny/Settings.hs.cg b/yesod/scaffold/tiny/Settings.hs.cg index fa5aa732..fdc06d96 100644 --- a/yesod/scaffold/tiny/Settings.hs.cg +++ b/yesod/scaffold/tiny/Settings.hs.cg @@ -1,6 +1,3 @@ -{-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell, QuasiQuotes #-} -{-# LANGUAGE OverloadedStrings #-} -- | Settings are centralized, as much as possible, into this file. This -- includes database connection settings, static file locations, etc. -- In addition, you can configure a number of different aspects of Yesod @@ -12,6 +9,7 @@ module Settings , staticDir ) where +import Prelude (FilePath, String) import Text.Shakespeare.Text (st) import Language.Haskell.TH.Syntax import Yesod.Default.Config diff --git a/yesod/scaffold/tiny/project.cabal.cg b/yesod/scaffold/tiny/project.cabal.cg index f0a25a02..72fe6f2b 100644 --- a/yesod/scaffold/tiny/project.cabal.cg +++ b/yesod/scaffold/tiny/project.cabal.cg @@ -34,6 +34,15 @@ library ghc-options: -Wall -threaded -O0 + extensions: TemplateHaskell + QuasiQuotes + OverloadedStrings + NoImplicitPrelude + CPP + OverloadedStrings + MultiParamTypeClasses + TypeFamilies + executable ~project~ if flag(devel) Buildable: False @@ -46,6 +55,15 @@ executable ~project~ main-is: main.hs + extensions: TemplateHaskell + QuasiQuotes + OverloadedStrings + NoImplicitPrelude + CPP + OverloadedStrings + MultiParamTypeClasses + TypeFamilies + build-depends: base >= 4 && < 5 , yesod-core >= 0.9.3 && < 0.10 , yesod-static >= 0.3.1 && < 0.4 From 325d912be34fc91fc6da742583e594337057461d Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Fri, 14 Oct 2011 11:08:44 +0200 Subject: [PATCH 08/10] yesod-default uses new GzipCacheFolder --- yesod-default/Yesod/Default/Main.hs | 31 +++++++++++++++++++---------- yesod-default/yesod-default.cabal | 2 +- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/yesod-default/Yesod/Default/Main.hs b/yesod-default/Yesod/Default/Main.hs index 9cb36d8d..22d4bbcd 100644 --- a/yesod-default/Yesod/Default/Main.hs +++ b/yesod-default/Yesod/Default/Main.hs @@ -13,6 +13,11 @@ import Yesod.Logger (Logger, makeLogger, logString, logLazyText, flushLogger) import Network.Wai (Application) import Network.Wai.Handler.Warp (run) import Network.Wai.Middleware.Debug (debugHandle) +import System.Directory (doesDirectoryExist, removeDirectoryRecursive) +import Network.Wai.Middleware.Gzip (gzip', GzipFiles (GzipCacheFolder), gzipFiles, def) +import Network.Wai.Middleware.Autohead (autohead) +import Network.Wai.Middleware.Jsonp (jsonp) +import Control.Monad (when) #ifndef WINDOWS import qualified System.Posix.Signals as Signal @@ -55,19 +60,25 @@ defaultRunner :: (YesodDispatch y y, Yesod y) => (Application -> IO a) -> y -- ^ your foundation type -> IO () -defaultRunner f h = +defaultRunner f h = do + -- clear the .static-cache so we don't have stale content + exists <- doesDirectoryExist staticCache + when exists $ removeDirectoryRecursive staticCache #ifdef WINDOWS - toWaiApp h >>= f >> return () + toWaiAppPlain h >>= f . middlewares >> return () #else - do - tid <- forkIO $ toWaiApp h >>= f >> return () - flag <- newEmptyMVar - _ <- Signal.installHandler Signal.sigINT (Signal.CatchOnce $ do - putStrLn "Caught an interrupt" - killThread tid - putMVar flag ()) Nothing - takeMVar flag + tid <- forkIO $ toWaiAppPlain h >>= f . middlewares >> return () + flag <- newEmptyMVar + _ <- Signal.installHandler Signal.sigINT (Signal.CatchOnce $ do + putStrLn "Caught an interrupt" + killThread tid + putMVar flag ()) Nothing + takeMVar flag #endif + where + middlewares = gzip' gset . jsonp . autohead + gset = def { gzipFiles = GzipCacheFolder staticCache } + staticCache = ".static-cache" -- | Run your development app using the provided @'DefaultEnv'@ type -- diff --git a/yesod-default/yesod-default.cabal b/yesod-default/yesod-default.cabal index 7c43324a..9806f68b 100644 --- a/yesod-default/yesod-default.cabal +++ b/yesod-default/yesod-default.cabal @@ -22,7 +22,7 @@ library , cmdargs >= 0.8 && < 0.9 , warp >= 0.4 && < 0.5 , wai >= 0.4 && < 0.5 - , wai-extra >= 0.4 && < 0.5 + , wai-extra >= 0.4.4 && < 0.5 , bytestring >= 0.9 && < 0.10 , transformers >= 0.2 && < 0.3 , text >= 0.9 && < 1.0 From 0452ee452765bfd6ea3e0aa1b0220b8687905a3f Mon Sep 17 00:00:00 2001 From: Pascal Wittmann Date: Sat, 15 Oct 2011 11:00:02 +0200 Subject: [PATCH 09/10] configuration of robots.txt via config/robots.txt --- yesod-default/Yesod/Default/Handlers.hs | 4 ++-- yesod/Scaffolding/Scaffolder.hs | 4 ++++ yesod/scaffold/config/robots.txt.cg | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 yesod/scaffold/config/robots.txt.cg diff --git a/yesod-default/Yesod/Default/Handlers.hs b/yesod-default/Yesod/Default/Handlers.hs index d5b95a1c..cb58e07b 100644 --- a/yesod-default/Yesod/Default/Handlers.hs +++ b/yesod-default/Yesod/Default/Handlers.hs @@ -5,10 +5,10 @@ module Yesod.Default.Handlers ) where import Yesod.Handler (GHandler, sendFile) -import Yesod.Content (RepPlain(..), ToContent(..)) +import Yesod.Content (RepPlain(..)) getFaviconR :: GHandler s m () getFaviconR = sendFile "image/x-icon" "config/favicon.ico" getRobotsR :: GHandler s m RepPlain -getRobotsR = return $ RepPlain $ toContent ("User-agent: *" :: String) +getRobotsR = sendFile "text/plain" "config/robots.txt" diff --git a/yesod/Scaffolding/Scaffolder.hs b/yesod/Scaffolding/Scaffolder.hs index 0d814b49..a886c4f3 100644 --- a/yesod/Scaffolding/Scaffolder.hs +++ b/yesod/Scaffolding/Scaffolder.hs @@ -189,5 +189,9 @@ scaffold = do $(runIO (S.readFile "scaffold/config/favicon.ico.cg") >>= \bs -> do pack <- [|S.pack|] return $ pack `AppE` LitE (StringL $ S.unpack bs)) + + S.writeFile (dir ++ "/config/robots.txt") + $(runIO (S.readFile "scaffold/config/robots.txt.cg") >>= \bs -> do + [|S.pack $(return $ LitE $ StringL $ S.unpack bs)|]) puts $(codegenDir "input" "done") diff --git a/yesod/scaffold/config/robots.txt.cg b/yesod/scaffold/config/robots.txt.cg new file mode 100644 index 00000000..7d329b1d --- /dev/null +++ b/yesod/scaffold/config/robots.txt.cg @@ -0,0 +1 @@ +User-agent: * From 965884d675cf1656da27117ab48208508a41386a Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Sat, 15 Oct 2011 21:46:46 +0200 Subject: [PATCH 10/10] Widgets use Builder for CSS --- yesod-core/Yesod/Internal.hs | 6 ++++-- yesod-core/Yesod/Internal/Core.hs | 3 +-- yesod-core/Yesod/Widget.hs | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/yesod-core/Yesod/Internal.hs b/yesod-core/Yesod/Internal.hs index bd1adc91..9b97cd6b 100644 --- a/yesod-core/Yesod/Internal.hs +++ b/yesod-core/Yesod/Internal.hs @@ -29,7 +29,6 @@ module Yesod.Internal ) where import Text.Hamlet (HtmlUrl, hamlet, Html) -import Text.Cassius (CssUrl) import Text.Julius (JavascriptUrl) import Data.Monoid (Monoid (..), Last) import Data.List (nub) @@ -44,6 +43,7 @@ import qualified Network.HTTP.Types as A import Data.CaseInsensitive (CI) import Data.String (IsString) import qualified Data.Map as Map +import Data.Text.Lazy.Builder (Builder) #if GHC7 #define HAMLET hamlet @@ -107,12 +107,14 @@ nonceKey = "_NONCE" sessionName :: IsString a => a sessionName = "_SESSION" +type CssBuilderUrl a = (a -> [(Text, Text)] -> Text) -> Builder + data GWData a = GWData !(Body a) !(Last Title) !(UniqueList (Script a)) !(UniqueList (Stylesheet a)) - !(Map.Map (Maybe Text) (CssUrl a)) -- media type + !(Map.Map (Maybe Text) (CssBuilderUrl a)) -- media type !(Maybe (JavascriptUrl a)) !(Head a) instance Monoid (GWData a) where diff --git a/yesod-core/Yesod/Internal/Core.hs b/yesod-core/Yesod/Internal/Core.hs index 5a38bd47..00d44867 100644 --- a/yesod-core/Yesod/Internal/Core.hs +++ b/yesod-core/Yesod/Internal/Core.hs @@ -50,7 +50,6 @@ import qualified Data.ByteString.Lazy as L import Data.Monoid import Control.Monad.Trans.RWS import Text.Hamlet -import Text.Cassius import Text.Julius import Text.Blaze ((!), customAttribute, textTag, toValue, unsafeLazyByteString) import qualified Text.Blaze.Html5 as TBH @@ -504,7 +503,7 @@ widgetToPageContent (GWidget w) = do Just (Left s) -> Just s Just (Right (u, p)) -> Just $ render u p css <- forM (Map.toList style) $ \(mmedia, content) -> do - let rendered = renderCssUrl render content + let rendered = toLazyText $ content render x <- addStaticContent "css" "text/css; charset=utf-8" $ encodeUtf8 rendered return (mmedia, diff --git a/yesod-core/Yesod/Widget.hs b/yesod-core/Yesod/Widget.hs index 141a8f2f..ead6e285 100644 --- a/yesod-core/Yesod/Widget.hs +++ b/yesod-core/Yesod/Widget.hs @@ -192,7 +192,7 @@ addWidget = id -- | Add some raw CSS to the style tag. Applies to all media types. addCassius :: Monad m => CssUrl (Route master) -> GGWidget master m () -addCassius x = GWidget $ tell $ GWData mempty mempty mempty mempty (Map.singleton Nothing x) mempty mempty +addCassius x = GWidget $ tell $ GWData mempty mempty mempty mempty (Map.singleton Nothing $ \r -> fromLazyText $ renderCss $ x r) mempty mempty -- | Identical to 'addCassius'. addLucius :: Monad m => CssUrl (Route master) -> GGWidget master m () @@ -200,7 +200,7 @@ addLucius = addCassius -- | Add some raw CSS to the style tag, for a specific media type. addCassiusMedia :: Monad m => Text -> CssUrl (Route master) -> GGWidget master m () -addCassiusMedia m x = GWidget $ tell $ GWData mempty mempty mempty mempty (Map.singleton (Just m) x) mempty mempty +addCassiusMedia m x = GWidget $ tell $ GWData mempty mempty mempty mempty (Map.singleton (Just m) $ \r -> fromLazyText $ renderCss $ x r) mempty mempty -- | Identical to 'addCassiusMedia'. addLuciusMedia :: Monad m => Text -> CssUrl (Route master) -> GGWidget master m ()