diff --git a/app/Distribution/CurrentPackageDescription.hs b/app/Distribution/CurrentPackageDescription.hs new file mode 100644 index 0000000..08263aa --- /dev/null +++ b/app/Distribution/CurrentPackageDescription.hs @@ -0,0 +1,29 @@ +module Distribution.CurrentPackageDescription + ( currentPackageDescription + , getField + ) where + +import Distribution.PackageDescription +import Distribution.PackageDescription.Parse +import Distribution.Verbosity + +import Data.List (isSuffixOf) +import Language.Haskell.TH (stringE, runIO, Q, Exp) +import System.Directory (getCurrentDirectory, getDirectoryContents) + + +getField :: (PackageDescription -> String) -> Q Exp +getField f = runIO currentPackageDescription >>= stringE . f + +currentPackageDescription :: IO PackageDescription +currentPackageDescription = fmap packageDescription $ do + dir <- getCurrentDirectory + cs <- cabalFiles dir + case cs of + (c:_) -> readPackageDescription silent c + [] -> error $ "Couldn't find a cabal file in the current working directory (" ++ dir ++ ")" + +cabalFiles :: FilePath -> IO [FilePath] +cabalFiles dir = do + files <- getDirectoryContents dir + return $ filter (".cabal" `isSuffixOf`) files diff --git a/app/Ringo/ArgParser.hs b/app/Ringo/ArgParser.hs index 50dce2c..b95d76d 100644 --- a/app/Ringo/ArgParser.hs +++ b/app/Ringo/ArgParser.hs @@ -1,15 +1,17 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE TemplateHaskell #-} module Ringo.ArgParser (ProgArgs(..), parseArgs) where import qualified Data.Text as Text +import qualified Distribution.Package as P +import qualified Distribution.PackageDescription as P +import qualified Distribution.CurrentPackageDescription as P +import qualified Distribution.Text as DText -import Data.List (intercalate) -import Data.Version (showVersion) +import Data.List (intercalate) import Options.Applicative -import Paths_ringo (version) - import Ringo.Types data ProgArgs = ProgArgs @@ -98,15 +100,20 @@ progArgsParser = <> action "directory" <> help "Output directory") +progName :: String +progName = $(P.getField (DText.display . P.pkgName . P.package)) + versionParser :: Parser (a -> a) -versionParser = infoOption ("ringo " ++ showVersion version) +versionParser = infoOption (progName ++ " " ++ version) (long "version" <> help "Print version information") + where + version = $(P.getField (DText.display . P.pkgVersion . P.package)) parseArgs :: IO ProgArgs parseArgs = execParser $ info (helper <*> versionParser <*> progArgsParser) (fullDesc - <> progDesc "Transforms OLTP database schemas to OLAP database star schemas" - <> header "ringo - OLTP to OLAP schema transformer" - <> footer "Source: http://github.com/quintype/ringo") + <> progDesc $(P.getField P.description) + <> header (progName ++ " - " ++ $(P.getField P.synopsis)) + <> footer ("© " ++ $(P.getField P.copyright) ++ ". " ++ $(P.getField P.homepage))) diff --git a/ringo.cabal b/ringo.cabal index 9e48b6e..9001d97 100644 --- a/ringo.cabal +++ b/ringo.cabal @@ -1,13 +1,13 @@ name: ringo version: 0.1.0.0 -synopsis: Tool to transform OLTP schemas to OLAP star schemas automatically -description: Please see README.md -homepage: http://github.com/quintype/ringo#readme +synopsis: OLTP to OLAP schema transformer +description: Tool to transform OLTP schemas to OLAP star schemas automatically +homepage: http://github.com/quintype/ringo license: MIT license-file: LICENSE author: Abhinav Sarkar maintainer: abhinav@abhinavsarkar.net -copyright: 2015 Quintype Inc, Nilenso Software LLP +copyright: 2015-2016 Quintype Inc, Nilenso Software LLP category: SQL build-type: Simple -- extra-source-files: @@ -41,7 +41,8 @@ library executable ringo hs-source-dirs: app other-modules: Ringo.ArgParser, - Ringo.InputParser + Ringo.InputParser, + Distribution.CurrentPackageDescription main-is: Main.hs build-depends: base >=4.7 && <5, text >=1.2 && <1.3, @@ -53,6 +54,8 @@ executable ringo directory >=1.2 && <1.3, filepath >=1.3 && <1.5, aeson >=0.8 && <0.12, + Cabal >=1.18 && <1.23, + template-haskell >=2.9 && <2.11, ringo ghc-options: -Wall -Werror -fwarn-incomplete-uni-patterns -fno-warn-unused-do-bind -fno-warn-orphans -funbox-strict-fields -O2