hw-polysemy 0.2.2.0 → 0.2.3.0
raw patch · 5 files changed
+111/−1 lines, 5 filesdep +temporaryPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: temporary
API changes (from Hackage documentation)
+ HaskellWorks.Polysemy.Hedgehog.Workspace: moduleWorkspace :: () => Member Hedgehog r => Member Log r => Member (Embed IO) r => Member (Error IOException) r => String -> (FilePath -> Sem r ()) -> Sem r ()
+ HaskellWorks.Polysemy.Hedgehog.Workspace: workspace :: () => Member Hedgehog r => Member Log r => Member (Embed IO) r => Member (Error IOException) r => HasCallStack => FilePath -> (FilePath -> Sem r ()) -> Sem r ()
- HaskellWorks.Polysemy.Hedgehog: eval :: forall r_amDd a_amqx. (Member Hedgehog r_amDd, HasCallStack) => a_amqx -> Sem r_amDd a_amqx
+ HaskellWorks.Polysemy.Hedgehog: eval :: forall r_amDs a_amqM. (Member Hedgehog r_amDs, HasCallStack) => a_amqM -> Sem r_amDs a_amqM
- HaskellWorks.Polysemy.Hedgehog: evalIO :: forall r_amDh a_amqB. (Member Hedgehog r_amDh, HasCallStack) => IO a_amqB -> Sem r_amDh a_amqB
+ HaskellWorks.Polysemy.Hedgehog: evalIO :: forall r_amDw a_amqQ. (Member Hedgehog r_amDw, HasCallStack) => IO a_amqQ -> Sem r_amDw a_amqQ
- HaskellWorks.Polysemy.Hedgehog: evalM :: forall r_amDf a_amqA. (Member Hedgehog r_amDf, HasCallStack) => Sem r_amDf a_amqA -> Sem r_amDf a_amqA
+ HaskellWorks.Polysemy.Hedgehog: evalM :: forall r_amDu a_amqP. (Member Hedgehog r_amDu, HasCallStack) => Sem r_amDu a_amqP -> Sem r_amDu a_amqP
- HaskellWorks.Polysemy.Hedgehog.Assert: evalIO :: forall r_amDh a_amqB. (Member Hedgehog r_amDh, HasCallStack) => IO a_amqB -> Sem r_amDh a_amqB
+ HaskellWorks.Polysemy.Hedgehog.Assert: evalIO :: forall r_amDw a_amqQ. (Member Hedgehog r_amDw, HasCallStack) => IO a_amqQ -> Sem r_amDw a_amqQ
- HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: assertEquals :: forall r_amDa a_X0. (Member Hedgehog r_amDa, HasCallStack, Eq a_X0, Show a_X0) => a_X0 -> a_X0 -> Sem r_amDa ()
+ HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: assertEquals :: forall r_amDp a_X0. (Member Hedgehog r_amDp, HasCallStack, Eq a_X0, Show a_X0) => a_X0 -> a_X0 -> Sem r_amDp ()
- HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: eval :: forall r_amDd a_amqx. (Member Hedgehog r_amDd, HasCallStack) => a_amqx -> Sem r_amDd a_amqx
+ HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: eval :: forall r_amDs a_amqM. (Member Hedgehog r_amDs, HasCallStack) => a_amqM -> Sem r_amDs a_amqM
- HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: evalIO :: forall r_amDh a_amqB. (Member Hedgehog r_amDh, HasCallStack) => IO a_amqB -> Sem r_amDh a_amqB
+ HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: evalIO :: forall r_amDw a_amqQ. (Member Hedgehog r_amDw, HasCallStack) => IO a_amqQ -> Sem r_amDw a_amqQ
- HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: evalM :: forall r_amDf a_amqA. (Member Hedgehog r_amDf, HasCallStack) => Sem r_amDf a_amqA -> Sem r_amDf a_amqA
+ HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: evalM :: forall r_amDu a_amqP. (Member Hedgehog r_amDu, HasCallStack) => Sem r_amDu a_amqP -> Sem r_amDu a_amqP
- HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: failWith :: forall r_amDl a_amqF. (Member Hedgehog r_amDl, HasCallStack) => Maybe Diff -> String -> Sem r_amDl a_amqF
+ HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: failWith :: forall r_amDA a_amqU. (Member Hedgehog r_amDA, HasCallStack) => Maybe Diff -> String -> Sem r_amDA a_amqU
- HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: failWithCustom :: forall r_amDo a_amqH. Member Hedgehog r_amDo => CallStack -> Maybe Diff -> String -> Sem r_amDo a_amqH
+ HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: failWithCustom :: forall r_amDD a_amqW. Member Hedgehog r_amDD => CallStack -> Maybe Diff -> String -> Sem r_amDD a_amqW
- HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: writeLog :: forall r_amDj. Member Hedgehog r_amDj => Log -> Sem r_amDj ()
+ HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog: writeLog :: forall r_amDy. Member Hedgehog r_amDy => Log -> Sem r_amDy ()
- HaskellWorks.Polysemy.Hedgehog.Eval: eval :: forall r_amDd a_amqx. (Member Hedgehog r_amDd, HasCallStack) => a_amqx -> Sem r_amDd a_amqx
+ HaskellWorks.Polysemy.Hedgehog.Eval: eval :: forall r_amDs a_amqM. (Member Hedgehog r_amDs, HasCallStack) => a_amqM -> Sem r_amDs a_amqM
- HaskellWorks.Polysemy.Hedgehog.Eval: evalIO :: forall r_amDh a_amqB. (Member Hedgehog r_amDh, HasCallStack) => IO a_amqB -> Sem r_amDh a_amqB
+ HaskellWorks.Polysemy.Hedgehog.Eval: evalIO :: forall r_amDw a_amqQ. (Member Hedgehog r_amDw, HasCallStack) => IO a_amqQ -> Sem r_amDw a_amqQ
- HaskellWorks.Polysemy.Hedgehog.Eval: evalM :: forall r_amDf a_amqA. (Member Hedgehog r_amDf, HasCallStack) => Sem r_amDf a_amqA -> Sem r_amDf a_amqA
+ HaskellWorks.Polysemy.Hedgehog.Eval: evalM :: forall r_amDu a_amqP. (Member Hedgehog r_amDu, HasCallStack) => Sem r_amDu a_amqP -> Sem r_amDu a_amqP
Files
- core/HaskellWorks/Polysemy/Prelude.hs +2/−0
- core/HaskellWorks/Polysemy/Stack.hs +11/−0
- core/HaskellWorks/Polysemy/System/IO/Temp.hs +26/−0
- hedgehog/HaskellWorks/Polysemy/Hedgehog/Workspace.hs +65/−0
- hw-polysemy.cabal +7/−1
core/HaskellWorks/Polysemy/Prelude.hs view
@@ -63,6 +63,8 @@ , ($!) , ($) , (&)+ , (&&)+ , (||) , (.) , (</>)
+ core/HaskellWorks/Polysemy/Stack.hs view
@@ -0,0 +1,11 @@+module HaskellWorks.Polysemy.Stack+ ( callerModuleName+ ) where++import GHC.Stack (callStack, getCallStack,+ srcLocModule)+import HaskellWorks.Polysemy.Prelude++-- | Get the module name of the caller.+callerModuleName :: HasCallStack => String+callerModuleName = maybe "<no-module>" (srcLocModule . snd) (listToMaybe (getCallStack callStack))
+ core/HaskellWorks/Polysemy/System/IO/Temp.hs view
@@ -0,0 +1,26 @@+module HaskellWorks.Polysemy.System.IO.Temp+ ( createTempDirectory,+ getCanonicalTemporaryDirectory,+ ) where++import HaskellWorks.Polysemy.Prelude+import Polysemy+import qualified System.IO.Temp as IO++createTempDirectory :: ()+ => HasCallStack+ => Member (Embed IO) r+ => FilePath+ -> String+ -> Sem r FilePath+createTempDirectory fp template = withFrozenCallStack $ do+ embed $ IO.createTempDirectory fp template+{-# INLINE createTempDirectory #-}++getCanonicalTemporaryDirectory :: ()+ => HasCallStack+ => Member (Embed IO) r+ => Sem r FilePath+getCanonicalTemporaryDirectory = withFrozenCallStack $ do+ embed IO.getCanonicalTemporaryDirectory+{-# INLINE getCanonicalTemporaryDirectory #-}
+ hedgehog/HaskellWorks/Polysemy/Hedgehog/Workspace.hs view
@@ -0,0 +1,65 @@+module HaskellWorks.Polysemy.Hedgehog.Workspace+ ( workspace+ , moduleWorkspace+ ) where++import HaskellWorks.Polysemy.Hedgehog+import HaskellWorks.Polysemy.Prelude+import HaskellWorks.Polysemy.Stack+import HaskellWorks.Polysemy.System.Directory+import HaskellWorks.Polysemy.System.Environment+import HaskellWorks.Polysemy.System.IO.Temp+import Polysemy+import Polysemy.Error+import Polysemy.Log+import System.Info++import qualified HaskellWorks.Polysemy.System.IO as PIO++-- | Create a workspace directory which will exist for at least the duration of+-- the supplied block.+--+-- The directory will have the supplied prefix but contain a generated random+-- suffix to prevent interference between tests+--+-- The directory will be deleted if the block succeeds, but left behind if+-- the block fails.+workspace :: ()+ => Member Hedgehog r+ => Member Log r+ => Member (Embed IO) r+ => Member (Error IOException) r+ => HasCallStack+ => FilePath+ -> (FilePath -> Sem r ())+ -> Sem r ()+workspace prefixPath f = withFrozenCallStack $ do+ systemTemp <- getCanonicalTemporaryDirectory+ maybeKeepWorkspace <- lookupEnv "KEEP_WORKSPACE"+ ws <- createTempDirectory systemTemp $ prefixPath <> "-test"+ jot_ $ "Workspace: " <> ws+ PIO.writeFile (ws </> "module") callerModuleName+ f ws+ when (os /= "mingw32" && maybeKeepWorkspace /= Just "1") $ do+ removePathForcibly ws++-- | Create a workspace directory which will exist for at least the duration of+-- the supplied block.+--+-- The directory will have the prefix as "$prefixPath/$moduleName" but contain a generated random+-- suffix to prevent interference between tests+--+-- The directory will be deleted if the block succeeds, but left behind if+-- the block fails.+--+-- The 'prefix' argument should not contain directory delimeters.+moduleWorkspace :: ()+ => Member Hedgehog r+ => Member Log r+ => Member (Embed IO) r+ => Member (Error IOException) r+ => String+ -> (FilePath -> Sem r ())+ -> Sem r ()+moduleWorkspace prefix f = withFrozenCallStack $+ workspace (prefix <> "-" <> callerModuleName) f
hw-polysemy.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.4 name: hw-polysemy-version: 0.2.2.0+version: 0.2.3.0 synopsis: Opinionated polysemy library description: Opinionated polysemy library. license: Apache-2.0@@ -40,6 +40,7 @@ common stm { build-depends: stm < 2.6 } common tasty { build-depends: tasty < 1.6 } common tasty-hedgehog { build-depends: tasty-hedgehog < 1.5 }+common temporary { build-depends: temporary < 1.4 } common text { build-depends: text < 3 } common time { build-depends: time < 2 } common unliftio { build-depends: unliftio < 0.3 }@@ -83,6 +84,7 @@ resourcet, stm, text,+ temporary, time, unliftio, yaml,@@ -116,10 +118,12 @@ HaskellWorks.Polysemy.FilePath HaskellWorks.Polysemy.OS HaskellWorks.Polysemy.Prelude+ HaskellWorks.Polysemy.Stack HaskellWorks.Polysemy.String HaskellWorks.Polysemy.System.Directory HaskellWorks.Polysemy.System.Environment HaskellWorks.Polysemy.System.IO+ HaskellWorks.Polysemy.System.IO.Temp HaskellWorks.Polysemy.System.Process hs-source-dirs: core default-language: GHC2021@@ -154,6 +158,7 @@ HaskellWorks.Polysemy.Hedgehog.Process HaskellWorks.Polysemy.Hedgehog.Process.Internal HaskellWorks.Polysemy.Hedgehog.Property+ HaskellWorks.Polysemy.Hedgehog.Workspace hs-source-dirs: hedgehog default-language: GHC2021 @@ -193,6 +198,7 @@ HaskellWorks.Polysemy.Hedgehog.Process, HaskellWorks.Polysemy.Hedgehog.Process.Internal, HaskellWorks.Polysemy.Hedgehog.Property,+ HaskellWorks.Polysemy.Hedgehog.Workspace, HaskellWorks.Polysemy.Prelude, HaskellWorks.Polysemy.String, HaskellWorks.Polysemy.System.Directory,