From 20dfec4d88f728429dc2a3e5bdaebf01c3433f40 Mon Sep 17 00:00:00 2001 From: Paul Rouse Date: Fri, 8 Aug 2014 11:10:07 +0100 Subject: [PATCH 1/6] Revise previous fix (#799) to yesod devel timeout --- yesod-bin/Devel.hs | 2 +- yesod-bin/main.hs | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/yesod-bin/Devel.hs b/yesod-bin/Devel.hs index 67ec07ad..77f34286 100644 --- a/yesod-bin/Devel.hs +++ b/yesod-bin/Devel.hs @@ -388,7 +388,7 @@ watchForChanges filesModified hsSourceDirs extraFiles list t = do Map.differenceWith compareTimes newList list `Map.union` Map.differenceWith compareTimes list newList return (haskellFileChanged, newList) - else timeout (10000000*t) (takeMVar filesModified) >> + else timeout (1000000*t) (takeMVar filesModified) >> watchForChanges filesModified hsSourceDirs extraFiles list t where compareTimes x y diff --git a/yesod-bin/main.hs b/yesod-bin/main.hs index 2202fb54..ef1882d0 100755 --- a/yesod-bin/main.hs +++ b/yesod-bin/main.hs @@ -152,6 +152,9 @@ optParser = Options keterOptions :: Parser Command keterOptions = Keter <$> switch ( long "nobuild" <> short 'n' <> help "Skip rebuilding" ) +defaultRescan :: Int +defaultRescan = 10 + develOptions :: Parser Command develOptions = Devel <$> switch ( long "disable-api" <> short 'd' <> help "Disable fast GHC API rebuilding") @@ -159,8 +162,10 @@ develOptions = Devel <$> switch ( long "disable-api" <> short 'd' <> help "Run COMMAND after rebuild succeeds") <*> optStr ( long "failure-hook" <> short 'f' <> metavar "COMMAND" <> help "Run COMMAND when rebuild fails") - <*> option ( long "event-timeout" <> short 't' <> value 1 <> metavar "N" - <> help "Force rescan of files every N seconds" ) + <*> option ( long "event-timeout" <> short 't' <> value defaultRescan <> metavar "N" + <> help ("Force rescan of files every N seconds (default " + ++ show defaultRescan + ++ ", use -1 to rely on FSNotify alone)") ) <*> optStr ( long "builddir" <> short 'b' <> help "Set custom cabal build directory, default `dist'") <*> many ( strOption ( long "ignore" <> short 'i' <> metavar "DIR" From 00f8bcf59b6f410f2661161484a92bda97d95d69 Mon Sep 17 00:00:00 2001 From: Greg Weber Date: Mon, 11 Aug 2014 15:58:47 -0700 Subject: [PATCH 2/6] expose YesodExampleData --- yesod-test/Yesod/Test.hs | 3 ++- yesod-test/yesod-test.cabal | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/yesod-test/Yesod/Test.hs b/yesod-test/Yesod/Test.hs index d71ebd74..5b1bc3ee 100644 --- a/yesod-test/Yesod/Test.hs +++ b/yesod-test/Yesod/Test.hs @@ -29,6 +29,7 @@ module Yesod.Test , YesodSpec , yesodSpecWithSiteGenerator , YesodExample + , YesodExampleData(..) , YesodSpecTree (..) , ydescribe , yit @@ -125,7 +126,7 @@ import Data.Time.Clock (getCurrentTime) -- | The state used in a single test case defined using 'yit' -- --- Since 1.2.0 +-- Since 1.2.4 data YesodExampleData site = YesodExampleData { yedApp :: !Application , yedSite :: !site diff --git a/yesod-test/yesod-test.cabal b/yesod-test/yesod-test.cabal index 0c236b3f..8a322391 100644 --- a/yesod-test/yesod-test.cabal +++ b/yesod-test/yesod-test.cabal @@ -1,9 +1,9 @@ name: yesod-test -version: 1.2.3.2 +version: 1.2.4 license: MIT license-file: LICENSE author: Nubis -maintainer: Nubis , Michael Snoyman +maintainer: Michael Snoyman, Greg Weber, Nubis synopsis: integration testing for WAI/Yesod Applications category: Web, Yesod, Testing stability: Experimental From e74709433bb61a60f3043c300074f0bd1c27beb8 Mon Sep 17 00:00:00 2001 From: Greg Weber Date: Mon, 11 Aug 2014 16:23:41 -0700 Subject: [PATCH 3/6] add yesodSpecApp --- yesod-test/Yesod/Test.hs | 22 ++++++++++++++++++++++ yesod-test/yesod-test.cabal | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/yesod-test/Yesod/Test.hs b/yesod-test/Yesod/Test.hs index 5b1bc3ee..4d922d6f 100644 --- a/yesod-test/Yesod/Test.hs +++ b/yesod-test/Yesod/Test.hs @@ -28,6 +28,7 @@ module Yesod.Test yesodSpec , YesodSpec , yesodSpecWithSiteGenerator + , yesodSpecApp , YesodExample , YesodExampleData(..) , YesodSpecTree (..) @@ -235,6 +236,27 @@ yesodSpecWithSiteGenerator getSiteAction yspecs = , yedResponse = Nothing } +-- | Same as yesodSpec, but instead of taking a site it +-- takes an action which produces the 'Application' for each test. +-- This lets you use your middleware from makeApplication +yesodSpecApp :: YesodDispatch site + => site + -> IO Application + -> YesodSpec site + -> Hspec.Spec +yesodSpecApp site getApp yspecs = + Core.fromSpecList $ map unYesod $ execWriter yspecs + where + unYesod (YesodSpecGroup x y) = Core.SpecGroup x $ map unYesod y + unYesod (YesodSpecItem x y) = Core.it x $ do + app <- getApp + ST.evalStateT y YesodExampleData + { yedApp = app + , yedSite = site + , yedCookies = M.empty + , yedResponse = Nothing + } + -- | Describe a single test that keeps cookies, and a reference to the last response. yit :: String -> YesodExample site () -> YesodSpec site yit label example = tell [YesodSpecItem label example] diff --git a/yesod-test/yesod-test.cabal b/yesod-test/yesod-test.cabal index 8a322391..02400a24 100644 --- a/yesod-test/yesod-test.cabal +++ b/yesod-test/yesod-test.cabal @@ -1,5 +1,5 @@ name: yesod-test -version: 1.2.4 +version: 1.2.5 license: MIT license-file: LICENSE author: Nubis From c1f08eeb9f812c76aba0a6cbfffe9b51378d266a Mon Sep 17 00:00:00 2001 From: Christopher Reichert Date: Wed, 13 Aug 2014 21:19:14 -0500 Subject: [PATCH 4/6] Load keter config file with yml or yaml extension. Complimentary fix for snoyberg/keter#41 --- yesod-bin/Keter.hs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/yesod-bin/Keter.hs b/yesod-bin/Keter.hs index 1a7192a4..7837ab4f 100644 --- a/yesod-bin/Keter.hs +++ b/yesod-bin/Keter.hs @@ -27,16 +27,17 @@ keter :: String -- ^ cabal command -> Bool -- ^ no build? -> IO () keter cabal noBuild = do - mvalue <- decodeFile "config/keter.yaml" + ketercfg <- keterConfig + mvalue <- decodeFile ketercfg value <- case mvalue of Nothing -> error "No config/keter.yaml found" Just (Object value) -> case Map.lookup "host" value of Just (String s) | "<<" `T.isPrefixOf` s -> - error "Please set your hostname in config/keter.yaml" + error $ "Please set your hostname in " ++ ketercfg _ -> return value - Just _ -> error "config/keter.yaml is not an object" + Just _ -> error $ ketercfg ++ " is not an object" files <- getDirectoryContents "." project <- @@ -48,7 +49,7 @@ keter cabal noBuild = do exec <- case Map.lookup "exec" value of Just (String s) -> return $ F.collapse $ "config" F. F.fromText s - _ -> error "exec not found in config/keter.yaml" + _ -> error $ "exec not found in " ++ ketercfg unless noBuild $ do run cabal ["clean"] @@ -67,6 +68,12 @@ keter cabal noBuild = do Just i -> run "scp" ["-P" ++ show (i :: Int), fp, T.unpack s] Nothing -> run "scp" [fp, T.unpack s] _ -> return () + where + -- Test for alternative config file extension (yaml or yml). + keterConfig = do + let yml = "config/keter.yml" + ymlExists <- doesFileExist yml + return $ if ymlExists then yml else "config/keter.yaml" try' :: IO a -> IO (Either SomeException a) try' = try From c20cb20438aa4ea4bf5e637f622bbb4933460b49 Mon Sep 17 00:00:00 2001 From: Erik de Castro Lopo Date: Thu, 14 Aug 2014 18:15:49 +1000 Subject: [PATCH 5/6] yesod-bin/Devel.hs : Relax requirements on location of Application.hs. I often move Application.hs to MyApp/Application.hs (and change the module name as needed) which would result in yesod-bin printing a warning about a missing Application.hs. The code should now accept any file named Application.hs (either in the top level source directory or somewhere in the tree. --- yesod-bin/Devel.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yesod-bin/Devel.hs b/yesod-bin/Devel.hs index 77f34286..af4a6959 100644 --- a/yesod-bin/Devel.hs +++ b/yesod-bin/Devel.hs @@ -416,7 +416,7 @@ checkCabalFile gpd = case D.condLibrary gpd of unless (null unlisted) $ do putStrLn "WARNING: the following source files are not listed in exposed-modules or other-modules:" mapM_ putStrLn unlisted - when (D.fromString "Application" `notElem` D.exposedModules dLib) $ + when ("Application" `notElem` (map (last . D.components) $ D.exposedModules dLib)) $ putStrLn "WARNING: no exposed module Application" return (hsSourceDirs, dLib) From 1fe72e8351c79befaa8aa56c7d5be67048826c27 Mon Sep 17 00:00:00 2001 From: Kadzuya OKAMOTO Date: Fri, 15 Aug 2014 12:57:39 +0900 Subject: [PATCH 6/6] fixed Japanese message --- yesod-auth/Yesod/Auth/Message.hs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yesod-auth/Yesod/Auth/Message.hs b/yesod-auth/Yesod/Auth/Message.hs index b7297f68..c9cc05b0 100644 --- a/yesod-auth/Yesod/Auth/Message.hs +++ b/yesod-auth/Yesod/Auth/Message.hs @@ -397,15 +397,15 @@ japaneseMessage NowLoggedIn = "ログインしました" japaneseMessage LoginTitle = "ログイン" japaneseMessage PleaseProvideUsername = "ユーザ名を入力してください" japaneseMessage PleaseProvidePassword = "パスワードを入力してください" -japaneseMessage NoIdentifierProvided = "No email/username provided" -japaneseMessage InvalidEmailAddress = "Invalid email address provided" -japaneseMessage PasswordResetTitle = "Password Reset" -japaneseMessage ProvideIdentifier = "Email or Username" -japaneseMessage SendPasswordResetEmail = "Send password reset email" -japaneseMessage PasswordResetPrompt = "Enter your e-mail address or username below, and a password reset e-mail will be sent to you." -japaneseMessage InvalidUsernamePass = "Invalid username/password combination" +japaneseMessage NoIdentifierProvided = "メールアドレス/ユーザ名が入力されていません" +japaneseMessage InvalidEmailAddress = "メールアドレスが無効です" +japaneseMessage PasswordResetTitle = "パスワードの再設定" +japaneseMessage ProvideIdentifier = "メールアドレスまたはユーザ名" +japaneseMessage SendPasswordResetEmail = "パスワード再設定用メールの送信" +japaneseMessage PasswordResetPrompt = "以下にメールアドレスまたはユーザ名を入力してください。パスワードを再設定するためのメールが送信されます。" +japaneseMessage InvalidUsernamePass = "ユーザ名とパスワードの組み合わせが間違っています" japaneseMessage (IdentifierNotFound ident) = - "「" `mappend` ident `mappend` "」は正しくないログインので、または未入力の項目があります。" + ident `mappend` "は登録されていません" finnishMessage :: AuthMessage -> Text finnishMessage NoOpenID = "OpenID-tunnistetta ei löydy"