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
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 13dab495..331da47b 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.3
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 9fa70f24..6b33e2f5 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-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 7f24431a..7d3c5c54 100644
--- a/yesod-form/Yesod/Form/Fields.hs
+++ b/yesod-form/Yesod/Form/Fields.hs
@@ -34,6 +34,7 @@ module Yesod.Form.Fields
) where
import Yesod.Form.Types
+import Yesod.Form.I18n.English
import Yesod.Widget
import Yesod.Message (RenderMessage (renderMessage), SomeMessage (..))
import Text.Hamlet
@@ -58,7 +59,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)
import Control.Monad.IO.Class (liftIO)
import Control.Applicative ((<$>))
@@ -80,44 +80,9 @@ import Yesod.Request (FileInfo)
#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 bc352c6d..b5910e4e 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/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/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 a1be141e..7d0e6ffc 100644
--- a/yesod-form/yesod-form.cabal
+++ b/yesod-form/yesod-form.cabal
@@ -42,6 +42,8 @@ library
Yesod.Form.Jquery
Yesod.Form.Nic
Yesod.Form.MassInput
+ Yesod.Form.I18n.English
+ Yesod.Form.I18n.Swedish
-- FIXME Yesod.Helpers.Crud
ghc-options: -Wall
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/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
diff --git a/yesod/yesod.cabal b/yesod/yesod.cabal
index be171174..94a340d4 100644
--- a/yesod/yesod.cabal
+++ b/yesod/yesod.cabal
@@ -1,5 +1,5 @@
name: yesod
-version: 0.9.1.1
+version: 0.9.2.1
license: BSD3
license-file: LICENSE
author: Michael Snoyman