yesod-core 1.6.20 → 1.6.20.1
raw patch · 5 files changed
+72/−5 lines, 5 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Yesod.Core: breadcrumbs :: YesodBreadcrumbs site => HandlerFor site (Text, [(Route site, Text)])
+ Yesod.Core: breadcrumbs :: (YesodBreadcrumbs site, Show (Route site), Eq (Route site)) => HandlerFor site (Text, [(Route site, Text)])
Files
- ChangeLog.md +4/−0
- src/Yesod/Core/Class/Breadcrumbs.hs +7/−4
- test/YesodCoreTest.hs +2/−0
- test/YesodCoreTest/Breadcrumb.hs +58/−0
- yesod-core.cabal +1/−1
ChangeLog.md view
@@ -1,5 +1,9 @@ # ChangeLog for yesod-core +## 1.6.20.1++* Throw an error in `breadcrumbs` if the trail of breadcrumbs is circular. [#1727](https://github.com/yesodweb/yesod/issues/1727)+ ## 1.6.20 * Generate CSRF tokens using a secure entropy source [#1726](https://github.com/yesodweb/yesod/pull/1726)
src/Yesod/Core/Class/Breadcrumbs.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE FlexibleContexts #-} module Yesod.Core.Class.Breadcrumbs where import Yesod.Core.Handler@@ -15,7 +16,7 @@ -- | Gets the title of the current page and the hierarchy of parent pages, -- along with their respective titles.-breadcrumbs :: YesodBreadcrumbs site => HandlerFor site (Text, [(Route site, Text)])+breadcrumbs :: (YesodBreadcrumbs site, Show (Route site), Eq (Route site)) => HandlerFor site (Text, [(Route site, Text)]) breadcrumbs = do x <- getCurrentRoute case x of@@ -26,6 +27,8 @@ return (title, z) where go back Nothing = return back- go back (Just this) = do- (title, next) <- breadcrumb this- go ((this, title) : back) next+ go back (Just this)+ | this `elem` map fst back = error $ "yesod-core: infinite recursion in breadcrumbs at " ++ show this+ | otherwise = do+ (title, next) <- breadcrumb this+ go ((this, title) : back) next
test/YesodCoreTest.hs view
@@ -12,6 +12,7 @@ import YesodCoreTest.ErrorHandling import YesodCoreTest.Cache import YesodCoreTest.ParameterizedSite+import YesodCoreTest.Breadcrumb import qualified YesodCoreTest.WaiSubsite as WaiSubsite import qualified YesodCoreTest.Redirect as Redirect import qualified YesodCoreTest.JsLoader as JsLoader@@ -61,3 +62,4 @@ Ssl.sslOnlySpec Ssl.sameSiteSpec Csrf.csrfSpec+ breadcrumbTest
+ test/YesodCoreTest/Breadcrumb.hs view
@@ -0,0 +1,58 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++module YesodCoreTest.Breadcrumb+ ( breadcrumbTest,+ )+where++import qualified Data.ByteString.Lazy.Char8 as L8+import Data.Text (Text)+import Data.Typeable (Typeable)+import Network.Wai+import Network.Wai.Test+import Test.Hspec+import UnliftIO.IORef+import Yesod.Core++data A = A++mkYesod+ "A"+ [parseRoutes|+/ RootR GET+/loop LoopR GET+|]++instance Yesod A++instance YesodBreadcrumbs A where+ breadcrumb r = case r of+ RootR -> pure ("Root", Nothing)+ LoopR -> pure ("Loop", Just LoopR) -- Purposefully a loop++getRootR :: Handler Text+getRootR = fst <$> breadcrumbs++getLoopR :: Handler Text+getLoopR = fst <$> breadcrumbs++breadcrumbTest :: Spec+breadcrumbTest =+ describe "Test.Breadcrumb" $ do+ it "can fetch the root which contains breadcrumbs" $+ runner $ do+ res <- request defaultRequest+ assertStatus 200 res+ it "gets a 500 for a route with a looping breadcrumb" $+ runner $ do+ res <- request defaultRequest {pathInfo = ["loop"]}+ assertStatus 500 res++runner :: Session () -> IO ()+runner f = toWaiApp A >>= runSession f
yesod-core.cabal view
@@ -1,5 +1,5 @@ name: yesod-core-version: 1.6.20+version: 1.6.20.1 license: MIT license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>