From 9eef4829ad2e00cb6b23bbf979aac731d204dd05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bjo=CC=88rn=20Buckwalter?= Date: Sat, 10 Sep 2011 22:48:32 +0800 Subject: [PATCH 1/8] Factor out English FormMessage rendering. --- yesod-form/Yesod/Form/Fields.hs | 42 ++------------------------- yesod-form/Yesod/Form/Functions.hs | 1 - yesod-form/Yesod/Form/I18n/English.hs | 26 +++++++++++++++++ yesod-form/Yesod/Form/Input.hs | 1 - yesod-form/Yesod/Form/MassInput.hs | 2 +- yesod-form/Yesod/Form/Types.hs | 20 +++++++++++++ yesod-form/yesod-form.cabal | 1 + 7 files changed, 51 insertions(+), 42 deletions(-) create mode 100644 yesod-form/Yesod/Form/I18n/English.hs diff --git a/yesod-form/Yesod/Form/Fields.hs b/yesod-form/Yesod/Form/Fields.hs index a4146d33..10b7ad06 100644 --- a/yesod-form/Yesod/Form/Fields.hs +++ b/yesod-form/Yesod/Form/Fields.hs @@ -4,8 +4,7 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleContexts #-} module Yesod.Form.Fields - ( FormMessage (..) - , defaultFormMessage + ( defaultFormMessage , textField , passwordField , textareaField @@ -29,6 +28,7 @@ module Yesod.Form.Fields ) where import Yesod.Form.Types +import Yesod.Form.I18n.English import Yesod.Widget import Yesod.Message (RenderMessage, SomeMessage (..)) import Text.Hamlet @@ -53,7 +53,6 @@ import qualified Data.ByteString as S import qualified Data.ByteString.Lazy as L import Data.Text (Text, unpack, pack) import qualified Data.Text.Read -import Data.Monoid (mappend) #if __GLASGOW_HASKELL__ >= 700 #define WHAMLET whamlet @@ -69,44 +68,9 @@ import Data.Monoid (mappend) #define HTML $html #endif -data FormMessage = MsgInvalidInteger Text - | MsgInvalidNumber Text - | MsgInvalidEntry Text - | MsgInvalidUrl Text - | MsgInvalidEmail Text - | MsgInvalidTimeFormat - | MsgInvalidHour Text - | MsgInvalidMinute Text - | MsgInvalidSecond Text - | MsgInvalidDay - | MsgCsrfWarning - | MsgValueRequired - | MsgInputNotFound Text - | MsgSelectNone - | MsgInvalidBool Text - | MsgBoolYes - | MsgBoolNo - | MsgDelete defaultFormMessage :: FormMessage -> Text -defaultFormMessage (MsgInvalidInteger t) = "Invalid integer: " `mappend` t -defaultFormMessage (MsgInvalidNumber t) = "Invalid number: " `mappend` t -defaultFormMessage (MsgInvalidEntry t) = "Invalid entry: " `mappend` t -defaultFormMessage MsgInvalidTimeFormat = "Invalid time, must be in HH:MM[:SS] format" -defaultFormMessage MsgInvalidDay = "Invalid day, must be in YYYY-MM-DD format" -defaultFormMessage (MsgInvalidUrl t) = "Invalid URL: " `mappend` t -defaultFormMessage (MsgInvalidEmail t) = "Invalid e-mail address: " `mappend` t -defaultFormMessage (MsgInvalidHour t) = "Invalid hour: " `mappend` t -defaultFormMessage (MsgInvalidMinute t) = "Invalid minute: " `mappend` t -defaultFormMessage (MsgInvalidSecond t) = "Invalid second: " `mappend` t -defaultFormMessage MsgCsrfWarning = "As a protection against cross-site request forgery attacks, please confirm your form submission." -defaultFormMessage MsgValueRequired = "Value is required" -defaultFormMessage (MsgInputNotFound t) = "Input not found: " `mappend` t -defaultFormMessage MsgSelectNone = "" -defaultFormMessage (MsgInvalidBool t) = "Invalid boolean: " `mappend` t -defaultFormMessage MsgBoolYes = "Yes" -defaultFormMessage MsgBoolNo = "No" -defaultFormMessage MsgDelete = "Delete?" +defaultFormMessage = englishFormMessage blank :: (Monad m, RenderMessage master FormMessage) => (Text -> Either FormMessage a) -> [Text] -> m (Either (SomeMessage master) (Maybe a)) diff --git a/yesod-form/Yesod/Form/Functions.hs b/yesod-form/Yesod/Form/Functions.hs index f1904f92..3c51c81a 100644 --- a/yesod-form/Yesod/Form/Functions.hs +++ b/yesod-form/Yesod/Form/Functions.hs @@ -34,7 +34,6 @@ module Yesod.Form.Functions ) where import Yesod.Form.Types -import Yesod.Form.Fields (FormMessage (MsgCsrfWarning, MsgValueRequired)) import Data.Text (Text, pack) import Control.Monad.Trans.RWS (ask, get, put, runRWST, tell, evalRWST) import Control.Monad.Trans.Class (lift) diff --git a/yesod-form/Yesod/Form/I18n/English.hs b/yesod-form/Yesod/Form/I18n/English.hs new file mode 100644 index 00000000..f13ca683 --- /dev/null +++ b/yesod-form/Yesod/Form/I18n/English.hs @@ -0,0 +1,26 @@ +{-# LANGUAGE OverloadedStrings #-} +module Yesod.Form.I18n.English where + +import Yesod.Form.Types (FormMessage (..)) +import Data.Monoid (mappend) +import Data.Text (Text) + +englishFormMessage :: FormMessage -> Text +englishFormMessage (MsgInvalidInteger t) = "Invalid integer: " `mappend` t +englishFormMessage (MsgInvalidNumber t) = "Invalid number: " `mappend` t +englishFormMessage (MsgInvalidEntry t) = "Invalid entry: " `mappend` t +englishFormMessage MsgInvalidTimeFormat = "Invalid time, must be in HH:MM[:SS] format" +englishFormMessage MsgInvalidDay = "Invalid day, must be in YYYY-MM-DD format" +englishFormMessage (MsgInvalidUrl t) = "Invalid URL: " `mappend` t +englishFormMessage (MsgInvalidEmail t) = "Invalid e-mail address: " `mappend` t +englishFormMessage (MsgInvalidHour t) = "Invalid hour: " `mappend` t +englishFormMessage (MsgInvalidMinute t) = "Invalid minute: " `mappend` t +englishFormMessage (MsgInvalidSecond t) = "Invalid second: " `mappend` t +englishFormMessage MsgCsrfWarning = "As a protection against cross-site request forgery attacks, please confirm your form submission." +englishFormMessage MsgValueRequired = "Value is required" +englishFormMessage (MsgInputNotFound t) = "Input not found: " `mappend` t +englishFormMessage MsgSelectNone = "" +englishFormMessage (MsgInvalidBool t) = "Invalid boolean: " `mappend` t +englishFormMessage MsgBoolYes = "Yes" +englishFormMessage MsgBoolNo = "No" +englishFormMessage MsgDelete = "Delete?" diff --git a/yesod-form/Yesod/Form/Input.hs b/yesod-form/Yesod/Form/Input.hs index 45c742c4..34abd57a 100644 --- a/yesod-form/Yesod/Form/Input.hs +++ b/yesod-form/Yesod/Form/Input.hs @@ -9,7 +9,6 @@ module Yesod.Form.Input ) where import Yesod.Form.Types -import Yesod.Form.Fields (FormMessage (MsgInputNotFound)) import Data.Text (Text) import Control.Applicative (Applicative (..)) import Yesod.Handler (GHandler, GGHandler, invalidArgs, runRequestBody, getRequest, getYesod, liftIOHandler) diff --git a/yesod-form/Yesod/Form/MassInput.hs b/yesod-form/Yesod/Form/MassInput.hs index f15bac0c..3a3eae40 100644 --- a/yesod-form/Yesod/Form/MassInput.hs +++ b/yesod-form/Yesod/Form/MassInput.hs @@ -11,7 +11,7 @@ module Yesod.Form.MassInput import Yesod.Form.Types import Yesod.Form.Functions -import Yesod.Form.Fields (boolField, FormMessage (MsgDelete)) +import Yesod.Form.Fields (boolField) import Yesod.Widget (GWidget, whamlet) import Yesod.Message (RenderMessage) import Yesod.Handler (newIdent, GGHandler) diff --git a/yesod-form/Yesod/Form/Types.hs b/yesod-form/Yesod/Form/Types.hs index f5f87345..c84743fd 100644 --- a/yesod-form/Yesod/Form/Types.hs +++ b/yesod-form/Yesod/Form/Types.hs @@ -5,6 +5,7 @@ module Yesod.Form.Types ( -- * Helpers Enctype (..) , FormResult (..) + , FormMessage (..) , Env , FileEnv , Ints (..) @@ -121,3 +122,22 @@ data Field sub master a = Field -> Bool -> GWidget sub master () } + +data FormMessage = MsgInvalidInteger Text + | MsgInvalidNumber Text + | MsgInvalidEntry Text + | MsgInvalidUrl Text + | MsgInvalidEmail Text + | MsgInvalidTimeFormat + | MsgInvalidHour Text + | MsgInvalidMinute Text + | MsgInvalidSecond Text + | MsgInvalidDay + | MsgCsrfWarning + | MsgValueRequired + | MsgInputNotFound Text + | MsgSelectNone + | MsgInvalidBool Text + | MsgBoolYes + | MsgBoolNo + | MsgDelete diff --git a/yesod-form/yesod-form.cabal b/yesod-form/yesod-form.cabal index b3257ffb..c726c62e 100644 --- a/yesod-form/yesod-form.cabal +++ b/yesod-form/yesod-form.cabal @@ -42,6 +42,7 @@ library Yesod.Form.Jquery Yesod.Form.Nic Yesod.Form.MassInput + Yesod.Form.I18n.English -- FIXME Yesod.Helpers.Crud ghc-options: -Wall From 392e47e1aae39f332b46ba2eb06563f47bf8b727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bjo=CC=88rn=20Buckwalter?= Date: Sat, 10 Sep 2011 23:06:57 +0800 Subject: [PATCH 2/8] Swedish FormMessages. --- yesod-form/Yesod/Form/I18n/Swedish.hs | 26 ++++++++++++++++++++++++++ yesod-form/yesod-form.cabal | 1 + 2 files changed, 27 insertions(+) create mode 100644 yesod-form/Yesod/Form/I18n/Swedish.hs diff --git a/yesod-form/Yesod/Form/I18n/Swedish.hs b/yesod-form/Yesod/Form/I18n/Swedish.hs new file mode 100644 index 00000000..48d59aca --- /dev/null +++ b/yesod-form/Yesod/Form/I18n/Swedish.hs @@ -0,0 +1,26 @@ +{-# LANGUAGE OverloadedStrings #-} +module Yesod.Form.I18n.Swedish where + +import Yesod.Form.Types (FormMessage (..)) +import Data.Monoid (mappend) +import Data.Text (Text) + +swedishFormMessage :: FormMessage -> Text +swedishFormMessage (MsgInvalidInteger t) = "Ogiltigt antal: " `mappend` t +swedishFormMessage (MsgInvalidNumber t) = "Ogiltigt nummer: " `mappend` t +swedishFormMessage (MsgInvalidEntry t) = "Invalid entry: " `mappend` t +swedishFormMessage MsgInvalidTimeFormat = "Ogiltigt klockslag, måste vara på formatet HH:MM[:SS]" +swedishFormMessage MsgInvalidDay = "Ogiltigt datum, måste vara på formatet ÅÅÅÅ-MM-DD" +swedishFormMessage (MsgInvalidUrl t) = "Ogiltig URL: " `mappend` t +swedishFormMessage (MsgInvalidEmail t) = "Ogiltig epostadress: " `mappend` t +swedishFormMessage (MsgInvalidHour t) = "Ogiltig timme: " `mappend` t +swedishFormMessage (MsgInvalidMinute t) = "Ogiltig minut: " `mappend` t +swedishFormMessage (MsgInvalidSecond t) = "Ogiltig sekund: " `mappend` t +swedishFormMessage MsgValueRequired = "Fältet är obligatoriskt" +swedishFormMessage (MsgInputNotFound t) = "Fältet hittades ej: " `mappend` t +swedishFormMessage MsgSelectNone = "" +swedishFormMessage (MsgInvalidBool t) = "Ogiltig boolesk: " `mappend` t +swedishFormMessage MsgBoolYes = "Ja" +swedishFormMessage MsgBoolNo = "Nej" +swedishFormMessage MsgDelete = "Radera?" +swedishFormMessage MsgCsrfWarning = "Som skydd mot \"cross-site request forgery\" attacker, vänligen bekräfta skickandet av formuläret." diff --git a/yesod-form/yesod-form.cabal b/yesod-form/yesod-form.cabal index c726c62e..8da5c05e 100644 --- a/yesod-form/yesod-form.cabal +++ b/yesod-form/yesod-form.cabal @@ -43,6 +43,7 @@ library Yesod.Form.Nic Yesod.Form.MassInput Yesod.Form.I18n.English + Yesod.Form.I18n.Swedish -- FIXME Yesod.Helpers.Crud ghc-options: -Wall From 9158931915a4f86411541f65d0c608d913540bda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bjo=CC=88rn=20Buckwalter?= Date: Sun, 11 Sep 2011 11:45:24 +0800 Subject: [PATCH 3/8] Reexport FormMessage (..) from Yesod.Form.Fields. This amendment should make commit 9eef4829ad2e00cb6b23bbf979aac731d204dd05 a non-breaking change, except possibly causing some warnings about duplicate exports with Yesod.Form.Types. --- yesod-form/Yesod/Form.hs | 2 +- yesod-form/Yesod/Form/Fields.hs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/yesod-form/Yesod/Form.hs b/yesod-form/Yesod/Form.hs index 4345e7da..e2f09afc 100644 --- a/yesod-form/Yesod/Form.hs +++ b/yesod-form/Yesod/Form.hs @@ -9,6 +9,6 @@ module Yesod.Form import Yesod.Form.Types import Yesod.Form.Functions -import Yesod.Form.Fields +import Yesod.Form.Fields hiding (FormMessage (..)) import Yesod.Form.Class import Yesod.Form.Input diff --git a/yesod-form/Yesod/Form/Fields.hs b/yesod-form/Yesod/Form/Fields.hs index 10b7ad06..c7d3871d 100644 --- a/yesod-form/Yesod/Form/Fields.hs +++ b/yesod-form/Yesod/Form/Fields.hs @@ -4,7 +4,8 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleContexts #-} module Yesod.Form.Fields - ( defaultFormMessage + ( FormMessage (..) + , defaultFormMessage , textField , passwordField , textareaField From dc5d5e5e70500445687ae8438ffafc5bd0725694 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Sat, 10 Sep 2011 23:35:00 +0300 Subject: [PATCH 4/8] Finish removing submodules --- aeson | 1 - authenticate | 1 - blaze-textual | 1 - install-all.sh | 3 --- 4 files changed, 6 deletions(-) delete mode 160000 aeson delete mode 160000 authenticate delete mode 160000 blaze-textual diff --git a/aeson b/aeson deleted file mode 160000 index 5e7dfc9e..00000000 --- a/aeson +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5e7dfc9e217e84d195f2ec9904e0baee84ed18f9 diff --git a/authenticate b/authenticate deleted file mode 160000 index 084f118f..00000000 --- a/authenticate +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 084f118ff1617bbc6c132aa1b09d1f29d9e25f0b diff --git a/blaze-textual b/blaze-textual deleted file mode 160000 index fb6f8f1f..00000000 --- a/blaze-textual +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fb6f8f1f440acb4d77f7b5039813573b990e300f diff --git a/install-all.sh b/install-all.sh index 9114ba89..9b135d20 100755 --- a/install-all.sh +++ b/install-all.sh @@ -6,9 +6,6 @@ CABAL=${CABAL:-cabal} # install testing dependencies $CABAL install HUnit QuickCheck 'hspec >= 0.6.1 && < 0.7' shelltestrunner -# pull submodules -git submodule update --init - pkgs=( yesod-core yesod-json yesod-static From 40e83beae3c17b7bc56bf62a2a80efdc1e948eb9 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Sun, 11 Sep 2011 00:19:32 +0300 Subject: [PATCH 5/8] Version bumps --- yesod-auth/yesod-auth.cabal | 2 +- yesod-core/yesod-core.cabal | 2 +- yesod/yesod.cabal | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/yesod-auth/yesod-auth.cabal b/yesod-auth/yesod-auth.cabal index 13dab495..1bd76baf 100644 --- a/yesod-auth/yesod-auth.cabal +++ b/yesod-auth/yesod-auth.cabal @@ -1,5 +1,5 @@ name: yesod-auth -version: 0.7.1.1 +version: 0.7.2 license: BSD3 license-file: LICENSE author: Michael Snoyman, Patrick Brisbin diff --git a/yesod-core/yesod-core.cabal b/yesod-core/yesod-core.cabal index f33a1f88..1b520dc4 100644 --- a/yesod-core/yesod-core.cabal +++ b/yesod-core/yesod-core.cabal @@ -1,5 +1,5 @@ name: yesod-core -version: 0.9.1.1 +version: 0.9.2 license: BSD3 license-file: LICENSE author: Michael Snoyman diff --git a/yesod/yesod.cabal b/yesod/yesod.cabal index be171174..d3275d42 100644 --- a/yesod/yesod.cabal +++ b/yesod/yesod.cabal @@ -1,5 +1,5 @@ name: yesod -version: 0.9.1.1 +version: 0.9.2 license: BSD3 license-file: LICENSE author: Michael Snoyman From b00fd948bd7d8589f1343685de5e859810fc3aa2 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Sun, 11 Sep 2011 08:52:23 +0300 Subject: [PATCH 6/8] authBrowserId' --- yesod-auth/Yesod/Auth/BrowserId.hs | 33 ++++++++++++++++++++++++++++++ yesod-auth/browserid.hs | 3 +-- yesod-auth/yesod-auth.cabal | 2 +- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/yesod-auth/Yesod/Auth/BrowserId.hs b/yesod-auth/Yesod/Auth/BrowserId.hs index ddb975ef..9c6e22fe 100644 --- a/yesod-auth/Yesod/Auth/BrowserId.hs +++ b/yesod-auth/Yesod/Auth/BrowserId.hs @@ -3,6 +3,7 @@ {-# LANGUAGE OverloadedStrings #-} module Yesod.Auth.BrowserId ( authBrowserId + , authBrowserId' ) where import Yesod.Auth @@ -11,6 +12,8 @@ import Data.Text (Text) import Yesod.Core import Text.Hamlet (hamlet) import Control.Monad.IO.Class (liftIO) +import qualified Data.Text as T +import Data.Maybe (fromMaybe) #include "qq.h" @@ -46,3 +49,33 @@ authBrowserId audience = AuthPlugin |] } + +authBrowserId' :: YesodAuth m => AuthPlugin m +authBrowserId' = AuthPlugin + { apName = pid + , apDispatch = \m ps -> + case (m, ps) of + ("GET", [assertion]) -> do + tm <- getRouteToMaster + r <- getUrlRender + let audience = T.takeWhile (/= '/') $ stripScheme $ r $ tm LoginR + memail <- liftIO $ checkAssertion audience assertion + case memail of + Nothing -> error "Invalid assertion" + Just email -> setCreds True Creds + { credsPlugin = pid + , credsIdent = email + , credsExtra = [] + } + (_, []) -> badMethod + _ -> notFound + , apLogin = \toMaster -> do + addScriptRemote browserIdJs + addHamlet [QQ(hamlet)| +

