hi 0.0.1 → 0.0.2
raw patch · 7 files changed
+106/−15 lines, 7 filesdep +parsecPVP ok
version bump matches the API change (PVP)
Dependencies added: parsec
API changes (from Hackage documentation)
+ Distribution.Hi.Config: parseConfig :: String -> IO [Arg]
+ Distribution.Hi.Types: NoConfigurationFile :: Arg
+ Distribution.Hi.Types: RunWithNoConfigurationFile :: Mode
Files
- hi.cabal +6/−1
- src/Distribution/Hi/Config.hs +46/−0
- src/Distribution/Hi/Flag.hs +2/−1
- src/Distribution/Hi/Option.hs +46/−8
- src/Distribution/Hi/Types.hs +2/−2
- src/Distribution/Hi/Version.hs +1/−1
- src/Main.hs +3/−2
hi.cabal view
@@ -1,5 +1,5 @@ name: hi-version: 0.0.1+version: 0.0.2 synopsis: Generate scaffold for cabal project license: BSD3 license-file: LICENSE@@ -53,6 +53,7 @@ exposed-modules: Distribution.Hi Distribution.Hi.Compiler+ Distribution.Hi.Config Distribution.Hi.Context Distribution.Hi.Directory Distribution.Hi.FilePath@@ -71,6 +72,7 @@ , bytestring , directory , filepath+ , parsec , process , split , template == 0.2.*@@ -91,6 +93,7 @@ , bytestring , directory , filepath+ , parsec , process , split , template == 0.2.*@@ -114,10 +117,12 @@ , bytestring , directory , hspec >= 1.5+ , parsec , process , template == 0.2.* , temporary , text+ , time source-repository head type: git
+ src/Distribution/Hi/Config.hs view
@@ -0,0 +1,46 @@+{-# OPTIONS_GHC -fno-warn-unused-do-bind #-}+module Distribution.Hi.Config+ (+ parseConfig+ ) where++import Control.Applicative ((<$>), (<*))+import Data.Maybe (catMaybes)+import Distribution.Hi.Types+import Text.Parsec+import Text.Parsec.String++sep :: Parser Char+sep = char ':'++name :: Parser String+name = many (oneOf $ ['a'..'z'] ++ ['A'..'Z'])++eol :: Parser Char+eol = newline <|> (eof >> return '\n')++comment :: Parser ()+comment = do+ _ <- char '#' <* manyTill anyChar newline+ return ()++line :: Parser (Maybe (String, String))+line = do+ spaces+ try (comment >> return Nothing) <|> (line' >>= return . Just)+ where+ line' = do+ spaces+ n <- name+ spaces >> sep >> spaces+ v <- many (noneOf "\n")+ eol+ return (n, v)++configFile :: Parser [(String, String)]+configFile = catMaybes <$> many line <* eof++parseConfig :: String -> IO [Arg]+parseConfig x = case parse configFile "ERROR" x of -- TODO Error message+ Left l -> error $ show l+ Right xs -> return $ map (uncurry Val) xs
src/Distribution/Hi/Flag.hs view
@@ -14,7 +14,7 @@ , author = lookupAuthor , email = lookupEmail , repository = lookupRepository- , year = lookupRepository+ , year = lookupYear } where lookupPackageName = lookup' "packageName"@@ -22,6 +22,7 @@ lookupAuthor = lookup' "author" lookupEmail = lookup' "email" lookupRepository = lookup' "repository"+ lookupYear = lookup' "year" lookup' label = case lookup label $ [(l, v) | (Val l v) <- args] of Just v -> v Nothing -> if label == "repository"
src/Distribution/Hi/Option.hs view
@@ -6,13 +6,16 @@ , getMode ) where -import Distribution.Hi.Flag (extractInitFlags)-import Distribution.Hi.Types import Control.Applicative-import Data.Time.Calendar (toGregorian)-import Data.Time.Clock (getCurrentTime, utctDay)+import Data.Time.Calendar (toGregorian)+import Data.Time.Clock (getCurrentTime, utctDay)+import Distribution.Hi.Config (parseConfig)+import Distribution.Hi.Flag (extractInitFlags)+import Distribution.Hi.Types import System.Console.GetOpt-import System.Environment (getArgs)+import System.Directory (getHomeDirectory)+import System.Environment (getArgs)+import System.FilePath (joinPath) -- | Available options. options :: [OptDescr Arg]@@ -22,20 +25,38 @@ , Option ['a'] ["author"] (ReqArg (Val "author") "NAME") "Name of the project's author" , Option ['e'] ["email"] (ReqArg (Val "email") "EMAIL") "Email address of the maintainer" , Option ['r'] ["repository"] (ReqArg (Val "repository") "REPOSITORY") "Template repository(optional)"- , Option ['v'] ["version"] (NoArg Version) "show version number"+ , Option ['v'] ["version"] (NoArg Version) "Show version number"+ , Option [] ["no-configuration-file"] (NoArg NoConfigurationFile) "Run without configuration file"+ , Option [] ["configuration-file"] (ReqArg (Val "configFile") "CONFIGFILE") "Run with configuration file" ] -- | Returns 'InitFlags'. getInitFlags :: IO InitFlags-getInitFlags = extractInitFlags <$> (addYear =<< fst <$> parseArgs <$> getArgs)+getInitFlags = do+ mode <- getMode+ case mode of+ Run -> runWithConfigurationFile+ RunWithNoConfigurationFile -> runWithNoConfigurationFile+ _ -> error "Unexpected run mode"+ where+ runWithNoConfigurationFile = getInitFlagsPure =<< getArgs+ runWithConfigurationFile = do+ (xs,_) <- parseArgs <$> getArgs+ ys <- addYear =<< parseConfig =<< readFile =<< getConfigFileName+ return $ extractInitFlags (ys ++ xs) +getInitFlagsPure :: [String] -> IO InitFlags+getInitFlagsPure args = extractInitFlags <$> (addYear . fst . parseArgs $ args)+ -- | Returns 'Mode'. getMode :: IO Mode getMode = do args <- fst <$> parseArgs <$> getArgs return $ if any id [True |Version <- args] then ShowVersion- else Run+ else if any id [True |NoConfigurationFile <- args]+ then RunWithNoConfigurationFile+ else Run parseArgs :: [String] -> ([Arg], [String]) parseArgs argv =@@ -45,6 +66,23 @@ (_,_,errs ) -> error $ concat errs ++ usageInfo header options where header = "Usage: hi [OPTION...]"++defaultConfigFilePath :: IO FilePath+defaultConfigFilePath = do+ h <- getHomeDirectory+ return $ joinPath [h, defaultConfigFileName]++defaultConfigFileName :: FilePath+defaultConfigFileName = ".hirc"++getConfigFileName :: IO FilePath+getConfigFileName = do+ args <- (fst . parseArgs) <$> getArgs+ go args+ where+ go [] = defaultConfigFilePath+ go ((Val "configFile" p):_) = return p+ go (_:xs) = go xs addYear :: [Arg] -> IO [Arg] addYear args = do
src/Distribution/Hi/Types.hs view
@@ -23,7 +23,7 @@ type Label = String -- | Arguments.-data Arg = Version | Val Label String deriving(Eq, Show)+data Arg = Version | NoConfigurationFile | Val Label String deriving(Eq, Show) -- | Run mode.-data Mode = ShowVersion | Run deriving(Eq, Show)+data Mode = ShowVersion | Run | RunWithNoConfigurationFile deriving(Eq, Show)
src/Distribution/Hi/Version.hs view
@@ -4,4 +4,4 @@ ) where version :: String-version = "0.0.1"+version = "0.0.2"
src/Main.hs view
@@ -9,5 +9,6 @@ main = do mode <- getMode case mode of- ShowVersion -> print version- Run -> Hi.cli =<< getInitFlags+ ShowVersion -> print version+ RunWithNoConfigurationFile -> Hi.cli =<< getInitFlags+ Run -> Hi.cli =<< getInitFlags