packages feed

github-tools-0.1.0: src/PullRequestInfo.hs

module PullRequestInfo where

import           Control.Monad         (join)
import qualified Data.Maybe            as Maybe
import qualified Data.Text             as Text
import           Data.Time.Clock       (UTCTime, diffUTCTime)
import qualified GitHub
import qualified Review
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
  { repoName     :: GitHub.Name GitHub.Repo
  , reviewStatus :: [Review.Status]
  , pullRequest  :: GitHub.PullRequest
  }


formatPR :: Bool -> UTCTime -> [[PullRequestInfo]] -> String
formatPR False now = AsciiArt.render id id id . prToTable now
formatPR True  now = prettyHtml . Html.render toHtml toHtml toHtml . prToTable now


prToTable :: UTCTime -> [[PullRequestInfo]] -> Table String String String
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 = getRepoName pr ++ " " ++ num in
      repo . show . GitHub.pullRequestNumber . pullRequest $ pr

    getRepoName = Text.unpack . GitHub.untagName . repoName

    columnNames =  Group SingleLine
      [ Header "branch"
      , Header "age"
      , Header "title"
      , Header "mergeable"
      , Header "mergeable_state"
      , Header "review_status"
      ]

    rows = map (\pr ->
      [ getPrBranch         $ pullRequest pr
      , getPrAge            $ pullRequest pr
      , getPrTitle          $ pullRequest pr
      , getPrMergeable      $ pullRequest pr
      , getPrMergeableState $ pullRequest pr
      , show $ reviewStatus pr
      ]) $ join prss

    getPrTitle = Text.unpack . GitHub.pullRequestTitle
    getPrMergeable = show . Maybe.fromMaybe False . GitHub.pullRequestMergeable
    getPrMergeableState = show . GitHub.pullRequestMergeableState

    getPrBranch =
      Text.unpack
        . GitHub.pullRequestCommitLabel
        . GitHub.pullRequestHead

    getPrAge =
      (++ "d") . show . diffInDays now . GitHub.pullRequestCreatedAt


diffInDays :: UTCTime -> UTCTime -> Int
diffInDays a b = round $ diffUTCTime a b / (60 * 60 * 24)