blob: 80cc39611b1d00910e32d6fed3f898e5a32f88a4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
import Control.Monad (liftM2)
import Data.List (sortBy)
import Data.Time.Calendar
import Data.Time.Clock
import Data.Time.Clock.POSIX (posixDayLength)
import Data.Time.Format
import qualified Data.Map as Map
import Data.Maybe
import Data.Yaml
import System.Locale (defaultTimeLocale)
import System.Environment (getArgs)
fieldFilter :: String -> String -> Map.Map String String -> Bool
fieldFilter field val ymap = Map.lookup field ymap == Just val
statusFilter :: String -> Map.Map String String -> Bool
statusFilter = fieldFilter "Status"
assigneeFilter :: String -> Map.Map String String -> Bool
assigneeFilter = fieldFilter "AssignedTo"
formatDeadline :: Map.Map String String -> String
formatDeadline ymap = user ++ "|" ++ date ++ "|" ++ filename
where
user = fromMaybe "ERROR" (Map.lookup "AssignedTo" ymap)
date = fromMaybe "ERROR" (Map.lookup "Date" ymap)
filename = fromMaybe "ERROR" (Map.lookup "filename" ymap)
dateParse :: String -> UTCTime
dateParse x = fromMaybe (UTCTime (fromGregorian 0 1 1) (secondsToDiffTime 0)) $ parseTime defaultTimeLocale "%Y-%m-%d" x
dateConv :: Map.Map String String -> UTCTime
dateConv ymap = dateParse (fromMaybe "1900-01-01" (Map.lookup "Date" ymap))
dateSorter :: Map.Map String String -> Map.Map String String -> Ordering
dateSorter amap bmap = compare (dateConv amap) (dateConv bmap)
dateFilter :: (UTCTime -> Bool) -> Map.Map String String -> Bool
dateFilter func ymap = func (dateConv ymap)
printIfNonEmpty :: String -> [Map.Map String String] -> IO ()
printIfNonEmpty _ [] = return ()
printIfNonEmpty title ymap = do
putStrLn title
putStrLn $ take (length title) (repeat '=')
mapM_ (putStrLn . formatDeadline) ymap
putStrLn ""
main :: IO ()
main = do
Just yamlcache <- decodeFile "/home/report/tmp/yamlcache.yaml"
currentTime <- getCurrentTime
args <- getArgs
let ymap = yamlcache
statusdue = filter (\m -> statusFilter "Due" m) ymap
userdue = if args == [] then statusdue else filter (\m -> elem (fromMaybe "UNASSIGNED" (Map.lookup "AssignedTo" m)) args) statusdue
buggtime = sortBy dateSorter $ filter (dateFilter (<UTCTime (fromGregorian 2010 1 1) (secondsToDiffTime 0))) userdue
beforenow = sortBy dateSorter $ filter (dateFilter (liftM2 (&&) (<currentTime) (>=UTCTime (fromGregorian 2010 1 1) (secondsToDiffTime 0)))) userdue
nexteightweeks = sortBy dateSorter $ filter (dateFilter (liftM2 (&&) (<(addUTCTime (56 * posixDayLength) currentTime)) (>=currentTime))) userdue
printIfNonEmpty "Malformed Due Date" buggtime
printIfNonEmpty "PAST DUE" beforenow
printIfNonEmpty "Upcoming" nexteightweeks
|