packages feed

flags-applicative 0.0.4.3 → 0.0.4.4

raw patch · 3 files changed

+34/−3 lines, 3 filesPVP: minor bump suggested

API additions: PVP suggests at least a minor version bump

API changes (from Hackage documentation)

+ Flags.Applicative: UnexpectedFlagValue :: Name -> FlagError

Files

flags-applicative.cabal view
@@ -1,5 +1,5 @@ name:                flags-applicative-version:             0.0.4.3+version:             0.0.4.4 synopsis:            Applicative flag parsing description:         https://github.com/mtth/flags-applicative homepage:            https://github.com/mtth/flags-applicative
src/Flags/Applicative.hs view
@@ -220,6 +220,8 @@   | MissingFlagValue Name   -- | A flag with a reserved name was declared.   | ReservedFlag Name+  -- | A nullary flag was given a value.+  | UnexpectedFlagValue Name   -- | At least one flag was set but unused. This can happen when optional flags are set but their   -- branch is not selected.   | UnexpectedFlags (NonEmpty Name)@@ -238,6 +240,7 @@ displayFlagError (MissingFlag name) = qualify name <> " is required but was not set" displayFlagError (MissingFlagValue name) = "missing value for " <> qualify name displayFlagError (ReservedFlag name) = qualify name <> " was declared but is reserved"+displayFlagError (UnexpectedFlagValue name) = "unexpected value for " <> qualify name displayFlagError (UnexpectedFlags names) =   "unexpected " <> (T.intercalate " " $ fmap qualify $ toList $ names) displayFlagError (UnknownFlag name) = "undeclared " <> qualify name@@ -323,7 +326,9 @@             Nothing -> if ignoreUnknown               then second (token:) <$> go tokens               else Left (UnknownFlag name)-            Just (Flag Nullary _) -> insert "" tokens+            Just (Flag Nullary _) -> if T.null pval+              then insert "" tokens+              else Left $ UnexpectedFlagValue name             Just (Flag Unary _) -> case T.uncons pval of               Nothing -> case tokens of                 (token':tokens') -> if prefix `isPrefixOf` token'@@ -373,7 +378,7 @@           flags'' = foldl' (\m name -> Map.insert name (Flag Nullary "") m) flags' sswitches         Right (action, flags'')     (rv, unused, tokens'') <- runAction False action flags tokens'-    case Set.minView unused of+    case Set.minView $ Set.difference unused (sflags <> sswitches) of       Nothing -> Right (rv, tokens'')       Just (name, names) -> Left $ UnexpectedFlags $ name :| toList names 
test/Spec.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE TypeApplications #-}  import Control.Applicative ((<|>))+import Data.Either (isLeft) import Data.List.NonEmpty (NonEmpty(..)) import Flags.Applicative import Test.Hspec@@ -20,6 +21,11 @@         parser = (,) <$> textFlag "foo" "" <*> textFlag "foo" ""         res = parseFlags parser []       res `shouldBe` Left (DuplicateFlag "foo")+    it "should support help" $ do+      let+        parser = textFlag "foo" ""+        res = parseFlags parser ["--foo=abc", "hi", "--help"]+      isLeft res `shouldBe` True     it "should fail on unknown flags" $ do       let         parser = textFlag "foo" ""@@ -55,3 +61,23 @@         parser = textListFlag "," "bar" ""         res = parseFlags parser ["--bar=a,b,c", "def"]       res `shouldBe` Right (["a", "b", "c"], ["def"])+    it "should swallow switches" $ do+      let+        parser = boolFlag "foo" ""+        res = parseFlags parser ["--foo", "--bar", "--swallowed_switches=bar"]+      res `shouldBe` Right (True, [])+    it "should fail when a switch is set as a flag" $ do+      let+        parser = boolFlag "foo" ""+        res = parseFlags parser ["--foo=3"]+      res `shouldBe` Left (UnexpectedFlagValue "foo")+    it "should swallow flags" $ do+      let+        parser = boolFlag "foo" ""+        res = parseFlags parser ["--bar=2", "--swallowed_flags=bar"]+      res `shouldBe` Right (False, [])+    it "should fail when a flag is swallowed as a switch" $ do+      let+        parser = boolFlag "foo" ""+        res = parseFlags parser ["--foo", "--bar=1", "--swallowed_switches=bar"]+      res `shouldBe` Left (UnexpectedFlagValue "bar")