github-tools-0.1.2: src/GitHub/Tools/PullRequestInfo.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StrictData #-}
module GitHub.Tools.PullRequestInfo where
import Control.Monad (join)
import Data.Aeson (FromJSON, ToJSON)
import qualified Data.List as List
import Data.Text (Text)
import qualified Data.Text as Text
import Data.Time.Clock (UTCTime, diffUTCTime)
import GHC.Generics (Generic)
import Text.Html (prettyHtml, toHtml)
import Text.Tabular (Header (..), Properties (..),
Table (..))
import qualified Text.Tabular.AsciiArt as AsciiArt
import qualified Text.Tabular.Html as Html
data PullRequestInfo = PullRequestInfo
{ prRepoName :: Text
-- ^ The repository for which the pull request is.
, prNumber :: Int
-- ^ The assigned pull request issue number.
, prUser :: Text
-- ^ The user who proposed this PR.
, prBranch :: Text
-- ^ The branch name from which the pull request came.
, prCreated :: UTCTime
-- ^ Creation time of pull request. I.e. when it was proposed.
, prTitle :: Text
-- ^ Title of pull request.
, prReviewers :: [Text]
-- ^ The list of pull request reviewers (assignees).
, prState :: Text
-- ^ The mergeability state of the PR (clean = it's mergeable now).
, prOrigin :: Maybe Text
-- ^ The origin repository as user/reponame string.
, prTrustworthy :: Bool
-- ^ Whether the author is an org member (True) or an outside contributor (False).
}
deriving (Ord, Eq, Generic, Show)
instance ToJSON PullRequestInfo
instance FromJSON PullRequestInfo
formatPR :: Bool -> UTCTime -> [[PullRequestInfo]] -> Text
formatPR False now = Text.pack . AsciiArt.render Text.unpack Text.unpack Text.unpack . prToTable now
formatPR True now = Text.pack . prettyHtml . Html.render textHtml textHtml textHtml . prToTable now
where textHtml = toHtml . Text.unpack
prToTable :: UTCTime -> [[PullRequestInfo]] -> Table Text Text Text
prToTable now prss = Table rowNames columnNames rows
where
rowNames = Group SingleLine
. map (Group NoLine . map (Header . getRowName))
. filter (not . null)
$ prss
getRowName pr =
let repo num = prRepoName pr <> " " <> num in
repo . Text.pack . show . prNumber $ pr
columnNames = Group SingleLine
[ Header "branch"
, Header "age"
, Header "title"
, Header "state"
, Header "review_status"
]
rows = map (flip map
[ \pr -> prUser pr <> "/" <> prBranch pr
, Text.pack . (++ "d") . show . diffInDays now . prCreated
, prTitle
, prState
, Text.pack . List.intercalate "," . map Text.unpack . prReviewers
] . flip ($)) $ join prss
diffInDays :: UTCTime -> UTCTime -> Int
diffInDays a b = round $ diffUTCTime a b / (60 * 60 * 24)