keyword-args 0.1.0.4 → 0.1.0.5
raw patch · 3 files changed
+44/−40 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- keyword-args.cabal +4/−3
- src/Data/KeywordArgs/Parse.hs +29/−28
- src/Main.hs +11/−9
keyword-args.cabal view
@@ -1,5 +1,5 @@ name: keyword-args-version: 0.1.0.4+version: 0.1.0.5 synopsis: Extract data from a keyword-args config file format description: Extracts data from a configuration file with keywords@@ -28,7 +28,7 @@ hs-source-dirs: src default-language: Haskell2010-+ ghc-options: -Wall library exposed-modules: Data.KeywordArgs.Parse@@ -38,7 +38,7 @@ hs-source-dirs: src default-language: Haskell2010-+ ghc-options: -Wall test-suite keyword-args-test type: exitcode-stdio-1.0@@ -51,6 +51,7 @@ , hspec default-language: Haskell2010+ ghc-options: -Wall source-repository head type: git
src/Data/KeywordArgs/Parse.hs view
@@ -1,14 +1,12 @@ module Data.KeywordArgs.Parse (configParser) where import Data.Maybe (catMaybes)-import Data.Char (isSpace) -import Text.Parsec ((<|>), many, try, manyTill, char, anyChar, many1, satisfy)+import Text.Parsec ((<|>), many, try, manyTill, char, anyChar, many1) import Text.Parsec.String (Parser) -import Text.ParserCombinators.Parsec.Prim hiding (try)-import Text.ParserCombinators.Parsec.Char (string, space, tab, newline,- alphaNum)+import Text.ParserCombinators.Parsec.Prim (GenParser)+import Text.ParserCombinators.Parsec.Char (space, newline, oneOf, noneOf) import Control.Monad (liftM2) @@ -22,36 +20,30 @@ configParser :: Parser [(String, String)] configParser = catMaybes <$> many line --manyTill1 :: GenParser tok st a -> GenParser tok st end -> GenParser tok st [a]-manyTill1 p end = liftM2 (:) p (manyTill p end)--isValidKeyChar :: Char -> Bool-isValidKeyChar c = c /= '#' && (not . isSpace) c---isValidValueChar :: Char -> Bool-isValidValueChar c = c /= '#'-+line :: Parser (Maybe (String, String))+line = comment *> return Nothing <|> Just <$> configurationOption configurationOption :: Parser (String, String) configurationOption = do- many space+ _ <- many space - keyword <- manyTill1 (satisfy isValidKeyChar) (many1 (char ' '))+ keyword <- manyTill1 anyChar keywordArgSeparator+ val <- value - let- endOfOption = endOfLineOrInput <|> comment+ return (keyword, val) - quotedValue = char '"' *>- manyTill1 (satisfy isValidValueChar) (try (char '"')) <*- endOfOption+value :: Parser String+value =+ unquotedValue <|> quotedValue - unquotedValue = manyTill1 (satisfy isValidValueChar) endOfOption+ where+ endOfOption = endOfLineOrInput <|> comment - value <- quotedValue <|> unquotedValue+ quotedValue = quote+ *> manyTill1 argumentChar quote+ <* endOfOption - return (keyword, value)+ unquotedValue = manyTill1 argumentChar endOfOption comment :: Parser () comment =@@ -62,5 +54,14 @@ endOfLineOrInput :: Parser () endOfLineOrInput = newline *> return () <|> eof -line :: Parser (Maybe (String, String))-line = comment *> return Nothing <|> Just <$> configurationOption+manyTill1 :: GenParser tok st a -> GenParser tok st end -> GenParser tok st [a]+manyTill1 p end = liftM2 (:) p (manyTill p end)++argumentChar :: Parser Char+argumentChar = noneOf "#\""++keywordArgSeparator :: Parser ()+keywordArgSeparator = many1 (oneOf "\t ") *> return ()++quote :: Parser Char+quote = char '"'
src/Main.hs view
@@ -5,11 +5,9 @@ import System.Console.GetOpt import System.Environment (getArgs, getProgName)-import System.Exit (ExitCode(..), exitWith, exitSuccess)-import System.IO.Error (ioError)+import System.Exit (exitSuccess) import Paths_keyword_args (version)-import Data.Maybe (fromMaybe) import Data.Version (showVersion) @@ -18,7 +16,6 @@ import Data.KeywordArgs.Parse import Text.Parsec-import Text.ParserCombinators.Parsec.Error (ParseError) import Data.Csv (encode) @@ -27,6 +24,7 @@ , optShowHelp :: Bool } deriving Show +defaultOptions :: Options defaultOptions = Options { optShowVersion = False , optShowHelp = False@@ -34,20 +32,26 @@ options :: [OptDescr (Options -> Options)] options =- [ Option ['V'] ["version"] (NoArg (\opts -> opts { optShowVersion = True }))+ [ Option "V" ["version"] (NoArg (\opts -> opts { optShowVersion = True })) "show version number" - , Option ['h'] ["help"] (NoArg (\opts -> opts { optShowHelp = True }))+ , Option "h" ["help"] (NoArg (\opts -> opts { optShowHelp = True })) "show help" ] +showHelp :: IO () showHelp = do prg <- getProgName putStrLn (usageInfo prg options) exitSuccess headerMessage :: String -> String-headerMessage progName = "Usage: " ++ progName ++ " [OPTION...]"+headerMessage progName =+ unlines [+ progName ++ " " +++ "cleans up whitespace and comments in keyword-argument input " +++ "and emits CSV output.\n"+ , "Usage: " ++ progName ++ " [OPTION...]"] lintOpts :: [String] -> IO (Options, [String]) lintOpts argv = do@@ -63,14 +67,12 @@ runCheck :: IO () runCheck = do- f <- getContents case parseConfig f of Left e -> ioError $ userError $ "Parse error: " ++ show e Right config -> putStr $ unpack $ encode config- main :: IO () main = do