himari 1.0.4.0 → 1.0.5.0
raw patch · 16 files changed
+190/−24 lines, 16 filesdep +data-defaultdep +retryPVP ok
version bump matches the API change (PVP)
Dependencies added: data-default, retry
API changes (from Hackage documentation)
Files
- .hlint.yaml +72/−1
- CHANGELOG.md +24/−0
- himari.cabal +35/−2
- src/Himari/Env.hs +0/−2
- src/Himari/Env/Simple.hs +0/−4
- src/Himari/Logger.hs +0/−2
- src/Himari/Prelude.hs +2/−0
- test/Himari/Env/SimpleSpec.hs +0/−3
- test/Himari/Prelude/FunctorSpec.hs +0/−2
- test/Himari/Title.hs +0/−2
- test/HlintBaseSpec.hs +0/−2
- test/HlintExtensionSpec.hs +31/−0
- test/HlintSamples/ExtensionDangerous.hs +24/−0
- test/HlintUnliftioSpec.hs +0/−2
- test/Main.hs +2/−0
- test/TitleSpec.hs +0/−2
.hlint.yaml view
@@ -11,12 +11,37 @@ # * このファイルをプロジェクトルートに .hlint.yaml としてコピー # * または .hlint.yaml から参照: - arguments: [--hint=path/to/this/.hlint.yaml] - arguments:+ - "-XGHC2024"+ - "-XApplicativeDo" - "-XBlockArguments" - "-XCPP"+ - "-XDefaultSignatures"+ - "-XDerivingVia"+ - "-XDuplicateRecordFields"+ - "-XFunctionalDependencies"+ - "-XLexicalNegation"+ - "-XLinearTypes"+ - "-XMonadComprehensions"+ - "-XMultiWayIf"+ - "-XNegativeLiterals"+ - "-XNoFieldSelectors"+ - "-XNoImplicitPrelude"+ - "-XOverloadedLabels" - "-XOverloadedRecordDot"- - "-XOverloadedRecordUpdate"+ - "-XOverloadedStrings"+ - "-XParallelListComp"+ - "-XPatternSynonyms"+ - "-XQualifiedDo"+ - "-XQuantifiedConstraints" - "-XQuasiQuotes"+ - "-XRecordWildCards" - "-XRecursiveDo"+ - "-XStrictData"+ - "-XTemplateHaskell"+ - "-XTypeData"+ - "-XTypeFamilies"+ - "-XTypeFamilyDependencies"+ - "-XViewPatterns" - group: enabled: true name: generalise@@ -610,6 +635,52 @@ within: [] - message: "Deprecated. Use error instead, which now includes stack traces." name: errorWithStackTrace+ within: []+- extensions:+ - message: "Defers ambiguity errors to call sites, making debugging harder"+ name:+ - AllowAmbiguousTypes+ within: []+ - message: "Defers type errors to runtime, defeating Haskell's type safety"+ name:+ - DeferTypeErrors+ within: []+ - message: "Causes unexpected type defaulting (e.g., show.read defaults to ())"+ name:+ - ExtendedDefaultRules+ within: []+ - message: Experimental and may break in future GHC versions+ name:+ - ImpredicativeTypes+ within: []+ - message: "Makes instance selection non-deterministic and order-dependent"+ name:+ - IncoherentInstances+ within: []+ - message: Can cause Core Lint errors with DataKinds and PolyKinds+ name:+ - LiberalTypeSynonyms+ within: []+ - message: "Deprecated since GHC 7.10, use OVERLAPPING pragma if truly needed"+ name:+ - OverlappingInstances+ within: []+ - message: "Changes do/if-then-else semantics, breaks deriving and TH"+ name:+ - RebindableSyntax+ within: []+ - message: "Can cause type checker non-termination or stack overflow"+ name:+ - UndecidableSuperClasses+ within: []+- extensions:+ - message: 'Breaks coherence. If unavoidable, add {-# HLINT ignore "Avoid restricted extensions" #-}'+ name:+ - ImplicitParams+ within: []+ - message: 'May cause type checker loops. If unavoidable, add {-# HLINT ignore "Avoid restricted extensions" #-}'+ name:+ - UndecidableInstances within: [] - functions: - message: "Partial: throws on empty Fold. Use (^?) instead."
CHANGELOG.md view
@@ -7,6 +7,30 @@ ## [Unreleased] +## [1.0.5.0] - 2026-01-12++### Added++- `data-default` package (^>=0.8.0.2) as a dependency for default value support+- `Data.Default` re-export in `Himari.Prelude` for `Default` type class and `def` function+- `retry` package (^>=0.9.3.1) as a dependency for retry combinators+- `UnliftIO.Retry` re-export in `Himari.Prelude` for retry operations with exponential backoff+- HLint rules to warn against dangerous language extensions: `AllowAmbiguousTypes`, `DeferTypeErrors`,+ `ExtendedDefaultRules`, `ImpredicativeTypes`, `IncoherentInstances`, `LiberalTypeSynonyms`,+ `OverlappingInstances`, `RebindableSyntax`, `UndecidableSuperClasses`+- HLint rules to warn against discouraged language extensions: `ImplicitParams`, `UndecidableInstances`++### Changed++- Document recommended language extensions beyond GHC2024 (e.g., `BlockArguments`, `StrictData`,+ `OverloadedStrings`, `NoFieldSelectors`, etc.) with rationale for each+- Document extensions intentionally not enabled (e.g., `Arrows`, `DeriveAnyClass`, `OverloadedLists`,+ `OverloadedRecordUpdate`, `Strict`, `UnicodeSyntax`) with reasons+- Document dangerous language extensions that should be avoided: `AllowAmbiguousTypes`, `DeferTypeErrors`,+ `ExtendedDefaultRules`, `ImpredicativeTypes`, `IncoherentInstances`, `LiberalTypeSynonyms`,+ `OverlappingInstances`, `RebindableSyntax`, `UndecidableSuperClasses`+- Document discouraged language extensions that require caution: `ImplicitParams`, `UndecidableInstances`+ ## [1.0.4.0] - 2026-01-09 ### Added
himari.cabal view
@@ -1,6 +1,6 @@-cabal-version: 3.0+cabal-version: 3.12 name: himari-version: 1.0.4.0+version: 1.0.5.0 synopsis: A standard library for Haskell as an alternative to rio description: A standard library for Haskell inspired by rio.@@ -47,7 +47,36 @@ default-language: GHC2024 default-extensions:+ ApplicativeDo+ BlockArguments+ CPP+ DefaultSignatures+ DerivingVia+ DuplicateRecordFields+ FunctionalDependencies+ LexicalNegation+ LinearTypes+ MonadComprehensions+ MultiWayIf+ NegativeLiterals+ NoFieldSelectors NoImplicitPrelude+ OverloadedLabels+ OverloadedRecordDot+ OverloadedStrings+ ParallelListComp+ PatternSynonyms+ QualifiedDo+ QuantifiedConstraints+ QuasiQuotes+ RecordWildCards+ RecursiveDo+ StrictData+ TemplateHaskell+ TypeData+ TypeFamilies+ TypeFamilyDependencies+ ViewPatterns build-depends: aeson ^>=2.2.3.0,@@ -56,6 +85,7 @@ bytestring ^>=0.12.2.0, containers ^>=0.7, convertible ^>=1.1.1.1,+ data-default ^>=0.8.0.2, deepseq ^>=1.5.0.0, deriving-aeson ^>=0.2.10, exceptions ^>=0.10.9,@@ -66,6 +96,7 @@ mtl ^>=2.3.1, pretty-simple ^>=4.1.3, primitive ^>=0.9.1.0,+ retry ^>=0.9.3.1, safe ^>=0.3.21, text ^>=2.1.2, time ^>=1.12.2,@@ -123,7 +154,9 @@ Himari.Prelude.FunctorSpec Himari.Title HlintBaseSpec+ HlintExtensionSpec HlintSamples.BasePartial+ HlintSamples.ExtensionDangerous HlintSamples.UnliftioPreference HlintUnliftioSpec TitleSpec
src/Himari/Env.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE TypeFamilies #-}- -- | Core environment monad for Himari. module Himari.Env ( Himari (..)
src/Himari/Env/Simple.hs view
@@ -1,7 +1,3 @@-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE NoFieldSelectors #-}- -- | 基本的な環境を提供するモジュール。 -- 単純に実行だけをしたい場合、これで十分結果を手に入れられることが多いです。 module Himari.Env.Simple
src/Himari/Logger.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE FunctionalDependencies #-}- -- | Logger utilities for Himari. module Himari.Logger ( HasLogAction (..)
src/Himari/Prelude.hs view
@@ -20,6 +20,7 @@ import Data.Coerce as Export import Data.Complex as Export import Data.Convertible as Export+import Data.Default as Export import Data.Either as Export import Data.Eq as Export import Data.Fixed as Export@@ -62,4 +63,5 @@ import UnliftIO.Environment as Export import UnliftIO.Exception.Lens as Export import UnliftIO.IO.File as Export+import UnliftIO.Retry as Export import Prelude as Export
test/Himari/Env/SimpleSpec.hs view
@@ -1,6 +1,3 @@-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE TemplateHaskell #-}- module Himari.Env.SimpleSpec (spec) where import Himari
test/Himari/Prelude/FunctorSpec.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE OverloadedStrings #-}- -- | Tests for functor-related re-exports in Himari.Prelude. module Himari.Prelude.FunctorSpec (spec) where
test/Himari/Title.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE OverloadedStrings #-}- module Himari.Title ( titleComponents , generateAllCombinations
test/HlintBaseSpec.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE OverloadedStrings #-}- module HlintBaseSpec (spec) where import Data.Text qualified as T
+ test/HlintExtensionSpec.hs view
@@ -0,0 +1,31 @@+module HlintExtensionSpec (spec) where++import Data.Text qualified as T+import Himari+import Test.Syd++spec :: Spec+spec = do+ describe "hlint extension restriction rules" . beforeAll runHlintOnSample $ do+ describe "Dangerous extensions" $ do+ itWithOuter "AllowAmbiguousTypes should warn" $ \output -> do+ output `shouldSatisfy` containsWarning "AllowAmbiguousTypes"++ describe "Discouraged extensions" $ do+ itWithOuter "ImplicitParams should warn" $ \output -> do+ output `shouldSatisfy` containsWarning "ImplicitParams"++ itWithOuter "UndecidableInstances should warn" $ \output -> do+ output `shouldSatisfy` containsWarning "UndecidableInstances"++runHlintOnSample :: IO Text+runHlintOnSample = do+ (exitCode, stdoutOutput, stderrOutput) <-+ readProcess $+ proc "hlint" ["test/HlintSamples/ExtensionDangerous.hs"]+ pure $ case exitCode of+ ExitSuccess -> convert stdoutOutput+ ExitFailure _ -> convert stdoutOutput <> convert stderrOutput++containsWarning :: Text -> Text -> Bool+containsWarning expectedMsg output = expectedMsg `T.isInfixOf` output
+ test/HlintSamples/ExtensionDangerous.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE ImplicitParams #-}+{-# LANGUAGE UndecidableInstances #-}++-- Sample file to test extension restriction hlint rules+-- This file intentionally uses dangerous and discouraged extensions+module HlintSamples.ExtensionDangerous where++import Himari++-- AllowAmbiguousTypes example+class AmbiguousClass a where+ ambiguousMethod :: Int++-- ImplicitParams example+implicitParamsExample :: (?x :: Int) => Int+implicitParamsExample = ?x + 1++-- UndecidableInstances example (combined with FlexibleInstances from GHC2024)+class ShowWrapper a where+ showWrapper :: a -> Text++instance (Show a) => ShowWrapper a where+ showWrapper = convert . show
test/HlintUnliftioSpec.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE OverloadedStrings #-}- module HlintUnliftioSpec (spec) where import Data.Text qualified as T
test/Main.hs view
@@ -5,6 +5,7 @@ import Himari.Env.SimpleSpec qualified as SimpleSpec import Himari.Prelude.FunctorSpec qualified as FunctorSpec import HlintBaseSpec qualified+import HlintExtensionSpec qualified import HlintUnliftioSpec qualified import Test.Syd import TitleSpec qualified@@ -17,3 +18,4 @@ describe "Prelude.Functor" FunctorSpec.spec describe "HlintUnliftio" HlintUnliftioSpec.spec describe "HlintBase" HlintBaseSpec.spec+ describe "HlintExtension" HlintExtensionSpec.spec
test/TitleSpec.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE OverloadedStrings #-}- module TitleSpec (spec) where import Data.List.NonEmpty qualified as NE