packages feed

hspec-api 2.10.0 → 2.11.0

raw patch · 10 files changed

+503/−62 lines, 10 filesdep +transformersdep ~hspec-corePVP ok

version bump matches the API change (PVP)

Dependencies added: transformers

Dependency ranges changed: hspec-core

API changes (from Hackage documentation)

+ Test.Hspec.Api.Format.V1: instance GHC.Show.Show Test.Hspec.Api.Format.V1.Event
+ Test.Hspec.Api.Format.V2: ColorizedReason :: String -> FailureReason
+ Test.Hspec.Api.Format.V2: Done :: [(Path, Item)] -> Event
+ Test.Hspec.Api.Format.V2: Error :: Maybe String -> SomeException -> FailureReason
+ Test.Hspec.Api.Format.V2: ExpectedButGot :: Maybe String -> String -> String -> FailureReason
+ Test.Hspec.Api.Format.V2: Failure :: Maybe Location -> FailureReason -> Result
+ Test.Hspec.Api.Format.V2: FormatConfig :: Bool -> Bool -> Bool -> Bool -> Maybe Int -> Maybe (String -> String -> IO ()) -> Maybe (String -> String -> (String, String)) -> Bool -> Bool -> Bool -> Integer -> Int -> FormatConfig
+ Test.Hspec.Api.Format.V2: GroupDone :: Path -> Event
+ Test.Hspec.Api.Format.V2: GroupStarted :: Path -> Event
+ Test.Hspec.Api.Format.V2: Item :: Maybe Location -> Seconds -> String -> Result -> Item
+ Test.Hspec.Api.Format.V2: ItemDone :: Path -> Item -> Event
+ Test.Hspec.Api.Format.V2: ItemStarted :: Path -> Event
+ Test.Hspec.Api.Format.V2: Location :: FilePath -> Int -> Int -> Location
+ Test.Hspec.Api.Format.V2: NoReason :: FailureReason
+ Test.Hspec.Api.Format.V2: Pending :: Maybe Location -> Maybe String -> Result
+ Test.Hspec.Api.Format.V2: Progress :: Path -> Progress -> Event
+ Test.Hspec.Api.Format.V2: Reason :: String -> FailureReason
+ Test.Hspec.Api.Format.V2: Seconds :: Double -> Seconds
+ Test.Hspec.Api.Format.V2: Started :: Event
+ Test.Hspec.Api.Format.V2: Success :: Result
+ Test.Hspec.Api.Format.V2: [formatConfigDiffContext] :: FormatConfig -> Maybe Int
+ Test.Hspec.Api.Format.V2: [formatConfigExpectedTotalCount] :: FormatConfig -> Int
+ Test.Hspec.Api.Format.V2: [formatConfigExternalDiff] :: FormatConfig -> Maybe (String -> String -> IO ())
+ Test.Hspec.Api.Format.V2: [formatConfigHtmlOutput] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigOutputUnicode] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigPrettyPrintFunction] :: FormatConfig -> Maybe (String -> String -> (String, String))
+ Test.Hspec.Api.Format.V2: [formatConfigPrintCpuTime] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigPrintTimes] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigReportProgress] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigUseColor] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigUseDiff] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigUsedSeed] :: FormatConfig -> Integer
+ Test.Hspec.Api.Format.V2: [itemDuration] :: Item -> Seconds
+ Test.Hspec.Api.Format.V2: [itemInfo] :: Item -> String
+ Test.Hspec.Api.Format.V2: [itemLocation] :: Item -> Maybe Location
+ Test.Hspec.Api.Format.V2: [itemResult] :: Item -> Result
+ Test.Hspec.Api.Format.V2: [locationColumn] :: Location -> Int
+ Test.Hspec.Api.Format.V2: [locationFile] :: Location -> FilePath
+ Test.Hspec.Api.Format.V2: [locationLine] :: Location -> Int
+ Test.Hspec.Api.Format.V2: data Config
+ Test.Hspec.Api.Format.V2: data Event
+ Test.Hspec.Api.Format.V2: data FailureReason
+ Test.Hspec.Api.Format.V2: data FormatConfig
+ Test.Hspec.Api.Format.V2: data Item
+ Test.Hspec.Api.Format.V2: data Location
+ Test.Hspec.Api.Format.V2: data Result
+ Test.Hspec.Api.Format.V2: liftFormatter :: (String, FormatConfig -> IO Format) -> (String, FormatConfig -> IO Format)
+ Test.Hspec.Api.Format.V2: modifyConfig :: (Config -> Config) -> SpecWith a
+ Test.Hspec.Api.Format.V2: monadic :: MonadIO m => (m () -> IO ()) -> (Event -> m ()) -> IO Format
+ Test.Hspec.Api.Format.V2: newtype Seconds
+ Test.Hspec.Api.Format.V2: registerFormatter :: (String, FormatConfig -> IO Format) -> Config -> Config
+ Test.Hspec.Api.Format.V2: type Format = Event -> IO ()
+ Test.Hspec.Api.Format.V2: type Path = ([String], String)
+ Test.Hspec.Api.Format.V2: type Progress = (Int, Int)
+ Test.Hspec.Api.Format.V2: type SpecWith a = SpecM a ()
+ Test.Hspec.Api.Format.V2: useFormatter :: (String, FormatConfig -> IO Format) -> Config -> Config
+ Test.Hspec.Api.Formatters.V3: ColorizedReason :: String -> FailureReason
+ Test.Hspec.Api.Formatters.V3: Error :: Maybe String -> SomeException -> FailureReason
+ Test.Hspec.Api.Formatters.V3: ExpectedButGot :: Maybe String -> String -> String -> FailureReason
+ Test.Hspec.Api.Formatters.V3: Failure :: Maybe Location -> FailureReason -> Result
+ Test.Hspec.Api.Formatters.V3: FailureRecord :: Maybe Location -> Path -> FailureReason -> FailureRecord
+ Test.Hspec.Api.Formatters.V3: Formatter :: FormatM () -> (Path -> FormatM ()) -> (Path -> FormatM ()) -> (Path -> Progress -> FormatM ()) -> (Path -> FormatM ()) -> (Path -> Item -> FormatM ()) -> FormatM () -> Formatter
+ Test.Hspec.Api.Formatters.V3: Item :: Maybe Location -> Seconds -> String -> Result -> Item
+ Test.Hspec.Api.Formatters.V3: Location :: FilePath -> Int -> Int -> Location
+ Test.Hspec.Api.Formatters.V3: NoReason :: FailureReason
+ Test.Hspec.Api.Formatters.V3: Pending :: Maybe Location -> Maybe String -> Result
+ Test.Hspec.Api.Formatters.V3: Reason :: String -> FailureReason
+ Test.Hspec.Api.Formatters.V3: Seconds :: Double -> Seconds
+ Test.Hspec.Api.Formatters.V3: Success :: Result
+ Test.Hspec.Api.Formatters.V3: [failureRecordLocation] :: FailureRecord -> Maybe Location
+ Test.Hspec.Api.Formatters.V3: [failureRecordMessage] :: FailureRecord -> FailureReason
+ Test.Hspec.Api.Formatters.V3: [failureRecordPath] :: FailureRecord -> Path
+ Test.Hspec.Api.Formatters.V3: [formatterDone] :: Formatter -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [formatterGroupDone] :: Formatter -> Path -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [formatterGroupStarted] :: Formatter -> Path -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [formatterItemDone] :: Formatter -> Path -> Item -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [formatterItemStarted] :: Formatter -> Path -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [formatterProgress] :: Formatter -> Path -> Progress -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [formatterStarted] :: Formatter -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [itemDuration] :: Item -> Seconds
+ Test.Hspec.Api.Formatters.V3: [itemInfo] :: Item -> String
+ Test.Hspec.Api.Formatters.V3: [itemLocation] :: Item -> Maybe Location
+ Test.Hspec.Api.Formatters.V3: [itemResult] :: Item -> Result
+ Test.Hspec.Api.Formatters.V3: [locationColumn] :: Location -> Int
+ Test.Hspec.Api.Formatters.V3: [locationFile] :: Location -> FilePath
+ Test.Hspec.Api.Formatters.V3: [locationLine] :: Location -> Int
+ Test.Hspec.Api.Formatters.V3: checks :: Formatter
+ Test.Hspec.Api.Formatters.V3: data Config
+ Test.Hspec.Api.Formatters.V3: data FailureReason
+ Test.Hspec.Api.Formatters.V3: data FailureRecord
+ Test.Hspec.Api.Formatters.V3: data FormatM a
+ Test.Hspec.Api.Formatters.V3: data Formatter
+ Test.Hspec.Api.Formatters.V3: data Item
+ Test.Hspec.Api.Formatters.V3: data Location
+ Test.Hspec.Api.Formatters.V3: data Result
+ Test.Hspec.Api.Formatters.V3: diffContext :: FormatM (Maybe Int)
+ Test.Hspec.Api.Formatters.V3: externalDiffAction :: FormatM (Maybe (String -> String -> IO ()))
+ Test.Hspec.Api.Formatters.V3: extraChunk :: String -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: failed_examples :: Formatter
+ Test.Hspec.Api.Formatters.V3: formatException :: SomeException -> String
+ Test.Hspec.Api.Formatters.V3: formatLocation :: Location -> String
+ Test.Hspec.Api.Formatters.V3: formatterToFormat :: Formatter -> FormatConfig -> IO Format
+ Test.Hspec.Api.Formatters.V3: getCPUTime :: FormatM (Maybe Seconds)
+ Test.Hspec.Api.Formatters.V3: getExpectedTotalCount :: FormatM Int
+ Test.Hspec.Api.Formatters.V3: getFailCount :: FormatM Int
+ Test.Hspec.Api.Formatters.V3: getFailMessages :: FormatM [FailureRecord]
+ Test.Hspec.Api.Formatters.V3: getPendingCount :: FormatM Int
+ Test.Hspec.Api.Formatters.V3: getRealTime :: FormatM Seconds
+ Test.Hspec.Api.Formatters.V3: getSuccessCount :: FormatM Int
+ Test.Hspec.Api.Formatters.V3: getTotalCount :: FormatM Int
+ Test.Hspec.Api.Formatters.V3: missingChunk :: String -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: modifyConfig :: (Config -> Config) -> SpecWith a
+ Test.Hspec.Api.Formatters.V3: newtype Seconds
+ Test.Hspec.Api.Formatters.V3: outputUnicode :: FormatM Bool
+ Test.Hspec.Api.Formatters.V3: prettyPrint :: FormatM Bool
+ Test.Hspec.Api.Formatters.V3: prettyPrintFunction :: FormatM (Maybe (String -> String -> (String, String)))
+ Test.Hspec.Api.Formatters.V3: printTimes :: FormatM Bool
+ Test.Hspec.Api.Formatters.V3: progress :: Formatter
+ Test.Hspec.Api.Formatters.V3: registerFormatter :: (String, Formatter) -> Config -> Config
+ Test.Hspec.Api.Formatters.V3: silent :: Formatter
+ Test.Hspec.Api.Formatters.V3: specdoc :: Formatter
+ Test.Hspec.Api.Formatters.V3: type Path = ([String], String)
+ Test.Hspec.Api.Formatters.V3: type Progress = (Int, Int)
+ Test.Hspec.Api.Formatters.V3: type SpecWith a = SpecM a ()
+ Test.Hspec.Api.Formatters.V3: useDiff :: FormatM Bool
+ Test.Hspec.Api.Formatters.V3: useFormatter :: (String, Formatter) -> Config -> Config
+ Test.Hspec.Api.Formatters.V3: usedSeed :: FormatM Integer
+ Test.Hspec.Api.Formatters.V3: withFailColor :: FormatM a -> FormatM a
+ Test.Hspec.Api.Formatters.V3: withInfoColor :: FormatM a -> FormatM a
+ Test.Hspec.Api.Formatters.V3: withPendingColor :: FormatM a -> FormatM a
+ Test.Hspec.Api.Formatters.V3: withSuccessColor :: FormatM a -> FormatM a
+ Test.Hspec.Api.Formatters.V3: write :: String -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: writeLine :: String -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: writeTransient :: String -> FormatM ()

