From 064b8da896700037da0bfa24720fb0d443b60b22 Mon Sep 17 00:00:00 2001 From: Greg Weber Date: Thu, 8 Sep 2011 22:41:08 -0700 Subject: [PATCH] get most examples compiling under 0.9 --- yesod-examples/.gitignore | 1 + yesod-examples/src/ajax.lhs | 8 +++--- yesod-examples/src/blog.lhs | 4 +-- yesod-examples/src/file-echo.lhs | 3 ++- yesod-examples/src/form.lhs | 13 ++++----- yesod-examples/src/generalized-hamlet.lhs | 16 +++++------ yesod-examples/src/i18n.lhs | 1 - yesod-examples/src/pretty-yaml.lhs | 5 ++-- yesod-examples/src/session.lhs | 24 ++++++++++------- yesod-examples/src/widgets.lhs | 33 ++++++++++++----------- yesod-examples/synopsis/persistent.lhs | 6 ++--- yesod-examples/yesod-examples.cabal | 18 ++++++++----- 12 files changed, 71 insertions(+), 61 deletions(-) diff --git a/yesod-examples/.gitignore b/yesod-examples/.gitignore index 47451091..1cd91990 100644 --- a/yesod-examples/.gitignore +++ b/yesod-examples/.gitignore @@ -1,2 +1,3 @@ client_session_key.aes dist +cabal-dev/ diff --git a/yesod-examples/src/ajax.lhs b/yesod-examples/src/ajax.lhs index 7bbfaec9..3618204f 100644 --- a/yesod-examples/src/ajax.lhs +++ b/yesod-examples/src/ajax.lhs @@ -4,8 +4,9 @@ > {-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-} > import Yesod -> import Yesod.Helpers.Static +> import Yesod.Static > import Data.Monoid (mempty) +> import Text.Blaze (string) Like the blog example, we'll define some data first. @@ -26,7 +27,6 @@ Like the blog example, we'll define some data first. > { ajaxPages :: [Page] > , ajaxStatic :: Static > } -> type Handler = GHandler Ajax Ajax Next we'll generate a function for each file in our static folder. This way, we get a compiler warning when trying to using a file which does not exist. @@ -34,7 +34,7 @@ Next we'll generate a function for each file in our static folder. This way, we Now the routes; we'll have a homepage, a pattern for the pages, and use a static subsite for the Javascript and CSS files. -> mkYesod "Ajax" [$parseRoutes| +> mkYesod "Ajax" [parseRoutes| > / HomeR GET > /page/#String PageR GET > /static StaticR Static ajaxStatic @@ -108,5 +108,5 @@ And now the cool part: a handler that returns either HTML or JSON data, dependin > main :: IO () > main = do > pages <- loadPages -> let s = static "static/yesod/ajax" +> s <- static "static/yesod/ajax" > warpDebug 3000 $ Ajax pages s diff --git a/yesod-examples/src/blog.lhs b/yesod-examples/src/blog.lhs index 16ba08b6..65fd2bdd 100644 --- a/yesod-examples/src/blog.lhs +++ b/yesod-examples/src/blog.lhs @@ -25,7 +25,6 @@ Since normally you'll need to perform an IO action to load up your entries from Each Yesod application needs to define the site argument. You can use this for storing anything that should be loaded before running your application. For example, you might store a database connection there. In our case, we'll store our list of entries. > data Blog = Blog { blogEntries :: [Entry] } -> type Handler = GHandler Blog Blog Now we use the first "magical" Yesod set of functions: mkYesod and parseRoutes. If you want to see *exactly* what they do, look at their Haddock docs. For now, we'll try to keep this tutorial simple: @@ -67,10 +66,9 @@ The Nav datatype will contain navigation information (ie, the URL and title) of And now the template itself: -> entryTemplate :: TemplateArgs -> Hamlet (Route Blog) +> entryTemplate :: TemplateArgs -> HtmlUrl (Route Blog) > entryTemplate args = [hamlet| > !!! -> > > > #{templateTitle args} diff --git a/yesod-examples/src/file-echo.lhs b/yesod-examples/src/file-echo.lhs index dfbb1299..fc490f83 100644 --- a/yesod-examples/src/file-echo.lhs +++ b/yesod-examples/src/file-echo.lhs @@ -4,10 +4,11 @@ > import Data.Monoid (mempty) > import qualified Data.ByteString.Char8 as S8 > import qualified Data.Text as T +> import Text.Blaze (string) > data Echo = Echo -> mkYesod "Echo" [$parseRoutes| +> mkYesod "Echo" [parseRoutes| > / Homepage GET POST > |] diff --git a/yesod-examples/src/form.lhs b/yesod-examples/src/form.lhs index a9d8d14d..57855e51 100644 --- a/yesod-examples/src/form.lhs +++ b/yesod-examples/src/form.lhs @@ -7,25 +7,26 @@ > import Data.Text (Text) > data FormExample = FormExample -> type Handler = GHandler FormExample FormExample -> mkYesod "FormExample" [$parseRoutes| +> mkYesod "FormExample" [parseRoutes| > / RootR GET > |] > instance Yesod FormExample where approot _ = "" +> instance RenderMessage FormExample FormMessage where +> renderMessage _ _ = defaultFormMessage Next, we'll declare a Person datatype with a name and age. After that, we'll create a formlet. A formlet is a declarative approach to forms. It takes a Maybe value and constructs either a blank form, a form based on the original value, or a form based on the values submitted by the user. It also attempts to construct a datatype, failing on validation errors. > data Person = Person { name :: Text, age :: Int } > deriving Show -> personFormlet p = fieldsToTable $ Person -> <$> stringField "Name" (fmap name p) -> <*> intField "Age" (fmap age p) +> personFormlet p = renderTable $ Person +> <$> areq textField "Name" (fmap name p) +> <*> areq intField "Age" (fmap age p) We use an applicative approach and stay mostly declarative. The "fmap name p" bit is just a way to get the name from within a value of type "Maybe Person". > getRootR :: Handler RepHtml > getRootR = do -> (res, wform, enctype) <- runFormGet $ personFormlet Nothing +> ((res, wform), enctype) <- runFormGet $ personFormlet Nothing <p>We use runFormGet to bind to GET (query-string) parameters; we could also use runFormPost. The "Nothing" is the initial value of the form. You could also supply a "Just Person" value if you like. There is a three-tuple returned, containing the parsed value, the HTML form as a widget and the encoding type for the form.</p> diff --git a/yesod-examples/src/generalized-hamlet.lhs b/yesod-examples/src/generalized-hamlet.lhs index d7a5f490..01d7dc78 100644 --- a/yesod-examples/src/generalized-hamlet.lhs +++ b/yesod-examples/src/generalized-hamlet.lhs @@ -4,7 +4,7 @@ Yesod has instances for: * Html -* Hamlet url (= (url -> [(String, String)] -> String) -> Html) +* HtmlUrl (= (url -> [(String, String)] -> String) -> Html) * GWidget s m () @@ -13,15 +13,15 @@ your own instances. > {-# LANGUAGE QuasiQuotes, TypeFamilies, MultiParamTypeClasses, OverloadedStrings, TemplateHaskell #-} > import Yesod +> import Text.Hamlet (shamlet) > data NewHamlet = NewHamlet > mkYesod "NewHamlet" [$parseRoutes|/ RootR GET|] > instance Yesod NewHamlet where approot _ = "" -> type Widget = GWidget NewHamlet NewHamlet > > myHtml :: Html -> myHtml = [$hamlet|<p>Just don't use any URLs in here!|] +> myHtml = [shamlet|<p>Just don't use any URLs in here!|] > -> myInnerWidget :: Widget () +> myInnerWidget :: Widget > myInnerWidget = do > addHamlet [$hamlet| > <div #inner>Inner widget @@ -31,14 +31,14 @@ your own instances. >#inner > color: red|] > -> myPlainTemplate :: Hamlet NewHamletRoute -> myPlainTemplate = [$hamlet| +> myPlainTemplate :: HtmlUrl NewHamletRoute +> myPlainTemplate = [hamlet| > <p > <a href=@{RootR}>Link to home > |] > -> myWidget :: Widget () -> myWidget = [$hamlet| +> myWidget :: Widget +> myWidget = [whamlet| > <h1>Embed another widget > \^{myInnerWidget} > <h1>Embed a Hamlet diff --git a/yesod-examples/src/i18n.lhs b/yesod-examples/src/i18n.lhs index 37db3042..abbe39a1 100644 --- a/yesod-examples/src/i18n.lhs +++ b/yesod-examples/src/i18n.lhs @@ -9,7 +9,6 @@ > import Data.Text (Text) > data I18N = I18N -> type Handler = GHandler I18N I18N > mkYesod "I18N" [$parseRoutes| > / HomepageR GET diff --git a/yesod-examples/src/pretty-yaml.lhs b/yesod-examples/src/pretty-yaml.lhs index 97f69682..c8d8bbcf 100644 --- a/yesod-examples/src/pretty-yaml.lhs +++ b/yesod-examples/src/pretty-yaml.lhs @@ -9,7 +9,6 @@ > import qualified Data.ByteString.Lazy as L > data PY = PY -> type Handler = GHandler PY PY > mkYesod "PY" [$parseRoutes| > / Homepage GET POST @@ -17,7 +16,7 @@ > instance Yesod PY where approot _ = "" -> template :: Maybe (Hamlet url) -> Hamlet url +> template :: Maybe (HtmlUrl url) -> HtmlUrl url > template myaml = [$hamlet| > !!! > @@ -46,7 +45,7 @@ > so <- liftIO $ decode $ B.concat $ L.toChunks $ fileContent fi > hamletToRepHtml $ template $ Just $ objToHamlet so -> objToHamlet :: StringObject -> Hamlet url +> objToHamlet :: StringObject -> HtmlUrl url > objToHamlet (Scalar s) = [$hamlet|#{s}|] > objToHamlet (Sequence list) = [$hamlet| > <ul diff --git a/yesod-examples/src/session.lhs b/yesod-examples/src/session.lhs index 9977bd04..0de63ed5 100644 --- a/yesod-examples/src/session.lhs +++ b/yesod-examples/src/session.lhs @@ -3,10 +3,17 @@ > import Control.Applicative ((<$>), (<*>)) > > data Session = Session -> type Handler = GHandler Session Session -> mkYesod "Session" [$parseRoutes| +> mkYesod "Session" [parseRoutes| > / Root GET POST > |] +> +> instance Yesod Session where +> approot _ = "" +> clientSessionDuration _ = 1 +> +> instance RenderMessage Session FormMessage where +> renderMessage _ _ = defaultFormMessage +> > getRoot :: Handler RepHtml > getRoot = do > sess <- getSession @@ -20,12 +27,9 @@ > > postRoot :: Handler () > postRoot = do -> (key, val) <- runFormPost' $ (,) <$> stringInput "key" <*> stringInput "val" -> setSession key val -> liftIO $ print (key, val) -> redirect RedirectTemporary Root -> -> instance Yesod Session where -> approot _ = "" -> clientSessionDuration _ = 1 +> (key, val) <- runInputPost $ (,) <$> ireq textField "key" <*> ireq textField "val" +> setSession key val +> liftIO $ print (key, val) +> redirect RedirectTemporary Root +> > main = warpDebug 3000 Session diff --git a/yesod-examples/src/widgets.lhs b/yesod-examples/src/widgets.lhs index cfa2b449..afa28ca0 100644 --- a/yesod-examples/src/widgets.lhs +++ b/yesod-examples/src/widgets.lhs @@ -1,13 +1,13 @@ > {-# LANGUAGE TypeFamilies, QuasiQuotes, OverloadedStrings, MultiParamTypeClasses, TemplateHaskell #-} > import Yesod -> import Yesod.Helpers.Static +> import Yesod.Static > import Yesod.Form.Jquery > import Yesod.Form.Nic > import Control.Applicative > import Data.Text (unpack) +> import Text.Blaze (string) > > data HW = HW { hwStatic :: Static } -> type Handler = GHandler HW HW > mkYesod "HW" [$parseRoutes| > / RootR GET > /form FormR @@ -17,10 +17,13 @@ > instance Yesod HW where approot _ = "" > instance YesodJquery HW > instance YesodNic HW -> wrapper h = [$hamlet| +> wrapper h = [hamlet| > <#wrapper>^{h} > <footer>Brought to you by Yesod Widgets™ > |] +> instance RenderMessage HW FormMessage where +> renderMessage _ _ = defaultFormMessage +> > getRootR = defaultLayout $ wrapper $ do > i <- lift newIdent > setTitle $ string "Hello Widgets" @@ -42,17 +45,17 @@ > addHtmlHead [$hamlet|<meta keywords=haskell|] > > handleFormR = do -> (res, form, enctype, nonce) <- runFormPost $ fieldsToTable $ (,,,,,,,,) -> <$> stringField "My Field" Nothing -> <*> stringField "Another field" (Just "some default text") -> <*> intField "A number field" (Just 5) -> <*> jqueryDayField def "A day field" Nothing -> <*> timeField "A time field" Nothing -> <*> boolField "A checkbox" (Just False) -> <*> jqueryAutocompleteField AutoCompleteR "Autocomplete" Nothing -> <*> nicHtmlField "HTML" +> (res, form, enctype, nonce) <- runFormPost $ renderTable $ (,,,,,,,,) +> <$> aopt textField "My Field" Nothing +> <*> aopt textField "Another field" (Just "some default text") +> <*> aopt intField "A number field" (Just 5) +> <*> aopt jqueryDayField "A day field" Nothing +> <*> aopt timeField "A time field" Nothing +> <*> aopt boolField "A checkbox" (Just False) +> <*> aopt jqueryAutocompleteField AutoCompleteR "Autocomplete" Nothing +> <*> aopt nicHtmlField "HTML" > (Just $ string "You can put <rich text> here") -> <*> maybeEmailField "An e-mail addres" Nothing +> <*> aopt emailField "An e-mail addres" Nothing > let mhtml = case res of > FormSuccess (_, _, _, _, _, _, _, x, _) -> Just x > _ -> Nothing @@ -77,11 +80,11 @@ > |] > setTitle $ string "Form" > -> main = warpDebug 3000 $ HW $ static "static" +> main = static "static" >>= (warpDebug 3000 . HW) > > getAutoCompleteR :: Handler RepJson > getAutoCompleteR = do -> term <- runFormGet' $ stringInput "term" +> term <- runInputGet $ ireq textField "term" > jsonToRepJson $ jsonList > [ jsonScalar $ unpack term ++ "foo" > , jsonScalar $ unpack term ++ "bar" diff --git a/yesod-examples/synopsis/persistent.lhs b/yesod-examples/synopsis/persistent.lhs index 8d99ff9b..1737a81b 100644 --- a/yesod-examples/synopsis/persistent.lhs +++ b/yesod-examples/synopsis/persistent.lhs @@ -1,12 +1,12 @@ This example uses the sqlite backend for Persistent, since it can run in-memory and has no external dependencies. -> {-# LANGUAGE TypeFamilies, GeneralizedNewtypeDeriving, QuasiQuotes, TemplateHaskell, OverloadedStrings #-} +> {-# LANGUAGE GADTs, TypeFamilies, GeneralizedNewtypeDeriving, QuasiQuotes, TemplateHaskell, OverloadedStrings #-} > > import Database.Persist.Sqlite > import Database.Persist.TH > import Control.Monad.IO.Class (liftIO) > -> mkPersist [$persist|Person +> mkPersist sqlSettings [persist|Person > name String Eq > age Int Update > |] @@ -21,7 +21,7 @@ This example uses the sqlite backend for Persistent, since it can run in-memory > liftIO $ print key > p1 <- get key > liftIO $ print p1 -> update key [PersonAge 26] +> update key [PersonAge =. 26] > p2 <- get key > liftIO $ print p2 > p3 <- selectList [PersonName ==. "Michael"] [] diff --git a/yesod-examples/yesod-examples.cabal b/yesod-examples/yesod-examples.cabal index 92eaa642..2aa11620 100644 --- a/yesod-examples/yesod-examples.cabal +++ b/yesod-examples/yesod-examples.cabal @@ -18,21 +18,25 @@ extra-source-files: static/yesod/ajax/script.js, Executable yesod-blog Main-is: src/blog.lhs Build-depends: base >= 4 && < 5, - yesod >= 0.8 && < 0.9 + yesod >= 0.9 Executable yesod-ajax Main-is: src/ajax.lhs - Build-depends: yesod-static + Build-depends: yesod-static, + blaze-html, + yesod >= 0.9 Executable yesod-file-echo Main-is: src/file-echo.lhs - Build-depends: text + Build-depends: text, + yesod >= 0.9 Executable yesod-pretty-yaml Main-is: src/pretty-yaml.lhs Build-depends: data-object-yaml >= 0.3.0 && < 0.4, data-object >= 0.3.1 && < 0.4, - bytestring >= 0.9 && < 0.10 + bytestring >= 0.9 && < 0.10, + yesod >= 0.9 Executable yesod-i18n Main-is: src/i18n.lhs @@ -40,9 +44,9 @@ Executable yesod-i18n Executable yesod-session Main-is: src/session.lhs -Executable yesod-widgets - Main-is: src/widgets.lhs - Build-depends: yesod-form +-- Executable yesod-widgets +-- Main-is: src/widgets.lhs +-- Build-depends: yesod-form Executable yesod-generalized-hamlet Main-is: src/generalized-hamlet.lhs