+ + +|] + } + where + stripScheme t = fromMaybe t $ T.stripPrefix "//" $ snd $ T.breakOn "//" t diff --git a/yesod-auth/browserid.hs b/yesod-auth/browserid.hs index 12da848d..e771b6dc 100644 --- a/yesod-auth/browserid.hs +++ b/yesod-auth/browserid.hs @@ -13,7 +13,6 @@ import Yesod.Form import Network.Wai.Handler.Warp (run) data BID = BID -type Handler = GHandler BID BID mkYesod "BID" [parseRoutes| / RootR GET @@ -39,7 +38,7 @@ instance YesodAuth BID where loginDest _ = AfterLoginR logoutDest _ = AuthR LoginR getAuthId = return . Just . credsIdent - authPlugins = [authBrowserId "localhost:3000"] + authPlugins = [authBrowserId'] instance RenderMessage BID FormMessage where renderMessage _ _ = defaultFormMessage diff --git a/yesod-auth/yesod-auth.cabal b/yesod-auth/yesod-auth.cabal index 1bd76baf..331da47b 100644 --- a/yesod-auth/yesod-auth.cabal +++ b/yesod-auth/yesod-auth.cabal @@ -1,5 +1,5 @@ name: yesod-auth -version: 0.7.2 +version: 0.7.3 license: BSD3 license-file: LICENSE author: Michael Snoyman, Patrick Brisbin From 02a2c6de02c80574712ad4dc67d425cac636555c Mon Sep 17 00:00:00 2001 From: Luite Stegeman Date: Sun, 11 Sep 2011 13:02:22 +0200 Subject: [PATCH 7/8] remove obsolete Update field attribute from scaffold --- yesod/scaffold/config/models.cg | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yesod/scaffold/config/models.cg b/yesod/scaffold/config/models.cg index 0fafb17a..38f54955 100644 --- a/yesod/scaffold/config/models.cg +++ b/yesod/scaffold/config/models.cg @@ -1,10 +1,10 @@ User ident Text - password Text Maybe Update + password Text Maybe UniqueUser ident Email email Text - user UserId Maybe Update - verkey Text Maybe Update + user UserId Maybe + verkey Text Maybe UniqueEmail email From cba8a6938af68afa0140b893bf64cbc5acefef67 Mon Sep 17 00:00:00 2001 From: Greg Weber Date: Sun, 11 Sep 2011 05:34:27 -0700 Subject: [PATCH 8/8] show mongo backend option to the world --- yesod/input/database.cg | 8 +++++--- yesod/yesod.cabal | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/yesod/input/database.cg b/yesod/input/database.cg index 23e45f53..4d8d2aff 100644 --- a/yesod/input/database.cg +++ b/yesod/input/database.cg @@ -1,7 +1,9 @@ Yesod uses Persistent for its (you guessed it) persistence layer. -This tool will build in either SQLite or PostgreSQL support for you. +This tool will build in either SQLite or PostgreSQL or MongoDB support for you. We recommend starting with SQLite: it has no dependencies. -We have another option: a tiny project with minimal dependencies. In particular: no database and no authentication. +We have another option: a tiny project with minimal dependencies. +Mostly this means no database and no authentication. -So, what'll it be? s for sqlite, p for postgresql, t for tiny: +So, what'll it be? +s for sqlite, p for postgresql, m for mongodb, or t for tiny: diff --git a/yesod/yesod.cabal b/yesod/yesod.cabal index d3275d42..94a340d4 100644 --- a/yesod/yesod.cabal +++ b/yesod/yesod.cabal @@ -1,5 +1,5 @@ name: yesod -version: 0.9.2 +version: 0.9.2.1 license: BSD3 license-file: LICENSE author: Michael Snoyman