packages feed

cabal-gild 1.8.2.0 → 1.8.2.1

raw patch · 6 files changed

+134/−12 lines, 6 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

+ CabalGild.Unstable.Action.EvaluatePragmas.WarnUnknown: PragmaBody :: String -> PragmaBody
+ CabalGild.Unstable.Action.EvaluatePragmas.WarnUnknown: field :: MonadWarn m => Field (p, Comments q) -> m ()
+ CabalGild.Unstable.Action.EvaluatePragmas.WarnUnknown: instance Distribution.Parsec.Parsec CabalGild.Unstable.Action.EvaluatePragmas.WarnUnknown.PragmaBody
+ CabalGild.Unstable.Action.EvaluatePragmas.WarnUnknown: isKnownPragma :: ByteString -> Bool
+ CabalGild.Unstable.Action.EvaluatePragmas.WarnUnknown: newtype PragmaBody
+ CabalGild.Unstable.Action.EvaluatePragmas.WarnUnknown: run :: MonadWarn m => ([Field (p, Comments q)], [Comment q]) -> m ([Field (p, Comments q)], [Comment q])
+ CabalGild.Unstable.Action.EvaluatePragmas.WarnUnknown: warnComment :: MonadWarn m => Comment q -> m ()
+ CabalGild.Unstable.Action.EvaluatePragmas.WarnUnknown: warnComments :: MonadWarn m => Comments q -> m ()
+ CabalGild.Unstable.Class.MonadWarn: class Monad m => MonadWarn (m :: Type -> Type)
+ CabalGild.Unstable.Class.MonadWarn: instance CabalGild.Unstable.Class.MonadWarn.MonadWarn GHC.Types.IO
+ CabalGild.Unstable.Class.MonadWarn: warnLn :: MonadWarn m => String -> m ()
- CabalGild: format :: (MonadThrow m, MonadWalk m) => FilePath -> ByteString -> m ByteString
+ CabalGild: format :: (MonadThrow m, MonadWalk m, MonadWarn m) => FilePath -> ByteString -> m ByteString
- CabalGild: mainWith :: (MonadHandle m, MonadLog m, MonadRead m, MonadThrow m, MonadWalk m, MonadWrite m) => [String] -> m ()
+ CabalGild: mainWith :: (MonadHandle m, MonadLog m, MonadRead m, MonadThrow m, MonadWalk m, MonadWarn m, MonadWrite m) => [String] -> m ()
- CabalGild.Unstable.Action.EvaluatePragmas: run :: (MonadThrow m, MonadWalk m) => FilePath -> ([Field (p, Comments q)], [Comment q]) -> m ([Field (p, Comments q)], [Comment q])
+ CabalGild.Unstable.Action.EvaluatePragmas: run :: (MonadThrow m, MonadWalk m, MonadWarn m) => FilePath -> ([Field (p, Comments q)], [Comment q]) -> m ([Field (p, Comments q)], [Comment q])
- CabalGild.Unstable.Main: format :: (MonadThrow m, MonadWalk m) => FilePath -> ByteString -> m ByteString
+ CabalGild.Unstable.Main: format :: (MonadThrow m, MonadWalk m, MonadWarn m) => FilePath -> ByteString -> m ByteString
- CabalGild.Unstable.Main: mainWith :: (MonadHandle m, MonadLog m, MonadRead m, MonadThrow m, MonadWalk m, MonadWrite m) => [String] -> m ()
+ CabalGild.Unstable.Main: mainWith :: (MonadHandle m, MonadLog m, MonadRead m, MonadThrow m, MonadWalk m, MonadWarn m, MonadWrite m) => [String] -> m ()

Files