Files

hspec-api.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack  name:           hspec-api-version:        2.10.0+version:        2.11.0 synopsis:       A Testing Framework for Haskell description:    This package provides a stable API that can be used to extend Hspec's functionality. category:       Testing@@ -17,6 +17,8 @@ license:        MIT license-file:   LICENSE build-type:     Simple+extra-source-files:+    version.yaml  source-repository head   type: git@@ -26,16 +28,19 @@ library   exposed-modules:       Test.Hspec.Api.Format.V1+      Test.Hspec.Api.Format.V2       Test.Hspec.Api.Formatters.V1       Test.Hspec.Api.Formatters.V2+      Test.Hspec.Api.Formatters.V3   other-modules:-      Paths_hspec_api+      Test.Hspec.Api.Format.V1.Internal   hs-source-dirs:       src   ghc-options: -Wall   build-depends:       base ==4.*-    , hspec-core >=2.10.0 && <2.11+    , hspec-core ==2.11.0+    , transformers   default-language: Haskell2010  test-suite spec@@ -43,8 +48,10 @@   main-is: Spec.hs   other-modules:       Test.Hspec.Api.Format.V1Spec+      Test.Hspec.Api.Format.V2Spec       Test.Hspec.Api.Formatters.V1Spec       Test.Hspec.Api.Formatters.V2Spec+      Test.Hspec.Api.Formatters.V3Spec       Paths_hspec_api   hs-source-dirs:       test@@ -55,5 +62,6 @@       base ==4.*     , hspec ==2.*     , hspec-api-    , hspec-core >=2.10.0 && <2.11+    , hspec-core ==2.11.0+    , transformers   default-language: Haskell2010
src/Test/Hspec/Api/Format/V1.hs view
@@ -1,5 +1,5 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE LambdaCase #-} -- | -- Stability: stable module Test.Hspec.Api.Format.V1 (@@ -26,31 +26,43 @@ , modifyConfig ) where -import           Test.Hspec.Core.Runner (Config(..))-import           Test.Hspec.Core.Spec (modifyConfig, SpecWith)-import           Test.Hspec.Core.Format hiding (FormatConfig(..)) import qualified Test.Hspec.Core.Format as Latest+import qualified Test.Hspec.Api.Format.V2 as V2+import           Test.Hspec.Api.Format.V2 hiding (+    registerFormatter+  , useFormatter+  , liftFormatter+  , FormatConfig(..)+  , Item(..)+  , FailureReason(..)+  , Result(..)+  , Event(..)+  , Format+  , monadic+  ) +import           Control.Monad.IO.Class+import           Test.Hspec.Api.Format.V1.Internal+ -- | -- Make a formatter available for use with @--format@. registerFormatter :: (String, FormatConfig -> IO Format) -> Config -> Config-registerFormatter = registerFormatter_ . liftFormatter+registerFormatter = V2.registerFormatter . liftFormatterToV2  -- | -- Make a formatter available for use with @--format@ and use it by default. useFormatter :: (String, FormatConfig -> IO Format) -> Config -> Config-useFormatter (liftFormatter -> formatter@(_, format)) config = (registerFormatter_ formatter config) { configFormat = Just format }---- copy of Test.Hspec.Core.Runner.registerFormatter-registerFormatter_ :: (String, Latest.FormatConfig -> IO Latest.Format) -> Config -> Config-registerFormatter_ formatter config = config { configAvailableFormatters = formatter : configAvailableFormatters config }+useFormatter = V2.useFormatter . liftFormatterToV2  -- | Make a formatter compatible with types from "Test.Hspec.Core.Format".-liftFormatter :: (String, FormatConfig -> IO Format) -> (String, Latest.FormatConfig -> IO Format)-liftFormatter = fmap liftFormat+liftFormatter :: (String, FormatConfig -> IO Format) -> (String, Latest.FormatConfig -> IO Latest.Format)+liftFormatter = V2.liftFormatter . liftFormatterToV2++liftFormatterToV2 :: (String, FormatConfig -> IO Format) -> (String, V2.FormatConfig -> IO V2.Format)+liftFormatterToV2 = fmap lift   where-    liftFormat :: (FormatConfig -> IO Format) -> Latest.FormatConfig -> IO Format-    liftFormat format = format . liftFormatConfig+    lift :: (FormatConfig -> IO Format) -> V2.FormatConfig -> IO V2.Format+    lift format = fmap liftFormat . format . unliftFormatConfig  data FormatConfig = FormatConfig {   formatConfigUseColor :: Bool@@ -68,26 +80,60 @@ , formatConfigExpectedTotalCount :: Int } -liftFormatConfig :: Latest.FormatConfig -> FormatConfig-liftFormatConfig config = FormatConfig {-  formatConfigUseColor = Latest.formatConfigUseColor config-, formatConfigReportProgress = Latest.formatConfigReportProgress config-, formatConfigOutputUnicode = Latest.formatConfigOutputUnicode config-, formatConfigUseDiff = Latest.formatConfigUseDiff config+unliftFormatConfig :: V2.FormatConfig -> FormatConfig+unliftFormatConfig config = FormatConfig {+  formatConfigUseColor = V2.formatConfigUseColor config+, formatConfigReportProgress = V2.formatConfigReportProgress config+, formatConfigOutputUnicode = V2.formatConfigOutputUnicode config+, formatConfigUseDiff = V2.formatConfigUseDiff config+, formatConfigDiffContext = V2.formatConfigDiffContext config+, formatConfigExternalDiff = V2.formatConfigExternalDiff config+, formatConfigPrettyPrint = maybe False (const True) $ V2.formatConfigPrettyPrintFunction config+, formatConfigPrettyPrintFunction = V2.formatConfigPrettyPrintFunction config+, formatConfigPrintTimes = V2.formatConfigPrintTimes config+, formatConfigHtmlOutput = V2.formatConfigHtmlOutput config+, formatConfigPrintCpuTime = V2.formatConfigPrintCpuTime config+, formatConfigUsedSeed = V2.formatConfigUsedSeed config+, formatConfigExpectedTotalCount = V2.formatConfigExpectedTotalCount config+} -#if MIN_VERSION_hspec_core(2,10,6)-, formatConfigDiffContext = Latest.formatConfigDiffContext config-, formatConfigExternalDiff = Latest.formatConfigExternalDiff config-#else-, formatConfigDiffContext = Nothing-, formatConfigExternalDiff = Nothing-#endif+type Format = Event -> IO () -, formatConfigPrettyPrint = Latest.formatConfigPrettyPrint config-, formatConfigPrettyPrintFunction = Latest.formatConfigPrettyPrintFunction config-, formatConfigPrintTimes = Latest.formatConfigPrintTimes config-, formatConfigHtmlOutput = Latest.formatConfigHtmlOutput config-, formatConfigPrintCpuTime = Latest.formatConfigPrintCpuTime config-, formatConfigUsedSeed = Latest.formatConfigUsedSeed config-, formatConfigExpectedTotalCount = Latest.formatConfigExpectedTotalCount config-}+liftFormat :: Format -> V2.Format+liftFormat format event = format (unliftEvent event)++unliftFormat :: V2.Format -> Format+unliftFormat format event = format (liftEvent event)++data Event =+    Started+  | GroupStarted Path+  | GroupDone Path+  | Progress Path Progress+  | ItemStarted Path+  | ItemDone Path Item+  | Done [(Path, Item)]+  deriving Show++liftEvent :: Event -> V2.Event+liftEvent = \ case+  Started -> V2.Started+  GroupStarted path -> V2.GroupStarted path+  GroupDone path -> V2.GroupDone path+  Progress path progress -> V2.Progress path progress+  ItemStarted path -> V2.ItemStarted path+  ItemDone path item -> V2.ItemDone path (liftItem item)+  Done result -> V2.Done (map (fmap liftItem) result)++unliftEvent :: V2.Event -> Event+unliftEvent = \ case+  V2.Started -> Started+  V2.GroupStarted path -> GroupStarted path+  V2.GroupDone path -> GroupDone path+  V2.Progress path progress -> Progress path progress+  V2.ItemStarted path -> ItemStarted path+  V2.ItemDone path item -> ItemDone path (unliftItem item)+  V2.Done result -> Done (map (fmap unliftItem) result)++monadic :: MonadIO m => (m () -> IO ()) -> (Event -> m ()) -> IO Format+monadic run format = unliftFormat <$> V2.monadic run (format . unliftEvent)
+ src/Test/Hspec/Api/Format/V1/Internal.hs view
@@ -0,0 +1,69 @@+{-# OPTIONS_GHC -fno-warn-deprecations #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE NamedFieldPuns #-}+module Test.Hspec.Api.Format.V1.Internal (+  FailureReason(..)+, module Test.Hspec.Api.Format.V1.Internal+) where++import           Test.Hspec.Core.Util (stripAnsi)+import           Test.Hspec.Core.Formatters.V1 (FailureReason(..))+import qualified Test.Hspec.Api.Format.V2 as V2+import           Test.Hspec.Api.Format.V2 hiding (Item(..), Result(..), FailureReason(..))++data Item = Item {+  itemLocation :: Maybe Location+, itemDuration :: Seconds+, itemInfo :: String+, itemResult :: Result+} deriving Show++data Result =+    Success+  | Pending (Maybe Location) (Maybe String)+  | Failure (Maybe Location) FailureReason+  deriving Show++liftItem :: Item -> V2.Item+liftItem Item{..} = V2.Item {+  itemLocation+, itemDuration+, itemInfo+, itemResult = liftResult itemResult+}++unliftItem :: V2.Item -> Item+unliftItem V2.Item{..} = Item {+  itemLocation+, itemDuration+, itemInfo+, itemResult = unliftResult itemResult+}++liftResult :: Result -> V2.Result+liftResult = \ case+  Success -> V2.Success+  Pending loc reason -> V2.Pending loc reason+  Failure loc reason -> V2.Failure loc (liftFailureReson reason)++unliftResult :: V2.Result -> Result+unliftResult = \ case+  V2.Success -> Success+  V2.Pending loc reason -> Pending loc reason+  V2.Failure loc reason -> Failure loc (unliftFailureReason reason)++liftFailureReson :: FailureReason -> V2.FailureReason+liftFailureReson = \ case+  NoReason -> V2.NoReason+  Reason reason -> V2.Reason reason+  ExpectedButGot preface expected actual -> V2.ExpectedButGot preface expected actual+  Error info e -> V2.Error info e++unliftFailureReason :: V2.FailureReason -> FailureReason+unliftFailureReason = \ case+  V2.NoReason -> NoReason+  V2.Reason reason -> Reason reason+  V2.ColorizedReason reason -> Reason (stripAnsi reason)+  V2.ExpectedButGot preface expected actual -> ExpectedButGot preface expected actual+  V2.Error info e -> Error info e
+ src/Test/Hspec/Api/Format/V2.hs view
@@ -0,0 +1,83 @@+{-# LANGUAGE ViewPatterns #-}+-- |+-- Stability: stable+module Test.Hspec.Api.Format.V2 (+  Format+, FormatConfig(..)+, Event(..)+, Progress+, Path+, Location(..)+, Seconds(..)+, Item(..)+, Result(..)+, FailureReason(..)+, monadic++-- * Register a formatter+, registerFormatter+, useFormatter+, liftFormatter++-- * Re-exports+, SpecWith+, Config+, modifyConfig+) where++import           Test.Hspec.Core.Runner (Config(..))+import           Test.Hspec.Core.Spec (modifyConfig, SpecWith)+import           Test.Hspec.Core.Format hiding (FormatConfig(..))+import qualified Test.Hspec.Core.Format as Latest++-- |+-- Make a formatter available for use with @--format@.+registerFormatter :: (String, FormatConfig -> IO Format) -> Config -> Config+registerFormatter = registerFormatter_ . liftFormatter++-- |+-- Make a formatter available for use with @--format@ and use it by default.+useFormatter :: (String, FormatConfig -> IO Format) -> Config -> Config+useFormatter (liftFormatter -> formatter@(_, format)) config = (registerFormatter_ formatter config) { configFormat = Just format }++-- copy of Test.Hspec.Core.Runner.registerFormatter+registerFormatter_ :: (String, Latest.FormatConfig -> IO Latest.Format) -> Config -> Config+registerFormatter_ formatter config = config { configAvailableFormatters = formatter : configAvailableFormatters config }++-- | Make a formatter compatible with types from "Test.Hspec.Core.Format".+liftFormatter :: (String, FormatConfig -> IO Format) -> (String, Latest.FormatConfig -> IO Format)+liftFormatter = fmap liftFormat+  where+    liftFormat :: (FormatConfig -> IO Format) -> Latest.FormatConfig -> IO Format+    liftFormat format = format . unliftFormatConfig++data FormatConfig = FormatConfig {+  formatConfigUseColor :: Bool+, formatConfigReportProgress :: Bool+, formatConfigOutputUnicode :: Bool+, formatConfigUseDiff :: Bool+, formatConfigDiffContext :: Maybe Int+, formatConfigExternalDiff :: Maybe (String -> String -> IO ())+, formatConfigPrettyPrintFunction :: Maybe (String -> String -> (String, String))+, formatConfigPrintTimes :: Bool+, formatConfigHtmlOutput :: Bool+, formatConfigPrintCpuTime :: Bool+, formatConfigUsedSeed :: Integer+, formatConfigExpectedTotalCount :: Int+}++unliftFormatConfig :: Latest.FormatConfig -> FormatConfig+unliftFormatConfig config = FormatConfig {+  formatConfigUseColor = Latest.formatConfigUseColor config+, formatConfigReportProgress = Latest.formatConfigReportProgress config+, formatConfigOutputUnicode = Latest.formatConfigOutputUnicode config+, formatConfigUseDiff = Latest.formatConfigUseDiff config+, formatConfigDiffContext = Latest.formatConfigDiffContext config+, formatConfigExternalDiff = Latest.formatConfigExternalDiff config+, formatConfigPrettyPrintFunction = Latest.formatConfigPrettyPrintFunction config+, formatConfigPrintTimes = Latest.formatConfigPrintTimes config+, formatConfigHtmlOutput = Latest.formatConfigHtmlOutput config+, formatConfigPrintCpuTime = Latest.formatConfigPrintCpuTime config+, formatConfigUsedSeed = Latest.formatConfigUsedSeed config+, formatConfigExpectedTotalCount = Latest.formatConfigExpectedTotalCount config+}
src/Test/Hspec/Api/Formatters/V1.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-deprecations #-} {-# LANGUAGE ViewPatterns #-} -- | -- Stability: deprecated@@ -85,7 +85,7 @@  import Test.Hspec.Core.Formatters.V1 import Test.Hspec.Core.Runner (Config(..))-import Test.Hspec.Core.Format+import Test.Hspec.Core.Format hiding (FailureReason(..)) import Test.Hspec.Core.Spec (modifyConfig, SpecWith)  -- |
src/Test/Hspec/Api/Formatters/V2.hs view
@@ -1,5 +1,6 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ViewPatterns #-}+{-# OPTIONS_GHC -fno-warn-deprecations #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE NamedFieldPuns #-} -- | -- Stability: stable --@@ -96,34 +97,110 @@ , modifyConfig ) where -import Test.Hspec.Core.Formatters.V2-import Test.Hspec.Core.Runner (Config(..))-import Test.Hspec.Core.Format-import Test.Hspec.Core.Spec (modifyConfig, SpecWith)+import           Test.Hspec.Core.Format (FormatConfig, Format)+import           Test.Hspec.Core.Formatters.V1 (FailureRecord(..))+import           Test.Hspec.Api.Format.V1.Internal+import qualified Test.Hspec.Api.Formatters.V3 as V3+import           Test.Hspec.Api.Formatters.V3 hiding (+    registerFormatter+  , useFormatter+  , formatterToFormat -#if !MIN_VERSION_hspec_core(2,10,6)-diffContext :: FormatM (Maybe Int)-diffContext = return Nothing+  , silent+  , checks+  , specdoc+  , progress+  , failed_examples -externalDiffAction :: FormatM (Maybe (String -> String -> IO ()))-externalDiffAction = return Nothing-#endif+  , Formatter(..)+  , Item(..)+  , Result(..)+  , FailureReason(..) +  , FailureRecord(..)+  , getFailMessages+  )+ -- | -- Make a formatter available for use with @--format@. registerFormatter :: (String, Formatter) -> Config -> Config-registerFormatter formatter = registerFormatter_ (fmap formatterToFormat formatter)+registerFormatter formatter = V3.registerFormatter (fmap liftFormatter formatter)  -- | -- Make a formatter available for use with @--format@ and use it by default. useFormatter :: (String, Formatter) -> Config -> Config-useFormatter (fmap formatterToFormat -> formatter@(_, format)) config = (registerFormatter_ formatter config) { configFormat = Just format }+useFormatter formatter = V3.useFormatter (liftFormatter <$> formatter) --- copy of Test.Hspec.Core.Runner.registerFormatter-registerFormatter_ :: (String, FormatConfig -> IO Format) -> Config -> Config-registerFormatter_ formatter config = config { configAvailableFormatters = formatter : configAvailableFormatters config }+formatterToFormat :: Formatter -> FormatConfig -> IO Format+formatterToFormat = V3.formatterToFormat . liftFormatter -#if !MIN_VERSION_hspec_core(2,9,2)-prettyPrint :: FormatM Bool-prettyPrint = return True-#endif+silent :: Formatter+silent = unliftFormatter V3.silent++checks :: Formatter+checks = unliftFormatter V3.checks++specdoc :: Formatter+specdoc = unliftFormatter V3.specdoc++progress :: Formatter+progress = unliftFormatter V3.progress++failed_examples :: Formatter+failed_examples = unliftFormatter V3.failed_examples++data Formatter = Formatter {+-- | evaluated before a test run+  formatterStarted :: FormatM ()++-- | evaluated before each spec group+, formatterGroupStarted :: Path -> FormatM ()++-- | evaluated after each spec group+, formatterGroupDone :: Path -> FormatM ()++-- | used to notify the progress of the currently evaluated example+, formatterProgress :: Path -> Progress -> FormatM ()++-- | evaluated before each spec item+, formatterItemStarted :: Path -> FormatM ()++-- | evaluated after each spec item+, formatterItemDone :: Path -> Item -> FormatM ()++-- | evaluated after a test run+, formatterDone :: FormatM ()+}++-- | Get the list of accumulated failure messages.+getFailMessages :: FormatM [FailureRecord]+getFailMessages = map unliftFailureRecord <$> V3.getFailMessages++liftFormatter :: Formatter -> V3.Formatter+liftFormatter Formatter{..} = V3.Formatter{+  formatterStarted+, formatterGroupStarted+, formatterGroupDone+, formatterProgress+, formatterItemStarted+, formatterItemDone = \ path -> formatterItemDone path . unliftItem+, formatterDone+}++unliftFormatter :: V3.Formatter -> Formatter+unliftFormatter V3.Formatter{..} = Formatter{+  formatterStarted+, formatterGroupStarted+, formatterGroupDone+, formatterProgress+, formatterItemStarted+, formatterItemDone = \ path -> formatterItemDone path . liftItem+, formatterDone+}++unliftFailureRecord :: V3.FailureRecord -> FailureRecord+unliftFailureRecord V3.FailureRecord{..} = FailureRecord {+  failureRecordLocation+, failureRecordPath+, failureRecordMessage = unliftFailureReason failureRecordMessage+}
+ src/Test/Hspec/Api/Formatters/V3.hs view
@@ -0,0 +1,115 @@+{-# LANGUAGE ViewPatterns #-}+-- |+-- Stability: stable+--+-- This module contains formatters that can be used with `hspecWith`:+--+-- @+-- import Test.Hspec+-- import Test.Hspec.Api.Formatters.V1+--+-- main :: IO ()+-- main = hspecWith (useFormatter ("my-formatter", formatter) defaultConfig) spec+--+-- formatter :: Formatter+-- formatter = ...+--+-- spec :: Spec+-- spec = ...+-- @+module Test.Hspec.Api.Formatters.V3 (++-- * Register a formatter+  registerFormatter+, useFormatter+, formatterToFormat++-- * Formatters+, silent+, checks+, specdoc+, progress+, failed_examples++-- * Implementing a custom Formatter+-- |+-- A formatter is a set of actions.  Each action is evaluated when a certain+-- situation is encountered during a test run.+--+-- Actions live in the `FormatM` monad.  It provides access to the runner state+-- and primitives for appending to the generated report.+, Formatter (..)+, Path+, Progress+, Location(..)+, Item(..)+, Result(..)+, FailureReason (..)+, FormatM++-- ** Accessing the runner state+, getSuccessCount+, getPendingCount+, getFailCount+, getTotalCount+, getExpectedTotalCount++, FailureRecord (..)+, getFailMessages+, usedSeed++, printTimes++, Seconds(..)+, getCPUTime+, getRealTime++-- ** Appending to the generated report+, write+, writeLine+, writeTransient++-- ** Dealing with colors+, withInfoColor+, withSuccessColor+, withPendingColor+, withFailColor++, outputUnicode++, useDiff+, diffContext+, externalDiffAction+, prettyPrint+, prettyPrintFunction+, extraChunk+, missingChunk++-- ** Helpers+, formatLocation+, formatException++-- * Re-exports+, SpecWith+, Config+, modifyConfig+) where++import Test.Hspec.Core.Formatters.V2+import Test.Hspec.Core.Runner (Config(..))+import Test.Hspec.Core.Format (FormatConfig, Format)+import Test.Hspec.Core.Spec (modifyConfig, SpecWith)++-- |+-- Make a formatter available for use with @--format@.+registerFormatter :: (String, Formatter) -> Config -> Config+registerFormatter formatter = registerFormatter_ (fmap formatterToFormat formatter)++-- |+-- Make a formatter available for use with @--format@ and use it by default.+useFormatter :: (String, Formatter) -> Config -> Config+useFormatter (fmap formatterToFormat -> formatter@(_, format)) config = (registerFormatter_ formatter config) { configFormat = Just format }++-- copy of Test.Hspec.Core.Runner.registerFormatter+registerFormatter_ :: (String, FormatConfig -> IO Format) -> Config -> Config+registerFormatter_ formatter config = config { configAvailableFormatters = formatter : configAvailableFormatters config }
+ test/Test/Hspec/Api/Format/V2Spec.hs view
@@ -0,0 +1,22 @@+module Test.Hspec.Api.Format.V2Spec (spec) where++import           Test.Hspec+import           Test.Hspec.Runner++import           Data.IORef++import           Test.Hspec.Api.Format.V2++spec :: Spec+spec = do+  describe "useFormatter" $ do+    it "sets a formatter to be used with a given config" $ do+      ref <- newIORef "NAY!"+      let+        formatter :: Format+        formatter event = case event of+          ItemDone {} -> writeIORef ref "YAY!"+          _ -> return ()++      hspecWith (useFormatter ("my-formatter", \ _ -> return formatter) defaultConfig) $ it "" True+      readIORef ref `shouldReturn` "YAY!"
+ test/Test/Hspec/Api/Formatters/V3Spec.hs view
@@ -0,0 +1,20 @@+module Test.Hspec.Api.Formatters.V3Spec (spec) where++import           Test.Hspec+import           Test.Hspec.Runner++import           Data.IORef+import           Control.Monad.IO.Class++import           Test.Hspec.Api.Formatters.V3++spec :: Spec+spec = do+  describe "useFormatter" $ do+    it "sets a formatter to be used with a given config" $ do+      ref <- newIORef "NAY!"+      let+        formatter :: Formatter+        formatter = silent { formatterItemStarted = \ _ -> liftIO $ writeIORef ref "YAY!" }+      hspecWith (useFormatter ("my-formatter", formatter) defaultConfig) $ it "" True+      readIORef ref `shouldReturn` "YAY!"
+ version.yaml view
@@ -0,0 +1,1 @@+&version 2.11.0