himari 1.1.3.0 → 1.1.4.0
raw patch · 7 files changed
+141/−60 lines, 7 filesdep ~aesonPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aeson
API changes (from Hackage documentation)
+ Himari.Env.Simple: runSimpleNoLogEnv :: MonadIO m => Himari SimpleEnv a -> m a
+ Himari.Logger: discardLogAction :: LogAction
Files
- CHANGELOG.md +38/−0
- fourmolu.yaml +67/−50
- himari.cabal +2/−2
- src/Himari/Env/Simple.hs +6/−0
- src/Himari/Logger.hs +6/−0
- src/Himari/SafePrelude.hs +11/−0
- test/Himari/Env/SimpleSpec.hs +11/−8
CHANGELOG.md view
@@ -7,6 +7,44 @@ ## [Unreleased] +## [1.1.4.0] - 2026-06-13++### Added++- `discardLogAction` export in `Himari.Logger`,+ a `LogAction` that discards all log output,+ useful for tests that should not write logs to the real terminal+- `runSimpleNoLogEnv` export in `Himari.Env.Simple`,+ a shorthand for `runSimpleEnvWith discardLogAction`+ that runs a `SimpleEnv` action while discarding all log output+- Re-export all public `time` modules that `Data.Time` itself does not re-export+ in `Himari.SafePrelude`:+ `Data.Time.Calendar.Easter`,+ `Data.Time.Calendar.Julian`,+ `Data.Time.Calendar.MonthDay`,+ `Data.Time.Calendar.Month`,+ `Data.Time.Calendar.OrdinalDate`,+ `Data.Time.Calendar.Quarter`,+ `Data.Time.Calendar.WeekDate`,+ `Data.Time.Clock.POSIX`,+ `Data.Time.Clock.System`,+ `Data.Time.Clock.TAI`,+ `Data.Time.Format.ISO8601`,+ and register them in the `fourmolu.yaml` `reexports` setting++### Changed++- Relax `aeson` dependency upper bound from `^>=2.2.3.0` to `^>=2.2.3.0 || ^>=2.3.0.0`+ to allow building against `aeson` 2.3.y.z++### Fixed++- Restructure the `fourmolu.yaml` `reexports` chain to match the module hierarchy+ introduced with `Himari.SafePrelude` in 1.1.3.0:+ re-exports that moved to `Himari.SafePrelude` are now registered under it+ instead of `Himari.Prelude`,+ and the previously missing `Data.Default` and `UnliftIO.Retry` entries are added+ ## [1.1.3.0] - 2026-05-30 ### Added
fourmolu.yaml view
@@ -17,68 +17,85 @@ - module Himari exports "himari" Himari.Prelude # Himari.Prelude → 外部モジュール- - module Himari.Prelude exports "base" Control.Applicative- - module Himari.Prelude exports "base" Control.Monad- - module Himari.Prelude exports "base" Control.Monad.ST- - module Himari.Prelude exports "base" Data.Bifoldable- - module Himari.Prelude exports "base" Data.Bitraversable- - module Himari.Prelude exports "base" Data.Bool - module Himari.Prelude exports "base" Data.Coerce- - module Himari.Prelude exports "base" Data.Complex- - module Himari.Prelude exports "base" Data.Either- - module Himari.Prelude exports "base" Data.Eq- - module Himari.Prelude exports "base" Data.Fixed- - module Himari.Prelude exports "base" Data.Foldable- - module Himari.Prelude exports "base" Data.Function- - module Himari.Prelude exports "base" Data.Functor.Compose- - module Himari.Prelude exports "base" Data.Int- - module Himari.Prelude exports "base" Data.Kind- - module Himari.Prelude exports "base" Data.Maybe- - module Himari.Prelude exports "base" Data.Ord- - module Himari.Prelude exports "base" Data.Proxy- - module Himari.Prelude exports "base" Data.Ratio- - module Himari.Prelude exports "base" Data.String- - module Himari.Prelude exports "base" Data.Traversable- - module Himari.Prelude exports "base" Data.Tuple- - module Himari.Prelude exports "base" Data.Void- - module Himari.Prelude exports "base" Data.Word- - module Himari.Prelude exports "base" GHC.Stack- - module Himari.Prelude exports "base" Numeric- - module Himari.Prelude exports "base" Numeric.Natural- - module Himari.Prelude exports "base" Prelude- - module Himari.Prelude exports "base" Text.Show- - module Himari.Prelude exports "convertible" Data.Convertible- - module Himari.Prelude exports "deepseq" Control.DeepSeq- - module Himari.Prelude exports "hashable" Data.Hashable- - module Himari.Prelude exports "lens" Control.Lens- - module Himari.Prelude exports "monad-logger" Control.Monad.Logger- - module Himari.Prelude exports "mtl" Control.Monad.Cont- - module Himari.Prelude exports "mtl" Control.Monad.Reader- - module Himari.Prelude exports "mtl" Control.Monad.State.Strict- - module Himari.Prelude exports "mtl" Control.Monad.Writer.CPS - module Himari.Prelude exports "pretty-simple" Debug.Pretty.Simple- - module Himari.Prelude exports "pretty-simple" Text.Pretty.Simple - module Himari.Prelude exports "primitive" Control.Monad.Primitive- - module Himari.Prelude exports "time" Data.Time+ - module Himari.Prelude exports "retry" UnliftIO.Retry - module Himari.Prelude exports "unliftio" UnliftIO - module Himari.Prelude exports "unliftio" UnliftIO.Concurrent - module Himari.Prelude exports "unliftio" UnliftIO.Directory- - module Himari.Prelude exports "unliftio" UnliftIO.Environment - module Himari.Prelude exports "unliftio" UnliftIO.Exception.Lens - module Himari.Prelude exports "unliftio" UnliftIO.IO.File # Himari.Prelude → 内部サブモジュール - module Himari.Prelude exports "himari" Himari.Prelude.Aeson- - module Himari.Prelude exports "himari" Himari.Prelude.Arrow- - module Himari.Prelude exports "himari" Himari.Prelude.Catch- - module Himari.Prelude exports "himari" Himari.Prelude.Category- - module Himari.Prelude exports "himari" Himari.Prelude.Data- - module Himari.Prelude exports "himari" Himari.Prelude.FilePath- - module Himari.Prelude exports "himari" Himari.Prelude.Generics- - module Himari.Prelude exports "himari" Himari.Prelude.Monoid - module Himari.Prelude exports "himari" Himari.Prelude.Process- - module Himari.Prelude exports "himari" Himari.Prelude.Safe- - module Himari.Prelude exports "himari" Himari.Prelude.Type - module Himari.Prelude exports "himari" Himari.Prelude.TypeLevel+ - module Himari.Prelude exports "himari" Himari.SafePrelude++ # Himari.SafePrelude → 外部モジュール+ - module Himari.SafePrelude exports "base" Control.Applicative+ - module Himari.SafePrelude exports "base" Control.Monad+ - module Himari.SafePrelude exports "base" Control.Monad.ST+ - module Himari.SafePrelude exports "base" Data.Bifoldable+ - module Himari.SafePrelude exports "base" Data.Bitraversable+ - module Himari.SafePrelude exports "base" Data.Bool+ - module Himari.SafePrelude exports "base" Data.Complex+ - module Himari.SafePrelude exports "base" Data.Either+ - module Himari.SafePrelude exports "base" Data.Eq+ - module Himari.SafePrelude exports "base" Data.Fixed+ - module Himari.SafePrelude exports "base" Data.Foldable+ - module Himari.SafePrelude exports "base" Data.Function+ - module Himari.SafePrelude exports "base" Data.Functor.Compose+ - module Himari.SafePrelude exports "base" Data.Int+ - module Himari.SafePrelude exports "base" Data.Kind+ - module Himari.SafePrelude exports "base" Data.Maybe+ - module Himari.SafePrelude exports "base" Data.Ord+ - module Himari.SafePrelude exports "base" Data.Proxy+ - module Himari.SafePrelude exports "base" Data.Ratio+ - module Himari.SafePrelude exports "base" Data.String+ - module Himari.SafePrelude exports "base" Data.Traversable+ - module Himari.SafePrelude exports "base" Data.Tuple+ - module Himari.SafePrelude exports "base" Data.Void+ - module Himari.SafePrelude exports "base" Data.Word+ - module Himari.SafePrelude exports "base" GHC.Stack+ - module Himari.SafePrelude exports "base" Numeric+ - module Himari.SafePrelude exports "base" Numeric.Natural+ - module Himari.SafePrelude exports "base" Prelude+ - module Himari.SafePrelude exports "base" Text.Show+ - module Himari.SafePrelude exports "convertible" Data.Convertible+ - module Himari.SafePrelude exports "data-default" Data.Default+ - module Himari.SafePrelude exports "deepseq" Control.DeepSeq+ - module Himari.SafePrelude exports "hashable" Data.Hashable+ - module Himari.SafePrelude exports "lens" Control.Lens+ - module Himari.SafePrelude exports "monad-logger" Control.Monad.Logger+ - module Himari.SafePrelude exports "mtl" Control.Monad.Cont+ - module Himari.SafePrelude exports "mtl" Control.Monad.Reader+ - module Himari.SafePrelude exports "mtl" Control.Monad.State.Strict+ - module Himari.SafePrelude exports "mtl" Control.Monad.Writer.CPS+ - module Himari.SafePrelude exports "pretty-simple" Text.Pretty.Simple+ - module Himari.SafePrelude exports "time" Data.Time+ - module Himari.SafePrelude exports "time" Data.Time.Calendar.Easter+ - module Himari.SafePrelude exports "time" Data.Time.Calendar.Julian+ - module Himari.SafePrelude exports "time" Data.Time.Calendar.Month+ - module Himari.SafePrelude exports "time" Data.Time.Calendar.MonthDay+ - module Himari.SafePrelude exports "time" Data.Time.Calendar.OrdinalDate+ - module Himari.SafePrelude exports "time" Data.Time.Calendar.Quarter+ - module Himari.SafePrelude exports "time" Data.Time.Calendar.WeekDate+ - module Himari.SafePrelude exports "time" Data.Time.Clock.POSIX+ - module Himari.SafePrelude exports "time" Data.Time.Clock.System+ - module Himari.SafePrelude exports "time" Data.Time.Clock.TAI+ - module Himari.SafePrelude exports "time" Data.Time.Format.ISO8601+ - module Himari.SafePrelude exports "unliftio" UnliftIO.Environment+ # Himari.SafePrelude → 内部サブモジュール+ - module Himari.SafePrelude exports "himari" Himari.Prelude.Arrow+ - module Himari.SafePrelude exports "himari" Himari.Prelude.Catch+ - module Himari.SafePrelude exports "himari" Himari.Prelude.Category+ - module Himari.SafePrelude exports "himari" Himari.Prelude.Data+ - module Himari.SafePrelude exports "himari" Himari.Prelude.FilePath+ - module Himari.SafePrelude exports "himari" Himari.Prelude.Generics+ - module Himari.SafePrelude exports "himari" Himari.Prelude.Monoid+ - module Himari.SafePrelude exports "himari" Himari.Prelude.Safe+ - module Himari.SafePrelude exports "himari" Himari.Prelude.Type # Himari.Prelude.Aeson → 外部モジュール - module Himari.Prelude.Aeson exports "aeson" Data.Aeson
himari.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.12 name: himari-version: 1.1.3.0+version: 1.1.4.0 synopsis: A standard library for Haskell as an alternative to rio description: A standard library for Haskell inspired by rio.@@ -80,7 +80,7 @@ ViewPatterns build-depends:- aeson ^>=2.2.3.0,+ aeson ^>=2.2.3.0 || ^>=2.3.0.0, aeson-pretty ^>=0.8.10, base >=4.19.2.0 && <4.23, bytestring ^>=0.12.2.0,
src/Himari/Env/Simple.hs view
@@ -6,6 +6,7 @@ module Himari.Env.Simple ( SimpleEnv , runSimpleEnv+ , runSimpleNoLogEnv , runSimpleEnvWith , mkSimpleEnv ) where@@ -32,6 +33,11 @@ runSimpleEnv f = do env <- mkSimpleEnv runHimari env f++-- | `SimpleEnv`のコンテキストのアクションをログを破棄して実行します。+-- テストなど実際のターミナルにログを出力したくない場合に使えます。+runSimpleNoLogEnv :: (MonadIO m) => Himari SimpleEnv a -> m a+runSimpleNoLogEnv = runSimpleEnvWith discardLogAction -- | `SimpleEnv`のコンテキストのアクションをカスタム出力で実行します。 runSimpleEnvWith
src/Himari/Logger.hs view
@@ -7,6 +7,7 @@ , LogAction , defaultMonadLoggerLog , defaultLogAction+ , discardLogAction ) where import Himari.Env@@ -35,3 +36,8 @@ -- 標準エラー出力にログを出力します。 defaultLogAction :: LogAction defaultLogAction = defaultOutput stderr++-- | ログを一切出力せず破棄するログ出力。+-- テストなどで実際のターミナルにログを出力したくない場合に使えます。+discardLogAction :: LogAction+discardLogAction _loc _src _level _msg = pure ()
src/Himari/SafePrelude.hs view
@@ -38,6 +38,17 @@ import Data.Ratio as Export import Data.String as Export import Data.Time as Export+import Data.Time.Calendar.Easter as Export+import Data.Time.Calendar.Julian as Export+import Data.Time.Calendar.Month as Export+import Data.Time.Calendar.MonthDay as Export+import Data.Time.Calendar.OrdinalDate as Export+import Data.Time.Calendar.Quarter as Export+import Data.Time.Calendar.WeekDate as Export+import Data.Time.Clock.POSIX as Export+import Data.Time.Clock.System as Export+import Data.Time.Clock.TAI as Export+import Data.Time.Format.ISO8601 as Export import Data.Traversable as Export import Data.Tuple as Export import Data.Void as Export
test/Himari/Env/SimpleSpec.hs view
@@ -7,26 +7,29 @@ spec :: Spec spec = do+ -- テスト実行時に実際のターミナルへログを出力すると、+ -- Errorなどがログディスプレイでハイライトされて紛らわしいので、+ -- ログの出力を検証しないテストでは`runSimpleNoLogEnv`で出力を破棄する。 describe "logging" $ do it "outputs debug level logs"- (runSimpleEnv $ $(logDebug) "debug message" :: IO ())+ (runSimpleNoLogEnv $ $(logDebug) "debug message" :: IO ()) it "outputs info level logs"- (runSimpleEnv $ $(logInfo) "info message" :: IO ())+ (runSimpleNoLogEnv $ $(logInfo) "info message" :: IO ()) it "outputs warning level logs"- (runSimpleEnv $ $(logWarn) "warning message" :: IO ())+ (runSimpleNoLogEnv $ $(logWarn) "warning message" :: IO ()) it "outputs error level logs"- (runSimpleEnv $ $(logError) "error message" :: IO ())+ (runSimpleNoLogEnv $ $(logError) "error message" :: IO ()) it "handles multiple log calls"- ( runSimpleEnv+ ( runSimpleNoLogEnv ( do $(logInfo) "first log" $(logInfo) "second log"@@ -36,7 +39,7 @@ ) it "works with monadic composition" $ do- result <- runSimpleEnv $ do+ result <- runSimpleNoLogEnv $ do $(logInfo) "starting computation" let x = 20 :: Int $(logDebug) ("intermediate value: " <> convert (show x))@@ -47,7 +50,7 @@ it "supports monad-logger functions"- ( runSimpleEnv+ ( runSimpleNoLogEnv ( do logInfoN "using logInfoN" logDebugN "using logDebugN"@@ -85,7 +88,7 @@ result `shouldBe` 42 it "can access and use the environment" $ do- result <- runSimpleEnv $ do+ result <- runSimpleNoLogEnv $ do $(logInfo) "computing result" pure (10 + 32 :: Int) result `shouldBe` 42