cabal-gild.cabal view
@@ -11,7 +11,7 @@ maintainer: Taylor Fausak name: cabal-gild synopsis: Formats package descriptions.-version: 1.8.2.0+version: 1.8.2.1  source-repository head   type: git@@ -72,6 +72,7 @@     CabalGild.Unstable.Action.EvaluatePragmas.Discover     CabalGild.Unstable.Action.EvaluatePragmas.Require     CabalGild.Unstable.Action.EvaluatePragmas.Version+    CabalGild.Unstable.Action.EvaluatePragmas.WarnUnknown     CabalGild.Unstable.Action.ExtractComments     CabalGild.Unstable.Action.FormatFields     CabalGild.Unstable.Action.GetCabalVersion@@ -82,6 +83,7 @@     CabalGild.Unstable.Class.MonadLog     CabalGild.Unstable.Class.MonadRead     CabalGild.Unstable.Class.MonadWalk+    CabalGild.Unstable.Class.MonadWarn     CabalGild.Unstable.Class.MonadWrite     CabalGild.Unstable.Exception.CheckFailure     CabalGild.Unstable.Exception.DuplicateOption
source/library/CabalGild/Unstable/Action/EvaluatePragmas.hs view
@@ -3,7 +3,9 @@ import qualified CabalGild.Unstable.Action.EvaluatePragmas.Discover as EvaluateDiscover import qualified CabalGild.Unstable.Action.EvaluatePragmas.Require as EvaluateRequire import qualified CabalGild.Unstable.Action.EvaluatePragmas.Version as EvaluateVersion+import qualified CabalGild.Unstable.Action.EvaluatePragmas.WarnUnknown as WarnUnknown import qualified CabalGild.Unstable.Class.MonadWalk as MonadWalk+import qualified CabalGild.Unstable.Class.MonadWarn as MonadWarn import qualified CabalGild.Unstable.Type.Comment as Comment import qualified CabalGild.Unstable.Type.Comments as Comments import qualified Control.Monad as Monad@@ -13,11 +15,12 @@ -- | High level wrapper around 'field' that makes this action easier to compose -- with other actions. run ::-  (Exception.MonadThrow m, MonadWalk.MonadWalk m) =>+  (Exception.MonadThrow m, MonadWalk.MonadWalk m, MonadWarn.MonadWarn m) =>   FilePath ->   ([Fields.Field (p, Comments.Comments q)], [Comment.Comment q]) ->   m ([Fields.Field (p, Comments.Comments q)], [Comment.Comment q]) run p =-  EvaluateRequire.run+  WarnUnknown.run+    Monad.>=> EvaluateRequire.run     Monad.>=> EvaluateVersion.run     Monad.>=> EvaluateDiscover.run p
+ source/library/CabalGild/Unstable/Action/EvaluatePragmas/WarnUnknown.hs view
@@ -0,0 +1,71 @@+module CabalGild.Unstable.Action.EvaluatePragmas.WarnUnknown where++import qualified CabalGild.Unstable.Action.EvaluatePragmas.Discover as Discover+import qualified CabalGild.Unstable.Action.EvaluatePragmas.Require as Require+import qualified CabalGild.Unstable.Action.EvaluatePragmas.Version as Version+import qualified CabalGild.Unstable.Class.MonadWarn as MonadWarn+import qualified CabalGild.Unstable.Extra.FieldLine as FieldLine+import qualified CabalGild.Unstable.Extra.Name as Name+import qualified CabalGild.Unstable.Type.Comment as Comment+import qualified CabalGild.Unstable.Type.Comments as Comments+import qualified CabalGild.Unstable.Type.Pragma as Pragma+import qualified Data.ByteString as ByteString+import qualified Data.Maybe as Maybe+import qualified Distribution.Compat.CharParsing as CharParsing+import qualified Distribution.Fields as Fields+import qualified Distribution.Parsec as Parsec++run ::+  (MonadWarn.MonadWarn m) =>+  ([Fields.Field (p, Comments.Comments q)], [Comment.Comment q]) ->+  m ([Fields.Field (p, Comments.Comments q)], [Comment.Comment q])+run (fs, cs) = do+  mapM_ field fs+  mapM_ warnComment cs+  pure (fs, cs)++field ::+  (MonadWarn.MonadWarn m) =>+  Fields.Field (p, Comments.Comments q) ->+  m ()+field f = case f of+  Fields.Field n fls -> do+    warnComments . snd $ Name.annotation n+    mapM_ (warnComments . snd . FieldLine.annotation) fls+  Fields.Section n _ fs -> do+    warnComments . snd $ Name.annotation n+    mapM_ field fs++warnComments ::+  (MonadWarn.MonadWarn m) =>+  Comments.Comments q ->+  m ()+warnComments cs = do+  mapM_ warnComment (Comments.before cs)+  mapM_ warnComment (Comments.after cs)++warnComment ::+  (MonadWarn.MonadWarn m) =>+  Comment.Comment q ->+  m ()+warnComment c =+  let bs = Comment.value c+   in case Parsec.simpleParsecBS bs :: Maybe (Pragma.Pragma PragmaBody) of+        Nothing -> pure ()+        Just (Pragma.Pragma (PragmaBody body))+          | isKnownPragma bs -> pure ()+          | otherwise ->+              MonadWarn.warnLn $ "warning: unknown pragma \"" <> body <> "\""++-- | Checks whether a comment parses as any known pragma type.+isKnownPragma :: ByteString.ByteString -> Bool+isKnownPragma bs =+  Maybe.isJust (Parsec.simpleParsecBS bs :: Maybe (Pragma.Pragma Discover.Discover))+    || Maybe.isJust (Parsec.simpleParsecBS bs :: Maybe (Pragma.Pragma Require.Require))+    || Maybe.isJust (Parsec.simpleParsecBS bs :: Maybe (Pragma.Pragma Version.Version))++-- | Captures all text after the "cabal-gild:" prefix.+newtype PragmaBody = PragmaBody String++instance Parsec.Parsec PragmaBody where+  parsec = PragmaBody <$> CharParsing.many CharParsing.anyChar
+ source/library/CabalGild/Unstable/Class/MonadWarn.hs view
@@ -0,0 +1,12 @@+module CabalGild.Unstable.Class.MonadWarn where++import qualified System.IO as IO++-- | A 'Monad' that can also emit warnings.+class (Monad m) => MonadWarn m where+  -- | Emits the given warning message followed by a newline.+  warnLn :: String -> m ()++-- | Uses 'hPutStrLn' on 'stderr'.+instance MonadWarn IO where+  warnLn = IO.hPutStrLn IO.stderr
source/library/CabalGild/Unstable/Main.hs view
@@ -13,6 +13,7 @@ import qualified CabalGild.Unstable.Class.MonadLog as MonadLog import qualified CabalGild.Unstable.Class.MonadRead as MonadRead import qualified CabalGild.Unstable.Class.MonadWalk as MonadWalk+import qualified CabalGild.Unstable.Class.MonadWarn as MonadWarn import qualified CabalGild.Unstable.Class.MonadWrite as MonadWrite import qualified CabalGild.Unstable.Exception.CheckFailure as CheckFailure import qualified CabalGild.Unstable.Exception.ParseError as ParseError@@ -60,6 +61,7 @@     MonadRead.MonadRead m,     Exception.MonadThrow m,     MonadWalk.MonadWalk m,+    MonadWarn.MonadWarn m,     MonadWrite.MonadWrite m   ) =>   [String] ->@@ -84,7 +86,7 @@ -- is invalid. The 'MonadWalk.MonadWalk' constraint is used to discover modules -- on the file system. Typically @m@ will be 'IO'. format ::-  (Exception.MonadThrow m, MonadWalk.MonadWalk m) =>+  (Exception.MonadThrow m, MonadWalk.MonadWalk m, MonadWarn.MonadWarn m) =>   FilePath ->   ByteString.ByteString ->   m ByteString.ByteString
source/test-suite/Main.hs view
@@ -5,6 +5,7 @@ import qualified CabalGild.Unstable.Class.MonadLog as MonadLog import qualified CabalGild.Unstable.Class.MonadRead as MonadRead import qualified CabalGild.Unstable.Class.MonadWalk as MonadWalk+import qualified CabalGild.Unstable.Class.MonadWarn as MonadWarn import qualified CabalGild.Unstable.Class.MonadWrite as MonadWrite import qualified CabalGild.Unstable.Exception.CheckFailure as CheckFailure import qualified CabalGild.Unstable.Exception.DuplicateOption as DuplicateOption@@ -1405,11 +1406,35 @@       "-- cabal-gild: discover\nname: p"       "-- cabal-gild: discover\nname: p\n" -  Hspec.it "ignores unknown pragma" $ do-    expectGilded-      "-- cabal-gild: unknown"-      "-- cabal-gild: unknown\n"+  Hspec.it "warns on unknown pragma" $ do+    let (a, s, w) = runGild [] [(Input.Stdin, String.toUtf8 "-- cabal-gild: unknown")] (".", []) False+    a `Hspec.shouldSatisfy` Either.isRight+    w `Hspec.shouldBe` ["warning: unknown pragma \"unknown\""]+    actual <- case Map.toList s of+      [(Output.Stdout, x)] -> pure x+      _ -> fail $ "impossible: " <> show s+    actual `Hspec.shouldBe` String.toUtf8 "-- cabal-gild: unknown\n" +  Hspec.it "does not warn on valid pragmas" $ do+    let (a, _s, w) = runGild [] [(Input.Stdin, String.toUtf8 "-- cabal-gild: version\nname: p")] (".", []) False+    a `Hspec.shouldSatisfy` Either.isRight+    w `Hspec.shouldBe` []++  Hspec.it "does not warn on regular comments" $ do+    let (a, _s, w) = runGild [] [(Input.Stdin, String.toUtf8 "-- just a comment\nname: p")] (".", []) False+    a `Hspec.shouldSatisfy` Either.isRight+    w `Hspec.shouldBe` []++  Hspec.it "warns on empty pragma" $ do+    let (a, _s, w) = runGild [] [(Input.Stdin, String.toUtf8 "-- cabal-gild:\nname: p")] (".", []) False+    a `Hspec.shouldSatisfy` Either.isRight+    w `Hspec.shouldBe` ["warning: unknown pragma \"\""]++  Hspec.it "warns on known pragma with invalid arguments" $ do+    let (a, _s, w) = runGild [] [(Input.Stdin, String.toUtf8 "-- cabal-gild: require broken\nname: p")] (".", []) False+    a `Hspec.shouldSatisfy` Either.isRight+    w `Hspec.shouldBe` ["warning: unknown pragma \"require broken\""]+   Hspec.it "discovers from the currently directory explicitly" $ do     expectDiscover       (".", [["M.hs"]])@@ -1695,10 +1720,14 @@               False       a `Hspec.shouldSatisfy` Either.isLeft -    Hspec.it "ignores require pragma with trailing garbage" $ do-      expectGilded-        "-- cabal-gild: require < 0 trailing-garbage"-        "-- cabal-gild: require < 0 trailing-garbage\n"+    Hspec.it "warns on require pragma with trailing garbage" $ do+      let (a, s, w) = runGild [] [(Input.Stdin, String.toUtf8 "-- cabal-gild: require < 0 trailing-garbage")] (".", []) False+      a `Hspec.shouldSatisfy` Either.isRight+      w `Hspec.shouldBe` ["warning: unknown pragma \"require < 0 trailing-garbage\""]+      actual <- case Map.toList s of+        [(Output.Stdout, x)] -> pure x+        _ -> fail $ "impossible: " <> show s+      actual `Hspec.shouldBe` String.toUtf8 "-- cabal-gild: require < 0 trailing-garbage\n"    Hspec.it "parses an empty brace section" $ do     expectGilded@@ -2180,6 +2209,9 @@  instance (Monad m) => MonadLog.MonadLog (TestT m) where   logLn = TestT . Trans.lift . RWST.tell . pure++instance (Monad m) => MonadWarn.MonadWarn (TestT m) where+  warnLn = TestT . Trans.lift . RWST.tell . pure  instance (Monad m) => MonadRead.MonadRead (TestT m) where   read k = do