arbtt 0.1 → 0.1.1
raw patch · 5 files changed
+175/−175 lines, 5 files
Files
- arbtt.cabal +6/−6
- src/capture-main.hs +32/−0
- src/capture.hs +0/−32
- src/stats-main.hs +137/−0
- src/stats.hs +0/−137
arbtt.cabal view
@@ -1,10 +1,10 @@-cabal-version: >= 1.6-build-type: Simple name: arbtt-version: 0.1+version: 0.1.1 license: GPL license-file: LICENSE-category: Development+category: Desktop+cabal-version: >= 1.6+build-type: Simple author: Joachim Breitner <mail@joachim-breitner.de> maintainer: Joachim Breitner <mail@joachim-breitner.de> copyright: Joachim Breitner 2009@@ -25,7 +25,7 @@ categorize.cfg, arbtt-capture.desktop, README executable arbtt-capture- main-is: capture.hs+ main-is: capture-main.hs hs-source-dirs: src build-depends: base == 4.*, filepath, directory, mtl, time, unix,@@ -38,7 +38,7 @@ Graphics.X11.XScreenSaver executable arbtt-stats- main-is: stats.hs+ main-is: stats-main.hs hs-source-dirs: src build-depends: base == 4.*, parsec == 2.*, containers, pcre-light, tabular
+ src/capture-main.hs view
@@ -0,0 +1,32 @@+module Main where++import Control.Monad+import Control.Concurrent++import Capture+import TimeLog+import System.Directory+import System.FilePath+import Graphics.X11.XScreenSaver (compiledWithXScreenSaver)+import System.IO+import System.Posix.IO+import System.IO.Error+import System.Exit+++-- | sampleRate in seconds+sampleRate = 60 ++-- | This is very raw, someone ought to improve this+lockFile filename = flip catch (\e -> hPutStrLn stderr ("arbtt [Error]: Could not aquire lock for " ++ filename ++"!") >> exitFailure) $ do+ fd <- openFd (filename ++ ".lck") WriteOnly (Just 0644) defaultFileFlags+ setLock fd (WriteLock, AbsoluteSeek, 0, 0)++main = do+ unless compiledWithXScreenSaver $+ hPutStrLn stderr "arbtt [Warning]: X11 was compiled without support for XScreenSaver"+ dir <- getAppUserDataDirectory "arbtt"+ createDirectoryIfMissing False dir+ let captureFile = dir </> "capture.log"+ lockFile captureFile+ runLogger captureFile (sampleRate * 1000) captureData
− src/capture.hs
@@ -1,32 +0,0 @@-module Main where--import Control.Monad-import Control.Concurrent--import Capture-import TimeLog-import System.Directory-import System.FilePath-import Graphics.X11.XScreenSaver (compiledWithXScreenSaver)-import System.IO-import System.Posix.IO-import System.IO.Error-import System.Exit----- | sampleRate in seconds-sampleRate = 60 ---- | This is very raw, someone ought to improve this-lockFile filename = flip catch (\e -> hPutStrLn stderr ("arbtt [Error]: Could not aquire lock for " ++ filename ++"!") >> exitFailure) $ do- fd <- openFd (filename ++ ".lck") WriteOnly (Just 0644) defaultFileFlags- setLock fd (WriteLock, AbsoluteSeek, 0, 0)--main = do- unless compiledWithXScreenSaver $- hPutStrLn stderr "arbtt [Warning]: X11 was compiled without support for XScreenSaver"- dir <- getAppUserDataDirectory "arbtt"- createDirectoryIfMissing False dir- let captureFile = dir </> "capture.log"- lockFile captureFile- runLogger captureFile (sampleRate * 1000) captureData
+ src/stats-main.hs view
@@ -0,0 +1,137 @@+module Main where+import System.Directory+import System.FilePath+import System.Console.GetOpt+import System.Environment+import System.Exit+import System.IO+import Control.Monad+import qualified Data.Map as M+import Data.List+import Data.Ord+import Data.Time+import Text.Printf+import Data.Maybe+import Data.Version (showVersion)+import qualified Text.Tabular.AsciiArt as TA++import TimeLog+import Data+import Categorize+import Stats++import Paths_arbtt (version)++data Flag = Help | Version |+ Report Report |+ Filter Filter |+ ReportOption ReportOption+ deriving Eq++getReports = mapMaybe (\f -> case f of {Report r -> Just r; _ -> Nothing})+getFilters = mapMaybe (\f -> case f of {Filter f -> Just f; _ -> Nothing})+getRepOpts = mapMaybe (\f -> case f of {ReportOption o -> Just o; _ -> Nothing})++versionStr = "arbtt-stats " ++ showVersion version+header = "Usage: arbtt-stats [OPTIONS...]"++options :: [OptDescr Flag]+options =+ [ Option "h?" ["help"]+ (NoArg Help)+ "show this help"+ , Option ['V'] ["version"]+ (NoArg Version)+ "show the version number"+-- , Option ['g'] ["graphical"] (NoArg Graphical) "render the reports as graphical charts"+ , Option ['x'] ["exclude"]+ (ReqArg (Filter . Exclude . Activity Nothing) "TAG")+ "ignore samples containing this tag"+ , Option ['o'] ["only"]+ (ReqArg (Filter . Only . read) "TAG")+ "only consider samples containing this tag"+ , Option [] ["also-inactive"]+ (NoArg (Filter AlsoInactive))+ "include samples with the tag \"inactive\""+ , Option ['m'] ["min-percentage"]+ (ReqArg (ReportOption . MinPercentage . read) "PERC")+ "do not show tags with a percentage lower than PERC% (default: 1)"+ , Option ['i'] ["information"]+ (NoArg (Report GeneralInfos))+ "show general statistics about the data"+ , Option ['t'] ["total-time"]+ (NoArg (Report TotalTime))+ "show total time for each tag"+ , Option ['c'] ["category"]+ (ReqArg (Report . Category) "CATEGORY")+ "show statistics about category CATEGORY"+ ]+++main = do+ args <- getArgs+ flags <- case getOpt Permute options args of+ (o,[],[]) | Help `notElem` o && Version `notElem` o -> return o+ (o,_,_) | Version `elem` o -> do+ hPutStrLn stderr versionStr+ exitSuccess+ (o,_,_) | Help `elem` o -> do+ hPutStr stderr (usageInfo header options)+ exitSuccess+ (_,_,errs) -> do+ hPutStr stderr (concat errs ++ usageInfo header options)+ exitFailure++ dir <- getAppUserDataDirectory "arbtt"++ let categorizeFilename = dir </> "categorize.cfg"+ fileEx <- doesFileExist categorizeFilename+ unless (fileEx) $ do+ putStrLn $ printf "Configuration file %s does not exist." categorizeFilename+ putStrLn $ "Please see the example file and the README for more details"+ exitFailure+ categorizer <- readCategorizer categorizeFilename++ let captureFilename = dir </> "capture.log"+ captures <- readTimeLog captureFilename+ let allTags = categorizer captures+ when (null allTags) $ do+ putStrLn "Nothing recorded yet"+ exitFailure+ + let tags = applyFilters (getFilters flags) allTags+ let opts = case getRepOpts flags of {[] -> [MinPercentage 1]; ropts -> ropts }+ let reps = case getReports flags of {[] -> [TotalTime]; reps -> reps }++ -- These are defined here, but of course only evaluated when any report+ -- refers to them. Some are needed by more than one report, which is then+ -- advantageous.+ let c = prepareCalculations allTags tags+ + sequence_ $ intersperse (putStrLn "")+ $ map (\r -> let (h,t) = renderReport opts c r in do+ putStrLnUnderlined h+ putStr (TA.render id id id t)+ )+ $ reps++putStrLnUnderlined str = do+ putStrLn str+ putStrLn $ map (const '=') str+++{-+import Data.Accessor+import Graphics.Rendering.Chart+import Graphics.Rendering.Chart.Gtk++ graphicalReport TotalTime = do+ let values = zipWith (\(k,v) n -> (PlotIndex n,[fromIntegral v::Double])) (M.toList sums) [1..]+ let plot = plot_bars_values ^= values $ defaultPlotBars+ let layoutaxis = laxis_generate ^= autoIndexAxis (map (show.fst) (M.toList sums)) $+ defaultLayoutAxis+ let layout = layout1_plots ^= [Right (plotBars plot)] $+ layout1_bottom_axis ^= layoutaxis $+ defaultLayout1+ do renderableToWindow (toRenderable layout) 800 600+-}
− src/stats.hs
@@ -1,137 +0,0 @@-module Main where-import System.Directory-import System.FilePath-import System.Console.GetOpt-import System.Environment-import System.Exit-import System.IO-import Control.Monad-import qualified Data.Map as M-import Data.List-import Data.Ord-import Data.Time-import Text.Printf-import Data.Maybe-import Data.Version (showVersion)-import qualified Text.Tabular.AsciiArt as TA--import TimeLog-import Data-import Categorize-import Stats--import Paths_arbtt (version)--data Flag = Help | Version |- Report Report |- Filter Filter |- ReportOption ReportOption- deriving Eq--getReports = mapMaybe (\f -> case f of {Report r -> Just r; _ -> Nothing})-getFilters = mapMaybe (\f -> case f of {Filter f -> Just f; _ -> Nothing})-getRepOpts = mapMaybe (\f -> case f of {ReportOption o -> Just o; _ -> Nothing})--versionStr = "arbtt-stats " ++ showVersion version-header = "Usage: arbtt-stats [OPTIONS...]"--options :: [OptDescr Flag]-options =- [ Option "h?" ["help"]- (NoArg Help)- "show this help"- , Option ['V'] ["version"]- (NoArg Version)- "show the version number"--- , Option ['g'] ["graphical"] (NoArg Graphical) "render the reports as graphical charts"- , Option ['x'] ["exclude"]- (ReqArg (Filter . Exclude . Activity Nothing) "TAG")- "ignore samples containing this tag"- , Option ['o'] ["only"]- (ReqArg (Filter . Only . read) "TAG")- "only consider samples containing this tag"- , Option [] ["also-inactive"]- (NoArg (Filter AlsoInactive))- "include samples with the tag \"inactive\""- , Option ['m'] ["min-percentage"]- (ReqArg (ReportOption . MinPercentage . read) "PERC")- "do not show tags with a percentage lower than PERC% (default: 1)"- , Option ['i'] ["information"]- (NoArg (Report GeneralInfos))- "show general statistics about the data"- , Option ['t'] ["total-time"]- (NoArg (Report TotalTime))- "show total time for each tag"- , Option ['c'] ["category"]- (ReqArg (Report . Category) "CATEGORY")- "show statistics about category CATEGORY"- ]---main = do- args <- getArgs- flags <- case getOpt Permute options args of- (o,[],[]) | Help `notElem` o && Version `notElem` o -> return o- (o,_,_) | Version `elem` o -> do- hPutStrLn stderr versionStr- exitSuccess- (o,_,_) | Help `elem` o -> do- hPutStr stderr (usageInfo header options)- exitSuccess- (_,_,errs) -> do- hPutStr stderr (concat errs ++ usageInfo header options)- exitFailure-- dir <- getAppUserDataDirectory "arbtt"-- let categorizeFilename = dir </> "categorize.cfg"- fileEx <- doesFileExist categorizeFilename- unless (fileEx) $ do- putStrLn $ printf "Configuration file %s does not exist." categorizeFilename- putStrLn $ "Please see the example file and the README for more details"- exitFailure- categorizer <- readCategorizer categorizeFilename-- let captureFilename = dir </> "capture.log"- captures <- readTimeLog captureFilename- let allTags = categorizer captures- when (null allTags) $ do- putStrLn "Nothing recorded yet"- exitFailure- - let tags = applyFilters (getFilters flags) allTags- let opts = case getRepOpts flags of {[] -> [MinPercentage 1]; ropts -> ropts }- let reps = case getReports flags of {[] -> [TotalTime]; reps -> reps }-- -- These are defined here, but of course only evaluated when any report- -- refers to them. Some are needed by more than one report, which is then- -- advantageous.- let c = prepareCalculations allTags tags- - sequence_ $ intersperse (putStrLn "")- $ map (\r -> let (h,t) = renderReport opts c r in do- putStrLnUnderlined h- putStr (TA.render id id id t)- )- $ reps--putStrLnUnderlined str = do- putStrLn str- putStrLn $ map (const '=') str---{--import Data.Accessor-import Graphics.Rendering.Chart-import Graphics.Rendering.Chart.Gtk-- graphicalReport TotalTime = do- let values = zipWith (\(k,v) n -> (PlotIndex n,[fromIntegral v::Double])) (M.toList sums) [1..]- let plot = plot_bars_values ^= values $ defaultPlotBars- let layoutaxis = laxis_generate ^= autoIndexAxis (map (show.fst) (M.toList sums)) $- defaultLayoutAxis- let layout = layout1_plots ^= [Right (plotBars plot)] $- layout1_bottom_axis ^= layoutaxis $- defaultLayout1- do renderableToWindow (toRenderable layout) 800 600--}